yamjqq 发表于 2015-8-1 18:49:55

如何快速查某一边长的矩形及三角形

有若干多义线画的三角形、矩形(边长均未标注)如何快速查找边长为349的三角形,边长160的矩形,为防止偏差容差默认为2。

e2002 发表于 2015-8-1 19:33:06

就这么多还是有非常多?
如果就这么点,你还是直接标注后直接找出来用时更少。

yamjqq 发表于 2015-8-1 20:06:05

图形非常多,通过查找标注尺寸的方法比较麻烦。

e2002 发表于 2015-8-2 10:09:51

那就只好程序处理了。
获得 ss , 遍历每个三角形和矩形对象, 计算边长,只要有 某个边长为 L+-2的,就计入一个 ssnew;
最后返回 ssnew

edata 发表于 2015-8-2 11:55:08

;;快速查找三角形边长
;by edata @ mjtd.com 2015-8-2
(defun c:tt(/ ss ss2 en pts ds1 ds2 ds3 ds4 p1 p2 p3 p4)
(setq ss2(ssadd))
(if(setq ss(ssget '((0 . "lwpolyline"))))
    (while(setq en(ssname ss 0))
      (setq pts(sk_getpt en) p1 nil p2 nil p3 nil p4 nil)
      (setq pts(sk_removept pts 1e-6))
      (cond
        ((=(length pts) 3)
       (mapcar 'set '(p1 p2 p3) pts)
       (setq ds1(distance p1 p2)
             ds2(distance p2 p3)
             ds3(distance p3 p1)
             )       
       (if(or(equal 349 ds12)
                (equal 349 ds22)
                (equal 349 ds3 2)
                )
           (setq ss2(ssadd en ss2))          
           )
       )
        ((=(length pts) 4)
       (mapcar 'set '(p1 p2 p3 p4) pts)
       (setq ds1(distance p1 p2)
             ds2(distance p2 p3)
             ds3(distance p3 p4)
             ds4(distance p4 p1)
             )       
       (if(or(equal 160 ds1 2)
             (equal 160 ds2 2)
             (equal 160 ds3 2)
             (equal 160 ds4 2)
             )
           (setq ss2(ssadd en ss2))
           )
       )
        )
      (setq ss(ssdel en ss))
      )
    )
(if (and ss2 (> (sslength ss2 ) 0))
    (progn      
      (sssetfirst nil ss2)
      (vl-cmdf "regen")
      )
    )
(princ)
)
(defun sk_getpt(ent)
(mapcar 'cdr (vl-remove-if-not'(lambda(x)(= (car x) 10)) (entget ent)))
)
(defun sk_removept (ptLst fuzz / pt1)
    (cond ((<= (length ptLst) 1) ptLst)
          (t
         (setq pt1 (car ptLst))
         (cons pt1
               (vl-remove-if
                   '(lambda (x) (and(equal (car pt1) (car x) fuzz)
                                  (equal (cadr pt1) (cadr x) fuzz)
                                  )
                                  )
                   (sk_removept (cdr ptLst) fuzz)
               )
         )
          )
    )
)

77077 发表于 2015-8-3 23:59:26

