|
一个属性块和一根线,判断线在块的左边、右边、上面、还是下面 由于块的属性比较多,线是连接在块的图元上,并不是属性上,块也可能是旋转的, 我是通过(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)) )
|