chlh_jd 发表于 2012-8-7 20:37:32

本帖最后由 chlh_jd 于 2012-8-7 20:38 编辑

以其如此,不如自己动手;
ET扩展插件好像有(重新找下没找到);
Theswamp.org上面有1个,ronjonp 写的
http://www.theswamp.org/index.php?topic=18720.30

(defun c:addvertex (/ ent i nlst obj p pt x)
(vl-load-com)
(while (setq ent (entsel "\nSelect point on polyline to add vertex: "))
    (if         (and ent (= (cdr (assoc 0 (entget (car ent)))) "LWPOLYLINE"))
      (progn (setq i         (fix (vlax-curve-getparamatpoint
                              (car ent)
                              (setq p (vlax-curve-getclosestpointto (car ent) (cadr ent)))
                              )
                         )
                  obj         (vlax-ename->vla-object (car ent))
                  pt         (vlax-curve-getpointatparam (car ent) i)
                  nlst         nil
            )
            (mapcar '(lambda (x)
                         (if (equal x (list 10 (car pt) (cadr pt)) 0.0001)
                           (setq         nlst (cons x nlst)
                                 nlst (cons (list 10 (car p) (cadr p)) nlst)
                           )
                           (setq nlst (cons x nlst))
                         )
                     )
                      (entget (car ent))
            )
            (entmod (reverse nlst))
            (entupd (car ent))
            (sssetfirst nil (ssadd (car ent)))
      )
    )
)
(sssetfirst nil)
(princ)
)

soly2006 发表于 2012-8-8 12:06:28

chlh_jd 发表于 2012-8-7 20:37 static/image/common/back.gif
以其如此,不如自己动手;
ET扩展插件好像有(重新找下没找到);
Theswamp.org上面有1个,ronjonp 写的


非常感谢,这个实现多段线加点功能,如能有判断悬挂位置就好了。

vexation 发表于 2012-8-8 15:24:26

soly2006 发表于 2012-8-6 12:58 static/image/common/back.gif
没用过,可以转到cad吗?

这个就是CAD,但是多了个地图功能,里面就可以拓扑,伪节点、悬挂点都可以查 你在网上找找Autodesk Map2004应该有的

soly2006 发表于 2012-8-8 18:15:14

本帖最后由 soly2006 于 2012-8-8 18:16 编辑

