乐筑天下

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

[编程交流] 关于两者结合的建议

[复制链接]

49

主题

1246

帖子

1210

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
254
发表于 2022-7-6 11:20:13 | 显示全部楼层 |阅读模式
我并不声称自己懂LISP,但我肯定能自己动手编写代码并制作出简单的例程眨眼:
 
无论如何,我今天在绘制多比例图形时创建了两个非常有用的Lisp。我想知道是否可以将两者结合起来,这样可以冻结和解冻我想要操纵的层,有点像“切换”。我假设这将使我深入(if)语句、表达式或论点。。。。我永远记不起操作符是哪一个,如果它是操作符的话。这是我制作的两个独立的测试LISP文件,基本上是一个命令行层脚本。。。。
 
  1. (DEFUN C:4IN (/ )
  2. (command "._layer" "_t" "*-048" "_t" "*-4.5" "_f" "*-096" "_f" "*-09" "")
  3. (princ)
  4. )
  1. (DEFUN C:8IN (/ )
  2. (command "._layer" "_f" "*-048" "_f" "*-4.5" "_t" "*-096" "_t" "*-09" "")
  3. (princ)
  4. )

 
因此,我要向大家提出的问题是:(1)为我指明正确的方向,或者使用一些示例代码,指导我将它们结合起来;(2)向我展示如何在不使用这种过时的命令行样式脚本方法的情况下控制层实体。仅仅是几个简单的要求就够了,从技术上讲,我已经具备了我所需要的,而且效果很好,但我有兴趣将我的技能扩展到超级新手,从超级新手扩展到超级新手。提前谢谢。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 11:24:17 | 显示全部楼层
可能是这样的:
 
  1. (defun c:mylay (/ input tl fl)
  2. (initget 1 "4 8")
  3. (setq input (getkword "\n4 or 8:   "))
  4. (cond ((= input "4")
  5.            (setq tl (list "*048" "*-4.5")   ;THAW LIST
  6.                  fl (list "*096" "*-09")))  ;FREEZE LIST
  7.        ((= input "8")
  8.            (setq fl (list "*048" "*-4.5")   ;FREEZE LIST
  9.                  tl (list "*096" "*-09")))) ;THAW LIST
  10. (command "_.LAYER")
  11. (foreach l tl
  12.    (command "_.Thaw" l))
  13. (foreach l fl
  14.    (command "_Freeze" l))
  15. (command "")
  16. (princ))

 
 
您可以操作冻结和解冻列表,如果需要,还可以添加更多。
-大卫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:27:43 | 显示全部楼层
如果您想避免命令行调用,下面是另一种方法:
 
  1. (defun c:laytog ( / GetLayers Freeze Thaw l1 l2 )
  2. ;; Lee Mac  ~  22.04.10
  3. (defun GetLayers ( wc / def n lst )
  4.    (while (setq def (tblnext "LAYER" (not def)))
  5.      (if (wcmatch (setq n (cdr (assoc 2 def))) wc)
  6.        (setq lst (cons (tblobjname "LAYER" n) lst))))
  7.    lst)  
  8. (defun Freeze ( layer / dx70 el )
  9.    (setq dx70 (cdr (assoc 70 (setq el (entget layer)))))
  10.    (entmod
  11.      (subst
  12.        (cons 70 (boole 7 1 dx70)) (assoc 70 el) el)))
  13. (defun Thaw ( layer / dx70 el )
  14.    (setq dx70 (cdr (assoc 70 (setq el (entget layer)))))
  15.    (entmod
  16.      (subst
  17.        (cons 70 (boole 4 1 dx70)) (assoc 70 el) el)))
  18. (setq l1 (GetLayers "*-4.5") l2 (GetLayers "*-09"))  
  19. (cond (  (setq *flag* (not *flag*))
  20.         
  21.           (mapcar (function Freeze) l1)
  22.           (mapcar (function Thaw)   l2))
  23.        (  (mapcar (function Freeze) l2)
  24.           (mapcar (function Thaw)   l1)))
  25. (princ))
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:31:21 | 显示全部楼层
另一个,如果你想变得花哨的话
 
  1. (defun c:laytog ( / GetLayers FTLayer l1 l2 )
  2. ;; Lee Mac  ~  22.04.10
  3. (defun GetLayers ( wc / def n lst )
  4.    (while (setq def (tblnext "LAYER" (not def)))
  5.      (if (wcmatch (setq n (cdr (assoc 2 def))) wc)
  6.        (setq lst (cons (tblobjname "LAYER" n) lst))))
  7.    lst)  
  8. (defun FTLayer ( layer freeze / dx70 el )
  9.    (setq dx70 (cdr (assoc 70 (setq el (entget layer)))))
  10.    (entmod
  11.      (subst
  12.        (cons 70 (boole (+ 4 (* freeze 3)) 1 dx70)) (assoc 70 el) el)))  
  13. (setq l1 (GetLayers "*-4.5") l2 (GetLayers "*-09"))
  14. (mapcar
  15.    (function
  16.      (lambda ( layers flag )
  17.        (mapcar
  18.          (function
  19.            (lambda ( layer )
  20.              (FTLayer layer flag)
  21.            )
  22.          )
  23.          layers
  24.        )
  25.      )
  26.    )
  27.    (list l1 l2) (if (setq *flag* (not *flag*)) '(1 0) '(0 1))
  28. )
  29. (princ))
回复

使用道具 举报

24

主题

1265

帖子

1028

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
362
发表于 2022-7-6 11:36:45 | 显示全部楼层
请不要燃烧。。。这并不是要诋毁David或Lee的代码。。。。。但是将原始代码严格组合为“切换”。。这个怎么样?
 
这个例子确实假设有一个名为“a-048”的层,你可以改变它——或者如果你不想做任何假设,你必须迭代层集合,检查每个*-048”层,然后确定它们的冻结/解冻状态是否对所有层都不一样。。。
 
此外,您可能希望先将第0层设置为当前层,这样就不会试图冻结当前层。
 
  1. (defun c:laytog ()
  2. (if (eq 1 (logand 1 (cdr (assoc 70 (tblsearch "layer" "A-048")))))
  3.    (command "._layer" "_t" "*-048" "_t" "*-4.5" "_f" "*-096" "_f" "*-09" "")
  4.    (command "._layer" "_f" "*-048" "_f" "*-4.5" "_t" "*-096" "_t" "*-09" "")
  5. )
  6. )
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 11:38:26 | 显示全部楼层
仅供参考。当使用-layer时,您不必分离字符串。
 
如。
  1. (command "._layer" "_t" "*-048" "_t" "*-4.5" "_f" "*-096" "_f" "*-09" "")

 
可以执行为:
  1. (command "_.layer" _t" "*-048,*-4.5" "_f" "*-096,*-09" "")

 
并不是说你的代码或大卫或李的代码有什么问题。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 11:42:29 | 显示全部楼层
火焰!!
 
非常好的一点。
 
  1. (if (wcmatch (getvar 'clayer) "*-096,*-09")
  2. (command "_.layer" "_t" "0" "_s" "0" ""))
回复

使用道具 举报

24

主题

1265

帖子

1028

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
362
发表于 2022-7-6 11:45:55 | 显示全部楼层
谢谢,我知道它就要来了。。。。
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
438
发表于 2022-7-6 11:51:25 | 显示全部楼层
嘿,我只是在修改坦纳的作品。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 11:53:44 | 显示全部楼层
 
我只是提供了一个替代方案
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-6 02:46 , Processed in 1.035647 second(s), 72 queries .

© 2020-2025 乐筑天下

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