我需要这条信息用于我正在创建的过滤器。
例如,假设我将网格和捕捉设置为 1,然后使用 UCS 放置原点。
然后我画了一个圆心 5, 0
。
这是我得到的:
(
(-1 . <Entity name: 1f3dbb9d580>)
(0 . "CIRCLE")
(330 . <Entity name: 1f3dbba51f0>)
(5 . "270")
(100 . "AcDbEntity")
(67 . 0)
(410 . "Model")
(8 . "0")
(100 . "AcDbCircle")
(10 2495.0 1180.0 0.0)
(40 . 3.16228)
(210 0.0 0.0 1.0)
)
为什么我在 10 号有这些数字?
它不应该像 (10 5.0 0.0 0.0)
吗?
最佳答案
定义大多数平面实体(例如圆弧、圆、2D 多段线等)几何形状的坐标是相对于称为对象坐标系 (OCS) 的坐标系定义的。
OCS 与世界坐标系 (WCS) 共享原点,其 Z 轴对应于与实体关联的法向量(也称为挤压向量)(由 DXF 组 210
表示) , 及其 X & Y 轴由 Arbitary Axis Algorithm 定义应用于法向量。
任意轴算法在标准 AutoLISP 中实现 trans
函数,它有助于将点从一个坐标系轻松转换到另一个坐标系。
在您的特定示例中,法向量是 (0.0 0.0 1.0)
,它等于 WCS 平面的法向量,因此对于这个特定示例,OCS 等于WCS.
但是,一般来说,要将点从任意 OCS 转换为 WCS 或事件用户坐标系 (UCS),您需要提供 trans
函数与 OCS 法向量或相关实体的实体名称一起使用。
例如,使用 OCS 法向量从 OCS 转换为事件 UCS:
(trans (cdr (assoc 10 <dxf-data>)) (cdr (assoc 210 <dxf-data>)) 1)
或者,使用实体名称从 OCS 转换为事件 UCS:
(trans (cdr (assoc 10 <dxf-data>)) (cdr (assoc -1 <dxf-data>)) 1)
在示例程序中实现,这可能是:
(defun c:test ( / ent enx )
(cond
( (not (setq ent (car (entsel "\nSelect circle: "))))
(princ "\nNothing selected.")
)
( (/= "CIRCLE" (cdr (assoc 0 (setq enx (entget ent)))))
(princ "\nThe selected object is not a circle.")
)
( (princ "\nThe circle center relative to the UCS is: ")
(princ (trans (cdr (assoc 10 enx)) ent 1))
)
)
(princ)
)
解决您在评论中描述的问题,您需要将坐标从 OCS 和 UCS 转换为/转换到 OCS 和 UCS 以达到预期的结果,例如:
(defun c:test ( / ent enx new old xco )
(cond
( (not (setq ent (car (entsel "\nSelect circle: "))))
(princ "\nNothing selected.")
)
( (/= "CIRCLE" (cdr (assoc 0 (setq enx (entget ent)))))
(princ "\nThe selected object is not a circle.")
)
( (setq old (assoc 10 enx)
xco (car (trans (cdr old) ent 1))
new (cons 10 (trans (list xco 0.0 0.0) 1 ent))
enx (subst new old enx)
)
(entmod enx)
)
)
(princ)
)
该操作也可以压缩为单个表达式,例如:
(setq old (assoc 10 enx)
enx (subst (cons 10 (trans (list (car (trans (cdr old) ent 1)) 0) 1 ent)) old enx)
)
(entmod enx)
但是,这可读性较差。
关于lisp - 为什么圆心坐标(键 10)与 DXF 数据中的原点不相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61329512/