ICloseable
Espacio de nombres: Digi21.DigiNG.Entities
Ensamblado: Digi21.DigiNG
Entidad que puede formar un recinto cerrado: indica si está cerrada, calcula un punto en su interior y la posición de una coordenada respecto al recinto.
public interface ICloseable
Tipos que la implementan: ReadOnlyLine (y Line) y ReadOnlyPolygon (y Polygon).
Un polígono siempre se considera cerrado. Una línea es un recinto si su primer y su último vértice coinciden en X e Y; InteriorPoint y AnalyzePointPosition lanzan InvalidOperationException con una línea que no lo cumple.
Propiedades
| Miembro | Descripción |
|---|---|
bool Closed { get; } |
true si el primer y el último vértice coinciden en X e Y. |
bool ClosedXYZ { get; } |
true si el primer y el último vértice coinciden en X, Y y Z. |
Point3D InteriorPoint { get; } |
Coordenada en el interior del recinto y, en un polígono, fuera de sus huecos. |
Métodos
| Miembro | Descripción |
|---|---|
PointPosition AnalyzePointPosition(Point3D coordinate) |
Indica si coordinate está fuera, dentro o sobre el borde del recinto, en el plano XY. |
Ejemplo
Este programa crea una parcela con un patio interior como hueco, consulta la posición de tres coordenadas y coloca un rótulo en un punto interior de la parcela fuera del patio:
using Digi21.DigiNG.Entities;
using Digi21.DigiNG.IO.BinDouble;
using Digi21.Math;
if (args.Length != 1)
{
Console.WriteLine("Uso: PosicionPunto <salida.bind>");
return 1;
}
using var archivo = new BinDouble(args[0]);
var parcela = new Polygon(new Code("050101"));
parcela.Points.Add(new[]
{
new Point3D(0.0, 0.0, 0.0),
new Point3D(100.0, 0.0, 0.0),
new Point3D(100.0, 100.0, 0.0),
new Point3D(0.0, 100.0, 0.0),
new Point3D(0.0, 0.0, 0.0),
});
var patio = new Line(new Code("050101"));
patio.Points.Add(new[]
{
new Point3D(40.0, 40.0, 0.0),
new Point3D(60.0, 40.0, 0.0),
new Point3D(60.0, 60.0, 0.0),
new Point3D(40.0, 60.0, 0.0),
new Point3D(40.0, 40.0, 0.0),
});
parcela.Holes.Add(patio);
ICloseable recinto = parcela;
Console.WriteLine($"Cerrado: {recinto.Closed}, cerrado en XYZ: {recinto.ClosedXYZ}");
foreach (var consulta in new[] { new Point3D(10.0, 10.0, 0.0), new Point3D(50.0, 50.0, 0.0), new Point3D(100.0, 50.0, 0.0) })
{
PointPosition posición = recinto.AnalyzePointPosition(consulta);
Console.WriteLine($"{consulta}: {posición}");
}
// Punto en el interior del recinto y fuera del hueco, por ejemplo para un rótulo.
var rótulo = new Text(new Code("080101")) { Txt = "Parcela", Coordinate = recinto.InteriorPoint, TextHeight = 2.0 };
archivo.Add(parcela);
archivo.Add(rótulo);
return 0;