Kelly-cruise 发表于 2022-7-6 08:00:11

AutoLisp切换多个

你好
我刚刚开始编程,很难创建一个可以与按钮一起使用以打开或关闭多个层的程序。
 
关于如何开始,有什么建议吗?
 
迈克尔。

pBe 发表于 2022-7-6 08:22:14

为什么不使用图层状态管理器?
LAYERSTATE-->恢复

MSasu 发表于 2022-7-6 08:32:46

通过使用图层状态可以实现相同的结果。
但是,如果要为此编写AutoLISP例程,则可以在前面的讨论中找到解决方案:
[列表]
[*]http://www.cadtutor.net/forum/showthread.php?8718
[*]http://www.cadtutor.net/forum/showthread.php?23568
[/列表]

Kelly-cruise 发表于 2022-7-6 08:45:33

感谢您的回复,我将查看图层状态管理器。我希望有一个按钮,这样它可以对那些习惯使用按钮的人友好,并且不太适应变化和可见性状态。
 
干杯
 
迈克尔。

MSasu 发表于 2022-7-6 08:52:22

可以使用以下宏创建按钮:
(command "_LAYER" "_A" "_R" LayerStateName "" "")

VVA 发表于 2022-7-6 09:10:10

尝试使用

(defun layer-filters-status-change
      (lstnames / vla:lrs vla:xdic vla:dic vla:spsc name datatype datavalue onoff sps)
(setq lstnames (list lstnames))
;|=======================================================================================
* layer-filters-status-change
* http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=34&TID=20414&MID=114022#message114022
* Arguments :
lstnames = String - the name of the group filter
* Return :
nil
*
* If at least one layer group filter is turned off, all the layers of the filter are also included
* Use:
^C^C(if (not layer-filters-status-change)(load "layer-filters-status-change"))(layer-filters-status-change "AT")
* Create command (on\off group filters AT): (defun C:AT ()(layer-filters-status-change "AT"))
* Macros:
* 'AT;
=======================================================================================|;

(defun massoc (key alist / x nlist)
(foreach x alist
   (if (eq key (car x))(setq nlist (cons (cdr x) nlist))))
(reverse nlist))
(vl-load-com)
(setq vla:lrs (vla-get-layers (vla-get-activedocument (vlax-get-acad-object))))
(if (= (vla-get-hasextensiondictionary vla:lrs) :vlax-true)
   (progn
   (setq lstnames (mapcar 'strcase lstnames))
   (setq vla:xdic (vla-getextensiondictionary vla:lrs))
   (setq vla:dic nil)
   (if (progn (vlax-for item   vla:xdic
      (if (= (vla-get-name item) "ACLYDICTIONARY")
          (setq vla:dic item)
          ) ;_if
      ) ;_vlax-for
      vla:dic
      ) ;_progn
(progn
    (vlax-for vla:spsc vla:dic
      (if
      (progn
   (setq name (vla-get-name vla:spsc))
   (vla-getxrecorddata vla:spsc 'datatype 'datavalue)
   (member (strcase (vlax-variant-value
            (vlax-safearray-get-element
                datavalue
                (vl-position 300 (vlax-safearray->list datatype))
                ) ;_vlax-safearray-get-element
            ) ;_vlax-variant-value
               ) ;_strcase
             lstnames
             ) ;_member
   ) ;_progn
         (progn
    (setq sps (entget(vlax-vla-object->ename vla:spsc))
          sps (massoc 330 (member (assoc 300 sps) sps))
          sps (vl-remove-if 'null (mapcar 'entget sps))
          sps (mapcar '(lambda (x)(cons (cdr(assoc 2 x))(cdr(assoc 62 x)))) sps))
    (if (vl-member-if '(lambda (x)(minusp (cdr x))) sps)
      (setq onoff :vlax-true)
      (setq onoff :vlax-false)
      )
   (setq sps (mapcar '(lambda (x)(vla-Item vla:lrs x)) (mapcar 'car sps)))
   (mapcar '(lambda (x)(vla-put-layeron x onoff)) sps)
   
      ) ;_progn
         ) ;_if
      ) ;_vlax-for
    (vlax-release-object vla:dic)
    )
) ;_ if
   (vlax-release-object vla:xdic)
   ) ;_progn
   ) ;_if
(vlax-release-object vla:lrs)
(princ)
)

如何工作
1.创建图层组过滤器(例如,名称为AT)
2.创建命令
(defun C:AT ()(layer-filters-status-change "AT"))
3.键入命令行AT或“AT”
页: [1]
查看完整版本: AutoLisp切换多个