Skip to content

DMF 文件读写

dimine_python_sdk.lib.io 提供 DmfFile 类对 Dimine 标准工程文件(.dmf)进行本地读写,无需启动 Dimine 桌面客户端。DMF 是 Dimine 的核心中转格式,内部采用图层-实体-要素三层模型管理几何对象与属性数据,API 完整映射到 Python 内存模型。


一、加载与保存

从文件加载

from dimine_python_sdk.lib.io import DmfFile

dmf = DmfFile("input.dmf")
print(dmf.info)
# {'file': 'input.dmf', 'name': 'input', 'layers': 3,
#  'total_entities': 42, 'layer_names': ['L0', 'L1', 'L2'],
#  'features': ['0'], 'feature_count': 1}

保存到文件

dmf.save("output.dmf")  # 另存为新文件
dmf.save()              # 覆盖原文件(仅当 file_path 已设置时)

上下文管理器(推荐)

with DmfFile("input.dmf") as dmf:
    # ... 操作图层和实体 ...
    dmf.save("output.dmf")
# 退出时自动释放资源

或使用 dmf_conn 便捷函数(与 DmfFile 构造等价):

from dimine_python_sdk.lib.io import dmf_conn

with dmf_conn("input.dmf") as dmf:
    print(dmf.layer_count)

二、文件信息查询

dmf = DmfFile("input.dmf")

dmf.name            # "input" — 文件名(不含扩展名)
dmf.file_path       # "input.dmf" — 完整路径
dmf.layer_count     # 图层数量
dmf.layer_names     # ["L0", "L1", "L2"] — 所有图层名称
dmf.layers          # [DmfLayer, ...] — 图层列表(可直接修改内存模型)

dmf.info            # 字典:file, name, layers, total_entities, layer_names, features, feature_count

三、图层管理

查看图层

# 按索引访问
layer_0 = dmf[0]
layer_0 = dmf.get_layer(0)

# 按名称访问
layer = dmf["L1"]
layer = dmf.get_layer("L1")

# 遍历所有图层
for layer in dmf:
    print(layer.name, layer.entity_count)

添加图层

new_layer = dmf.add_layer("计算图层")
print(new_layer.name, new_layer.entity_count)  # "计算图层" 0

add_layer 仅修改内存模型,需调用 dmf.save() 才会写入文件。


四、实体插入

DmfFile 提供五种实体插入方法,均直接操作内存模型,支持 colorproperties 参数:

插入点

import numpy as np

dmf.insert_point(
    "计算图层",
    np.array([1.0, 2.0, 3.0]),
    name="控制点",
    color=[255, 0, 0],
)

插入直线

dmf.insert_line(
    "计算图层",
    np.array([0.0, 0.0, 0.0]),
    np.array([10.0, 0.0, 0.0]),
    name="中心线",
    color=[0, 255, 0],
)

插入多段线

points = np.array([
    [0.0, 0.0, 0.0],
    [5.0, 3.0, 0.0],
    [10.0, 0.0, 5.0],
])
dmf.insert_polyline(
    "计算图层",
    points,
    name="折线",
    color=[0, 0, 255],
)

插入三维实体(Shell)

pts = np.array([
    [0, 0, 0], [1, 0, 0], [1, 1, 0], [0, 1, 0],
    [0, 0, 1], [1, 0, 1], [1, 1, 1], [0, 1, 1],
], dtype=float)
faces = np.array([
    [0, 1, 2], [0, 2, 3],  # 底面
    [4, 5, 6], [4, 6, 7],  # 顶面
    [0, 1, 5], [0, 5, 4],  # 前面
], dtype=int)

dmf.insert_shell(
    "计算图层",
    points=pts,
    faces=faces,
    name="块体",
    color=[128, 128, 128],
)

插入文本标注

dmf.insert_text(
    "计算图层",
    position=np.array([5.0, 5.0, 0.0]),
    text="测点A",
    name="标注",
    color=[255, 255, 0],
)

携带属性值

所有插入方法支持 properties 参数,为实体附加自定义属性:

from dimine_python_sdk.models.types import PropertyValue

dmf.insert_point(
    "计算图层",
    np.array([1.0, 2.0, 3.0]),
    name="采样点",
    properties=[
        PropertyValue(name="品位", type="double", value=1.5),
        PropertyValue(name="岩性", type="string", value="花岗岩"),
    ],
)

五、要素管理

要素定义了实体上可附加的属性集合(schema),与 Dimine 中的 Feature 概念一一对应。

注册要素

from dimine_python_sdk.models.types import PropertyInfo

# 注册一个"矿体"要素,包含两个属性定义
feature = dmf.add_feature(
    "矿体",
    properties=[
        PropertyInfo(name="品位", type="double"),
        PropertyInfo(name="储量级别", type="string"),
    ],
)

查看已注册要素

dmf.features        # [DmfFeature("矿体", ...)]
dmf.feature_names   # ["矿体"]
dmf.info["features"]         # ["矿体"]
dmf.info["feature_count"]    # 1

注意:要素定义在文件级别注册,不绑定到特定图层。加载 DMF 文件时会自动读取 features


六、直接操作内存模型

dmf.layers 返回图层列表,可直接修改每个图层上的实体:

# 在现有图层末尾追加实体
layer = dmf["L0"]
layer.insert_point(np.array([0.0, 0.0, 0.0]), name="追加点")

# 遍历所有实体
for layer in dmf:
    for entity in layer.entities:
        print(type(entity).__name__, entity.name, entity.geometry)

七、异常处理

from dimine_python_sdk.lib.io import DmfError, DmfLoadError, DmfSaveError

try:
    dmf = DmfFile("not_exist.dmf")
except DmfLoadError as e:
    print(f"加载失败: {e}")

try:
    dmf = DmfFile()  # 未绑定文件路径
    dmf.save()       # 未指定保存路径
except DmfSaveError as e:
    print(f"保存失败: {e}")

异常层次: - DmfError(RuntimeError) — 基类 - DmfLoadError(DmfError) — 加载失败(文件不存在、格式错误) - DmfSaveError(DmfError) — 保存失败 - DmfInsertError(DmfError) — 实体插入参数校验失败 - DmfParseError(DmfError) — 单个实体/图层解析失败


参考链接