DMF 文件本地处理示例
以下示例展示如何使用 dimine_python_sdk.lib.file 在不启动 Dimine GUI 的情况下读取、遍历和编辑本地 .dmf 文件。
前置条件
- 已安装
dimine-python-sdk - 已设置
DIMINE_HOME环境变量(若使用真实 C++ 扩展加载本地文件) - 测试环境中
DmPyBindInterface.pyd可用;CI 中需 mock
示例一:读取并遍历 DMF 文件
import numpy as np
from dimine_python_sdk.lib.file 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.file 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.file 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.file 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.file 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.file import DmfFile
from dimine_python_sdk.lib.file._adapter 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.file - 异常定义:
dimine_python_sdk.lib.file._adapter - 实体类型:
dimine_python_sdk.models.types