乐筑天下

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

[编程交流] 在多段线上绘制矩形

[复制链接]

1

主题

1

帖子

0

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-6 09:05:34 | 显示全部楼层 |阅读模式
您好,如果这可以通过lisp实现,我需要您的帮助。我有一条样线,我想在它的两个连续顶点上画一个矩形,高度给定,在图纸上是X。多段线可能有4到无限个顶点。我不管生成的矩形是在多段线/多边形的内部还是外部。
 
或者单击多段线的一段,它将创建具有给定高度的矩形。所以我只需要点击每个部分。也可以将高度存储为变量,这样我就不必再次输入,除非高度再次更改。就像我们进行偏移一样,最后的偏移距离也会被存储,并且可以通过按enter键再次调用。谢谢大家,祝你们度过愉快的一天。
100539g0xncs7c2sqs2bjk.jpg
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:28:34 | 显示全部楼层
欢迎来到论坛。
 
这是我刚刚为您编写的代码。如果多段线在内部,而您希望它们在外部绘制,那么只需调用命令reverse并在
源多段线。
 
  1. (defun c:TesT (/ e lst i j d p1 p2 ang p3 p4)
  2. ;;=====   TharwaT  =====;;
  3. ;;===== 31.07.2011 =====;;
  4. (if (not x)
  5.    (setq x 1.0)
  6. )
  7. (if
  8.    (and
  9.      (setq e (car (entsel "\n Select a polyline : ")))
  10.      (member (cdr (assoc 0 (entget e)))
  11.              '("LWPOLYLINE" "POLYLINE")
  12.      )
  13.      (setq
  14.        x (cond ((getdist (strcat "\n Specify the Depth distance <"
  15.                                  (rtos x 2)
  16.                                  "> :"
  17.                          )
  18.                 )
  19.                )
  20.                (atoi x)
  21.          )
  22.      )
  23.    )
  24.     (progn
  25.       (setq lst (vl-remove-if-not
  26.                   (function (lambda (x)
  27.                               (eq (car x) 10)
  28.                             )
  29.                   )
  30.                   (entget e)
  31.                 )
  32.       )
  33.       (setq i 0
  34.             j 1
  35.       )
  36.       (repeat (1- (length lst))
  37.         (setq
  38.           d (distance
  39.               (setq p1 (vlax-curve-getpointatparam e i))
  40.               (setq p2 (vlax-curve-getpointatparam e (setq i (1+ i))))
  41.             )
  42.         )
  43.         (setq ang (angle p1 p2))
  44.         (entmakex
  45.           (list '(0 . "LWPOLYLINE")
  46.                 '(100 . "AcDbEntity")
  47.                 '(100 . "AcDbPolyline")
  48.                 '(90 . 5)
  49.                 '(70 . 1)
  50.                 (cons 10 p1)
  51.                 (cons 10 p2)
  52.                 (cons 10 (setq p3 (polar p2 (- ang 1.5708) x)))
  53.                 (cons 10 (setq p4 (polar p3 (angle p2 p1) d)))
  54.           )
  55.         )
  56.       )
  57.     )
  58.     (princ
  59.       "\n You missed the Polyline or it's not a Polyline !! ... "
  60.     )
  61. )
  62. (princ)
  63. )

 