已做出小样,放出来让大家批评。
;;检查悬挂点 通版
;;2012-8-9 soly2006 可用
(defun c:xuangua( / 集1 i 图元表1 点表1 图元1 点1)
(setq 图元表1 NIL
      图元表2 NIL
)
(setq 集1 (ssget '((0 . "lwpolyline"))))
(setq 图元表1 (集转表 集1 ));把图元名做成表
(foreach 图元1 图元表1
   (setq 点表1 (GETPLVTX 图元1));取得点表
   (foreach 点1 点表1
   (setq 集2 (ssget "cp" (jn-cpts 点1 0.1 100) '((0 . "lwpolyline"))))
       
   (setq 图元表2 (集转表 集2 ));把图元名做成表

       (setq 图元表2 (vl-remove 图元1 图元表2))
       (while 图元表2
           (setq 点表2 (GETPLVTX (car 图元表2)) )

           (if (and (not (member 点1 点表2))
                    (equal (distance (vlax-curve-getClosestPointTo (vlax-ename->vla-object (car 图元表2)) 点1) 点1) 0.0))
          (progn
                (mkcircle 点1 1);标记
                (inspttopl (car 图元表2) 点1);增加结点
                )
           )
           (setq 图元表2 (cdr 图元表2))
       )
   )
)
)

;;---------------标记出错位置------------------------
(defun mkcircle(pt r)
    (entmake (list '(0 . "circle")
                   (cons 10 pt)
                   (cons 40 r)
                   (cons 62 1) ;颜色
                   (cons 8 "检查标记")))
)

;;求多段线顶点----不知谁编的-------
(defun GETPLVTX (E / ED )
(defun DXF (NO)
(cdr (assoc NO ED))
)
(defun GETLWPL (ED / PL)
(while (setq ED (cdr (member (setq PL10 (assoc 10 ED))
   ED
    )   ))
(setq PL (cons (cdr PL10) PL))
)
(reverse PL)
)
(defun GETPL (ED / E PL P10)
(setq E (DXF -1))
(while (setq E (entnext E))
(if (setq P10 (cdr (assoc 10 (entget E))))
(setq PL (cons P10 PL))
))
(reverse PL)
)
(setq ED (entget E))
(setq PLTYPE (DXF 0))
(cond
((= "POLYLINE" PLTYPE)
(GETPL ED))
((= "LWPOLYLINE" PLTYPE)
(GETLWPL ED))))
;;---------------
;; | ---------------------------------------------------------------------------
;; | jn-cpts
;; | ---------------------------------------------------------------------------
;; | Function :给定一个中心点和半径,等分数,返回圆上点列表
;; | Argument : (jn-cpts cpt r div-num)
;; | Returns: 返回圆上点列表
;; | Updated: 2012-5-4
;; | ---------------------------------------------------------------------------
(defun jn-cpts(cpt r div-num / ptl parti-deg jd ) ;求圆上点传入中心点和半径
(setq ptl NIL )
(setq parti-deg (/ (* 2.0 PI) div-num))
(setq jd parti-deg)
(while (< jd (* 2 PI))
(setq ptl (append (list (polar cpt jd r)) ptl))
(setq jd (+ parti-deg jd))
)
(setq ptl ptl)
)
;;PL线插入点 多谢chlh_jd提供,在此修改成函数
;;2012-8-9
(defun inspttopl(ent pt0 / i nlst obj p pt x)
   (setq i (fix (vlax-curve-getparamatpoint
                      ent
                      (setq p (vlax-curve-getclosestpointto ent pt0))
                   )
            );取得插入点前的顶点线参数
         obj         (vlax-ename->vla-object ent)
         pt         (vlax-curve-getpointatparam ent i)
         nlst         nil
      )
            (mapcar '(lambda (x)
                         (if (equal x (list 10 (car pt) (cadr pt)) 0.0001)
                           (setq         nlst (cons x nlst)
                                       nlst (cons (list 10 (car p) (cadr p)) nlst) ;此处p = pt0
                           )
                           (setq nlst (cons x nlst))
                         )
                     )
                      (entget ent)
            )
            (entmod (reverse nlst))
            (entupd ent)
            (sssetfirst nil (ssadd ent))
(sssetfirst nil)
(princ)
)

;;-----------------------------ss2lst---------------------------------
;;                        选择集转实体名表2012-7-24 soly2006 修改
;;用法 (ss2lst ss)返回实体名表或空
(defun 集转表 ( ss / i L )
(setq L NIL)
    (if ss
      (repeat (setq i (sslength ss))
            (setq l (cons (ssname ss (setq i (1- i))) l))
      )
    )
        L
)

soly2006 发表于 2012-11-6 02:13:37

用了有些加不上,各位有好的程序吗?这里谢谢了。

yx5277 发表于 2012-11-9 15:29:55

soly2006 发表于 2012-11-6 02:13 static/image/common/back.gif
用了有些加不上,各位有好的程序吗?这里谢谢了。

我这也有一个手动单个加点的小LISP程序,你看能否用得上,这也是从网上收集来的:
;给复义线增加节点,而不改变复义线的形状,特殊的场合用得到。
(defun c:Pladd ( / obj ent pp n m m1 m2 pn newv bg1 bg2 a b bg p1)
(setq    OBJ(vlax-ename->vla-object (car (setq ent (entsel))))
                      p1    (getpoint"\n选加入的点,回车缺省:")
    PP   (vlax-curve-getclosestpointto OBJ (if p1 p1(cadr ent)))
    N    (fix (setq m (vlax-curve-getparamatpoint OBJ PP)))
    m1   (- m n)
    m2   (- 1 m1)
    bg   (vla-getbulge obj n)
    pn   pp
    PN   (list (car PN) (cadr PN))
    NEWV (vlax-safearray-fill
         (vlax-make-safearray vlax-vbdouble '(0 . 1))
         PN
         )
)
(vla-addvertex OBJ (1+ N) NEWV)
(if (/= 0 bg)
    (progn
      (setq a (* (atan bg) m1))
      (setq b (* (atan bg) m2))
      (vla-setbulge obj n (/ (sin a) (cos a)))
      (vla-setbulge obj (1+ n) (/ (sin b) (cos b)))
    )
)
)

soly2006 发表于 2012-11-10 10:44:22

yx5277 发表于 2012-11-9 15:29 static/image/common/back.gif
我这也有一个手动单个加点的小LISP程序,你看能否用得上,这也是从网上收集来的:
;给复义线增加节点,而 ...

好像对二维多段线没用,会出乱,多段线稍好

zyhandw 发表于 2012-11-10 11:09:48

用cad做gis好累

soly2006 发表于 2012-11-10 12:03:48

zyhandw 发表于 2012-11-10 11:09 static/image/common/back.gif
用cad做gis好累

同道中人啊
期待有高人解决

dalin1985 发表于 2013-2-28 16:01:37

顶一下,非常需要。
页: 1 [2] 3
查看完整版本: 悬挂点加点的程序,请各位帮助解决一下,谢谢