mdtopx.io.malla
Formatos de mallas trianguladas (TIN). Leen a scene.meshes: una MeshEntity por malla, con la
malla en mesh (vertices y triangles). Siguen la
interfaz común (info, read, write).
| Módulo | Formato | Lee | Escribe | Opciones |
|---|---|---|---|---|
mdt |
MDT nativo de MDTopX (.mdt) |
✔ | — | — |
stl |
Estereolitografía (.stl) |
✔ | ✔ | write: ascii (False) |
MDT nativo de MDTopX
El módulo mdt lee los modelos digitales del terreno guardados por MDTopX (archivos .mdt, de
cualquier versión: de la 3, la de MDTop, a la 8, la actual). Solo lee la geometría:
Contenido del .mdt |
En la escena |
|---|---|
| Triangulación del terreno | scene.meshes[0] (id = 0) |
| Objetos (edificios, árboles, puentes…), cada uno con su triangulación | scene.meshes[1:] (id = 1, 2…), en el orden del archivo |
| Código de los triángulos de cada malla | layer_code de la malla |
| Códigos de las líneas de ruptura | scene.layers (uno por código, sin repetir) |
| Lados de ruptura de cada triángulo | constraint1, constraint2, constraint3 del Triangle: índice en scene.layers del código de ruptura de los lados a-b, b-c y c-a (-1 = ninguno) |
| Límites del modelo | scene.polylines |
Los índices de los triángulos (a, b, c) empiezan en 0 y se refieren a los vertices de su
propia malla. Los triángulos borrados no se cargan.
No se leen el sistema de referencia, la configuración de las curvas de nivel, los atributos LiDAR de
los puntos, las texturas ni la base de datos asociada (.dbf).
Este formato no declara extensión, así que un
IoHostno lo encuentra: léelo siempre conmdt.read().
Ejemplo
from collections import Counter
from mdtopx.io.malla import mdt
escena = mdt.read(r"C:\datos\Triangulación de CAMPUS_SUR.mdt")
print("Mallas:", len(escena.meshes), "| límites:", len(escena.polylines))
print("Objetos por código:", Counter(m.layer_code for m in escena.meshes[1:]))
codigos = [capa.name for capa in escena.layers]
print("Códigos de ruptura:", codigos)
# Terreno. Las listas se copian en cada acceso: se guardan una vez en variables.
terreno = escena.meshes[0]
vertices = terreno.mesh.vertices
triangulos = terreno.mesh.triangles
print(f"Terreno: {len(vertices)} puntos, {len(triangulos)} triángulos")
zs = [v.z for v in vertices]
print(f"Cotas: {min(zs):.3f} a {max(zs):.3f}")
# Lados de ruptura por código
rupturas = Counter()
for t in triangulos:
for r in (t.constraint1, t.constraint2, t.constraint3):
if r >= 0:
rupturas[codigos[r]] += 1
print("Lados de ruptura:", dict(rupturas))
# Límites del modelo
for limite in escena.polylines[:3]:
print(f"Límite {limite.layer_code}: {len(limite.vertices)} vértices, "
f"cerrado={limite.closed}, perímetro={limite.perimeter:.2f} m")
Para ver el avance de la lectura de un archivo grande, pasa una función en progress:
escena = mdt.read(ruta, progress=lambda f: print(f"\r{f:.0%}", end="") or True)
STL
El módulo stl lee archivos STL binarios o ASCII (lo detecta solo) y los escribe en binario o, con
ascii=True, en ASCII. Al escribir se vuelcan todas las mallas de la escena.
Guardar el terreno de un .mdt como STL:
import mdtopx
from mdtopx.io.malla import mdt, stl
escena = mdt.read(r"C:\datos\Terreno.mdt")
solo_terreno = mdtopx.Scene()
solo_terreno.meshes = [escena.meshes[0]]
stl.write(r"C:\datos\Terreno.stl", solo_terreno)