数据获取
主要用于从数采软件场景内获取模型对象、属性、图层、文件等信息
1. 获取文件列表
获取数采软件场景下的已经打开的文件列表,包含文件id、文件名
import asyncio
from dimine_python_sdk.conn import open_client
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
for file in files:
print(file.name)
print(file.id)
if __name__ == '__main__':
asyncio.run(main())
2. 获取图层信息
获取文件下的图层信息,包含图层id、图层名称、图层类型
import asyncio
from dimine_python_sdk.conn import open_client
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
# 获取最后一个文件下的图层
layers = await client.get_layers(file_id=files[len(files)-1].id)
for layer in layers:
print(layer.id)
print(layer.name)
print(layer.layer_type)
if __name__ == '__main__':
asyncio.run(main())
3. 获取特定图层的模型
通过指定图层ID来获取特定图层下的模型:
import asyncio
from dimine_python_sdk.conn import open_client
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
# 获取文件的所有图层
layers = await client.get_layers(file_id=files[0].id)
# 获取第一个图层的所有模型
if len(layers) > 0:
geometries = await client.get_geometry(
file_id=files[0].id,
layer_id=layers[0].id,
entity_types=["point", "line", "shell"]
)
print(f"图层 '{layers[0].name}' 包含 {len(geometries)} 个模型")
for geometry in geometries:
print(f" - {geometry.type}: {geometry.geometry}")
if __name__ == '__main__':
asyncio.run(main())
4. 获取模型对象
获取模型对象,包含模型对象id、模型对象类型、模型对象颜色、所属要素、所属图层、属性数组、模型对象几何信息
import asyncio
from dimine_python_sdk.conn import open_client
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
# 获取最后一个文件下的图层
layers = await client.get_layers(file_id=files[len(files)-1].id)
# 获取最后图层下的模型对象数组
geometries = await client.get_geometry(file_id=files[len(files)-1].id, layer_id=layers[0].id, ["point"])
for geometry in geometries:
print(geometry.id) # 模型对象id
print(geometry.type) # 模型对象类型
print(geometry.color) # 展示颜色
print(geometry.feature) # 所属要素
print(geometry.layer) # 所属图层
print(geometry.properties) # 属性数组
print(geometry.geometry) # 模型对象几何信息:点: np.ndarray(3,), 线: np.ndarray(N,3), 实体: TINGeometry
if __name__ == '__main__':
asyncio.run(main())
5. 获取特定类型的模型
可以通过entity_types参数过滤获取特定类型的模型:
import asyncio
from dimine_python_sdk.conn import open_client
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
layers = await client.get_layers(file_id=files[0].id)
# 获取文件下所有图层中的所有类型的模型(坐标不走 websocket,见第 9 节)
geometries = await client.get_geometry(file_id=files[0].id, layer_id=layers[0].id,
entity_types=["point", "line"])
for geometry in geometries:
print(f"类型: {geometry.type}")
if __name__ == '__main__':
asyncio.run(main())
6. 获取特定要素的模型
可以通过features参数过滤获取特定要素关联的模型:
import asyncio
from dimine_python_sdk.conn import open_client
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
layers = await client.get_layers(file_id=files[0].id)
features = await client.get_features(files[0].id)
# 获取特定要素的模型
geometries = await client.get_geometry(
file_id=files[0].id,
layer_id=layers[0].id,
entity_types=["point", "line", "shell"],
features=[features[0].name] # 只获取第一个要素的模型
)
for geometry in geometries:
print(f"要素: {geometry.feature}, 类型: {geometry.type}")
if __name__ == '__main__':
asyncio.run(main())
7. 获取要素信息
获取文件中的要素定义,包括要素名称和属性定义:
import asyncio
from dimine_python_sdk.conn import open_client
from dimine_python_sdk.models.types import FeatureInfo, PropertyInfo
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
features = await client.get_features(files[0].id)
for feature in features:
print(f"要素名称: {feature.name}")
print("属性定义:")
for prop in feature.properties:
print(f" - {prop.name}: {prop.type}")
if __name__ == '__main__':
asyncio.run(main())
8. 获取实体(Shell)模型信息
实体模型使用三角网(TIN)表示,包含顶点和面片信息:
import asyncio
from dimine_python_sdk.conn import open_client
from dimine_python_sdk.models.types import Shell
async def main():
async with open_client() as client:
# 获取文件列表
files = await client.get_files()
layers = await client.get_layers(file_id=files[0].id)
# 获取所有实体模型(坐标见第 9 节:先拿 geometry_file 再读文件)
geometries = await client.get_geometry(
file_id=files[0].id,
layer_id=layers[0].id,
entity_types=["shell"]
)
for geometry in geometries:
if isinstance(geometry, Shell):
print(f"实体ID: {geometry.id}")
print(f"顶点数: {geometry.geometry.points.shape[0]}")
print(f"面片数: {geometry.geometry.faces.shape[0]}")
print(f"顶点坐标: {geometry.geometry.points}")
print(f"面片索引: {geometry.geometry.faces}")
print(f"颜色: {geometry.color}")
if __name__ == '__main__':
asyncio.run(main())
9. 获取坐标数据(一律走文件)
坐标数据量可能很大,全走 websocket 会导致通信卡死、请求超时。因此 SDK 固定向 Dimine 下发 with_geometry=false,由 Dimine 把坐标落盘成一个临时 dmf 文件,响应只给出 geometry_file 路径。坐标一律从该文件读取,不走 websocket。
因此坐标的获取统一是两步:
# ① 拿坐标文件路径 + 实体元信息(不读文件)
result = await client.get_geometry_file(file_id=files[0].id, layer_id=layers[0].id)
print(result.geometry_file) # 坐标所在的 dmf 路径
for entity in result.entities:
print(entity.id, entity.type) # 此时 entity.geometry 是空的
拿到文件后,按自己的需要读取。SDK 的 get_geometry() 只返回基础信息,不再内联坐标:
# 要坐标就自己读文件;也可以用 _fill_geometry_from_dmf 让 SDK 按 id 回填
client._fill_geometry_from_dmf(result)
for entity in result.entities:
print(entity.id, entity.geometry) # 坐标已按 id 从文件回填
!!! note "落盘文件的生命周期" 该文件由 Dimine 端管理,可能被后续请求覆盖或清理,需要时应在本次会话内读取完毕,不要长期持有该路径。
!!! note "按 id 匹配,别按顺序"
落盘文件里放的是整个图层的实体,可能比本次响应命中的更多(例如按 entity_types=["polyline"] 过滤时,文件里仍会有 shell)。因此取坐标必须按实体 id 匹配,不能按返回顺序对齐。
10. 获取当前选择对象
获取用户在数采软件当前场景中手动选中的对象列表,支持分页:
import asyncio
from dimine_python_sdk.conn import open_client
async def main():
async with open_client() as client:
# 获取当前选中的对象(第1页,每页100条)
result = await client.get_selected(page_size=100, page_num=1)
print(f"总共选中: {result.total_count} 个对象")
print(f"当前页: {result.page_num}, 每页: {result.page_size}")
for item in result.ids:
print(f" - ID: {item.id}")
print(f" 文件: {item.file}")
print(f" 图层: {item.layer}")
print(f" 类型: {item.entity_type}")
print(f" 要素: {item.feature}")
if __name__ == '__main__':
asyncio.run(main())
参数说明:
- page_size: 每页返回数量,默认 100
- page_num: 页码,从 1 开始,默认 1
返回结果:
- ids: 选中对象列表,每个对象包含 id、file、layer、entity_type、feature
- total_count: 选中对象总数
- page_size: 每页大小
- page_num: 当前页码