找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: whzhen

[求助] [求助]:一次点击保留中段(剪去两端)线怎么实现?

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

使用道具 举报

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

使用道具 举报

发表于 2005-3-22 14:14:51 | 显示全部楼层
我不知道对圆、椭圆等类型的如何操作,对直线和圆弧我也编写了一个,能实现功能,原理同10楼的一样。LUCAS能否提示一下,对圆和椭圆如何实现。我有另外一种想法就是不选择边界进行trim操作,在trim后,先取出想要的两个点,再undo,然后break两个点之间不要的部份。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-3-22 22:47:33 | 显示全部楼层
用xd_api写了一个
不想用api的,自己翻译成vlisp吧

图例就LUCAS的吧
解决了多义线的问题

有bug提出来.

  1. (defun c:t1( / bou curve e el en p pt pts ss x y br: rdraw ss1 poly:)
  2.   (defun br:(e p / ang p1)
  3.     (setq ang(angle '(0 0 0)(xdrx_curve_getFirstDeriv e p))
  4.           p1(polar p ang 1e-3)
  5.     )
  6.     (command "break"(list e p)"F"p p1)
  7.   )
  8.   (defun rdraw(ss n / i) ;;redraw
  9.    (if ss(progn
  10.      (setq i -1)
  11.      (repeat(sslength ss)(redraw(ssname ss(setq i(1+ i)))n))
  12.    ))
  13.   )
  14.   (defun poly:(e / pts) ;;首尾相连pl
  15.     (if(and(= 0(xdrx_GetEntDxf 70))
  16.           (setq pts( xdrx_curve_GetPoint e))
  17.           (equal(car pts)(last pts)1e-3)
  18.        )
  19.        (xdrx_ModEnt 70 1)
  20.     )
  21.     t
  22.   )
  23. ;;;-------
  24.   (xdrx_begin '("cmdecho" 0))
  25.   (princ "\n选择边界(回车全部): ")
  26.   (setq curve '((0 . "*LINE,ARC,ELL*,CIR*")));;dim也能做,但很复杂
  27.   (setq ss(ssget curve))
  28.   (rdraw ss 3)
  29.   (while(and
  30.           (setq e (xdrx_entsel "\n选择要保留的段: " curve))
  31.           (setq pt(cadr e)
  32.                 e(car e)
  33.                 el(entlast)
  34.           )
  35.           (or ss
  36.             (setq bou(xdrx_entity_box e) ;;如果没边界,那就所有相交的.
  37.                   ss(ssget "C"(car bou)(caddr bou)curve)
  38.             )
  39.           )
  40.          (progn(ssdel e ss)t)
  41.          (>(sslength ss)0)
  42.          (setq pts(xdrx_getinters e ss 0));;所有交点
  43.          (xdrx_SetEntToDb e)
  44.          (setq name (xdrx_GetEntDxf 0))
  45.          (if(wcmatch name "CIR*,ELL*") ;;圆,椭圆要两个交点
  46.              (> (length pts)1)
  47.              t
  48.          )
  49.          (if(wcmatch name "*POLYLINE")
  50.                 (poly: e) t   ;;pl 首尾相连&不闭合:处理一下
  51.          )
  52.      )
  53.      (progn
  54.       (if(or (wcmatch(cdr(assoc 0(entget e)))"CIR*,ELL*");;处理  :圆,椭圆
  55.              (and (wcmatch name "*POLYLINE")             ;;      :闭合多义线
  56.                   (= 1(xdrx_GetEntDxf 70))
  57.              )
  58.          )
  59.          (br: e (car pts))
  60.       )
  61.       (setq pts (vl-sort pts
  62.                  '(lambda(x y)(>(xdrx_curve_getParamAtPoint e x)
  63.                                 (xdrx_curve_getParamAtPoint e y)
  64.                               )
  65.                  ))
  66.       )
  67.       (foreach p pts               ;;所有交点打断
  68.         (command "break"(list e p)"f"p p)
  69.       )
  70.       (setq ss1(ssget pt))
  71.       (command "erase" e)          ;;不要的删除
  72.       (while(setq el(entnext el))(command el))
  73.       (command "R" ss1 "")
  74.      )
  75.    )
  76.    (rdraw ss 4)
  77.    (xdrx_end)
  78.    (princ)
  79. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-23 15:25:05 | 显示全部楼层
aeo兄:傳圖供測試,功能還有一些bug
ps:我提供的程序已更新(3月23日 下午03:51)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-3-23 20:21:03 | 显示全部楼层
忙了几天没上网,再来一看这个话题有了不少跟帖,对斑竹提供的程序很满意,非常感谢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-3-24 12:23:41 | 显示全部楼层
陌生人兄:我用trim & lengthen 越寫越長,發現問題越多,有空要再重寫一次  8-(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-3-24 14:56:04 | 显示全部楼层

  1. ;;By LUCAS(龍龍仔)
  2. ;;這是最初版本,錯漏百出,供你參考!
  3. ;;後來程序越來越難看,不便貼出.
  4. ;;(*polyline & spline---閉合&首尾點重合沒有弄好)  8-(

  5. ;;線類思路
  6. ;;1.在trim後,先取出想要的(1~2個點),再undo
  7. ;;2.計算trim後線長度,用lengthen調整線長

  8. ;;圓、橢圓思路
  9. ;;1.正常trim圓、橢圓
  10. ;;2.修改端點(交換)

  11. (defun C:TRIM_REMAIN (/              DATA50  DATA51  ENT     ENTT    ENTTT
  12.                       HOLDECHO              LEND    LENT    LSTART  PT10
  13.                       PT11    SS      TYP     E42
  14.                      )
  15.   (vl-load-com)
  16.   (defun DO_IT ()
  17.     (if        (member        PT11
  18.                 (list (vlax-curve-getstartpoint ENTT)
  19.                       (vlax-curve-getendpoint ENTT)
  20.                 )
  21.         )
  22.       (command "_.undo"
  23.                1
  24.                "_.lengthen"
  25.                "de"
  26.                (- LSTART)
  27.                (list (car ENT) PT11)
  28.                ""

  29.       )
  30.       (command "_.undo"
  31.                1
  32.                "_.lengthen"
  33.                "de"
  34.                (- LSTART)
  35.                (list (car ENT) PT10)
  36.                ""
  37.       )
  38.     )
  39.   )
  40.   (setq HOLDECHO (getvar "cmdecho"))
  41.   (setvar "cmdecho" 0)
  42.   (command "_.UNDO" "_GROUP")
  43.   (while
  44.     (and (setq
  45.            ENT (entsel "\n選取保留段: ")
  46.          )
  47.          (setq TYP (cdr (assoc 0 (entget (car ENT)))))
  48.          (wcmatch TYP "*POLYLINE,SPLINE,LINE,ARC,CIRCLE,ELLIPSE")
  49.     )

  50.      (if (wcmatch TYP "ELLIPSE")
  51.        (setq E42 (cdr (assoc 42 (entget (car ENT)))))
  52.      )
  53.      (setq ENTT (vlax-ename->vla-object (car ENT)))
  54.      (setq PT10        (vlax-curve-getstartpoint ENTT)
  55.            PT11        (vlax-curve-getendpoint ENTT)
  56.      )
  57.      (setq LENT (entlast))
  58.      (command "_.select" "all" "r" (car ENT) "")
  59.      (setq SS (ssget "p"))
  60.      (command "_.trim" "l" "" "p" "n" "e" "n" "" "_.trim" SS ""        ENT "")
  61.      (if (wcmatch (cdr (assoc 0 (entget (entlast))))
  62.                   "*POLYLINE,SPLINE,LINE,ARC,CIRCLE,ELLIPSE"
  63.          )
  64.        (setq LEND (vlax-curve-getdistatparam
  65.                     (setq ENTTT (vlax-ename->vla-object (entlast)))
  66.                     (vlax-curve-getendparam ENTTT)
  67.                   )
  68.        )
  69.      )
  70.      (cond
  71.        ((and (wcmatch TYP "POLYLINE")
  72.              (not (equal LENT (entlast)))
  73.         )
  74.         (setq LSTART
  75.                (vlax-curve-getdistatparam
  76.                  (setq ENTT (vlax-ename->vla-object (entnext LENT)))
  77.                  (vlax-curve-getendparam ENTT)
  78.                )
  79.         )
  80.         (if (not (equal (entnext LENT) (entlast)))
  81.           (command "_.undo"
  82.                    1
  83.                    "_.lengthen"
  84.                    "de"
  85.                    (- LSTART)
  86.                    (list (car ENT) PT10)
  87.                    ""
  88.                    "_.lengthen"
  89.                    "de"
  90.                    (- LEND)
  91.                    (list (entlast) PT11)
  92.                    ""
  93.           )
  94.           (DO_IT)
  95.         )
  96.        )
  97.        ((wcmatch TYP "CIRCLE")
  98.         (setq ENT
  99.                (entget (ssname (ssget "X"
  100.                                       (list (cons 0 "ARC")
  101.                                             (assoc 10 (entget (car ENT)))
  102.                                       )
  103.                                )
  104.                                0
  105.                        )
  106.                )
  107.         )
  108.         (setq DATA50 (cdr (assoc 50 ENT)))
  109.         (setq DATA51 (cdr (assoc 51 ENT)))
  110.         (setq ENT (vl-remove (assoc 50 ENT) ENT))
  111.         (setq ENT (vl-remove (assoc 51 ENT) ENT))
  112.         (setq
  113.           ENT (append ENT (list (cons 50 DATA51) (cons 51 DATA50)))
  114.         )
  115.         (entmod ENT)
  116.         (command "_.move" (cdr (assoc -1 ENT)) "" "0,0" "@")
  117.        )
  118.        ((and (wcmatch TYP "ELLIPSE")
  119.              (equal E42 6.28318530717 0.00000000001)
  120.         )
  121.         (setq ENT
  122.                (entget (ssname (ssget "X"
  123.                                       (list (cons 0 "ELLIPSE")
  124.                                             (assoc 10 (entget (car ENT)))
  125.                                       )
  126.                                )
  127.                                0
  128.                        )
  129.                )
  130.         )
  131.         (setq DATA50 (cdr (assoc 41 ENT)))
  132.         (setq DATA51 (cdr (assoc 42 ENT)))
  133.         (setq ENT (vl-remove (assoc 41 ENT) ENT))
  134.         (setq ENT (vl-remove (assoc 42 ENT) ENT))
  135.         (setq
  136.           ENT (append ENT (list (cons 41 DATA51) (cons 42 DATA50)))
  137.         )
  138.         (entmod ENT)
  139.         (command "_.move" (cdr (assoc -1 ENT)) "" "0,0" "@")
  140.        )
  141.        (t
  142.         (setq LSTART (vlax-curve-getdistatparam
  143.                        ENTT
  144.                        (vlax-curve-getendparam ENTT)
  145.                      )
  146.         )
  147.         (if (not (equal (entlast) LENT))
  148.           (command "_.undo"
  149.                    1
  150.                    "_.lengthen"
  151.                    "de"
  152.                    (- LSTART)
  153.                    (list (car ENT) PT10)
  154.                    ""
  155.                    "_.lengthen"
  156.                    "de"
  157.                    (- LEND)
  158.                    (list (car ENT) PT11)
  159.                    ""
  160.           )
  161.           (DO_IT)
  162.         )
  163.        )
  164.      )
  165.   )
  166.   (command "_.UNDO" "_END")
  167.   (setvar "cmdecho" HOLDECHO)
  168.   (princ)
  169. )
  170. (prompt "\nType Trim_remain,By LUCAS(龍龍仔)")
  171. (princ)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-24 17:19:29 | 显示全部楼层
试了一下.
lucas你的程序对封闭多义线,spline失效. 应该是用了length的原因,除非采取别的办法.
但对圆和椭圆效果还是比较令人满意的
aeo的可能问题多一些.
首先,一开始不应该确定选集,因为剪切后会形成新的实体,且应成为下一次剪切的边界,一开始确定选集无法有实时效果.
对封闭曲线还不能有效处理.
对开口的椭圆有bug
大家继续改进啊,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-3-25 01:07:23 | 显示全部楼层
最初由 狂刀 发布
[B]试了一下.
lucas你的程序对封闭多义线,spline失效. 应该是用了length的原因,除非采取别的办法.
但对圆和椭圆效果还是比较令人满意的
aeo的可能问题多一些.
首先,一开始不应该确定选集,因为剪切后会形成新的实体,... [/B]


你不要在那里瞎掰了
你的cad的trim不是先选东西的(不选才奇怪,测试的时候感觉越简单越好,实际运用不是那么回事)
自己trim掉自己后,cad还亮显?

新生成的加入边界,其实是很简单,我特意把它去掉的.(检测一下而已,就是速度会慢一点:边界比较多的情况.)

开口的椭圆有时候是出错?什么状态?

封闭曲线?

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-3-25 01:19:42 | 显示全部楼层
"aeo的可能问题多一些."

肯定是没测试!

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 02:32 , Processed in 0.250701 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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