明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1651|回复: 18

[提问] 不用command语句该如何表达

[复制链接]
发表于 2020-8-8 14:17:35 | 显示全部楼层 |阅读模式
本帖最后由 magicheno 于 2020-8-8 14:30 编辑

请教下大侠,本人只会一点command,想学习下,如果不用command,该如何表达呢,能实现和下面一样的功能呢
;;;开给水层
(defun c:G1()
(setvar "cmdecho" 0)
(setq oldlay (getvar "Clayer"))
(setvar "clayer" "W-DIM" )
(command "layer")
(command  "off" "*" "" )
(command  "on" "WP_G,DN_G,LGBH_G,TXT_G,EV_G,WP_G_*" )
(command"")
(setvar "Clayer" oldlay)
(setq oldlay (getvar "Clayer"))
(setvar "clayer" "0" )
(command "layer")
(command  "off" "W-DIM" )
(command"")
(setvar "Clayer" oldlay)
)

;;;可开给水层
(defun c:G2()
(setvar "cmdecho" 0)
  (command "layer")
  (command  "on" "WP_G,DN_G,LGBH_G,TXT_G,EV_G,WP_G_*" )
  (command""))


;;;关给水层
(defun c:G3()
(setvar "cmdecho" 0)
(setq oldlay (getvar "Clayer"))
(setvar "clayer" "0" )
(command "layer")
(command  "off" "WP_G,DN_G,LGBH_G,TXT_G,EV_G,WP_G_*" )
(command"")
(setvar "Clayer" oldlay))


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-8-8 17:52:47 | 显示全部楼层
本帖最后由 tryhi 于 2020-8-8 18:06 编辑

http://bbs.mjtd.com/thread-182020-1-1.html

;;返回所有图层对应的对象名(大写)
;;返回:((图层名1 对象名1) (图层名2 对象名2)……)
(defun try-Layer-obj-name (/ ob)
        (vlax-for each (vla-get-Layers *DOC*)
                (setq ob(cons(list (vla-get-name each)each)  ob))
        )
        ob
)




