DMB 块段模型
dimine_python_sdk.lib.io 提供 DmbFile 类用于读取 Dimine 块段模型文件(.dmb)。DMB 文件在 Dimine 中用于存储块段模型的元数据(原点、尺寸、旋转角度、层级信息、字段定义)及各块段的属性数据,支持按字段遍历和转换为 pandas.DataFrame。
一、加载与关闭
从文件加载
from dimine_python_sdk.lib.io import DmbFile
dmb = DmbFile("model.dmb")
print(dmb.info)
关闭
dmb.close()
上下文管理器(推荐)
from dimine_python_sdk.lib.io import dmb_conn
with dmb_conn("model.dmb") as dmb:
print(dmb.origin)
print(dmb.total_block_count)
二、模型元数据
dmb = DmbFile("model.dmb")
# 模型原点
dmb.origin # np.ndarray([1000.0, 2000.0, 0.0]) — 形状 (3,)
# 模型总尺寸
dmb.xyz_length # [200.0, 150.0, 80.0] — X/Y/Z 方向总长度
# 旋转角度
dmb.rotation # [0.0, 0.0, 15.0] — [rot_x, rot_y, rot_z]
# 文件名称
dmb.name # "model" — 不含扩展名
三、层级信息
块段模型采用八叉树结构,max_level 为最大精度层级,min_size 为该层级对应的最小块段尺寸。
dmb.max_level # 5 — 最大精度层级
dmb.min_size # [1.0, 1.0, 1.0] — 最大精度层级下的块段尺寸
# 查询指定层级的块段尺寸
dmb.get_level_size(0) # [32.0, 32.0, 32.0] — 最粗粒度
dmb.get_level_size(3) # [4.0, 4.0, 4.0]
# 获取全部层级的块段尺寸对照表
dmb.level_size_map()
# {0: [32.0, 32.0, 32.0],
# 1: [16.0, 16.0, 16.0],
# 2: [8.0, 8.0, 8.0],
# 3: [4.0, 4.0, 4.0],
# 4: [2.0, 2.0, 2.0],
# 5: [1.0, 1.0, 1.0]}
层级尺寸计算公式:
size_at_level(L) = min_size * 2^(max_level - L)
四、字段定义
dmb.field_definitions
# [{'name': '品位', 'type': 'double'},
# {'name': '岩石类型', 'type': 'string'},
# {'name': '比重', 'type': 'double'}]
每个字段包含 name(字段名)和 type(数据类型)。
五、块段数据
遍历块段
dmb.total_block_count # 50000 — 块段总数量
# 遍历所有块段(返回所有字段)
for block in dmb.iter_blocks():
print(block) # {'品位': 0.85, '岩石类型': '花岗岩', '比重': 2.7}
# 指定字段名(逗号分隔,减少读取开销)
for block in dmb.iter_blocks("品位,岩石类型"):
print(block) # {'品位': 0.85, '岩石类型': '花岗岩'}
每个块段以 dict 形式返回,key 为字段名,value 为字段值。
转换为 DataFrame
df = dmb.to_dataframe()
print(df.columns.tolist()) # ['品位', '岩石类型', '比重']
print(df.shape) # (50000, 3)
print(df.head())
需要安装
pandas(uv add pandas)。to_dataframe()会先通过iter_blocks()收集全部数据再构建 DataFrame,数据量大时建议按需过滤或分批处理。
六、文件摘要
dmb.info
# {
# 'file': 'model.dmb',
# 'name': 'model',
# 'origin': [1000.0, 2000.0, 0.0],
# 'xyz_length': [200.0, 150.0, 80.0],
# 'max_level': 5,
# 'min_size': [1.0, 1.0, 1.0],
# 'rotation': [0.0, 0.0, 15.0],
# 'field_definitions': [{'name': '品位', 'type': 'double'}, ...],
# 'total_block_count': 50000,
# 'level_size_map': {0: [...], 1: [...], ...},
# }
七、异常处理
from dimine_python_sdk.lib.io import DmbError, DmbLoadError
try:
dmb = DmbFile("not_exist.dmb")
except DmbLoadError as e:
print(f"加载失败: {e}")
try:
dmb = DmbFile()
dmb.origin # 未加载文件
except DmbError as e:
print(f"操作失败: {e}")
异常层次:
- DmbError(RuntimeError) — 基类
- DmbLoadError(DmbError) — 加载失败
参考链接
- API 参考:dmb_file
- 储量估算(块段模型估值流程)