远方小山 发表于 2016-3-6 11:30:23

检测多段线的起点和终点是否在其个直线上

各位大神
         小弟想编个程序,用于检测任一条多段线的起始点是否在其他多段线上,其实也不用精确在,只要小于0.5就算在了,如果不在其他直线上,就在这个点的位置画个圆,请都各位大神,应该怎么编,跪求~~

远方小山 发表于 2016-3-6 11:56:22

自己顶下贴

xinrstar 发表于 2016-3-6 12:02:19

用这个函数
返回曲线上离指定点最近的点(在 WCS 上)
(vlax-curve-getClosestPointTo curve-obj givenPnt )

kozmosovia 发表于 2016-3-6 12:17:46

以多义线端点为中心,边长为1的正方形区域内ssget cp,根据选择集内多义线数量判断

远方小山 发表于 2016-3-6 13:21:02

RE: 检测多段线的起点和终点是否在其他多段线上

本帖最后由 远方小山 于 2016-3-6 13:24 编辑

kozmosovia 发表于 2016-3-6 12:17 static/image/common/back.gif
以多义线端点为中心,边长为1的正方形区域内ssget cp,根据选择集内多义线数量判断
这个方法我试过,但是效果不好,里面好多点在其他多段线上,也被检测出来,附代码如下,请大神指教。
(defun c:ckcn()
;;;关闭呼应
      (setvar "cmdecho" 0 )
      ;;;设置检测精度
      (setq jd (getdist "\n 输入检测精度<1.0>"))
      (if (null jd) (setq jd 1.0))
      (setq jd1 (getdist "\n 输入筛选精度<80>"))
      (if (null jd1) (setq jd 80))
      (setq dia (getdist "\n 输出存在问题点提示圆的直径<100>"))
      (if (null dia) (setq dia 100))
;;;新建问题图层
         (if (null (tblsearch "layer" "connectproblem"))
      (command "-layer" "m" "connectproblem" "c" 6 "" "")
      (command "-layer" "Thaw" "connectproblem" "ON" "connectproblem" "Set" "connectproblem" "Unlock" "connectproblem""")
)
;;;构造选集
      (setq sspl (ssget '( ( 0 . "*lwpolyline"))))
      ;;;选择集转元素名表
      (setq sspln (ss->enamelst sspl))
      ;;;每个要素执行以下操作
      (foreach plname sspln
      (setq pt (mdxf 10 (entget plname)))
      (setq ft (numlist 1 pt) lt (numlist (length pt) pt))
      (cn plname ft jdjd1 dia )
      (cn plname lt jdjd1 dia )
      )
      (prin1)
)

(defun cn(plnameptjd jd1dia / px1 px2 px3 px4 py1 py2 py3 py4 p1 p2 p3 p4 )
      (setq px (car pt) py (cadr pt))
      (setq px1 (- px (/ jd 2))
                px2 (- px (/ jd 2) )
                px3 (+ px (/ jd 2) )
                px4 (+ px (/ jd 2) ))
      (setq py1 (+ py (/ jd 2))
                py2 (- py (/ jd 2) )
                py3 (- py (/ jd 2) )
                py4 (+ py (/ jd 2) ))      
               
      (setq p1 (list px1 py1)
                  p2 (list px2 py2)
                  p3 (list px3 py3)      
                  p4 (list px4 py4)      
                )
      (setq ss_p (ssget "f" (list p1 p2 p3 p4 p1 )))
      (if (= (sslength ss_p) 1 )
                (progn
                (setq px1 (- px (/ jd1 2))
                px2 (- px (/ jd1 2) )
                px3 (+ px (/ jd1 2) )
                px4 (+ px (/ jd1 2) ))
      (setq py1 (+ py (/ jd1 2))
                py2 (- py (/ jd1 2) )
                py3 (- py (/ jd1 2) )
                py4 (+ py (/ jd1 2) ))      
               
      (setq p1 (list px1 py1)
                  p2 (list px2 py2)
                  p3 (list px3 py3)      
                  p4 (list px4 py4)      
                )
      (setq ss_p (ssget "f" (list p1 p2 p3 p4 p1 )))
      (if (!= (sslength ss_p) 1 )
      (command "CIRCLE" ptdia ))
                )
))


附:这里面的mdxf 和 ss->enamelst 是自定义函数

远方小山 发表于 2016-3-6 13:22:28

RE: 检测多段线的起点和终点是否其他多段线上

xinrstar 发表于 2016-3-6 12:02 static/image/common/back.gif
用这个函数
返回曲线上离指定点最近的点(在 WCS 上)
(vlax-curve-getClosestPointTo curve-obj givenPn ...

可否劳驾大神给写几行代码

kozmosovia 发表于 2016-3-6 15:06:51

远方小山 发表于 2016-3-6 13:21 static/image/common/back.gif
这个方法我试过,但是效果不好,里面好多点在其他多段线上,也被检测出来,附代码如下,请大神指教。
(d ...

你的程序太啰嗦
随手写了一个,没测试。
;;; Dis=端点到曲线距离
;;; Rad=圆弧半径
(Defun _Process        (Dis Rad / EPT I OS SPT SS VLO XX)
(setq os (getvar "osmode"))
(setvar "osmode" 0)
(if (setq i-1
          ss (ssget '((0 . "*polyline") (70 . 0)))
      )
    (repeat (sslength ss)
      (setq vlo (vlax-ename->vla-object (ssname ss (setq i (1+ i)))))
      (foreach abc (list (trans (vlax-curve-getstartpoint vlo) 0 1)
                       (trans (vlax-curve-getendpoint vlo) 0 1)
                   )
        (if (and (setq xx (ssget "_cp"
                               (polar abc (* 0.25 pi) (* 1.414 Dis))
                               (polar abc (* 1.25 pi) (* 1.414 Dis))
                               '((0 . "*polyline"))
                          )
               )
               (> (sslength xx) 1)
          )
          (command "_.Circle" abc Rad)
        )
      )
    )
)
(setvar "osmode" os)
)

xinrstar 发表于 2016-3-8 11:38:33

远方小山 发表于 2016-3-6 13:22 static/image/common/back.gif
可否劳驾大神给写几行代码

用7#的吧,代码更少,只要图在屏幕上就行

Gu_xl 发表于 2016-3-8 14:19:32

本帖最后由 Gu_xl 于 2016-3-8 14:25 编辑

(XLRX-Curve-CheckXuangua (ssget '((0 . "*line"))) 1.0 0.5)

远方小山 发表于 2016-3-8 18:34:49

kozmosovia 发表于 2016-3-6 15:06 static/image/common/back.gif
你的程序太啰嗦
随手写了一个,没测试。

我试了下,这个代码有出现错误,我查了用法,没有错啊,求大神指点
(if (and (setq xx (ssget "_cp"
                                 (polar abc (* 0.25 pi) (* 1.414 Dis))
                                 (polar abc (* 1.25 pi) (* 1.414 Dis))
                                 '((0 . "*polyline"))
页: [1] 2
查看完整版本: 检测多段线的起点和终点是否在其个直线上