跨多通道替换块
你好我还想知道如何在多个布局中插入块,但这可能一箭双雕。
无论如何,我正在尝试跨多个布局替换块。我只是通过更改dxf代码2来实现这一点。问题是,如果新块在图形中不存在,它将无法工作。好的,我只需要使用insert命令先插入块。但是我的画里有一个额外的方块。。。一定有更好的方法,这是我的代码:
谢谢,
注:如果您想知道所有布局的foreach循环的意义是什么,这只是暂时的,因为CAB发布了一个布局选择程序(一些简单的Autolisp问题的第5页)因此,之后我将把(布局列表)更改为选项卡列表。
旁白:如何链接到线程中的特定帖子? 你好
一个例子
+ 谢谢Patrick,尽管我只是vlisp的初学者,这很有意义,而且效果很好。
我有几个学习问题:cvport 1决定我目前是否在paperspace?我尝试在模型空间中运行代码,但它仍然改变了paperspace中的所有块,vla获取paperspace和vla获取模型空间如何影响代码?
另一方面:
如果我有一个我想要使用的布局列表(即不是图形中的所有布局),我想我可以在ssget函数之前放置一个foreach循环并添加(cons 410 layout),但这会产生很多循环。我想知道什么是将列表直接放入ssget函数的最好方法?
如果我能得到这份清单(“第1页”、“第3页”、“第5页”等)
然后将其放入ssget筛选器中,如
(cons 410“第1页、第3页、第5页等”),我认为这是最好的方法。
编辑:除非有更好的方法,否则别担心,我只是想到了这个:
谢谢 或者,这应该可以:
(setq str (car (layoutlist)))
(foreach lay (cdr (layoutlist))
(setq str (strcat str (chr 44) lay)))
谢谢李,是的,这很有效。
实际上,这很方便,因为出于某种原因,我用我的方法发现第一个和最后一个布局没有包含在选择集中。。。? 还没有真正正确地查看您的重复循环,但乍一看,没有必要使用:
(setq laystr (strcat "\"" laystr "\""))
变量laystr将解释为:
“”布局1,布局2,布局3“” 啊,行了。
好的,现在我的程序一切都很好;还有一件事我想添加到它,那就是,有一个单一的属性在块中,我想改变。现在我可以用autolisp实现这一点(见下面Patrick编辑的代码),但在所有vlisp编码中看起来都很糟糕。在vlisp中容易做到吗?没什么太复杂的
同样,我仍然想知道在Patricks代码中vla get paperspace和vla get modelspace函数的影响。 你好
试试这个
(defun rplce_Issue_blks(block tablist rev_date / bl block doc file sel
laylist laystr
ss subenlst)
(vl-load-com)
(setq doc (vla-get-activedocument (vlax-get-acad-object))
)
(vla-startundomark doc)
(or (tblsearch "block" block)
(not (setq file (findfile (strcat "R:\\AutoCAD\\Blocks\\" block ".dwg"))))
(vla-delete (vla-insertblock (if (eq (getvar "cvport") 1)
(vla-get-paperspace doc)
(vla-get-modelspace doc)
)
(vlax-3d-point '(0.0 0.0 0.0))
file
1
1
1
0
)
)
)
; Added layouts
(setq laystr (car tablist))
(foreach lay (cdr tablist)
(setq laystr (strcat laystr (chr 44) lay))
)
;(princ laystr)
(and (tblsearch "block" block)
(ssget "_x" (list (cons 0 "insert") (cons 2 "IFA,IAC,IFC") (cons 410 laystr) (cons 67 1))) ; dxf 67=1 only paperspace
(progn
(vlax-for bl (setq sel (vla-get-activeselectionset doc))
(vla-put-name bl block)
(and (setq att (vlax-invoke bl 'getattributes))
(vla-put-textstring (car att) rev_date)
)
)
(vla-delete sel)
)
)
; This is deffinately Bad Practice (using autolisp in a vlisp routine), but I don't know how to change an attribute any other way...
; (If (setq ss (ssget "_x" (list (cons 0 "insert") (cons 2 "IFA,IAC,IFC") (cons 410 laystr) (cons 67 1))))
;(Progn
;(foreach en (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))
; (If (= (cdr (assoc 0 (setq subenlst (entget (entnext en))))) "ATTRIB")
; (entmod (subst (cons 1 rev_date) (assoc 1 subenlst) subenlst))
; (Princ "Couldn't change the date in the new Issue Blocks\n"))
; ))(Princ "No Blocks found\n"))
; End of Bad Practice
(vla-endundomark doc)
(princ)
)未测试
@+ 作为旁白Steve,我想进一步解释一下Patrick提供的方法,如果您在一个块中处理多个属性,这将对您有所帮助。
有两种方法可以获取块中的属性列表,如下所示。每个将返回不同的数据类型,列表或变体。
假设块对象设置为变量Obj。
现在,有两种方法来检索属性,这两种方法还取决于您是否也要获取常量属性。
使用Patricks方法:
(vlax-invoke Obj 'GetAttributes)
将返回块中的属性列表,不包括常量属性。
将返回类似的内容:
(#<VLA-OBJECT IAcadAttributeReference 0e13b9ec>
#<VLA-OBJECT IAcadAttributeReference 0e13b76c>)
一种替代方法,您可能更习惯于看到的一种方法是:
这将再次为您提供一个AttributeReference对象列表,以便您可以随心所欲地进行操作。
要包含常量属性,您需要调用另一个方法,并附加结果,例如:
这将返回块中所有属性的列表,例如:
使用如上所述的另一种方法,可以这样做:
(apply 'append
(mapcar
(function
(lambda (x)
(vlax-safearray->list
(vlax-variant-value x))))
(list (vla-getAttributes Obj)
(vla-getConstantAttributes Obj))))
或类似内容,取决于您是否要使用mapcar。
更进一步,如果我们想从一个块中获取所有属性,但我们不知道它是否具有常量属性,该怎么办。
使用此方法:
(append
(vlax-invoke Obj 'GetAttributes)
(vlax-invoke Obj 'GetConstantAttributes)
)
不会引起问题,因为第二个列表只是一个空列表['()或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的一维安全数组。
我希望这能帮助你更好地理解这个过程。
如果你对我发布的任何东西有任何进一步的问题,尽管问。
干杯
李 Patrick谢谢,它可以工作-2个函数,多么简单!
李,这是一个巨大的帮助,我会有更多的问题,但我必须先仔细考虑这里的一切。然而,一个明显的问题是,当vlax invoke(1个函数)如此简单时,为什么会有人使用vlax safearray方法(3个函数)?我认为这是因为较长的方法是学习vlisp的常见途径。不过,我还是可以跳过调用:wink:
谢谢
页:
[1]
2