乐筑天下

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

[编程交流] 跨多通道替换块

[复制链接]

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:48:25 | 显示全部楼层 |阅读模式
你好
我还想知道如何在多个布局中插入块,但这可能一箭双雕。
无论如何,我正在尝试跨多个布局替换块。我只是通过更改dxf代码2来实现这一点。问题是,如果新块在图形中不存在,它将无法工作。好的,我只需要使用insert命令先插入块。但是我的画里有一个额外的方块。。。一定有更好的方法,这是我的代码:
 
谢谢,
 
注:如果您想知道所有布局的foreach循环的意义是什么,这只是暂时的,因为CAB发布了一个布局选择程序(一些简单的Autolisp问题的第5页)因此,之后我将把(布局列表)更改为选项卡列表。
 
旁白:如何链接到线程中的特定帖子?
回复

使用道具 举报

2

主题

60

帖子

65

银币

初来乍到

Rank: 1

铜币
7
发表于 2022-7-6 12:52:14 | 显示全部楼层
你好
 
一个例子
+
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 12:55:53 | 显示全部楼层
谢谢Patrick,尽管我只是vlisp的初学者,这很有意义,而且效果很好。
我有几个学习问题:cvport 1决定我目前是否在paperspace?我尝试在模型空间中运行代码,但它仍然改变了paperspace中的所有块,vla获取paperspace和vla获取模型空间如何影响代码?
 
 
另一方面:
如果我有一个我想要使用的布局列表(即不是图形中的所有布局),我想我可以在ssget函数之前放置一个foreach循环并添加(cons 410 layout),但这会产生很多循环。我想知道什么是将列表直接放入ssget函数的最好方法?
如果我能得到这份清单(“第1页”、“第3页”、“第5页”等)
然后将其放入ssget筛选器中,如
(cons 410“第1页、第3页、第5页等”),我认为这是最好的方法。
 
编辑:除非有更好的方法,否则别担心,我只是想到了这个:
谢谢
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:00:14 | 显示全部楼层
或者,这应该可以:
 
  1. (setq str (car (layoutlist)))
  2. (foreach lay (cdr (layoutlist))
  3. (setq str (strcat str (chr 44) lay)))
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:01:54 | 显示全部楼层
谢谢李,是的,这很有效。
实际上,这很方便,因为出于某种原因,我用我的方法发现第一个和最后一个布局没有包含在选择集中。。。?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:04:41 | 显示全部楼层
还没有真正正确地查看您的重复循环,但乍一看,没有必要使用:
 
  1. (setq laystr (strcat """ laystr """))

 
变量laystr将解释为:
 
“”布局1,布局2,布局3“”
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:09:31 | 显示全部楼层
啊,行了。
 
好的,现在我的程序一切都很好;还有一件事我想添加到它,那就是,有一个单一的属性在块中,我想改变。现在我可以用autolisp实现这一点(见下面Patrick编辑的代码),但在所有vlisp编码中看起来都很糟糕。在vlisp中容易做到吗?没什么太复杂的
 
同样,我仍然想知道在Patricks代码中vla get paperspace和vla get modelspace函数的影响。
回复

使用道具 举报

2

主题

60

帖子

65

银币

初来乍到

Rank: 1

铜币
7
发表于 2022-7-6 13:13:13 | 显示全部楼层
你好
 
