找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2849|回复: 25

[求助] 求在已有多义线上接着画的代码

[复制链接]
发表于 2013-9-20 23:46:13 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 清风明月10 于 2013-9-21 00:19 编辑

请问,我已经画了一条直线型的多义线,但中途中断了,如何接着画呢?也就 是说接着画是同一条线,而不是两条多义线

这是网上得到的多段线增加顶点的代码,我想改成增加的顶点总是紧接着多段线的最后一个点,不知道如何改法?

(defun C:TT (/ EN OBJ PT PP)
  (if (and (setq EN (entsel "\n选择多选线: "))
           (setq EN (car EN))
           (sssetfirst nil (ssadd EN))
           (setq OBJ (vlax-ename->vla-object EN))
           (or (= (vla-get-objectname OBJ) "AcDbPolyline")
               (and (princ "\n所选的对象不是多段线。") nil)
           )
      )
    (while (setq PT (getpoint "\n指定新顶点: "))
      (setq PT (trans PT 1 0)
            PP (vlax-curve-getclosestpointto OBJ PT))
      (vlax-invoke
        OBJ
        'ADDVERTEX
        (1+ (fix (vlax-curve-getparamatpoint OBJ PP)))
        (list (car PT) (cadr PT))
      )
    )
  )
  (sssetfirst)
  (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2013-9-21 10:08:03 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-9-21 10:26 编辑

再写个 Vlisp 留个记号,还可以增加 Undo 选项
在末尾增加顶点时要先将末尾点移动到新增加的点,然后“增加”的点 Index 是原 pline 的 endparam
  1. (defun c:tt (/ ss e obj p ep)
  2.   (if (setq ss (ssget ":s" '((0 . "LWPOLYLINE"))))
  3.     (progn
  4.       (setq e    (ssname ss 0)
  5.         obj    (vlax-ename->vla-object e)
  6.       )
  7.       (while (setq p (getpoint (vlax-curve-getendpoint e) "\nNext Point: "))
  8.     (setq p     (trans p e 1)
  9.           ep (vla-get-coordinate obj (fix (vlax-curve-getendparam e)))
  10.     )
  11.     (vla-put-coordinate
  12.       obj
  13.       (fix (vlax-curve-getendparam e))
  14.       (vlax-make-variant
  15.         (vlax-safearray-fill
  16.           (vlax-make-safearray vlax-vbdouble '(0 . 1))
  17.           (list (car p) (cadr p))
  18.         )
  19.       )
  20.     )
  21.     (vla-addvertex
  22.       obj
  23.       (fix (vlax-curve-getendparam e))
  24.       ep
  25.     );_ (vlax-invoke obj 'AddVertex (fix (vlax-curve-getendparam e)) (list (car p) (cadr p)))
  26.       )
  27.     )
  28.   )
  29.   (princ)
  30. )


点评

把 Undo 选项加上就更完美了.  发表于 2013-9-21 16:47
谢谢您!很好用  发表于 2013-9-21 10:54
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-9-21 00:20:33 | 显示全部楼层
本帖最后由 清风明月10 于 2013-9-21 00:25 编辑

那不行,主要问题在于会增加一个端点。再者也不自然,画第二条线(上百个点)后,还要回来倒一次角,很费精力
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-9-21 07:58:30 | 显示全部楼层
我是新手,但感觉这样不太可能,建意用院长的函数,将完成后的多段线自动连接成整体。
  1. (defun c:tt()
  2.         (setq ss (xyp-CurveJoin (entlast) 0.1))
  3. (setq en (xyp-PeditJoin ss 0.1))
  4. )

  5. ;;(xyp-CurveJoin (entlast) 0.1)可改成(xyp-CurveJoin (car(entsel)) 0.1)

点评

我发的代码经修改肯定可以做到,只是要想法查VLAX的含义  详情 回复 发表于 2013-9-21 08:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-9-21 07:59:39 | 显示全部楼层
同样,也希望API增加:首尾曲线选择集函数,很好用,也很常用!

点评

函数库已经有了,XD:ickset2PL http://www.xdcad.net/forum/forum.php?mod=viewthread&tid=669548  详情 回复 发表于 2013-9-21 14:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-21 08:08:40 | 显示全部楼层
q3_2006
我是新手,但感觉这样不太可能,

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

使用道具 举报

 楼主| 发表于 2013-9-21 08:09:38 | 显示全部楼层
q3_2006 发表于 2013-9-21 07:58
我是新手,但感觉这样不太可能,建意用院长的函数,将完成后的多段线自动连接成整体。

我发的代码经修改肯定可以做到,只是要想法查VLAX的含义

点评

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-9-21 08:17:35 | 显示全部楼层
本帖最后由 q3_2006 于 2013-9-21 08:26 编辑
清风明月10 发表于 2013-9-21 08:09
我发的代码经修改肯定可以做到,只是要想法查VLAX的含义
vlax-curve-getClosestPointTo 返回曲线上离指定点最近的点(在 WCS 上)
语法:(vlax-curve-getClosestPointTo curve-obj givenPnt [extend])
参数:
curve-obj
要测量的 VLA 对象。
givenPnt
点(在 WCS 上),寻找曲线上距该点最近的点。
extend
如果指定该参数且其值不为 nil,vlax-curve-getClosestPointTo 在搜索最近点时扩展曲线。
返回值:
如果成功则返回表示曲线上一点的三维点表,否则返回 nil。


vlax-curve-getParamAtPoint 返回曲线在指定点的参数

语法:
(vlax-curve-getParamAtPoint curve-obj point)


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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2013-9-21 08:36:18 | 显示全部楼层
关键下面一句不懂,且“ADDVERTEX”无法查得其含义

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

使用道具 举报

 楼主| 发表于 2013-9-21 09:18:41 | 显示全部楼层
就这样将就解决了这个问题
(defun C:紧接着直线型轻多义线A的后面画A (/ ent PLTYPE obj vtx vtxlst n ptlst)
    (vl-load-com)
    (setq ent (entsel "\n选取多线:\n"))
    (if ent
        (progn
          (setq PLTYPE (cdr (assoc 0 (entget (car ent)))))
          (if (or (= "POLYLINE" PLTYPE) (= "LWPOLYLINE" PLTYPE))
              (progn
                 (setq obj (vlax-ename->vla-object (car ent)))
                 (setq vtx (vla-get-Coordinates obj))
                 (setq vtxlst (vlax-safearray->list (vlax-variant-value vtx)))
                 (setq n 0)
                 (setq ptlst nil)

                (repeat (/ (length vtxlst) 2)
                         (setq ptlst (append ptlst (list (list (nth n vtxlst) (nth (1+ n) vtxlst)))))
                         (setq n (+ n 2))
                 )
                 (if ptlst
(PROGN
(command "erase" ent "")
  (command "_PLINE")
  (mapcar 'command ptlst)
(command PAUSE)
  
  )



                   nil)
             )
             (prompt "\n选取实体不是多义线!")
          );if
       )      
     );if
  )

点评

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

使用道具 举报

 楼主| 发表于 2013-9-21 09:23:19 | 显示全部楼层
我将就型地解决了,解决的代码见上帖。如果能在1楼的代码基础上解决,更好

点评

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

使用道具 举报

发表于 2013-9-21 09:42:41 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-9-21 10:23 编辑
清风明月10 发表于 2013-9-21 09:23
我将就型地解决了,解决的代码见上帖。如果能在1楼的代码基础上解决,更好

适用 XDAPI
  1. (defun c:tt (/ e endpam ep p)
  2.   (if (setq e (car (xdrx_entsel "\nPick Pline: ")))
  3.     (while (setq p
  4.           (getpoint (vlax-curve-getendpoint e) "\nNext Point: ")
  5.        )
  6.       (setq ep       (vlax-curve-getendpoint e)
  7.         endpam  (fix (vlax-curve-getendparam e))
  8.       )
  9.       (xdrx_polyline_setpointat e  endpam p)
  10.       (xdrx_polyline_addvertexat e endpam ep)
  11.     )
  12.   )
  13.   (princ)
  14. )


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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-9-21 14:34:01 | 显示全部楼层
q3_2006 发表于 2013-9-21 07:59
同样,也希望API增加:首尾曲线选择集函数,很好用,也很常用!

函数库已经有了,XD::Pickset:L2PL

http://www.xdcad.net/forum/forum ... read&tid=669548

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 17:08 , Processed in 0.561701 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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