乐筑天下

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

[编程交流] 帮助循环#039;转换Byl

[复制链接]

1

主题

1

帖子

0

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 08:42:57 | 显示全部楼层 |阅读模式
大家好,我是Lisp新手,在循环下面的Lisp时遇到了麻烦。我试图选择对象,然后将它们放在与其颜色和线型相关的图层上。例如,我想选择一个BYLAYER=红色和虚线的对象,然后将其放置在名为1DASHED的层上。我已经用下面的代码运行了它,但因为我使用了NENTSEL,我一次只能选择一个对象(它可以工作),我需要它循环运行整个图形中的每个对象,但每次我尝试循环时,我都会收到一个错误,说VARITYP或类似的东西(现在在家里,没有CAD来重新生成错误),我查找了它,这意味着我引用的是一个选择集,而不是一个列表。请帮忙循环这个。我绝望了。
 
(定义C:QQQ(/esl laycol)
 
(while(not(setq esl(nentsel)));;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
(setq LayCol(cdr(cadddr(tblsearch“layer”(cdr(assoc 8(entget(car esl k k)а)))))
(setq LayLin(Cdr(cdddr(tblsearch“layer”(Cdr(assoc 8(entget(car esl Ϟ)Ϟ))))))
(setq LayName(strcat(rtos LayCol)LayLin))
 
(命令“LAYER”“m”LayName“C”laycol LayName“Ltype”LayLin LayName“”)
(命令“CHPROP”esl““LA”LayName“C”“BYLAYER”“LType”“BYLAYER”)
 
)
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 08:52:37 | 显示全部楼层
欢迎来到Micko79论坛
 
试试这个
 
  1. (defun c:LayMod (/ aDoc lyrsColl ltpotd Lyrs ss ent nme)
  2. (vl-load-com)
  3. (setq aDoc  (vla-get-ActiveDocument (vlax-get-acad-object))
  4. lyrsColl (vla-get-layers aDoc)
  5. ltpotd  (vla-get-linetypes aDoc)
  6. )
  7. (defun _dxf (ent dx_) (cdr (assoc dx_ ent)))
  8. (defun _lyslst (/ Laylst)
  9.    (while (setq a (tblnext "Layer" (null a)))
  10.      (if (not (wcmatch (_dxf a 2) "*|*"))
  11. (progn (setq lyp (tblsearch "Layer" (_dxf a 2)))
  12.        (setq
  13.   Laylst (append
  14.     (list (_dxf a 2) (itoa (_dxf a 62)) (_dxf a 6))
  15.     Laylst
  16.   )
  17.        )
  18. )
  19.      )
  20.    )
  21.    Laylst
  22. )
  23. (setq Lyrs (_lyslst))
  24. (if (ssget ":L" '((0 . "~VIEWPORT")))
  25.    (progn
  26.      (vlax-for itm (setq ss (vla-get-ActiveSelectionSet aDoc))
  27. (setq nme (member (vla-get-layer itm) Lyrs))
  28.     (vla-put-layer
  29.       itm
  30.       (if (vl-catch-all-error-p
  31.      (vl-catch-all-apply
  32.        'vla-item
  33.        (list lyrsColl
  34.       (setq lynm (strcat (cadr nme) (caddr nme)))
  35.        )
  36.      )
  37.    )
  38. (progn (vla-add lyrsColl lynm)
  39.         (vla-put-color
  40.    (vla-item lyrsColl lynm)
  41.    (atoi (cadr nme))
  42.         )
  43.         (if (= nil (tblsearch "LTYPE" (caddr nme)))
  44.    (vla-add (vla-get-linetypes ltpotd (caddr nme)))
  45.         )
  46.         (vla-put-linetype
  47.    (vla-item lyrsColl lynm)
  48.    (caddr nme)
  49.         )
  50.         lynm
  51. )
  52. lynm
  53.       )
  54.     )
  55.     (vla-put-linetype itm "ByLayer")
  56.     (vla-put-color itm acByLayer)
  57.   )
  58.      (vla-delete ss)
  59.    )
  60. )
  61. (princ)
  62. )

 
希望这有帮助
 
如果需要此选项来选择所有对象
更改此
(ssget“:L”'((0.~视口”))

(ssget“_X”'((0。“~视口”))
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:04:04 | 显示全部楼层
希望你不要介意,如果我张贴我的尝试与香草代码。
 
  1. (defun c:TesT (/ ss sset e l New)
  2. ;; Tharwat 07 Nov. 2011 ;;
  3. (if (setq ss (ssget "_:L"))
  4.    (repeat (setq i (sslength ss))
  5.      (setq sset (ssname ss (setq i (1- i))))
  6.      (setq e (entget sset))
  7.      (setq l (entget (tblobjname "LAYER" (cdr (assoc 8 e)))))
  8.      (if (not
  9.            (tblsearch
  10.              "LAYER"
  11.              (setq
  12.                New (strcat (itoa (cdr (assoc 62 l))) (cdr (assoc 6 l)))
  13.              )
  14.            )
  15.          )
  16.        (progn
  17.          (entmakex (list '(0 . "LAYER")
  18.                          '(100 . "AcDbSymbolTableRecord")
  19.                          '(100 . "AcDbLayerTableRecord")
  20.                          (cons 2 New)
  21.                          (assoc 62 l)
  22.                          (assoc 6 l)
  23.                          (cons 70 0)
  24.                    )
  25.          )
  26.          (entmod (subst (cons 8 New) (assoc 8 e) e))
  27.        )
  28.        (entmod (subst (cons 8 New) (assoc 8 e) e))
  29.      )
  30.    )
  31.    (princ)
  32. )
  33. (princ)
  34. )
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:08:16 | 显示全部楼层
不用担心,塔尔瓦特。我最初也是用vanilla编写的,但现在我总是假设OP使用注释性实体。
 
(entmod(subst(cons 8 New)(assoc 8 e)e));
 
特别是对于注释性多行文字,上面的行会弄乱文字高度
 
干杯
 
顺便提一下
此外,您可能需要添加到例程中,根据OP的要求将颜色和线型更改为“Bylayer”
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:14:08 | 显示全部楼层
使用entmod函数更改图层不会对注释性文本产生负面影响,这与更改文本高度的entmod相同。
 
这套程序按预期完成了任务,我想你没有试过,试试吧。
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:25:53 | 显示全部楼层
塔瓦,我确实试过了,你认为我为什么建议这么做?
 
尝试将两个实体的颜色更改为1,将线型更改为虚线,然后运行例程
 
对于注释性多行文字,不要假设每个人在绘制时使用相同的单位
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:32:00 | 显示全部楼层
 
因为大多数专家阅读代码都没有尝试过(毫无疑问,你就是其中之一)
 
 
 
这是完全正确的,我没有这样想。你说得对。
 
 
顺致敬意,
回复

使用道具 举报

pBe

32

主题

2722

帖子

2666

银币

后起之秀

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

铜币
211
发表于 2022-7-6 09:37:54 | 显示全部楼层
 
我不是专家,真的。我确实先看了你的代码,我看到你使用了entmod,这促使我说我做了什么,所有这些都是因为我一直在使用这种方法,但对于注释性实体,你永远也不能太确定。
 
 
是的,这就是OP想要他的代码做的。
(命令“CHPROP”esl““LA”LayName“C”“BYLAYER”“LType”“BYLAYER”“);
 
为我的朋友干杯。
 
 
 
 
回复

使用道具 举报

4

主题

2143

帖子

2197

银币

限制会员

铜币
-24
发表于 2022-7-6 09:42:57 | 显示全部楼层
请阅读代码发布指南并编辑您的帖子。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-7-8 01:33 , Processed in 1.337430 second(s), 70 queries .

© 2020-2025 乐筑天下

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