Skip to content

bridge

lib C++ 包装类型与 models Pydantic 模型之间的桥接层

所有转换函数均使用函数内 lazy import,避免 libmodels 之间产生导入期循环依赖。

dmdbline_to_model(line)

DmDbLine 转换为 models.Line

Source code in dimine_python_sdk\lib\bridge.py
56
57
58
59
60
61
62
63
64
def dmdbline_to_model(line: "DmDbLine"):
    """将 ``DmDbLine`` 转换为 ``models.Line``"""
    from dimine_python_sdk.models import Line

    import numpy as np

    points = line.get_graph_data()
    arr = np.array([[p.x, p.y, p.z] for p in points], dtype=np.float32)
    return Line(geometry=arr)

dmdbpolyline_to_model(polyline)

DmDbPolyline 转换为 models.Line

Source code in dimine_python_sdk\lib\bridge.py
67
68
69
70
71
72
73
74
75
def dmdbpolyline_to_model(polyline: "DmDbPolyline"):
    """将 ``DmDbPolyline`` 转换为 ``models.Line``"""
    from dimine_python_sdk.models import Line

    import numpy as np

    points = polyline.get_graph_data()
    arr = np.array([[p.x, p.y, p.z] for p in points], dtype=np.float32)
    return Line(geometry=arr)

dmdpoint_to_model(pt)

DmDPoint 转换为 models.Point

Source code in dimine_python_sdk\lib\bridge.py
33
34
35
36
37
38
39
40
41
def dmdpoint_to_model(pt: "DmDPoint"):
    """将 ``DmDPoint`` 转换为 ``models.Point``"""
    from dimine_python_sdk.models import Point

    import numpy as np

    return Point(
        geometry=np.array([pt.x, pt.y, pt.z], dtype=np.float32),
    )

dmpolydata_to_tingeometry(polydata)

DmPolyData 转换为 models.TINGeometry

通过 DmDbLayer.insert_shell 生成 DmDbShell,再调用 parse_to_json 提取顶点坐标与三角面片索引。

Source code in dimine_python_sdk\lib\bridge.py
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
def dmpolydata_to_tingeometry(polydata):
    """
    将 ``DmPolyData`` 转换为 ``models.TINGeometry``

    通过 ``DmDbLayer.insert_shell`` 生成 ``DmDbShell``,再调用 ``parse_to_json``
    提取顶点坐标与三角面片索引。
    """
    from dimine_python_sdk.lib.db.database import DmDbLayer
    from dimine_python_sdk.models import TINGeometry

    import numpy as np

    layer = DmDbLayer()
    shell = layer.insert_shell(polydata)
    data = shell.parse_to_json()

    # points 为嵌套列表 [[x1, y1, z1], [x2, y2, z2], ...]
    raw_points = data["points"]
    points = np.array(raw_points, dtype=np.float32)

    # indexs 为嵌套列表 [[i1, i2, i3], ...]
    raw_faces = data["indexs"]
    faces = np.array(raw_faces, dtype=np.int32)

    return TINGeometry(points=points, faces=faces)

model_to_dmdpoint(pt)

models.Point 转换为 DmDPoint

Source code in dimine_python_sdk\lib\bridge.py
44
45
46
47
48
49
def model_to_dmdpoint(pt):
    """将 ``models.Point`` 转换为 ``DmDPoint``"""
    from dimine_python_sdk.lib.types.point import DmDPoint

    arr = pt.geometry
    return DmDPoint(float(arr[0]), float(arr[1]), float(arr[2]))

tingeometry_to_dmpolydata(tin)

models.TINGeometry 转换为 DmPolyData

遍历三角网的顶点和三角面片,构造对应的 DmPolyData 对象。

Source code in dimine_python_sdk\lib\bridge.py
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
def tingeometry_to_dmpolydata(tin: "TINGeometry"):
    """
    将 ``models.TINGeometry`` 转换为 ``DmPolyData``

    遍历三角网的顶点和三角面片,构造对应的 ``DmPolyData`` 对象。
    """
    from dimine_python_sdk.lib.types.entity import DmPolyData
    from dimine_python_sdk.lib.types.point import DmDPoint

    import numpy as np

    poly = DmPolyData()
    point_ids = []
    for pt in tin.points:
        point_ids.append(poly.insert_unique_point(DmDPoint(float(pt[0]), float(pt[1]), float(pt[2]))))
    for face in tin.faces:
        poly.insert_next_poly_cell([int(point_ids[i]) for i in face])
    return poly