明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4984|回复: 34

[源码] 多段線的偏移

[复制链接]
发表于 2020-3-11 10:42:30 | 显示全部楼层 |阅读模式
本帖最后由 lee50310 于 2021-7-20 06:19 编辑

花了 一些時間 ,終於寫出來了 如圖  ,舊版:bb2.lsp(已移除)
;--------------------------------------------------------------------------
感謝兩位大大發現問題 1. 圖層轉換 2. 遇垂直pline線 會出現 除0的錯誤
         在修正版 bb3.lsp 已修正更新


        最新版  bb4.lsp  支援  圓 , 弧  請重新下載




  1. ;-------------------------------------------------------------------------
  2. ;;bb4.lsp
  3. (defun c:bb4 (/ k j ss ee pt_lst )
  4.        (if (= sel nil) (setq sel 10))                                ;偏移距離初設 10         
  5.        (setq of (getdist (strcat "輸入偏移距離:<" (rtos sel) ">")))
  6.        (if (= of nil)(setq of sel )(setq sel of))
  7. (if (setq ss (ssget ":s" '((0 . "*POLYLINE,CIRCLE,ARC"))))
  8.      (progn
  9.                   (setq k 0)     
  10.          (repeat  (sslength ss)
  11.                   (setq ee (ssname ss k))

  12.                   (setq name (cdr (assoc 0 (entget ee))))
  13.             (cond ((= name "CIRCLE") (offset_circle ee))
  14.                   ((= name "ARC")    (offset_arc ee)(edit_line))
  15.                   ((= name "LWPOLYLINE") (get_point ee)(offset_line)(edit_line))
  16.             )                          
  17.                   (setq k (+ k 1))
  18.   
  19.          )
  20.    
  21.      ) ;end_progn
  22.         (princ "\n沒有選擇對像或選擇的對像不是多段線.")
  23.   ) ;end_if      
  24. ) ;end_defun
  25. (prompt "----------------------<<請輸入:bb4 >>-----------------------")
  26. (prin1)
  27. ;-----------------------------------------------------------------------------
  28. ;繪製圓偏移線
  29. (defun offset_circle (vv / p1)

  30. (setq p1 (cdr (assoc 10 (entget vv))))
  31. (setq r1 (+ (cdr (assoc 40 (entget  vv))) of))

  32. (entmake (list '(0 . "CIRCLE")(cons 8 "LY")(cons 62 1)(cons 10 p1)(cons 40 r1)))

  33. )
  34. ;-------------------------------------------------------------------------------
  35. ;繪製弧偏移線
  36. (defun offset_arc (vv / p1 p2 p3 p4 p5 r1 ang1 ang2 ang3 ang4)
  37.         (setq p1   (cdr (assoc 10 (entget vv))))
  38.         (setq r1   (cdr (assoc 40 (entget vv))))
  39.         (setq ang1 (cdr (assoc 50 (entget vv))))
  40.         (setq ang2 (cdr (assoc 51 (entget vv))))
  41.         (setq p2 (polar p1 ang1 r1))
  42.         (setq p3 (polar p1 ang2 r1))
  43.       
  44.                (setq p4 (polar p2 ang1 of ))
  45.                (setq p5 (polar p3 ang2 of ))
  46.       
  47.                (entmake (list '(0 . "LINE")(cons 8 "LY")(cons 62 1)(cons 10 p2)(cons 11 p4) ))
  48.                (entmake (list '(0 . "LINE")(cons 8 "LY")(cons 62 1)(cons 10 p3)(cons 11 p5) ))
  49.                
  50.                (setq ang3 (angle p1 p4))                         ;偏移弧起始角度
  51.                (setq ang4 (angle p1 p5))                         ;偏移弧結束角度
  52.                

  53. (entmake (list '(0 . "ARC")                                       ;繪製偏移弧        
  54.                  (cons 8 "LY")                                         ;"LY"層
  55.                  (cons 62 1)                                           ;紅色
  56.                  (cons 10 p1)                                         ;圓心座標
  57.                  (cons 40 (+ r1 of))                                ;半徑
  58.                  (cons 50 ang3)                                     ;起始角度
  59.                  (cons 51 ang4)                                     ;結束角度
  60.           )
  61. )

  62. )

  63. ;-------------------------------------------------------------------------------
  64. ;取多段線頂點型成串列存於 pt_lst中
  65. (defun get_point (vv)
  66.               (setq j 0 pt_lst nil)
  67.               (vl-load-com)
  68.        (repeat (fix (+ (vlax-curve-getEndParam vv) 1))
  69.                (setq pt_lst (append pt_lst (list (vlax-curve-getPointAtParam vv j))))
  70.                (setq j (1+ j))
  71.        )

  72. )
  73. ;-------------------------------------------------------------------------------
  74. ;繪製多段線偏移線
  75. (defun  offset_line (/ i n p1 p2 p3 p4 ang ang2 )
  76.           (setq i 0)
  77.           (setq n (- (length pt_lst) 1))
  78.   (repeat n

  79.      (setq p1 (nth i pt_lst))
  80.      (setq p2 (nth (1+ i) pt_lst))
  81.      (setq ang (angle p1 p2))
  82.      (chack2 ee)                                                      ;判斷順逆方向
  83.      (if (= order 0)
  84.          (setq ang2 (+ ang (* pi 1.5)))                        ;逆時針
  85.          (setq ang2 (+ ang (* pi 0.5)))                        ;順時針
  86.      )
  87.      (setq p3 (polar p1 ang2 of ))
  88.      (setq p4 (polar p2 ang2 of ))
  89.                   (progn
  90.                         (entmake (list '(0 . "LINE")(cons 8 "LY")(cons 62 1)(cons 10 p1)(cons 11 p3) ))
  91.                         (entmake (list '(0 . "LINE")(cons 8 "LY")(cons 62 1)(cons 10 p2)(cons 11 p4) ))
  92.                         (entmake (list '(0 . "LINE")(cons 8 "LY")(cons 62 1)(cons 10 p3)(cons 11 p4) ))
  93.                   )
  94.    (setq i (+ i 1))
  95.   )
  96. )
  97. ;-------------------------------------------------------------------------------
  98. ;; 將"LY" 圖層 所有"LINE"線型接合為多段線
  99.     (defun edit_line (/ ss ent)
  100.         (setvar "cmdecho" 0)
  101.         (command "peditaccept" "1")                           ;轉換成聚合線不顯示提示   
  102.         (setq ss (ssget "x" '((0 . "LINE,ARC")(8 . "LY"))))
  103.         (vl-cmdf "_.pedit" "_m" ss "" "_j" "0.0001" "")
  104.         (sssetfirst nil (ssadd (entlast)))
  105.         (command "peditaccept" "0")                           ;顯示提示
  106.         (setq ent (entlast))
  107.         (princ)
  108.     ) ;_ end of defun
  109. ;-------------------------------------------------------------------------------
  110. ;判段多段線順時針或逆時針
  111. (defun chack2 (en  / LW LST MAXP MINP)
  112.   (setq lw (vlax-ename->vla-object en ))
  113.   (vla-GetBoundingBox lw 'MinP 'MaxP)
  114.   (setq
  115.       minp (vlax-safearray->list minp)
  116.       MaxP (vlax-safearray->list MaxP)
  117.       lst
  118.         (mapcar
  119.           (function
  120.           (lambda (x)
  121.           (vlax-curve-getParamAtPoint
  122.           lw
  123.           (vlax-curve-getClosestPointTo lw x)
  124.           ) ;_ vlax-curve-getParamAtPoint
  125.           ) ;_ lambda
  126.           ) ;_ function
  127.           (list minp
  128.                (list (car minp) (cadr MaxP))
  129.                 MaxP
  130.                (list (car MaxP) (cadr minp))
  131.                 ) ;_ list
  132.           ) ;_ mapcar
  133.       ) ;_ setq
  134.   (if
  135.     (or
  136.       (<= (car lst) (cadr lst) (caddr lst) (cadddr lst))
  137.       (<= (cadr lst) (caddr lst) (cadddr lst) (car lst))
  138.       (<= (caddr lst) (cadddr lst) (car lst) (cadr lst))
  139.       (<= (cadddr lst) (car lst) (cadr lst) (caddr lst))
  140.       ) ;_ or
  141.        (setq order 1 )                                               ;順時針"
  142.        (setq order 0 )                                               ;逆時針"
  143.     ) ;_ if
  144.   (princ)
  145. ) ;_ defun
  146. ;-------------------------------------------------------------------------------



本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
USER2128 + 1 赞一个!
xj6019 + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2020-3-14 23:19:53 | 显示全部楼层
本帖最后由 lee50310 于 2021-7-20 06:22 编辑
xj6019 发表于 2020-3-13 21:25
我想实现同时向内向外偏移,也可以同时提示向内 向外偏移的数值,图层全部默认当前是最好,往里偏移是虚线 ..依照

依照你的需求,寫好了  請測試看看 !  新增功能內偏距離輸入內定為5 可自行設定,內偏線為虛線類型程序指定為 "DASHED" , 可改為 "HIDDEN" 或其他類型(註:更改的方式 例:將程序內的所有 "DASHED" 替換為 "HIDDEN" 存檔即可)  這個新增內偏功能只對多段線及多邊型的多段線有作用,圓弧..不起作用 , 其他功能不變 如圖  
;
(註: 附件 繁體版,簡體版功能一樣,擇一下載即可)






本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
xj6019 + 1 很给力!

查看全部评分

发表于 2020-3-17 12:16:22 | 显示全部楼层
lee50310 发表于 2020-3-14 23:19
依照你的需求,寫好了  請測試看看 !  新增功能內偏距離輸入內定為5 可自行設定,內偏線為虛線類型程序指定 ...

(princ "\n⊿Τ匡拒癸钩┪匡拒癸钩ぃ琌琿絬.")
"娩块ず熬簿禯瞒:<"
很多字都是乱码
能不能发个简体版的啊
谢谢
 楼主| 发表于 2020-3-13 18:35:54 | 显示全部楼层
本帖最后由 lee50310 于 2020-3-13 18:52 编辑
xj6019 发表于 2020-3-13 10:16
打扰了,可以把代码增加点吗,直接向内偏移一个固定值,预设定5,可以满足的话,这代码挺适合我用的,有空 ...
不懂你的意思?
1.希望程式也能把點考慮進去?  這沒辦法,因為很多點在空間中是雜亂無章的 ,事後如何理出順序?
2.還是說把紅色偏移線 改線型為虛線點 ?


发表于 2020-3-11 18:48:48 | 显示全部楼层
真棒,这功能比较实用哦
发表于 2020-3-11 19:40:30 | 显示全部楼层
解释一下,你的图层为何倒腾好几回 啊,你自己有特殊需要吗,直接随层偏移制作不就行嘛
发表于 2020-3-12 08:55:43 | 显示全部楼层
非常好的,谢谢楼主!
发表于 2020-3-12 14:58:34 | 显示全部楼层
有时出错除数为0
请教何因?
谢谢


本帖子中包含更多资源

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

x
 楼主| 发表于 2020-3-12 22:47:55 | 显示全部楼层
ynhh 发表于 2020-3-12 14:58
有时出错除数为0
请教何因?
谢谢

經測試提供的圖檔,發現問題出在判斷順逆時針方向的函數 chack()
若遇到垂直的pline 線 會出現除0 的錯誤 ,在新版 bb3.lsp已修正此問題 ,謝謝你即時發現
 楼主| 发表于 2020-3-12 23:07:53 | 显示全部楼层
xj6019 发表于 2020-3-11 19:40
解释一下,你的图层为何倒腾好几回 啊,你自己有特殊需要吗,直接随层偏移制作不就行嘛

新版 bb3.lsp 已做修正,謝謝你發現問題
发表于 2020-3-13 09:00:38 | 显示全部楼层
很好唷~功能不錯用唷~
发表于 2020-3-13 10:16:57 | 显示全部楼层
打扰了,可以把代码增加点吗,直接向内偏移一个固定值,预设定5,可以满足的话,这代码挺适合我用的,有空的话,麻烦搞一下,可以不用往你上面代码里面加,放到最后说明一下,如果需要怎么添加就行,别影响你上面的代码,我自己加进去,适合我就行,谢谢!
发表于 2020-3-13 11:02:12 | 显示全部楼层
圆弧不支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-21 01:38 , Processed in 0.207489 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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