Owen W 发表于 2022-7-6 01:20:00

在块中移动属性值

我们有一个图形边框,它使用四行属性来跟踪修订。我想编写一个例程,将每行中的值上移一行,因此最新版本始终位于最低行。我可以很容易地将属性标记及其值提取到相关(点对)列表中。
 
由于每行都有前缀为“1”、“2”等的属性,我认为简单地遍历列表来更改这些数字会很容易。事实证明,我有一部分是对的。列表很容易获得,但使用虚线对则不容易。我的列表如下所示:(“1\u REV“.1”)(“1\u DATE“.04-11-13”)(“1\u DESCRIPTION”。“在旁通回路中添加了一个蝶阀”)(“1\u BY“.ABC”)。我想将列表中的所有“1”实例更改为“2”。
 
我可能太难了,我知道我可以简单地将这些值存储到变量中,然后创建一个新列表,然后将新值推送到块属性中,但这似乎有点不雅观。

irneb 发表于 2022-7-6 01:25:09

假设您拥有上述列表:
_$ (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"))

BIGAL 发表于 2022-7-6 01:28:42

另一种方法是,因为有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)

pBe 发表于 2022-7-6 01:32:17

 
这个“最新”版本是新条目吗?
 
这将使“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公司

Bhull1985 发表于 2022-7-6 01:35:20

 
 
嘿,PBe,你能帮我把这个用于我的目的吗?
我有一个非常类似的情况,需要5个标签一起上移或下移,构成一个修订块。我会附上图片,简要地解释我在尝试什么。

不确定你是否能看到,但有3行填充。两个位置正确,一个跳过了一行,因此需要移动到下面的一行。当我说“移动”时,实际上是指一个程序需要存储不合适的标签的值,然后将这些值重新写入同一块中正确的对应标签,然后从错误的位置删除旧标签。我希望这足够容易理解,但我还没有找到满足这些条件的代码,但如果有人能帮助我获得这些,我将不胜感激,这将对我们非常有用

pBe 发表于 2022-7-6 01:36:56

 
我明天看一看bhull1985,看起来很简单,可以编写代码。

Bhull1985 发表于 2022-7-6 01:42:15

是的,应该是,但我缺乏属性函数,但我想我会从这个程序中学到更多,即使有人为我构建它。还有很多需要剖析的地方,我当然很感激。
谢谢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
 
谢谢

pBe 发表于 2022-7-6 01:42:21

好的,我在另一个论坛上读了你的帖子。如果我是wrngo,请纠正我。。Worng。。。错误的
 
当您指定整数“4”时
 
位置7处的值将消失,然后从6到7,5到6,4到5,然后将4留空?
 
让我不解的是,当所有的转速箱还没有填满位置1时,为什么你需要颠簸?为什么从一个已经填补的职位开始?
 
或者这是一项“修理”工作?

Bhull1985 发表于 2022-7-6 01:46:29

是的,基本上。
所有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干杯),如果我们能找到解决这个问题的方法,那么我们的效率就会更高。
我感谢你的时间和关注,如果你能写出这样的文章,我将非常感谢你。我将尝试这样做,但对属性函数知之甚少,因此这将是一个难题。尽管在学习。。。。。。

Bhull1985 发表于 2022-7-6 01:48:35

这是另一个需要在其上运行程序的修订块的图像,背景颜色已更改。希望这有助于更清楚地理解。
 
 
 

 
(当然,要移动的行上的所有ATT都会被移动,而不仅仅是第一个属性)
标记名将保持不变,并这样做-Rev#,R#Desc,R#BY,R#CHK,R#Date。
因此,在示例Rev2中,r2Desc、r2by、r2chk、r2date需要移动到rev5、r5desc、r5by、r5chk、r5date。
谢谢
页: [1] 2
查看完整版本: 在块中移动属性值