x_s_s_1 发表于 2020-3-17 21:03:56

vla方法稍微快点

(defun c:test2
         (/ ss1 nen ent lst1a lst1b ss2 lst2 lst3 m p papb pc
    adoc acspc)
(prompt "\n选择定位线:")
(setq ss1 (ssget '((0 . "line"))))
(repeat (setq n (sslength ss1))
    (setq en(ssname ss1 (setq n (1- n)))
    ent (entget en)
    )
    (if(equal (car (cdr (assoc 10 ent)))
         (car (cdr (assoc 11 ent)))
         1e-6
)
      (setq lst1a (cons en lst1a))
      (setq lst1b (cons en lst1b))
    )
)
(prompt "\n选择标示物:")
(setq ss2 (ssget '((0 . "*line,point,circle,arc"))))
(repeat (setq n (sslength ss2))
    (setq en(ssname ss2 (setq n (1- n)))
    ent (entget en)
    )
    (cond ((member (cdr (assoc 0 ent)) '("POINT" "CIRCLE"))
   (setq lst2 (cons (cdr (assoc 10 ent)) lst2))
    )
    ((member (cdr (assoc 0 ent)) '("LINE" "ARC"))
   (setq lst2 (cons (vlax-curve-getstartpoint en) lst2))
   (setq lst2 (cons (vlax-curve-getendpoint en) lst2))
    )
    ((member (cdr (assoc 0 ent)) '("LWPOLYLINE" "POLYLINE"))
   (setq m (vlax-curve-getendParam en))
   (while (>= m 0)
       (setq lst2(cons (vlax-curve-getpointatparam en m) lst2)
       m(1- m)
       )
   )
    )
    )
)
(while lst2
    (setq p    (car lst2)
    lst(cdr lst2)
    lst3 (cons p lst3)
    )
    (iflst2
      (setq lst2 (vl-remove-if '(lambda (x) (equal p x 1e-6)) lst2))
    )
)
(setqlst3 (vl-sort lst3
          '(lambda (p1 p2)
       (if (equal (car p1) (car p2) 1e-6)
         (< (cadr p1) (cadr p2))
         (< (car p1) (car p2))
       )
         )
       )
)
(setq n (car lst3))
(foreach n lst3
    (setq
      lst2 (mapcar
       '(lambda (x) (list n (vlax-curve-getclosestpointto x n t)))
       lst1a
   )
      lst2 (vl-sort lst2
      '(lambda (p1 p2)
         (< (distance (car p1) (cadr p1))
      (distance (car p2) (cadr p2))
         )
         )
   )
    )
    (setq acdoc(vla-get-activedocument (vlax-get-acad-object))
    acspc(vlax-get-property
      acdoc
      (if (= 1 (getvar 'CVPORT))
      'Paperspace
      'Modelspace
      )
    )
    )
    (setq p(car lst2)
    pa (car p)
    pb (cadr p)
    pc (polar pa (* 0.5 pi) 500)
    )
    (vla-AddDimRotated
      acspc
      (vlax-3d-point pa)
      (vlax-3d-point pb)
      (vlax-3d-point pc)
      0
    )
    (setq
      lst2 (mapcar
       '(lambda (x) (list n (vlax-curve-getclosestpointto x n t)))
       lst1b
   )
      lst2 (vl-sort lst2
      '(lambda (p1 p2)
         (< (distance (car p1) (cadr p1))
      (distance (car p2) (cadr p2))
         )
         )
   )
    )
    (setq p(car lst2)
    pa (car p)
    pb (cadr p)
    pc (polar pa 0 500)
    )
    (vla-AddDimRotated
      acspc
      (vlax-3d-point pa)
      (vlax-3d-point pb)
      (vlax-3d-point pc)
      (* 0.5 pi)
    )
)
)



ddqzmpaxlozc 发表于 2020-3-17 21:15:33

x_s_s_1 发表于 2020-3-17 21:03
vla方法稍微快点

大佬,你能再帮着研究下标注之间避让的功能吗,你做的这个真是太合我心意了!!!

x_s_s_1 发表于 2020-3-17 21:18:34

不好定避让规则

ddqzmpaxlozc 发表于 2020-3-17 21:22:46

x_s_s_1 发表于 2020-3-17 21:18
不好定避让规则

麻烦您开动下脑筋想想呗,这个功能对我特别实用

ddqzmpaxlozc 发表于 2020-3-17 21:30:12

x_s_s_1 发表于 2020-3-17 21:18
不好定避让规则

大佬,我再追加50悬赏您看可以吗

x_s_s_1 发表于 2020-3-18 00:07:14

本帖最后由 x_s_s_1 于 2020-3-18 00:32 编辑

ddqzmpaxlozc 发表于 2020-3-17 21:30
大佬,我再追加50悬赏您看可以吗
你给个避让规则吧,我来根据规则编,实际上都标出来了,避让不避让无所谓了,手工调整就是的


ddqzmpaxlozc 发表于 2020-3-18 00:17:40

x_s_s_1 发表于 2020-3-18 00:07
你给个避让规则吧,我来根据规则编,实际上都标出来了,避让不避让无所谓了,手工调整就是的

谢谢大佬,稍等一下,我编辑

ddqzmpaxlozc 发表于 2020-3-18 00:36:17

x_s_s_1 发表于 2020-3-18 00:07
你给个避让规则吧,我来根据规则编,实际上都标出来了,避让不避让无所谓了,手工调整就是的

一、可以实现标注线之间相互避让,例如同方向的标注尺寸线之间距离最少为标注字高的1.5倍以上,如图1,2二、同一点的横纵向标注也应该避让,如图3,4

ddqzmpaxlozc 发表于 2020-3-18 00:42:10

本帖最后由 ddqzmpaxlozc 于 2020-3-18 00:43 编辑

x_s_s_1 发表于 2020-3-18 00:07
你给个避让规则吧,我来根据规则编,实际上都标出来了,避让不避让无所谓了,手工调整就是的
需要不通过手工再调的,既是为了批量生成同轴线之间的定位标注,标注之间要避让开,这样确保打印出来可以看清楚,其实原则说白了就一点,标注线之间尽可能没有交叉,尺寸标注之间也互相避让。

mikewolf2k 发表于 2020-3-18 09:04:01

避让规则很简单,按顺序标注,标注时候检测原来是否已有标注,有的话就向外增长一个值再放、再检测,直到无重叠为止。
当然编起来就比较费劲了。
参看我的管线标注避让。
避让规则很简单,按顺序标注,标注时候检测原来是否已有标注,有的话就向外增长一个值再放、再检测,直到无重叠为止。
当然编起来就比较费劲了。
参看我的管线标注避让。
页: 1 [2] 3
查看完整版本: 可否实现智能标注