乐筑天下

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

[编程交流] Lisp创建“矩形选择”

[复制链接]

34

主题

123

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-7-5 17:26:45 | 显示全部楼层 |阅读模式
你好
 
我希望在lisp例程中包含autocad中存在的“矩形选择效果”。当你点击屏幕上的任何一个点,然后点击第二个点,这个效果就会出现。
 
类似这样的东西,但具有“矩形效果”而不是直线。
 
  1. (setq pt1 (getpoint "Select point 1... "))
  2. (setq pt2 (getpoint pt1 "Opposite corner... "))
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 17:33:57 | 显示全部楼层
  1. (setq pt2 (getcorner pt1 "\nOpposite corner... "))
回复

使用道具 举报

34

主题

123

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-7-5 17:44:05 | 显示全部楼层
谢谢塔瓦。
 
就这么简单。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 17:49:31 | 显示全部楼层
是 啊
 
不客气。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 17:56:18 | 显示全部楼层
决定进行日常练习:
  1. (defun C:test ( / oldclp pt1 LoopFlag UserIn TypeUserIn ReturnChar vsz SS SSn in1 in2 )
  2. (sssetfirst nil nil)
  3. (while T
  4.         (if (setq pt1 (getpoint "\nSpecify first point" ))
  5.                 (progn
  6.                         (setq oldclp (getvar 'clipromptlines))
  7.                         (setvar 'clipromptlines 1)
  8.                         (redraw)
  9.                         (princ "\nSpecify second point: ")
  10.                         (setq LoopFlag T)
  11.                         (while LoopFlag
  12.                                 (setq UserIn (grread T))
  13.                                 (setq TypeUserIn (car UserIn))
  14.                                 (setq ReturnChar (cadr UserIn))
  15.                                 (cond
  16.                                         ((= TypeUserIn 5) ; cursor is moved
  17.                                                 (princ "\nSpecify second point: ")
  18.                                                 (setq vsz (* (getvar 'viewsize) 10))
  19.                                                 (or
  20.                                                         (setq in1 (inters pt1 (polar pt1 (angtof "90") vsz) ReturnChar (polar ReturnChar (angtof "0") vsz)))
  21.                                                         (setq in1 (inters pt1 (polar pt1 (angtof "90") vsz) ReturnChar (polar ReturnChar (angtof "180") vsz)))
  22.                                                         (setq in1 (inters pt1 (polar pt1 (angtof "270") vsz) ReturnChar (polar ReturnChar (angtof "0") vsz)))
  23.                                                         (setq in1 (inters pt1 (polar pt1 (angtof "270") vsz) ReturnChar (polar ReturnChar (angtof "180") vsz)))
  24.                                                 )
  25.                                                 (or
  26.                                                         (setq in2 (inters pt1 (polar pt1 (angtof "0") vsz) ReturnChar (polar ReturnChar (angtof "90") vsz)))
  27.                                                         (setq in2 (inters pt1 (polar pt1 (angtof "0") vsz) ReturnChar (polar ReturnChar (angtof "270") vsz)))
  28.                                                         (setq in2 (inters pt1 (polar pt1 (angtof "180") vsz) ReturnChar (polar ReturnChar (angtof "90") vsz)))
  29.                                                         (setq in2 (inters pt1 (polar pt1 (angtof "180") vsz) ReturnChar (polar ReturnChar (angtof "270") vsz)))
  30.                                                 )
  31.                                                 (if (and pt1 in1 in2 ReturnChar)
  32.                                                         (progn
  33.                                                                 (redraw)
  34.                                                                 (grvecs
  35.                                                                         (list
  36.                                                                                 1 pt1 in1
  37.                                                                                 1 pt1 in2
  38.                                                                                 1 ReturnChar in1
  39.                                                                                 1 ReturnChar in2
  40.                                                                         )
  41.                                                                 )
  42.                                                         )
  43.                                                         (redraw)
  44.                                                 )
  45.                                         )
  46.                                         ((= TypeUserIn 3) ; LMB is pressed
  47.                                                 (if oldclp (setvar 'clipromptlines oldclp))
  48.                                                 (setq LoopFlag nil)
  49.                                                 (if SS (progn (setq SSn SS) (sssetfirst nil nil)))
  50.                                                 (if (setq SS (ssget "_CP" (list pt1 in1 ReturnChar in2)))
  51.                                                         (progn
  52.                                                                 (setq SS (acet-ss-union (list SSn SS))) ; requires express tools!
  53.                                                                 (sssetfirst nil SS)
  54.                                                         )
  55.                                                         (setq SS nil)
  56.                                                 )
  57.                                         )
  58.                                         (T nil)
  59.                                 );cond                       
  60.                         );while LoopFlag
  61.                 )
  62.         )
  63. )
  64. (princ)
  65. )

这是基于我从塔瓦特、李·麦克、卡布那里学到的。。。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 17:57:39 | 显示全部楼层
 
快一点
 
  1. (defun c:sel (/ p1 gr p2 p3)
  2. ;; Tharwat - Emulate cursor selection set        ;;
  3. (if (setq p1 (getpoint "\n First point :"))
  4.    (while
  5.      (eq (car (setq gr (grread t 15 0))) 5)
  6.       (redraw)
  7.       (grvecs (list -3 p1 (setq p2 (list (car (cadr gr)) (cadr p1) 0.)) p2 (cadr gr)
  8.                            (cadr gr)  (setq p3 (list (car p1) (cadr (cadr gr)) 0.))
  9.                            p3
  10.                            p1
  11.               )
  12.       )
  13.    )
  14. )
  15. (redraw)
  16. (princ)
  17. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:06:52 | 显示全部楼层
 
不错!
现在我看到我可能不得不使用X和Y值来找到pt2和pt3。不过,我的(inters)方法也可以作为一种替代方法。
此外,虽然我正在阅读帮助文件,但我不知道GRVEC可以这样工作。
...你的代码要短得多
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:12:40 | 显示全部楼层
始终尝试为用户提供一个选项,以选择采用哪种方式或安全地取消程序,但在您的程序中,您强制用户按ESC按钮以结束程序。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:17:35 | 显示全部楼层
 
是的,我知道。。这只是我的一个习惯(在我决定发布之前,我在ACAD中多次测试代码的行为)。。因为我懒得重新运行命令。
回复

使用道具 举报

34

主题

123

帖子

90

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
175
发表于 2022-7-5 18:22:59 | 显示全部楼层
再次感谢Tharwat。非常有帮助。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:08 , Processed in 0.375946 second(s), 72 queries .

© 2020-2025 乐筑天下

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