找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3331|回复: 20

[LISP函数]:全新的ENSEL函数

[复制链接]
发表于 2003-3-4 15:17:45 | 显示全部楼层 |阅读模式

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

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

×
CSENTSEL与ENTSEL的区别:
CSENTSEL需要过滤器,当鼠标移动到满足过滤条件的图元上时,图元会闪动,以免选择了不该选择的图元,过滤器与SSGET的过滤器要求相同。
返回值与ENTSEL相同,选择成功,返回一个表,(实体名 拾取点坐标)

  1.   [FONT=courier new]
  2. (defun CS_ENTSEL (FILTER / pt ss_name ss)
  3.   (setq pt (grread t 4 2))
  4.   (while (/= 3 (car pt))
  5.     (if        (= 5 (car pt))
  6.       (progn
  7.         (setq pt (cadr pt))
  8.         (setq ss (ssget pt FILTER))
  9.         (if ss_name
  10.           (redraw ss_name 4)
  11.         )
  12.         (setq ss_name nil)
  13.         (if ss
  14.           (progn
  15.             (setq ss_name (ssname ss 0))
  16.             (redraw ss_name 3)
  17.           )
  18.         )
  19.         (setq pt (grread t 4 2))
  20.       )
  21.     )
  22.   )
  23.   (setq pt (cadr pt))
  24.   (setq ss (ssget pt FILTER))
  25.   (if ss_name
  26.     (redraw ss_name 4)
  27.   )
  28.   (setq ss_name nil)
  29.   (if ss
  30.     (progn
  31.       (setq ss_name (ssname ss 0))
  32.       (list ss_name pt)
  33.     )
  34.     (eval cs_name)
  35.   )
  36. )
  37.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-3-4 20:55:17 | 显示全部楼层
再加个自定义提示串就更好了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-5 08:07:34 | 显示全部楼层
最初由 eachy 发布
[B]再加个自定义提示串就更好了。 [/B]

谢谢指点。

  1.   [FONT=courier new]
  2. (defun CS_ENTSEL (FILTER / pt ss_name ss)
  3.   (princ "\n选择实体:")
  4.   (setq pt (grread t 4 2))
  5.   (while (/= 3 (car pt))
  6.     (if        (= 5 (car pt))
  7.       (progn
  8.         (setq pt (cadr pt))
  9.         (setq ss (ssget pt FILTER))
  10.         (if ss_name
  11.           (redraw ss_name 4)
  12.         )
  13.         (setq ss_name nil)
  14.         (if ss
  15.           (progn
  16.             (setq ss_name (ssname ss 0))
  17.             (redraw ss_name 3)
  18.           )
  19.         )
  20.         (setq pt (grread t 4 2))
  21.       )
  22.     )
  23.   )
  24.   (setq pt (cadr pt))
  25.   (setq ss (ssget pt FILTER))
  26.   (if ss_name
  27.     (redraw ss_name 4)
  28.   )
  29.   (setq ss_name nil)
  30.   (if ss
  31.     (progn
  32.       (setq ss_name (ssname ss 0))
  33.       (list ss_name (osnap pt "nea"))
  34.    )
  35.     (eval cs_name)
  36.   )
  37. )

  38.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-3-5 11:38:10 | 显示全部楼层
是不是这样好些:

  1. (defun CS_ENTSEL ( str FILTER / pt ss_name ss)
  2.   (princ str)
  3.   .....
  4. )

