找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 587|回复: 4

[求助] 请教大神双边偏移功能

[复制链接]
发表于 2019-7-25 08:11:40 | 显示全部楼层 |阅读模式

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

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

×
  1. (defun C:af (/ ss1 entName1 OffDist n i sPt Pt1 Pt2 tAngle IsDelete IsCurLayer oldOSnap)
  2. ;(CMDINIT0);保存用户系统变量.
  3. (vl-load-com)
  4. (setq oldOSnap (getvar "OSmode"))
  5. (if (= #AY_OFF2ISDELETE nil) (setq #AY_OFF2ISDELETE "N"))
  6. (if (= #AY_OFF2ISCURLAYER nil) (setq #AY_OFF2ISCURLAYER "N"))
  7. (initget "S" 0)
  8. (setq OffDist (getdist (strcat "\n设置(S)/指定单向偏移距离<" (rtos (getvar "offsetdist")) ">:")))
  9. (if (= (Type OffDist) 'STR)
  10. (progn
  11. (initget "Y N")
  12. (setq IsDelete (getkword (strcat "\n是(Y)/否(N)删除原曲线对象?<" #AY_OFF2ISDELETE ">:")))
  13. (if (Null IsDelete) (setq IsDelete #AY_OFF2ISDELETE) (setq #AY_OFF2ISDELETE IsDelete))
  14. (initget "Y N")
  15. (setq IsCurLayer (getkword (strcat "\n是(Y)/否(N)将偏移后的对象置到当前层?<" #AY_OFF2ISCURLAYER ">:")))
  16. (if (Null IsCurLayer) (setq IsCurLayer #AY_OFF2ISCURLAYER) (setq #AY_OFF2ISDELETE IsCurLayer))
  17. (setq OffDist (getdist (strcat "\n指定单向偏移距离<" (rtos (getvar "offsetdist")) ">:")))
  18. );end_progn
  19. );end_if
  20. (if (null OffDist) (setq OffDist (getvar "offsetdist")));
  21. (setq ss1 (ssget ))
  22. (setq n (sslength ss1))
  23. (setq i 0)
  24. (setvar "osmode" 0)
  25. (while (< i n)
  26. (setq entName1 (ssname ss1 i))
  27. (setq sPt (vlax-curve-getStartPoint entName1))
  28. (setq tAngle (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv entName1
  29. (vlax-curve-getparamatpoint entName1
  30. (vlax-curve-getclosestpointto entName1 sPt)))))
  31. (setq Pt1 (polar sPt (+ tAngle (/ pi 2.0)) OffDist))
  32. (setq Pt2 (polar sPt (- tAngle (/ pi 2.0)) OffDist))
  33. (command "_.OFFSET" OffDist entName1 Pt1 "")
  34. (if (= IsCurLayer "Y")
  35. (progn
  36. (setq ent1 (entget (entlast)))
  37. (setq ent1 (subst (cons 8 (getvar "clayer")) (assoc 8 ent1) ent1))
  38. (entmod ent1)
  39. );end_progn
  40. );end_if
  41. (command "_.OFFSET" OffDist entName1 Pt2 "")
  42. (if (= IsCurLayer "Y")
  43. (progn
  44. (setq ent1 (entget (entlast)))
  45. (setq ent1 (subst (cons 8 (getvar "clayer")) (assoc 8 ent1) ent1))
  46. (entmod ent1)
  47. );end_progn
  48. );end_if
  49. (if (= IsDelete "Y") (command"_.Erase" entName1 ""))
  50. (setq i (1+ i))
  51. );end_while
  52. (setvar "osmode" oldOSnap)
  53. (princ)
  54. ;(CMDINIT1);恢复用户系统变量.
  55. );end_defun  
上面是网上找到双边偏移代码,能否实现双边偏移后把中间线(箭头所指的线)删除掉



1.png

最后重点把堵头封死。
2.png






谢谢大神,谢谢大神,谢谢大神!!!





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

已领礼包: 15个

财富等级: 恭喜发财

发表于 2019-7-25 09:10:21 | 显示全部楼层
(defun C:af (/ ENT1 ENTNAME1 I N OFFDIST OLDOSNAP PT1 PT2 SPT SS1 TANGLE XT1 XT2 XT3 XT4)
(vl-load-com)
(setq oldOSnap (getvar "OSmode"))
(setq OffDist (getdist (strcat "\n指定单向偏移距离<" (rtos (getvar "offsetdist")) ">:")))
(if (null OffDist) (setq OffDist (getvar "offsetdist")))
(setq ss1 (ssget ))
(setq n (sslength ss1))
(setq i 0)
(setvar "osmode" 0)
(while (< i n)
(setq entName1 (ssname ss1 i))
(setq sPt (vlax-curve-getStartPoint entName1))
(setq tAngle (angle '(0.0 0.0 0.0) (vlax-curve-getFirstDeriv entName1
(vlax-curve-getparamatpoint entName1
(vlax-curve-getclosestpointto entName1 sPt)))))
(setq Pt1 (polar sPt (+ tAngle (/ pi 2.0)) OffDist))
(setq Pt2 (polar sPt (- tAngle (/ pi 2.0)) OffDist))
(command "_.OFFSET" OffDist entName1 Pt1 "")
(setq ent1 (entget (entlast)))
(setq ent1 (subst (cons 8 (getvar "clayer")) (assoc 8 ent1) ent1))
(entmod ent1);end_if
(setq xt1 (cdr (assoc 10 ent1)))
(setq xt2 (cdr (assoc 11 ent1)))  
(command "_.OFFSET" OffDist entName1 Pt2 "")
(setq ent1 (entget (entlast)))
(setq ent1 (subst (cons 8 (getvar "clayer")) (assoc 8 ent1) ent1))
(entmod ent1);end_if
(setq xt3 (cdr (assoc 10 ent1)))
(setq xt4 (cdr (assoc 11 ent1)))
(entmake (list '(0 . "Line") (cons 10 xt1) (cons 11 xt3) (cons 8 (cdr (assoc 8 ent1)))))
(entmake (list '(0 . "Line") (cons 10 xt2) (cons 11 xt4) (cons 8 (cdr (assoc 8 ent1)))))  
(command"_.Erase" entName1 "")
(setq i (1+ i))
);end_while
(setvar "osmode" oldOSnap)
(princ)
)
;;;;按你

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

使用道具 举报

 楼主| 发表于 2019-7-25 09:56:27 | 显示全部楼层
爱莫能助 发表于 2019-7-25 09:10
(defun C:af (/ ENT1 ENTNAME1 I N OFFDIST OLDOSNAP PT1 PT2 SPT SS1 TANGLE XT1 XT2 XT3 XT4)
(vl-load- ...

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

使用道具 举报

已领礼包: 586个

财富等级: 财运亨通

发表于 2019-7-25 10:54:19 | 显示全部楼层
本帖最后由 王鹏_pBZlo 于 2019-7-25 11:14 编辑

(defun c:ml( / temposm sx att pt10 pt11 pt1 pt2 attpro nprolst)
        (setq temposm (getvar "osmode"))
        (setq sx (getdist "\n双线间距(mm):"))
        (while (setq sset (ssget))
            (command "undo" "be")
            (setvar "osmode" 0)
            (setq i -1)
            (while        (setq att (ssname sset (setq i (1+ i))))
                (setq attpro (entget att))
                (setq nprolst (list (cons 0 "LINE") (assoc 8 attpro)))
                (if (assoc 62 attpro) (setq nprolst (append nprolst (list (assoc 62 attpro)))))
                (if (assoc 6 attpro) (setq nprolst (append nprolst (list (assoc 6 attpro)))))
                (setq pt10 (cdr (assoc 10 attpro)))
                (setq pt11 (cdr (assoc 11 attpro)))
                (setq pt1 (polar pt10 (- (angle pt10 pt11) (/ pi 2)) (* 0.5 sx)))
                (setq pt2 (polar pt10 (+ (angle pt10 pt11) (/ pi 2)) (* 0.5 sx)))
                (setq pt3 (polar pt11 (- (angle pt10 pt11) (/ pi 2)) (* 0.5 sx)))
                (setq pt4 (polar pt11 (+ (angle pt10 pt11) (/ pi 2)) (* 0.5 sx)))
                (command "move" att  "" pt10 pt1)
                (command "copy" att "" pt1 pt2)
                (entmake (append nprolst (list (cons 10 pt1) (cons 11 pt2))))
                (entmake (append nprolst (list (cons 10 pt3) (cons 11 pt4))))
            )        (command "undo" "e")(setvar "osmode" temposm)
        ) (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 586个

财富等级: 财运亨通

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 14:19 , Processed in 0.277459 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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