明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2241|回复: 8

[已解答] 多段线单段偏移

[复制链接]
发表于 2014-9-21 11:52 | 显示全部楼层 |阅读模式
本帖最后由 xiaolong1487 于 2014-9-21 20:35 编辑

引用http://bbs.mjtd.com/thread-6521-1-1.html 龙龙仔 的源码
跟据个人需求,改了一下输入顺序,加了个循环!但是有个问题解决不了,想请教一下!
  1. ;;;多段线单边偏移
  2. (defun l_offset (/ ce os ENT ENT1 ENT2 DIST PNT)

  3.   (defun SEGMENTPTS (ENT / PNT VOBJ PARAM1 PARAM2 P1 P2 SEGPTS)
  4.     (and
  5.       (setq VOBJ (vlax-ename->vla-object (car ENT)))
  6.       (setq PNT (trans (cadr ENT) 1 0))
  7.       (setq PNT (vlax-curve-getclosestpointto VOBJ PNT))
  8.       (setq PARAM1 (vlax-curve-getparamatpoint VOBJ PNT))
  9.       (setq PARAM1 (fix PARAM1))
  10.       (setq PARAM2 (1+ PARAM1))
  11.       (if (equal PARAM1 (vlax-curve-getstartparam VOBJ) 1e-10)
  12.         (setq P1 (vlax-curve-getstartpoint VOBJ))
  13.         (setq P1 (vlax-curve-getpointatparam VOBJ PARAM1))
  14.       )
  15.       (if (equal PARAM2 (vlax-curve-getendparam VOBJ) 1e-10)
  16.         (setq P2 (vlax-curve-getendpoint VOBJ))
  17.         (setq P2 (vlax-curve-getpointatparam VOBJ PARAM2))
  18.       )
  19.       P1
  20.       P2
  21.       (setq BULGE (vla-getbulge VOBJ PARAM1))
  22.       (setq SEGPTS (list P1 P2 BULGE))
  23.     )
  24.     SEGPTS
  25.   )

  26.   (defun CALCBULGE (ENT / ARCRAD CENDIR HLFANG)
  27.     (setq VX1 (nth 0 ENT)
  28.           VX2 (nth 1 ENT)
  29.           BLG (nth 2 ENT)
  30.     )
  31.     (setq HLFANG (* 2 (atan BLG))
  32.           CENDIR ((if (< BLG 0)
  33.                     -
  34.                     +
  35.                   )
  36.                    (- (angle VX1 VX2) HLFANG)
  37.                    (/ pi 2)
  38.                  )
  39.           ARCRAD (abs (/ (/ (distance VX1 VX2) 2.0) (sin HLFANG)))
  40.     )
  41.     (list
  42.       (polar VX1 CENDIR ARCRAD)
  43.       ARCRAD
  44.       (* (abs HLFANG) 2.0)
  45.     )
  46.   )

  47.   (setq ce (getvar "cmdecho"))
  48.   (setvar "cmdecho" 0)
  49.   (command "_.undo" "_group")
  50.   (setq os (getvar "osmode"))
  51.   (setvar "osmode" 0)
  52.   (setq DIST (getreal  "\n输入偏移距离<3>:"))
  53.   (if (= dist nil)
  54.     (setq dist 3)
  55.     )
  56.   (setq b 1)
  57.   (while (<= b 100)
  58.      (prompt "\n拾取POLYLINE要偏移的段: ")
  59.     (setq ENT (ssget ":S" '((0 . "*POLYLINE"))))
  60.      (if (not (null ENT))(progn
  61.   (setq   ENT (list (ssname ENT 0)
  62.                   (osnap (cadr (nth 3 (car (ssnamex ENT 0)))) "nea")
  63.             )
  64.   )
  65.   (setq PNT (getpoint "\n拾取方向:"))
  66.   (setq ENT1 (SEGMENTPTS ENT))
  67.   (if (/= (nth 2 ENT1) 0)
  68.     (setq ENT (CALCBULGE ENT1))
  69.   )
  70.   (if (/= (nth 2 ENT1) 0)
  71.     (if        (> (nth 2 ENT1) 0)
  72.       (command "_.arc" "c" (nth 0 ENT) (nth 0 ENT1) (nth 1 ENT1))
  73.       (command "_.arc" "c" (nth 0 ENT) (nth 1 ENT1) (nth 0 ENT1))
  74.     )
  75.     (command "_.line" (nth 0 ENT1) (nth 1 ENT1) "")
  76.   )
  77.   (setq ENT2 (entlast))
  78.   (command "_.Offset" DIST ENT2 PNT "")
  79.   (entdel ENT2)
  80.   (setq b (1+ b)))
  81.   (setq b 101)))
  82.   (setvar "osmode" os)
  83.   (command "_.undo" "_end")
  84.   (setvar "cmdecho" ce)
  85.   (princ)
  86. )
  87. (defun c:of ()
  88. (l_offset))
跟据个人需求想简化命令,该怎么修改主程式!还想加个判断,先单线的复线都可运行!
  1. (defun c:oo3()
  2. (command "l_offset" "1")
  3. )
  4. (defun c:oo2()
  5. (command "l_offset" "2")
  6. )
  7. (defun c:oo3()
  8. (command "l_offset" "3")
  9. )
  10. (defun c:oo4()
  11. (command "l_offset" "4")
  12. )
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2015-12-26 22:33 | 显示全部楼层
  1. ;;;多段线单边偏移
  2. (defun l_offset (DIST / calcbulge ce ent ent1 ent2 os pnt segmentpts)
  3.   (defun SEGMENTPTS (ENT / bulge P1 P2 PARAM1 PARAM2 PNT SEGPTS VOBJ)
  4.     (and
  5.       (setq VOBJ (vlax-ename->vla-object (car ENT)))
  6.       (setq PNT (trans (cadr ENT) 1 0))
  7.       (setq PNT (vlax-curve-getclosestpointto VOBJ PNT))
  8.       (setq PARAM1 (vlax-curve-getparamatpoint VOBJ PNT))
  9.       (setq PARAM1 (fix PARAM1))
  10.       (setq PARAM2 (1+ PARAM1))
  11.       (if (equal PARAM1 (vlax-curve-getstartparam VOBJ) 1e-10)
  12.         (setq P1 (vlax-curve-getstartpoint VOBJ))
  13.         (setq P1 (vlax-curve-getpointatparam VOBJ PARAM1))
  14.       )
  15.       (if (equal PARAM2 (vlax-curve-getendparam VOBJ) 1e-10)
  16.         (setq P2 (vlax-curve-getendpoint VOBJ))
  17.         (setq P2 (vlax-curve-getpointatparam VOBJ PARAM2))
  18.       )
  19.       P1
  20.       P2
  21.       (setq BULGE (vla-getbulge VOBJ PARAM1))
  22.       (setq SEGPTS (list P1 P2 BULGE))
  23.     )
  24.     SEGPTS
  25.   );
  26.   
  27.   (defun CALCBULGE (ENT / ARCRAD blg CENDIR HLFANG vx1 vx2)
  28.     (setq VX1 (nth 0 ENT)
  29.       VX2 (nth 1 ENT)
  30.       BLG (nth 2 ENT)
  31.     )
  32.     (setq HLFANG (* 2 (atan BLG))
  33.       CENDIR ((if (< BLG 0)
  34.                 -
  35.                 +
  36.               )
  37.                (- (angle VX1 VX2) HLFANG)
  38.                (/ pi 2)
  39.              )
  40.       ARCRAD (abs (/ (/ (distance VX1 VX2) 2.0) (sin HLFANG)))
  41.     )
  42.     (list
  43.       (polar VX1 CENDIR ARCRAD)
  44.       ARCRAD
  45.       (* (abs HLFANG) 2.0)
  46.     )
  47.   );
  48.   
  49.   (setq ce (getvar "cmdecho")
  50.     os (getvar "osmode")
  51.   )
  52.   (setvar "cmdecho" 0)
  53.   (setvar "osmode" 0)
  54.   (prompt "\n拾取POLYLINE要偏移的段: ")
  55.   (while (setq ENT (ssget ":S" '((0 . "*POLYLINE"))))
  56.     (setq   ENT (list (ssname ENT 0)
  57.                   (osnap (cadr (nth 3 (car (ssnamex ENT 0)))) "nea")
  58.                 )
  59.     )
  60.     (setq PNT (getpoint "\n拾取方向:"))
  61.     (setq ENT1 (SEGMENTPTS ENT))
  62.     (if (/= (nth 2 ENT1) 0)
  63.       (setq ENT (CALCBULGE ENT1))
  64.     )
  65.     (if (/= (nth 2 ENT1) 0)
  66.       (if  (> (nth 2 ENT1) 0)
  67.         (command "_.arc" "c" (nth 0 ENT) (nth 0 ENT1) (nth 1 ENT1))
  68.         (command "_.arc" "c" (nth 0 ENT) (nth 1 ENT1) (nth 0 ENT1))
  69.       )
  70.       (command "_.line" (nth 0 ENT1) (nth 1 ENT1) "")
  71.     )
  72.     (setq ENT2 (entlast))
  73.     (command "_.Offset" DIST ENT2 PNT "")
  74.     (entdel ENT2)
  75.    
  76.   )
  77.   (setvar "osmode" os)
  78.   (setvar "cmdecho" ce)
  79.   (princ)
  80. )


  81. (defun c:oo1()
  82.   (l_offset 1)
  83. )
  84. (defun c:oo2()
  85.   (l_offset 2)
  86. )
  87. (defun c:oo3()
  88.   (l_offset 3)
  89. )
  90. (defun c:oo4()
  91.   (l_offset 4)
  92. )
回复 支持 1 反对 0

使用道具 举报

发表于 2014-9-22 07:22 | 显示全部楼层


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
 楼主| 发表于 2014-9-22 08:29 | 显示全部楼层
xyp1964 发表于 2014-9-22 07:22

谢谢版主,可是这个不是我想要的!还有,您老大的工具必须要加载XCAD,能不能单独做的函数包啊!
发表于 2015-12-27 07:12 | 显示全部楼层
同步学习中……………………
发表于 2023-2-12 14:37 | 显示全部楼层
非常棒的代码,谢谢楼主分享啊。
发表于 2023-2-12 14:39 | 显示全部楼层
非常棒的代码,谢谢楼主分享啊。
发表于 2023-3-12 16:08 | 显示全部楼层
急需的学习参考资料,谢谢楼主分享!
发表于 2023-11-30 22:00 | 显示全部楼层
测试了下,还是不完美,这个程序只对 多义线起作用,对直线就失效了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-28 00:30 , Processed in 0.326095 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表