找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2821|回复: 7

[求助] [求助]:请教,如何在多段线上加点或删点?

[复制链接]
发表于 2005-11-19 10:30:29 | 显示全部楼层 |阅读模式

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

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

×
请教,如何在多段线上加点或删点?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2009-4-12 00:41:33 | 显示全部楼层
SORRY,忘记了一个函数

  1.   [FONT=courier new]
  2. (defun hj:getpllist (Polyline / enType %repeat #rev-PolyLine #1 %id-PolyLine objPolyline)
  3.   ;;(setq enVertex (ent
  4.   (setq objPolyline(vlax-ename->vla-object Polyline))
  5.   (setq        #1 (vlax-safearray->list
  6.              (vlax-variant-value
  7.                (vla-get-Coordinates
  8.                  objPolyline
  9.                )
  10.              )
  11.            )
  12.   )
  13.   (if (= (vla-get-ObjectName objPolyline) "AcDb2dPolyline")
  14.     (setq enType 3)
  15.     (setq enType 2)
  16.     )
  17.   (setq %id-PolyLine 0
  18.         %repeat (/ (length #1) enType))
  19.   (repeat %repeat
  20.     (setq #rev-polyline1 (list (nth (* %id-PolyLine enType) #1)
  21.                        (nth (1+ (* %id-PolyLine enType)) #1)
  22.                  ))
  23.     (if (not (equal #rev-polyline1 (car #rev-PolyLine) 1e-09))
  24.       (setq #rev-PolyLine
  25.              (cons
  26.                #rev-polyline1
  27.                #rev-PolyLine
  28.                )
  29.             )
  30.       )
  31.     (setq %id-PolyLine (1+ %id-PolyLine))
  32.   ) ;_end repeat
  33.   (REVERSE #rev-PolyLine)
  34. )
  35.   [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 1261个

财富等级: 财源广进

发表于 2005-11-19 23:44:35 | 显示全部楼层
add   node   pedit   
del    node   do not  know
use lsp\arx\vba  or other
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2009-4-8 23:55:51 | 显示全部楼层
这是我自己写的一个命令,献献丑

  1.   [FONT=courier new]
  2. ;;;--------------------------------------------------------
  3. ;;;函数: c:ad
  4. ;;;--------------------------------------------------------
  5. ;;;来源:            作者: caddog
  6. ;;;编制时间:2007.3
  7. ;;;功能:     添加多段线的顶点
  8. ;;;语法:     
  9. ;;;参数      
  10. ;;;返回值:   
  11. ;;;备注  :   学习VBA看到ADDVERTEX,试着写了一个看看
  12. ;;;--------------------------------------------------------
  13. (DEFUN C:ad  (/        2dp ename n obj        p pp ss1 ss2 t1        var2dp StartWidth
  14.               endWidth ss2Type #sortVertex)
  15.   (SETQ SS1 (ENTSEL "\n请选择一条多段线:"))
  16.   (SETQ ENAME (CAR SS1))
  17.   (SETQ OBJ (VLAX-ENAME->VLA-OBJECT ENAME))
  18.   (setq ss2Type (VLA-GET-OBJECTNAME obj))
  19.   ;;如果是多段线则处理
  20.   (IF (WCMATCH ss2Type "LWPOLYLINE,AcDbPolyline,POLYLINE,AcDb2dPolyline") ; _
  21.                                                                    ; 结束wcmatch
  22.     (PROGN
  23.       ;;显示多段线的夹点,便于用户查看       
  24.       (SETQ ss2 (SSADD ENAME))
  25.       (SSSETFIRST NIL ss2)
  26.       ;;提示用户选择插入点
  27.       (SETQ P (GETPOINT "\n请选择插入点:"))
  28.       ;;当点P有值时循环
  29.       (WHILE p
  30.         ;;确定用户所指定的插入点的位置,是在哪个顶点之后
  31.         (SETQ PP (VLAX-CURVE-GETCLOSESTPOINTTO OBJ (TRANS P 1 0)))
  32.         (SETQ N (+ (FIX (VLAX-CURVE-GETPARAMATPOINT OBJ PP)) 1))
  33.         ;;取插入点外原来的起始宽度和终止宽度
  34.         ;;试着用PEDIT命令添加顶点,观察加入点后宽度的变化可知
  35.         ;;新加入顶点的起始/终止宽度均为原来的的终止宽度
  36.         (if (WCMATCH ss2Type "POLYLINE,AcDb2dPolyline")
  37.           (progn
  38.             ;;如果是二维多段线,则不能如此简单地处理
  39.             ;;二维多段线是经过了样条或按拟合的,所以先求出它的所有顶点,确定每一个
  40.             ;;顶点相对于该曲线的参数,以此参数列表及PP值来求出N值 2008.8.4
  41.             (setq #sortVertex (mapcar '(lambda(x) (vlax-curve-getParamAtPoint obj (VLAX-CURVE-GETCLOSESTPOINTTO OBJ (TRANS x 1 0)))) (hj:getpllist ename)))
  42.             (setq n  (1-(VL-POSITION (VLAX-CURVE-GETPARAMATPOINT OBJ PP) (vl-sort (append #sortVertex (list (VLAX-CURVE-GETPARAMATPOINT OBJ PP))) '<)))        )
  43.             
  44.             )
  45.           (VLA-GETWIDTH obj (- n 1) 'StartWidth 'endWidth)
  46.           )
  47.         ;; 创建安全数组,并将点取的坐标赋给它.注意ADDVERTEX方法只接受二维点
  48.         (SETQ 2DP (VLAX-MAKE-SAFEARRAY VLAX-VBDOUBLE '(0 . 1)))
  49.         (VLAX-SAFEARRAY-FILL 2DP (LIST (CAR P) (CADR P)))
  50.         ;;转换安全数组为变体
  51.         (SETQ VAR2DP (VLAX-MAKE-VARIANT 2DP))
  52.         ;;调用ACTIVEX方法添加顶点
  53.         (if (WCMATCH ss2Type "POLYLINE,AcDb2dPolyline")
  54.           (progn
  55.             (setq #vertexS(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates obj))))
  56.             (setq #vertexS(STD-SPLIT-LIST 3 #vertexS))
  57.             (setq #vertexS(hj:insertListID n p #vertexS))
  58.             (setq #vertexS (apply 'append #vertexS))
  59.             (setq #vertexS (gp:list->variantArray #vertexS))
  60.             (vla-put-coordinates obj #vertexS)
  61.             )
  62.           (progn
  63.             (VLA-ADDVERTEX OBJ N VAR2DP)
  64.             ;;调整宽度
  65.             (VLA-SETWIDTH obj n endWidth endWidth)
  66.             )
  67.           )
  68.        

  69.         (SETQ P (GETPOINT "\n请选择插入点:"))
  70.         ) ;_end while
  71.       (PRINC)
  72.       (SSSETFIRST NIL) ;_取消夹取的状态
  73.       ) ;_end progn
  74.     (PROGN
  75.       (PRINC "\n您选择的不是多段线!")
  76.       (PRINC)
  77.       ) ;_end else progn
  78.     ) ;_end if
  79.   (PRINC)
  80.   ) ;_end defun

  81. (defun hj:getpllist (Polyline / enType %repeat #rev-PolyLine #1 %id-PolyLine objPolyline)
  82.   ;;(setq enVertex (ent
  83.   (setq objPolyline(vlax-ename->vla-object Polyline))
  84.   (setq        #1 (vlax-safearray->list
  85.              (vlax-variant-value
  86.                (vla-get-Coordinates
  87.                  objPolyline
  88.                )
  89.              )
  90.            )
  91.   )
  92.   (if (= (vla-get-ObjectName objPolyline) "AcDb2dPolyline")
  93.     (setq enType 3)
  94.     (setq enType 2)
  95.     )
  96.   (setq %id-PolyLine 0
  97.         %repeat (/ (length #1) enType))
  98.   (repeat %repeat
  99.     (setq #rev-polyline1 (list (nth (* %id-PolyLine enType) #1)
  100.                        (nth (1+ (* %id-PolyLine enType)) #1)
  101.                  ))
  102.     (if (not (equal #rev-polyline1 (car #rev-PolyLine) 1e-09))
  103.       (setq #rev-PolyLine
  104.              (cons
  105.                #rev-polyline1
  106.                #rev-PolyLine
  107.                )
  108.             )
  109.       )
  110.     (setq %id-PolyLine (1+ %id-PolyLine))
  111.   ) ;_end repeat
  112.   (REVERSE #rev-PolyLine)
  113. )
  114. ;;;按照数n将表分成许多子表
  115. ;;; STD-SPLIT-LIST splits list into sublists of maximal length n
  116. ;;; n must be > 0!
  117. ;;; Iterative version by Serge Pashkov, safer than recursive version
  118. ;;;   (std-split-list 2 '(1 2 3 4 5 6)) => ((1 2) (3 4) (5 6))
  119. (defun STD-SPLIT-LIST (n lst / ret out cnt)
  120.   (setq ret nil)        ; possible VL lsa compiler bug
  121.   ;; adjust cnt to set incomplete number of elements (if any) for the
  122.   ;; last segment
  123.   (setq cnt (- n (rem (length lst) n)) lst (reverse lst))
  124.   (while lst
  125.     (setq ret (cons (car lst) ret) lst (cdr lst))
  126.     (if (zerop (rem (setq cnt (1+ cnt)) n))
  127.       (setq out (cons ret out) ret nil)))
  128.   (if ret (cons ret out) out))

  129. ;;;----------------------------------------------
  130. ;;;在表中指定的ID号后插入新项
  131. ;;;----------------------------------------------

  132. (defun hj:insertListID(%id-insert newitem #lst / id-insert1%)
  133.   (setq #insert1 nil #insert2 nil)
  134.   (setq %id-insert1 0)
  135.   (setq !length (length #lst))
  136.   ;;取前段
  137.   (repeat (1+ %id-insert)
  138.     (setq #insert1(cons (nth %id-insert1 #lst) #insert1))
  139.     (setq %id-insert1 (1+ %id-insert1))
  140.     )
  141.   ;;取后段
  142.   (setq %id-insert1 (1+ %id-insert))
  143.   (repeat (- !length %id-insert1)
  144.     (setq #insert2(cons (nth %id-insert1 #lst) #insert2))
  145.     (setq %id-insert1 (1+ %id-insert1))
  146.     )
  147.   ;;组合
  148.   (REVERSE(append (append #insert2 (list newitem)) #insert1))
  149.   )

  150. ;;;取处VLISP教程
  151. ;;;----------------------------------------------
  152. ;;;gp:list->variantArray 函数中执行了如下操作:
  153. ;;;
  154. ;;;调用了 vlax-make-safearray 函数来为双精度数组 vlax-vbdouble 分配空间。
  155. ;;;vlax-make-safearray 函数还要求您指定数组下标的上下边界。
  156. ;;;在 gp:list->variantArray 中,调用 vlax-make-safearray 创建的数组的起始下标为 0,
  157. ;;;而下标上界为传给它的元素(ptsList)数目减 1。
  158. ;;;        调用 vlax-safearray-fill 函数将数组中的元素设置为点表中的相应元素。
  159. ;;;
  160. ;;;调用 vlax-make-variant 函数将 safearray 转换成变体。在 gp:list->variantArray
  161. ;;;完成最后一个函数调用后,将返回值传给调用它的函数。

  162. (DEFUN gp:list->variantArray (ptsList / arraySpace sArray)
  163.                                         ; 给以双精度实数表示的二维点数组分配空间
  164.   (SETQ        arraySpace
  165.          (VLAX-MAKE-SAFEARRAY
  166.            VLAX-VBDOUBLE                ; 元素类型
  167.            (CONS 0
  168.                  (- (LENGTH ptsList) 1)
  169.                  )                        ; 数组维数
  170.            ) ;_ 结束vlax-make-safearray
  171.         ) ;_ 结束setq
  172.   (SETQ sArray (VLAX-SAFEARRAY-FILL arraySpace ptsList))
  173.                                         ; 返回数组变体
  174.   (VLAX-MAKE-VARIANT sArray)

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

使用道具 举报

发表于 2009-4-9 21:01:36 | 显示全部楼层
谢谢4楼的提供的代码

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

使用道具 举报

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

使用道具 举报

发表于 2009-4-11 17:20:47 | 显示全部楼层
[B]请教四楼[/B]
请教四楼[/COLOR]

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-26 00:21 , Processed in 0.407725 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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