明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 8328|回复: 22

[求助]求从多段线偏移某个线条的lisp程序?

  [复制链接]
发表于 2009-9-8 19:34:00 | 显示全部楼层 |阅读模式

大家好,从某个封闭多段线偏移一个直线,一般我会把当前的封闭多段线炸开,然后选一直线偏移,能不能不用炸开就直接选一条直线偏移,这样就能节约很多时间,求这种功能的lisp,谢谢!

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2009-9-13 14:28:00 | 显示全部楼层


大家别笑,04年那时候还没空玩vl,vba
程序中command可以用相应另外写的函数替换
  1. ;| (plnff eplst) = 偏移多义线单段线段------------ok!!!------------------lxx.2004.7.29
  2. 说明: 1.支持polyline及lwpolyline. 2.仅可偏移单段.
  3. 参数: eplst = (entsel)返回的表.必须选中多义线!
  4. 返回: (list eplst p2 (distance p p2) el)
  5. 测试: (plnff (entsel))
  6. |;
  7. (defun plnff (eplst / e p1 p ent el el0  k seq plx plx2 p2 pt d)
  8.   (setq e  (car eplst)
  9. p1 (cadr eplst)
  10. p  (vlax-curve-getclosestpointto e p1);;确保取点.
  11.         ent(entget e))
  12.   (if (= "LWPOLYLINE" (cdr(assoc 0 ent))) ;;转为旧式pl格式.
  13.     (progn
  14.       (vl-cmdf "_.convertpoly" "h" e "")
  15.       (setq eL (entlast) el0 el ent (entget el) k T)
  16.     )
  17.     (setq el e el0 e)
  18.   )
  19.   (while (/= "SEQEND" (cdr(assoc 0 (setq seq (entget(setq el (entnext el))))))));;取seqend段.
  20.   (setq ent (subst (cons 70 0) (assoc 70 ent) ent) ;;改为不封闭.
  21.         plx (entget (car(nentselp p1)));;取点中段的实体表.
  22.        plx2 (entget(entnext (cdr(assoc -1 plx)))));;下一个.
  23.   (if (equal seq plx2)(setq plx2 (entget (entnext el0))));;如果是闭合段,下一个取pl线第一段.
  24.   (mapcar 'entmakex(mapcar '(lambda (y) (vl-remove-if '(lambda(x)(member (car x) '(-1 5 -2))) y))(list ent plx plx2 seq)));;生成新的pl段.
  25.   ;(if k (entdel el0));;删除多余实体.
  26.   (setq pt (getpoint p "\n偏移方向及距离<输入数字or点取>:")
  27. d  (distance p pt)
  28. el (entlast))
  29.   (vl-cmdf "_.offset" d (list el p) pt "")
  30.   ;(while (/= 0 (getvar "cmdactive")) (vl-cmdf pause))
  31.   (entdel el)
  32.   (if (equal el (entlast)) nil (list eplst d (entlast)))
  33. )

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2009-9-13 09:04:00 | 显示全部楼层
  1. ;; 多段线逐段双向偏移
  2. (defun c:test823 ()
  3.   (CMDLA0)
  4.   (xyp-MkLaCo "TEST" 1)
  5.   (SETQ DIST (UDIST 1 "" "距离<输入或鼠标直接量取>" DIST nil))
  6.   (while (setq e (entsel "\n多段线: "))   
  7.     (if (member (xyp-get-dxf 0 (car e)) '("POLYLINE" "LWPOLYLINE"))
  8.       (progn
  9. (setq a  (xyp-get-Pts&Pte e)
  10.        p1 (car a)
  11.        p2 (cadr a)
  12.        S2 (XYP-ADD-LINE P1 P2)
  13. )
  14. (xyp-Offset (entlast) dist t t t)
  15.       )
  16.     )
  17.   )
  18.   (CMDLA1)
  19. )
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2009-9-11 22:12:00 | 显示全部楼层
刚才我在2004下又试了一遍,还是提示上面的错误啊,请楼上的兄弟再看看啊
回复 支持 1 反对 0

使用道具 举报

发表于 2009-9-9 08:33:00 | 显示全部楼层
将顶点找出来,创建直线
发表于 2009-9-9 09:24:00 | 显示全部楼层
本帖最后由 作者 于 2009-9-9 9:49:35 编辑

  1. (defun c:test (/     curve  pt       pt0
  2.         dt     copy-polyseg t2-explode   th-pt-oncurve-if
  3.         th2o     th2e  is-ename     is-vla-object
  4.         is-string    seg
  5.        )
  6. (defun thado ()
  7.   (cond
  8.     (%$*thado*$%)
  9.     (setq %$*thado*$% (vlax-get-acad-object))
  10.   )
  11. )
  12. (defun thactdoc ()
  13.   (cond
  14.     (%$*thactdoc*$%)
  15.     (setq %$*thactdoc*$% (vla-get-activedocument (thado)))
  16.   )
  17. )
  18.   (defun copy-polyseg (poly pt / olst seg)
  19.     (setq olst (t2-explode (th2o poly) nil))
  20.     (foreach each olst
  21.       (if (not (th-pt-oncurve-if (th2e each) (osnap pt "_nea")))
  22. (vla-delete each)
  23. (setq seg each)
  24.       )
  25.     )
  26.     seg
  27.   )
  28.   (defun t2-explode (obj del / expmde olst)
  29.     (setq expmde (getvar "EXPLMODE"))
  30.     (setq obj (th2o obj))
  31.     (setvar "EXPLMODE" 1)
  32.     (setq olst (vlax-invoke obj 'explode))
  33.     (if del
  34.       (vla-delete obj)
  35.     )
  36.     (setvar "EXPLMODE" expmde)
  37.     olst
  38.   )
  39.   (defun th-pt-oncurve-if (curve pt)
  40.     (and
  41.       curve
  42.       pt
  43.       (equal (distance pt (vlax-curve-getclosestpointto curve pt))
  44.       0
  45.       1e-6
  46.       )
  47.     )
  48.   )
  49.   (defun th2o (object)
  50.     (cond
  51.       ((is-ename object)
  52.        (vlax-ename->vla-object object)
  53.       )
  54.       ((is-vla-object object)
  55.        object
  56.       )
  57.       ((is-string object)
  58.        (vl-catch-all-apply
  59.   '(lambda ()
  60.      (vla-handletoobject (thactdoc) object)
  61.    )
  62.        )
  63.       )
  64.       (t
  65.        nil
  66.       )
  67.     )
  68.   )
  69.   (defun th2e (object)
  70.     (cond
  71.       ((is-ename object)
  72.        object
  73.       )
  74.       ((is-vla-object object)
  75.        (vlax-vla-object->ename object)
  76.       )
  77.       ((is-string object)
  78.        (vl-catch-all-apply
  79.   '(lambda ()
  80.      (vlax-vla-object->ename
  81.        (vla-handletoobject
  82.   (thactdoc)
  83.   object
  84.        )
  85.      )
  86.    )
  87.        )
  88.       )
  89.       (t
  90.        nil
  91.       )
  92.     )
  93.   )
  94.   (defun is-ename (arg)
  95.     (equal (type arg) 'ename)
  96.   )
  97.   (defun is-vla-object (obj)
  98.     (equal (type obj) 'vla-object)
  99.   )
  100.   (defun is-string (arg)
  101.     (equal (type arg) 'str)
  102.   )
  103.   (if (and
  104. (setq p (entsel "\n点取多义线:"))
  105. (setq pt0 (getpoint "\n偏移方向:"))
  106. (setq dt (getdist "\n偏移距离:"))
  107.       )
  108.     (progn
  109.       (setq curve (car p)
  110.      pt   (cadr p)
  111.       )
  112.       (setq seg (copy-polyseg curve pt))
  113.       (vl-cmdf "offset" dt (th2e seg) "_non" pt0 "")
  114.       (vla-delete seg)
  115.     )
  116.   )
  117.   (princ)
  118. )
发表于 2009-9-9 09:52:00 | 显示全部楼层
  1. (defun c:test1 (/   ent     bul       dt p
  2.   pt   pt0     laste     th-pl-getsegat
  3.   txt-mkline     th2o      txt-3rd txt-4th
  4.   txt-5th
  5.         )
  6.   (defun thado ()
  7.     (cond
  8.       (%$*thado*$%)
  9.       (setq %$*thado*$% (vlax-get-acad-object))
  10.     )
  11.   )
  12.   (defun thactdoc ()
  13.     (cond
  14.       (%$*thactdoc*$%)
  15.       (setq %$*thactdoc*$% (vla-get-activedocument (thado)))
  16.     )
  17.   )
  18.   (defun th-pl-getsegat (obj p / blg p1 p2 pa pcen pn v)
  19.     (setq pn (vlax-curve-getclosestpointto obj (trans p 1 0))
  20.    pa (fix (vlax-curve-getparamatpoint obj pn))
  21.    p1 (vlax-curve-getpointatparam obj pa)
  22.    p2 (vlax-curve-getpointatparam obj (1+ pa))
  23.     )
  24.     (setq obj (th2o obj))
  25.     (setq blg (vla-getbulge obj pa))
  26.     (if (zerop blg)
  27.       (list "kLine" (list pa (1+ pa)) p1 p2)
  28.       (progn
  29. (setq v    (vlax-curve-getsecondderiv obj pa)
  30.        pcen (mapcar
  31.        '+
  32.        p1
  33.        v
  34.      )
  35. )
  36. (if (> blg 0)
  37.    (list "kArc" (list pa (1+ pa)) pcen p1 p2)
  38.    (list "kArc"
  39.   (list pa (1+ pa))
  40.   (mapcar
  41.     '-
  42.     p1
  43.     v
  44.   )
  45.   p2
  46.   p1
  47.    )
  48. )
  49.       )
  50.     )
  51.   )
  52.   (defun txt-mkline (p1 p2 / ent)
  53.     (if (setq ent (entmakex (list '(0 . "LINE")
  54.       '(100 . "AcDbEntity")
  55.       '
  56.        (100 . "AcDbLine")
  57.       (cons 10 p1)
  58.       (cons 11 p2)
  59.       '(210 0. 0. 1.)
  60.        )
  61.     )
  62. )
  63.       ent
  64.     )
  65.   )
  66.   (defun th2o (object)
  67.     (cond
  68.       ((is-ename object)
  69.        (vlax-ename->vla-object object)
  70.       )
  71.       ((is-vla-object object)
  72.        object
  73.       )
  74.       ((is-string object)
  75.        (vl-catch-all-apply
  76.   '(lambda ()
  77.      (vla-handletoobject (thactdoc) object)
  78.    )
  79.        )
  80.       )
  81.       (t
  82.        nil
  83.       )
  84.     )
  85.   )
  86.   (defun txt-3rd (lst)
  87.     (caddr lst)
  88.   )
  89.   (defun txt-4th (lst)
  90.     (cadddr lst)
  91.   )
  92.   (defun txt-5th (lst)
  93.     (car (cddddr lst))
  94.   )
  95.   (if (and
  96. (setq p (entsel "\n点取多义线:"))
  97. (setq pt0 (getpoint "\n偏移方向:"))
  98. (setq dt (getdist "\n偏移距离:"))
  99.       )
  100.     (progn
  101.       (setq ent (car p)
  102.      pt (cadr p)
  103.       )
  104.       (setq bul (th-pl-getsegat (th2o ent) (osnap pt "_nea")))
  105.       (cond
  106. ((= (car bul) "kLine")
  107.   (setq laste (txt-mkline (txt-3rd bul) (txt-4th bul)))
  108.   (vl-cmdf "_.OFFSET" dt laste "_non" pt0 "")
  109.   (entdel laste)
  110. )
  111. ((= (car bul) "kArc")
  112.   (vl-cmdf "_.ARC"
  113.     "C"
  114.     (txt-3rd bul)
  115.     (txt-4th bul)
  116.     (txt-5th bul)
  117.   )
  118.   (setq laste (entlast))
  119.   (vl-cmdf "_.OFFSET" dt laste "_non" pt0 "")
  120.   (entdel laste)
  121. )
  122.       )
  123.     )
  124.   )
  125.   (princ)
  126. )
 楼主| 发表于 2009-9-9 19:44:00 | 显示全部楼层

谢谢楼上兄弟的热心,但是我用了后提示错误

错误: no function definition: IS-ENAME

还有就是能不能像CAD里的偏移命令O一样,不提示偏移距离,点到哪偏到哪,如果要精确的话,输入数值就好了,其实就是CAD偏移O命令,不同的是对象现在是多段线了,点取其中一个图元,进行偏移,能改善一下就更加完美了,谢谢了!

发表于 2009-9-9 21:08:00 | 显示全部楼层

多段线逐段双向偏移:

本帖子中包含更多资源

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

x
 楼主| 发表于 2009-9-9 22:07:00 | 显示全部楼层

各位来帮帮啊,谢谢!

 楼主| 发表于 2009-9-11 20:36:00 | 显示全部楼层
我顶上去,各位来看看啊
发表于 2009-9-11 21:23:00 | 显示全部楼层
3/4楼肯定可以
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-24 14:41 , Processed in 0.250712 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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