Visual LISP, AutoLISP and General Customization
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How to sort an an association list?

11 REPLIES 11
SOLVED
Reply
Message 1 of 12
aqdam1978
1382 Views, 11 Replies

How to sort an an association list?

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,

11 REPLIES 11
Message 2 of 12
hmsilva
in reply to: aqdam1978

(vl-sort lst '(lambda (a b) (< (car a) (car b))))

 Henrique

EESignature

Message 3 of 12
aqdam1978
in reply to: hmsilva

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

Message 4 of 12
hmsilva
in reply to: aqdam1978

Hi Abbas,
glad I could help

Henrique

EESignature

Message 5 of 12
alanjt_
in reply to: hmsilva

(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)))))
)

 

Message 6 of 12
aqdam1978
in reply to: alanjt_

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

Message 7 of 12
BlackBox_
in reply to: aqdam1978

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."

Message 8 of 12
BlackBox_
in reply to: BlackBox_

Also...

 

http://entercad.ru/acadauto.en/



"How we think determines what we do, and what we do determines what we get."

Message 9 of 12
BlackBox_
in reply to: alanjt_


@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."

Message 10 of 12
alanjt_
in reply to: BlackBox_


@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. 😛

Message 11 of 12
BlackBox_
in reply to: alanjt_


@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."

Message 12 of 12
alanjt_
in reply to: BlackBox_

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.

Can't find what you're looking for? Ask the community or share your knowledge.

Post to forums  

Autodesk Design & Make Report

”Boost