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的参数,一次修改就完成了
页: 1 [2] 3
查看完整版本: 请教各位,LISP又遇到难题了(对本人来讲是难题)