试试这个
 
  1. (defun rplce_Issue_blks(block tablist rev_date / bl block doc file sel
  2.            laylist laystr
  3.            ss subenlst)
  4. (vl-load-com)
  5. (setq doc (vla-get-activedocument (vlax-get-acad-object))
  6. )
  7. (vla-startundomark doc)
  8. (or (tblsearch "block" block)
  9.      (not (setq file (findfile (strcat "R:\\AutoCAD\\Blocks\" block ".dwg"))))
  10.    (vla-delete (vla-insertblock (if (eq (getvar "cvport") 1)
  11.                   (vla-get-paperspace doc)
  12.                   (vla-get-modelspace doc)
  13.                 )
  14.                 (vlax-3d-point '(0.0 0.0 0.0))
  15.                 file
  16.                 1
  17.                 1
  18.                 1
  19.                 0
  20.        )
  21.    )
  22. )
  23. ; Added layouts
  24. (setq laystr (car tablist))
  25. (foreach lay (cdr tablist)
  26.    (setq laystr (strcat laystr (chr 44) lay))
  27. )
  28. ;(princ laystr)
  29. (and (tblsearch "block" block)
  30.       (ssget "_x" (list (cons 0 "insert") (cons 2 "IFA,IAC,IFC") (cons 410 laystr) (cons 67 1))) ; dxf 67=1 only paperspace
  31.    (progn
  32.      (vlax-for bl (setq sel (vla-get-activeselectionset doc))
  33.        (vla-put-name bl block)
  34. [color=Red][b]    (and (setq att (vlax-invoke bl 'getattributes))
  35.      (vla-put-textstring (car att) rev_date)
  36.    )
  37. [/b][/color]      )
  38.      (vla-delete sel)
  39.    )
  40. )
  41. ; This is deffinately Bad Practice (using autolisp in a vlisp routine), but I don't know how to change an attribute any other way...
  42. ;   (If (setq ss (ssget "_x" (list (cons 0 "insert") (cons 2 "IFA,IAC,IFC") (cons 410 laystr) (cons 67 1))))
  43. ;(Progn
  44. ;  (foreach en (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
  45. ;    (If (= (cdr (assoc 0 (setq subenlst (entget (entnext en))))) "ATTRIB")
  46. ;      (entmod (subst (cons 1 rev_date) (assoc 1 subenlst) subenlst))
  47. ;      (Princ "Couldn't change the date in the new Issue Blocks\n"))
  48. ;    ))(Princ "No Blocks found\n"))
  49. ; End of Bad Practice
  50. (vla-endundomark doc)
  51. (princ)
  52. )
未测试
 
@+
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:16:10 | 显示全部楼层
作为旁白Steve,我想进一步解释一下Patrick提供的方法,如果您在一个块中处理多个属性,这将对您有所帮助。
 
有两种方法可以获取块中的属性列表,如下所示。每个将返回不同的数据类型,列表或变体。
 
假设块对象设置为变量Obj。
 
现在,有两种方法来检索属性,这两种方法还取决于您是否也要获取常量属性。
 
使用Patricks方法:
 
  1. (vlax-invoke Obj 'GetAttributes)
将返回块中的属性列表,不包括常量属性。
 
将返回类似的内容:
 
  1. (#<VLA-OBJECT IAcadAttributeReference 0e13b9ec>
  2. #<VLA-OBJECT IAcadAttributeReference 0e13b76c>)
一种替代方法,您可能更习惯于看到的一种方法是:
 
这将再次为您提供一个AttributeReference对象列表,以便您可以随心所欲地进行操作。
 
要包含常量属性,您需要调用另一个方法,并附加结果,例如:
 
这将返回块中所有属性的列表,例如:
 
使用如上所述的另一种方法,可以这样做:
 
  1. (apply 'append
  2. (mapcar
  3.    (function
  4.      (lambda (x)
  5.        (vlax-safearray->list
  6.          (vlax-variant-value x))))
  7.    (list (vla-getAttributes Obj)
  8.          (vla-getConstantAttributes Obj))))
或类似内容,取决于您是否要使用mapcar。
 
更进一步,如果我们想从一个块中获取所有属性,但我们不知道它是否具有常量属性,该怎么办。
 
使用此方法:
 
  1. (append
  2. (vlax-invoke Obj 'GetAttributes)
  3. (vlax-invoke Obj 'GetConstantAttributes)
  4. )
不会引起问题,因为第二个列表只是一个空列表['()或nil],可以成功地追加。
 
但是,您无法将空的safearray转换为列表,因为您将收到有关safearray索引的错误。
 
这可以通过一些错误捕获来避免:
 
当将安全阵列转换为列表的操作出错时,使用vl catch all apply将防止程序崩溃。如果vl-catch-all-error-p返回一个错误对象(#),则vl-catch-all-error-p将返回T,这与我们需要的结果(列表)相反。
 
检查空safearray的另一种方法是检查safearray维度的上界。
 
vla GetConstantatAttributes方法返回的safearray只有一个维度(vla对象列表),因此我们可以使用以下方法检查该维度的上限:
 
上述结果为-1表示safearray为空,因此,在继续将safearray转换为列表之前,可以使用一个简单的条件来检查这一点。
 
注意:请记住,安全数组的上界比维度包含的元素数少一个,因为它是从零开始索引的。因此,具有3个属性的块将返回一个上限为2的一维安全数组。
 
我希望这能帮助你更好地理解这个过程。
 
如果你对我发布的任何东西有任何进一步的问题,尽管问。
 
干杯
 
回复

使用道具 举报

14

主题

271

帖子

257

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 13:20:01 | 显示全部楼层
Patrick谢谢,它可以工作-2个函数,多么简单!
 
李,这是一个巨大的帮助,我会有更多的问题,但我必须先仔细考虑这里的一切。然而,一个明显的问题是,当vlax invoke(1个函数)如此简单时,为什么会有人使用vlax safearray方法(3个函数)?我认为这是因为较长的方法是学习vlisp的常见途径。不过,我还是可以跳过调用:wink:
 
谢谢
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-5 02:59 , Processed in 0.809619 second(s), 72 queries .

© 2020-2025 乐筑天下

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