lisp - 为什么圆心坐标(键 10)与 DXF 数据中的原点不相关?

标签 lisp autocad dxf autolisp

我需要这条信息用于我正在创建的过滤器。

例如,假设我将网格和捕捉设置为 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/

相关文章:

lisp - Common Lisp 超规范 : unbound symbol handling in conforming implementations

lisp - READ 在 FORMAT 之前运行

c - 从 C 语言在 AutoCAD 中画一个圆

java - 如何从 AutoCAD 创建的 DXF 中提取组件?

svg - 在保留图层的同时在 Inkscape CLI 中将 DXF 转换为 SVG

function - 是否可以在运行时在 SBCL/Common Lisp 中检查/获取函数类型或其签名?

emacs - 使用 Paredit 包装现有表达式

c# - 导入多个 DXF 文件时实体错误

linux - 转换和下载地理空间数据

c++ - C++ 中的开源 DXF 解析器