找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1748|回复: 3

[每日一码] double offset 转自lee

[复制链接]

已领礼包: 218个

财富等级: 日进斗金

发表于 2013-6-3 14:43:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
0.jpg
  1. ;;--------------------=={ Double Offset }==-------------------;;
  2. ;;                                                            ;;
  3. ;;  Offsets each object in a selection to both sides by a     ;;
  4. ;;  specified distance. With additional controls for erasure  ;;
  5. ;;  of source object and offset layer.                        ;;
  6. ;;------------------------------------------------------------;;
  7. ;;  Author: Lee Mac, Copyright ?2011 - www.lee-mac.com       ;;
  8. ;;------------------------------------------------------------;;
  9. ;;  Version: 1-1 20100912                                     ;;
  10. ;;------------------------------------------------------------;;

  11. (defun c:DOff nil (c:DoubleOffset))

  12. (defun c:DoubleOffset ( / *error* _StartUndo _EndUndo DoubleOffset doc exitflag layer mpoint obj object of point sel symbol value )

  13.   (defun *error* ( msg )   
  14.     (and doc (_EndUndo doc))
  15.     (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  16.         (princ (strcat "\n** Error: " msg " **")))
  17.     (princ)
  18.   )

  19.   (defun _StartUndo ( doc ) (vla-StartUndoMark doc))

  20.   (defun _EndUndo   ( doc ) (if (= 8 (logand 8 (getvar 'UNDOCTL))) (vla-EndUndomark doc)))
  21.   
  22.   (defun DoubleOffset ( object offset layer )
  23.     (mapcar
  24.       (function
  25.         (lambda ( o )
  26.           (if
  27.             (and
  28.               (not
  29.                 (vl-catch-all-error-p
  30.                   (setq o
  31.                     (vl-catch-all-apply
  32.                       (function vlax-invoke) (list object 'Offset o)
  33.                     )
  34.                   )
  35.                 )
  36.               )
  37.               layer
  38.             )
  39.             (mapcar
  40.               (function
  41.                 (lambda ( o )
  42.                   (vla-put-layer o (getvar 'CLAYER))
  43.                 )
  44.               )
  45.               o
  46.             )
  47.           )
  48.         )
  49.       )
  50.       (list offset (- offset))
  51.     )
  52.   )

  53.   (setq doc (vla-get-ActiveDocument (vlax-get-acad-object)))

  54.   (mapcar
  55.     '(lambda ( symbol value ) (or (boundp symbol) (set symbol value)))
  56.     '(*dOff:Erase *dOff:Layer) '("No" "Source")
  57.   )

  58.   (if
  59.     (progn
  60.       (while
  61.         (progn
  62.           (princ
  63.             (strcat
  64.               "\nCurrent Settings: Erase source="
  65.               *dOff:Erase
  66.               "  Layer="
  67.               *dOff:Layer
  68.               "  OFFSETGAPTYPE="
  69.               (itoa (getvar 'OFFSETGAPTYPE))
  70.             )
  71.           )
  72.           (initget 6 "Through Erase Layer")
  73.           (setq of
  74.             (getdist
  75.               (strcat "\nSpecify Offset Distance [Through/Erase/Layer] <"
  76.                 (if (minusp (getvar 'OFFSETDIST)) "Through"  (rtos (getvar 'OFFSETDIST))) "> : "
  77.               )
  78.             )
  79.           )
  80.           (cond
  81.             (
  82.               (null of) (not (setq of (getvar 'OFFSETDIST)))
  83.             )
  84.             (
  85.               (eq "Through" of) (setq of (setvar 'OFFSETDIST -1)) nil
  86.             )
  87.             (
  88.               (eq "Erase" of) (initget "Yes No")

  89.               (setq *dOff:Erase
  90.                 (cond
  91.                   (
  92.                     (getkword
  93.                       (strcat "\nErase source object after offsetting? [Yes/No] <" *doff:Erase "> : ")
  94.                     )
  95.                   )
  96.                   ( *dOff:Erase )
  97.                 )
  98.               )
  99.             )
  100.             (
  101.               (eq "Layer" of) (initget "Current Source")

  102.               (setq *dOff:Layer
  103.                 (cond
  104.                   (
  105.                     (getkword
  106.                       (strcat "\nEnter layer option for offset objects [Current/Source] <" *dOff:Layer "> : ")
  107.                     )
  108.                   )
  109.                   ( *dOff:Layer )
  110.                 )
  111.               )
  112.             )
  113.             ( of (setvar 'OFFSETDIST of) nil )
  114.           )
  115.         )
  116.       )
  117.       of
  118.     )
  119.     (while
  120.       (progn
  121.         (or ExitFlag
  122.           (progn (initget "Exit")
  123.             (setq sel (entsel "\nSelect object to offset or [Exit] <Exit> : "))
  124.           )
  125.         )
  126.         
  127.         (cond
  128.           (
  129.             (or ExitFlag (null sel) (eq sel "Exit")) nil
  130.           )
  131.           ( (vl-consp sel)

  132.             (_EndUndo doc) (_StartUndo doc)

  133.             (if (and (wcmatch (cdr (assoc 0 (entget (car sel)))) "ARC,CIRCLE,ELLIPSE,SPLINE,LWPOLYLINE,XLINE,LINE")
  134.                      (setq obj (vlax-ename->vla-object (car sel))))

  135.               (if (minusp of)
  136.                 (if
  137.                   (progn (initget "Exit Multiple")
  138.                     (and
  139.                       (setq point (getpoint "\nSpecify through point or [Exit/Multiple] <Exit> : "))
  140.                       (not (eq "Exit" point))
  141.                     )
  142.                   )
  143.                   (if (eq "Multiple" point)
  144.                     (while
  145.                       (progn (initget "Exit")
  146.                         (setq mpoint (getpoint "\nSpecify through point or [Exit] <next object> : "))

  147.                         (cond
  148.                           (
  149.                             (eq "Exit" mpoint)

  150.                             (if (eq "Yes" *dOff:Erase) (vla-delete obj))

  151.                             (not (setq ExitFlag t))
  152.                           )
  153.                           (
  154.                             (null mpoint)

  155.                             (if (eq "Yes" *dOff:Erase) (vla-delete obj))

  156.                             nil
  157.                           )
  158.                           (
  159.                             (listp mpoint)
  160.                            
  161.                             (DoubleOffset obj
  162.                               (distance (trans mpoint 1 0)
  163.                                 (vlax-curve-getClosestPointto (car sel) (trans mpoint 1 0) t)
  164.                               )
  165.                               (eq "Current" *dOff:Layer)
  166.                             )
  167.                            t
  168.                           )
  169.                         )
  170.                       )
  171.                     )
  172.                     (progn
  173.                       (DoubleOffset obj
  174.                         (distance (trans point 1 0)
  175.                           (vlax-curve-getClosestPointto (car sel) (trans point 1 0) t)
  176.                         )
  177.                         (eq "Current" *dOff:Layer)
  178.                       )
  179.                       (if (eq "Yes" *dOff:Erase) (vla-delete obj))
  180.                      t
  181.                     )
  182.                   )
  183.                   (setq ExitFlag t)
  184.                 )
  185.                 (progn
  186.                   (DoubleOffset obj of (eq "Current" *dOff:Layer))

  187.                   (if (eq "Yes" *dOff:Erase) (vla-delete obj))
  188.                 )
  189.               )
  190.               (princ "\n** Cannot Offset that Object **")
  191.             )
  192.            t
  193.           )
  194.         )
  195.       )
  196.     )
  197.   )  
  198.   (_EndUndo doc) (princ)
  199. )   

  200. (vl-load-com) (princ)
  201. (princ "\n:: DoubleOffset.lsp | Version 1.1 | ?Lee Mac 2011 www.lee-mac.com ::")
  202. (princ "\n:: Type \"DoubleOffset\" or \"DOff\" to invoke ::")
  203. (princ)

  204. ;;------------------------------------------------------------;;
  205. ;;                         End of File                        ;;
  206. ;;------------------------------------------------------------;;

如果可以在完善一下更好了,offset后 可以选择删除已有的曲线,
反向思考,把双线变成单线!哪位大师提供源码或者思路

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-6-3 15:41:08 | 显示全部楼层
是三线变双线吧?

偏移拾取线的时候,把那个线的实体名记下,程序最后你把这个实体删除就是了。

点评

写出来最好啦  详情 回复 发表于 2013-6-3 19:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 218个

财富等级: 日进斗金

 楼主| 发表于 2013-6-3 19:31:55 | 显示全部楼层
Lispboy 发表于 2013-6-3 15:41
是三线变双线吧?

偏移拾取线的时候,把那个线的实体名记下,程序最后你把这个实体删除就是了。

写出来最好啦
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

发表于 2022-4-25 00:03:46 | 显示全部楼层
感谢楼主分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 00:37 , Processed in 0.382800 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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