Skip to content

DMF 文件本地处理示例

以下示例展示如何使用 dimine_python_sdk.lib.io不启动 Dimine GUI 的情况下读取、遍历和编辑本地 .dmf 文件。

前置条件

  • 已安装 dimine-python-sdk
  • 已设置 DIMINE_HOME 环境变量(若使用真实 C++ 扩展加载本地文件)
  • 测试环境中 DmPyBindInterface.pyd 可用;CI 中需 mock

示例一:读取并遍历 DMF 文件

import numpy as np
from dimine_python_sdk.lib.io import DmfFile
from dimine_python_sdk.models.types import Point, Line, Shell, TextInfo

with DmfFile("剖面.dmf") as dmf:
    print(f"文件: {dmf.name}")
    print(f"图层数: {dmf.layer_count}")
    print(f"图层名称: {dmf.layer_names}")
    print(f"摘要: {dmf.info}")

    for layer in dmf:
        print(f"\n图层: {layer.name}, 实体数: {layer.entity_count}")

        for entity in layer.entities:
            if isinstance(entity, Point):
                print(f"  点 [{entity.feature}]: {entity.geometry}")
            elif isinstance(entity, Line):
                print(f"  线 [{entity.feature}]: {len(entity.geometry)} 个顶点")
            elif isinstance(entity, Shell):
                pts = entity.geometry.points
                faces = entity.geometry.faces
                print(f"  面 [{entity.feature}]: {len(pts)} 顶点, {len(faces)} 面")
            elif isinstance(entity, TextInfo):
                print(f"  文本 [{entity.feature}]: '{entity.text}' @ {entity.position}")

示例二:按名称访问图层

from dimine_python_sdk.lib.io import DmfFile

with DmfFile("矿山模型.dmf") as dmf:
    # 按索引
    layer0 = dmf[0]

    # 按名称
    terrain = dmf["地表"]

    # 判断是否存在
    if "矿体" in dmf:
        ore = dmf["矿体"]
        print(f"矿体图层实体数: {ore.entity_count}")

示例三:向现有文件新增实体

DmfFile 会把整个文件解析为 Python 内存模型,插入实体仅修改内存,调用 save() 时才落盘。

import numpy as np
from dimine_python_sdk.lib.io import DmfFile

with DmfFile("input.dmf") as dmf:
    # 新增图层
    layer = dmf.add_layer("计算结果")

    # 插入点
    layer.insert_point(np.array([100.0, 200.0, 300.0]), name="测点-1")

    # 插入直线
    layer.insert_line(
        np.array([0.0, 0.0, 0.0]),
        np.array([10.0, 0.0, 0.0]),
        name="中线",
    )

    # 插入多段线
    layer.insert_polyline(
        np.array([
            [0, 0, 0],
            [10, 0, 0],
            [10, 10, 0],
            [0, 10, 0],
        ]),
        name="轮廓线",
    )

    # 保存为新文件
    dmf.save("output.dmf")

示例四:创建包含 Shell 的 DMF

import numpy as np
from dimine_python_sdk.lib.io import DmfFile

points = np.array([
    [0.0, 0.0, 0.0],
    [10.0, 0.0, 0.0],
    [10.0, 10.0, 0.0],
    [0.0, 10.0, 0.0],
], dtype=np.float64)

faces = np.array([
    [0, 1, 2],
    [0, 2, 3],
], dtype=np.int32)

with DmfFile() as dmf:
    layer = dmf.add_layer("三角网")
    layer.insert_shell(points, faces, name="坡面")
    dmf.save("shell_model.dmf")

示例五:批量修改实体名称

直接操作 layer.entities 列表即可,layer.entity_count 会自动同步。

from dimine_python_sdk.lib.io import DmfFile

with DmfFile("input.dmf") as dmf:
    for layer in dmf.layers:
        for entity in layer.entities:
            entity.feature = f"{layer.name}_{entity.feature}"

    dmf.save("renamed.dmf")

示例六:错误处理

from dimine_python_sdk.lib.io import DmfFile
from dimine_python_sdk.lib.io import DmfLoadError, DmfSaveError, DmfInsertError

try:
    dmf = DmfFile("不存在的文件.dmf")
except DmfLoadError as e:
    print(f"加载失败: {e}")

with DmfFile("input.dmf") as dmf:
    try:
        dmf.save()  # 未指定路径会失败,除非 file_path 已存在
    except DmfSaveError as e:
        print(f"保存失败: {e}")

    try:
        dmf.insert_point(0, np.array([1.0, 2.0]))  # 坐标维度不足
    except DmfInsertError as e:
        print(f"插入失败: {e}")

相关参考

  • API 文档:dimine_python_sdk.lib.io
  • 异常定义:dimine_python_sdk.lib.io
  • 实体类型:dimine_python_sdk.models.types