Trans 在对齐标注中的应用
Trans 详细解释见高飞鸟版主帖子根据这个还可以做成对齐最低、指定对齐哪个
(defun c:tt (/ ss lst base el d13 d14 slst v m bs basedim bp1 bp2 _d10
fdim)
(defun getdimang (el / d10 d13 an)
(setq d10 (cdr (assoc 10 el))
d14 (cdr (assoc 14 el))
an(angle d10 d14)
)
(list d10 (polar d10 (+ an _pi2) 1.))
);_获取标注线的方向上两点
(if (setq ss (ssget '((0 . "dimension"))))
(progn
(setq lst (xdrx_pickset->ents ss)
base (car lst)
el (entget base)
_d10 (cdr (assoc 10 el))
fdim (getdimang el)
v (mapcar '- (cadr fdim) (car fdim));_标注方向向量
m (trans (mapcar '- (cdr (assoc 14 el)) (car fdim)) 0 v);_标注点在标注的方向
slst (mapcar '(lambda (x / d10)
(setq d10 (cdr (assoc 10 (entget x))))
(list (car (trans (mapcar '- d10 _d10) 0 v)) x)
)
(cdr lst)
);_其它标注相对于第一个标注的位置
slst (mapcar
'cadr
(vl-sort slst '(lambda (x1 x2) (< (car x1) (car x2))))
);_按距离排序
)
(if (minusp (car m))
(setq bs (last slst))
(setq bs (car slst))
);_根据标注方向确定基准标注
(setq basedim (getdimang (entget bs))
bp1 (car basedim)
bp2 (cadr basedim)
);_获取基准标注线
(mapcar '(lambda (x / l d10 d14 p)
(if (not (equal x bs))
(progn
(setq l (entget x)
d10 (cdr (assoc 10 l))
d14 (cdr (assoc 14 l))
p (inters d10 d14 bp1 bp2 nil)
)
(entmod (subst (cons 10 p) (assoc 10 l) l))
)
)
)
lst
)
)
)
(princ)
)
由 图1 可以看出 trans 这个用法是
AcGeVector3d orthoProject(
const AcGeVector3d& planeNormal
) const;
在三个平面投影向量的和
_$ p0
(1896.73 1688.36 0.0)
_$ p1
(2753.77 1688.36 0.0)
_$ p2
(2430.77 1357.06 0.0)
_$ (trans (mapcar '- p2 p0) 0 (mapcar '- p1 p0))
(-331.304 0.0 534.034)
_$ (xdrx_vector_orthoproject (mapcar '- p2 p0) '(1.0 0.0 0.0))
(0.0 -331.304 0.0)
_$ (xdrx_vector_orthoproject (mapcar '- p2 p0) '(0.0 1.0 0.0))
(534.034 0.0 0.0)
_$ (xdrx_vector_orthoproject (mapcar '- p2 p0) '(0.0 0.0 1.0))
(534.034 -331.304 0.0)
用 API方式一
(defun c:tt (/ ss lst first pts p1 p2 slst bs plane )
(if (setq ss (ssget '((0 . "dimension"))))
(progn
(setq lst (xdrx_pickset->ents ss)
first (car lst)
pts (xdrx_entity_getstretchpoint first)
p1 (nth 3 pts)
p2 (nth 4 pts)
slst(mapcar '(lambda (x / v)
(list
(xdrx_point_dist2line
(nth 2 (xdrx_entity_getstretchpoint x))
p1
p2
)
x
)
)
lst
) ;_其它标注相对于第一个标注的位置
slst(mapcar
'cadr
(vl-sort slst '(lambda (x1 x2) (< (car x1) (car x2))))
) ;_按距离排序
)
(if (minusp (xdrx_point_dist2line (car pts) p1 p2))
(setq bs (last slst)
slst (cdr (reverse slst))
)
(setq bs (car slst)
slst (cdr slst)
)
) ;_根据标注方向确定基准标注
(setq pts (xdrx_entity_getstretchpoint bs)
plane (list (nth 3 pts) (mapcar '- (nth 3 pts) (cadr pts)))
)
(mapcar
'(lambda (x / p)
(setq p (xdrx_point_orthoproject
(xdrx_getpropertyvalue x "dimlinepoint")
plane
)
)
(xdrx_setpropertyvalue x "dimlinepoint" p)
)
slst
)
)
)
(princ)
) 学习~~~~~~~~~~~~~
页:
[1]