明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6509|回复: 53

[源码] 多段线批量偏移-支持设定内外偏移(210308更新)

  [复制链接]
发表于 2021-3-4 12:33 | 显示全部楼层 |阅读模式
本帖最后由 caoyin 于 2021-3-8 17:01 编辑

;;; 应网友要求-多段线批量内偏移
;;; http://bbs.mjtd.com/forum.php?mo ... %BD%E1%B9%B9&page=1
;;; 要求: 可设置偏移的距离\可设置是否删除源对象\偏移生成的对象图层为当前层\偏移后多段线的每个段为独立对象


  1. ;; 多段线批量偏移 - caoyin-210308
  2. ;; 根据要求自行设定缺省值
  3. ;; $OFFSETTO-DIST$  - 偏移距离   (100)
  4. ;; $OFFSETTO-ERASE$ - 删除源     (nil=否   |  T=是    )
  5. ;; $OFFSETTO-DIR$   - 偏移方向   (nil=内   |  T=外    )
  6. ;; $OFFSETTO-LAYER$ - 图层       (nil=源   |  T=当前层)
  7. ;; $OFFSETTO-PLMOD$ - 多段线模式 (nil=连续 |  T=独立  )


  8. (defun C:OTO (/ *ERROR* GET-PLINE-VERTEXS|BULGES ADD-2P-PLINE OFFSET-PLINES SS DOC ZIN DST)
  9.   (defun *ERROR* (M)
  10.     (if ZIN (setvar 'DIMZIN ZIN))
  11.   )
  12.   (defun GET-PLINE-VERTEXS|BULGES (ENX / P)
  13.     (if (and (setq P (assoc 10 ENX))
  14.              (setq ENX (member P ENX))
  15.         )
  16.       (cons (cons (cdr (assoc 42 ENX)) (cdr P))
  17.             (GET-PLINE-VERTEXS|BULGES (cdr ENX))
  18.       )
  19.     )
  20.   )
  21.   (defun ADD-2P-PLINE (P1 P2 B LAY NOR)
  22.     (entmake (list '(0 . "LWPOLYLINE")        '(100 . "AcDbEntity")
  23.                    (cons 8 LAY)               '(100 . "AcDbPolyline")
  24.                    '(90  . 2)                 '(43 . 20)
  25.                    (cons 10 (trans P1 0 NOR)) (cons 42 B)
  26.                    (cons 10 (trans P2 0 NOR)) (cons 210 NOR)
  27.              )
  28.     )
  29.   )
  30.   (defun OFFSET-PLINES (SS D DEL DIR LAY MOD / E D1 PTS X V ENX NOR)
  31.     (if (setq E (ssname SS 0))
  32.       (progn
  33.         (setq D1  D
  34.               PTS (GET-PLINE-VERTEXS|BULGES (entget E))
  35.         )
  36.         (if (equal (cdar PTS) (setq X (cdr (last PTS))) 1E-8)
  37.           (setq X (nth (- (length PTS) 2) PTS))
  38.         )
  39.         (setq V (mapcar (function (lambda (A B) (- (/ (+ A B) 2.0) A))) (cdar PTS) X))
  40.         (if (> (car (trans V 0 (vlax-curve-getFirstDeriv E 0))) 0)
  41.           (setq D (- D))
  42.         )
  43.         (if DIR (setq D (- D)))
  44.         (setq X (vlax-Invoke (vlax-ename->vla-object E) 'offset D))
  45.         (if DEL (entdel E))
  46.         (if MOD
  47.           (foreach O X
  48.             (setq ENX (entget (vlax-vla-object->ename O))
  49.                   NOR (cdr (assoc 210 ENX))
  50.                   PTS (GET-PLINE-VERTEXS|BULGES ENX)
  51.             )
  52.             (or LAY (setq LAY (vla-get-layer O)))
  53.             (mapcar (function (lambda (P1 P2)
  54.                                 (Add-2P-Pline (cdr P1) (cdr P2) (car P1) LAY NOR)
  55.                               )
  56.                     )
  57.                     PTS (cdr PTS)
  58.             )
  59.             (vla-delete O)
  60.           )
  61.           (if LAY (foreach O X (vla-put-layer O LAY)))
  62.         )
  63.         (OFFSET-PLINES (ssdel E SS) D1 DEL DIR LAY MOD)
  64.       )
  65.     )
  66.   )
  67.   (if (setq SS (ssget '((0 . "LWPOLYLINE") (-4 . ">=") (90 . 3))))
  68.     (progn
  69.       (setq DOC (vla-get-ActiveDocument (vlax-get-acad-object))
  70.             ZIN (getvar 'DIMZIN)
  71.       )
  72.       (vla-EndUndoMark DOC)
  73.       (or $OFFSETTO-DIST$
  74.           (setq $OFFSETTO-DIST$ 100)
  75.       )
  76.       (while
  77.         (progn
  78.           (setvar 'DIMZIN 0)
  79.           (princ (strcat "\n当前设置: 删除源="
  80.                         (if $OFFSETTO-ERASE$ "是" "否")
  81.                         " 偏移方向="
  82.                         (if $OFFSETTO-DIR$ "外" "内")
  83.                         " 图层="
  84.                         (if $OFFSETTO-LAYER$ "当前层" "源")
  85.                         " 新对象段="
  86.                         (if $OFFSETTO-PLMOD$ "独立" "连续")
  87.                  )
  88.           )
  89.           (initget 6 "Erase Dir Layer Mode")
  90.           (setq DST (getdist (strcat
  91.                                "\n指定偏移距离或 [删除源(E)/偏移方向(D)/图层(L)/新对象段(M)] <"
  92.                                (rtos $OFFSETTO-DIST$) ">: "
  93.                              )
  94.                      )
  95.           )
  96.           (cond
  97.             ((numberp DST)
  98.              (not (setq $OFFSETTO-DIST$ DST))
  99.             )
  100.             ((= DST "Erase")
  101.              (setq $OFFSETTO-ERASE$ (not $OFFSETTO-ERASE$))
  102.              T
  103.             )
  104.             ((= DST "Dir")
  105.              (setq $OFFSETTO-DIR$ (not $OFFSETTO-DIR$))
  106.              T
  107.             )
  108.             ((= DST "Layer")
  109.              (setq $OFFSETTO-LAYER$ (not $OFFSETTO-LAYER$))
  110.              T
  111.             )
  112.             ((= DST "Mode")
  113.              (setq $OFFSETTO-PLMOD$ (not $OFFSETTO-PLMOD$))
  114.              T
  115.             )
  116.             ((not DST)
  117.              (not (setq DST $OFFSETTO-DIST$))
  118.             )
  119.           )
  120.         )
  121.       )
  122.       (OFFSET-PLINES SS DST $OFFSETTO-ERASE$
  123.                             $OFFSETTO-DIR$
  124.                             (if $OFFSETTO-LAYER$ (getvar 'CLAYER))
  125.                             $OFFSETTO-PLMOD$
  126.       )
  127.       (while (= (logand 8 (getvar 'UNDOCTL)) 8)
  128.         (vla-EndUndoMark DOC)
  129.       )
  130.       (setvar 'DIMZIN ZIN)
  131.     )
  132.   )
  133.   (princ)
  134. )

评分

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

查看全部评分

"觉得好,就打赏"
    共1人打赏
发表于 2021-3-6 09:35 | 显示全部楼层
选择对象:
命令:
命令:  OTO

选择对象: 找到 1 个

选择对象:
命令:
命令:
命令: (LOAD "C:/Users/admin/Desktop/批量偏移oto.lsp") C:OTO

命令: oto

选择对象: 指定对角点: 找到 2 个

选择对象:
命令:

点评

代码前加个 (vl-load-com) 试试  发表于 2021-3-8 17:02
发表于 2021-3-5 23:38 | 显示全部楼层
1028882406@qq.c 发表于 2021-3-5 20:58
版主  能否增加个R角保持不变

或者直接增加个开关   圆角偏移保持相同或者不相同   自由切换

点评

好,稍空帮你加个开关  发表于 2021-3-8 17:02
发表于 2023-12-29 23:33 | 显示全部楼层
本小白一个,但是需要用到楼主的代码。搞不懂的地方:在哪个地方设置缺省值?
(setq X (nth (- (length PTS) 2) PTS))这句老报错,要怎么更改?
我是想设置下面的图形向外偏移

本帖子中包含更多资源

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

x
发表于 2021-3-4 16:26 | 显示全部楼层
谢谢! C版分享程序!!!!!

点评

代码更新,重新下载  发表于 2021-3-5 11:40
发表于 2021-3-4 18:23 | 显示全部楼层
感谢版主分享程序

点评

代码更新,重新下载  发表于 2021-3-5 11:40
发表于 2021-3-4 22:31 | 显示全部楼层
感谢版主分享

点评

代码更新,对象支持弧段,重新下载  发表于 2021-3-5 11:39
发表于 2021-3-5 08:04 | 显示全部楼层
命令: TXT
选择对象: 指定对角点: 找到 2 个

选择对象:
褰撳墠璁剧疆: 鍒犻櫎婧?= nil
鎸囧畾鍋忕Щ璺濈鎴?[鍒犻櫎婧?E)] <50>:

命令:
发表于 2021-3-5 08:06 | 显示全部楼层
1、为何命令提示行会出现乱马呢?2、能否有选择项,可以自己确定要求是内偏移还是外偏移?

点评

按照你的要求增加内外偏移选项,重新下载!乱码估计是你cad字体设置,在选项里设置试试看  发表于 2021-3-5 11:39
发表于 2021-3-5 08:49 | 显示全部楼层
谢谢版主分享!

点评

代码更新,重新下载  发表于 2021-3-5 11:37
发表于 2021-3-5 09:08 | 显示全部楼层

谢谢版主分享!有你们这些热心的大佬,论坛才能有活力!!

点评

我老菜鸟一个,很久没弄LISP了,论坛需要大家共同呵护! 代码更新,重新下载  发表于 2021-3-5 11:37
发表于 2021-3-5 10:41 | 显示全部楼层
请教C版,偏移后的多段线不断开,应该怎么写呢?请版主指点一下吧

点评

可以设置,重新下载,更新了一下  发表于 2021-3-5 11:33
发表于 2021-3-5 13:37 | 显示全部楼层
非常感谢,学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-21 19:23 , Processed in 0.370391 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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