ll_j
发表于 2013-4-9 18:50:00
本帖最后由 ll_j 于 2013-4-9 18:50 编辑
45296876 发表于 2013-4-9 17:38 http://bbs.mjtd.com/static/image/common/back.gif
(entmod (subst (cons 41 c ) (assoc 41 a3) a3))
(entmod (subst (cons 40 a ) (assoc 40 a3) a3))
...
可以同时修改,这样:
(setq a3 (entmod (subst (cons 41 c ) (assoc 41 a3) a3)))
(entmod (subst (cons 40 a ) (assoc 40 a3) a3))
之所以出现你所说的结果,是因为前一句时更新了实体表,并没有实际保存,而后一句实际上又是重新对以前提出的实体表进行更新。
不太容易说明白,打个比方,就像多个人同时打开一个网络上的文本文档进行修改,谁最后保存就是谁的。
45296876
发表于 2013-4-9 21:39:36
ll_j 发表于 2013-4-9 18:50 static/image/common/back.gif
可以同时修改,这样:
(setq a3 (entmod (subst (cons 41 c ) (assoc 41 a3) a3)))
(entmod (su ...
这句话好难理解。前面你说的我明白,谁最后保存的就是谁的,但(setq a3 (entmod (subst (cons 41 c ) (assoc 41 a3) a3)))这句话,说真的,我没法理解,虽然说可以解决我的问题。我再体会体会这句话的意思吧,谢谢你了,帮我完全解决了这个问题。明经真的是人才众多啊。
llsheng_73
发表于 2013-4-9 21:44:47
本帖最后由 llsheng_73 于 2013-4-9 21:48 编辑
因为你第一次改了41后,第二次改40的时候,它的41还是原来的,又把它给改回去了
(ENTMOD(SETQ A3(subst (cons 41 c ) (assoc 41 a3) a3)
A3(subst (cons 40 a ) (assoc 40 a3) a3)))
45296876
发表于 2013-4-9 21:49:36
llsheng_73 发表于 2013-4-9 21:44 static/image/common/back.gif
(ENTMOD(SETQ A3(subst (cons 41 c ) (assoc 41 a3) a3)
A3(subst (cons 40 a )...
能帮忙解释一下这两句话为何这样用吗?这里有个A3,后面再有A3不会被循环使用是因为什么?谢谢。
45296876
发表于 2013-4-9 21:56:05
ll_j 发表于 2013-4-9 18:50 static/image/common/back.gif
可以同时修改,这样:
(setq a3 (entmod (subst (cons 41 c ) (assoc 41 a3) a3)))
(entmod (su ...
你看啊,可不可以这样理解:(setq g (entmod (subst (cons 40 a) (assoc 40 g) g)))这句话是说被修改保存后的那个A3的表达式了吧。后面的ENTMOD再运行就是被保存过的那个A3了吧,还真挺难讲清楚的。
ll_j
发表于 2013-4-9 22:10:25
45296876 发表于 2013-4-9 21:56 static/image/common/back.gif
你看啊,可不可以这样理解:(setq g (entmod (subst (cons 40 a) (assoc 40 g) g)))这句话是说被修改保存 ...
很难讲清楚。
这样说吧,当使用(setq a3...)的时候,保存在变量A3中的只是一个实体表,而不是实体本身,而使用entmod的时候,更新了实体,也更新了实体对应的表,但并没有更新A3变量,所以,对实体表更新(subst)一次后,应该替换掉变量A3,再次更新其它内容才是有效的。
yshf
发表于 2013-4-9 22:45:26
本帖最后由 yshf 于 2013-4-9 22:58 编辑
也可以如下:
(defun c:ccc()
(setq a (getreal "\n请输入文字高度:"))
(if (setq aa (ssget '((0 . "INSERT") (66 . 1))))
(vlax-for obj (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
(mapcar '(lambda(x) (vla-put-Height x a) (vla-update x))
(vlax-invoke obj "GetAttributes")
)
)
)
(princ)
)
ZZXXQQ
发表于 2013-4-10 08:21:31
...
(setq a3 (subst (cons 41 c) (assoc 41 a3) a3))
(entmod (subst (cons 40 a) (assoc 40 a3) a3))
...
45296876
发表于 2013-4-10 09:03:42
ZZXXQQ 发表于 2013-4-10 08:21 static/image/common/back.gif
...
(setq a3 (subst (cons 41 c) (assoc 41 a3) a3))
(entmod (subst (cons 40 a) (assoc 40 a3) a3))
此问题已解决,接下来我还会继续学习,IF AND 在程序当中的用法,我会慢慢体会的,不懂的地方还要回来向大家请教 。
llsheng_73
发表于 2013-4-10 09:09:31
45296876 发表于 2013-4-9 21:49 static/image/common/back.gif
能帮忙解释一下这两句话为何这样用吗?这里有个A3,后面再有A3不会被循环使用是因为什么?谢谢。
实际上要修改一个图元的多个DXF数据的时候,不能象你前边那样改其中一个DXF数据后,再去改另一个DXF数据,那样的结果是虽然每一次它都确实在进行修改,比如你先改了41,ENTMOD它确实会对41进行修改,但你改40的时候,由于你还是用的A3,但这个时候的A3它的41是没有进行过修改的,所以这个时候你改40,实际上就把41也改回成原来的了
至于(SETQ A3(subst (cons 41 c ) (assoc 41 a3) a3)
A3(subst (cons 40 a )...
里边,因为表达示它是顺序执行的,它会把第一次SUBST的结果返回给A3
第二次SUBST的时候,A3的值就被修改过一次了,然后它再将SUBST的结果返回给A3,A3里边就有两个DXF数据被修改过了,然后这个SETQ所返回的值作为ENTMOD的参数,一次修改就完成了