塔瓦特
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:37:31 | 显示全部楼层
除了“撤消”选项外,该选项在处理矩形多段线(正方形)时更好一些。
 
  1. (defun c:TesT (/ *error* acdoc e lst i j l d p1 p2 ang p3 p4)
  2. ;;=====   TharwaT  =====;;
  3. ;;===== 31.07.2011 =====;;
  4. (vl-load-com)
  5. (defun *error* (msg)
  6.    (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  7.        (princ (strcat "\n** Error: " msg " **"))
  8.    )
  9.    (princ)
  10. )
  11. (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  12. (if (not x)
  13.    (setq x 1.0)
  14. )
  15. (if
  16.    (and
  17.      (setq e (car (entsel "\n Select a polyline : ")))
  18.      (member (cdr (assoc 0 (entget e)))
  19.              '("LWPOLYLINE" "POLYLINE")
  20.      )
  21.      (setq
  22.        x (cond ((getdist (strcat "\n Specify the Depth distance <"
  23.                                  (rtos x 2)
  24.                                  "> :"
  25.                          )
  26.                 )
  27.                )
  28.                (atoi x)
  29.          )
  30.      )
  31.    )
  32.     (progn
  33.       (vla-StartUndoMark acdoc)
  34.       (setq lst (vl-remove-if-not
  35.                   (function (lambda (x)
  36.                               (eq (car x) 10)
  37.                             )
  38.                   )
  39.                   (entget e)
  40.                 )
  41.       )
  42.       (setq i 0
  43.             j 1
  44.       )
  45.       (if (not (eq 4 (setq l (length lst))))
  46.         (setq l (1- l))
  47.       )
  48.       (repeat l
  49.         (setq
  50.           d (distance
  51.               (setq p1 (vlax-curve-getpointatparam e i))
  52.               (setq p2 (vlax-curve-getpointatparam e (setq i (1+ i))))
  53.             )
  54.         )
  55.         (setq ang (angle p1 p2))
  56.         (entmakex
  57.           (list '(0 . "LWPOLYLINE")
  58.                 '(100 . "AcDbEntity")
  59.                 '(100 . "AcDbPolyline")
  60.                 '(90 . 5)
  61.                 '(70 . 1)
  62.                 (cons 10 p1)
  63.                 (cons 10 p2)
  64.                 (cons 10 (setq p3 (polar p2 (- ang 1.5708) x)))
  65.                 (cons 10 (setq p4 (polar p3 (angle p2 p1) d)))
  66.           )
  67.         )
  68.       )
  69.       (vla-EndUndoMark acdoc)
  70.     )
  71.     (princ
  72.       "\n You missed the Polyline or it's not a Polyline !! ... "
  73.     )
  74. )
  75. (princ)
  76. )
Tharwat
回复

使用道具 举报

6

主题

249

帖子

247

银币

初来乍到

Rank: 1

铜币
30
发表于 2022-7-6 09:52:39 | 显示全部楼层
 
有趣的是,它只适用于LWpolyline,而不适用于普林斯?如果我做错了什么呢。如果我将Pline转换为LW,那么它可以工作。
TIA
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-6 09:57:49 | 显示全部楼层
 
我相信你指的是三维多边形而不是多段线。所以这不包括在内。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 10:07:30 | 显示全部楼层
有一段时间了,下面是另一个纯香草AutoLISP版本,用于LWPolylines:
 
  1. (defun c:doit ( / angle0 angle1 angle2 bulge elist entity point1 point2 selection xsize ) ;; Lee Mac 2011
  2.    (initget 1)
  3.    (setq xsize (getdist "\nHeight: "))
  4.    (if (setq selection (ssget '((0 . "LWPOLYLINE"))))
  5.        (while (setq entity (ssname selection 0))
  6.            (setq elist (entget entity))
  7.            (if (= 1 (logand 1 (cdr (assoc 70 elist))))
  8.                (setq elist (append elist (list (assoc 10 elist))))
  9.            )
  10.            (repeat  (+ (cdr (assoc 90 elist)) (logand 1 (cdr (assoc 70 elist))) -1)
  11.                (setq point1 (assoc 10 elist)
  12.                      elist  (cdr (member point1 elist))
  13.                      point2 (assoc 10 elist)
  14.                      bulge  (* 2.0 (atan (cdr (assoc 42 elist))))
  15.                      angle0 (angle (cdr point1) (cdr point2))
  16.                      angle1 (- angle0 (+ (/ pi 2.) bulge))
  17.                      angle2 (- angle0 (- (/ pi 2.) bulge))
  18.                )
  19.                (entmakex
  20.                    (list
  21.                        (cons 0 "LWPOLYLINE")
  22.                        (cons 100 "AcDbEntity")
  23.                        (cons 100 "AcDbPolyline")
  24.                        (cons 90 4)
  25.                        (cons 70 0)
  26.                        point1
  27.                        (cons 10 (polar (cdr point1) angle1 xsize))
  28.                        (assoc 42 elist)
  29.                        (cons 10 (polar (cdr point2) angle2 xsize))
  30.                        point2
  31.                        (assoc 210 elist)
  32.                    )
  33.                )
  34.            )
  35.            (ssdel entity selection)
  36.        )
  37.    )
  38.    (princ)
  39. )

 
应适用于所有UCS/视图和LW多段线弧。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-7 08:27 , Processed in 0.423856 second(s), 67 queries .

© 2020-2025 乐筑天下

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