乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 56|回复: 10

[编程交流] 使用LISP进行图层操作

[复制链接]

4

主题

11

帖子

7

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 11:51:06 | 显示全部楼层 |阅读模式
我写了一些代码,打开两层,设置一个当前层,关闭所有其他层,在某些情况下似乎可以工作。当图层冻结时,它无法打开图层。我想我需要的是一个功能来检查我想要的图层是否冻结,如果是这样,那么我需要解冻它们。我已附上我写的东西。
 
  1. (defun c:DWTR ()
  2. (command "-layer" "on" "*.*" "")
  3. (command "-layer" "s" "SV_WTR_LIN" "")
  4. (command "-layer" "off" "~SV_WTR_LIN" "")
  5. (command "-layer" "on" "SV_WTR_PTS" "")
  6. (princ)
  7. )
回复

使用道具 举报

6

主题

47

帖子

36

银币

初来乍到

Rank: 1

铜币
36
发表于 2022-7-6 12:01:18 | 显示全部楼层
你好
 
无论层处于何种天气,冻结层都不会显示。解冻层,然后打开它们应该可以做到这一点。
 
祝你过得愉快。
肖恩
回复

使用道具 举报

9

主题

167

帖子

163

银币

初来乍到

Rank: 1

铜币
43
发表于 2022-7-6 12:05:42 | 显示全部楼层
  1. The following group codes apply to LAYER symbol table entries. In addition to the group codes described here, see "Common Group Codes for Symbol Table Entries." For information about abbreviations and formatting used in this table, see "Formatting Conventions in This Reference."
  2. LAYER group codes
  3. Group codes         Description
  4. 100 > Subclass marker (AcDbLayerTableRecord)
  5. 2 > Layer name
  6. 70 > Standard flags (bit-coded values):
  7. 1 = Layer is frozen; otherwise layer is thawed.
  8. 2 = Layer is frozen by default in new viewports.
  9. 4 = Layer is locked.
  10. 16 = If set, table entry is externally dependent on an xref.
  11. 32 = If this bit and bit 16 are both set, the externally dependent xref has been successfully resolved.
  12. 64 = If set, the table entry was referenced by at least one entity in the drawing the last time the drawing was edited. (This flag is for the benefit of AutoCAD commands. It can be ignored by most programs that read DXF files and need not be set by programs that write DXF files.)
  13. 62 > Color number (if negative, layer is off)
  14. 6 > Linetype name
  15. 290 > Plotting flag. If set to 0, do not plot this layer
  16. 370 > Lineweight enum value
  17. 390 > Hard pointer ID/handle of PlotStyleName object
  18. Xref-dependent layers are output during SAVEAS. For these layers, the associated linetype name in the DXF file is always CONTINUOUS.
回复

使用道具 举报

4

主题

11

帖子

7

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 12:11:12 | 显示全部楼层
这就是我想要的:
 
步骤1:检查第1层或第2层是否冻结。如果第1层或第2层冻结,请解冻这些层
 
第2步:使第1层成为当前层
 
步骤3:关闭除第1层和第2层之外的所有功能
 
我不知道如何使用DXF代码处理属性,有人能帮我找到正确的方向吗?非常感谢您的帮助。
回复

使用道具 举报

6

主题

47

帖子

36

银币

初来乍到

Rank: 1

铜币
36
发表于 2022-7-6 12:15:54 | 显示全部楼层
你好
 
我不知道你为什么要检查第1层和第2层是否被冻结,除非你计划在函数结束时恢复当前设置。我只会解冻它们,如果图层已经解冻或没有解冻,对layer命令无关紧要。
 
  1. (command "._Layer" "Off" "*"
  2.                           "On" "Layer1,Layer2"
  3.                           "Thaw" "Layer1,Layer2"
  4.                           "Set" "Layer1"
  5. ); command

 
希望这有帮助。
 
祝你过得愉快。
肖恩
回复

使用道具 举报

4

主题

11

帖子

7

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 12:23:43 | 显示全部楼层
shawn你在cad中试过这个吗?我试过你的方法,它产生了很多提示,告诉你真的想关闭XXX层,等等,命令应该不会给出提示,应该是全自动的。
 
  1. (defun c:SS ()
  2. (command "._Layer"     "Off"      "*"
  3.    "On"      "C-SSWR,C-SSWR-SYMB"
  4.    "Thaw"     "C-SSWR,C-SSWR-SYMB"
  5.    "Set"     "C-SSWR"
  6.   )    ; command
  7. )
回复

使用道具 举报

5

主题

194

帖子

193

银币

初来乍到

Rank: 1

铜币
24
发表于 2022-7-6 12:33:05 | 显示全部楼层
查看层是否冻结的函数
 
 
  1. ;|        Input - String, Layer name
  2.              Output   t   if layer is frozen
  3.                           nil  if its thawed
  4.             
  5. |;
  6. (defun LayerIsFrozen (<LayerName>)
  7. (vl-load-com)
  8. (eq
  9.    ;Test is frozen
  10.     (vla-get-freeze
  11.       ;Convert to Vla Object
  12.      (vlax-ename->vla-object
  13. ;Retun ename of layer
  14. (tblobjname "LAYER" <LayerName>))
  15.      )
  16.    ':vlax-true)
  17. )

 
使用autolisp也可以实现同样的效果,但编码可能会更长
 
样本使用
 
  1. (if (LayerIsFrozen "SV_WTR_LIN") (command "-layer" "thaw" "SV_WTR_LIN" ""))

 
当做
 
杰米
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:36:24 | 显示全部楼层
 
另一个:
 
  1. (defun isFrozen (layname)
  2. (eq 1 (logand 1 (cdr (assoc 70 (entget (tblobjname "LAYER" layname)))))))
回复

使用道具 举报

4

主题

11

帖子

7

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-6 12:41:40 | 显示全部楼层
 
Jammie我喜欢autolisp路线,即使我需要输入更多,我也相当了解我正在输入的内容。我的问题是如何定义分层冻结?我认为李有这个想法,但我不知道如何使它工作。如果你们有时间,可以让它为我工作,我将不胜感激,因为我正在学习在每一行代码旁边键入注释。这将帮助我理解不同的命令在做什么。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:46:50 | 显示全部楼层
我更喜欢在VL中进行:
 
  1. (defun c:test nil
  2. (vl-load-com)
  3. (vlax-for layer (vla-get-Layers
  4.                     (vla-get-ActiveDocument
  5.                       (vlax-get-acad-object)))
  6.    (if (vl-position (vla-get-name layer) '("Layer1" "Layer2"))
  7.      (progn
  8.        (vla-put-freeze  layer :vlax-false)
  9.        (vla-put-layeron layer :vlax-true))
  10.      (vla-put-layeron layer :vlax-false)))
  11. (and (tblsearch "LAYER" "Layer1")
  12.       (setvar   "CLAYER" "Layer1"))
  13. (princ))
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 10:20 , Processed in 0.473408 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表