乐筑天下

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

[编程交流] 使用Perpen绘制矩形

[复制链接]

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:34:51 | 显示全部楼层 |阅读模式
大家好,
 
我对编写lisp很陌生,但我试图编写一个lisp,它可以帮助我使用2条多段线的垂直参考点绘制一个矩形。附件是我想如何画它的图片。仅使用onsnap很难绘制矩形。我想知道是否可以单击多段线的两个端点和另一个方向的多段线来绘制矩形。
183455cjml08ov08n8l050.jpg
183457ddz5cddwsqwc4smc.jpg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 17:46:16 | 显示全部楼层
试试这个,让我知道:
  1. (defun c:Test (/ s ss a b c d ins lst)
  2. ;;                 Tharwat - Date: 21.June.2016                ;;
  3. ;; Draw closed LWpolyline from the two selected        ;;
  4. ;; LWpolylines and they must be straight.                ;;
  5. (defun _straight-p (e / l q a)
  6.    (setq l (mapcar 'cdr
  7.                    (vl-remove-if-not
  8.                      '(lambda (p) (= (car p) 10))
  9.                      (entget (ssname e 0))
  10.                      )
  11.                    )
  12.          q (car l)
  13.          a (angle q (cadr l))
  14.          )
  15.    (apply
  16.      'and
  17.      (mapcar
  18.        '(lambda (pt) (and (equal (angle q pt) a 1e-4) (setq q pt)))
  19.        (cdr l)
  20.        )
  21.      )
  22.    )
  23. (princ "\nSelect 1st LWpolyline :")
  24. (if (and (setq s (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))
  25.           (_straight-p s)
  26.           (princ "\nSelect 2nd LWpolyline :")
  27.           (setq ss (ssget "_+.:S:E" '((0 . "LWPOLYLINE"))))
  28.           (_straight-p ss)
  29.           (setq a (vlax-curve-getstartpoint (ssname s 0))
  30.                 b (vlax-curve-getendpoint (ssname s 0))
  31.                 c (vlax-curve-getstartpoint (ssname ss 0))
  32.                 d (vlax-curve-getendpoint (ssname ss 0))
  33.                 )
  34.           (setq ins (inters a b c d))
  35.           )
  36.    (progn
  37.      (mapcar '(lambda (j k)
  38.                 (setq lst (cons (list (polar a j k)
  39.                                       (polar b j k)
  40.                                       )
  41.                                 lst
  42.                                 )
  43.                       )
  44.                 )
  45.              (list (angle d c) (angle c d))
  46.              (list (distance ins c) (distance ins d))
  47.              )
  48.      (setq lst (apply 'append lst))
  49.      (entmake (list '(0 . "LWPOLYLINE")
  50.                     '(100 . "AcDbEntity")
  51.                     '(100 . "AcDbPolyline")
  52.                     '(90 . 4)
  53.                     '(70 . 1)
  54.                     (cons 10 (car lst))
  55.                     (cons 10 (caddr lst))
  56.                     (cons 10 (last lst))
  57.                     (cons 10 (cadr lst))
  58.                     )
  59.               )
  60.      )
  61.    (princ "\nLWpolylines must be straight and crossed !")
  62.    )
  63. (princ)
  64. )(vl-load-com)
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 17:55:25 | 显示全部楼层
下面是另一种书写方式:
  1. (defun c:myrect ( / int pl1 pl2 pt1 pt2 pt3 pt4 )
  2.    (if (and (setq pl1 (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (90 . 2))))
  3.             (setq pl2 (ssget "_+.:E:S" '((0 . "LWPOLYLINE") (90 . 2))))
  4.        )
  5.        (if (setq pl1 (entget (ssname pl1 0))
  6.                  pl2 (entget (ssname pl2 0))
  7.                  pt1 (cdr (assoc 10 pl1))
  8.                  pt2 (cdr (assoc 10 (reverse pl1)))
  9.                  pt3 (cdr (assoc 10 pl2))
  10.                  pt4 (cdr (assoc 10 (reverse pl2)))
  11.                  int (inters pt1 pt2 pt3 pt4)
  12.            )
  13.            (entmake
  14.                (list
  15.                   '(000 . "LWPOLYLINE")
  16.                   '(100 . "AcDbEntity")
  17.                   '(100 . "AcDbPolyline")
  18.                   '(090 . 4)
  19.                   '(070 . 1)
  20.                    (cons 10 (mapcar '+ pt1 (mapcar '- pt3 int)))
  21.                    (cons 10 (mapcar '+ pt1 (mapcar '- pt4 int)))
  22.                    (cons 10 (mapcar '+ pt2 (mapcar '- pt4 int)))
  23.                    (cons 10 (mapcar '+ pt2 (mapcar '- pt3 int)))
  24.                )
  25.            )
  26.            (princ "\nLines do not intersect.")
  27.        )
  28.    )
  29.    (princ)
  30. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 18:04:52 | 显示全部楼层
当所有坐标都在同一条线上时,我的工作是在一条多段线的多个顶点上进行。
回复

使用道具 举报

4

主题

305

帖子

225

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
97
发表于 2022-7-5 18:17:44 | 显示全部楼层
为了扩展李的优秀作品,我想做一个更通用的版本,允许选择任何类型的线段,并创建矩形。因此,使用李的“SelectIf”和我从Stig Madsen的theSwamp中获得的另一段代码:
 
 
请随意撕下它,使其更高效,但我认为这可能对应用程序更通用。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

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

铜币
325
发表于 2022-7-5 18:22:45 | 显示全部楼层
干得好,普肯维尔!
我通常使用Stefan\u BMR中名为“get\u ends”的子函数来选取直线/普林线的段,但现在我将分析您发布的代码。
回复

使用道具 举报

4

主题

305

帖子

225

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
97
发表于 2022-7-5 18:27:28 | 显示全部楼层
编辑了我上面的程序,只过滤直线和多段线,因为样条曲线、多段线和连接线会引起问题。
回复

使用道具 举报

1

主题

2

帖子

1

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 18:41:40 | 显示全部楼层
非常感谢你们。没想到我会这么快得到回复。非常感谢你。我明白为什么我以前的代码不起作用了。从你们身上学到了很多。再次感谢你。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 04:20 , Processed in 0.372623 second(s), 71 queries .

© 2020-2025 乐筑天下

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