乐筑天下

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

[编程交流] MLeader Rou的块属性

[复制链接]

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 16:21:21 | 显示全部楼层 |阅读模式
你好
 
我有一个lisp例程,它读取块属性并使用它创建多重引线。读取属性字符串被处理10次,以在每个双空格(“”)处插入回车符。此函数导致CAD崩溃,并返回内存访问异常。它不喜欢使用我的变量,特别是attval(正在处理的块属性中的字符串)。看看下面的lisp,有没有更好、更可靠的方法来管理这些变量?
 
谢谢
瓦迪姆
 
-------------------------------------------------------------------------------------------
 
(命令“_audcallotinsert”e“”p)
(setq xEnt(entlast))
(setq myEnt xEnt)
 
(setq InsPnt(cdr(assoc 10(entget xEnt)))
(setq insTyp(cdr(assoc 0(entget xEnt)))
(setq insLyr(cdr(assoc 8(entget xEnt)))
; 获取ATTRIBUTE1的值
(虽然
(和
(空值)
(=“ATTRIB”(cdr(assoc 0(setq enx(entget(setq myEnt(entnext myEnt 107;)Ю)Ю))))
)
(if(=(strcase“ATTRIBUTE1”)(strcase(cdr(assoc 2 enx)))
(程序
(setq attval(cdr(assoc 1 enx)))
(setq atthgt(cdr(assoc 40 enx)))
; 将双空格转换为CR/LF
; 命令重复10次,因为函数一次只转换一个字符串
(重复10(setq attval(vl string subst“\r\n”“”attval)))
)  
)
)
 
(entdel xEnt)
(命令“-layer”set“insLyr”)
 
(setq PT1(getpoint“\n点击引线起点:”)
(setq PT2(getpoint PT1“\n点击着陆点:”)
(命令“_mleader”PT1 PT2 attval)(普林斯)
 
(命令“-layer”set“curLyr”)
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 16:33:35 | 显示全部楼层
如果activex是一个选项:
 
  1. (vl-load-com)
  2. (and
  3. (setq e (car (entsel "\nPick attributed block: ")))
  4. (setq o (vlax-ename->vla-object e))
  5. (vlax-write-enabled-p o)
  6. (eq (vla-get-HasAttributes o) :vlax-true)
  7. (setq att (vl-some (function (lambda (x) (if (= "ATTRIBUTE1" (strcase (vla-get-TagString x))) x))) (vlax-invoke o 'GetAttributes)))
  8. (setq attval (vla-get-TextString att))
  9. (setq atthgt (vla-get-Height att))
  10. (setq attval (vl-string-translate "\r" " " (vl-string-translate "\n" " " attval)))
  11. (setq pt1 (getpoint "\nPick start point of leader: "))
  12. (setq PT2 (getpoint pt1 "\nPick landing point: "))
  13. (progn
  14.    (command "._MLEADER" pt1 pt2 attval)
  15.    (entmod (append (entget (entlast)) (list (assoc 8 (entget e)))))
  16.    (not (vla-Delete o))
  17. )
  18. ); and
回复

使用道具 举报

4

主题

2143

帖子

2197

银币

限制会员

铜币
-24
发表于 2022-7-5 16:39:39 | 显示全部楼层
请阅读代码发布指南,并编辑代码以包含在代码标签中。[NOPARSE]
  1. Your Code Here[/NOPARSE]
=
  1. Your Code Here
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 16:49:24 | 显示全部楼层
vl某些函数返回的不是nil或nil。
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:03:20 | 显示全部楼层
谢谢你的代码!我有一个机会,但仍然让澳元崩溃时,我运行的例行程序。需要再多玩一点。再次感谢!
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:05:43 | 显示全部楼层
 
是的,所以要准确地确定返回什么,焦点必须在(lambda)内-例如:
 
  1. (vl-some (function (lambda (x) (= "ATTRIBUTE1" (strcase (vla-get-TagString x))))) (vlax-invoke o 'GetAttributes))

可能返回T或nil
 
以及:
  1. (vl-some (function (lambda (x) (if (= "ATTRIBUTE1" (strcase (vla-get-TagString x))) x))) (vlax-invoke o 'GetAttributes))

可以返回属性对象或nil
 
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 17:15:14 | 显示全部楼层
lambda的另一种替代方法是根据本例使用foreach
 
  1. (foreach att (vlax-invoke (vlax-ename->vla-object (ssname SS1 x)) 'getattributes)
  2.    (if (= oldtag1 (strcase (vla-get-tagstring att)))
  3.    (vla-put-textstring att newstr1)
  4. ))
回复

使用道具 举报

1

主题

3

帖子

2

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:27:38 | 显示全部楼层
尝试获取属性值的新方法,并在MLeader中使用它,但我在att中没有完全获取值。我在这里旋转轮子,有人能检查一下我是否正确获取了属性吗?完成下面的代码。
 
作为免责声明,我对AutoLISP非常陌生。希望编辑此函数以消除崩溃。
 
  1. (defun c:MLCALLOUT (/)
  2. (vl-load-com)
  3. (sssetfirst nil nil) ; Deselect everything if anything is selected
  4. (setq myMode (getvar "tilemode"))      ; myMode=0 means we're in paper space
  5. (if (= myMode 0) (command ".mspace"))  ; if in paper space, switch to model space
  6. (setq ss (ssget "_+.:E:S" '((0 . "INSERT,ARC,CIRCLE,*POLYLINE"))))  ; get the entity
  7. (setq e (ssname ss 0))                 ; get the entity's handle
  8. (setq p (cadr (cadddr (car (ssnamex ss)))))
  9. (setq curLyr (getvar "clayer"))
  10. (setq myScale (getvar "cannoscale"))      ; get the annotation scale
  11. (setq myScale (atoi (substr myScale 3 (- (strlen myScale) 2)))) ;get the cannoscale
  12. (if (= myMode 0) (progn (command ".pspace")(setq p (list 0 0 0 ))))  ; if we were in paper space, switch back
  13. (setq xT (cdr (assoc 0 (entget e))))
  14. ; AUD insert Callout Command
  15. (command "_AUDCALLOUTINSERT" e "" p)
  16. (setq xEnt (entlast))
  17. (setq myEnt xEnt)
  18. (setq insLyr (cdr (assoc 8  (entget xEnt))))
  19. ; Get the value of ATTRIBUTE1
  20. (setq blk (vlax-ename->vla-object myEnt))
  21. (setq tag "ATTRIBUTE1")
  22. (vl-some '(lambda ( att ) (if (= tag (strcase (vla-get-tagstring att))) (vla-get-textstring att)))
  23.      (vlax-invoke blk 'getattributes)
  24. )
  25. (entdel xEnt) ; Delete the block entity from AUD Callout Command
  26. (command "-layer" "set" insLyr "") ; Set to callout layer
  27. ; Create multileader
  28. (setq PT1 (getpoint "\nPick start point of leader: "))
  29. (setq PT2 (getpoint PT1 "\nPick landing point: "))
  30. (command "._mleader" PT1 PT2 att)
  31. (command "-layer" "set" curLyr "") ; Restore previous layer
  32. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-20 21:26 , Processed in 1.784573 second(s), 69 queries .

© 2020-2025 乐筑天下

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