Russello 发表于 2022-7-5 15:54:21

替换块属性值

大家好,传奇人物。我再次需要你的帮助。我不知道如何替换/设置块属性值,当我通过lisp插入它时,如果它有超过1行(垂直)。
 
如果只有一行(水平),我知道怎么做。例如,我有4个标签,代码如下:
 
(command "-Insert" "Sampleblock" "_non" Data_block aa ""
                  LineValue1
                  LineValue2
                  BearingValue
                  DistanceValue
                   )
(假设设置并实现了所有值)
但是当我处理超过1行(垂直)的属性时,我不知道如何处理。样本图像https://ibb.co/fE9nrR
 
有没有一种方法可以在lisp中编写,用这个设置点1的值,用这个设置点2的值,然后继续。
 
P、 我已经知道(也许呵呵)如何获得我想要的值,我只是不知道当插入的块垂直方向超过一行时如何将它们设置为值。
 
再次感谢你的帮助。荣誉

Russello 发表于 2022-7-5 16:01:34

忘记附加图像。这里是

Grrr 发表于 2022-7-5 16:09:14

您应该上传该块的dwg进行测试。
 
以下代码适用于我的动态测试块:
 
(defun C:test ( / fuzz e enx s srt1 srt2 ans p px L i )
(and
   (setq fuzz 1e-1) ; adjust
   (setq e (car (nentsel "\nPick attribute: ")))
   (setq enx (entget e))
   (member '(0 . "ATTRIB") enx)
   (setq s (getstring t "\nText prefix: "))
   (mapcar 'set '(srt1 srt2)
   (if (setq ans (progn (initget "Row Column") (= "Column" (cond ((getkword "\nSpecify <Column>: "))("Column")))))
       (list car cadar)
       (list cadr caar)
   )
   )
   (setq p (cdr (assoc 10 enx)))
   (progn
   (foreach x (vlax-invoke (vlax-ename->vla-object (cdr (assoc 330 enx))) 'GetAttributes)
       (and (equal (srt1 p) (srt1 (setq px (vlax-get x 'InsertionPoint))) fuzz)
         (setq L (cons (list px x) L))
       )
   )
   (if L (setq L (vl-sort L '(lambda (a b) ((if ans > <) (srt2 a) (srt2 b))))))
   ); progn
   (setq i 0)
   (foreach x (mapcar 'cadr L)
   (vlax-put x 'TextString (strcat s (itoa (setq i (1+ i)))))
   )
); and
(princ)
); defun C:test

marko_ribar 发表于 2022-7-5 16:19:44

大家好。谢谢Grr大师、marko_ribar和BIGAL。你提供了很好的解决方案,但这不是我真正想要的,这不是你的错,这是我的错。我写问题的方式似乎很一般。无论如何,我找到了一个解决方案(也许),我会尝试一下。请与大师保持联系,因为我知道我将面临很多问题。呵呵。
 
我在acadauto见过这些功能。chm(autodesk共享文件),我想这就是我要找的。
(defun C:test ( / fuzz e enx s srt1 srt2 ans p blk att px L i )
(and
   (setq fuzz 1e-1) ; adjust
   (setq e (car (nentsel "\nPick attribute : ")))
   (setq enx (entget e))
   (member '(0 . "ATTRIB") enx)
   (setq s (getstring t "\nText prefix : "))
   (mapcar 'set '(srt1 srt2)
   (if (setq ans (progn (initget "Row Column") (= "Column" (cond ((getkword "\nSpecify <Column>: "))("Column")))))
       (list car cadar)
       (list cadr caar)
   )
   )
   (setq p (cdr (assoc 10 enx)))
   (progn
   (setq blk (cdr (assoc 330 enx)))
   (setq att (entnext blk))
   (while att
       (and
         (= (cdr (assoc 0 (entget att))) "ATTRIB")
         (equal (srt1 p) (srt1 (setq px (cdr (assoc 10 (entget att))))) fuzz)
         (setq L (cons (list px att) L))
       )
       (setq att (entnext att))
   )
   (if L (setq L (vl-sort L '(lambda ( a b ) ((if ans > <) (srt2 a) (srt2 b))))))
   ); progn
   (setq i 0)
   (foreach x (mapcar 'cadr L)
   (entupd (cdr (assoc -1 (entmod (subst (cons 1 (strcat s (itoa (setq i (1+ i))))) (assoc 1 (entget x)) (entget x))))))
   )
); and
(princ)
); defun C:test

 
希望我在正确的道路上,但有你的指导,没有什么可担心的。呵呵呵呵
 
当做
罗素

BIGAL 发表于 2022-7-5 16:23:14

没问题,马尔科,
感谢关于(vl load com)的提醒,我之前与Roy讨论了加载它的问题,结果是(或vlax get acad object(vl load com))。
顺便说一句,如果你想要纯香草,那么vl排序函数应该用一个自定义函数代替。
 
Rusello,
BIGAL在某处发布了一个简单的示例,说明如何为第n个属性赋值。
可能是在这里,或者是在以前的帖子里。
但这种方法依赖于属性的创建顺序。

Russello 发表于 2022-7-5 16:32:56

@Grrr,并非所有前缀为“vl”的函数都与(vl load com)相关。。。我有一个这些函数的列表,其中还有(vl排序)。。。所以我的版本是Vanilla-你可以这样称呼它,因为它根本不需要调用(vl load com)。。。
 
以下是供参考的功能列表:
 
VL-ACAD-DEFUN
VL-ACAD-UNDEFUN
VL-ARX-IMPORT
VL-BB-REF
VL-BB-SET
VL-BT
VL-BT-OFF
VL-BT-ON
VL-CATCH-ALL-APPLY
VL-CATCH-ALL-ERROR-MESSAGE
VL-CATCH-ALL-ERROR-P
VL-CMDF
VL-CONSP
VL目录文件
VL-DOC-导出
VL-DOC-IMPORT
VL-DOC-REF
VL-DOC-SET
VL-每
VL-EXIT带错误
带值VL-EXIT
VL文件副本
VL-FILE-DELETE
VL-FILE-DIRECTORY-P
VL-FILE-RENAME
VL文件大小
VL-FILE-SYSTIME
VL-FILENAME-BASE
VL-FILENAME-DIRECTORY
VL-FILENAME-EXTENSION
VL-FILENAME-MKTEMP
VL-GET-RESOURCE
VL-INFP
VL-INIT
VL-LIST->字符串
VL-LIST-EXPORTED-FUNCTIONS
VL-LIST-LENGTH
VL-LIST-LOADED-VLX
VL列表*
VL-LOAD-ALL
VL-LOAD-COM
VL负载电抗器
VL-MEMBER-IF
VL-MEMBER-IF-NOT
VL-MKDIR
VL-NANP
VL位置
VL-PRIN1到字符串
VL-PRINC到字符串
VL-传播
VL-REGISTRY-DELETE
VL-注册表-后代
VL-REGISTRY-READ
VL-REGISTRY-WRITE
VL-删除
VL-REMOVE-IF
VL-REMOVE-IF-NOT
VL-SOME
VL-SORT
VL-SORT-I
VL-STRING->列表
VL-STRING-ELT
VL-STRING-左微调
VL串不匹配
VL-串位置
VL-STRING-右微调
VL-STRING-SEARCH
VL-STRING-SUBST
VL-STRING-TRANSLATE
VL-STRING-TRIM阀内件
VL-SYMBOL-NAME
VL符号值
VL-SYMBOLP
VL-UNLOAD-VLX
VL-VBALOAD
VL-VBARUN
VL-VLX-LOADED-P
VLARTS-INIT
VLAX-ADD-CMD
VLAX-FOR
VLAX-REMOVE-CMD
VLISP-DCLRES-LIST
VLISP-DCLRES-LOAD-DIALOG
VLISP-EXPORT-SYMBOL
VLISP-FASRES-LIST
VLISP-FASRES-LOAD
VLISP-IMPORT-EXSUBRS
VLISP-IMPORT-SYMBOL
VLISP-INIRES-LIST
 
您好,M.R。

Grrr 发表于 2022-7-5 16:38:54

谢谢Marko,
我没有意识到这一点(也许有人在这之前向我提及过——但我的记忆力不好)。

marko_ribar 发表于 2022-7-5 16:46:27

Grr您是正确的(setq atts(vla GetAttributes)然后是a(put(nth x atts))虽然它将处理行和列,但您需要知道每个存在的行和列中有多少是由块创建的x x x x y y y z z或x y z x y z等等。计算出正确的属性很容易,代码必须硬编码,例如多少列。

Grrr 发表于 2022-7-5 16:54:26

BIGAL 发表于 2022-7-5 16:58:41

Grr you are correct (setq atts (vla-GetAttributes then a (put (nth x atts) whilst it will work with rows and columns you do need to know how many of each exist was the block created x x x x y y y y z z z or x y z x y z and so on. Working out correct attribute is easy, the code would have to be hard coded for say how many columns.
页: [1]
查看完整版本: 替换块属性值