peraperson 发表于 2014-6-30 14:52:17

用栏选求交点遇到的一点问题

本帖最后由 peraperson 于 2014-6-30 14:56 编辑

主要是受到GU版在 http://bbs.mjtd.com/thread-110529-1-1.html 5楼里的回复的启发, 想利用ssnamex得到线段与多段线交点,并在交点处生成文字,文字角度跟交点所在处的切线一样。
前前后后发了2个贴,解决了一大部分问题,现在有个问题就是栏选的时候可能跟同一个图元有不止一个交点,比如ssnamex得到
((4 <图元名: 7ffffb43060> 2 (0 (1 1 0)) (0 (2 2 0)))(4 <图元名: 7ffffb43050> 2 (0 (2 3 0)) (0 (10 12 0)) (0 (9 10 0))))
因为这种情况,得到的一个图元名可能对应多个交点,实在是不知道如何建立循环求每个交点处的角度。
请问大家有什么思路吗

edata 发表于 2014-6-30 16:39:01

看图说话。。。。

edata 发表于 2014-6-30 17:00:11

虽说这个方法求交点简单,但是遇到某些情况还是无法完成,有可能造成交点多了而实际没有的情况,如两点之间出现一条直线,那么会有这条直线的交点。
其二,如果出现两点不在视图显示范围内,那么选择不到,也就没有交点。

peraperson 发表于 2014-7-2 09:09:41

本帖最后由 peraperson 于 2014-7-2 09:14 编辑

edata 发表于 2014-6-30 17:00 static/image/common/back.gif
虽说这个方法求交点简单,但是遇到某些情况还是无法完成,有可能造成交点多了而实际没有的情况,如两点之间 ...
谢谢e大 昨天出差未能及时回复 十分抱歉
举例来说,下面有2张图,红色线为已经存在的pline线, 我想要画一条线(白色线所示)穿过他们,并且在交点处生成文字“OK",文字角度跟交点处的pline线一样
我用intersect和ssnamex的方法都写了,但是问题在于,当白色线和一条pline线有2个或以上交点时会发生错误,如第二张图所示。
下面是我的代码,intersecti版本的 有的长 麻烦edata帮忙看下如何解决 谢谢
(defun c:tt ()
(setq ss (ssget "F" (list (setq p1 (getpoint))(setq p2 (getpoint p1)) ) '((0 . "LWPOLYLINE"))))
(command "line" p1 p2 "")
(setq e1 (entlast))
(setq oj1 (vlax-ename->vla-object e1))
(setq n 0)
(repeat (sslength ss)
(setq e2 (ssname ss n))
(setq oj2 (vlax-ename->vla-object e2))
(setq p (vla-IntersectWith oj1 oj2 0))
(setq pt (vlax-safearray->list (vlax-variant-value p)))
(setq an (HH:PtFirstAngle e2 pt))
(entmake(list (cons 0 "TEXT") (cons 1 "OK") (cons 40 50) (cons 10 pt) (cons 11 pt) (cons 72 1) (cons 50 an) ))
(setq n (+ 1 n))
)
)

(defun HH:PtFirstAngle (obj pt) ;by 自贡黄明儒 用于计算交点处角度
(setq param (vlax-curve-getParamAtPoint obj pt))
(angle pt (mapcar '+ pt (vlax-curve-getFirstDeriv obj param)))
)




edata 发表于 2014-7-2 11:43:52

一个交点以上要自己分离出来,一个点三个元素
我直接套用我写的两个物体交点函数了。
老黄也有个交点函数,不过是隐藏的。
(defun c:tt ()
(setq ss (ssget "F" (list (setq p1 (getpoint))(setq p2 (getpoint p1)) ) '((0 . "LWPOLYLINE"))))
(command "line" p1 p2 "")
(setq e1 (entlast))
(setq oj1 (vlax-ename->vla-object e1))
(setq n 0)
(repeat (sslength ss)
(setq e2 (ssname ss n))
(setq oj2 (vlax-ename->vla-object e2))
;(setq p (vla-IntersectWith oj1 oj2 0))
;(setq pt (vlax-safearray->list (vlax-variant-value p))) ;;交点列表超过3个元素表示多个点要分离成交点列表
(setq ipts(sk_2obj_ipts oj1 oj2 0))
(while(setq pt(car ipts))
(setq an (HH:PtFirstAngle e2 pt))
(entmake(list (cons 0 "TEXT") (cons 1 "OK") (cons 40 50) (cons 10 pt) (cons 11 pt) (cons 72 1) (cons 50 an) ))
    (setq ipts(cdr ipts))
    )
(setq n (+ 1 n))
)
)

(defun HH:PtFirstAngle (obj pt) ;by 自贡黄明儒 用于计算交点处角度
(setq param (vlax-curve-getParamAtPoint obj pt))
(angle pt (mapcar '+ pt (vlax-curve-getFirstDeriv obj param)))
)
;;两物体交点函数 en1 en2 可以是ename或是vla-object
;;mode 交点延伸模式INT数值 0 1 2 3
;;code by edata@mjtd
;;2014-6-25
(defun sk_2obj_ipts(en1 en2 mode / ipts lst obj1 obj2)
(vl-load-com)
(if (and en1 en2
           (or (= (type en1) 'ENAME)(= (type en1) 'VLA-OBJECT))
           (or (= (type en2) 'ENAME)(= (type en2) 'VLA-OBJECT))
           )
    (progn
      (setq obj1(if(= (type en1) 'ENAME)(vlax-ename->vla-object en1) en1)
          obj2(if(= (type en2) 'ENAME)(vlax-ename->vla-object en2) en2)
          mode(if (and mode (=(type mode) 'INT)) mode 0)
          )
      (setq ipts(vlax-variant-value (vla-intersectwith obj1 obj2 mode)));取得俩物体的交点变体
      (if (> (vlax-safearray-get-u-bound ipts 1) 0)
        (progn
          (setq ipts(vlax-safearray->list ipts);将vla交点变体转化成表的形式
                lst '())
          (if (>(length ipts) 3);分离多个交点
          (repeat(/(length ipts)3)
              (setq lst(cons(list(car ipts)(cadr ipts)(caddr ipts)) lst))
              (setq ipts(cdddr ipts))
              )
          (setq lst (list ipts))
          )
          lst
          )
        )
      )
    )
)

peraperson 发表于 2014-7-2 17:06:30

edata 发表于 2014-7-2 11:43 static/image/common/back.gif
一个交点以上要自己分离出来,一个点三个元素
我直接套用我写的两个物体交点函数了。
老黄也有个交点函数 ...

嗯 谢谢e大 好好研究一番

luchenlong 发表于 2019-11-7 20:56:50

有帮助,指明方向

tianbeiyuan 发表于 2019-11-24 13:51:28

收藏学习了。。。
页: [1]
查看完整版本: 用栏选求交点遇到的一点问题