乐筑天下

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

[编程交流] 用多边形绘制圆

[复制链接]

26

主题

145

帖子

122

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
130
发表于 2022-7-5 22:28:59 | 显示全部楼层 |阅读模式
嗨,亲爱的朋友。我需要一些帮助。
用多边形绘制圆
1步。选择闭合对象,必须是多边形。
2步骤。输入偏移距离。
3步骤。输入圆的直径。
4步骤。选择多边形的内部或外部。
 
如。
232901v06mvvhrdo36ppq4.png
 
例如,内部
232903klq2wq18rrrplbn7.png
 
例如,外部
232905glr33jrl6ljxzrpv.png
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 22:32:55 | 显示全部楼层
在偏移多边形的顶点处绘制圆,然后删除该偏移。。。
回复

使用道具 举报

0

主题

99

帖子

99

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 22:37:44 | 显示全部楼层
 
按照marko的建议试试这个
  1. (defun C:test (/ e sel d c p en)
  2. ;;;jdiala 09-06-14 Cadtutor.net ;;;
  3. (vl-load-com)
  4. (if
  5. (setq e
  6. (while
  7.    (not e)
  8.      (progn
  9.        (setq sel (entsel "\nSelect a polygon :"))
  10.        (cond
  11.          ( (= nul sel)
  12.            (princ "\nMissed! ")
  13.          )
  14.          ( (/= "LWPOLYLINE" (cdr (assoc 0 (entget (car sel)))))
  15.            (princ "\nInvalid selection. " )
  16.          )        
  17.          ( (and
  18.              (= "LWPOLYLINE" (cdr (assoc 0 (entget (car sel)))))
  19.              (= 1 (cdr (assoc 70 (entget (car sel)))))
  20.            )  
  21.            (setq e sel))
  22.          (t nil)
  23.        )
  24.      )
  25. )
  26. d (getdist "\nEnter offset distance :")
  27. c (/ (getdist "\nEnter diameter of circle :") 2.0)
  28. p (getpoint "\nPick side to offset :")
  29. )
  30. (progn
  31.   (command "_.offset" d e p "")
  32.   (mapcar
  33.     (function
  34.       (lambda (z)
  35.         (entmake
  36.           (list
  37.             (cons 0 "CIRCLE")
  38.             (cons 10 (cdr z))
  39.             (cons 40 c)
  40.           )
  41.         )
  42.         (entmake
  43.           (list
  44.             (cons 0 "LINE")
  45.             (cons 10 (polar (cdr z) 0 (* c 1.5)))
  46.             (cons 11 (polar (cdr z) pi (* c 1.5)))
  47.           )
  48.         )
  49.         (entmake
  50.           (list
  51.             (cons 0 "LINE")
  52.             (cons 10 (polar (cdr z) (/ pi 2.) (* c 1.5)))
  53.             (cons 11 (polar (cdr z) (* pi 1.5) (* c 1.5)))
  54.           )
  55.         )
  56.       )
  57.     )
  58.     (vl-remove-if-not
  59.       (function
  60.         (lambda (x)
  61.           (= 10 (car x))
  62.         )
  63.       )
  64.       (entget
  65.         (setq en (entlast))
  66.       )
  67.     )
  68.   )
  69.   (entdel en)
  70. )
  71. )
  72. (princ)
  73. )
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 22:42:07 | 显示全部楼层
动态程序
 
  1. (defun c:Test (/ _line _screw l lk s sn a p1 p2 gr ang o lst pts)
  2. ;;        Author : Tharwat Al Shoufi                ;;
  3. ;;        Date : 07.Sep.2014                        ;;
  4. ;; Dynamic draw a circle with a cross of line        ;;
  5. ;; at specific offset distance of a polyline        ;;
  6. (defun _line (p q) (entmakex (list '(0 . "LINE") (cons 62 4) (cons 10 p) (cons 11 q))))
  7. (defun _screw (pts r / lst 1p)
  8.    (mapcar '(lambda (p)
  9.               (setq lst (cons (entmakex (list '(0 . "CIRCLE") (cons 10 p) (cons 40 r))) lst)
  10.                     lst (cons (_line (setq 1p (polar p 0. (* r 1.2))) (polar p pi (* r 1.2))) lst)
  11.                     lst (cons (_line (setq 1p (polar p (* pi 1.5) (* r 1.2))) (polar p (* pi 0.5) (* r 1.2))) lst)
  12.               )
  13.             )
  14.            pts
  15.    )
  16.    lst
  17. )
  18. (if (eq 4 (logand 4 (cdr (assoc 70 (entget (tblobjname "LAYER" (getvar 'clayer)))))))
  19.    (progn (alert "Warning ! Current layer is Locked") (setq lk t))
  20. )
  21. (setq l (entlast))
  22. (if (and (not lk)
  23.           (setq s (entsel "\n Select a polyline :"))
  24.           (eq (cdr (assoc 0 (entget (setq sn (car s))))) "LWPOLYLINE")
  25.           (setq *dist* (cond ((getdist (strcat "\n Offset distance < "
  26.                                                (rtos (if *dist*
  27.                                                        *dist*
  28.                                                        (setq *dist* 1.0)
  29.                                                      )
  30.                                                      2
  31.                                                      2
  32.                                                )
  33.                                                " > :"
  34.                                        )
  35.                               )
  36.                              )
  37.                              (*dist*)
  38.                        )
  39.           )
  40.           (setq *rad* (cond ((getdist (strcat "\n Specify radius of Circles < "
  41.                                               (rtos (if *rad*
  42.                                                       *rad*
  43.                                                       (setq *rad* 1.0)
  44.                                                     )
  45.                                                     2
  46.                                                     2
  47.                                               )
  48.                                               " > :"
  49.                                       )
  50.                              )
  51.                             )
  52.                             (*rad*)
  53.                       )
  54.           )
  55.      )
  56.    (progn (setq a (fix (vlax-curve-getparamatpoint sn (vlax-curve-getclosestpointto sn (cadr s)))))
  57.           (setq p1 (vlax-curve-getpointatparam sn a))
  58.           (setq p2 (vlax-curve-getpointatparam sn (setq a (1+ a))))
  59.           (while (and (eq (car (setq gr (grread t 15 0))) 5)
  60.                       (not (redraw))
  61.                       (if (minusp (sin (- (angle p1 p2) (angle p2 (cadr gr)))))
  62.                         (setq ang t)
  63.                         (progn (setq ang nil) t)
  64.                       )
  65.                  )
  66.             (vla-offset
  67.               (vlax-ename->vla-object sn)
  68.               (if ang
  69.                 (- *dist*)
  70.                 *dist*
  71.               )
  72.             )
  73.             (if o
  74.               (entdel o)
  75.             )
  76.             (if lst
  77.               (mapcar 'entdel lst)
  78.             )
  79.             (if (not (eq (setq o (entlast)) l))
  80.               o
  81.             )
  82.             (setq l   o
  83.                   pts nil
  84.             )
  85.             (foreach x (entget o)
  86.               (if (eq (car x) 10)
  87.                 (setq pts (cons (list (cadr x) (caddr x) 0.) pts))
  88.               )
  89.             )
  90.             (setq lst (_screw pts *rad*))
  91.           )
  92.           (if l
  93.             (entdel l)
  94.           )
  95.    )
  96. )
  97. (princ)
  98. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 22:46:09 | 显示全部楼层
Tharwat干得好
 
以下是我的看法:
  1. ;; Polyline Circles  -  Lee Mac
  2. ;; Generates a set of circles with centerlines for every vertex of a selected polyline,
  3. ;; offset inside or outside by a given distance based on the cursor position.
  4. (defun c:polyc ( / *error* dia ent enx flg lst obj ocs off par pt1 pt2 pt3 )
  5.    (defun *error* ( msg )
  6.        (foreach grp lst (foreach ent grp (if (entget ent) (entdel ent))))
  7.        (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  8.            (princ (strcat "\nError: " msg))
  9.        )
  10.        (princ)
  11.    )
  12.    
  13.    (while
  14.        (progn (setvar 'errno 0) (setq ent (car (entsel "\nSelect polyline: ")))
  15.            (cond
  16.                (   (= 7 (getvar 'errno))
  17.                    (princ "\nMissed, try again.")
  18.                )
  19.                (   (null ent) nil)
  20.                (   (/= "LWPOLYLINE" (cdr (assoc 0 (setq enx (entget ent)))))
  21.                    (princ "\nSelected object is not a polyline.")
  22.                )
  23.            )
  24.        )
  25.    )
  26.    (if (and (= 'ename (type ent))
  27.             (setq obj (vlax-ename->vla-object ent))
  28.             (setq off (getdistwithdefault "\nSpecify offset distance" 'polyc:off))
  29.             (setq dia (getdistwithdefault "\nSpecify circle diameter" 'polyc:dia))
  30.             (setq dia (/ dia 2.0)
  31.                   ocs (assoc 210 enx)
  32.             )
  33.        )
  34.        (if
  35.            (apply 'and
  36.                (setq lst
  37.                    (mapcar
  38.                        (function
  39.                            (lambda ( x )
  40.                                (apply 'append
  41.                                    (mapcar
  42.                                        (function
  43.                                            (lambda ( y / r )
  44.                                                (setq r
  45.                                                    (apply 'append
  46.                                                        (mapcar
  47.                                                            (function
  48.                                                                (lambda ( p )
  49.                                                                    (cons (entmakex (list '(0 . "CIRCLE") p (cons 40 dia) ocs))
  50.                                                                        (mapcar
  51.                                                                            (function
  52.                                                                                (lambda ( a )
  53.                                                                                    (entmakex
  54.                                                                                        (list
  55.                                                                                           '(0 . "LINE")
  56.                                                                                            (cons 10 (trans (mapcar '+ (cdr p) a) (cdr ocs) 0))
  57.                                                                                            (cons 11 (trans (mapcar '+ (cdr p) (mapcar '- a)) (cdr ocs) 0))
  58.                                                                                        )
  59.                                                                                    )
  60.                                                                                )
  61.                                                                            )
  62.                                                                            (list (list (* dia 1.5) 0.0) (list 0.0 (* dia 1.5)))
  63.                                                                        )
  64.                                                                    )
  65.                                                                )
  66.                                                            )
  67.                                                            (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget (vlax-vla-object->ename y)))
  68.                                                        )
  69.                                                    )
  70.                                                )
  71.                                                (vla-delete y)
  72.                                                r
  73.                                            )
  74.                                        )
  75.                                        x
  76.                                    )
  77.                                )
  78.                            )
  79.                        )
  80.                        (list
  81.                            (catchapply 'vlax-invoke (list obj 'offset off))
  82.                            (catchapply 'vlax-invoke (list obj 'offset (- off)))
  83.                        )
  84.                    )
  85.                )
  86.            )
  87.            (progn
  88.                (foreach ent (car lst) (entdel ent))
  89.                (princ "\nChoose offset side: ")
  90.                (while (= 5 (car (setq pt1 (grread t 13 0))))
  91.                    (setq par (vlax-curve-getparamatpoint ent (vlax-curve-getclosestpointto ent (trans (cadr pt1) 1 0)))
  92.                          pt2 (trans (vlax-curve-getpointatparam ent (fix par)) 0 1)
  93.                          pt3 (trans (vlax-curve-getpointatparam ent (1+ (fix par))) 0 1)
  94.                    )
  95.                    (if (not (eq flg (setq flg (minusp (sin (- (angle pt2 (cadr pt1)) (angle pt2 pt3)))))))
  96.                        (foreach grp lst (foreach ent grp (entdel ent)))
  97.                    )
  98.                )
  99.            )
  100.            (progn
  101.                (princ "\nOffset distance too large - unable to perform internal offset.")
  102.                (foreach x (apply 'append lst) (entdel x))
  103.            )
  104.        )
  105.    )
  106.    (princ)
  107. )
  108. (defun getdistwithdefault ( msg sym )
  109.    (set sym (cond ((getdist (strcat msg (if (eval sym) (strcat " <" (rtos (eval sym)) ">: ") ": ")))) ((eval sym))))
  110. )
  111. (defun catchapply ( fun arg / rtn )
  112.    (if (not (vl-catch-all-error-p (setq rtn (vl-catch-all-apply fun arg)))) rtn)
  113. )
  114. (vl-load-com) (princ)

上述操作也应在所有UCS和视图中正确执行。
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 22:47:48 | 显示全部楼层
 
非常感谢,你的反馈对我来说意义重大
回复

使用道具 举报

26

主题

145

帖子

122

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
130
发表于 2022-7-5 22:51:58 | 显示全部楼层
marko、jdiala、Tharwat、leemac
 
谢谢大家。
非常感动!
如果多边形不是pline,则它是闭合的直线。如何做?
如何更改中心线的图层?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 22:57:03 | 显示全部楼层
 
在使用上述程序之前,请使用PEDIT>Join将线连接到多段线。
 
 
在我的代码中,更改:
  1. '(0 . [color=MAROON]"LINE"[/color])
  2. ([color=BLUE]cons[/color] 10 ([color=BLUE]trans[/color] ([color=BLUE]mapcar[/color] '[color=BLUE]+[/color] ([color=BLUE]cdr[/color] p) a) ([color=BLUE]cdr[/color] ocs) 0))
至:
  1. '(0 . [color=MAROON]"LINE"[/color])
  2. '(8 . [color=red]"Your Layer Here"[/color])
  3. ([color=BLUE]cons[/color] 10 ([color=BLUE]trans[/color] ([color=BLUE]mapcar[/color] '[color=BLUE]+[/color] ([color=BLUE]cdr[/color] p) a) ([color=BLUE]cdr[/color] ocs) 0))
回复

使用道具 举报

26

主题

145

帖子

122

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
130
发表于 2022-7-5 23:01:43 | 显示全部楼层
 
李,非常感谢!非常好!
回复

使用道具 举报

63

主题

6297

帖子

6283

银币

后起之秀

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

铜币
358
发表于 2022-7-5 23:05:40 | 显示全部楼层
李,我只是不明白下面的代码在删除对象后如何重新生成它们。
你能帮我澄清一下吗?
 
  1. (foreach grp lst (foreach ent grp (entdel ent)))
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-11 06:00 , Processed in 0.817371 second(s), 75 queries .

© 2020-2025 乐筑天下

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