BigThumper 发表于 2022-7-5 18:54:32

实体名称参数

现在我(刚刚开始)掌握了语法的诀窍,我几乎已经让lisp做了我想做的事情。但是
 
经过几次修改,我几乎达到了我想要的效果。“get”部分正是我想要的。我现在面临的挑战是“设置”部分。我的图形中有用“电路”和“地址”属性定义的块。目标是为函数提供一个电路和地址,并使其从该数字开始,并自动对所有地址等于或大于起始点的块重新编号。
 
我正在使用Lee Mac的get/setattributevalue函数。我坦率地承认,我还没有完全理解它们的处理过程——因为我还不理解AutoCAD图元——但我正在达到这一点。
 
我的挑战是,调用setattributevalue会给我带来一个错误,特别是“坏函数:”或任何句柄。我不理解,因为据我所知,实体名称与getattributevalue函数的名称相同,除非我的列表处理以某种方式使句柄无效。
 
有人告诉我我在哪里胡闹吗?
 
(defun c:重新编号地址()
(setq电路(getstring“\n输入电路:”)
(setq地址(getint“\n输入地址:”)
 
(setq ln(DM:gatheraddresses电路地址))
(foreach e ln(progn
(setq blk(cadr e))
(setq新值(itoa地址))
(LM:setattributevalue(blk“ADDRESS”newvalue))
(setq地址(+地址1))
))
(普林斯)
)
 
(defun DM:gatheraddresses(电路地址/ssfilter ss numblocks i ln entityname entity\u circuit entity\u地址e e1 e2)
(setq ssfilter’((0。“插入”)(66.1));定义过滤器以选择所有插入的块
(setq ss(ssget“_X”ssfilter));使用过滤器查询图形
(setq numblocks(sslength ss));获取块数
 
(if(>numblocks 0)(progn;假设我们发现一些块开始。。。
(setq i 0);将i初始化为0
(setq ln(列表));将ln初始化为空列表
 
; 遍历搜索匹配项时找到的所有块
(重复numblocks(progn;在所有块中循环)
(setq entityname(ssname ss i));从选择集中弹出下一个要检查的实体
 
;这个街区在右环路吗?
(setq entity_电路(LM:getattributevalue entityname“电路”)
 
(if(=实体电路)(progn)
 
;此块的地址是否等于或大于目标?
(setq entity_地址(LM:getattributevalue entityname“地址”)
 
(如果(>=(atoi实体地址)地址)(progn
(setq ln(cons(list entity\u address entityname)ln))
))
))
 
(setq i(+i 1))
))
 
; 按地址按数字升序对列表排序
(setq ln(vl sort ln’(λ(e1 e2))(
))
)
 
;; 获取属性值-Lee Mac
;; 返回所提供块中指定标记所保留的值(如果存在)。
;; blk-块(插入)实体名称
;; 标记-属性标记字符串
;; 返回:属性值,如果未找到标记,则返回nil。
 
(定义LM:getattributevalue(blk tag/val enx)
(虽然
(和
(空值)
(=“ATTRIB”(cdr(assoc 0(setq enx(entget(setq blk(entnext blk))))))))
)
(if(=(strcase标记)(strcase(cdr(assoc 2 enx))))
(setq val(cdr(assoc 1 enx)))
)
)
)
 
;; 设置属性值-Lee Mac
;; 使用在块中找到的给定标记(如果存在)设置第一个属性的值。
;; blk-块(插入)实体名称
;; 标记-属性标记字符串
;; val-属性值
;; 如果成功,则返回属性值,否则返回nil。
 
(定义LM:setattributevalue(blk tag val/end enx)
(虽然
(和
(空结束)
(=“ATTRIB”(cdr(assoc 0(setq enx(entget(setq blk(entnext blk))))))))
)
(if(=(strcase标记)(strcase(cdr(assoc 2 enx))))
(if(entmod(subst(cons 1 val)(assoc 1 enx)enx))
(程序
(entupd blk)
(setq end val)
)
)
)
)
)

BigThumper 发表于 2022-7-5 19:51:06

睡了一夜之后。。。
 
(LM:setattributevalue(blk“ADDRESS”newvalue))不工作。任何使用Lisp的人都会认识到这一点。因为我仍然停留在C类型语法上。。。让我们试试:
 
(LM:setattributevalue blk“ADDRESS”newvalue)
现在奇迹发生了。最终我会掌握这个诀窍,然后我将永远无法用另一种语言调用函数。叹气

SLW210 发表于 2022-7-5 20:10:11

请阅读代码发布指南,并将代码放入代码标签中。

Code goes here。
 
应该是这样的。。。
 
Code goes here
页: [1]
查看完整版本: 实体名称参数