以下是我到目前为止所掌握的。。也许你可以根据自己的需要调整它。
- (defun c:foo (/ _dxf a e el l1 l2 l3 p1 p2 q r s x y)
- ;; Not very fast ( 25 seconds ) with example because of the 3500 lines for "DIAG_FORZE_SUPERF"
- ;; Needs a grid of lines on 'hatch' layer and other objects to check proximity to
- (defun _dxf (c e) (cdr (assoc c (entget e))))
- ;; Circle radius
- (setq r 0.1575)
- (cond
- ;; A selection
- ((and (setq s (ssget '((0 . "*polyline,line,circle,ellipse"))))
- (setq s (vl-remove-if 'listp (mapcar 'cadr (ssnamex s))))
- )
- ;; (idt_starttimer)
- (foreach x s
- (setq el (entget x))
- (if (and (= "LINE" (_dxf 0 x)) (= "HATCH" (strcase (_dxf 8 x))))
- (progn (setq q (angle (setq p1 (cdr (assoc 10 el))) (setq p2 (cdr (assoc 11 el)))))
- (or a (setq a (rem (angle (cdr (assoc 10 el)) (cdr (assoc 11 el))) pi)))
- (if (equal (rem q pi) a 1e-
- (setq l1 (cons (list p1 p2) l1))
- (setq l2 (cons (list p1 p2) l2))
- )
- )
- (setq l3 (cons x l3))
- )
- )
- (and
- l1
- l2
- l3
- (foreach y l1
- (foreach z (vl-remove 'nil
- (mapcar '(lambda (x) (inters (car x) (cadr x) (car y) (cadr y))) l2)
- )
- (setq e (entmakex (list '(0 . "circle") '(8 . "void") (cons 10 z) (cons 40 r))))
- (and (vl-some '(lambda (x) (< (distance z (vlax-curve-getclosestpointto x z)) r)) l3)
- (entdel e)
- )
- )
- )
- )
- ;; (idt_endtimer)
- )
- )
- (princ)
- )
- (vl-load-com)
|