找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2119|回复: 5

[LISP程序]:两句程序,错在哪里?

[复制链接]
发表于 2003-8-28 08:28:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
(setq ss (ssget "c"  a  a  '((0 . "POLYLINE")(40 . 0)(41 . 0))))
(setq a (sslength ss))
其中a是图中一定点
调试时提示:参数类型错误: lselsetp nil
好象是最后一句错了,为什么?
谢谢!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2003-8-28 10:13:50 | 显示全部楼层
第二句没什么问题,问题应该是出在第一句中,不知你的CAD是什么版本的,不过应是比较新的,现在CAD默认的多义线为LWPOLYLINE,所以你的第一句的返回值为nil,第二句当然说会出错。
以下为图元类型的示例:
命令: (setq a (entlast))
<图元名: 7ef50e90>

命令: (setq aa (entget a))
((-1 . <图元名: 7ef50e90>) (0 . "LWPOLYLINE") (330 . <图元名: 7ef50cf8>) (5 .
"8A") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 .
"AcDbPolyline") (90 . 2) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 621.899
256.647) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 771.463 312.185) (40 . 0.0) (41 .
0.0) (42 . 0.0) (210 0.0 0.0 1.0))

以下为修改后的程序运行情况:
命令: (setq a (getpoint))
(804.95 461.005 0.0)

命令: (setq ss (ssget "c" a a '((0 . "LWPOLYLINE")(40 . 0)(41 . 0))))
<Selection set: 13>
命令: (setq a (sslength ss))
2
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-28 10:52:05 | 显示全部楼层
试过了,运行正常!谢谢!
可是结果好象不太正确,结果总提示1个实体,这是为什么?怎样改正呢?
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-8-28 11:25:42 | 显示全部楼层
你测试时画了几条过a点的多义线?我画了二条
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-8-28 15:01:04 | 显示全部楼层
我画了两条
不过是放在一个程序里运行的
(defun tgdst ()
  (setq e (entsel "请选择一多段线"))
  (setq e1 (car e))
  (setq a (cdr (assoc 40 (entget e1))))
  (setq b (cdr (assoc 41 (entget e1))))
  (if (= a 0)
    (setq c (assoc 10 (entget e1)))
    (setq c (assoc 10 (reverse (entget e1)))))
  (setq d (cdr c))
  (setq ss (ssget "c"  d d '((0 . "POLYLINE")(40 . 0)(41 . 0))));;;必须为LWPOLYLINE,因为是新的版本,过d点的选择集
  (setq f (sslength ss)))
是其他地方错了吗?
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2003-8-28 17:20:54 | 显示全部楼层
最初由 redapple 发布
[B]我画了两条
不过是放在一个程序里运行的
(defun tgdst ()
  (setq e (entsel "请选择一多段线"))
  (setq e1 (car e))
  (setq a (cdr (assoc 40 (entget e1))))
  (setq b (cdr (assoc 41 (entget e1))))
  ... [/B]


你现在的点重合了,用的都是D,提示你两个技巧:

1、如果你希望即选择POLYLINE也选择LWPOLYLINE,那么可以用 '((0 . "*polyline"))

2、构造过一个点的选择集,你不要两个点参数用一个,你构筑一个小矩形,矩形的宽的值是系统变量pickbox的值。这个是ACAD自身实现的方法,你试验过entsel 函数了吗,不知道你是否有印象,只要你的靶框挨上实体,就可以返回实体名和点(这个点并不在实体上,而是在靶框范围内),这时候,你用比如ERASE命令删除,选实体的时候,你给这个点,ACAD也能选择到这个实体的。

意思是说,ACAD选择实体是在系统变量PICKBOX范围内选择。

所以你上面的问题,一个基点确定后,比如p1,那么根据p1再构建一个对顶角点p2

(setq h (getvar "pickbox"))
(setq p2 (polar p1 (/ pi 4) (* (sqrt 2) h)))

然后:
(setq ss (ssget "c" p1 p2 ........))
活动过一个点PT1的实体选择集,就可以把过这个点的所有实体选择到了。

上面是从基点45度方向,2开方乘以靶框高度得到P2, 实际应用中也可以根据P1,-45度方向,二分之一根号2得到一个点p1,45度方向二分之一根号2得到p2.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-26 16:00 , Processed in 0.366302 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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