Hi,
Does anybody knows how can I sort an association list?
for example:
(setq lst '((1 . "s") (12 . "t") (-7 . "u") (0 . "v")))
should be sorted as:
((-7 . "u") (0 . "v") (1 . "s") (12 . "t"))
{ sort on: (car(assoc index lst)) value}
Thanks,
Solved! Go to Solution.
Solved by hmsilva. Go to Solution.
Hi Henrique,
Thank you for your help.
I need it in my lisp code and works fine:
;;*** By Abbas Aqdam *** ;;example: (setq Tabs (GetTabs)) (defun GetTabs ( / Tabs Count i Item Name Order TabsName) (setq Tabs (vlax-get-property (vlax-get-property (vlax-get-acad-object) 'ActiveDocument) 'Layouts) Count (vlax-get-property Tabs 'Count) i 0 );setq (repeat Count (setq Item (vlax-invoke-method Tabs 'Item i) Name (vlax-get-property Item 'Name) Order (vlax-get-property Item 'TabOrder) TabsName (append (list (cons Order Name)) TabsName) i (1+ i) );setq );repeat (vl-sort TabsName '(lambda (a b) (< (car a) (car b)))) );GetTabs
Thank you so much
Abbas
(defun getTabs (/ layouts lst) (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons (cons (vla-get-taborder layout) (vla-get-name layout)) lst)) ) (vl-sort lst (function (lambda (a b) (< (car a) (car b))))) )
Hi Alan,
Thank you for your code.
I have a question:
how can I find out how many or which command are available for a VLA object.
for example
(vla-get-taborder layout)
how do you know there is "taborder" function for "layout" VLA-object?
Thanks,
Abbas
If you know the Object you're interested in, consider vlax-Dump-Object, otherwise, look into Apropos in VLIDE.
"How we think determines what we do, and what we do determines what we get."
Also...
http://entercad.ru/acadauto.en/
"How we think determines what we do, and what we do determines what we get."
@alanjt_ wrote:(defun getTabs (/ layouts lst) (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons (cons (vla-get-taborder layout) (vla-get-name layout)) lst)) ) (vl-sort lst (function (lambda (a b) (< (car a) (car b))))) )
... Could have sworn we just did this.
"How we think determines what we do, and what we do determines what we get."
@BlackBox_ wrote:
@alanjt_ wrote:(defun getTabs (/ layouts lst) (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons (cons (vla-get-taborder layout) (vla-get-name layout)) lst)) ) (vl-sort lst (function (lambda (a b) (< (car a) (car b))))) )
... Could have sworn we just did this.
We did, and my method for it was totally different. 😛
@alanjt_ wrote:
@BlackBox_ wrote:
@alanjt_ wrote:(defun getTabs (/ layouts lst) (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons (cons (vla-get-taborder layout) (vla-get-name layout)) lst)) ) (vl-sort lst (function (lambda (a b) (< (car a) (car b))))) )
... Could have sworn we just did this.
We did, and my method for it was totally different. 😛
Well... This one is pretty sharp; if it were me, I'd mapcar the car out of it. :beer:
"How we think determines what we do, and what we do determines what we get."
For the curious:
(defun getTabs1 (/ layouts lst) (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons (cons (vla-get-taborder layout) (vla-get-name layout)) lst)) ) (mapcar 'cdr (vl-sort lst (function (lambda (a b) (< (car a) (car b)))))) ) (defun getTabs2 (/ layouts lst lst2) (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons (vla-get-name layout) lst) lst2 (cons (cons (vla-get-name layout) (vla-get-taborder layout)) lst2) ) ) (vl-sort lst (function (lambda (a b) (< (cdr (assoc a lst2)) (cdr (assoc b lst2)))))) ) (defun getTabs3 (/ layouts name lst lst2) (vlax-for layout (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons (setq name (vla-get-name layout)) lst) lst2 (cons (cons name (vla-get-taborder layout)) lst2) ) ) (vl-sort lst (function (lambda (a b) (< (cdr (assoc a lst2)) (cdr (assoc b lst2)))))) ) (defun getTabs4 (/ layouts) (setq layouts (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))) (vl-sort (cons "Model" (layoutlist)) (function (lambda (a b) (< (vla-get-taborder (vla-item layouts a)) (vla-get-taborder (vla-item layouts b))) ) ) ) ) (defun getTabs5 (/ lst) (vlax-for x (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) (setq lst (cons x lst)) ) (mapcar 'vla-get-name (vl-sort lst (function (lambda (a b) (< (vla-get-taborder a) (vla-get-taborder b))))) ) ) (defun getTabs6 (/ dict def l n) (setq dict (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_LAYOUT")))) (while (setq def (dictnext dict (null def))) (setq l (cons (cdr (assoc 1 (reverse def))) l)) ) (cons (car l) (reverse (cdr l))) )
Command: (benchmark '((gettabs1) (gettabs2) (getTabs3) (getTabs4) (getTabs5) (getTabs6))) Elapsed milliseconds / relative speed for 8192 iteration(s): (GETTABS6).....1436 / 2.05 <fastest> (GETTABS3).....2372 / 1.24 (GETTABS1).....2387 / 1.24 (GETTABS5).....2449 / 1.2 (GETTABS2).....2745 / 1.07 (GETTABS4).....2948 / 1 <slowest>
I knew I preferred the non-VL verison for a reason other than just not having to define the layout table.
Now, these all return "Model" which is kind of pointless IMO, but since the OP originally had it in there, I left it. Personally, I'd use gettabs6 and just not add Model to the front of the list.
eg.
(defun _layoutlist (/ dict def l n) (setq dict (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_LAYOUT")))) (while (setq def (dictnext dict (null def))) (setq l (cons (cdr (assoc 1 (reverse def))) l)) ) (reverse (cdr l)) )
Returns just like (layoutlist), but in correct tab order.