明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: soly2006

悬挂点加点的程序,请各位帮助解决一下,谢谢

  [复制链接]
发表于 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

  1. (defun c:addvertex (/ ent i nlst obj p pt x)
  2.   (vl-load-com)
  3.   (while (setq ent (entsel "\nSelect point on polyline to add vertex: "))
  4.     (if         (and ent (= (cdr (assoc 0 (entget (car ent)))) "LWPOLYLINE"))
  5.       (progn (setq i         (fix (vlax-curve-getparamatpoint
  6.                                 (car ent)
  7.                                 (setq p (vlax-curve-getclosestpointto (car ent) (cadr ent)))
  8.                               )
  9.                          )
  10.                     obj         (vlax-ename->vla-object (car ent))
  11.                     pt         (vlax-curve-getpointatparam (car ent) i)
  12.                     nlst         nil
  13.               )
  14.               (mapcar '(lambda (x)
  15.                          (if (equal x (list 10 (car pt) (cadr pt)) 0.0001)
  16.                            (setq         nlst (cons x nlst)
  17.                                  nlst (cons (list 10 (car p) (cadr p)) nlst)
  18.                            )
  19.                            (setq nlst (cons x nlst))
  20.                          )
  21.                        )
  22.                       (entget (car ent))
  23.               )
  24.               (entmod (reverse nlst))
  25.               (entupd (car ent))
  26.               (sssetfirst nil (ssadd (car ent)))
  27.       )
  28.     )
  29.   )
  30.   (sssetfirst nil)
  31.   (princ)
  32. )
 楼主| 发表于 2012-8-8 12:06:28 | 显示全部楼层
chlh_jd 发表于 2012-8-7 20:37
以其如此,不如自己动手;
ET扩展插件好像有(重新找下没找到);
Theswamp.org上面有1个,ronjonp 写的

非常感谢,这个实现多段线加点功能,如能有判断悬挂位置就好了。
发表于 2012-8-8 15:24:26 | 显示全部楼层
soly2006 发表于 2012-8-6 12:58
没用过,可以转到cad吗?

这个就是CAD,但是多了个地图功能,里面就可以拓扑,伪节点、悬挂点都可以查 你在网上找找Autodesk Map2004应该有的
 楼主| 发表于 2012-8-8 18:15:14 | 显示全部楼层
本帖最后由 soly2006 于 2012-8-8 18:16 编辑

