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

402 lines
15 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<Foundation> listFoundation = new ObservableCollection<Foundation>();
List<Foundation> bufferFoundations = new List<Foundation>();
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<Foundation> 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<TypeFound> ListTypeFounds { get => listTypeFounds; set { listTypeFounds = value; OnPropertyChanged(); } }
public List<Foundation> 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<Foundation>(ListFoundation);
}
internal void UpdateFoundationInList()
{
ListFoundation = new ObservableCollection<Foundation>(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.Круглый, 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<LwPolyline> dxfLwPolylines = dxfDocument.LwPolylines;
IEnumerable<LwPolylineVertex> 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<object[]> content = new List<object[]>();
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<object> source; Foundation item;
for (int i = 1; i < content.GetLength(0); i++)
{
source = new List<object>();
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();
}
}
}