找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7762|回复: 44

[讨论]:如何做带提示和过滤表的entsel ?

[复制链接]
发表于 2003-12-19 21:33:11 | 显示全部楼层 |阅读模式

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

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

×
如何做带提示和过滤表的entsel ?

先转贴一个龙龙仔的程序作为参考,还有别的写法,思路么?

  1. ;;BY 龙龙仔(LUCAS)
  2. ;;USAGE:(ENTSEL_LAI "\n选择直线或圆..." '((0 . "*LINE,CIRCLE")))
  3. (defun ENTSEL_LAI (MSG FILTER / SS SSS)
  4.   ;;(while (not SS)
  5.   (setq SS (entsel MSG))
  6.   (if (/= SS NIL)
  7.     (progn
  8.       (command "_.SELECT" (car SS) "")
  9.       (if (not (setq SSS (ssget "P" FILTER)))
  10. (setq SS NIL)
  11. (list (ssname SSS 0) (cadr SS))
  12.       )
  13.     )
  14.   )
  15.   ;;)
  16. )

  17. ;;USAGE:(ENTSEL_MSG_FILTER "\n选取POLYINE对象: " '((0 . "LWPolyline")))
  18. (defun ENTSEL_MSG_FILTER (MSG FILTER / SSPICK PICKOBJ PT1)
  19.   (prompt MSG)
  20.   (setq SSPICK (ssget ":S" FILTER))
  21.   (if SSPICK
  22.     (progn
  23.       (setq PICKOBJ (car (ssnamex SSPICK 0)))
  24.       (setq PT1 (cadr (nth 3 PICKOBJ)))
  25.       (list (nth 1 PICKOBJ) PT1)
  26.     )
  27.   )
  28. )

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

  1. (defun xentsel (msg filter keys / );(/ keyini pt ss lst)
  2.   (while (= nil (setq keyini (initget keys)
  3.                        el (entsel (strcat msg "/<退出选择>:"))
  4.                        ss (cond ((= 'STR (type el)) el)
  5.                                 ((= 'LIST (type el))(setq pt  (osnap (cadr el) "nea")
  6.                                                           pkbox (xpkboxlst pt)
  7.                                                           ss (ssget "c" (car pkbox) (cadr pkbox) filter))
  8.                                                     (if ss (cons (ssname ss 0) (list pt)) nil))       
  9.                                 ((and (= nil el)(= 52 (getvar "errno"))) T)
  10.                           )
  11.          )    )         
  12.          (princ "\n未选中过滤实体!")
  13.   )
  14.   (if (= 'T ss) nil ss)
  15. )
  16. ;(xpkboxlst 点位) 取得取点所在处拾取框pickbox的(左上角点 右下角点)点表
  17. ;(xpkboxlst (getpoint))
  18. (defun xpkboxlst (pt / pkhigh pkrad)
  19.   (setq pkhigh (* (getvar "viewsize") (/ (getvar "pickbox") (cadr (getvar "screensize"))))
  20.         pkrad  (* 1.4144 pkhigh))
  21.   (list (polar pt (* 0.75 PI) pkrad) (polar pt (* 1.75 PI) pkrad))
  22. )


前面帖子已经说过,不用grread是无法在点选前亮显的,我说grread亮显的优势并不是可否亮显,而是可以在点选前就亮显。这个只是用entsel+ssget是做不到的,因此就算把我亮显的那段放到ea程序里面,也不能达到预先亮显的效果。我个人认为,如果不在点选前亮显,亮显就没有太大意义,如果认为这个不需要,那就干脆不用grread了,也就是我这贴的效果。还是一句话,个人喜好问题。
至于在程序外面写,那我认为没有必有,选已经选了,亮不亮显有什么必要?又不是求选择集。
另外,我的程序是(ssget “c”pt pt ‘((...))) ,不是(ssget pt) (见最近两贴),请不要继续就(ssget pt)的缺点展开论述(这个我早已很清楚, 我怎么老觉得说这个跑题了?这个关于(ssget pt)的问题根本就是无中生有--你是在和我说还是和ll长老说?我是不是表错情了?)在pt点求nea后,再加上过滤后是可以选到合要求的物体的(有多个实体重合/交点处)。对于这样的交点处有多个符合过滤的实体,一样具有选择的不确定性,哪怕“c”的范围再大。只有当这一堆东西里面只有一个符合过滤的实体,返回的结果才真正“准确”。
不过,我承认模拟pickbox选择的成功率是更有保障。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2003-12-20 00:10:22 | 显示全部楼层
我的方法

  1.   [FONT=courier new]
  2. (setq con1 t)
  3.   (while con1
  4.     (prompt "请选择需查看平面图的杆塔:")
  5.     (while (not (setq ssgt (car (entsel)))))
  6.     (if        (= (strcase (cdr (assoc 8 (entget sgt)))) "GANTA")
  7.       (setq con1 nil)
  8.     )
  9.    )
  10.   [/FONT]

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

使用道具 举报

 楼主| 发表于 2003-12-20 00:21:50 | 显示全部楼层
不错不错.写的挺紧凑
不过可惜虽然有过滤功能,
但是没支持过滤表.过滤的能力有限.能否改一下?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

发表于 2003-12-20 20:17:49 | 显示全部楼层
以前见过这样的:
(defun hh_entsel(filt prom / E EN IN IN-TY K N);;;用entsel方式选择过滤物体
  (setq e(entsel prom))
  (if e(progn
    (setq en(entget (car e))
          n(length filt)
          in 0 k t)
    (while(and k (< in n))
      (setq in-ty(car (nth in filt))
            k(WCMATCH (strcase(dxf in-ty en)) (strcase(cdr(nth in filt))))
            in(1+ in))
    ) )
    (setq k nil)
  )
  (if k e)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-20 20:31:19 | 显示全部楼层
加点难度.大家一起玩玩?
功能如下,谁也来写一个?我明天贴程序

  1. ;| 带提示和过滤表的xentsel ------------------------------陌生人.2003.12
  2.   函数: (xentsel 提示信息 过滤表)
  3.   返回值: nil 或者 (实体名 . 点位)点对表.
  4.   
  5.   功能: 1.带提示和过滤表的entsel;
  6.             2.循环直到选中有效实体或选择退出为止;
  7.            3.返回的点对表中的 点位为实体上的点;
  8.   实例: (xentsel "\n选择直线或圆..." '((0 . "*LINE,CIRCLE")))
  9. 实战:
  10. (xentsel "\n选择直线或圆..." '((0 . "*LINE,CIRCLE")))
  11. 选择直线或圆.../<退出选择>: (此时乱点)
  12. 未选中有效实体
  13. 选择直线或圆.../<退出选择>: (此时按空格或回车)
  14. nil
  15. (xentsel "\n选择直线或圆..." '((0 . "*LINE,CIRCLE")))
  16. 选择直线或圆.../<退出选择>: (此时选有效物体)
  17. (<图元名: 40093f08> (4771.53 -7575.42 0.0))
  18. |;
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2003-12-21 09:07:24 | 显示全部楼层
这是我在编程心得中的例一:

  1. (defun ett_ct()
  2.   (initget "C  ")                                         ;关键字“C”及空格
  3.   (setq s0 (entsel "\n设置颜色C / 选取文本:"))
  4.   (cond
  5.     ( (= s0 "C") (ett_col))                               ;转设置颜色子函数
  6.     ( (= s0 "") nil)                                      ;空格退出
  7.     ( (and (= (type s0) 'LIST)                            ;选择实体
  8.            (= (cdr (assoc 0 (entget (car s0)))) "TEXT")   ;判别文本
  9.       )
  10.       ...                                                 ;操作内容
  11.       (ett_ct)                                            ;编辑后返回选择
  12.     )
  13.     (t (ett_ct))                                          ;空选返回选择
  14.   )
  15. )


例子主要说空选与右键退出,在“判别文本”段适当修改可以使之满足过虑表条件,将最后的“空选返回”与“判别文本”次序颠倒一下,应可以满足返回值要求。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-12-21 11:47:48 | 显示全部楼层
我曾经上传过一个函数,叫CS_ENTSEL,不仅有过滤功能,而且还有预先提示功能。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-12-21 13:00:44 | 显示全部楼层
我收藏并一直在使用的函数

  1. (defun EntSelF (Msg Filter / EntN pbDist PtPick ssPick)
  2.   (setvar "ErrNo" 0)                        ; clear ErrNo for loop
  3.   (while (and (not (setq EntN (if Msg        ; if selection prompt
  4.                                 (entsel Msg) ; then (entsel) w/prompt
  5.                                 (entsel)
  6.                               )
  7.                    )
  8.               )                                ; while no selection (or no exit)
  9.               (/= 52 (getvar "ErrNo"))
  10.          )
  11.   )                                        ; if null response
  12.   (cond
  13.     ((= (type EntN) 'LIST)                ; if not exit
  14.      (setq pbDist (abs                        ; return absolute number, get pixel ratio
  15.                     (/ (* (/ (getvar "PickBox") (cadr (getvar "ScreenSize")))
  16.                           (getvar "ViewSize")
  17.                        )                ; apply to viewsize (in units)
  18.                        (sin (* 0.25 pi))
  19.                     )
  20.                   )                        ; at 45°
  21.            PtPick (cadr EntN)
  22.      )                                        ; get point of pick
  23.      (if (setq ssPick (ssget "_C"        ; if entities in crossing
  24.                              (polar PtPick (* 1.25 pi) pbDist)
  25.                                         ; lower left
  26.                              (polar PtPick (* 0.25 pi) pbDist)
  27.                                         ; upper right
  28.                              Filter
  29.                       )
  30.          )                                ; match filter, if any
  31.        (cons (ssname ssPick 0) (list PtPick))
  32.      )
  33.     )
  34.     ((= (type EntN) 'STR) EntN);;支持 Initget 关键字
  35.   )
  36. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2003-12-21 13:17:39 | 显示全部楼层
最初由 lijiao 发布
[B]我曾经上传过一个函数,叫CS_ENTSEL,不仅有过滤功能,而且还有预先提示功能。 [/B]


预先提示什么内容?

测试下我的:

  1. ;| 带提示和过滤表的xentsel ------------------------------陌生人 2003.12
  2.   v1.0 2003.12完成.
  3.   函数: (xentsel 提示信息 过滤表)
  4.   返回值: nil 或者 (实体名 . 点位)点对表.
  5.   
  6.   功能: 1.带提示和过滤表的entsel;
  7.         2.循环直到选中有效实体或选择退出为止;
  8.         3.返回的点对表中的 点位为实体上的点;
  9.   实例: (xentsel "\n选择直线或圆..." '((0 . "*LINE,CIRCLE")))
  10. |;

  11. (defun xentsel (msg filter / pt ss)
  12.   (while (not(or (setq el (entsel (strcat msg "/<退出选择>:"))
  13.                        ss (if el (ssget (cadr el) filter)))
  14.                  (= 52 (getvar "errno"))))         
  15.          (princ "\n未选中有效实体")
  16.   )
  17.   (if ss (cons (ssname ss 0) (list(osnap (cadr el) "nea")))
  18.          nil)
  19. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-12-21 13:28:46 | 显示全部楼层
最初由 陌生人 发布
[B]

预先提示什么内容?

测试下我的:
[CODE]
;| 带提示和过滤表的xentsel ----... [/B]

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

使用道具 举报

 楼主| 发表于 2003-12-21 15:14:22 | 显示全部楼层
什么时候用关键字,举个例子?

  1. ;v1.1 2003.12.20.改写:加入带亮显提示功能;
  2. ;实例:(xentsel "\n选择直线或圆..." '((0 . "*LINE,CIRCLE")))
  3. ;:使用(grread T 4 2),放弃使用entsel;
  4. (defun xentsel (msg filter / roop el ss e entl draw)
  5.   (setq roop T entl nil)
  6.   (while roop
  7.     (setq el (grread t 4 2))
  8.     (cond
  9.       ((member el '((2 13)(2 32))) (princ "\n你选择了退出,未选中实体!")(setq roop nil))
  10.       ((setq ss (ssget (cadr el) filter))
  11.        (setq e (ssname ss 0))
  12.        (if e0
  13.          (if(not(equal e e0))(redraw e0 4)(redraw e 3))
  14.          (setq e0 e draw (redraw e 3))
  15.        )
  16.        (if (= 3 (car el))
  17.          (setq roop nil
  18.                entl (cons e (list (osnap (cadr el) "nea")))
  19.                draw (redraw e 4))
  20.        )
  21.       )
  22.       (T (if e0 (redraw e0 4))(setq e0 nil))
  23.     )
  24.    )
  25.   (if entl entl nil)
  26. )


哈哈,还没有其他回复.我又来啦

  1. ;v1.1 2003.12.20.改写:加入带亮显提示功能;
  2. ;v1.2 支持关键字返回;
  3. ;实例:(xentsel "\n选择直线或圆/O-调整参数:" '((0 . "*LINE,CIRCLE")) "O")
  4. ;技巧:使用(grread T 4 2),放弃使用entsel;
  5. ;|
  6. 实例:
  7. Command: (xentsel "\n选择直线或圆/O-调整参数:" '((0 . "*LINE,CIRCLE")) "O")
  8. 选中符合要求的实体,返回(实体名 . 点)双元表;
  9. 经过符合要求的实体;
  10. 未选中符合要求的实体;
  11. 空格退出;
  12. 输入非关键字,继续提问;
  13. 输入关键字"O",返回"O";
  14. |;
复制代码



继续: 看另外一篇帖子,发现一个问题比较有意思:
用entsel 可以透明使用zoom命令,但是不能预先亮显符合要求的实体.
用grread则正好相反.有没有什么办法可以鱼和熊掌兼得呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

 楼主| 发表于 2003-12-22 00:26:09 | 显示全部楼层
;v1.2 支持关键字返回;
;实例:(xentsel "\n选择直线或圆/O-调整参数:" '((0 . "*LINE,CIRCLE")) "O")
上面的 "o"就是关键字, 可看看演示.
函数:(xentsel 提示 过滤表 关键字)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2003-12-22 00:54:41 | 显示全部楼层
最初由 陌生人 发布
[B];v1.2 支持关键字返回;
;实例:(xentsel "\n选择直线或圆/O-调整参数:" '((0 . "*LINE,CIRCLE")) "O")
上面的 "o"就是关键字, 可看看演示.
函数:(xentsel 提示 过滤表 关键字) [/B]

一个字符的关键字太简单了,这样的效果

  1. (initget 128 "A  F C M R TL TC TR ML")
  2. (setq e (entsel "\n[对齐(A)/调整(F)/中心(C)/中间(M)/右(R)/左上(TL)/中上(TC)/右上(TR)/左中(ML)]: ")
  3. (cond
  4. ......

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 02:03 , Processed in 0.210810 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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