kucha007 发表于 2025-11-7 22:30:03

【UCS】在任意UCS下,entmake生成正确的对象

本帖最后由 kucha007 于 2025-11-7 22:37 编辑

如何在任意UCS下,entmake生成正确的对象,使得任意UCS下生成的对象, 和WCS下生成的看起来一样。

关键在于UCS或者说OCS对应的法向和角度。
最近在死磕标注,在拜读了这篇文章后,终于理解了:

【越飞越高讲堂16】CAD的坐标系统和trans函数的工作原理







(setq UCSzdir (trans '(0 0 1) 1 0 T);UCS的Z方向,DXF210
      UCSAng (angle '(0 0 0)(trans (getvar 'UCSXDIR) 0 UCSzdir));OCS的X轴线跟UCS的X轴夹角,DXF51
)
(setq StaPT (K:GetDXF 10 ent) ;线段起点
      EndPT (K:GetDXF 11 ent) ;线段终点
      TgtPT (lambda (pt Dis)
                  (mapcar '+ pt
                      (MAT:v*s
                        (MAT:Rot2D (MAT:UnitVec (mapcar '- EndPT StaPT))(* PI 0.5));单位向量逆时针旋转90度
                        Dis
                      )
                  )
            )      
)

(entmake
(list
    (cons 0 "DIMENSION")
    (cons 100 "AcDbEntity")
    (cons 100 "AcDbDimension")
    (cons 51 (* -1 UCSAng))
    (cons 210 UCSzdir)
    (cons 3 "_DQ_Arch");标注样式
    (cons 10 (TgtPT EndPT (* DIMSca 5.0)));标注定义点

    (cons 70 1);对齐
    (cons 100 "AcDbAlignedDimension")
    (cons 13 StaPT);标注起点
    (cons 14 EndPT);标注终点
)
)


kucha007 发表于 2025-11-7 22:31:07

向量的函数参考此文章:
【越飞越高讲堂15】用LISP论矩阵

guosheyang 发表于 2025-11-9 08:16:23

(defun MAT:v*s(v s);gc:ScaleVector
(mapcar (function (lambda (x) (* x s))) v)
)
;;; 旋转向量 高飞鸟;
(defun MAT:Rot2D (v a / c s x y)
(setq c (cos a) s (sin a))
(setq x (car v) y (cadr v))
(list (- (* x c) (* y s)) (+ (* x s) (* y c)))
)
(defun c:ff(/ ENDPT ENT P00 S STAPT TGTPT UCSANG UCSZDIR X)
(setq x(car(entsel)))
(setq ent(entget x))
(setq UCSzdir (trans '(0 0 1) 1 0 T);UCS的Z方向,DXF210
      UCSAng (angle '(0 0 0)(trans (getvar 'UCSXDIR) 0 UCSzdir));OCS的X轴线跟UCS的X轴夹角,DXF51
)
(setq StaPT (cdr(assoc10 ent)) ;线段起点
      EndPT (cdr(assoc 11 ent));K:GetDXF线段终点
      TgtPT (lambda (pt Dis)
                  (mapcar '+ pt
                      (MAT:v*s
                        (MAT:Rot2D (trans '(0 0 1)(mapcar '- EndPT StaPT) 0) (* PI 0.5));MAT:UnitVec单位向量逆时针旋转90度
                        Dis
                      )
                  )
            )      
)
(entmake
(list
    (cons 0 "DIMENSION")
    (cons 100 "AcDbEntity")
    (cons 100 "AcDbDimension")
    (cons 51 (* -1 UCSAng))
    (cons 210 UCSzdir)
    (cons 3 "ISO-25");标注样式
    (cons 10 (setq p00(TgtPT EndPT (* 605.0))));DIMSca标注定义点
    (cons 70 1);对齐
    (cons 100 "AcDbAlignedDimension")
    (cons 13 StaPT);标注起点
    (cons 14 EndPT);标注终点
)
)
(princ)
)

guosheyang 发表于 2025-11-9 08:13:18

本帖最后由 guosheyang 于 2025-11-9 08:17 编辑

attach://146972.dwg

      老大   我用这个文件里面的红色线(里面建立了命名ucs)   用你的代码来生成标注   但是发现wcs 下 和ucs下标注的并不一样   文字方向是相反的 ,我可能没有完全理解你帖子的题意,能否解释下,谢谢!

guosheyang 发表于 2025-11-12 13:52:33

本帖最后由 guosheyang 于 2025-11-12 20:19 编辑

    思路: 针对直线,具体就是将直线按照主方向分成一、二、三、四象限的线;将ucs的x轴与直线主方向的夹角也分成-0.5π到0.5π和0.5π到1.5π两种情况,然后组合分类就可以区分控制了(控制文字方向要不要加上一个π 的值)

guosheyang 发表于 2025-11-8 12:37:54

vla-AddDimAligned   用这个函数在ucs下标注好像是对头的   比entmake省事儿些

tranque 发表于 2025-11-8 18:01:41

好,威武,支持,有希望

kucha007 发表于 2025-11-8 22:12:11

guosheyang 发表于 2025-11-8 12:37
vla-AddDimAligned   用这个函数在ucs下标注好像是对头的   比entmake省事儿些


vla-Add和entmake差不多的,都需要提前计算,赋予法向

kucha007 发表于 2025-11-10 14:04:47

guosheyang 发表于 2025-11-9 08:16
(defun MAT:v*s(v s);gc:ScaleVector
(mapcar (function (lambda (x) (* x s))) v)
)

因为你的UCS,X轴正方向在左下角。相当于观察方向反转了180度了

guosheyang 发表于 2025-11-11 22:18:11

kucha007 发表于 2025-11-10 14:04
因为你的UCS,X轴正方向在左下角。相当于观察方向反转了180度了

嗯   任意ucs下也可以实现标注的一致性   只是需要做更多的判断

kucha007 发表于 2025-11-12 10:39:41

guosheyang 发表于 2025-11-11 22:18
嗯   任意ucs下也可以实现标注的一致性   只是需要做更多的判断

任意UCS,但是你UCS有方向啊。你给的文件UCS是倒着的啊,观察方向当然也是倒着的
页: [1] 2
查看完整版本: 【UCS】在任意UCS下,entmake生成正确的对象