明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1781|回复: 1

[讨论]判断线和块的位置关系(我想了好长时间了)

[复制链接]
发表于 2006-12-29 08:55:00 | 显示全部楼层 |阅读模式

一个属性块和一根线,判断线在块的左边、右边、上面、还是下面

由于块的属性比较多,线是连接在块的图元上,并不是属性上,块也可能是旋转的,

我是通过(vla-getboundingbox ent 'minpoint 'maxpoint ) 得到除属性外的图元得到最小的范围,再画出4条线,再根据线到4条线的距离来判断,线连接在那边,这个方法是可以实现的,但是速度比较慢,特别是块的角度不为0的情况,这种判断在图纸中可能有过百个,得到结果要1分钟以上。各位高手能不能指点下。我现在只是解决了角度为0的。


(defun c:test(   / p_four ent1 ent2 ent3 ent4 k ss )
  (setq ent (car (entsel "")))
  (setq inout_ty "1234")
  (setq p_four (zn_get_minmaxp_block ent))
  (SETQ SS (ssget "CP" p_four '((0 . "LWPOLYLINE"))))
  (command "line" (nth 0 p_four)(nth 1 p_four) "")
  (setq ent2 (entlast))
  (command "line" (nth 1 p_four)(nth 2 p_four) "")
  (setq ent3 (entlast))
  (command "line" (nth 2 p_four)(nth 3 p_four) "")
  (setq ent4 (entlast))
  (command "line" (nth 3 p_four)(nth 0 p_four) "")
  (setq ent1 (entlast))
  (setq k 0 back '())
  (while (< k (sslength ss))
    (setq entg (ssname ss k))   
    (setq backdata(zn_get_l_type entg inout_ty ent1 ent2 ent3 ent4))
    (if (or (= inout_ty "1111")(/= "0" (substr inout_ty (car backdata) 1)))
      (setq back (cons (list(substr inout_ty (car backdata) 1) entg(cadr backdata) )back))
      )
    (setq k (1+ k))
    )
  (entdel ent1)
  (entdel ent2)
  (entdel ent3)
  (entdel ent4)
  back
  )
;;;*************************************************************************;;;
;;; MODULE:得到线在块的位置                                                 ;;;
;;;                                                                         ;;;
;;; EXAMPLE: zn_PUT_data(ent putdd tr )                                     ;;;
;;; NOTES:                                                                  ;;;
;;;*************************************************************************;;;
(defun zn_get_l_type (entg inout_ty ent1 ent2 ent3 ent4 / p0 p1 pts ) 
  (setq p0 (cdr(ASSOC 10 (entget entg))))
  (setq p1 (cdr(ASSOC 10 (REVERSE(entget entg)))))
  (setq pts(list
      (list (distance p0 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent1) p0)) p1  1)
      (list (distance p1 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent1) p1)) p0  1)
      (list (distance p0 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent2) p0)) p1  2)
      (list (distance p1 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent2) p1)) p0  2)
      (list (distance p0 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent3) p0)) p1  3)
      (list (distance p1 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent3) p1)) p0  3)
      (list (distance p0 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent4) p0)) p1  4)
      (list (distance p1 (vlax-curve-getClosestPointTo (vlax-ename->vla-object ent4) p1)) p0  4)))
  (REVERSE(car (vl-sort pts  (function (lambda (e1 e2) (< (car e1) (car e2)) ) ) )

        ))
  )
;;;*************************************************************************;;;
;;; MODULE: 得到块的4个点  4 3                                              ;;;
;;;                        1 2                                              ;;;
;;; EXAMPLE: zn_get_minmaxp_block (ent)                                   ;;;
;;; NOTES:                                                                  ;;;
;;;*************************************************************************;;;
(defun zn_get_minmaxp_block ( en / ent m n blocks vn pointmax pointmin maxpoint minpoint ONE TWO)
  ;(setq en ent)
  (setq *AcadDocument* (vla-get-activeDocument (vlax-get-acad-object))
 blocks        (vla-get-blocks *AcadDocument*))   
  (setq vn (vla-item blocks (cdr (assoc 2 (entget  en)))))
  (setq p0 (cdr (ASSOC 10 (entget  en))))
  (setq m '() n '())
  (vlax-for ent vn
    ;;这里的 ent 就是 块内的图元了,可以对其进行操作
    (if(/= "AcDbAttributeDefinition" (vla-get-ObjectName ent))
      (progn
 (vla-getboundingbox ent 'minpoint 'maxpoint )
 (setq pointmax (vlax-safearray->list maxpoint)
       pointmin (vlax-safearray->list minpoint))
 (setq pointmax (LIST(+(CAR p0)(CAR pointmax))(+(CADR p0)(CADR pointmax))0))
 (setq pointmin (LIST(+(CAR p0)(CAR pointmin))(+(CADR p0)(CADR pointmin))0))
 (setq m (cons pointmax m))
 (setq n (cons pointmin n))
 )
      )
    )
  (setq two(list(caar (vl-sort M(function (lambda (e1 e2) (> (car  e1) (car  e2))))))
  (cadar(vl-sort M(function (lambda (e1 e2) (> (cadr e1) (cadr e2))))))
  0))
  (setq one(list(caar (vl-sort N(function (lambda (e1 e2) (< (car  e1) (car  e2))))))
  (cadar(vl-sort N(function (lambda (e1 e2) (< (cadr e1) (cadr e2))))))
  0)) 
  (list one (LIST (CAR TWO) (CADR ONE) 0)  two (LIST (CAR ONE) (CADR TWO) 0))
  )

发表于 2006-12-29 12:02:00 | 显示全部楼层

请问你说的左右,前后是如何定义的?

把你的最终目的讲出来,或许大家有更好的方法

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

本版积分规则

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

GMT+8, 2025-11-23 11:34 , Processed in 0.197305 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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