Author Topic: Get Layout Object from Layout Name  (Read 1779 times)

0 Members and 1 Guest are viewing this topic.

mailmaverick

  • Bull Frog
  • Posts: 494
Get Layout Object from Layout Name
« on: November 15, 2017, 01:54:55 AM »
How to get Layout Object from Layout Name as String ?

mailmaverick

  • Bull Frog
  • Posts: 494
Re: Get Layout Object from Layout Name
« Reply #1 on: November 15, 2017, 02:12:36 AM »
Found following way :-

(setq vlayoutobj (vlax-invoke-method (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) "item" "LayoutName"))

If there is other better method, please let me know.

Thanks.

ronjonp

  • Needs a day job
  • Posts: 7526
Re: Get Layout Object from Layout Name
« Reply #2 on: November 15, 2017, 09:06:13 AM »
Couple more examples. I would suggest error checking when using vla-item.

Code - Auto/Visual Lisp: [Select]
  1. ;;VL
  2. (defun _layout (name / o)
  3.   (if (= 'vla-object
  4.          (type (setq o (vl-catch-all-apply
  5.                          'vla-item
  6.                          (list (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) name)
  7.                        )
  8.                )
  9.          )
  10.       )
  11.     o
  12.   )
  13. )
  14. (_layout "Model")
  15. ;;Vanilla
  16. (defun _layout (name / o)
  17.   (if (setq o (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_LAYOUT"))))
  18.     (cdr (assoc -1 (dictsearch o name)))
  19.   )
  20. )
  21. (_layout "Model")

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC

mailmaverick

  • Bull Frog
  • Posts: 494
Re: Get Layout Object from Layout Name
« Reply #3 on: November 16, 2017, 06:41:31 AM »
Thanks Ron. I have calculated the time taken to run the three methods with following code :-
Code: [Select]
(defun c:test ()
  (vl-load-com)
  (setq Start (getvar "Millisecs"))
  (repeat 100000
    (setq vlayoutobj
   (vlax-invoke-method
     (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object)))
     "item"
     "Model"
   )
    )
  )
  (setq End (getvar "Millisecs"))
  (setq yu (- End Start))
  (setq yu (/ yu 1000.00))
  (princ "\nTime Taken to Run Method 1 : ")
  (princ yu)
  (princ " seconds \n")
  (setq Start (getvar "Millisecs"))
  (repeat 100000
    (if (= 'vla-object
   (type (setq o (vl-catch-all-apply
   'vla-item
   (list (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) "Model")
)
)
   )
)
      o
    )
  )
  (setq End (getvar "Millisecs"))
  (setq yu (- End Start))
  (setq yu (/ yu 1000.00))
  (princ "\nTime Taken to Run Method 2 : ")
  (princ yu)
  (princ " seconds \n")
  (setq Start (getvar "Millisecs"))
  (repeat 100000
    (if (setq o (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_LAYOUT"))))
      (cdr (assoc -1 (dictsearch o "Model")))
    )
  )
  (setq End (getvar "Millisecs"))
  (setq yu (- End Start))
  (setq yu (/ yu 1000.00))
  (princ "\nTime Taken to Run Method 3 : ")
  (princ yu)
  (princ " seconds \n")
  (princ)
)


Following is the output :-

Time Taken to Run Method 1 : 3.682 seconds

Time Taken to Run Method 2 : 3.525 seconds

Time Taken to Run Method 3 : 6.349 seconds


Does it mean that dictsearch method is always slow ? Any comments ?
« Last Edit: November 16, 2017, 06:49:24 AM by mailmaverick »

VovKa

  • Water Moccasin
  • Posts: 1626
  • Ukraine
Re: Get Layout Object from Layout Name
« Reply #4 on: November 16, 2017, 08:43:58 AM »
Any comments ?
Code: [Select]
Command: test

Time Taken to Run Method 1 : 6.359 seconds

Time Taken to Run Method 2 : 6.907 seconds

Time Taken to Run Method 3 : 3.906 seconds

ronjonp

  • Needs a day job
  • Posts: 7526
Re: Get Layout Object from Layout Name
« Reply #5 on: November 16, 2017, 09:07:43 AM »
Thanks Ron. I have calculated the time taken to run the three methods with following code :-
Code: [Select]
.....


Following is the output :-

Time Taken to Run Method 1 : 3.682 seconds

Time Taken to Run Method 2 : 3.525 seconds

Time Taken to Run Method 3 : 6.349 seconds


Does it mean that dictsearch method is always slow ? Any comments ?
When using Michael's benchmark, dictsearch is much faster...
Code - Auto/Visual Lisp: [Select]
  1. ;;VL
  2. (defun _layoutvla (name / o)
  3.   (if (= 'vla-object
  4.          (type (setq o (vl-catch-all-apply
  5.                          'vla-item
  6.                          (list (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) name)
  7.                        )
  8.                )
  9.          )
  10.       )
  11.     o
  12.   )
  13. )
  14. (_layoutvla "Model")
  15. ;;Vanilla
  16. (defun _layoutvic (name / o)
  17.   (if (and (setq o (cdr (assoc -1 (dictsearch (namedobjdict) "ACAD_LAYOUT"))))
  18.            (setq o (cdr (assoc -1 (dictsearch o name))))
  19.       )
  20.     (vlax-ename->vla-object o)
  21.   )
  22. )
  23. (_layoutvic "Model")
  24.  
  25.  
  26. (benchmark '((_layoutvic "Model") (_layoutvla "Model")))
  27.  
  28.  
  29. ;;;_$
  30. ;;;
  31. ;;;_LAYOUTVLA
  32. ;;;#<VLA-OBJECT IAcadLayout 000002283fd2b368>
  33. ;;;_LAYOUTVIC
  34. ;;;#<VLA-OBJECT IAcadLayout 000002283fd2b368> Benchmarking ................Elapsed milliseconds / relative speed for 8192 iteration(s):
  35. ;;;
  36. ;;;    (_LAYOUTVIC "Model").....1015 / 1.71 <fastest>
  37. ;;;    (_LAYOUTVLA "Model").....1734 / 1.00 <slowest>
  38. ;;;
  39. ;;;
  40. ;;;; 5 forms loaded from #<editor "<Untitled-4> loading...">
  41. ;;;_$

Windows 11 x64 - AutoCAD /C3D 2023

Custom Build PC