找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1564|回复: 22

[LISP程序]:双向OFFSET加强版

[复制链接]
发表于 2004-3-19 15:24:39 | 显示全部楼层 |阅读模式

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

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

×
SNSJ的原码见
http://www.xdcad.net/forum/showthread.php?s=&threadid=150210

我原来也有个低级的双向OFFSET,只能处理LINE和ARC。
但有选择目标图层,选择是否删除原实体等选项,并通过对话框设置,很方便。

看到SNSJ这个基于VL、很精简的代码,就拿来和我的程序做了一下组合。

我在文件里保留了SNSJ的申明 :)
我还不熟悉VLAX,请达人多多指教!

LISP:
  1. [php]
  2.   [FONT=courier new]

  3. (defun 2of_option (/ dcl_id layer_list next_step)
  4.   (setq next_step 2)
  5.   (while (>= next_step 2)
  6.     (if        (and (not dcl_id)
  7.              (minusp (setq dcl_id (load_dialog "DD2OF")))
  8.         )
  9.       (exit)
  10.     )
  11.     (if        (not (new_dialog "DD2OF" dcl_id))
  12.       (exit)
  13.     )

  14. ;;; ========= initialize dialogue ===========

  15.     (if        of_lay
  16.       (progn
  17.         (set_tile "chlay" "1")
  18.         (mode_tile "layerlist" 0)
  19.         (mk_list)
  20.       )
  21.       (progn
  22.         (set_tile "chlay" "0")
  23.         (mode_tile "layerlist" 1)
  24.       )
  25.     )
  26.     (if        of_e
  27.       (set_tile "delold" "1")
  28.       (set_tile "delold" "0")
  29.     )
  30.     (if        of_dist
  31.       (set_tile "ofdist" (rtos of_dist))
  32.     )

  33. ;;; ============== actions ===================

  34.     (action_tile "chlay" "(chlay_act)")
  35.     (action_tile "accept" "(accept_option)")
  36.     (action_tile "no" "(done_dialog 0)")
  37.     (action_tile "pickdis" "(done_dialog 4)")
  38.     (setq next_step (start_dialog))
  39.     (if        (= next_step 4)
  40.       (setq of_dist (getdist "\nOffset distanc: "))
  41.     )
  42.   )
  43. )

  44. (defun chlay_act ()
  45.   (if (= (get_tile "chlay") "0")
  46.     (progn
  47.       (start_list "layerlist")
  48.       (end_list)
  49.       (mode_tile "layerlist" 1)
  50.     )
  51.     (progn
  52.       (mode_tile "layerlist" 0)
  53.       (mk_list)
  54.     )
  55.   )
  56. )

  57. (defun accept_option ()
  58.   (if (= (get_tile "chlay") "0")
  59.     (setq of_lay nil)
  60.     (setq of_lay (nth (atoi (get_tile "layerlist")) layer_list))
  61.   )
  62.   (if (= (get_tile "delold") "1")
  63.     (setq of_e 1)
  64.     (setq of_e nil)
  65.   )
  66.   (setq dist (distof (get_tile "ofdist")))
  67.   (done_dialog 1)
  68. )

  69. (defun mk_list (/ layer_name)
  70.   (setq layer_list (list))
  71.   (setq layer_name (cdr (assoc 2 (tblnext "layer" t))))
  72.   (while layer_name
  73.     (if        (= layer_name of_lay)
  74.       nil
  75.       (setq layer_list (append layer_list (list layer_name)))
  76.     )
  77.     (setq layer_name (cdr (assoc 2 (tblnext "layer"))))
  78.   )
  79.   (setq layer_list (acad_strlsort layer_list))
  80.   (if of_lay
  81.     (setq layer_list (append (list of_lay) layer_list))
  82.   )
  83.   (start_list "layerlist")
  84.   (mapcar 'add_list layer_list)
  85.   (end_list)
  86. )

  87. ;;;|双向偏移 SNSJ 2004.3.8
  88. (defun ptlay (x y)
  89.   (if y
  90.     (vla-put-layer
  91.       (car (vlax-safearray->list (vlax-variant-value x)))
  92.       y
  93.     )
  94.   )
  95. )
  96. (defun c:2of (/ obj ss)
  97.   (vl-load-com)
  98.   (princ "\nby SNSJ and Little Fish. Offset object(s) to double side.")
  99.   (if of_dist
  100.     (progn
  101.       (if of_lay
  102.         (princ (strcat "\nTarget layer: " (strcase of_lay) ", "))
  103.         (princ "\nKeep layer, ")
  104.       )
  105.       (if of_e
  106.         (princ "Delete old line(s), ")
  107.         (princ "Keep old line(s), ")
  108.       )
  109.       (princ "Distance: ")
  110.       (if of_dist
  111.         (princ of_dist)
  112.         (princ "0.0")
  113.       )
  114.       (initget "Option")
  115.       (setq kwd (getkword "\nOption/<select>: "))
  116.       (if (= kwd "Option")
  117.         (2of_option)
  118.       )
  119.     )
  120.     (2of_option)
  121.   )
  122.   (setq ss (ssget '((0 . "Arc,Circle,Ellipse,*Line"))))
  123.   (if ss
  124.     (progn
  125.       (vlax-for        obj (vla-get-activeselectionset
  126.                       (vla-get-activedocument (vlax-get-acad-object))
  127.                     )
  128.         (ptlay (vla-offset obj dist) of_lay)
  129.         (ptlay (vla-offset obj (* dist -1)) of_lay)
  130.       )
  131.       (setq of_dist dist)
  132.       (if of_e
  133.         (progn
  134.           (setvar "cmdecho" 0)
  135.           (command "erase" ss "")
  136.           (setvar "cmdecho" 1)
  137.         )
  138.       )
  139.     )
  140.   )
  141.   (princ)
  142. )[/php]
  143.   [/FONT]


DCL:

  1.   [FONT=courier new]
  2. DD2OF : dialog {
  3.     label = "DD2OF Options";
  4.     initial_focus = "accept";
  5.     : row {
  6.       : boxed_column {
  7.         label="Layer setting";
  8.         : toggle {
  9.           label = "Change layer";
  10.           mnemonic= "C";
  11.           key = "chlay";
  12.         }
  13.         : popup_list {
  14.           label = "Layer name: ";
  15.           mnemonic= "L";
  16.           key = "layerlist";
  17.           width=27;
  18.         }
  19.       }
  20.       : boxed_column {
  21.         : row {
  22.           : toggle {
  23.             label = "Delete old objects";
  24.             mnemonic= "D";
  25.             key = "delold";
  26.           }
  27.         }
  28.         : row {
  29.           : column {
  30.             : edit_box {
  31.               label = "Offset distance: ";
  32.               mnemonic = "O";
  33.               key = "ofdist";
  34.             }
  35.           }
  36.           : column {
  37.             : button {
  38.                 label = "<";
  39.               mnemonic = "<";
  40.               key = "pickdis";
  41.             }
  42.           }
  43.         }
  44.       }
  45.     }
  46.     : row {
  47.       alignment=centered;
  48.       fixed_width=true;
  49.       ok_cancel;
  50.     }
  51. }
  52.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 23个

财富等级: 恭喜发财

发表于 2004-3-19 17:55:41 | 显示全部楼层
这是我的程序,可以随时切换选项:

Command: lk-command:Offset
Specify offset distance or [Exit/Remove source/Double side/Layer/Through]
<Through>:

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

使用道具 举报

 楼主| 发表于 2004-3-20 00:49:34 | 显示全部楼层
最初由 e2002 发布
其实命令行交互得易用性是最好的... 8-) [/B]


同意!
我也是能不用对话框就尽量不用。
这里之所以用,是因为有选择目标图层的需要,在命令行上就不方便了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-20 06:51:10 | 显示全部楼层
好早:)r14能用吗?什么命令调用
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 23个

财富等级: 恭喜发财

发表于 2004-3-20 09:14:20 | 显示全部楼层
选择图层也不需要用DCL,右键菜单选择图层更方便,请看:

Command: lk-select:InLayer
Specify an object or [in
Current/Dialog/Select/0(1)/DEFPOINTS(2)/XXX-图框(3)/XXX-院标(4)/板.填充(5)/尺寸
标注(6)/构造柱(7)/剪力墙(8)/剪力墙.填充(9)/梁.实线(10)/梁.虚线(11)/楼梯洞口(12)/
文字(13)/虚图框(14)/轴标(15)/轴线(16)/柱.填充(17)]:


Command: lk-command:Offset
Specify offset distance or [Exit/Remove source/Double side/Layer/Through]
<Through>:L

Specify an object or select
[0(0)/DEFPOINTS(1)/XXX-图框(2)/XXX-院标(3)/板.填充(4)/尺寸标注(5)/构造柱(6)/剪力
墙(7)/剪力墙.填充(8)/梁.实线(9)/梁.虚线(10)/楼梯洞口(11)/文字(12)/虚图框(13)/轴
标(14)/轴线(15)/柱.填充(16)]:
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-20 11:21:34 | 显示全部楼层
这什么是什么呀,程序太多,好心的人能不能整理一下子,我等门外汉就是看不懂呀?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-20 17:42:18 | 显示全部楼层

Re: [LISP程序]:双向OFFSET加强版

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

使用道具 举报

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

使用道具 举报

发表于 2004-3-20 18:06:00 | 显示全部楼层
最初由 wpcn 发布
[B]我用2004,没办法用. [/B]


你把解压后的二个文件复制到2004的support文件夹下,用appload加载,输入2of就行了(你是不是输了dd2of?我刚下载时就是这样,后来看了原程序才发现原来是2of。)
建议iVox 把“(defun c:2of (/ obj ss)”改为“(defun c:dd2of (/ obj ss)
”,与文件名对应。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-21 08:21:50 | 显示全部楼层
這個以對話框進行設計的很有用. 好程序值得推廣.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2004-3-22 16:52:22 | 显示全部楼层
各位大侠,能整理成个附件让我们这些小鸟下载吗?
我们不懂呀!
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-22 18:04:08 | 显示全部楼层
最初由 andyhua5240 发布
[B]各位大侠,能整理成个附件让我们这些小鸟下载吗?
我们不懂呀!
谢谢! [/B]


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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 19:49 , Processed in 0.385430 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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