Files
GroundOrganizer/Grapfics/CanvasDrafter.cs
2026-01-06 02:07:18 +03:00

232 lines
8.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using AForge.Math.Geometry;
using AForge;
using netDxf.Entities;
using Point = System.Windows.Point;
namespace GroundOrganizer
{
public partial class CanvasDrafter
{
//const double WXMIN = -300;
//const double WXMAX = 300;
//const double WYMIN = -300;
//const double WYMAX = 300;
const double DMARGIN = 0;
static Matrix WtoDMatrix;
static Matrix DtoWMatrix;
static public void DrawPolygonsFromDxfLwPolyline(IEnumerable<LwPolyline> dxfEntitys,Canvas canvas, double h)
{
double dxmin = DMARGIN;
double dymin = DMARGIN;
double dymax = h - DMARGIN;
double wxmin;
double wxmax;
double wymin;
double wymax;
List<LwPolylineVertex> dxfVertices = new List<LwPolylineVertex>();
foreach (LwPolyline item in dxfEntitys)
{
dxfVertices.AddRange(item.Vertexes);
}
IOrderedEnumerable<LwPolylineVertex> selected = from x in dxfVertices // определяем каждый объект как x
orderby x.Position.X // упорядочиваем по возрастанию
select x; // выбираем объект
wxmin = selected.First().Position.X;
wxmax = selected.Last().Position.X;
selected = from y in dxfVertices orderby y.Position.Y select y;
wymin = selected.First().Position.Y;
wymax = selected.Last().Position.Y;
double w = (wxmax - wxmin) / (wymax - wymin)*h;
double dxmax = w - DMARGIN;
PrepareTransformations(wxmin, wxmax, wymin, wymax, dxmin, dxmax, dymax, dymin);
Canvas da = canvas;
da.Width = w;
da.Height = h;
Polygon contour;
foreach (LwPolyline item in dxfEntitys)
{
dxfVertices = item.Vertexes;
Point pt;
contour = new Polygon
{
Points = new PointCollection(),
Stroke = Brushes.Black,
StrokeThickness = 2,
Fill = Brushes.White
};
foreach (LwPolylineVertex v in dxfVertices)
{
pt = WtoDMatrix.Transform(new Point(v.Position.X, v.Position.Y));
contour.Points.Add(pt);
}
da.Children.Add(contour);
//da.Children.Add(new Rectangle() { Width = 80, Height = 80,Stroke=Brushes.Black,StrokeThickness=1,Fill=Brushes.White });
}
}
static public void DrawFoundations(ObservableCollection<Foundation> founds, Canvas canvas, double h)
{
double dxmin = DMARGIN;
double dymin = DMARGIN;
double dymax = h - DMARGIN;
double wxmin;
double wxmax;
double wymin;
double wymax;
List<Geo.Point3d> Vertices = new List<Geo.Point3d>();
foreach (Foundation item in founds)
{
if (item.Contour != null) Vertices.AddRange(item.Contour.Vertices);
}
if (Vertices.Count < 4) return;
IOrderedEnumerable<Geo.Point3d> selected = from x in Vertices // определяем каждый объект как x
orderby x.X // упорядочиваем по возрастанию
select x; // выбираем объект
wxmin = selected.First().X;
wxmax = selected.Last().X;
selected = from y in Vertices orderby y.Y select y;
wymin = selected.First().Y;
wymax = selected.Last().Y;
double w = (wxmax - wxmin) / (wymax - wymin) * h;
double dxmax = w - DMARGIN;
PrepareTransformations(wxmin, wxmax, wymin, wymax, dxmin, dxmax, dymax, dymin);
Canvas da = canvas;
da.Width = w;
da.Height = h;
Polygon contour;
foreach (Foundation item in founds)
{
if (item.Contour == null) continue;
ToolTip toolTip = new ToolTip();
StackPanel toolTipPanel = new StackPanel();
DataGrid props = new DataGrid() { ItemsSource = item.SmallProps, FontSize = 11 };
//DataGrid results = new DataGrid() { ItemsSource = item.SmallResults};
toolTipPanel.Children.Add(props);
//toolTipPanel.Children.Add(results);
toolTip.Content = toolTipPanel;
Vertices = item.Contour.Vertices;
Point pt;
contour = new Polygon
{
Points = new PointCollection(),
Stroke = Brushes.Black,
StrokeThickness = 2,
Fill = Brushes.White
};
ToolTipService.SetToolTip(contour, toolTip);
ToolTipService.SetShowDuration(contour, int.MaxValue);
foreach (Geo.Point3d v in Vertices)
{
pt = WtoDMatrix.Transform(new Point(v.X, v.Y));
contour.Points.Add(pt);
}
da.Children.Add(contour);
//da.Children.Add(new Rectangle() { Width = 80, Height = 80,Stroke=Brushes.Black,StrokeThickness=1,Fill=Brushes.White });
}
}
static public void DrawFoundationsNumbers(ObservableCollection<Foundation> founds, Canvas canvas)
{
double dxmin = DMARGIN;
double dymin = DMARGIN;
double dymax = canvas.ActualHeight - DMARGIN;
double dxmax = canvas.ActualWidth - DMARGIN;
double wxmin;
double wxmax;
double wymin;
double wymax;
List<Geo.Point3d> Vertices = new List<Geo.Point3d>();
foreach (Foundation item in founds)
{
if (item.Contour != null) Vertices.AddRange(item.Contour.Vertices);
}
if (Vertices.Count < 4) return;
IOrderedEnumerable<Geo.Point3d> selected = from x in Vertices // определяем каждый объект как x
orderby x.X // упорядочиваем по возрастанию
select x; // выбираем объект
wxmin = selected.First().X;
wxmax = selected.Last().X;
selected = from y in Vertices orderby y.Y select y;
wymin = selected.First().Y;
wymax = selected.Last().Y;
PrepareTransformations(wxmin, wxmax, wymin, wymax, dxmin, dxmax, dymax, dymin);
Canvas da = canvas;
Label label;
foreach (Foundation item in founds)
{
Point pt = WtoDMatrix.Transform(new Point(item.X, item.Y));
label = new Label
{
Content = item.Number.ToString(),
VerticalContentAlignment = VerticalAlignment.Center,
HorizontalContentAlignment = HorizontalAlignment.Center
};
Canvas.SetTop(label, pt.Y);
Canvas.SetLeft(label, pt.X);
da.Children.Add(label);
//da.Children.Add(new Rectangle() { Width = 80, Height = 80,Stroke=Brushes.Black,StrokeThickness=1,Fill=Brushes.White });
}
}
static void PrepareTransformations(double wxmin, double wxmax, double wymin, double wymax, double dxmin, double dxmax, double dymin, double dymax)
{
// Make WtoD.
WtoDMatrix = Matrix.Identity;
WtoDMatrix.Translate(-wxmin, -wymin);
double xscale = (dxmax - dxmin) / (wxmax - wxmin);
double yscale = (dymax - dymin) / (wymax - wymin);
WtoDMatrix.Scale(xscale, yscale);
WtoDMatrix.Translate(dxmin, dymin);
// Make DtoW.
DtoWMatrix = WtoDMatrix;
DtoWMatrix.Invert();
}
}
}