乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 132|回复: 9

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

[复制链接]

7

主题

55

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2003-11-23 02:25:00 | 显示全部楼层 |阅读模式
在命令行键入PE,回显“PEDIT 选择多段线或 [多条(M)]”,此时可以选取多段线对象,也可以键入“M”,用LISP编程,如何实现这种混合输入控制?请帮忙指点,谢谢!
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2003-11-23 09:05:00 | 显示全部楼层
这并不是混合输入控制,这只是CAD命令的简化,在acad.pgp文件里设置及修改.很容易看明白的.
混合输入控制只有在程序运行时要求用户输入时使用,查看INITGET函数及GETXXX函数
回复

使用道具 举报

7

主题

55

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2003-11-23 10:12:00 | 显示全部楼层
谢谢!
不过,看来我没将问题说清楚,我说要问的是:在程序运行时要求用户输入时,既允许用户选取某个对象,又允许用户键入一个字符改变运行流程,就像PEDIT开始时一样。这种情况如何用LISP编程?
回复

使用道具 举报

21

主题

216

帖子

9

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
305
发表于 2003-11-23 10:23:00 | 显示全部楼层
这是一个对多段线进行编辑的程序
原来是因为有很多的顶点要进行删除,另外要增加一些顶点,用pedit很费时间,进行了修改。
主要部分
(SETQ modify_mode "Add")                          ;预设模式
(WHILE (/= modify_mode "eXit")
    (PRINC (STRCAT "\n\tAdd增加点/Del删除点/Move移动点/eXit退出:"
           )
    )
    (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.                            )
  16.                 )
  17.                 (setq data (grread nil))
  18.                 (cond
  19.                         ((= 2 (car data))
  20.                          (cond
  21.                                  ((= 120 (cadr data))
  22.                                   (setq modify_mode "eXit")
  23.                                  )
  24.                                  ((or (= 65 (cadr data)) (= 97 (cadr data)))
  25.                                   (setq modify_mode "Add")
  26.                                  )
  27.                                  ((or (= 68 (cadr data)) (= 100 (cadr data)))
  28.                                   (setq modify_mode "Del")
  29.                                  )
  30.                                  ((or (= 77 (cadr data)) (= 109 (cadr data)))
  31.                                   (setq modify_mode "Move")
  32.                                  )
  33.                          )
  34.                         )
  35.                         ((= 3 (car data))
  36.                          ;;与线上点最小距离
  37.                          (setq point1 (mapcar '* (cadr data) (list 1 1)))
  38.                          (setq points (car (get_points ent1)))
  39.                          (setq dist1 (distance point1 (car points))) ;与线上点最小距离
  40.                          (setq point_num1 0)                                  ;与线上点最小距离的点序号
  41.                          (setq num1 0)
  42.                          (foreach temp points
  43.                                  (if (> dist1 (distance temp point1))
  44.                                          (progn
  45.                                                  (setq dist1 (distance temp point1))
  46.                                                  (setq point_num1 num1)
  47.                                          )
  48.                                  )
  49.                                  (setq num1 (1+ num1))
  50.                          )
  51.                          ;;进行处理
  52.                          (setq data (entget ent1))
  53.                          (setq data_new (list))
  54.                          (setq num1 0)
  55.                          (foreach temp data
  56.                                  (if (and (= 10 (car temp)) (= num1 point_num1))
  57.                                          (cond
  58.                                                  ;;增加点
  59.                                                  ((= "Add" modify_mode)
  60.                                                   ;;angle1        前角
  61.                                                   ;;angle2        后角
  62.                                                   (if (= 0 point_num1)
  63.                                                           (setq angle1 (angle (nth (+ point_num1 1) points) (nth point_num1 points))) ;延长角的角度
  64.                                                           (setq angle1 (angle (nth point_num1 points) (nth (- point_num1 1) points)))
  65.                                                   )
  66.                                                   (if (= (- (length points) 1) point_num1)
  67.                                                           (setq angle2 (angle (nth (- point_num1 1) points) (nth point_num1 points))) ;延长角的角度
  68.                                                           (setq angle2 (angle (nth point_num1 points) (nth (+ point_num1 1) points)))
  69.                                                   )
  70.                                                   (setq angle3 (angle (nth point_num1 points) point1)) ;
  71.                                                   (setq angle1 (- angle1 angle3))
  72.                                                   (setq angle2 (- angle3 angle2))
  73.                                                   (if ( angle1 angle2) (> (+ angle1 angle2) (+ pi pi)))        ;外角时大于360度且前角大于后角
  74.                                                           )
  75.                                                           ;;条件为真时加在最近点前面
  76.                                                           (setq        data_new (append data_new
  77.                                                                                                          (list (append (list 10) point1))
  78.                                                                                                          (list (assoc '40 data) (assoc '41 data) (assoc '42 data))
  79.                                                                                                          (list temp)
  80.                                                                                          )
  81.                                                           )
  82.                                                           ;;条件为假时加在最近点后面
  83.                                                           (setq        data_new (append data_new
  84.                                                                                                          (list temp)
  85.                                                                                                          (list (assoc '40 data) (assoc '41 data) (assoc '42 data))
  86.                                                                                                          (list (append (list 10) point1))
  87.                                                                                          )
  88.                                                           )
  89.                                                   )
  90.                                                  )
  91.                                                  ;;移动点
  92.                                                  ((= "Move" modify_mode)
  93.                                                   (setq data_new (append data_new (list (append (list 10) point1))))
  94.                                                  )
  95.                                                  ;;删除点
  96.                                                  ;;就不用处理
  97.                                          )
  98.                                          (setq data_new (append data_new (list temp)))
  99.                                  )
  100.                                  (if (= 10 (car temp))
  101.                                          (setq num1 (1+ num1))
  102.                                  )
  103.                          )
  104.                          (if (not (entmod data_new))
  105.                                  (*error* "不能更新实体数据!")
  106.                          )
  107.                         )
  108.                         ((= 12 (car data))
  109.                          (setq modify_mode "eXit")
  110.                         )
  111.                 )
  112.         )
  113.         (princ)
  114. )
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2003-11-23 10:54:00 | 显示全部楼层

我已经说得很明白了,仔细看看,最后说了查看initget函数和getxxx函数,这里你看getpoint函数,是你自己没有去看而已
回复

使用道具 举报

7

主题

55

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2003-11-24 00:13:00 | 显示全部楼层
谢谢 lockmyeye!好像明白了!
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2003-11-24 08:24:00 | 显示全部楼层

让你看函数,你就是不愿意看,非让人把代码给你写出来吗?
注:lockmyeye的方法与你说的混合输入是完全不同的两种方法,你使用时会发现,如果用键盘输入,你lockmyeye输入后不需要回车,而pedit第一项如果输入m必须回车才行的。。。
回复

使用道具 举报

36

主题

201

帖子

8

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
345
发表于 2003-11-24 08:26:00 | 显示全部楼层
同意飞哥的观点!有些问题不要混淆了,呵呵
回复

使用道具 举报

7

主题

55

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
83
发表于 2003-11-24 13:17:00 | 显示全部楼层
谢谢各位的指点!
关于GETXXX以、INITGET的说明,还有ENTSEL等函数的说明,我看了!可是各个GETXXX函数都只针对某类输入,如GETSTRING只能输入字符串,而ENTSEL只能选取对象。我就想有没有某个函数,既可以让你选取对象,又可以让你输入参数。
问题的来由是这样:给两并排在一起的沟渠、道路编号,先选取沟渠线在其上方标注沟渠编号,后改变标注方位,再选取道路线在其下方标注编号。
谢谢LOCKMYEYE,是因为LOCKMYEYE的程序提醒我去看更多的函数!因为初学LISP,确实会缺乏思路,我所需要的正是基本方法和思路!
回复

使用道具 举报

37

主题

297

帖子

15

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
449
发表于 2003-11-24 14:23:00 | 显示全部楼层

entsel是支持initget的。但ssget不支持。
所以,点选可以,如pedit命令那个功能。
但多选不行,象ma命令的那个功能就有点麻烦。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-7 04:47 , Processed in 1.654357 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表