;返回所有图层名称表
;(defun try-get-layer(/ lst)
;        (vlax-for x (Vlax-Get (Vlax-Get (Vlax-Get-Acad-Object) 'ActiveDocument) 'Layers) (setq lst (cons (vla-get-name x) lst)))
;        lst
;)

;;返回所有图层的名称(字符串表)
(defun try-Layer-allname(/ out)
        (vlax-for obj *LAYS*
                (setq out (cons (vlax-get-property obj 'Name) out))
        )
        (reverse out)
)

;|
返回所有图层的信息
(("层名" 状态 颜色 "线型")……)
状态:1冻结图层 2新视口冻结图层 4锁定…(其他看帮助)
颜色:负值为隐藏图层
|;
(defun try-Layer-Info (/ lst d e1 e2)
        (while (setq d (tblnext "layer" (null d)))
                (setq   lst (cons (mapcar 'cdr (cdr d)) lst)    )
        )
        (vl-sort lst '(lambda (e1 e2) (< (car e1) (car e2))))
)

;;获取指定图层的图元名
;;(try-Layer-ent "0") --> <图元名: -64cb388>
(defun try-Layer-ent (name)(tblobjname "layer" name))


;;打开关闭图层
;;参数:图层名称表
(defun try-Layer-On (LayList)
        (setq LayList(mapcar 'strcase LayList))
        (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                                (vla-put-LayerOn each :vlax-True)
                        )
                )
                (vlax-release-object each)
        )
)


;;关闭图层
;;参数:图层名称表
(defun try-Layer-Off (LayList)
        (setq LayList(mapcar 'strcase LayList))
        (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                                (vla-put-LayerOn each :vlax-False)
                        )
                )
                (vlax-release-object each)
        )
)

;;设置指定图层(列表)不打印
;;参数1、图层列表
;;参数2、是否打印(T打印/nil不打印
(defun try-Layer-Plot (LayList On-Off)
        (vlax-for each (vla-get-Layers *DOC*)
                (if (member (strcase (vla-get-name each)) (mapcar 'strcase LayList))
                        (if (vlax-write-enabled-p each)
                                (if On-Off
                                        (vla-put-Plottable each :vlax-True)
                                        (vla-put-Plottable each :vlax-False)
                                )
                        )
                )
                (vlax-release-object each)
        )
)
;;;try-make-layer 创建一个图层
;;;参    数1:name:图层名称
;;;参    数2:colour:颜色默认nil(7)
;;;参    数3:xianxin:线型默认nil(Continuous)
;;;参    数4:n70:标志位,默认nil(0)(详见函数内注释)
;;;示    例: (try-make-layer "abc" nil nil nil)
(defun try-make-layer (name colour xianxin n70)
        (or n70 (setq n70 0))
        ;标准标记(按位编码值):
        ;1 = 冻结图层,否则解冻图层
        ;2 = 默认情况下在新视口中冻结图层
        ;4 = 锁定图层
        ;16 = 如果设置了此位,则表条目外部依赖于外部参照
        ;32 = 如果同时设置了此位和位 16,则表明已成功融入了外部依赖的外部参照
        ;64 = 如果设置了此位,则表明在上次编辑图形时,图形中至少有一个图元参照了表条目。(此标志适用于 AutoCAD 命令。大多数读取 DXF 文件的程序都可以忽略它,并且无需由写入 DXF 文件的程序对其进行设置)
        (or colour (setq colour 7))
        (or xianxin (setq xianxin "Continuous"))
        (entmakex
                (list
                        '(0 . "LAYER")
                        '(100 . "AcDbSymbolTableRecord")
                        '(100 . "AcDbLayerTableRecord")
                        (cons 2  name)
                        (cons 70 n70)
                        (cons 62  colour)
                        (cons 6  xianxin)
                ))
)
 楼主| 发表于 2020-8-10 21:05:24 | 显示全部楼层
本帖最后由 magicheno 于 2020-8-11 01:14 编辑
tryhi 发表于 2020-8-10 17:36
;;打开关闭图层
;;参数:字符串,支持通配符
(defun try-Layer-on-2 (layer)

大侠按照新的要求改了下,运行不了,不知道是哪里的问题呢
(setq
        ;;常用VLA对象、集合
        *ACAD*  (vlax-get-acad-object)
        *DOC*   (vla-get-ActiveDocument *ACAD*)
        *DOCS*  (vla-get-Documents *ACAD*)
        *MS*    (vla-get-modelSpace *DOC*)
        *PS*    (vla-get-paperSpace *DOC*)
        *BLKS*  (vla-get-Blocks *DOC*)
        *LAYS*  (vla-get-Layers *DOC*)
        *LTS*   (vla-get-Linetypes *DOC*)
        *STS*   (vla-get-TextStyles *DOC*)
        *GRPS*  (vla-get-groups *DOC*)
        *DIMS*  (vla-get-DimStyles *DOC*)
        *LOUTS* (vla-get-Layouts *DOC*)
        *VPS*   (vla-get-Viewports *DOC*)
        *VS*    (vla-get-Views *DOC*)
        *DICS*  (vla-get-Dictionaries *DOC*)
        *Layouts* (vla-get-Layouts *doc*)

)


;;返回所有图层的名称(字符串表)
(defun try-Layer-allname(/ out)
        (vlax-for obj *LAYS*
                (setq out (cons (vlax-get-property obj 'Name) out))
        )
        (reverse out)
)



;打开图层
;;参数:图层名称表
(defun try-Layer-On (LayList)
        (setq LayList(mapcar 'strcase LayList))
        (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                                (vla-put-LayerOn each :vlax-True)
                        )
                )
                (vlax-release-object each)
        )
)


;;关闭图层
;;参数:图层名称表
(defun try-Layer-Off (LayList)
        (setq LayList(mapcar 'strcase LayList))
        (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                                (vla-put-LayerOn each :vlax-False)
                        )
                )
                (vlax-release-object each)
        )
)


;;打开关闭图层
;;参数:字符串,支持通配符
(defun try-Layer-on-2 (layer)
         (try-Layer-on(vl-remove-if-not '(lambda(x)(wcmatch x layer))(try-Layer-allname)))
)

;;打开关闭图层
;;参数:字符串,支持通配符
(defun try-Layer-off-2 (layer)
         (try-Layer-off(vl-remove-if-not '(lambda(x)(wcmatch x layer))(try-Layer-allname)))
)


;;;打开给水图层
(defun c:tt5 ()
      (try-Layer-off-2 "*")
      (try-Layer-on-2 "WP_G,DN_G,LGBH_G,TXT_G,EV_G,WP_G_*")
)

;;;关闭给水图层
(defun c:tt7 ()
      (try-Layer-off-2 "WP_G,DN_G,LGBH_G,TXT_G,EV_G,WP_G_*")
)
;;;可开给水层
(defun c:tt6 ()
      (try-Layer-on-2 "WP_G,DN_G,LGBH_G,TXT_G,EV_G,WP_G_*")
)

;; 关其他水层仅显示给水层
(defun c:tt8 ()
      (try-Layer-off-2 "WP_*,DN_*,LGBH_*,TXT_*,EV_*,W-DIM,W_DIM,WW_*,WX-*,SB,SB_*,PUB_W-DIM,PUB_TABLE,PUB_W-DIM")
      (try-Layer-on-2 "WP_G,DN_G,LGBH_G,TXT_G,EV_G,WP_G_*")
)
 楼主| 发表于 2020-8-10 16:53:43 | 显示全部楼层
tryhi 发表于 2020-8-10 15:34
(try-Layer-Off(vl-remove-if-not '(lambda(x)(wcmatch x "WP_G*"))(try-Layer-allname)))

感谢大侠,原来如此,懂了一点点,这样子就可以实现我发的command那样的效果了,其他类似不同的图层的也只需要增加 try-Layer-Off  try-Layer-on命令就可以了
(setq
        ;;常用VLA对象、集合
        *ACAD*  (vlax-get-acad-object)
        *DOC*   (vla-get-ActiveDocument *ACAD*)
        *DOCS*  (vla-get-Documents *ACAD*)
        *MS*    (vla-get-modelSpace *DOC*)
        *PS*    (vla-get-paperSpace *DOC*)
        *BLKS*  (vla-get-Blocks *DOC*)
        *LAYS*  (vla-get-Layers *DOC*)
        *LTS*   (vla-get-Linetypes *DOC*)
        *STS*   (vla-get-TextStyles *DOC*)
        *GRPS*  (vla-get-groups *DOC*)
        *DIMS*  (vla-get-DimStyles *DOC*)
        *LOUTS* (vla-get-Layouts *DOC*)
        *VPS*   (vla-get-Viewports *DOC*)
        *VS*    (vla-get-Views *DOC*)
        *DICS*  (vla-get-Dictionaries *DOC*)
        *Layouts* (vla-get-Layouts *doc*)
)


;;返回所有图层的名称(字符串表)
(defun try-Layer-allname(/ out)
        (vlax-for obj *LAYS*
                (setq out (cons (vlax-get-property obj 'Name) out))
        )
        (reverse out)
)


(defun try-Layer-Off (LayList)
        (setq LayList(mapcar 'strcase LayList))
        (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                                (vla-put-LayerOn each :vlax-False)
                        )
                )
                (vlax-release-object each)
        )
)

;;打开关闭图层
;;参数:图层名称表
(defun try-Layer-On (LayList)
        (setq LayList(mapcar 'strcase LayList))
        (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                                (vla-put-LayerOn each :vlax-True)
                        )
                )
                (vlax-release-object each)
        )
)



(defun c:tt5 ()
        (try-Layer-Off(vl-remove-if-not '(lambda(x)(wcmatch x "*"))(try-Layer-allname)))
        (try-Layer-on(vl-remove-if-not '(lambda(x)(wcmatch x "WP_G*"))(try-Layer-allname)))
)

(defun c:tt6 ()
        (try-Layer-on(vl-remove-if-not '(lambda(x)(wcmatch x "WP_G*"))(try-Layer-allname)))
)

(defun c:tt7 ()
        (try-Layer-Off(vl-remove-if-not '(lambda(x)(wcmatch x "WP_G*"))(try-Layer-allname)))
)
发表于 2020-8-8 15:02:12 | 显示全部楼层
去看vla帮助文件、语句
发表于 2020-8-8 15:09:13 | 显示全部楼层
有是有,但还是你用command来得直接方便
 楼主| 发表于 2020-8-8 15:14:01 | 显示全部楼层
wx302008008 发表于 2020-8-8 15:09
有是有,但还是你用command来得直接方便

大侠你的那个批量延长多段线用不了咋回事呢,单个延长的那个挺好用的
 楼主| 发表于 2020-8-8 22:10:16 | 显示全部楼层
tryhi 发表于 2020-8-8 17:52
http://bbs.mjtd.com/thread-182020-1-1.html

;;返回所有图层对应的对象名(大写)

大侠我需要打开或者关闭的图层要加到函数哪个位置呢
发表于 2020-8-8 23:16:05 | 显示全部楼层
magicheno 发表于 2020-8-8 22:10
大侠我需要打开或者关闭的图层要加到函数哪个位置呢

加载 try-Layer-On跟 try-Layer-Off,至于哪个位置?只能说哪个位置都可以
 楼主| 发表于 2020-8-9 00:21:07 | 显示全部楼层
tryhi 发表于 2020-8-8 23:16
加载 try-Layer-On跟 try-Layer-Off,至于哪个位置?只能说哪个位置都可以

大侠我咋一点概念都没有,方便举个例子不,比如WP_G,WP_G_*,这两个图层
发表于 2020-8-9 00:54:26 | 显示全部楼层
magicheno 发表于 2020-8-9 00:21
大侠我咋一点概念都没有,方便举个例子不,比如WP_G,WP_G_*,这两个图层

WP_G,WP_G_* 这不是两个图层吧,图层不允许带*号
(try-layer-make "WP_G" nil nil nil);创建WP_G图层
(try-layer-make "WP_G_X" nil nil nil);创建WP_G_X图层
(try-Layer-On '("WP_G""WP_G_X"));打开"WP_G""WP_G_X"图层
(try-Layer-Off '("WP_G""WP_G_X"));关闭"WP_G""WP_G_X"图层
 楼主| 发表于 2020-8-9 01:13:44 | 显示全部楼层
magicheno 发表于 2020-8-9 00:21
大侠我咋一点概念都没有,方便举个例子不,比如WP_G,WP_G_*,这两个图层


(defun c:TT5() (try-Layer-off '("WP_G""WP_G_DN")))
(defun try-Layer-off (layList))
        (setq LayList(mapcar 'strcase LayList))
        (vlax-for each *LAYS*
                (if (member (strcase (vla-get-name each)) LayList)
                        (if (vlax-write-enabled-p each)
                                (vla-put-LayerOn each :vlax-False)
                        )
                )
                (vlax-release-object each)
        )
)


这样子是哪里有问题的,实行不了的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-17 20:34 , Processed in 0.214121 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表