jjatho 发表于 2022-7-6 06:38:10

关于布局列表的问题

我基本上是在创建一个AutoLISP脚本,该脚本将根据paperspace布局选项卡自动为我创建一个目录。除了一件事,一切都很顺利。layoutlist似乎是按照创建选项卡的顺序存储选项卡信息的,而不是基于它们在屏幕底部的当前顺序。如果我将一个纸面空间布局移动到一个新位置,目录仍然按照创建时的原始顺序提供所有内容。
 
是否有一个等价于layoutlist的程序可以在屏幕上按当前顺序返回布局?

alanjt 发表于 2022-7-6 06:51:58

你必须自己动手。这是我的。
 
(defun AT:LayoutList (/ lst)
;; List of layouts (VLA-Objects) in drawing (in correct order)
;; Alan J. Thompson, 10.05.09
(vlax-for x (vla-get-layouts
               (cond (*AcadDoc*)
                     ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
               )
             )
   (or (eq (vla-get-name x) "Model") (setq lst (cons x lst)))
)
(vl-sort lst (function (lambda (a b) (< (vla-get-taborder a) (vla-get-taborder b)))))
)

jjatho 发表于 2022-7-6 06:55:13

我试过这个:
 
(vlax-for x (vla-get-layouts
(cond (*AcadDoc*)
        ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
)
)
(or (eq (vla-get-name x) "Model") (setq paperlist (cons x paperlist)))
)
(vl-sort paperlist (function (lambda (a b) (< (vla-get-taborder a) (vla-get-taborder b)))))

(foreach tab (paperlist)
(setvar 'ctab tab)
(setq column (+ column 1))
(substr tab 4 100)
(vla-setCellValue table column row tab)
)

(setq titlepage (car (paperlist)))

(setvar 'ctab (car (paperlist)))
 
得到这个:
 
Command: bad function: (#<VLA-OBJECT IAcadLayout 178aa094> #<VLA-OBJECT IAcadLayout 178a6e94> #<VLA-OBJECT IAcadLayout 171d35ec> #<VLA-OBJECT IAcadLayout 1724e03c>)

alanjt 发表于 2022-7-6 07:01:09

首先,如果你要使用我的代码,请有礼貌地留下我的名字。这是一个子程序。只需将其分配给一个变量。例如(setq mylist(AT:LayoutList))
 
抱歉,这会按顺序返回布局对象。
 
你可以直接输入(mapcar'vla get name)(在:LayoutList),但你的e会在列表中运行多次。
 
 
试试这个。
(defun _layoutlist (/ layouts)
(setq layouts (vla-get-layouts
               (cond (*AcadDoc*)
                     ((setq *AcadDoc* (vla-get-activedocument (vlax-get-acad-object))))
               )
               )
)
(vl-sort (layoutlist)
          (function (lambda (a b)
                      (< (vla-get-taborder (vla-item layouts a))
                         (vla-get-taborder (vla-item layouts b))
                      )
                  )
          )
)
)

alanjt 发表于 2022-7-6 07:10:30

从那里,使用(foreach选项卡(_layoutlist)等等)

jjatho 发表于 2022-7-6 07:22:22

谢谢,我以前从未使用过子程序,所以不知道它们是如何工作的。
 
关于名字的事也很抱歉。实际上,我确实在我使用的代码中留下了这一部分,但我不认为把这一部分复制回论坛有什么意义。

alanjt 发表于 2022-7-6 07:25:21

别担心。你现在知道如何使用子程序了吗?将我的上述示例用于foreach?

jjatho 发表于 2022-7-6 07:33:32

是的,基本上只是把它丢在其余代码的defun之外。我刚刚测试过,一切都很好!

Lee Mac 发表于 2022-7-6 07:45:10

这是函数的另一个变体:
(defun布局列表(/l1 l2)(vlax for l(vla get layouts(vla get activedocument(vlax get acad object))(if(//=“MODEL”(strcase(vla get name l)))(setq l1(cons(vla get name l)l1)l2(cons(vla get taborder l)l2))(mapcar“(lambda(n)(nth n l1))(vl-sort-i l2'
页: [1]
查看完整版本: 关于布局列表的问题