乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 46|回复: 9

[编程交流] 替换块属性值

[复制链接]

7

主题

25

帖子

18

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 15:54:21 | 显示全部楼层 |阅读模式
大家好,传奇人物。我再次需要你的帮助。我不知道如何替换/设置块属性值,当我通过lisp插入它时,如果它有超过1行(垂直)。
 
如果只有一行(水平),我知道怎么做。例如,我有4个标签,代码如下:
 
  1. (command "-Insert" "Sampleblock" "_non" Data_block aa ""
  2.                   LineValue1
  3.                   LineValue2
  4.                   BearingValue
  5.                   DistanceValue
  6.                    )

(假设设置并实现了所有值)
但是当我处理超过1行(垂直)的属性时,我不知道如何处理。样本图像https://ibb.co/fE9nrR[/img]
 
有没有一种方法可以在lisp中编写,用这个设置点1的值,用这个设置点2的值,然后继续。
 
P、 我已经知道(也许呵呵)如何获得我想要的值,我只是不知道当插入的块垂直方向超过一行时如何将它们设置为值。
 
再次感谢你的帮助。荣誉
回复

使用道具 举报

7

主题

25

帖子

18

银币

初来乍到

Rank: 1

铜币
35
发表于 2022-7-5 16:01:34 | 显示全部楼层
忘记附加图像。这里是 165428hsips8i4uzxv5xoi.jpg
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:09:14 | 显示全部楼层
您应该上传该块的dwg进行测试。
 
以下代码适用于我的动态测试块:
 
  1. (defun C:test ( / fuzz e enx s srt1 srt2 ans p px L i )
  2. (and
  3.    (setq fuzz 1e-1) ; adjust
  4.    (setq e (car (nentsel "\nPick attribute: ")))
  5.    (setq enx (entget e))
  6.    (member '(0 . "ATTRIB") enx)
  7.    (setq s (getstring t "\nText prefix: "))
  8.    (mapcar 'set '(srt1 srt2)
  9.      (if (setq ans (progn (initget "Row Column") (= "Column" (cond ((getkword "\nSpecify [Row/Column] <Column>: "))("Column")))))
  10.        (list car cadar)
  11.        (list cadr caar)
  12.      )
  13.    )
  14.    (setq p (cdr (assoc 10 enx)))
  15.    (progn
  16.      (foreach x (vlax-invoke (vlax-ename->vla-object (cdr (assoc 330 enx))) 'GetAttributes)
  17.        (and (equal (srt1 p) (srt1 (setq px (vlax-get x 'InsertionPoint))) fuzz)
  18.          (setq L (cons (list px x) L))
  19.        )
  20.      )
  21.      (if L (setq L (vl-sort L '(lambda (a b) ((if ans > <) (srt2 a) (srt2 b))))))
  22.    ); progn
  23.    (setq i 0)
  24.    (foreach x (mapcar 'cadr L)
  25.      (vlax-put x 'TextString (strcat s (itoa (setq i (1+ i)))))
  26.    )
  27. ); and
  28. (princ)
  29. ); defun C:test

回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 16:19:44 | 显示全部楼层
大家好。谢谢Grr大师、marko_ribar和BIGAL。你提供了很好的解决方案,但这不是我真正想要的,这不是你的错,这是我的错。我写问题的方式似乎很一般。无论如何,我找到了一个解决方案(也许),我会尝试一下。请与大师保持联系,因为我知道我将面临很多问题。呵呵。
 
我在acadauto见过这些功能。chm(autodesk共享文件),我想这就是我要找的。
  1. (defun C:test ( / fuzz e enx s srt1 srt2 ans p blk att px L i )
  2. (and
  3.    (setq fuzz 1e-1) ; adjust
  4.    (setq e (car (nentsel "\nPick attribute : ")))
  5.    (setq enx (entget e))
  6.    (member '(0 . "ATTRIB") enx)
  7.    (setq s (getstring t "\nText prefix : "))
  8.    (mapcar 'set '(srt1 srt2)
  9.      (if (setq ans (progn (initget "Row Column") (= "Column" (cond ((getkword "\nSpecify [Row/Column] <Column>: "))("Column")))))
  10.        (list car cadar)
  11.        (list cadr caar)
  12.      )
  13.    )
  14.    (setq p (cdr (assoc 10 enx)))
  15.    (progn
  16.      (setq blk (cdr (assoc 330 enx)))
  17.      (setq att (entnext blk))
  18.      (while att
  19.        (and
  20.          (= (cdr (assoc 0 (entget att))) "ATTRIB")
  21.          (equal (srt1 p) (srt1 (setq px (cdr (assoc 10 (entget att))))) fuzz)
  22.          (setq L (cons (list px att) L))
  23.        )
  24.        (setq att (entnext att))
  25.      )
  26.      (if L (setq L (vl-sort L '(lambda ( a b ) ((if ans > <) (srt2 a) (srt2 b))))))
  27.    ); progn
  28.    (setq i 0)
  29.    (foreach x (mapcar 'cadr L)
  30.      (entupd (cdr (assoc -1 (entmod (subst (cons 1 (strcat s (itoa (setq i (1+ i))))) (assoc 1 (entget x)) (entget x))))))
  31.    )
  32. ); and
  33. (princ)
  34. ); defun C:test

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

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

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

使用道具 举报

7

主题

25

帖子

18

银币

初来乍到

Rank: 1

铜币
35
发表于 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。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:38:54 | 显示全部楼层
谢谢Marko,
我没有意识到这一点(也许有人在这之前向我提及过——但我的记忆力不好)。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 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等等。计算出正确的属性很容易,代码必须硬编码,例如多少列。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 16:54:26 | 显示全部楼层
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 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.
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-13 20:30 , Processed in 1.704606 second(s), 87 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表