eachy 发表于 2014-9-26 00:52:41

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)
)


eachy 发表于 2014-9-26 01:57:00

由 图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)

eachy 发表于 2014-9-26 07:42:55


用 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)
)

蟹岛蟹岛 发表于 2026-2-7 19:36:35

学习~~~~~~~~~~~~~
页: [1]
查看完整版本: Trans 在对齐标注中的应用