Skip to content

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())

需要安装 pandasuv 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) — 加载失败


参考链接