LISP问题 请教 欢迎进来看看

Fredok_915 2011-10-28 08:48:04
刚学没多久,想对地形图中的高程点进行批量修改,高程点所在图层是GCD,下面是我写的,系统提示错误数据类型不对, 请问哪里不对 应该怎么做才能成功

(defun c:jgc(/ )
(setq w_new(getreal "\n输入需要增加的高程值:"))
(setq sl(ssget))
(setq n 0)
(repeat (sslength sl)
(setq e(ssname sl n))
(setq el(entget e))
(if (= "GCD" (cdr (assoc 8 el)))
(progn
(if (= "INSERT" (cdr (assoc 0 el)))
(progn
(setq w_old(cdddr (assoc 10 el)))
(setq w_new(+ w w_old))
(setq sl(subst (cons 10 w_new) (assoc 10 el)el))
(if (= 3 (cdr (assoc 72 el)))
(setq el(subst (cons 72 0) (assoc 72 el)el))
)
(entmod el)
)
)
)
(entmod el)
)
(setq n(+ 1 n))
)
)
...全文
91 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
panghuhu250 2011-10-31
  • 打赏
  • 举报
回复
我没用过autocad,只能针对你的lisp程序建议。

1. 加一些打印语句,找到出问题的代码以及它所涉及的数据的结构。
2. 看看你的书上有没有关于debug的章节,优先学习,因为以后会常用到。
Fredok_915 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 panghuhu250 的回复:]

如果el表中的值是(10 x y z)格式的话,(cdddr '(10 x y z))的值是(list z),要取z的值应该用cadddr。

不过这样的话,下面的代码又不对头了:

(if (= 3 (cdr (assoc 72 el)))
(setq el(subst (cons 72 0) (assoc 72 el)el))

(cdr (assoc 72 el))的值是(l……
[/Quote]

(assoc 72 el) 是在查询文本对齐方式 忽略第二个定位点 书上是这么解释这两行的 ,这里我是不清楚怎么实现的对齐方式 所以想问下, 改成cadddr 之后报错还是没变。gcd图层里的图形是块 想访问并修改块属性要怎么弄?这里不明白 ,请指导下。
Fredok_915 2011-10-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 panghuhu250 的回复:]

我没用过autocad,只能针对你的lisp程序建议。

1. 加一些打印语句,找到出问题的代码以及它所涉及的数据的结构。
2. 看看你的书上有没有关于debug的章节,优先学习,因为以后会常用到。
[/Quote]
明白了,还是要自己一点点的试才行。谢谢这么耐心的回复。
panghuhu250 2011-10-31
  • 打赏
  • 举报
回复
如果el表中的值是(10 x y z)格式的话,(cdddr '(10 x y z))的值是(list z),要取z的值应该用cadddr。

不过这样的话,下面的代码又不对头了:

(if (= 3 (cdr (assoc 72 el)))
(setq el(subst (cons 72 0) (assoc 72 el)el))

(cdr (assoc 72 el))的值是(list x y z), 怎么跟3比较呢?
Fredok_915 2011-10-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 panghuhu250 的回复:]
引用 7 楼 kailuan2zhong 的回复:

引用 2 楼 panghuhu250 的回复:


根据你的第二个问题中的代码,el大概是(list (72 . 0) (10 . 9))这样的结构,所以"(cdddr (assoc 10 el))"返回nil, 改成"(cdr (assoc 10 el))"试试。


[/Quote]
因为查询el表(assoc 10 el)返回的是(10 X Y Z) ,我的目的是要得到高程,所以查询第四项的值,如果改成cdr 那返回的是x,我需要的是Z
proorck6 2011-10-30
  • 打赏
  • 举报
回复
setq 我就能看懂这一句,其他的全然不会
还是帮你顶了。
iambic 2011-10-29
  • 打赏
  • 举报
回复
连错误信息都不贴,缩进乱七八糟,括号完全不对,symbol之间空白都没有,变量名不知所云,setq满天飞。看这样的代码太折寿了。
panghuhu250 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 kailuan2zhong 的回复:]

引用 2 楼 panghuhu250 的回复:

没有更详细的错误信息?例如错误发生在哪一行?能把错误信息完整的贴出来么?



你好,错误信息如下
CAD提示:
命令: jgc
输入需要增加的高程值:1
选择对象: 找到 1 个
选择对象: ; 错误: 参数类型错误: numberp: nil

问题好像是出在了
(setq w_old(cdddr (assoc 10 el)))
(setq w_new(+ w w_old))
[/Quote]
根据你的第二个问题中的代码,el大概是(list (72 . 0) (10 . 9))这样的结构,所以"(cdddr (assoc 10 el))"返回nil, 改成"(cdr (assoc 10 el))"试试。

Fredok_915 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 panghuhu250 的回复:]

没有更详细的错误信息?例如错误发生在哪一行?能把错误信息完整的贴出来么?

[/Quote]

你好,错误信息如下
CAD提示:
命令: jgc
输入需要增加的高程值:1
选择对象: 找到 1 个
选择对象: ; 错误: 参数类型错误: numberp: nil

问题好像是出在了
(setq w_old(cdddr (assoc 10 el)))
(setq w_new(+ w w_old))
这里,但是我实在是不明白怎么修改。
Fredok_915 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 panghuhu250 的回复:]
引用 3 楼 iambic 的回复:
setq满天飞


我也觉得奇怪,搜索了一下,发现好像autolisp就是用setq定义局部变量的。
[/Quote]

你们看起来别扭,是不是因为学的和我不一样,呵呵
Fredok_915 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iambic 的回复:]
连错误信息都不贴,缩进乱七八糟,括号完全不对,symbol之间空白都没有,变量名不知所云,setq满天飞。看这样的代码太折寿了。
[/Quote]

找了本auto lisp学的,只是个初学者,书上是这么定义的,而且能运行的,只是我有些地方不知道怎么引用参数,查询不到所以修改不了属性值。
panghuhu250 2011-10-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 iambic 的回复:]
setq满天飞
[/Quote]

我也觉得奇怪,搜索了一下,发现好像autolisp就是用setq定义局部变量的。
panghuhu250 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 kailuan2zhong 的回复:]
刚学没多久,想对地形图中的高程点进行批量修改,高程点所在图层是GCD,下面是我写的,系统提示错误数据类型不对, 请问哪里不对 应该怎么做才能成功

[/Quote]

没有更详细的错误信息?例如错误发生在哪一行?能把错误信息完整的贴出来么?

第二个帖子:

作用是把el中的(72 . 3)替换成(72 . 0)。
Fredok_915 2011-10-28
  • 打赏
  • 举报
回复
还有
(if (= 3 (cdr (assoc 72 el)))
(setq el(subst (cons 72 0) (assoc 72 el)el))
这句是什么作用,我在书上看到好几个例子都有这两行,但是看不懂后面的说明,能告诉个简单的解释吗?

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