在块中移动属性值
我们有一个图形边框,它使用四行属性来跟踪修订。我想编写一个例程,将每行中的值上移一行,因此最新版本始终位于最低行。我可以很容易地将属性标记及其值提取到相关(点对)列表中。由于每行都有前缀为“1”、“2”等的属性,我认为简单地遍历列表来更改这些数字会很容易。事实证明,我有一部分是对的。列表很容易获得,但使用虚线对则不容易。我的列表如下所示:(“1\u REV“.1”)(“1\u DATE“.04-11-13”)(“1\u DESCRIPTION”。“在旁通回路中添加了一个蝶阀”)(“1\u BY“.ABC”)。我想将列表中的所有“1”实例更改为“2”。
我可能太难了,我知道我可以简单地将这些值存储到变量中,然后创建一个新列表,然后将新值推送到块属性中,但这似乎有点不雅观。 假设您拥有上述列表:
_$ (setq data '(("1_REV" . "1") ("1_DATE" . "04-11-13") ("1_DESCRIPTION" . "ADDED A BUTTERFLY VALVE TO THE BYPASS LOOP") ("1_BY" . "ABC")))
(("1_REV" . "1") ("1_DATE" . "04-11-13") ("1_DESCRIPTION" . "ADDED A BUTTERFLY VALVE TO THE BYPASS LOOP") ("1_BY" . "ABC"))
_$ (mapcar '(lambda (pair)
(if (wcmatch (car pair) "1_*")
(cons (strcat "2_" (substr (car pair) 3)) (cdr pair))
pair))
data)
(("2_REV" . "1") ("2_DATE" . "04-11-13") ("2_DESCRIPTION" . "ADDED A BUTTERFLY VALVE TO THE BYPASS LOOP") ("2_BY" . "ABC"))
另一种方法是,因为有4行,所以实际上可以按创建顺序读取属性值,因此很容易将值上移1。但它确实希望您已经创建了一条又一条线。
我确信我有一个比这个更好的版本,它只移动1,但可以更改为自动。你需要先添加一张支票,然后找到空白条目,这样就可以计算出最多多少。
(vl-load-com)
(setq y 1)
(setq ss1 (car (entsel)))
(setq bname (vla-get-name(vlax-ename->vla-object SS1)))
(setq x (getint "\nEnter line no to pick")) ; change this line in block
(SETQ newstrblank ".")
(foreach att (vlax-invoke (vlax-ename->vla-object SS1) 'getattributes)
(if (= y x)
(progn
(setq newstr (vla-get-textstring att ))
(vla-put-textstring att newstrblank)
)
)
(setq y (+ Y 1))
)
(setq y 1)
(setq x (getint "\nEnter line no to move to"))
(foreach att (vlax-invoke (vlax-ename->vla-object SS1) 'getattributes)
(if (= y x)
(vla-put-textstring att newstr)
)
(setq y (+ Y 1))
)
(princ)
这个“最新”版本是新条目吗?
这将使“1_u”级别的值为空,并“bump”其他所有值。
(defun c:bump ( / _relist attv ss)
;;; pBe 15Apr2013 ;;;
(defun _relist(l n / x ln ls)
(if (zerop (rem (length l) n))
(repeat (/ (setq ln (length l)) n)
((lambda (j)
(repeat j
(setq x (cons (nth (setq ln (1- ln))l)
x) )))
n)
(setq ls (cons x ls)
xnil)
))
ls)
(if (and
(setq ss (ssget "_+.:S:E:L" '((0 . "INSERT") (66 . 1))))
(setq Attv
(vl-remove-if-not
'(lambda (j)
(vl-some '(lambda (x)
(if (wcmatch (vla-get-tagstring j) (strcat "#" x))
x
)
)
'("_REV" "_DATE" "_DESCRIPTION" "_BY")
)
)
(vlax-invoke (vlax-ename->vla-object (ssname ss 0)) 'GetAttributes)
)
)
)
(progn
(setq attv (reverse (_relist attv 4)))
(mapcar '(lambda (m n)
(mapcar '(lambda ( o p)
(vla-put-textstring o (vla-get-textstring p) )) m n))
attv (cdr attv))
(mapcar '(lambda (x) (vla-put-textstring x "")) (last attv))
)
)(princ)
)
HTH公司
嘿,PBe,你能帮我把这个用于我的目的吗?
我有一个非常类似的情况,需要5个标签一起上移或下移,构成一个修订块。我会附上图片,简要地解释我在尝试什么。
不确定你是否能看到,但有3行填充。两个位置正确,一个跳过了一行,因此需要移动到下面的一行。当我说“移动”时,实际上是指一个程序需要存储不合适的标签的值,然后将这些值重新写入同一块中正确的对应标签,然后从错误的位置删除旧标签。我希望这足够容易理解,但我还没有找到满足这些条件的代码,但如果有人能帮助我获得这些,我将不胜感激,这将对我们非常有用
我明天看一看bhull1985,看起来很简单,可以编写代码。 是的,应该是,但我缺乏属性函数,但我想我会从这个程序中学到更多,即使有人为我构建它。还有很多需要剖析的地方,我当然很感激。
谢谢pBe,这里有一个链接指向我在autodesk论坛上的帖子,该帖子更清楚地概述了目标:
http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/Copy-attribute-from-one-tag-to-another-tag-within-same-block/td-p/4550807
谢谢 好的,我在另一个论坛上读了你的帖子。如果我是wrngo,请纠正我。。Worng。。。错误的
当您指定整数“4”时
位置7处的值将消失,然后从6到7,5到6,4到5,然后将4留空?
让我不解的是,当所有的转速箱还没有填满位置1时,为什么你需要颠簸?为什么从一个已经填补的职位开始?
或者这是一项“修理”工作? 是的,基本上。
所有5个属性标记-REV#,R#DESC,R#BY,R#CHK,R#DATE将保持在一起。
但发生的情况与此类似:
(希望你能看到,我会附上它以防万一它太小)
但无论如何,当我们在一组50-100或更多的图形上运行Lee Mac的全局属性编辑器时,有时一些DWG的最新版本位于不同的行上,在全局属性编辑器运行后,标题栏看起来就像jpg中的一样。
所以,我想做的是告诉它哪条线需要移动。从rev块的顶部开始计算,而不是从标题行(位于块的最顶部)开始计算,需要向下“碰撞”几行的行是#2。
所以prog会问(getint“要移动哪行?”)我会告诉它“2”。它应该从那里询问(getint“\n将其移动到哪行?”)。如果我想“纠正”这个特定的修订块,那么我需要告诉它移到第#5行,因为从顶部开始计算,第5行是需要移动修订信息的位置。
希望这会有所帮助,我必须强调,将值从一个标记移动到新标记,而不仅仅是对属性文本进行奇特的夹点编辑,是多么重要。我们需要能够按顺序输入修订,但每次运行Lee Mac的“全局属性编辑器”(global attribute editor)时,它可以为我们节省数小时(为Lee干杯),如果我们能找到解决这个问题的方法,那么我们的效率就会更高。
我感谢你的时间和关注,如果你能写出这样的文章,我将非常感谢你。我将尝试这样做,但对属性函数知之甚少,因此这将是一个难题。尽管在学习。。。。。。 这是另一个需要在其上运行程序的修订块的图像,背景颜色已更改。希望这有助于更清楚地理解。
(当然,要移动的行上的所有ATT都会被移动,而不仅仅是第一个属性)
标记名将保持不变,并这样做-Rev#,R#Desc,R#BY,R#CHK,R#Date。
因此,在示例Rev2中,r2Desc、r2by、r2chk、r2date需要移动到rev5、r5desc、r5by、r5chk、r5date。
谢谢
页:
[1]
2