查找co的AutoLisp例程
我是AutoLisp新手,非常感谢您的帮助。我有数百张带有两个不同标题栏的图纸:
A) 图纸_Sheet_22X34
B) 图纸_Sheet_22X34-H
属性(标记、提示、值)的设置相同。唯一的区别是,一个是垂直排列,另一个是水平排列。
我需要遍历所有图形(没有命令提示),找到标题栏,并用以下内容替换某些属性值(用于修订属性):
A) 日期*“2015年6月29日”
日期*是标题栏修订区域中的日期属性之一。*代表一个数字,因此可以是DATE1、DATE2、DATE3、DATE4等。关键是找到合适的替代品。
B) 描述*“基线更新-101/111翻新”
与DATE*相同,DESC*为DESC1、DESC2等。
REV1,DATE1和DESC1代表一个版本的一部分(REV2,DATE2和DESC2,第二个版本,等等),我需要找到DATE*和DESC*,并用上面的值替换这两个值。
标题栏的下角还有一个lone REV属性。为了找到要修改的正确日期*和描述*对,必须找到REV*属性值并与REV属性值匹配。这是例程能够找到要修改的正确修订属性的唯一方法,但标题栏的整体修订属性值应与其中一个修订*属性值匹配。
例如,REV2的值为26(版本26)。下角的REV属性也有值26,因此REV2是修订版,其中DATE2和DESC2的值需要替换为上述值。
这有意义吗?任何代码都将不胜感激。
标题栏已附加。 我忘了提。我附上的图纸是“空的”。版本信息没有任何值。因此,为了测试代码,必须添加一些值。水平边框可以容纳4个修订,我相信垂直边框可以容纳6个修订。 欢迎来到CADTutor。
看看这个惊人的Lisp程序,其中至少有无数,非常慷慨地提供了李Mac,在他的网站上。。。
http://www.lee-mac.com/bfind.html
谢谢李! 爸爸,谢谢你。很高兴来到这里。
这是一个很好的Lisp程序。然而,它假设我知道查找和替换将发生在哪里,并且在每个实例中都是相同的。
在我的例子中,lisp例程必须首先确定要修改的版本,因为每个图形的版本都不同。所以我需要一个额外的部分来确定要查找替换的属性。
换句话说,它需要确定最新的修订版本。所以首先它必须读取REV的值,然后找到具有相同值的REV。假设REV的值为23,REV2的值也为23。因此,DATE2和DESC2是需要更新的属性。或者,如果REV的值为89,REV6的值为89,则需要更新属性DATE6和DESC6。每个图形都不一样,这就是为什么我需要一些东西来匹配REV和REV*(同样,REV*是属性REV1、REV2或REV3,等等,无论哪个与REV的值相同)。 听起来你需要写点什么。
我希望你已经为李的网站添加了书签,因为那里有很多非常有用的Lisp,其中一些涉及属性同步,但可能不是你在这种情况下需要的。 好的,答案在这里,但我没有它的书签和更换一个块属性是相当容易的,我知道我已经发表了意见,通过修订块搜索,寻找一个空白条目,并添加到下一个条目。使用“修订”在此处搜索。有一种按位置查看块属性的方法,假设您有一个3x4属性块,您可以查看值1、5和9等。我知道我在某处有代码。
但其他人也加入了进来。 比格尔,谢谢你。我搜索了这个论坛,但我似乎找不到任何像你所描述的内容。
简单,这里有一个问题,什么会优先?转速*或转速值?如果REV值是23,REV2是24,REV1是23,那么会怎样?将REV值更改为24,并更新DATE2和DESC2?或者删除REV2并更新DATE1和DESC1? 有人可以随意清理主功能,我不确定你是否有多个布局,但我已经编写了所有的子功能,所以。。。
(defun c:test11 ( / )
(if
(setq blockSS (ssget "X" (list (cons 0 "INSERT") (cons 2 "Drawing_Sheet_22x34"))))
(progn
(setq blockList (mapcar 'cadr (ssnamex blockSS)))
(setq attName (vla-get-tagstring (car (cb:matchAtts "REV" "REV" (vlax-ename->vla-object(car blockList))))))
(setq attNumber (substr attName (strlen attName) 1))
(cb:replaceAttributeValue (strcat "DATE" attNumber) "29-JUN-15" (vlax-ename->vla-object(car blockList)))
(cb:replaceAttributeValue (strcat "DESC" attNumber) "BASELINE UPDATE - 101/111 RENOVATIONS" (vlax-ename->vla-object(car blockList))))
)
)
(defun cb:matchAtts (baseAttName attPrefix Blk / )
(setq baseAtt (car (vl-remove-if-not '(lambda (x) (= baseAttName (vla-get-tagstring x))) (cb:variantToList (vla-getattributes Blk)))))
(vl-remove-if-not '(lambda (x)
(and
(wcmatch (vla-get-tagstring x) (strcat attPrefix "*"))
(not (eq (vla-get-tagstring x) baseAttName))
(eq (vla-get-textstring x) (vla-get-textstring baseAtt))
))
(cb:variantToList (vla-getattributes Blk)))
)
(defun cb:variantToList (theVariant / )
(if (= 'variant (type theVariant))
(vlax-safearray->list (vlax-variant-value theVariant))
nil
)
)
;;;;;Replace Attribute Value;;;;;;;;;
;;;;;By: CommandoBill;;;;;;;;;;;;;;;;;
;;;;;01/24/15;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;Send a block to this function with an attribute you want to replace with a new value
;;;;attName = the name of the attribute which value you want to replace
;;;;attNewVal = the new value you want in the attribute
;;;;Blk = the vla-object verision of the block which the attribute is in
(defun cb:replaceAttributeValue (attName attNewVal Blk / )
(mapcar '(lambda (x) (if (= attName (vla-get-tagstring x))
(vla-put-textstring x attNewVal))) (cb:variantToList (vla-getattributes Blk)))
(princ)
) REV优先,因为它总是有REV*的值,即我试图修改的日期*和DESC*。不会删除任何内容。可能存在具有空值的属性。例如:REV是23,REV2是23(因此我将只在所有属性中更新DATE2和DESC2),但REV4是空的(它还没有被使用,修订还没有达到那么高)。难点在于定位。我正在寻找的版本*将始终是图纸的最新版本,因此它将始终与版本匹配。但是它可以是任何一个REV*属性,这取决于标题栏中有多少修订。
页:
[1]
2