using Microsoft.Win32; using netDxf; using netDxf.Entities; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System.Text; using System.Threading.Tasks; using TriangleNet; using TriangleNet.Geometry; using TriangleNet.Meshing; using TriangleNet.Tools; namespace GroundOrganizer { public partial class ViewModel : INotifyPropertyChanged { private RelayCommand addRedVertex; private RelayCommand addBlackVertex; private RelayCommand updateRedPlanning; private RelayCommand updateBlackPlanning; private RelayCommand renumRedVertexes; private RelayCommand renumBlackVertexes; private RelayCommand importPlanningsFromDXF; private RelayCommand importRedPlanningFromCSV; private RelayCommand importBlackPlanningFromCSV; private RelayCommand exportRedPlanningToCSV; private RelayCommand exportBlackPlanningToCSV; private RelayCommand createRedPlanningMesh; private RelayCommand createBlackPlanningMesh; int numVertex = 1; PlanningVertex selectedRedVertex; PlanningVertex selectedBlackVertex; ObservableCollection redPlanning = new ObservableCollection(); ObservableCollection blackPlanning = new ObservableCollection(); public ObservableCollection RedPlanning { get => redPlanning; set { redPlanning = value; OnPropertyChanged(); } } public ObservableCollection BlackPlanning { get => blackPlanning; set { blackPlanning = value; OnPropertyChanged(); } } public PlanningVertex SelectedRedVertex { get => selectedRedVertex; set { selectedRedVertex = value; OnPropertyChanged(); } } public PlanningVertex SelectedBlackVertex { get => selectedBlackVertex; set { selectedBlackVertex = value; OnPropertyChanged(); } } public TriangleNet.Mesh MeshRedPlanning { get; private set; } public TriangleNet.Mesh MeshBlackPlanning { get; private set; } public RelayCommand AddRedVertex { get { return addRedVertex ?? (addRedVertex = new RelayCommand(obj => { AddRedVertexToList(); })); } } public RelayCommand UpdateRedPlanning { get { return updateRedPlanning ?? (updateRedPlanning = new RelayCommand(obj => { UpdateRedVertexesInList(); })); } } public RelayCommand RenumRedVertexes { get { return renumRedVertexes ?? (renumRedVertexes = new RelayCommand(obj => { RenumberingRedVertexesInList(); })); } } public RelayCommand AddBlackVertex { get { return addBlackVertex ?? (addBlackVertex = new RelayCommand(obj => { AddBlackVertexToList(); })); } } public RelayCommand UpdateBlackPlanning { get { return updateBlackPlanning ?? (updateBlackPlanning = new RelayCommand(obj => { UpdateBlackVertexesInList(); })); } } public RelayCommand RenumBlackVertexes { get { return renumBlackVertexes ?? (renumBlackVertexes = new RelayCommand(obj => { RenumberingBlackVertexesInList(); })); } } public RelayCommand ImportPlanningsFromDXF { get { return importPlanningsFromDXF ?? (importPlanningsFromDXF = new RelayCommand(obj => { ReadPlanningsDXF(); })); } } public RelayCommand ImportRedPlanningFromCSV { get { return importRedPlanningFromCSV ?? (importRedPlanningFromCSV = new RelayCommand(obj => { ReadRedPlanningCSV(); })); } } public RelayCommand ExportRedPlanningToCSV { get { return exportRedPlanningToCSV ?? (exportRedPlanningToCSV = new RelayCommand(obj => { SaveRedPlanningInCsv(); })); } } public RelayCommand ImportBlackPlanningFromCSV { get { return importBlackPlanningFromCSV ?? (importBlackPlanningFromCSV = new RelayCommand(obj => { ReadBlackPlanningCSV(); })); } } public RelayCommand ExportBlackPlanningToCSV { get { return exportBlackPlanningToCSV ?? (exportBlackPlanningToCSV = new RelayCommand(obj => { SaveBlackPlanningInCsv(); })); } } public RelayCommand CreateRedPlanningMesh { get { return createRedPlanningMesh ?? (createRedPlanningMesh = new RelayCommand(obj => { CreateRedMesh(); })); } } public RelayCommand CreateBlackPlanningMesh { get { return createBlackPlanningMesh ?? (createBlackPlanningMesh = new RelayCommand(obj => { CreateBlackMesh(); })); } } private void ReadRedPlanningCSV() { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.*"; ofd.Filter = "Текстовый файл (*.csv)|*.csv|Все файлы (*.*)|*.*"; ofd.Title = "Заполнение таблицы"; ofd.ShowDialog(); if (ofd.FileName == null || ofd.FileName == "") return; RedPlanning.Clear(); try { using (StreamReader sr = new StreamReader(ofd.FileName, System.Text.Encoding.Default)) { string line; PlanningVertex vert; while ((line = sr.ReadLine()) != null) { vert = new PlanningVertex(); vert.StringToProps(line); RedPlanning.Add(vert); } } } catch (Exception e) { Alert(e.Message); } } internal void SaveRedPlanningInCsv() { SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "*.csv"; sfd.Filter = "Текстовый файл (*.csv)|*.csv"; sfd.Title = "Сохранение таблицы"; //sfd.AddExtension = true; sfd.OverwritePrompt = true; sfd.ShowDialog(); if (sfd.FileName == null || sfd.FileName == "") return; try { using (StreamWriter sw = new StreamWriter(sfd.FileName, false, System.Text.Encoding.Default)) { foreach (PlanningVertex item in RedPlanning) { sw.WriteLine(item.PropsToString()); } } } catch (Exception e) { Alert(e.Message); } } private void ReadBlackPlanningCSV() { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.*"; ofd.Filter = "Текстовый файл (*.csv)|*.csv|Все файлы (*.*)|*.*"; ofd.Title = "Заполнение таблицы"; ofd.ShowDialog(); if (ofd.FileName == null || ofd.FileName == "") return; BlackPlanning.Clear(); try { using (StreamReader sr = new StreamReader(ofd.FileName, System.Text.Encoding.Default)) { string line; PlanningVertex vert; while ((line = sr.ReadLine()) != null) { vert = new PlanningVertex(); vert.StringToProps(line); BlackPlanning.Add(vert); } } } catch (Exception e) { Alert(e.Message); } } internal void SaveBlackPlanningInCsv() { SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "*.csv"; sfd.Filter = "Текстовый файл (*.csv)|*.csv"; sfd.Title = "Сохранение таблицы"; //sfd.AddExtension = true; sfd.OverwritePrompt = true; sfd.ShowDialog(); if (sfd.FileName == null || sfd.FileName == "") return; try { using (StreamWriter sw = new StreamWriter(sfd.FileName, false, System.Text.Encoding.Default)) { foreach (PlanningVertex item in BlackPlanning) { sw.WriteLine(item.PropsToString()); } } } catch (Exception e) { Alert(e.Message); } } private void ReadPlanningsDXF() { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.dxf"; ofd.Filter = "Чертеж (*.dxf)|*.dxf"; ofd.Title = "Импорт чертежа"; ofd.ShowDialog(); if (ofd.FileName == null || ofd.FileName == "") return; if (selectedStructure == null) return; RedPlanning.Clear(); BlackPlanning.Clear(); DxfDocument dxfDocument = DxfDocument.Load(ofd.FileName); IEnumerable dxfTexts = dxfDocument.Texts; PlanningVertex vert; int j = 1; int k = 1; foreach (Text item in dxfTexts) { if (item.Layer.Name == "Red") { vert = new PlanningVertex { X = Math.Round(item.Position.X * 0.001, 3), Y = Math.Round(item.Position.Y * 0.001, 3), Number = j, Red = double.Parse(item.Value) }; RedPlanning.Add(vert); j++; } else if (item.Layer.Name == "Black") { vert = new PlanningVertex { X = Math.Round(item.Position.X * 0.001, 3), Y = Math.Round(item.Position.Y * 0.001, 3), Number = k, Black = double.Parse(item.Value) }; BlackPlanning.Add(vert); k++; } } } void AddRedVertexToList() { RedPlanning.Add(new PlanningVertex() { Number = numVertex }); numVertex++; //NameStructure = listStructure[0].Name; } void RenumberingRedVertexesInList() { int j = 1; foreach (PlanningVertex item in RedPlanning) { item.Number = j; j++; } numVertex = j; RedPlanning = new ObservableCollection(RedPlanning); } void UpdateRedVertexesInList() { RedPlanning = new ObservableCollection(RedPlanning); SaveDB(); } void AddBlackVertexToList() { BlackPlanning.Add(new PlanningVertex() { Number = numVertex }); numVertex++; //NameStructure = listStructure[0].Name; } void RenumberingBlackVertexesInList() { int j = 1; foreach (PlanningVertex item in BlackPlanning) { item.Number = j; j++; } numVertex = j; BlackPlanning = new ObservableCollection(BlackPlanning); } void UpdateBlackVertexesInList() { BlackPlanning = new ObservableCollection(BlackPlanning); SaveDB(); } internal void CreateRedMesh() { if (selectedStructure == null || selectedStructure.RedPlanning == null || selectedStructure.RedPlanning.Count == 0) return; Polygon polygon = new Polygon(); Vertex vrtx; int i = 1; foreach (PlanningVertex item in selectedStructure.RedPlanning) { vrtx = new Vertex(item.X, item.Y, item.Number, 1); vrtx.Attributes[0] = item.Red; polygon.Add(vrtx); i++; } GenericMesher mesher = new GenericMesher(); ConstraintOptions constraint = new ConstraintOptions(); constraint.Convex = true; MeshRedPlanning = (TriangleNet.Mesh)mesher.Triangulate(polygon, constraint); Alert("\"Красная\" триангуляционная сеть создана"); } internal void CreateBlackMesh() { if (selectedStructure == null || selectedStructure.BlackPlanning == null || selectedStructure.BlackPlanning.Count == 0) return; Polygon polygon = new Polygon(); Vertex vrtx; int i = 1; foreach (PlanningVertex item in selectedStructure.BlackPlanning) { vrtx = new Vertex(item.X, item.Y, item.Number, 1); vrtx.Attributes[0] = item.Black; polygon.Add(vrtx); i++; } GenericMesher mesher = new GenericMesher(); ConstraintOptions constraint = new ConstraintOptions(); constraint.Convex = true; MeshBlackPlanning = (TriangleNet.Mesh)mesher.Triangulate(polygon, constraint); Alert("\"Черная\" триангуляционная сеть создана"); } } }