明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2861|回复: 5

如何判断一个直线是孤立直线还是与其它图元有交点?

[复制链接]
发表于 2012-9-21 11:09:06 | 显示全部楼层 |阅读模式
图元包括以下类型:直线、圆、圆弧、多段线;交点指实交点。使用修剪(TRIM)命令时,经修剪后会留下部分直线或圆弧,如果判断这些图元是弧立图元(没有实交点)?
因TRIM命令不强制退出时会一直提示选择要修剪的对象,此时若退出TRIM将多余的图元(无实交点的,完全无用的图元)删除,会浪费时间,想实现在修剪的过程中判断这个图元是否是无交点的图元,若是,点选一下就可以删除这个图元。中间不能退出TRIM。


"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-9-21 11:50:56 | 显示全部楼层
关注中~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
发表于 2012-9-21 11:54:29 | 显示全部楼层
(ssget "F" pt_list)
 楼主| 发表于 2012-9-21 16:53:38 | 显示全部楼层
Gu_xl 发表于 2012-9-21 11:54
(ssget "F" pt_list)

版主,这是我自己写的,指教一下!
只判断屏幕范围内的图元
(defun YTM:JDPD
        (en / ss sslist enlist enptlist flag ss->elst obj_int fp)
   ;;----通用函数-----
   ;;carrot1983  http://bbs.mjtd.com/forum.php?mod=viewthread&tid=64502
   ;;选择集->图元名表
   (defun ss->elst (ss / elst)
     (setq i 0)
     (repeat (sslength ss)
       (setq elst (cons (ssname ss i) elst)
            i         (1+ i)
       )
     )
     (reverse elst)
   )
   ;;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   ;;功能:返回两个对象的所有交点
   ;;参数: ent1、ent2 均为ename对象
   (defun obj_int (ent1 ent2 / ax_ent_1 ax_ent_2 intpoints points i)
     (vl-load-com)
     (setq ax_ent_1 (vlax-ename->vla-object ent1)
          ax_ent_2 (vlax-ename->vla-object ent2)
     )
     (setq intpoints (vla-intersectwith ax_ent_1 ax_ent_2 acextendnone))
     (setq intpoints (vlax-variant-value intpoints))
     (setq i 0)
     (if        (> (vlax-safearray-get-u-bound intpoints 1) 0)
       (repeat (/ (+ 1
                    (- (vlax-safearray-get-u-bound intpoints 1)
                       (vlax-safearray-get-l-bound intpoints 1)
                    )
                 )
                 3
              )
        (setq points
               (append
                 points
                 (list (list
                         (vlax-safearray-get-element intpoints i)
                         (vlax-safearray-get-element intpoints (+ i 1))
                         (vlax-safearray-get-element intpoints (+ i 2))
                       )
                 )
               )
        )
        (setq i (+ 3 i))
       )
     )
     points
   )
   ;;求屏幕的两个角点坐标
   ;;小菜123http://bbs.mjtd.com/forum.php?mod=viewthread&tid=7081
   (defun fp (/ c03 c08 c04 c05 c07 c06 c09 c01 c02)
     (setq c03 (getvar "viewctr")
          c03 (trans c03 1 2)
          c08 (getvar "viewsize")
          c04 (getvar "screensize")
          c07 (car c04)
          c06 (cadr c04)
          c09 (/ (* c08 c07) c06)
          c01 (list (- (car c03) (* 0.5 c09)) (- (cadr c03) (* 0.5 c08)))
          c02 (list (+ (car c03) (* 0.5 c09)) (+ (cadr c03) (* 0.5 c08)))
          c01 (trans c01 2 1)
          c02 (trans c02 2 1)
     )
     (list c01 c02)
   )
   ;;建立所有图元的选集
   (setq ss (ssget "C" (car (fp)) (cadr (fp))))
   ;;图元名组成的表
   (setq sslist (ss->elst ss))
   ;;组成表中每个元素与待处理图元en的表
   (setq        enlist (mapcar '(lambda        (x)
                          (list en x)
                        )
                       sslist
               )
   )
   ;;判断两个对象是否有实交点
   (setq        enptlist (apply        'append
                        (mapcar        '(lambda (x)
                                   (obj_int (car x) (cadr x))
                                 )
                                enlist
                        )
                 )
   )
   (if (> (length enptlist) 0)
     ;;如果交点是对象的端点,也认为无交点
     (progn
       (cond
        ((and
           (= (length enptlist) 1)
           (or (equal (car enptlist) (cdr (assoc 10 (entget en))) 1e-6)
               (equal (car enptlist) (cdr (assoc 11 (entget en))) 1e-6)
           )
         )
         (setq flag (cons nil (cons "A" enptlist)))
        )
        ((= (length enptlist) 1)
         (setq flag (cons nil (cons "S" enptlist)))
        )
        ((and
           (= (length enptlist) 2)
           (equal (vl-sort '(lambda (x) '>)
                           (list (cdr (assoc 10 (entget en)))
                                 (cdr (assoc 11 (entget en)))
                           )
                  )
                  (vl-sort '(lambda (x) '> enptlist))
                  1e-6
           )
         )
         (setq flag (cons nil (cons "D" entptlist)))
        )
        ((and
           (= (length enptlist) 2)
           (equal (vl-sort '(lambda (x) '>)
                           (list (cdr (assoc 10 (entget en)))
                                 (cdr (assoc 11 (entget en)))
                           )
                  )
                  (vl-sort '(lambda (x) '> enptlist))
                  1e-6
           )
         )
         (setq flag (cons nil (cons "F" entptlist)))
        )
        (T
         (setq flag (cons nil (cons "G" entptlist)))
        )
       )
     )
     ;;end progn
     (setq flag '(T))
   )
   flag
)
(defun c:test2 ()
   (setq en (car (entsel)))
   (if (car (YTM:JDPD en))
     (princ "\n无交点啊")
     (progn
       (cond
        ((= (cadr (YTM:JDPD en)) "A") (princ "\n有一个端交点"))
        ((= (cadr (YTM:JDPD en)) "S") (princ "\n有一个非端交点"))
        ((= (cadr (YTM:JDPD en)) "D") (princ "\n有两个端交点"))
        ((= (cadr (YTM:JDPD en)) "F") (princ "\n有两个交点"))
        ((= (cadr (YTM:JDPD en)) "G") (princ "\n有大于3个交点"))
       )
     )
   )
)
 楼主| 发表于 2012-9-21 17:04:11 | 显示全部楼层
Gu_xl 发表于 2012-9-21 11:54
(ssget "F" pt_list)

很无语啊!我费这么大劲判断出图元有几个交点,目的在于不退出TRIM的时候删除图元,可实际上TRIM本来就带这个功能
选择要修剪的对象,或按住 Shift 键选择要延伸的对象,或
[栏选(F)/窗交(C)/投影(P)/边(E)/删除(R)/放弃(U)]:
白费劲啊!

点评

不明白你到底想要干什么!  发表于 2012-9-21 18:11
 楼主| 发表于 2012-9-21 23:24:04 | 显示全部楼层
革天明 发表于 2012-9-21 17:04
很无语啊!我费这么大劲判断出图元有几个交点,目的在于不退出TRIM的时候删除图元,可实际上TRIM本来就带 ...

目的:在使用TRIM命令时,若图元有交点,刚按正常TRIM命令来进行修剪,当图元是孤立的(没有任何交点或交点为图元的端点)时,当图元自动删除

点评

正确的提问方式:如何判断要剪裁的实体和剪裁边界是否相交!你一楼的描述让人摸不着头脑!  发表于 2012-9-21 23:57
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-6 12:43 , Processed in 0.212724 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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