mdtopx
El paquete raíz contiene el motor de cálculo de MDTopX: los tipos geométricos, la escena que intercambian todos los formatos y los algoritmos. Es el mismo motor que usa MDTopX por dentro.
import mdtopx
Los algoritmos se documentan por áreas:
| Página | Contenido |
|---|---|
| Triangulación y volúmenes | triangulate, tetrahedralize, surface_3d, cut_fill_tin. |
| Modelos digitales de elevaciones | Grid, sombreado, pendientes, orientaciones, tintas hipsométricas y vectores de pendiente. |
| Nubes de puntos | PointCloud, filtrado por rejilla, ajuste de planos, troceado y filtrado de archivos. |
| Cubicación de acopios | Clasificación de suelo y techo, paredes y cubicación por zonas. |
Tipos geométricos
| Tipo | Contenido |
|---|---|
Point3 |
Punto 3D: x, y, z (coordenadas terreno, double). Se construye con Point3(x, y, z) o Point3((x, y, z)). |
Triangle |
Triángulo: índices a, b, c en la lista de vértices de su malla (base 0) y constraint1, constraint2, constraint3: código de la línea de ruptura de los lados a-b, b-c y c-a (-1 = ninguna). |
Mesh |
Malla triangulada: vertices (lista de Point3) y triangles (lista de Triangle). |
LidarPoint |
Punto de una nube, con sus atributos LiDAR. Ver Nubes de puntos. |
PointCloud |
Nube de puntos. Ver Nubes de puntos. |
Grid |
Rejilla regular de cotas. Ver Modelos digitales de elevaciones. |
Donde se espera un Point3 también se puede pasar una tupla (x, y, z) o (x, y) (con z = 0).
Las listas (
vertices,triangles,points, y también las de la escena:polylines,meshes…) se copian cada vez que se accede a ellas desde Python. Esto tiene dos consecuencias:
- En bucles, guárdalas antes en una variable:
vertices = malla.verticesy luegofor v in vertices: ....- Para modificarlas no uses
appendni asignes elementos sueltos (escena.polylines.append(l)cambia una copia y la escena no se entera). Construye la lista y asígnala:escena.polylines = [linea1, linea2], oescena.polylines = escena.polylines + [linea].
La escena
Una Scene es el contenedor que leen y escriben todos los formatos de mdtopx.io.
Cada formato usa las listas que le corresponden:
| Propiedad | Contenido | Tipo de cada elemento |
|---|---|---|
points |
Puntos sueltos | PointEntity (p, layer, id, attributes) |
polylines |
Líneas y polígonos | Polyline (vertices, closed, layer_code, digi_attributes, perimeter, area…) |
texts |
Textos | TextEntity (pos, text, height, rotation, justification, layer_code…) |
clouds |
Nubes de puntos | CloudEntity (cloud, is_lidar, layer, id) |
meshes |
Mallas trianguladas | MeshEntity (mesh, id, layer_code, layer) |
grids |
Rejillas de cotas | GridEntity (grid) |
images |
Imágenes en color | ImageEntity (width, height, channels, data, georreferencia…) |
layers |
Capas o códigos | Layer (name, code) |
srs |
Sistema de referencia en WKT, si el formato lo guarda | str |
is_empty() indica si la escena no tiene ningún contenido.
import mdtopx
from mdtopx.io.vector import dxf
linea = mdtopx.Polyline()
linea.vertices = [(0, 0, 10), (10, 0, 12), (10, 10, 11)]
linea.layer_code = "EJE"
escena = mdtopx.Scene()
escena.polylines = [linea] # asignar la lista: append no modificaría la escena
dxf.write(r"C:\datos\eje.dxf", escena)
Estado y progreso
Las funciones del motor devuelven un Status, solo o dentro de un objeto resultado:
| Valor | Significado |
|---|---|
Ok |
Correcto. |
NoPoints |
No hay datos suficientes (por ejemplo, menos de 3 puntos para triangular). |
InvalidData |
Datos o parámetros no válidos. |
TriangulationError |
La triangulación ha fallado. |
Cancelled |
El usuario ha cancelado desde la función de progreso. |
Las funciones que pueden tardar aceptan el argumento progress: una función que recibe la fracción
completada (de 0.0 a 1.0) y devuelve True para continuar o False para cancelar.
def progreso(fraccion):
print(f"\r{fraccion:.0%}", end="")
return True
resultado = mdtopx.triangulate(puntos, progress=progreso)