DXF 导入器,不确定以什么顺序进行转换,如何处理块的单位和基点?

DXF importer, not sure in which order to do transformations, how to handle units and base point of a block?

我正在实施一个 DXF 导入器,现在我正在考虑 HEADER 部分并且只有一个变量 INSUNITSTABLES 部分只有一个 table BLOCK_RECORD table, BLOCKS 节, ENTITIES 节 (INSERT, LINE, LWPOLYLINE, ARC, CIRCLE).

导入时,我不知道是否需要考虑 单位,如果需要,我不知道具体如何考虑。我的文件现在没有以正确的方式导入,这很可能是由于这些单位,因为我认为我正在正确地进行 INSERT 转换:

EXTRUSIONDIRECTIONTRANSFORMATION * 
     INSERTIONPOINTTRANSLATION * 
     ROTATION * SCALING * BASEPOINTTRANSLATION

当我删除 BASEPOINTTRANSLATION 时,我正在导入的文件以正确的方式导入,但是其他一些文件没有以正确的方式导入,并且绘图的某些部分被导入的位置离休息很远.

在我看来,方块的基点在 英寸 中,当我将其转换为 时,它变得有点更好的。因此,如果有人知道我应该按什么顺序进行转换以及如何处理 DXF​​ 文件中的单位,我将非常感激,因为我现在被卡住了。

在Python ezdxf包中,我是这样做的:

  1. 起始矩阵M0 = OCS 变换矩阵,包括 x、y 和 z 轴的缩放;与 OCS 变换矩阵 * 缩放矩阵相同
  2. 关于挤压向量的旋转矩阵M1
  3. 变换矩阵M=M0*M1
  4. 将翻译添加到 insert
    • insert 点从 OCS 转换为 WCS
    • 用当前矩阵 M 转换 block_base_point 没有平移, M 的当前状态还没有平移,所以一个完整的转换不会是问题,但在我的代码中“仅方向”转换更快
    • insert点减去block_base_point
    • M 的最后一行设置为 (insert.x, insert.y, insert.z, 1) 如果行主要顺序,最后一列如果列主要顺序,基本上是 M * 平移矩阵

the Python code at github

可以忽略单位缩放,CAD 应用程序必须设置正确的缩放值以匹配 INSERT 缩放属性中的父布局单位和块参考单位。例如。如果将以 mm 为单位的块插入到以 m 为单位的模型空间,INSERT 实体的缩放值必须为 0.001 才能将毫米转换为米 (1mm = 0.001m)。