明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 45296876

[函数] 请教各位,LISP又遇到难题了(对本人来讲是难题)

  [复制链接]
发表于 2013-4-9 18:50:00 | 显示全部楼层
本帖最后由 ll_j 于 2013-4-9 18:50 编辑
45296876 发表于 2013-4-9 17:38
(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))
之所以出现你所说的结果,是因为前一句时更新了实体表,并没有实际保存,而后一句实际上又是重新对以前提出的实体表进行更新。
不太容易说明白,打个比方,就像多个人同时打开一个网络上的文本文档进行修改,谁最后保存就是谁的。
 楼主| 发表于 2013-4-9 21:39:36 | 显示全部楼层
ll_j 发表于 2013-4-9 18:50
可以同时修改,这样:
(setq a3 (entmod (subst (cons 41 c ) (assoc 41 a3) a3)))
     (entmod (su ...

这句话好难理解。前面你说的我明白,谁最后保存的就是谁的,但(setq a3 (entmod (subst (cons 41 c ) (assoc 41 a3) a3)))这句话,说真的,我没法理解,虽然说可以解决我的问题。我再体会体会这句话的意思吧,谢谢你了,帮我完全解决了这个问题。明经真的是人才众多啊。
发表于 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)))
 楼主| 发表于 2013-4-9 21:49:36 | 显示全部楼层
llsheng_73 发表于 2013-4-9 21:44
(ENTMOD(SETQ A3(subst (cons 41 c ) (assoc 41 a3) a3)
                        A3(subst (cons 40 a )  ...

能帮忙解释一下这两句话为何这样用吗?这里有个A3,后面再有A3不会被循环使用是因为什么?谢谢。
 楼主| 发表于 2013-4-9 21:56:05 | 显示全部楼层
ll_j 发表于 2013-4-9 18:50
可以同时修改,这样:
(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了吧,还真挺难讲清楚的。
发表于 2013-4-9 22:10:25 | 显示全部楼层
45296876 发表于 2013-4-9 21:56
你看啊,可不可以这样理解:(setq g (entmod (subst (cons 40 a) (assoc 40 g) g)))这句话是说被修改保存 ...

很难讲清楚。
这样说吧,当使用(setq a3...)的时候,保存在变量A3中的只是一个实体表,而不是实体本身,而使用entmod的时候,更新了实体,也更新了实体对应的表,但并没有更新A3变量,所以,对实体表更新(subst)一次后,应该替换掉变量A3,再次更新其它内容才是有效的。
发表于 2013-4-9 22:45:26 | 显示全部楼层
本帖最后由 yshf 于 2013-4-9 22:58 编辑

也可以如下:


  1. (defun c:ccc()
  2.     (setq a (getreal "\n请输入文字高度:"))
  3.     (if (setq aa (ssget '((0 . "INSERT") (66 . 1))))
  4.         (vlax-for obj (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object)))
  5.                (mapcar '(lambda(x) (vla-put-Height x a) (vla-update x))
  6.                        (vlax-invoke obj "GetAttributes")         
  7.               )
  8.         )
  9.     )
  10.     (princ)
  11. )
发表于 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))
...
 楼主| 发表于 2013-4-10 09:03:42 | 显示全部楼层
ZZXXQQ 发表于 2013-4-10 08:21
...
(setq a3 (subst (cons 41 c) (assoc 41 a3) a3))
(entmod (subst (cons 40 a) (assoc 40 a3) a3))

此问题已解决,接下来我还会继续学习,IF   AND 在程序当中的用法,我会慢慢体会的,不懂的地方还要回来向大家请教 。
发表于 2013-4-10 09:09:31 | 显示全部楼层
45296876 发表于 2013-4-9 21:49
能帮忙解释一下这两句话为何这样用吗?这里有个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的参数,一次修改就完成了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-26 05:35 , Processed in 0.189693 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表