用这个是否可以?未严格测试~~~;;功能] pline,lwpline各段长度 BY:qq181976640
;;示例(setq lens (vlens (car (entsel))))
(defun vlens (e / i len1 len2 lst)
(setq i 0 lst nil)
(while (and (setq len1 (vlax-curve-getDistAtParam e i))
                    (setq len2 (vlax-curve-getDistAtParam e (setq i (1+ i))))
                 )
      (setq lst (cons (- len2 len1) lst))
    )
(reverse lst)
)
;;查找含有某一长度的多段线
(defun c:tt(/ len ss i ss2 en lens)
        (setq len (getreal "要查找的边长:"))
(if (and (setq ss(ssget '((0 . "*POLYLINE"))))
                 (> (sslength ss) 0)
                 (setq i 0)
                 (setq ss2(ssadd))
                )
    (while (setq en (ssname ss i))
      (setq lens (vlens en))
      (if (and
              (or(=(length lens)3)(=(length lens)4))
              (or (equal len (car lens) 0.1)
                   (equal len (cadr lens) 0.1)
                   (equal len (caddr lens) 0.1)
                   (equal len (cadddr lens) 0.1)
         ))
       (setq ss2 (ssadd en ss2))
       )
      (setq i (1+ i))
    )
   )
   (sssetfirst nil ss2)
   (princ)
)

cable2004 发表于 2015-8-4 01:46:42

本帖最后由 cable2004 于 2015-8-4 02:02 编辑

;;快速查找三角形边长
;by edata @ mjtd.com 2015-8-2
(defun c:tt(/ ss ss2 en pts ds1 ds2 ds3 ds4 p1 p2 p3 p4)
(setq ss2(ssadd))
(if(setq ss(ssget '((0 . "lwpolyline"))))
    (while(setq en(ssname ss 0))
      (setq pts(sk_getpt en))
      (setq pts(sk_removept pts 1e-6))
      (cond
      ((=(length pts) 3)   
         (if(apply 'or (mapcar '(lambda(x y) (equal (distance x y) 349 2)) (cons (last pts) pts) pts))
         (setq ss2(ssadd en ss2))         
         )
         )
      ((=(length pts) 4)
         
                  
         (if(and
         (apply 'or (mapcar '(lambda(x y) (equal (distance x y) 160 2)) (cons (last pts) pts) pts))
         (equal (- (distance (car pts) (caddr pts))(distance (cadr pts) (cadddr pts))) 0 1e-6)
               )
         (setq ss2(ssadd en ss2))
         )
         )
      )
      (setq ss(ssdel en ss))
      )
    )
(if (and ss2 (> (sslength ss2 ) 0))
    (progn      
      (sssetfirst nil ss2)
      (vl-cmdf "regen")
      )
    )
(princ)
)

llsheng_73 发表于 2015-8-4 13:17:23

本帖最后由 llsheng_73 于 2015-8-4 13:24 编辑

(defun c:tt(/ ss i a e s)
(if(setq i 0
    s(ssadd)
    ss(ssget'((0 . "lwpolyline")(-4 . "<or")(90 . 3)(90 . 4)(-4 . "or>"))))
    (progn
      (repeat(sslength ss)
(setq e(ssname ss i)a(plinexy e)i(1+ i))
(if(or(apply'or(mapcar'(lambda(x)(equal 160 x 1e-10))(isrectangle a)))
       (apply'or(mapcar'(lambda(x)(equal 349 x 1e-10))(istriangle a))))
   (setq s(ssadd e s))))
      (sssetfirst'nil s)))
)
(defun plinexy(e / a q m p p1);;;LWPolyline,POLYLINE顶点,去掉完全重合点
    (setq a(vlax-ename->vla-object e)
   q(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates a)))
   m(if(=(vla-get-objectname a)"AcDb3dPolyline")'(setq p1(list (car q)(cadr q)(caddr q))q(cdddr q))
      '(setq p1(list (car q)(cadr q))q (cddr q))))
    (while q(eval m)
      (setq p(if(member p1 p)p(append p(list p1))))))
(defun isrectangle(pt);;如果为矩形返回长X宽
(IF(and(=(length pt)4)
   (equal(apply'-(mapcar'distance(cddr pt)pt))1e-10))
   (vl-sort(mapcar'distance(cdr pt)(cddr pt))'>))
)
(defun istriangle(pt);;如果为三角形返回边长
(IF(and(=(length pt)3)
(/=(car(trans(mapcar'-(car pt)(cadr pt))0(mapcar'-(last pt)(cadr pt))))0))
   (mapcar'distance pt(cons(last pt)pt)))
)
页: [1]
查看完整版本: 如何快速查某一边长的矩形及三角形