kinger 发表于 2024-7-19 17:52:21

求解:这段源码如何把点选改为框选?

下面是从论坛发现的源码,可惜选择视口时只能点选,能否使其变为框选从而批量修改视口内的图层冻结。


;;;按功能在指定视口中冻结特定图层
(defun C:Tools-LAY-SKGNDJ (/ DjKeyN DjKey VP)
(princ "\n*** 选择视口前,请保持视口中有效图层开启 ***")
(if (= (getvar "tilemode") 0)
    (progn
      (initget 7 "1 2 3 4")
      (setq Key (getkword "\n需要设置的视口功能: 1-总平面图 / 2-分区铺装索引平面图 / 3-竖向平面图 / 4-定位平面图"))
      (cond
      ((= Key "1") (setq DjKey "*ELEV*,*COOR*,*IDEN*,*LEAD*,*SYMB*,*PUB_DIM*")) ;_总平面图
      ((= Key "2") (setq DjKey "*ELEV*,*COOR*,*SYMB*,*PUB_DIM*")) ;_分区铺装索引平面图
      ((= Key "3") (setq DjKey "*填充*,*HATCH*,*COOR*,*IDEN*,*LEAD*,*SYMB*,*PUB_DIM*")) ;_竖向平面图
      ((= Key "4") (setq DjKey "*填充*,*HATCH*,*ELEV*,*IDEN*,*LEAD*,*SYMB*")) ;_定位平面图
      )
      (if (setq VP (entsel "\n选择要冻结图层的视口:"))
(FreezLayInVPCmd (car VP) DjKey)
      )
    )
    (princ "\n该命令仅允许在布局空间有效运行!")
)
(princ)
)
;;;支持通配符
(defun FreezLayInVPCmd (Ven Lst / ENT)
(if (and (= (getvar "tilemode") 0) (= (getvar "cvport") 1)) ;_判断鼠标是否在布局空间
    (progn
      (setq ENT (cdr (assoc 69 (entget Ven))))
      (command "_.MSPACE") ;_切换到模型空间
      (setvar "cvport" ENT)
      (command "_.vplayer" "F" LST "" "") ;_在模型空间中操作,冻结
      (command "_PSPACE") ;_切换到布局空间
    )
    (princ "\n*** 该命令仅允许在布局空间有效运行,请将鼠标切换到布局空间 ***")
)
)



源码来源:按功能在指定视口中冻结特定图层

饼仲郎 发表于 2024-7-19 21:13:26

里面有个entsel,想要框选就用ssget,再遍历图元循环执行。

饼仲郎 发表于 2024-7-19 21:41:03


[*](if (setq VP (entsel "\n选择要冻结图层的视口:"))
[*](FreezLayInVPCmd (car VP) DjKey)
[*]      )
[*]改为
[*](if (setq VP (ssget))
[*](progn
[*]    (setq lst-ent (mapcar '(lambda (x) (cadr x)) (vl-remove-if-not '(lambda (x) (if (= (car x) (caar (ssnamex VP))) t)) (ssnamex VP))))
[*]    (foreach x lst-ent (FreezLayInVPCmd x DjKey))
[*])
[*])
不保熟,没试代码

MZ_li 发表于 2024-7-20 08:12:29

哦,原来是金牌会员啊。楼上的,你不给全部代码,他不会呀

kinger 发表于 2024-7-21 21:26:14

饼仲郎 发表于 2024-7-19 21:41
[*](if (setq VP (entsel "\n选择要冻结图层的视口:"))
[*](FreezLayInVPCmd (car VP) DjKey)
[*]   ...

试了,可用。感谢!!
页: [1]
查看完整版本: 求解:这段源码如何把点选改为框选?