fwdll 发表于 2013-10-23 15:12:28

如何实现多种选择方式?比如可以选取一条直线,或者输入两个点。

我需要获得一段距离,可以有以下几个方法:
1、键盘直接输入
2、选取图上一条直线或者pline线
3、用鼠标直接在图上选取2个点或者多个点,然后计算这些点连接成的线的距离
正常是给出3个选择,用户选取后,根据选择分别处理以上三种方案,有没有可能用一句autolisp语言实现,然后分别根据用户的输入来决定怎么处理,比如如果用户用键盘输入,说明就是用方法1,如果选取物体,那就是2,如果连续点选,那就是3.
不知道我表达清楚没有。谢谢。

ll_j 发表于 2013-10-23 16:00:37

第一种和第三种现在是合并的,getdist函数可以直接给出,第二种方法属于实体选择,不可以也不可能直接得到,就像你自己所说,选择Line或PLine,这就是两种完全不同的线形,需要不同的处理方法才能得到所要的距离。
一般像你的情况可以这样处理:
(initget "S")
(setq ds(getdist "\n输入距离或 [参照(S)]: "))
(cond
((= ds "S") (se));选择参照实体并处理
((= ds nil) (end))   ;空输入退出,可在前面initget中禁止
(t nil)       ;正常输入,向下继续
)
...

自贡黄明儒 发表于 2013-10-23 16:11:29

;;我是这样处理的,仅供参考
;;1 取得线长or点取
(defun GetCurveLeng (/ ent curve-obj leng en)
    (vl-load-com)
    (if        (setq ent (entsel "\n>>>>>>拾取线条、尺寸、[回车]"))
      (progn
        (setq en (entget (car ent)))
        (cond
          ((wcmatch (LI_item 0 en) "DIMENSION")
           (if (or (wcmatch (LI_item 1 en) "*<>*") (= (LI_item 1 en) ""))
             (setq leng (LI_item 42 en))
             (setq leng (LI_item 1 en))
           )
          )
          (T
           (if (= (cdr (assoc 0 en)) "INSERT")
             (setq ent (nentselp "" (cadr ent)))
           )
           (setq curve-obj (vlax-ename->vla-object (car ent)))
           (redraw (car ent) 3)
           (setq leng (vlax-curve-getDistAtParam
                        curve-obj
                        (vlax-curve-getEndParam curve-obj)
                      )
           )
          )
        )
      )
      (progn
        (initget 1)
        (setq leng (getpoint "\n 拾取型材一端点"))
        (setq leng (getdist leng "\n 拾取型材另一端点\n\n"))
      )
    )
    (setq leng (rtos leng 2 0))
)

fwdll 发表于 2013-10-23 18:58:50

自贡黄明儒 发表于 2013-10-23 16:11 static/image/common/back.gif
;;我是这样处理的,仅供参考

这种方法好,谢了大家。

fl202 发表于 2013-10-25 09:44:24

这说白了就是走不同的路,达到同一目标。

这种最好的方式就是用DCL,放三个按钮即可!

寒林清远 发表于 2013-10-25 11:02:33

fl202 发表于 2013-10-25 09:44 static/image/common/back.gif
这说白了就是走不同的路,达到同一目标。

这种最好的方式就是用DCL,放三个按钮即可!

是的,DCL最好!
页: [1]
查看完整版本: 如何实现多种选择方式?比如可以选取一条直线,或者输入两个点。