using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Interop; using System.Windows.Media; using System.Windows.Media.Imaging; using Geo; using Microsoft.Win32; using netDxf; using netDxf.Entities; using OfficeOpenXml; namespace GroundOrganizer { public partial class ViewModel : INotifyPropertyChanged { private RelayCommand addFoundation; private RelayCommand updateFoundation; private RelayCommand renumFoundation; private RelayCommand importFoundationsFromDXF; private RelayCommand replaceD1Found; private RelayCommand replaceDLFound; private RelayCommand replaceFLFound; private RelayCommand replaceDLFoundfromNULL; private RelayCommand calculateDLFound; private RelayCommand calculateLevelsFounds; private RelayCommand exportFoundationsToCSV; private RelayCommand importFoundationsFromCSV; private double d1; private double dL; private double fL; int numFoundation = 1; string nameFoundation; Foundation selectedFoundation; ObservableCollection listFoundation = new ObservableCollection(); List bufferFoundations = new List(); public double D1 { get => d1; set { d1 = value; OnPropertyChanged(); /*ChangeD1();*/ } } public double DL { get => dL; set { dL = value; OnPropertyChanged(); /*ChangeDL();*/ } } public double FL { get => fL; set { fL = value; OnPropertyChanged(); /*ChangeFL();*/ } } public ObservableCollection ListFoundation { get => listFoundation; set { listFoundation = value; OnPropertyChanged(); } } public Foundation SelectedFoundation { get => selectedFoundation; set { selectedFoundation = value; OnPropertyChanged(); ChangeSelectedFoundation(); } } public string NameFoundation { get => nameFoundation; set { nameFoundation = value; OnPropertyChanged(); ChangeMark(); } } public List ListTypeFounds { get => listTypeFounds; set { listTypeFounds = value; OnPropertyChanged(); } } public List BufferFoundations { get => bufferFoundations; set => bufferFoundations = value; } #region Команды public RelayCommand AddFoundation { get { return addFoundation ?? (addFoundation = new RelayCommand(obj => { AddFoundationToList(); })); } } public RelayCommand UpdateFoundations { get { return updateFoundation ?? (updateFoundation = new RelayCommand(obj => { UpdateFoundationInList(); })); } } public RelayCommand RenumFoundations { get { return renumFoundation ?? (renumFoundation = new RelayCommand(obj => { RenumberingFoundationInList(); })); } } public RelayCommand ImportFoundationsFromDXF { get { return importFoundationsFromDXF ?? (importFoundationsFromDXF = new RelayCommand(obj => { ReadFondationsFromDXF(); })); } } public RelayCommand ReplaceD1Found { get { return replaceD1Found ?? (replaceD1Found = new RelayCommand(obj => { ChangeD1(); })); } } public RelayCommand ReplaceDLFound { get { return replaceDLFound ?? (replaceDLFound = new RelayCommand(obj => { ChangeDL(); })); } } public RelayCommand ReplaceFLFound { get { return replaceFLFound ?? (replaceFLFound = new RelayCommand(obj => { ChangeFL(); })); } } public RelayCommand ReplaceDLFoundfromNULL { get { return replaceDLFoundfromNULL ?? (replaceDLFoundfromNULL = new RelayCommand(obj => { ChangeDLfromNULL(); })); } } public RelayCommand CalculateDLFound { get { return calculateDLFound ?? (calculateDLFound = new RelayCommand(obj => { CalcDLFound(); })); } } public RelayCommand CalculateLevelsFounds { get { return calculateLevelsFounds ?? (calculateLevelsFounds = new RelayCommand(obj => { CalcDLFoundsAll(); CalcNLFoundsAll(); })); } } public RelayCommand ExportFoundationsToCSV { get { return exportFoundationsToCSV ?? (exportFoundationsToCSV = new RelayCommand(obj => { SaveFoundationsInCsv(); })); } } public RelayCommand ImportFoundationsFromCSV { get { return importFoundationsFromCSV ?? (importFoundationsFromCSV = new RelayCommand(obj => { ReadFoundationsFromCsv(); })); } } #endregion void AddFoundationToList() { ListFoundation.Add(new Foundation() { Number = numFoundation }); numFoundation++; //CreateListNumberTypeBet(); //NameFoundation = listFoundation[0].Name; } void RenumberingFoundationInList() { int j = 1; foreach (Foundation item in ListFoundation) { item.Number = j; j++; } numFoundation = j; ListFoundation = new ObservableCollection(ListFoundation); } internal void UpdateFoundationInList() { ListFoundation = new ObservableCollection(ListFoundation); SaveDB(); } void ChangeSelectedFoundation() { if (listFoundation.Count == 0 || selectedFoundation == null) return; NameFoundation = selectedFoundation.Name; ListFoundLoad = selectedFoundation.Loads; D1 = selectedFoundation.D1; FL = selectedFoundation.FL; DL = selectedFoundation.DL; } void CreateListTypeFoundations() { if (listFoundation == null || listPlayGround == null) return; ListTypeFounds = new List { TypeFound.Прямоугольный, TypeFound.Круглый, TypeFound.Ленточный }; try { FoundationsPage foundationsPage = (FoundationsPage)MW.FoundationsFrame.Content; foundationsPage.typeFondsListCbxCol.ItemsSource = ListTypeFounds; } catch (Exception) { return; } } private void ReadFondationsFromDXF() { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.dxf"; ofd.Filter = "Чертеж (*.dxf)|*.dxf"; ofd.Title = "Импорт чертежа"; ofd.ShowDialog(); if (ofd.FileName == null || ofd.FileName == "") return; DxfDocument dxfDocument = DxfDocument.Load(ofd.FileName); IEnumerable dxfLwPolylines = dxfDocument.LwPolylines; IEnumerable dxfLwPolylinesVertexes = null; Foundation fnd; Quadrangle countFound; int i = 0; Point2d[] ptColl = new Point2d[4]; foreach (LwPolyline item in dxfLwPolylines) { if (item.Layer.Name == "Foundations") { dxfLwPolylinesVertexes = item.Vertexes; int j = 0; foreach (LwPolylineVertex itemVrtx in dxfLwPolylinesVertexes) { ptColl[j] = new Point2d(itemVrtx.Position.X * 0.001, itemVrtx.Position.Y * 0.001); j++; if (j == 4) break; } countFound = new Quadrangle(ptColl[0], ptColl[1], ptColl[2], ptColl[3]); countFound.Units = UnitsLin.м; fnd = new Foundation(countFound) { Number = i + 1 }; ListFoundation.Add(fnd); i++; } } if (dxfLwPolylinesVertexes == null) return; } //Сохранение таблицы фундаментов в файл *.csv internal void SaveFoundationsInCsv() { SaveFileDialog sfd = new SaveFileDialog(); sfd.DefaultExt = "*.xlsx"; sfd.Filter = "Файл Excel (*.xlsx)|*.xlsx"; sfd.Title = "Сохранение таблицы"; //sfd.AddExtension = true; sfd.OverwritePrompt = false; sfd.ShowDialog(); if (sfd.FileName == null || sfd.FileName == "") return; string path = "ИГЭ.xlsx"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists != true) { using (FileStream fstream = new FileStream("ИГЭ.xlsx", FileMode.OpenOrCreate)) { byte[] array = Properties.Resources.IGE; fstream.Write(array, 0, array.Length); } } List content = new List(); foreach (Foundation item in listFoundation) { content.Add(item.PropsToList().ToArray()); } using (var p = new ExcelPackage(new FileInfo(sfd.FileName))) { try { //A workbook must have at least on cell, so lets add one... var ws = p.Workbook.Worksheets["Фундаменты"]; //To set values in the spreadsheet use the Cells indexer. ws.Cells["A2"].LoadFromArrays(content); //Save the new workbook. We haven't specified the filename so use the Save as method. p.SaveAs(new FileInfo(sfd.FileName)); } catch { ExcelPackage p1 = new ExcelPackage(new FileInfo("ИГЭ.xlsx")); ExcelWorksheet ws1 = p1.Workbook.Worksheets["Фундаменты"]; p.Workbook.Worksheets.Add("Фундаменты", ws1); //A workbook must have at least on cell, so lets add one... var ws = p.Workbook.Worksheets["Фундаменты"]; //To set values in the spreadsheet use the Cells indexer. ws.Cells["A2"].LoadFromArrays(content); ws.Select(); //Save the new workbook. We haven't specified the filename so use the Save as method. p.SaveAs(new FileInfo(sfd.FileName)); } } } //Чтение таблицы фундаментов из файла *.xlsx internal void ReadFoundationsFromCsv() { OpenFileDialog ofd = new OpenFileDialog(); ofd.DefaultExt = "*.xlsx"; ofd.Filter = "Файл Excel (*.xlsx)|*.xlsx"; ofd.Title = "Заполнение таблицы"; ofd.ShowDialog(); if (ofd.FileName == null || ofd.FileName == "") return; //ListIGE.Clear(); try { using (var p = new ExcelPackage(new FileInfo(ofd.FileName))) { //A workbook must have at least on cell, so lets add one... var ws = p.Workbook.Worksheets["Фундаменты"]; object[,] content = ws.Cells.Value as object[,]; List source; Foundation item; for (int i = 1; i < content.GetLength(0); i++) { source = new List(); for (int j = 0; j < content.GetLength(1); j++) { source.Add(content[i, j]); } item = new Foundation(); item.ListToProps(source); ListFoundation.Add(item); } } } catch (Exception e) { Alert(e.Message); } } private void ChangeMark() { if (selectedFoundation == null) return; SelectedFoundation.Name = nameFoundation; } void ChangeD1() { if (selectedFoundation == null || selectedStructure == null) return; SelectedFoundation.D1 = d1; SelectedFoundation.D1toFL(selectedStructure.Null); DL = selectedFoundation.DL; //FL = selectedFoundation.FL; } void ChangeDL() { if (selectedFoundation == null || selectedStructure == null) return; SelectedFoundation.DL = dL; SelectedFoundation.DLtoD1(selectedStructure.Null); D1 = selectedFoundation.D1; //FL = selectedFoundation.FL; } void ChangeFL() { if (selectedFoundation == null || selectedStructure == null) return; SelectedFoundation.FL = fL; SelectedFoundation.FLtoD1(selectedStructure.Null); D1 = selectedFoundation.D1; //DL = selectedFoundation.DL; } private void ChangeDLfromNULL() { if (selectedFoundation == null || selectedStructure == null) return; SelectedFoundation.DL = selectedStructure.Null; DL = SelectedFoundation.DL; SelectedFoundation.DLtoD1(selectedStructure.Null); D1 = selectedFoundation.D1; } private void CalcDLFound() { if (selectedFoundation == null || selectedStructure == null) return; if (MeshRedPlanning == null) CreateRedMesh(); selectedFoundation.CalcDL(MeshRedPlanning); DL = SelectedFoundation.DL; SelectedFoundation.DLtoD1(selectedStructure.Null); D1 = selectedFoundation.D1; } internal void CalcDLFoundsAll() { if (listFoundation == null || listFoundation.Count == 0) return; if (MeshRedPlanning == null) CreateRedMesh(); if (MeshRedPlanning == null) { Alert("Сооружение не содержит планировочных отметок"); return; } foreach (Foundation item in ListFoundation) { item.CalcDL(MeshRedPlanning); item.DLtoD1(selectedStructure.Null); } Alert("Уровни планировки для всех фундаментов \nвычислены по триангуляционной сети"); } internal void CalcNLFoundsAll() { if (listFoundation == null || listFoundation.Count == 0) return; if (MeshBlackPlanning == null) CreateBlackMesh(); if (MeshBlackPlanning == null) { Alert("Сооружение не содержит планировочных отметок"); return; } foreach (Foundation item in ListFoundation) { item.CalcNL(MeshBlackPlanning); } Alert("Отметки естественного рельефа для всех фундаментов \nвычислены по триангуляционной сети"); } internal void CreateSmallPropsFounds() { foreach (Foundation item in ListFoundation) item.CreateSmallPropsList(); } } }