明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2836|回复: 12

[求助]如何实现类似PE的混合输入控制?

  [复制链接]
发表于 2003-11-23 02:25:00 | 显示全部楼层 |阅读模式
在命令行键入PE,回显“PEDIT 选择多段线或 [多条(M)]”,此时可以选取多段线对象,也可以键入“M”,用LISP编程,如何实现这种混合输入控制?请帮忙指点,谢谢!
发表于 2003-11-23 09:05:00 | 显示全部楼层
这并不是混合输入控制,这只是CAD命令的简化,在acad.pgp文件里设置及修改.很容易看明白的.

混合输入控制只有在程序运行时要求用户输入时使用,查看INITGET函数及GETXXX函数
 楼主| 发表于 2003-11-23 10:12:00 | 显示全部楼层
谢谢!
不过,看来我没将问题说清楚,我说要问的是:在程序运行时要求用户输入时,既允许用户选取某个对象,又允许用户键入一个字符改变运行流程,就像PEDIT开始时一样。这种情况如何用LISP编程?
发表于 2003-11-23 10:23:00 | 显示全部楼层
这是一个对多段线进行编辑的程序
原来是因为有很多的顶点要进行删除,另外要增加一些顶点,用pedit很费时间,进行了修改。

主要部分

(SETQ modify_mode "Add")                          ;预设模式
(WHILE (/= modify_mode "eXit")
    (PRINC (STRCAT "\n\tAdd增加点/Del删除点/Move移动点/eXit退出<"
                   (COND ((= "Move" modify_mode) "Move移动点")
                         ((= "Add" modify_mode) "Add增加点")
                         ((= "Del" modify_mode) "Del删除点")
                   )
                   ">:"
           )
    )
    (SETQ data (GRREAD nil))
    (COND ((= 2 (CAR data))                       ;键盘输入
           (COND ((= 120 (CADR data)) (SETQ modify_mode "eXit"))
                 ((OR (= 65 (CADR data)) (= 97 (CADR data))) (SETQ modify_mode "Add"))
                 ((OR (= 68 (CADR data)) (= 100 (CADR data))) (SETQ modify_mode "Del"))
                 ((OR (= 77 (CADR data)) (= 109 (CADR data))) (SETQ modify_mode "Move"))
           )
          )
          ((= 3 (CAR data))                       ;左键
           (. . .)
          )
          ((= 12 (CAR data))                      ;右键
           (SETQ modify_mode "eXit")
          )
    )
)




  1. ;;;7/23/03
  2. ;;;复合线顶点编辑工具
  3. (load "get_ent_points")
  4. (defun c:pedit_ev( / angle1 angle2 angle3 data data_new dist1 ent1 modify_mode num1 point_num1 point1 points)
  5.         ;;选取一条多段线
  6.         (while (progn
  7.                            (while (not (setq ent1 (car (entsel "\n\t选择要编辑的多段线:")))))
  8.                            (not (wcmatch (cdr (assoc '0 (entget ent1))) "*POLYLINE"))
  9.                    )
  10.                 (princ "\n\t选择的不是多段线。")
  11.         )
  12.         (setq modify_mode "Add")
  13.         (while (/= modify_mode "eXit")
  14.                 (princ (strcat "\n\tAdd增加点/Del删除点/Move移动点/eXit退出<"
  15.                                            (cond ((= "Move" modify_mode) "Move移动点")
  16.                                                          ((= "Add" modify_mode) "Add增加点")
  17.                                                          ((= "Del" modify_mode) "Del删除点")
  18.                                            )
  19.                                            ">:"
  20.                            )
  21.                 )
  22.                 (setq data (grread nil))
  23.                 (cond
  24.                         ((= 2 (car data))
  25.                          (cond
  26.                                  ((= 120 (cadr data))
  27.                                   (setq modify_mode "eXit")
  28.                                  )
  29.                                  ((or (= 65 (cadr data)) (= 97 (cadr data)))
  30.                                   (setq modify_mode "Add")
  31.                                  )
  32.                                  ((or (= 68 (cadr data)) (= 100 (cadr data)))
  33.                                   (setq modify_mode "Del")
  34.                                  )
  35.                                  ((or (= 77 (cadr data)) (= 109 (cadr data)))
  36.                                   (setq modify_mode "Move")
  37.                                  )
  38.                          )
  39.                         )
  40.                         ((= 3 (car data))

  41.                          ;;与线上点最小距离
  42.                          (setq point1 (mapcar '* (cadr data) (list 1 1)))
  43.                          (setq points (car (get_points ent1)))
  44.                          (setq dist1 (distance point1 (car points))) ;与线上点最小距离
  45.                          (setq point_num1 0)                                  ;与线上点最小距离的点序号
  46.                          (setq num1 0)
  47.                          (foreach temp points
  48.                                  (if (> dist1 (distance temp point1))
  49.                                          (progn
  50.                                                  (setq dist1 (distance temp point1))
  51.                                                  (setq point_num1 num1)
  52.                                          )
  53.                                  )
  54.                                  (setq num1 (1+ num1))
  55.                          )
  56.                          ;;进行处理
  57.                          (setq data (entget ent1))
  58.                          (setq data_new (list))
  59.                          (setq num1 0)
  60.                          (foreach temp data
  61.                                  (if (and (= 10 (car temp)) (= num1 point_num1))
  62.                                          (cond
  63.                                                  ;;增加点
  64.                                                  ((= "Add" modify_mode)
  65.                                                   ;;angle1        前角
  66.                                                   ;;angle2        后角
  67.                                                   (if (= 0 point_num1)
  68.                                                           (setq angle1 (angle (nth (+ point_num1 1) points) (nth point_num1 points))) ;延长角的角度
  69.                                                           (setq angle1 (angle (nth point_num1 points) (nth (- point_num1 1) points)))
  70.                                                   )
  71.                                                   (if (= (- (length points) 1) point_num1)
  72.                                                           (setq angle2 (angle (nth (- point_num1 1) points) (nth point_num1 points))) ;延长角的角度
  73.                                                           (setq angle2 (angle (nth point_num1 points) (nth (+ point_num1 1) points)))
  74.                                                   )
  75.                                                   (setq angle3 (angle (nth point_num1 points) point1)) ;

  76.                                                   (setq angle1 (- angle1 angle3))
  77.                                                   (setq angle2 (- angle3 angle2))

  78.                                                   (if (< angle1 0)
  79.                                                           (setq angle1 (+ angle1 pi pi))
  80.                                                   )
  81.                                                   (if (< angle2 0)
  82.                                                           (setq angle2 (+ angle2 pi pi))
  83.                                                   )
  84.                                                   (if (or (and (< angle1 angle2) (< (+ angle1 angle2) (+ pi pi)))        ;内角时小于360度且前角小于后角
  85.                                                                   (and (> angle1 angle2) (> (+ angle1 angle2) (+ pi pi)))        ;外角时大于360度且前角大于后角
  86.                                                           )
  87.                                                           ;;条件为真时加在最近点前面
  88.                                                           (setq        data_new (append data_new
  89.                                                                                                          (list (append (list 10) point1))
  90.                                                                                                          (list (assoc '40 data) (assoc '41 data) (assoc '42 data))
  91.                                                                                                          (list temp)
  92.                                                                                          )
  93.                                                           )
  94.                                                           ;;条件为假时加在最近点后面
  95.                                                           (setq        data_new (append data_new
  96.                                                                                                          (list temp)
  97.                                                                                                          (list (assoc '40 data) (assoc '41 data) (assoc '42 data))
  98.                                                                                                          (list (append (list 10) point1))
  99.                                                                                          )
  100.                                                           )
  101.                                                   )
  102.                                                  )
  103.                                                  ;;移动点
  104.                                                  ((= "Move" modify_mode)
  105.                                                   (setq data_new (append data_new (list (append (list 10) point1))))
  106.                                                  )
  107.                                                  ;;删除点
  108.                                                  ;;就不用处理
  109.                                          )
  110.                                          (setq data_new (append data_new (list temp)))
  111.                                  )
  112.                                  (if (= 10 (car temp))
  113.                                          (setq num1 (1+ num1))
  114.                                  )
  115.                          )
  116.                          (if (not (entmod data_new))
  117.                                  (*error* "不能更新实体数据!")
  118.                          )
  119.                         )
  120.                         ((= 12 (car data))
  121.                          (setq modify_mode "eXit")
  122.                         )
  123.                 )
  124.         )
  125.         (princ)
  126. )
发表于 2003-11-23 10:54:00 | 显示全部楼层
EPISODE发表于2003-11-23 10:12:00谢谢!
不过,看来我没将问题说清楚,我说要问的是:在程序运行时要求用户输入时,既允许用户选取某个对象,又允许用户键入一个字符改变运行流程,就像PEDIT开始时一样。这种情况如何用LISP编



我已经说得很明白了,仔细看看,最后说了查看initget函数和getxxx函数,这里你看getpoint函数,是你自己没有去看而已
 楼主| 发表于 2003-11-24 00:13:00 | 显示全部楼层
谢谢 lockmyeye!好像明白了!
发表于 2003-11-24 08:24:00 | 显示全部楼层
EPISODE发表于2003-11-24 0:13:00谢谢 lockmyeye!好像明白了!


让你看函数,你就是不愿意看,非让人把代码给你写出来吗?
注:lockmyeye的方法与你说的混合输入是完全不同的两种方法,你使用时会发现,如果用键盘输入,你lockmyeye输入后不需要回车,而pedit第一项如果输入m必须回车才行的。。。
发表于 2003-11-24 08:26:00 | 显示全部楼层
同意飞哥的观点!有些问题不要混淆了,呵呵
 楼主| 发表于 2003-11-24 13:17:00 | 显示全部楼层
谢谢各位的指点!

关于GETXXX以、INITGET的说明,还有ENTSEL等函数的说明,我看了!可是各个GETXXX函数都只针对某类输入,如GETSTRING只能输入字符串,而ENTSEL只能选取对象。我就想有没有某个函数,既可以让你选取对象,又可以让你输入参数。

问题的来由是这样:给两并排在一起的沟渠、道路编号,先选取沟渠线在其上方标注沟渠编号,后改变标注方位,再选取道路线在其下方标注编号。

谢谢LOCKMYEYE,是因为LOCKMYEYE的程序提醒我去看更多的函数!因为初学LISP,确实会缺乏思路,我所需要的正是基本方法和思路!
发表于 2003-11-24 14:23:00 | 显示全部楼层
EPISODE发表于2003-11-24 13:17:00谢谢各位的指点!
我就想有没有某个函数,既可以让你选取对象,又可以让你输入参数。


entsel是支持initget的。但ssget不支持。
所以,点选可以,如pedit命令那个功能。
但多选不行,象ma命令的那个功能就有点麻烦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 06:34 , Processed in 0.218183 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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