乐筑天下

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

[编程交流] 没有offsetgaptype的偏移,

[复制链接]

4

主题

44

帖子

38

银币

初来乍到

Rank: 1

铜币
23
发表于 2022-7-5 17:09:59 | 显示全部楼层 |阅读模式
大家好,
 
我正在寻找一种在不改变线段长度的情况下偏移多段线的方法。
我研究了offsetgaptype,但不缩小差距的选项不在其中。
 
下面是我想要的示例,应该删除粉红色部分:

                               
登录/注册后可看大图

 
我不介意自己编写一些代码,但我不知道如何分别偏移这些段,也不知道如何确定选择了哪一侧。
 
非常感谢您的帮助。
181004rk44i51k17pt7k57.png
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-5 17:28:51 | 显示全部楼层
快速而肮脏的示例。。。
 
  1. (defun c:OAS (/ dst ent pnt obj p1 p2 lst)
  2. ;; http://www.cadtutor.net/forum/showthread.php?98338-Offset-without-offsetgaptype-leaving-the-corners-opened.
  3. (initget 6)
  4. (if (and (setq dst (getdist "\nSpecify offset distance: "))
  5.           (setq ent (car (AT:GetSel entsel
  6.                                     "\nSelect LWPolyline to offset all segments without connecting: "
  7.                                     (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "LWPOLYLINE"))
  8.                          )
  9.                     )
  10.           )
  11.           (setq pnt (getpoint "\nSpecify point on side to offset: "))
  12.           (setq obj (vlax-ename->vla-object ent)
  13.                 pnt (trans pnt 1 0)
  14.                 p1  (vlax-curve-getclosestpointtoprojection ent pnt '(0 0 1))
  15.           )
  16.           (setq p2 (cond
  17.                      ((vlax-curve-getPointAtDist ent (+ (vlax-curve-getDistAtPoint ent p1) 0.00001)))
  18.                      ((vlax-curve-getPointAtDist ent (- (vlax-curve-getDistAtPoint ent p1) 0.00001)))
  19.                    )
  20.           )
  21.           (setq dst (if (minusp (- (* (- (car p2) (car p1)) (- (cadr pnt) (cadr p1)))
  22.                                    (* (- (cadr p2) (cadr p1)) (- (car pnt) (car p1)))
  23.                                 )
  24.                         )
  25.                       (- dst)
  26.                       dst
  27.                     )
  28.           )
  29.           (setq lst (vlax-invoke (vlax-ename->vla-object ent) 'Explode))
  30.      )
  31.    (foreach o lst
  32.      (vla-offset
  33.        o
  34.        (if (and (eq (vla-get-objectname o) "AcDbArc")
  35.                 (> (vla-get-startangle o) pi)
  36.            )
  37.          (- dst)
  38.          dst
  39.        )
  40.      )
  41.      (vla-delete o)
  42.    )
  43. )
  44. (princ)
  45. )
  46. (defun AT:GetSel (meth msg fnc / ent)
  47. ;; meth - selection method (entsel, nentsel, nentselp)
  48. ;; msg - message to display (nil for default)
  49. ;; fnc - optional function to apply to selected object
  50. ;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
  51. ;; Alan J. Thompson, 05.25.10
  52. (while
  53.    (progn (setvar 'ERRNO 0)
  54.           (setq ent (meth (cond (msg)
  55.                                 ("\nSelect object: ")
  56.                           )
  57.                     )
  58.           )
  59.           (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
  60.                 ((eq (type (car ent)) 'ENAME)
  61.                  (if (and fnc (not (fnc ent)))
  62.                    (princ "\nInvalid object!")
  63.                  )
  64.                 )
  65.           )
  66.    )
  67. )
  68. ent
  69. )
回复

使用道具 举报

4

主题

44

帖子

38

银币

初来乍到

Rank: 1

铜币
23
发表于 2022-7-5 17:44:44 | 显示全部楼层
哇,效果真的很好。谢谢
 
我理解爆炸和循环抵消所有项目会发生什么,
但它如何知道要抵消哪一边呢?
回复

使用道具 举报

4

主题

44

帖子

38

银币

初来乍到

Rank: 1

铜币
23
发表于 2022-7-5 17:57:36 | 显示全部楼层
对于其他感兴趣的人,我更改了代码,使其从默认的“偏移”命令中获得上次使用的偏移距离(并对其进行更改),现在偏移到当前层:
  1. (defun c:OAS (/ dst ent pnt obj p1 p2 lst clayer)
  2.    (initget 6)
  3.    [color=red](setq clayer (getvar "clayer"))[/color]
  4.    (if (and
  5.       [color=red](if (setq dst (getdist (strcat "\nSpecify Offset Distance or <" (rtos (abs (getvar 'Offsetdist)) 2 4) ">: ")))
  6.              (setvar 'Offsetdist dst)
  7.              (setq dst (abs (getvar 'Offsetdist)))
  8.           )[/color]
  9.           (setq ent (car (AT:getsel entsel "\nSelect LWPolyline to offset all segments without connecting: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "LWPOLYLINE")))))
  10.           (setq pnt (getpoint "\nSpecify point on side to offset: "))
  11.           (setq obj (vlax-ename->vla-object ent)
  12.                 pnt (trans pnt 1 0)
  13.                 p1  (vlax-curve-getclosestpointtoprojection ent pnt '(0 0 1))
  14.           )
  15.           (setq p2 (cond
  16.                      ((vlax-curve-getPointAtDist ent (+ (vlax-curve-getDistAtPoint ent p1) 0.00001)))
  17.                      ((vlax-curve-getPointAtDist ent (- (vlax-curve-getDistAtPoint ent p1) 0.00001)))
  18.                    )
  19.           )
  20.           (setq dst (if (minusp (- (* (- (car p2) (car p1)) (- (cadr pnt) (cadr p1)))
  21.                                    (* (- (cadr p2) (cadr p1)) (- (car pnt) (car p1)))
  22.                                 )
  23.                         )
  24.                       (- dst)
  25.                       dst
  26.                     )
  27.           )
  28.           (setq lst (vlax-invoke (vlax-ename->vla-object ent) 'Explode))
  29.      )
  30.    (foreach o lst
  31.      (vla-offset
  32.        o
  33.        (if (and (eq (vla-get-objectname o) "AcDbArc")
  34.                 (> (vla-get-startangle o) pi)
  35.            )
  36.          (- dst)
  37.          dst
  38.        )
  39.      )
  40.      [color=red](vla-put-layer (vlax-EName->vla-Object (entlast)) clayer)[/color]
  41.      (vla-delete o)
  42.    )
  43. )
  44. (princ)
  45. )
  46. (defun AT:getsel (meth msg fnc / ent)
  47. ;; meth - selection method (entsel, nentsel, nentselp)
  48. ;; msg - message to display (nil for default)
  49. ;; fnc - optional function to apply to selected object
  50. ;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
  51. ;; Alan J. Thompson, 05.25.10
  52. (while
  53.    (progn (setvar 'ERRNO 0)
  54.           (setq ent (meth (cond (msg)
  55.                                 ("\nSelect object: ")
  56.                           )
  57.                     )
  58.           )
  59.           (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
  60.                 ((eq (type (car ent)) 'ENAME)
  61.                  (if (and fnc (not (fnc ent)))
  62.                    (princ "\nInvalid object!")
  63.                  )
  64.                 )
  65.           )
  66.    )
  67. )
  68. ent
  69. )
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-5 18:02:15 | 显示全部楼层
 
见注释代码。
  1. (setq pnt (getpoint "\nSpecify point on side to offset: ")) ; pick point on side to offset
  2. (setq obj (vlax-ename->vla-object ent)
  3.      pnt (trans pnt 1 0)
  4.      p1  (vlax-curve-getclosestpointtoprojection ent pnt '(0 0 1)) ; get point on polyline closest to picked point 'pnt'
  5. )
  6. (setq p2 (cond
  7.           ((vlax-curve-getPointAtDist ent (+ (vlax-curve-getDistAtPoint ent p1) 0.00001))) ; create 2nd point 0.00001 to left or right
  8.           ((vlax-curve-getPointAtDist ent (- (vlax-curve-getDistAtPoint ent p1) 0.00001))) ; depending on what it can create
  9.         )
  10. )
  11. (setq dst (if (minusp (- (* (- (car p2) (car p1)) (- (cadr pnt) (cadr p1))) ; area of triangle will return
  12.                         (* (- (cadr p2) (cadr p1)) (- (car pnt) (car p1))) ; negative/positive number depending on direction
  13.                      )
  14.              )
  15.            (- dst) ; change vla-offset distance + or - depending on direction
  16.            dst
  17.          )
  18. )
回复

使用道具 举报

54

主题

3755

帖子

3583

银币

后起之秀

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

铜币
438
发表于 2022-7-5 18:18:09 | 显示全部楼层
你的Mod上的Mod。。。
 
  1. (defun c:OAS (/ dst ent pnt cla obj p1 p2 lst)
  2. ;; http://www.cadtutor.net/forum/showthread.php?98338-Offset-without-offsetgaptype-leaving-the-corners-opened.
  3. (initget 6 "Through")
  4. (setq dst (getdist (strcat "\nOffset Nested\nSpecify offset distance or [Through] <"
  5.                             (if (minusp (getvar 'OFFSETDIST))
  6.                               "Through"
  7.                               (rtos (getvar 'OFFSETDIST))
  8.                             )
  9.                             ">: "
  10.                     )
  11.            )
  12. )
  13. (cond ((not dst))
  14.        ((eq (getvar 'OFFSETDIST) dst))
  15.        ((eq dst "Through") (setvar 'OFFSETDIST -1.))
  16.        ((setvar 'OFFSETDIST dst))
  17. )
  18. (if (and (setq ent (AT:GetSel entsel
  19.                                "\nSelect LWPolyline to offset all segments without connecting: "
  20.                                (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "LWPOLYLINE"))
  21.                     )
  22.           )
  23.           (setq pnt (getpoint (cadr ent)
  24.                               (if (minusp (getvar 'OFFSETDIST))
  25.                                 "\nSpecify through point: "
  26.                                 "\nSpecify point on side to offset: "
  27.                               )
  28.                     )
  29.           )
  30.           (setq ent (car ent)
  31.                 cla (getvar 'CLAYER)
  32.                 obj (vlax-ename->vla-object ent)
  33.                 pnt (trans pnt 1 0)
  34.                 p1  (vlax-curve-getclosestpointtoprojection ent pnt '(0 0 1))
  35.           )
  36.           (setq p2 (cond
  37.                      ((vlax-curve-getPointAtDist ent (+ (vlax-curve-getDistAtPoint ent p1) 0.00001)))
  38.                      ((vlax-curve-getPointAtDist ent (- (vlax-curve-getDistAtPoint ent p1) 0.00001)))
  39.                    )
  40.           )
  41.           (setq dst (if (minusp (getvar 'OFFSETDIST))
  42.                       (distance (list (car p1) (cadr p1)) (list (car pnt) (cadr pnt)))
  43.                       dst
  44.                     )
  45.                 dst (if (minusp (- (* (- (car p2) (car p1)) (- (cadr pnt) (cadr p1)))
  46.                                    (* (- (cadr p2) (cadr p1)) (- (car pnt) (car p1)))
  47.                                 )
  48.                         )
  49.                       (- dst)
  50.                       dst
  51.                     )
  52.           )
  53.           (setq lst (vlax-invoke (vlax-ename->vla-object ent) 'Explode))
  54.      )
  55.    (foreach o lst
  56.      (vla-put-layer o cla)
  57.      (vla-offset
  58.        o
  59.        (if (and (eq (vla-get-objectname o) "AcDbArc")
  60.                 (> (vla-get-startangle o) pi)
  61.            )
  62.          (- dst)
  63.          dst
  64.        )
  65.      )
  66.      (vla-delete o)
  67.    )
  68. )
  69. (princ)
  70. )
  71. (vl-load-com)
  72. (princ)
  73. (defun AT:GetSel (meth msg fnc / ent)
  74. ;; meth - selection method (entsel, nentsel, nentselp)
  75. ;; msg - message to display (nil for default)
  76. ;; fnc - optional function to apply to selected object
  77. ;; Ex: (AT:GetSel entsel "\nSelect arc: " (lambda (x) (eq (cdr (assoc 0 (entget (car x)))) "ARC")))
  78. ;; Alan J. Thompson, 05.25.10
  79. (while
  80.    (progn (setvar 'ERRNO 0)
  81.           (setq ent (meth (cond (msg)
  82.                                 ("\nSelect object: ")
  83.                           )
  84.                     )
  85.           )
  86.           (cond ((eq (getvar 'ERRNO) 7) (princ "\nMissed, try again."))
  87.                 ((eq (type (car ent)) 'ENAME)
  88.                  (if (and fnc (not (fnc ent)))
  89.                    (princ "\nInvalid object!")
  90.                  )
  91.                 )
  92.           )
  93.    )
  94. )
  95. ent
  96. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-8-23 09:57 , Processed in 0.324963 second(s), 68 queries .

© 2020-2025 乐筑天下

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