可以说明选择什么实体。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-5 11:56:47 | 显示全部楼层
我用(setq a (cs_entsel '((0 . "line"))))选择直线怎么显示nil?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-5 13:26:34 | 显示全部楼层
最初由 zhynt 发布
[B]我用(setq a (cs_entsel '((0 . "line"))))选择直线怎么显示nil? [/B]

是我的错,在第三贴中少了一个括号,已经修改了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-5 16:06:28 | 显示全部楼层
应该再加一条件判断语句,当在提示时按了回车或鼠标右键后提示重新选择或退出,目前这样做后将进入死循环。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-5 16:55:26 | 显示全部楼层

请教

有一个问题想请教:调用nentsel函数选择实体后,用函数entget 生成DXF形式的list关连表。但当实体为"LWPOLYLINE"类型的圆弧时,关连表中不会有关于"ARC"的数据,如:半径、圆心等。怎样能生成这部分数据?!谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-5 17:17:24 | 显示全部楼层
最初由 zhynt 发布
[B]应该再加一条件判断语句,当在提示时按了回车或鼠标右键后提示重新选择或退出,目前这样做后将进入死循环。 [/B]


多谢二位指点,修改后的代码如下:

  1.   [FONT=courier new]
  2. (defun CS_ENTSEL (STR FILTER / pt ss_name ss)
  3.   (if (/= (type str) 'STR)
  4.     (progn
  5.       (princ "\n变量类型不对,STR应为字符串。\n")
  6.       (eval nil)
  7.     )
  8.     (progn
  9.       (if (/= (type FILTER) 'LIST)
  10.         (progn
  11.           (princ "\n变量类型不对,FILTER应为表。\n")
  12.           (eval nil)
  13.         )
  14.         (progn
  15.           (princ str)
  16.           (setq pt (grread t 4 2))
  17.           (while (/= 3 (car pt))
  18.             (if        (= 5 (car pt))
  19.               (progn
  20.                 (setq pt (cadr pt))
  21.                 (setq ss (ssget pt FILTER))
  22.                 (if ss_name
  23.                   (redraw ss_name 4)
  24.                 )
  25.                 (setq ss_name nil)
  26.                 (if ss
  27.                   (progn
  28.                     (setq ss_name (ssname ss 0))
  29.                     (redraw ss_name 3)
  30.                   )
  31.                 )
  32.               )
  33.               (setq pt (grread t 4 2))
  34.             )
  35.           )
  36.           (setq pt (cadr pt))
  37.           (setq ss (ssget pt FILTER))
  38.           (if ss_name
  39.             (redraw ss_name 4)
  40.           )
  41.           (setq ss_name nil)
  42.           (if ss
  43.             (progn
  44.               (setq ss_name (ssname ss 0))
  45.               (list ss_name pt)
  46.             )
  47.             (eval cs_name)
  48.           )
  49.         )
  50.       )
  51.     )
  52.   )
  53. )
  54.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-5 17:38:55 | 显示全部楼层
我也发现了这个问题,在按鼠标右键是进入死循环。
我改成了退出。
程序如下:

  1. (defun CS_ENTSEL (promptstring FILTER / pt ss_name ss old_pt)

  2. (defun cs_error (msg)
  3.   (if (member msg '("Function cancelled" "quit / exit abort" "console break"))
  4.     (princ)
  5.     (princ (strcat "Error: " msg))
  6.     )
  7.   (if ss
  8.     (progn
  9.       (setq ss_name (ssname ss 0))
  10.       (redraw ss_name 4)
  11.       )
  12.     )
  13.   (if old-osmode (setvar "osmode" old-osmode))
  14.   (if old-ortho (setvar "orthomode" old-ortho))
  15.   (if old-cmdecho (setvar "cmdecho" old-cmdecho))
  16.   (if old_error (setq *error* old-error))
  17.   (princ)
  18.   )

  19.   (princ (strcat "\n" promptstring))
  20.   (setq old_error *error* *error* cs_error)
  21.   (setq pt (grread t 12 2))
  22.   (setq old_pt pt)
  23.   (while (/= 3 (car pt))
  24.     (if        (= 5 (car pt))
  25.       (progn
  26.         (setq pt (cadr pt))
  27.         (setq ss (ssget pt FILTER))
  28.         (if ss_name
  29.           (redraw ss_name 4)
  30.           )
  31.         (setq ss_name nil)
  32.         (if ss
  33.           (progn
  34.             (setq ss_name (ssname ss 0))
  35.             (redraw ss_name 3)
  36.             )
  37.           )
  38.         (setq pt (grread t 12 2))
  39.                      (if (= (type (cadr pt)) 'LIST)
  40.                        (setq old_pt pt)
  41.                       )
  42.         )
  43.       (setq pt '(3))
  44.       )
  45.     )
  46.   (if (= 3 (car pt))
  47.     (setq pt old_pt)
  48.     )
  49.   (setq pt (cadr pt))
  50.   (setq ss (ssget pt FILTER))
  51.   (if ss_name
  52.     (redraw ss_name 4)
  53.   )
  54.   (setq ss_name nil)
  55.   (if ss
  56.     (progn
  57.       (setq ss_name (ssname ss 0))
  58.       (list ss_name pt)
  59.     )
  60.     (eval ss_name)
  61.   )
  62. )


不好意思,程序有错误,现在改好了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-6 14:31:26 | 显示全部楼层
最初由 gchen 发布
[B]我也发现了这个问题,在按鼠标右键是进入死循环。
我改成了退出。
程序如下:
[code]
(defun CS_ENTSEL (promptstring FILTER / pt ss_name ss old_pt)

(defun cs_error (msg)
  (if (member msg '("Functio... [/B]

进入死循环的原因是我不小心把括号的位置写错了,第9贴中不应该有问题。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-7 09:25:42 | 显示全部楼层
我看这篇帖子的时候,第九帖还没有贴出来。我觉得这个程序不错,所以下载试用,然后
才发现的问题,等我改好了,再上来的时候,lijiao的第九帖已经发表了。但是和我改的不
一样,你改的是一直重新提示要选择,而我是退出,所以我还是把我改过的贴了出来,
并不是说你第9帖中有问题。请你不要误会。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-3-7 09:48:51 | 显示全部楼层
最初由 gchen 发布
[B]我看这篇帖子的时候,第九帖还没有贴出来。我觉得这个程序不错,所以下载试用,然后
才发现的问题,等我改好了,再上来的时候,lijiao的第九帖已经发表了。但是和我改的不
一样,你改的是一直重新提示要选择,而我... [/B]

谢谢你的关心。
****************************
这个函数主要是想模拟ENTSEL,并具有智能提示作用,不应该叫作程序,所以不用加入错误处理代码等,程序调用它时,成功就返回正常值,否则就返回Nil,不要因为它终止整个程序,除非按下了ESC键。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2003-3-8 11:19:37 | 显示全部楼层
还是不好,
'p  'zoom怎么办?

我想方法应该是:
还用entsel,但只用entsel返回的点,再通过这点重新过滤,有要的亮显,没有就安全的出来.
而且通过点ssget,选中的机会很小,要模拟出一个选框(box)来和entsel的框相同,这很容易算出来的.
再(ssget "cp" box filter)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-3-8 16:34:29 | 显示全部楼层
我开始的确是想把它用到我的程序里的,而且我的程序也想在点击右键的时候退出,所以我才这么改。
aeo的方法可能会不错,有时间我再想想。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-26 08:11 , Processed in 0.204821 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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