已做出小样,放出来让大家批评。
  1. ;;检查悬挂点 通版
  2. ;;2012-8-9 soly2006 可用
  3. (defun c:xuangua( / 集1 i 图元表1 点表1 图元1 点1)
  4.   (setq 图元表1 NIL
  5.         图元表2 NIL
  6.   )
  7.   (setq 集1 (ssget '((0 . "lwpolyline"))))
  8.   (setq 图元表1 (集转表 集1 ))  ;把图元名做成表
  9.   (foreach 图元1 图元表1
  10.    (setq 点表1 (GETPLVTX 图元1))  ;取得点表
  11.    (foreach 点1 点表1
  12.      (setq 集2 (ssget "cp" (jn-cpts 点1 0.1 100) '((0 . "lwpolyline"))))
  13.        
  14.      (setq 图元表2 (集转表 集2 ))  ;把图元名做成表
  15.   
  16.          (setq 图元表2 (vl-remove 图元1 图元表2))
  17.          (while 图元表2
  18.            (setq 点表2 (GETPLVTX (car 图元表2)) )

  19.            (if (and (not (member 点1 点表2))
  20.                     (equal (distance (vlax-curve-getClosestPointTo (vlax-ename->vla-object (car 图元表2)) 点1) 点1) 0.0))
  21.             (progn
  22.                 (mkcircle 点1 1)  ;标记
  23.                 (inspttopl (car 图元表2) 点1)  ;增加结点
  24.                 )
  25.            )
  26.            (setq 图元表2 (cdr 图元表2))
  27.          )
  28.    )
  29.   )
  30. )

  31. ;;---------------标记出错位置------------------------
  32. (defun mkcircle  (pt r)
  33.     (entmake (list '(0 . "circle")
  34.                    (cons 10 pt)
  35.                    (cons 40 r)
  36.                    (cons 62 1) ;颜色
  37.                    (cons 8 "检查标记")))
  38. )

  39. ;;求多段线顶点----不知谁编的-------
  40. (defun GETPLVTX (E / ED )
  41. (defun DXF (NO)
  42. (cdr (assoc NO ED))
  43. )
  44. (defun GETLWPL (ED / PL)
  45. (while (setq ED (cdr (member (setq PL10 (assoc 10 ED))
  46.      ED
  47.     )   )  )
  48. (setq PL (cons (cdr PL10) PL))
  49. )
  50. (reverse PL)
  51. )
  52. (defun GETPL (ED / E PL P10)
  53. (setq E (DXF -1))
  54. (while (setq E (entnext E))
  55. (if (setq P10 (cdr (assoc 10 (entget E))))
  56.   (setq PL (cons P10 PL))
  57. ))
  58. (reverse PL)
  59. )
  60. (setq ED (entget E))
  61. (setq PLTYPE (DXF 0))
  62. (cond
  63. ((= "POLYLINE" PLTYPE)
  64. (GETPL ED))
  65. ((= "LWPOLYLINE" PLTYPE)
  66. (GETLWPL ED))))
  67. ;;---------------
  68. ;; | ---------------------------------------------------------------------------
  69. ;; | jn-cpts
  70. ;; | ---------------------------------------------------------------------------
  71. ;; | Function :  给定一个中心点和半径,等分数,返回圆上点列表
  72. ;; | Argument : (jn-cpts cpt r div-num)
  73. ;; | Returns  : 返回圆上点列表
  74. ;; | Updated  : 2012-5-4
  75. ;; | ---------------------------------------------------------------------------
  76. (defun jn-cpts(cpt r div-num / ptl parti-deg jd ) ;求圆上点传入中心点和半径
  77. (setq ptl NIL )
  78. (setq parti-deg (/ (* 2.0 PI) div-num))
  79. (setq jd parti-deg)
  80. (while (< jd (* 2 PI))
  81. (setq ptl (append (list (polar cpt jd r)) ptl))
  82. (setq jd (+ parti-deg jd))
  83. )
  84. (setq ptl ptl)
  85. )
  86. ;;PL线插入点 多谢chlh_jd提供,在此修改成函数
  87. ;;2012-8-9
  88. (defun inspttopl(ent pt0 / i nlst obj p pt x)
  89.      (setq i (fix (vlax-curve-getparamatpoint
  90.                       ent
  91.                       (setq p (vlax-curve-getclosestpointto ent pt0))
  92.                    )
  93.               )  ;取得插入点前的顶点线参数
  94.          obj         (vlax-ename->vla-object ent)
  95.          pt         (vlax-curve-getpointatparam ent i)
  96.          nlst         nil
  97.       )
  98.               (mapcar '(lambda (x)
  99.                          (if (equal x (list 10 (car pt) (cadr pt)) 0.0001)
  100.                            (setq         nlst (cons x nlst)
  101.                                          nlst (cons (list 10 (car p) (cadr p)) nlst) ;此处p = pt0
  102.                            )
  103.                            (setq nlst (cons x nlst))
  104.                          )
  105.                        )
  106.                       (entget ent)
  107.               )
  108.               (entmod (reverse nlst))
  109.               (entupd ent)
  110.               (sssetfirst nil (ssadd ent))
  111.   (sssetfirst nil)
  112.   (princ)
  113. )

  114. ;;-----------------------------ss2lst---------------------------------
  115. ;;                          选择集转实体名表2012-7-24 soly2006 修改
  116. ;;用法 (ss2lst ss)返回实体名表或空
  117. (defun 集转表 ( ss / i L )
  118. (setq L NIL)
  119.     (if ss
  120.         (repeat (setq i (sslength ss))
  121.             (setq l (cons (ssname ss (setq i (1- i))) l))
  122.         )
  123.     )
  124.         L
  125. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2012-11-6 02:13:37 | 显示全部楼层
用了有些加不上,各位有好的程序吗?这里谢谢了。
发表于 2012-11-9 15:29:55 | 显示全部楼层
soly2006 发表于 2012-11-6 02:13
用了有些加不上,各位有好的程序吗?这里谢谢了。

我这也有一个手动单个加点的小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)))
    )
  )
)
 楼主| 发表于 2012-11-10 10:44:22 | 显示全部楼层
yx5277 发表于 2012-11-9 15:29
我这也有一个手动单个加点的小LISP程序,你看能否用得上,这也是从网上收集来的:
;给复义线增加节点,而 ...

好像对二维多段线没用,会出乱,多段线稍好
发表于 2012-11-10 11:09:48 | 显示全部楼层
用cad做gis好累
 楼主| 发表于 2012-11-10 12:03:48 | 显示全部楼层
zyhandw 发表于 2012-11-10 11:09
用cad做gis好累

同道中人啊
期待有高人解决
发表于 2013-2-28 16:01:37 | 显示全部楼层
顶一下,非常需要。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 11:49 , Processed in 0.169577 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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