Controles de tipo y medidas
Estos controles de calidad de guiones.py comprueban el tipo de la geometría analizada, su área, su perímetro, sus dimensiones en planta y su distancia a otros puntos. La página Repositorio de controles de calidad en Python explica cómo se instala el archivo y cómo se asigna un control a un código.
Tipo de geometría
Estos controles no tienen parámetros propios. Devuelven un GeometryError si la geometría no es del tipo indicado. El mensaje incluye el primer código de la geometría.
| Control | Da error si la geometría no es |
|---|---|
debe_ser_area |
Un polígono o una línea cerrada en planta. |
debe_ser_complejo |
Un complejo. |
debe_ser_linea |
Una geometría de tipo Line. Un polígono da error. |
debe_ser_poligono |
Un polígono. |
debe_ser_punto |
Un punto. |
debe_ser_texto |
Un texto. |
@quality_control()
def debe_ser_punto(geometry, adding_geometry, code_index):
'Comunica un error si la geometría no es de tipo Punto'
if type(geometry) is not digi3d.Point:
return digi3d.GeometryError('Las geometrías con el código {} deben ser de tipo Punto'.format(geometry.codes[0].code))
Área y perímetro
Estos controles calculan el área y el perímetro con la calculadora geográfica de la ventana de dibujo. Los controles pasan la geometría en lugar de una lista de coordenadas, y la calculadora recorre sus vértices. Según los comentarios del código, la calculadora devuelve el resultado en metros o metros cuadrados también cuando el sistema de coordenadas de la ventana es geográfico.
| Control | Parámetros | Da error si |
|---|---|---|
debe_tener_area_igual_o_mayor |
area_minima |
La geometría es una línea o un polígono y el valor absoluto de su área es menor que area_minima. No comprueba si la línea está cerrada. |
debe_tener_perimetro_mayor_o_igual |
perimetro |
El perímetro en planta es menor que perimetro. |
debe_tener_perimetro_mayor |
perimetro |
El perímetro en planta es menor o igual que perimetro. |
if abs(digi3d.current_view().geographic_calculator.calculate_area(geometry)) < area_minima:
return digi3d.GeometryError('Las geometrías con el código {} deben tener un área mayor o igual que {}'.format(geometry.codes[0].code, area_minima))
Escribe area_minima y perimetro como números. El control compara el valor sin convertirlo: un texto
produce un TypeError.
Dimensiones en planta
debe_tener_ancho_y_alto_mayor_o_igual_valor_o_linea(ancho, alto) calcula las dimensiones de la caja
envolvente en planta de la geometría. La dimensión menor tiene que ser mayor o igual que ancho y la mayor,
mayor o igual que alto. Si no lo son, el control devuelve un GeometryError con los valores de ancho y
alto que indica que la geometría debería haberse digitalizado como una línea.
ancho_geometria = geometry.max[0] - geometry.min[0]
alto_geometria = geometry.max[1] - geometry.min[1]
if min(ancho_geometria, alto_geometria) >= ancho and max(ancho_geometria, alto_geometria) >= alto:
return
Distancia mínima entre puntos
no_puede_estar_a_menor_distancia_que(código_o_etiqueta_puntos_analizar, distancia) solo actúa si la
geometría analizada es un punto. Recorre las geometrías no borradas que tienen los códigos del parámetro,
salta la geometría analizada y calcula la distancia en planta entre el punto y cada vértice de cada
geometría con la calculadora geográfica. Las geometrías con algún vértice a menos de distancia se añaden
a la lista de error. En tiempo real el control se detiene en la primera.
Si la lista no está vacía, el control devuelve un GeometryRelationError con la lista y el mensaje «Este punto está muy cerca de estos puntos».
for otra_geometria in que_tengan_el_codigo_o_etiqueta(no_eliminadas(v), código_o_etiqueta_puntos_analizar):
if otra_geometria == geometry:
continue
if distancia_menor_que(geometry, otra_geometria, calculadora, distancia):
lista_de_puntos_cercanos.append(otra_geometria)
if adding_geometry:
break
El parámetro código_o_etiqueta_puntos_analizar admite comodines y etiquetas. Consulta
Códigos, comodines y etiquetas. El control no filtra por tipo:
una línea con esos códigos también cuenta si alguno de sus vértices está cerca.