【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);标注终点
)
)
向量的函数参考此文章:
【越飞越高讲堂15】用LISP论矩阵
(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:17 编辑
attach://146972.dwg
老大 我用这个文件里面的红色线(里面建立了命名ucs) 用你的代码来生成标注 但是发现wcs 下 和ucs下标注的并不一样 文字方向是相反的 ,我可能没有完全理解你帖子的题意,能否解释下,谢谢!
本帖最后由 guosheyang 于 2025-11-12 20:19 编辑
思路: 针对直线,具体就是将直线按照主方向分成一、二、三、四象限的线;将ucs的x轴与直线主方向的夹角也分成-0.5π到0.5π和0.5π到1.5π两种情况,然后组合分类就可以区分控制了(控制文字方向要不要加上一个π 的值)
vla-AddDimAligned 用这个函数在ucs下标注好像是对头的 比entmake省事儿些 好,威武,支持,有希望 guosheyang 发表于 2025-11-8 12:37
vla-AddDimAligned 用这个函数在ucs下标注好像是对头的 比entmake省事儿些
vla-Add和entmake差不多的,都需要提前计算,赋予法向 guosheyang 发表于 2025-11-9 08:16
(defun MAT:v*s(v s);gc:ScaleVector
(mapcar (function (lambda (x) (* x s))) v)
)
因为你的UCS,X轴正方向在左下角。相当于观察方向反转了180度了 kucha007 发表于 2025-11-10 14:04
因为你的UCS,X轴正方向在左下角。相当于观察方向反转了180度了
嗯 任意ucs下也可以实现标注的一致性 只是需要做更多的判断 guosheyang 发表于 2025-11-11 22:18
嗯 任意ucs下也可以实现标注的一致性 只是需要做更多的判断
任意UCS,但是你UCS有方向啊。你给的文件UCS是倒着的啊,观察方向当然也是倒着的
页:
[1]
2