1

我正在实现一个 DXF 导入器,现在我正在考虑该HEADER部分和其中只有一个变量INSUNITSTABLES部分只有一个表表BLOCK_RECORDBLOCKS部分、ENTITIES部分(、、、、、)。INSERTLINELWPOLYLINEARCCIRCLE

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

EXTRUSIONDIRECTIONTRANSFORMATION * 
     INSERTIONPOINTTRANSLATION * 
     ROTATION * SCALING * BASEPOINTTRANSLATION

当我删除 . 时,我正在导入的文件以正确的方式导入BASEPOINTTRANSLATION,但其他一些文件没有以正确的方式导入,并且绘图的某些部分被导入到离静止很远的地方。

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

4

1 回答 1

1

在 Pythonezdxf包中,我是这样做的:

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

github 上的 Python 代码

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

于 2021-12-10T09:45:30.737 回答