明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2152|回复: 9

在多段线上增加一端点(自己DIY)点是否在线上的判断(已更新,请nonsmall指导,感谢!

[复制链接]
发表于 2009-3-25 19:42 | 显示全部楼层 |阅读模式
本帖最后由 作者 于 2009-3-27 9:12:54 编辑

在多段线上增加一端点(自己DIY)点是否在线上的判断(已更新,请nonsmall指导,感谢!)[br]

(defun c:cfg
       (/ ent pt ents i n npt item item1 item2 item3 item4 x y x1 y1 x2 y2 lstNew)
  (setq ent (entsel "\n选择一条多段线:"))

  (while (setq point (getpoint "\n在线上选择添加端点的位置:"))
    (setq ents (entget (car ent)))
    (setq i  0
   npt  0
   n  (length ents)
   lstNew '()
    )
    (while
      (< i n)
       (setq item (nth i ents))
       (setq lstNew (append lstNew (list item)))
       (if (= (car item) 10)
  (if (setq item4 (nth (+ i 4) ents))
    (progn
      (setq x  (car point)
     y  (cadr point)
     X1 (cadr item)
     y1 (caddr item)
     x2 (cadr item4)
     y2 (caddr item4)
      )
      (if
        (and
   (and (or (and (> x x1) (< x x2)) (and (< x x1) (> x x2)))
        (or (and (> y y1) (< y y2)) (and (< y y1) (> y y2)))
   ) ;点的X,Y是否在线段两端点间
   (equal (* (- x x1) (- y2 y1))
   (* (- y y1) (- x2 x1));点是否在线上(两点式直线方程)
   0.0001
   )
        )
  (setq item1  (nth (+ i 1) ents)
        item2  (nth (+ i 2) ents)
        item3  (nth (+ i 3) ents)
        lstNew (append lstNew (list item1))
        lstNew (append lstNew (list item2))
        lstNew (append lstNew (list item3))
        lstNew (append lstNew
         (list (list 10 (car point) (cadr point)))
        )
  );增加点的坐标
      )
    )
  )
       )
       (setq i (1+ i))
    )
    (entmod lstNew);重生成多段线
  )
  (princ)
)

点评

2007测试正常,但2012,2017就出错:在线上选择添加端点的位置:_appint 于 ; 错误: 参数类型错误: consp 0 不知何因?请教能再修改适用于高版本吗?谢谢  发表于 2022-10-12 16:19
 楼主| 发表于 2009-3-25 19:45 | 显示全部楼层

请高手指点:点是否在直线上是否有更好的方法?是否可以通过inters实现?

发表于 2009-3-26 14:18 | 显示全部楼层

返回曲线上离指定点最近的点(在 WCS 上)

(vlax-curve-getClosestPointTo curve-obj givenPnt [extend])
若返回点和你给定的点重合说明该点在多线上
 楼主| 发表于 2009-3-26 17:39 | 显示全部楼层

高手!你好。这是VISUAL LISP吧,在语句怎么VISUAL LISP编辑器里怎么不识别呢?求高手指点!

 楼主| 发表于 2009-3-26 18:42 | 显示全部楼层
(vl-load-com)才能加载VISUAL LISP!太菜了!!!!!!!!!!!!!!!!!1
 楼主| 发表于 2009-3-26 19:09 | 显示全部楼层
(vlax-curve-getClosestPointTo curve-obj givenPnt [extend])是可以判断是否在线上,但是在多段线哪两个点间无法确定。好像不好解决!
发表于 2009-3-26 20:05 | 显示全部楼层

请把vlax-curve函数多看几遍

多线上任一点到起点距离可求

此点到起点距离已知

怎么判断在哪两个点之间就不用多说了吧?

 楼主| 发表于 2009-3-27 09:09 | 显示全部楼层

感谢nonsmall 高手!

再帮我看看这个新程序为什么还有时不能正确增加端点?

(defun c:cfg
      (/      ents   ployobj  ploy_z  pt pt1  pt2 i      n
       L      L1     L2    lstNew item  item1 item2  item3
       item4
      )
  (vl-load-com)
  (setq ent (car (entsel "\n选择一条多段线:")))
  (setq ployobj (vlax-ename->vla-object ent)) 
  (while (setq pt (getpoint "\n在线上选择添加端点的位置:"))   
    (if ( equal (vlax-curve-getClosestPointTo ployobj pt) pt )
      (progn
 (setq i      0
       ents (entget ent)
              ploy_z (cdr (assoc 38 ents))
       n      (length ents)
       lstNew '()
       L      (vlax-curve-getDistAtPoint ployobj pt)
 )
 (while
   (< i n)
    (setq item (nth i ents))
    (setq lstNew (append lstNew (list item)))
    (if (= (car item) 10)
      (if
        (and (setq item4 (nth (+ i 4) ents)) (= (car item4) 10))
  (Progn
    (setq pt1 (list (cadr item) (caddr item) ploy_z)
   pt2 (list (cadr item4) (caddr item4) ploy_z)
   L1  (vlax-curve-getDistAtPoint ployobj pt1)
   L2  (vlax-curve-getDistAtPoint ployobj pt2)
    )
    (if (and (> L L1) (< L L2))
      (setq item1  (nth (+ i 1) ents)
     item2  (nth (+ i 2) ents)
     item3  (nth (+ i 3) ents)
     lstNew (append lstNew (list item1))
     lstNew (append lstNew (list item2))
     lstNew (append lstNew (list item3))
     lstNew (append lstNew
      (list (list 10 (car pt) (cadr pt)))
     )
      )   ;增加点的坐标
    )
  )
      )
    )
    (setq i (1+ i))
 )
 (entmod lstNew)   ;重生成多段线
      )
    )
  )
  (princ)
)

发表于 2009-3-27 09:41 | 显示全部楼层

惭愧 高手还算不上

我手上没有CAD 暂不能帮你看了

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

本版积分规则

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

GMT+8, 2024-5-19 01:09 , Processed in 0.295920 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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