Geometry
Módulo: digi21.base
Clase base de todas las geometrías. Define las propiedades, los métodos y el acceso a coordenadas comunes a Point, Text, Line, Polygon y Complex. No se construye directamente.
Coordenadas
Toda geometría se comporta como una secuencia de vértices (x, y, z):
| Operación | Descripción |
|---|---|
len(geometry) |
Número de vértices. |
geometry[i] |
Vértice i como tupla (x, y, z). |
for v in geometry: |
Recorre los vértices como tuplas (x, y, z). |
Propiedades
| Propiedad | Tipo | L/E | Descripción |
|---|---|---|---|
codes |
list[FeatureCode] |
L/E | Lista de códigos de la geometría. |
attributes |
dict |
L | Diccionario {str: valor} con los atributos de base de datos. |
color |
int |
L/E | Color. |
weight |
int |
L/E | Grosor. |
fill_color |
int |
L/E | Color de relleno. |
virtual_ |
bool |
L/E | Indica si la geometría es virtual. |
deleted |
bool |
L | Verdadero si está marcada como eliminada. |
min |
tuple |
L | Coordenadas mínimas (x, y, z) de la caja envolvente. |
max |
tuple |
L | Coordenadas máximas (x, y, z) de la caja envolvente. |
first_vertex |
tuple |
L | Primer vértice (x, y, z). |
last_vertex |
tuple |
L | Último vértice (x, y, z). |
code_count |
int |
L | Número de códigos. |
owner |
tuple |
L | (geometría_propietaria, índice) si pertenece a un contenedor(None, 0) si no. |
Métodos
| Método | Devuelve | Descripción |
|---|---|---|
clone() |
Geometry |
Devuelve un clon de la geometría. |
compute_bounds() |
— | Recalcula las máximas y mínimas a partir de las coordenadas. |
transform(function) |
— | Aplica una función (x, y, z) -> (x, y, z) a todas las coordenadas. |
displace(delta) |
— | Desplaza la geometría el (dx, dy, dz) indicado. |
maxmin_overlaps(other) |
bool |
Verdadero si las cajas envolventes 3D solapan. |
maxmin_overlaps_2d(other) |
bool |
Verdadero si las cajas envolventes 2D (en planta) solapan. |
identical_xy(other) |
bool |
Verdadero si las dos geometrías son idénticas en planta (XY). |
nearest_vertex_segment(coordinates) |
tuple |
Vértice y segmento más cercanos: (n_vertice, dist_vertice, (x,y,z), n_segmento, dist_segmento, (x,y,z)). |
completely_inside(window) |
bool |
Verdadero si está completamente dentro de la ventana (una Line). |
completely_outside(window) |
bool |
Verdadero si está completamente fuera de la ventana (una Line). |
overlaps_window(window, inside=True) |
bool |
Verdadero si solapa con la ventana (una Line). |
has_code(name) |
bool |
Verdadero si la geometría tiene el código indicado. |
add_code(code) |
bool |
Añade un código (FeatureCode o str)devuelve True si se añadió. |
remove_code(code) |
— | Elimina el código indicado (FeatureCode o str). |
Relaciones espaciales
Métodos para consultar la relación espacial con otra geometría (estilo Shapely). Se
resuelven según el tipo concreto de las dos geometrías. En within, adjacent,
terminates_within y completely_within el argumento es el área y admite un
Polygon o una Line cerrada.
Estas relaciones se basan en los vértices y nodos compartidos, no en intersecciones calculadas. Las comparaciones se hacen en planta, sin tener en cuenta la coordenada Z. Si la combinación de tipos no soporta la relación, se lanza
TypeError.
| Método | self |
Argumento | Verdadero si… |
|---|---|---|---|
disjoint(other) |
Point/Line/Polygon | Point/Line/Polygon | Las dos geometrías son disjuntas. |
coincident(other) |
Point | Point/Line/Polygon | El punto coincide con la otra geometría. |
coincident_and_terminates(line) |
Point | Line | El punto coincide con un extremo de la línea. |
within(area) |
Point/Line/Polygon | área | La geometría está dentro del área. |
completely_within(area) |
Polygon | área | El área está completamente incluida en la otra área. |
adjacent(area) |
Line/Polygon | área | La geometría es adyacente al área. |
terminates_within(area) |
Line | área | La línea termina dentro del área. |
crosses(other) |
Line | Line/Polygon | La línea cruza la otra línea o el área. |
cross_vertices(line, stop_at_first=False) |
Line | Line | Devuelve la lista de índices de vértice en los que se cruzan. |
overlaps(other) |
Line/Polygon | Line/Polygon | Las dos geometrías se solapan. |
equals(other) |
Line/Polygon | Line/Polygon | Las dos geometrías son iguales. |
touches(other) |
Line/Polygon | Line/Polygon | Comparten algún punto (se tocan). |
endpoint_touches(other) |
Line | Line/Polygon | Un extremo de la línea toca un extremo de la otra línea/área. |
endpoint_touches_interior(line) |
Line | Line | Un extremo de la línea toca la otra línea pero no en sus extremos. |
Relaciones entre dos áreas
Cuando self es un Polygon y el argumento es un polígono o una línea
cerrada, las relaciones equals, disjoint, touches, adjacent, completely_within,
within y overlaps son excluyentes: para cada par a, b se cumple exactamente una de
estas.
| Relación | Verdadero |
|---|---|
| Iguales | a.equals(b) |
| Disjuntas | a.disjoint(b) |
| Se tocan | a.touches(b) |
| Adyacentes | a.adjacent(b) |
a completamente dentro de b |
a.completely_within(b) |
a dentro de b |
a.within(b) |
b completamente dentro de a |
b.completely_within(a), si b es un polígono |
b dentro de a |
b.within(a), si b es un polígono |
| Se solapan | a.overlaps(b) |
Para cada vértice de un área se comprueba si coincide con un vértice de la otra área (vértice común) o si está dentro o fuera de la otra área. Un vértice dentro de un hueco cuenta como fuera. Un vértice sobre un lado de la otra área que no coincide con ningún vértice suyo se ignora. El resultado no depende del vértice inicial ni del sentido de recorrido de los anillos.
| Relación | Condición |
|---|---|
| Iguales | Los anillos exteriores y los huecos tienen los mismos vértices, con cualquier vértice inicial y sentido. Los vértices repetidos consecutivos no cuentan. También son iguales si hay vértices comunes y ningún vértice de un área está dentro ni fuera de la otra (los vértices que no son comunes están sobre los lados de la otra área). |
| Disjuntas | Ningún vértice de un área está dentro de la otra y no hay vértices comunes. |
a completamente dentro de b |
Los vértices de a están dentro de b, ninguno es común y ningún vértice de b, huecos incluidos, está dentro de a. |
a dentro de b |
Ningún vértice de a está fuera de b, al menos uno es común y ningún vértice de b, huecos incluidos, está dentro de a. Si ningún vértice de a está dentro de b, se comprueba si el punto interior de a está dentro de b. |
| Adyacentes | Ningún vértice de un área está dentro de la otra, hay vértices comunes y al menos un lado común (dos vértices comunes consecutivos en los dos anillos). |
| Se tocan | Ningún vértice de un área está dentro de la otra, hay vértices comunes y ningún lado común. |
| Se solapan | Cualquier otro caso: hay vértices de un área dentro de la otra y ninguna de las dos contiene a la otra. |
Si dos áreas se cruzan sin vértices comunes en el cruce ni vértices dentro de la otra
área, el cruce pasa desapercibido y las áreas se consideran disjuntas. Si un área tiene un
anillo sin cerrar, de área nula o con una espiga (un vértice cuyos dos vecinos coinciden),
estas relaciones lanzan RuntimeError con el motivo y las coordenadas.
Ejemplo
# Desplazar todas las geometrías de un archivo 10 m en X
for geometry in drawing:
geometry.displace((10.0, 0.0, 0.0))