Добавьте файлы проекта.

This commit is contained in:
palex
2026-01-06 02:07:18 +03:00
parent 153b9675e3
commit 8e4b375e80
109 changed files with 10817 additions and 0 deletions

26
App.config Normal file
View File

@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!--
name = Имя, которое используется для ссылки на данный раздел в файле настройки.
type = Обработчик раздела настроек. Включает две секции: полный путь - пространство имен обработчика наших данных + имя самого обработчика, наименование сборки, где данный класс располагается.
-->
<section name="StartupFolders" type="ConfigSectionTester.StartupFoldersConfigSection, ConfigSectionTester"/>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="GroundOrganizer.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<userSettings>
<GroundOrganizer.Properties.Settings>
<setting name="BasePath" serializeAs="String">
<value/>
</setting>
</GroundOrganizer.Properties.Settings>
</userSettings>
</configuration>

13
App.xaml Normal file
View File

@@ -0,0 +1,13 @@
<Application x:Class="GroundOrganizer.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GroundOrganizer"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Dictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>

24
App.xaml.cs Normal file
View File

@@ -0,0 +1,24 @@
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для App.xaml
/// </summary>
public partial class App : Application
{
//public static ViewModel vm;
//public App()
//{
// InitializeComponent();
// vm = new ViewModel();
//}
}
}

119
BL/Bore.cs Normal file
View File

@@ -0,0 +1,119 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public class Bore
{
/// <summary>
/// Порядковый номер скважины
/// </summary>
public int Number { get; set; }
/// <summary>
/// Имя скважины
/// </summary>
public string Name { get; set; }
/// <summary>
/// Х-координата распложения скважины
/// </summary>
public double X { get; set; }
/// <summary>
/// Y-координата распложения скважины
/// </summary>
public double Y { get; set; }
/// <summary>
/// Абсолютная отметка устья скважины
/// </summary>
public double Z { get; set; }
/// <summary>
/// Относительная отметка уровня грунтовых вод
/// </summary>
public double? WL { get; set; }
/// <summary>
/// Превышение глубины сважины в расчетах осадки
/// </summary>
public double DZ { get; set; }
/// <summary>
/// Массив грунтовых слоев
/// </summary>
public ObservableCollection<Layer> Layers { get; set; }
public Bore()
{
Layers = new ObservableCollection<Layer>();
}
public void AddLayer(Layer layer)
{
if (Layers == null) Layers = new ObservableCollection<Layer>();
Layers.Add(layer);
}
public void AddLayers(ObservableCollection<Layer> layers)
{
Layers = layers;
}
public void AddLayers(List<Layer> layers)
{
if (Layers == null) Layers = new ObservableCollection<Layer>();
foreach (var item in layers) Layers.Add(item);
}
public void DeleteLayers()
{
Layers = new ObservableCollection<Layer>();
}
internal string PropsToString()
{
string s = ";";
return Number + s + Name + s + X + s + Y + s + Z + s + WL + s + DZ;
}
internal List<object> PropsToList()
{
return new List<object> { Number, Name, X, Y, Z, WL, DZ };
}
internal void StringToProps(string line, char separator = ';')
{
string[] src = line.Split(separator);
try
{
Number = Int32.Parse(src[0]);
Name = src[1];
X = double.Parse(src[2]);
Y = double.Parse(src[3]);
Z = double.Parse(src[4]);
WL = double.Parse(src[5]);
DZ = double.Parse(src[6]);
}
catch
{
return;
}
}
internal void ListToProps(List<object> src)
{
try
{
Number = (int)(double)src[0];
Name = (string)src[1];
X = (double)src[2];
Y = (double)src[3];
Z = (double)src[4];
WL = (double)src[5];
DZ = (double)src[6];
}
catch
{
return;
}
}
}
}

26
BL/DataPair.cs Normal file
View File

@@ -0,0 +1,26 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{ [Serializable]
public struct DataPair
{
public string Описание { get; set; }
public object Параметр { get; set; }
public UnitsForce ForcesUnits { get; set; }
public UnitsStress StressUnits { get; set; }
public UnitsArea AreasUnits { get; set; }
public UnitsLin LenghtsUnits { get; set; }
}
[Serializable]
public struct DataPairProps
{
public string Описание { get; set; }
public object Параметр { get; set; }
public UnitsList Ед_изм { get; set; }
}
}

404
BL/DataR.cs Normal file
View File

@@ -0,0 +1,404 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public struct DataR
{
public string Bore { get; set; }
public string Base { get; set; }
public double R { get; set; }
public double P { get; set; }
public double PmaxX { get; set; }
public double PmaxY { get; set; }
public double GapX { get; set; }
public double GapY { get; set; }
public double CheckP { get; set; }
public double CheckGap { get; set; }
public double YIIu { get; set; }
public double YII { get; set; }
public double FiII { get; set; }
public double CII { get; set; }
public double Yc1 { get; set; }
public double Yc2 { get; set; }
public double My { get; set; }
public double Mq { get; set; }
public double Mc { get; set; }
public double IL { get; set; }
public double Ys { get; set; }
public double Ke { get; set; }
public double Kz { get; set; }
public double K { get; set; }
public double d1 { get; set; }
public double db { get; set; }
public string Ground { get; set; }
public string GroundType { get; set; }
public List<DataPair> FullData { get; private set; }
public List<DataPair> MediumData { get; private set; }
public List<DataPair> SmallData { get; private set; }
internal void CreateFullData()
{
FullData = new List<DataPair>();
DataPair dataPair = new DataPair() { Описание = "Фундамент", Параметр = Base };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Скважина", Параметр = Bore };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Расчетное сопротивление", Параметр = R, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Среднее давление под подошвой", Параметр = P, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальное давление под подошвой в направлении длины фундамента",
Параметр = PmaxX, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальное давление под подошвой в направлении ширины фундамента",
Параметр = PmaxY, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент использования расчетного сопротивления", Параметр = CheckP };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении длины фундамента", Параметр = GapX};
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении ширины фундамента", Параметр = GapY};
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальный отрыв подошвы", Параметр = CheckGap };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина заложения", Параметр = d1, LenghtsUnits = UnitsLin.м };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина подвала", Параметр = db, LenghtsUnits = UnitsLin.м };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Грунт под подошвой", Параметр = Ground };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Объемный вес (осредненный) грунта выше подошвы", Параметр = YIIu,
AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Объемный вес (осредненный) грунта ниже подошвы", Параметр = YII,
AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Угол внутреннего трения грунта основания (осредненный)", Параметр = FiII };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Удельное сцепление грунта основания (осредненное)", Параметр = CII,
AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Показатель текучести грунта основания ", Параметр = IL };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент пористости грунта основания ", Параметр = Ke };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Тип грунта основания согласно таблице 5.4", Параметр = GroundType };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Yc1 согласно таблице 5.4", Параметр = Yc1 };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Yc2 согласно таблице 5.4", Параметр = Yc2 };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт My согласно таблице 5.5", Параметр = My };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Mq согласно таблице 5.5", Параметр = Mq };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Mc согласно таблице 5.5", Параметр = Mc };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Kz", Параметр = Kz };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт K", Параметр = K };
FullData.Add(dataPair);
}
internal void CreateMediumData()
{
MediumData = new List<DataPair>();
DataPair dataPair = new DataPair() { Описание = "Фундамент", Параметр = Base };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Расчетное сопротивление", Параметр = R, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Среднее давление под подошвой", Параметр = P, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении длины фундамента",
Параметр = PmaxX,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении ширины фундамента",
Параметр = PmaxY,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент использования расчетного сопротивления", Параметр = CheckP };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении длины фундамента", Параметр = GapX };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении ширины фундамента", Параметр = GapY };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальный отрыв подошвы", Параметр = CheckGap };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина заложения", Параметр = d1, LenghtsUnits = UnitsLin.м };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина подвала", Параметр = db, LenghtsUnits = UnitsLin.м };
MediumData.Add(dataPair);
//dataPair = new DataPair() { Descriptions = "Грунт под подошвой", DataEntity = Ground };
//MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Объемный вес (осредненный) грунта выше подошвы",
Параметр = YIIu,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Объемный вес (осредненный) грунта ниже подошвы",
Параметр = YII,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Угол внутреннего трения грунта основания (осредненный)", Параметр = FiII };
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Удельное сцепление грунта основания (осредненное)",
Параметр = CII,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
}
internal void CreateSmallData()
{
SmallData = new List<DataPair>();
DataPair dataPair = new DataPair() { Описание = "Фундамент", Параметр = Base };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Расчетное сопротивление", Параметр = R, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Среднее давление под подошвой", Параметр = P, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
SmallData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении длины фундамента",
Параметр = PmaxX,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
SmallData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении ширины фундамента",
Параметр = PmaxY,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении длины фундамента", Параметр = GapX };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении ширины фундамента", Параметр = GapY };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальный отрыв подошвы", Параметр = CheckGap };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент использования расчетного сопротивления", Параметр = CheckP };
SmallData.Add(dataPair);
}
internal List<DataPair> FullResults()
{
FullData = new List<DataPair>();
DataPair dataPair = new DataPair() { Описание = "Фундамент", Параметр = Base };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Скважина", Параметр = Bore };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Расчетное сопротивление", Параметр = R, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Среднее давление под подошвой", Параметр = P, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
FullData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении длины фундамента",
Параметр = PmaxX,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
FullData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении ширины фундамента",
Параметр = PmaxY,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении длины фундамента", Параметр = GapX };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении ширины фундамента", Параметр = GapY };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальный отрыв подошвы", Параметр = CheckGap };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент использования расчетного сопротивления", Параметр = CheckP };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина заложения", Параметр = d1, LenghtsUnits = UnitsLin.м };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина подвала", Параметр = db, LenghtsUnits = UnitsLin.м };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Грунт под подошвой", Параметр = Ground };
FullData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Объемный вес (осредненный) грунта выше подошвы",
Параметр = YIIu,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
FullData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Объемный вес (осредненный) грунта ниже подошвы",
Параметр = YII,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Угол внутреннего трения грунта основания (осредненный)", Параметр = FiII };
FullData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Удельное сцепление грунта основания (осредненное)",
Параметр = CII,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Показатель текучести грунта основания ", Параметр = IL };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент пористости грунта основания ", Параметр = Ke };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Тип грунта основания согласно таблице 5.4", Параметр = GroundType };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Yc1 согласно таблице 5.4", Параметр = Yc1 };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Yc2 согласно таблице 5.4", Параметр = Yc2 };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт My согласно таблице 5.5", Параметр = My };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Mq согласно таблице 5.5", Параметр = Mq };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Mc согласно таблице 5.5", Параметр = Mc };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт Kz", Параметр = Kz };
FullData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффицинт K", Параметр = K };
FullData.Add(dataPair);
return FullData;
}
internal List<DataPair> MediumResults()
{
MediumData = new List<DataPair>();
DataPair dataPair = new DataPair() { Описание = "Фундамент", Параметр = Base };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Расчетное сопротивление", Параметр = R, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Среднее давление под подошвой", Параметр = P, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении длины фундамента",
Параметр = PmaxX,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении ширины фундамента",
Параметр = PmaxY,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении длины фундамента", Параметр = GapX };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении ширины фундамента", Параметр = GapY };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальный отрыв подошвы", Параметр = CheckGap };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент использования расчетного сопротивления", Параметр = CheckP };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина заложения", Параметр = d1, LenghtsUnits = UnitsLin.м };
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Глубина подвала", Параметр = db, LenghtsUnits = UnitsLin.м };
MediumData.Add(dataPair);
//dataPair = new DataPair() { Descriptions = "Грунт под подошвой", DataEntity = Ground };
//MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Объемный вес (осредненный) грунта выше подошвы",
Параметр = YIIu,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Объемный вес (осредненный) грунта ниже подошвы",
Параметр = YII,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
dataPair = new DataPair() { Описание = "Угол внутреннего трения грунта основания (осредненный)", Параметр = FiII };
MediumData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Удельное сцепление грунта основания (осредненное)",
Параметр = CII,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
MediumData.Add(dataPair);
return MediumData;
}
internal List<DataPair> SmallResults()
{
SmallData = new List<DataPair>();
DataPair dataPair = new DataPair() { Описание = "Фундамент", Параметр = Base };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Расчетное сопротивление", Параметр = R, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Среднее давление под подошвой", Параметр = P, AreasUnits = UnitsArea.м, ForcesUnits = UnitsForce.т };
SmallData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении длины фундамента",
Параметр = PmaxX,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
SmallData.Add(dataPair);
dataPair = new DataPair()
{
Описание = "Максимальное давление под подошвой в направлении ширины фундамента",
Параметр = PmaxY,
AreasUnits = UnitsArea.м,
ForcesUnits = UnitsForce.т
};
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении длины фундамента", Параметр = GapX };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Отрыв в направлении ширины фундамента", Параметр = GapY };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Максимальный отрыв подошвы", Параметр = CheckGap };
SmallData.Add(dataPair);
dataPair = new DataPair() { Описание = "Коэффициент использования расчетного сопротивления", Параметр = CheckP };
SmallData.Add(dataPair);
return SmallData;
}
}
}

28
BL/DataS.cs Normal file
View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public struct DataS
{
public string Bore { get; set; }
public string Base { get; set; }
public double Sp { get; set; }
public double Sr { get; set; }
public double p { get; set; }
public double Hc { get; set; }
public double Hmin { get; set; }
public double YIIu { get; set; }
public List<double> Z { get; set; }
public List<double?> Alfa { get; set; }
public List<double> sig_zp { get; set; }
public List<double> sig_zy { get; set; }
public List<double> sig_zg { get; set; }
public List<double> E { get; set; }
public List<double> N { get; set; }
}
}

18
BL/Enums.cs Normal file
View File

@@ -0,0 +1,18 @@
namespace GroundOrganizer
{
public enum TypeFound { Прямоугольный, Ленточный, Круглый }
public enum PointFound { Центр, Угол}
public enum TypeFlexStructure { Гибкая, Жесткая }
public enum ResKey { eps_b_max, eps_b_min, sig_b_max, sig_b_min, eps_bult, eps_s_max, eps_s_min, sig_s_max, sig_s_min, asel, kf, Mxult, Myult, Nult, Mxcrc, Mycrc, num_itr, rep, info }
public enum SecShape { прямоугольник, круг, кольцо, тавр_с_полками_вверху, тавр_с_полками_внизу, двутавр, короб, пользовательское }
public enum ElementType { стержень, пластина }
public enum CharMat { C, CL, N, NL }
public enum LongForces { кратковременное, длительное }
public enum Vlajnost { Ниже_40, От_40_до_75, Выше_75 }
public enum Orientation { вертикальная, горизонтальная }
public enum ClassBet { B10, B15, B20, B25, B30, B35, B40, B45, B50, B55, B60 }
public enum ClassArm { A240, A400, A500, B500, A600, A800, A1000, Bp500, Bp1200 }
public enum TypeDiagramm { трехлинейная, двухлинейная }
public enum TypeLayer { Au, As1, As2, As3, As4, одиночный, радиальный, линейный, AuAs }
public enum ParamsLayer { AsDs, AsNd, DsNd }
}

82
BL/FoundLoad.cs Normal file
View File

@@ -0,0 +1,82 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public class FoundLoad
{
public double NC { get; set; }
public double MxC { get; set; }
public double MyC { get; set; }
public double QyC { get; set; }
public double QxC { get; set; }
public double N { get; set; }
public double Mx { get; set; }
public double My { get; set; }
public double Qy { get; set; }
public double Qx { get; set; }
public double q { get; set; }
public int Number { get; set; }
public bool InFoot { get; set; }
public UnitsForce UnitsF { get; set; }
public UnitsLin UnitsL { get; set; }
internal string PropsToString()
{
string s = ";";
return Number + s + N + s + Mx + s + My + s + Qx + s + Qy + s + q;
}
internal List<object> PropsToList()
{
return new List<object> { Number, N, Mx, My, Qx, Qy, q, InFoot };
}
internal void StringToProps(string line, char separator = ';')
{
string[] src = line.Split(separator);
try
{
Number = Int32.Parse(src[0]);
N = double.Parse(src[1]);
Mx = double.Parse(src[2]);
My = double.Parse(src[3]);
Qx = double.Parse(src[4]);
Qy = double.Parse(src[5]);
q = double.Parse(src[6]);
}
catch
{
return;
}
}
internal void ListToProps(List<object> src)
{
try
{
Number = (int)(double)src[0];
N = (double)src[1];
Mx = (double)src[2];
My = (double)src[3];
Qx = (double)src[4];
Qy = (double)src[5];
q = (double)src[6];
InFoot = (bool)src[7];
}
catch
{
return;
}
}
}
}

920
BL/Foundation.cs Normal file
View File

@@ -0,0 +1,920 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Geo;
using TriangleNet;
using TriangleNet.Geometry;
using TriangleNet.Meshing;
using TriangleNet.Tools;
namespace GroundOrganizer
{
[Serializable]
public class Foundation
{
public int Number { get; set; }
public string Name { get; set; }
public TypeFound Type { get; set; }
public bool Basement { get; set; }
public double B { get; set; }
public double L { get; set; }
public double Db { get; set; }
public double D1 { get; set; }
public double H { get; set; }
public double AlfaDeg { get; set; }
public double Hs { get; set; }
public double Hcf { get; set; }
public double Ycf { get; set; }
public double X { get; set; }
public double Y { get; set; }
/// <summary>
/// Относительная отметка подошвы фундамента
/// </summary>
public double FL { get; set; }
/// <summary>
/// Абсолютная отметка планировки в центральной точке фундамента
/// </summary>
public double DL { get; set; }
/// <summary>
/// Абсолютная отметка естественного рельефа в центральной точке фундамента
/// </summary>
public double NL { get; set; }
public ObservableCollection<FoundLoad> Loads { get; set; }
public UnitsForce UnitsF { get; set; }
public UnitsLin UnitsL { get; set; }
public Quadrangle Contour { get; set; }
public List<DataPair> FullResults { get; private set; }
public List<DataPairProps> FullProps { get; private set; }
public List<DataPair> MediumResults { get; private set; }
public List<DataPairProps> MediumProps { get; private set; }
public List<DataPair> SmallResults{ get; private set; }
public List<DataPairProps> SmallProps{ get; private set; }
public Foundation()
{
Loads = new ObservableCollection<FoundLoad>();
Type = TypeFound.Прямоугольный;
UnitsF = UnitsForce.т;
UnitsL = UnitsLin.м;
Ycf = 2.2;
FullResults = new List<DataPair>();
MediumResults = new List<DataPair>();
SmallResults = new List<DataPair>();
}
public Foundation(Quadrangle cntr)
{
if (cntr.Units == UnitsLin.см)
{
Contour.Vertex1 = cntr.Vertex1 * 0.01;
Contour.Vertex2 = cntr.Vertex2 * 0.01;
Contour.Vertex3 = cntr.Vertex3 * 0.01;
Contour.Vertex4 = cntr.Vertex4 * 0.01;
}
if (cntr.Units == UnitsLin.мм)
{
Contour.Vertex1 = cntr.Vertex1 * 0.001;
Contour.Vertex2 = cntr.Vertex2 * 0.001;
Contour.Vertex3 = cntr.Vertex3 * 0.001;
Contour.Vertex4 = cntr.Vertex4 * 0.001;
}
if(cntr.Units == UnitsLin.м) Contour = cntr;
X = Math.Round(Contour.Centroid.X, 3);
Y = Math.Round(Contour.Centroid.Y, 3);
IOrderedEnumerable<Line2d> selected = from l in Contour.Segments // определяем каждый объект как
orderby l.Length // упорядочиваем по возрастанию
select l; // выбираем объект
AlfaDeg = Math.Round(RadToDeg(Math.Acos(selected.First().Directive.Vx / selected.First().Length)), 3);
B = Math.Round(selected.First().Length, 3);
L = Math.Round(selected.Last().Length, 3);
Loads = new ObservableCollection<FoundLoad>();
Type = TypeFound.Прямоугольный;
UnitsF = UnitsForce.т;
UnitsL = UnitsLin.м;
Ycf = 2.2;
FullResults = new List<DataPair>();
MediumResults = new List<DataPair>();
SmallResults = new List<DataPair>();
}
internal void CreateFullPropsList()
{
FullProps = new List<DataPairProps>();
DataPairProps dataPair = new DataPairProps() { Описание = "Номер", Параметр = Number };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Марка", Параметр = Name };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Ширина", Параметр = B, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Длина", Параметр = L, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Высота", Параметр = H, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка подошвы", Параметр = FL, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Глубина заложения", Параметр = D1, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка планировки", Параметр = DL };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка рельефа", Параметр = NL };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Наличие подвала", Параметр = Basement };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Глубина подвала", Параметр = Db, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "h_s", Параметр = Hs, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "h_cf", Параметр = Hcf, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Ycf, т/м3", Параметр = Ycf };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Х", Параметр = X, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Y", Параметр = Y, Ед_изм = UnitsList.м };
FullProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Поворот", Параметр = AlfaDeg, Ед_изм= UnitsList.градус };
FullProps.Add(dataPair);
}
internal void CreateMediumPropsList()
{
MediumProps = new List<DataPairProps>();
DataPairProps dataPair = new DataPairProps() { Описание = "Номер", Параметр = Number };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Марка", Параметр = Name };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Ширина", Параметр = B, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Длина", Параметр = L, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Высота", Параметр = H, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка подошвы", Параметр = FL, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Глубина заложения", Параметр = D1, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка планировки", Параметр = DL };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка рельефа", Параметр = NL };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Наличие подвала", Параметр = Basement };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Глубина подвала", Параметр = Db, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "h_s", Параметр = Hs, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "h_cf", Параметр = Hcf, Ед_изм = UnitsList.м };
MediumProps.Add(dataPair);
}
internal void CreateSmallPropsList()
{
SmallProps = new List<DataPairProps>();
DataPairProps dataPair = new DataPairProps() { Описание = "Номер", Параметр = Number };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Марка", Параметр = Name };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Ширина b", Параметр = B, Ед_изм = UnitsList.м };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Длина l", Параметр = L, Ед_изм = UnitsList.м };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Высота h", Параметр = H, Ед_изм = UnitsList.м };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка подошвы FL", Параметр = FL, Ед_изм = UnitsList.м };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Глубина заложения d_1", Параметр = D1, Ед_изм = UnitsList.м };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка планировки DL", Параметр = DL, Ед_изм = UnitsList.м };
SmallProps.Add(dataPair);
dataPair = new DataPairProps() { Описание = "Отметка рельефа NL", Параметр = NL, Ед_изм = UnitsList.м };
SmallProps.Add(dataPair);
}
public DataS Sp(Bore bore, FoundLoad load, double kHc = 0.5, PointFound ptFond = PointFound.Центр)
{
DataS res = new DataS();
List<Layer> downFS = DownFS(bore);
List<double> n = res.N;
n = new List<double>();
foreach (Layer item in downFS)
{
n.Add(Math.Ceiling(item.H / (0.4 * B)));
}
List<Layer> layers = new List<Layer>();
for (int i = 0; i < n.Count; i++)
{
double z = downFS[i].Up;
double dlt = downFS[i].H / n[i];
while (downFS[i].Down > z)
{
z += dlt;
Layer lay = downFS[i].Clone();
lay.Down = z;
lay.H = dlt;
lay.Up = z - dlt;
layers.Add(lay);
}
}
double FL;
if (Basement) FL = Hs + Hcf + Db;
else FL = D1;
res.Z = new List<double>() { 0 };
foreach (Layer item in layers)
{
res.Z.Add(item.Up + 0.5 * item.H - FL);
}
res.Alfa = TablesInterolator.Table_5_8(res.Z, B, L, Type);
List<Layer> upF = UpF(bore);
double roh = 0;
double h = 0;
if (upF.Count > 0)
{
foreach (Layer item in upF)
{
roh += item.H * item.IGE.RoII;
h += item.H;
}
}
res.YIIu = Math.Round(roh / h, 3);
double sig_zg0 = res.YIIu * FL;
double p = load.N / (B * L) + load.q + 2 * FL;
res.sig_zy = new List<double>();
res.sig_zp = new List<double>();
for (int i = 0; i < res.Z.Count; i++)
{
res.sig_zp.Add((double)res.Alfa[i] * p);
res.sig_zy.Add((double)res.Alfa[i] * sig_zg0);
}
res.sig_zg = new List<double> { sig_zg0 };
res.E = new List<double>();
for (int i = 0; i < layers.Count; i++)
{
res.sig_zg.Add(sig_zg0 + layers[i].IGE.RoII * (res.Z[i + 1] - (layers[i].Up - FL)));
sig_zg0 += layers[i].H * layers[i].IGE.RoII;
res.E.Add(layers[i].IGE.E * 101.972);
}
sig_zg0 = res.YIIu * FL;
if (B <= 10) res.Hmin = B / 2;
else if (B > 10 && B <= 60) res.Hmin = 4 + 0.1 * B;
else res.Hmin = 10;
int j = 0;
for (int i = 0; i < layers.Count; i++)
{
if (res.sig_zp[i] >= kHc * res.sig_zg[i])
{
res.Hc = res.Z[i];
}
else
{
j = i;
break;
}
}
int t = 0; double pt = layers[t].H;
while (pt <= res.Hmin)
{
t++;
pt += layers[t].H;
}
if (res.Hmin > res.Hc)
{
res.Hc = res.Hmin;
j = t;
}
if (sig_zg0 >= p)
{
for (int i = 0; i <= j; i++)
{
res.Sp += res.sig_zp[i + 1] * layers[i].H / (5 * res.E[i]);
}
res.Sp *= 0.8;
}
else
{
for (int i = 0; i <= j; i++)
{
res.Sp += (res.sig_zp[i + 1] - res.sig_zy[i + 1]) * layers[i].H / res.E[i] + res.sig_zy[i + 1] * layers[i].H / (5 * res.E[i]);
}
res.Sp *= 0.8;
}
res.Sp = Math.Round(res.Sp * 100, 1);
res.p = Math.Round(p, 2);
return res;
}
public DataR P(Bore bore, TypeFlexStructure ts, double ls, double hs, double k = 1)
{
DataR dataR = R(bore, ts, ls, hs, k);
dataR.Base = Name;
dataR.Bore = "Скв." + bore.Name;
if (Loads == null || Loads.Count == 0)
{
FullResults = dataR.FullResults();
MediumResults = dataR.MediumResults();
SmallResults = dataR.SmallResults();
return dataR;
}
List<double> P = new List<double>(Loads.Count);
List<double> PmaxX = new List<double>(Loads.Count);
List<double> PmaxY = new List<double>(Loads.Count);
List<double> chP = new List<double>(Loads.Count);
List<double> GapX = new List<double>(Loads.Count);
List<double> GapY = new List<double>(Loads.Count);
List<double> chGap = new List<double>(Loads.Count);
foreach (FoundLoad item in Loads)
{
P.Add(item.N / (B * L) + item.q + 2 * D1);
double ex = (Math.Abs(item.Mx) / (item.N + 2 * D1 * L * B)) / L;
double wx = (B * L * L * L) / 6;
double pmaxx;
if (ex <= (1.0 / 6)) {pmaxx= item.N / (B * L) + 2 * D1 + Math.Abs(item.Mx) / wx; PmaxX.Add(pmaxx); GapX.Add(0); ex = 0; }
else
{
double C0x = 0.5 * L - item.Mx / (item.N + 2 * D1 * L * B);
pmaxx = 2 * (item.N + 2 * D1 * L * B) / (3 * B * C0x);
PmaxX.Add(pmaxx);
GapX.Add(ex);
}
double ey = (Math.Abs(item.My) / (item.N + 2 * D1 * L * B)) / B;
double wy = (L * B * B * B) / 6;
double pmaxy;
if (ey <= (1.0 / 6)) {pmaxy= item.N / (B * L) + 2 * D1 + Math.Abs(item.My) / wy; PmaxY.Add(pmaxy); GapY.Add(0); ey = 0; }
else
{
double C0y = 0.5 * B - item.My / (item.N + 2 * D1 * L * B);
pmaxy = 2 * (item.N + 2 * D1 * L * B) / (3 * L * C0y);
PmaxY.Add(pmaxy);
GapY.Add(ey);
}
chGap.Add(Math.Max(ex, ey));
List<double> chp = new List<double> { (item.N / (B * L) + item.q + 2 * D1) / dataR.R, pmaxx / (1.2 * dataR.R), pmaxy / (1.2 * dataR.R) };
chP.Add(chp.Max());
}
dataR.P = Math.Round(P.Max(), 3);
dataR.PmaxX = Math.Round(PmaxX.Max(), 3);
dataR.PmaxY = Math.Round(PmaxY.Max(), 3);
dataR.CheckP = Math.Round(chP.Max(), 3);
dataR.CheckGap = Math.Round(chGap.Max(), 3);
dataR.GapX = Math.Round(GapX.Max(), 3);
dataR.GapY = Math.Round(GapY.Max(), 3);
FullResults = dataR.FullResults();
MediumResults = dataR.MediumResults();
SmallResults = dataR.SmallResults();
return dataR;
}
public ObservableCollection<DataR> P(ObservableCollection<Bore> bores, TypeFlexStructure ts, double ls, double hs, double k = 1)
{
ObservableCollection<DataR> res = new ObservableCollection<DataR>();
foreach (Bore bore in bores)
{
DataR dataR = R(bore, ts, ls, hs, k);
dataR.Base = Name;
dataR.Bore = "Скв." + bore.Name;
if (Loads == null || Loads.Count == 0)
{
dataR.CreateFullData();
dataR.CreateMediumData();
dataR.CreateSmallData();
res.Add(dataR);
continue;
}
List<double> P = new List<double>(Loads.Count);
List<double> PmaxX = new List<double>(Loads.Count);
List<double> PmaxY = new List<double>(Loads.Count);
List<double> chP = new List<double>(Loads.Count);
List<double> GapX = new List<double>(Loads.Count);
List<double> GapY = new List<double>(Loads.Count);
List<double> chGap = new List<double>(Loads.Count);
foreach (FoundLoad item in Loads)
{
P.Add(item.N / (B * L) + item.q + 2 * D1);
double ex = (item.Mx / (item.N + 2 * D1 * L * B)) / L;
double wx = (B * L * L * L) / 6;
double pmaxx;
if (ex <= 1 / 6) { pmaxx = item.N / (B * L) + 2 * D1 + Math.Abs(item.Mx) / wx; PmaxX.Add(pmaxx); GapX.Add(0); ex = 0; }
else
{
double C0x = 0.5 * L - item.Mx / (item.N + 2 * D1 * L * B);
pmaxx = 2 * (item.N + 2 * D1 * L * B) / (3 * B * C0x);
PmaxX.Add(pmaxx);
GapX.Add(ex);
}
double ey = (item.My / (item.N + 2 * D1 * L * B)) / B;
double wy = (L * B * B * B) / 6;
double pmaxy;
if (ey <= 1 / 6) { pmaxy = item.N / (B * L) + 2 * D1 + Math.Abs(item.My) / wy; PmaxY.Add(pmaxy); GapY.Add(0); ey = 0; }
else
{
double C0y = 0.5 * B - item.My / (item.N + 2 * D1 * L * B);
pmaxy = 2 * (item.N + 2 * D1 * L * B) / (3 * L * C0y);
PmaxY.Add(pmaxy);
GapY.Add(ey);
}
chGap.Add(Math.Max(ex, ey));
List<double> chp = new List<double> { (item.N / (B * L) + item.q + 2 * D1) / dataR.R, pmaxx / (1.2 * dataR.R), pmaxy / (1.2 * dataR.R) };
chP.Add(chp.Max());
}
dataR.P = Math.Round(P.Max(), 3);
dataR.PmaxX = Math.Round(PmaxX.Max(), 3);
dataR.PmaxY = Math.Round(PmaxY.Max(), 3);
dataR.CheckP = Math.Round(chP.Max(), 3);
dataR.CheckGap = Math.Round(chGap.Max(), 3);
dataR.GapX = Math.Round(GapX.Max(), 3);
dataR.GapY = Math.Round(GapY.Max(), 3);
dataR.CreateFullData();
dataR.CreateMediumData();
dataR.CreateSmallData();
res.Add(dataR);
}
return res;
}
private DataR R(Bore bore, TypeFlexStructure ts, double ls, double hs, double k = 1)
{
DataR res = new DataR();
List<Layer> upF = UpF(bore);
List<Layer> downF = DownF(bore);
double roh = 0;
double h = 0;
if (upF.Count > 0)
{
foreach (Layer item in upF)
{
roh += item.H * item.IGE.RoII;
h += item.H;
}
}
res.YIIu = Math.Round(roh / h, 3);
double fih = 0;
double ch = 0;
roh = 0;
h = 0;
if (downF.Count > 0)
{
foreach (Layer item in downF)
{
fih += item.H * item.IGE.FiII;
ch += item.H * item.IGE.CII * 100;
roh += item.H * item.IGE.RoII;
h += item.H;
}
}
res.YII = Math.Round(roh / h, 3);
res.FiII = Math.Round(fih / h);
res.CII = Math.Round(ch / h, 3);
res.IL = downF[0].IGE.IL;
res.Ke = downF[0].IGE.Ke;
res.Ys = downF[0].IGE.Ys;
res.Ground = "ИГЭ " + downF[0].IGE.NumIGE + " " + downF[0].IGE.Description;
res.GroundType = downF[0].IGE.GroundType;
res.Yc1 = TablesInterolator.Yc1(res.GroundType);
res.Yc2 = TablesInterolator.Yc2(res.GroundType, ts, ls, hs);
double[] MyMqMc = TablesInterolator.My_Mq_Mc(res.FiII);
res.My = MyMqMc[0];
res.Mq = MyMqMc[1];
res.Mc = MyMqMc[2];
res.K = k;
if (B < 10) res.Kz = 1;
else res.Kz = 8 / B + 0.2;
if (Basement) res.d1 = Math.Round(Hs + Hcf * (Ycf / res.YIIu), 3);
else res.d1 = D1;
if (Basement && Db > 2) res.db = 2;
else if (Basement && Db <= 2) res.db = Db;
else res.db = 0;
res.R = res.Yc1 * res.Yc2 * (res.My * res.Kz * B * res.YII + res.Mq * res.d1 * res.YIIu + (res.Mq - 1) * res.db * res.YIIu + res.Mc * res.CII) / k;
res.R = Math.Round(res.R, 2);
//res.GroundType = "";
return res;
}
private List<Layer> UpF(Bore bore)
{
List<Layer> res = new List<Layer>();
double d;
if (Basement) d = Hs + Hcf + Db;
else d = D1;
double FL;
FL = d;
Bore boreW = BoreW(bore);
if (boreW.Layers.Count == 0) return res;
foreach (Layer item in boreW.Layers)
{
if (item.Up > FL) break;
res.Add(item.Clone());
}
res[res.Count - 1].Down = FL;
res[res.Count - 1].H = res[res.Count - 1].Down - res[res.Count - 1].Up;
return res;
}
private List<Layer> DownF(Bore bore)
{
List<Layer> res = new List<Layer>();
double d, z;
if (Basement) d = Hs + Hcf + Db;
else d = D1;
if (B < 10) z = 0.5 * B;
else z = 4 + 0.1 * B;
double FL, ZL;
FL = d;
ZL = d + z;
Bore boreW = BoreW(bore);
if (boreW.Layers.Count == 0) return res;
foreach (Layer item in boreW.Layers)
{
if (item.Down > FL) res.Add(item.Clone());
if (item.Down >= ZL) break;
}
res[0].Up = FL;
res[0].H = res[0].Down - res[0].Up;
res[res.Count - 1].Down = ZL;
res[res.Count - 1].H = res[res.Count - 1].Down - res[res.Count - 1].Up;
return res;
}
private List<Layer> UpW(Bore bore)
{
List<Layer> res = new List<Layer>();
foreach (Layer item in bore.Layers)
{
if (item.Up > bore.WL) break;
res.Add(item.Clone());
}
if (res.Count > 0)
{
res[res.Count - 1].Down = (double)bore.WL;
res[res.Count - 1].H = res[res.Count - 1].Down - res[res.Count - 1].Up;
}
return res;
}
private List<Layer> DownW(Bore bore)
{
List<Layer> layers = new List<Layer>(bore.Layers.Reverse());
List<Layer> res = new List<Layer>();
foreach (Layer item in layers)
{
if (item.Down <= bore.WL) break;
if (item.IGE.W) item.IGE.RoII = (item.IGE.Ys - 1) / (1 + item.IGE.Ke);
res.Add(item.Clone());
}
if (res.Count > 0)
{
res.Reverse();
res[0].Up = (double)bore.WL;
res[0].H = res[0].Down - res[0].Up;
}
return res;
}
private List<Layer> DownFS(Bore bore)
{
List<Layer> res = new List<Layer>();
double FL;
if (Basement) FL = Hs + Hcf + Db;
else FL = D1;
Bore boreW = BoreW(bore);
if (boreW.Layers.Count == 0) return res;
foreach (Layer item in boreW.Layers.Reverse())
{
if (item.Down < FL) break;
res.Add(item.Clone());
}
if (res.Count > 0) res.Reverse();
res[0].Up = FL;
res[0].H = res[0].Down - res[0].Up;
return res;
}
private Bore BoreW(Bore bore)
{
Bore res = new Bore
{
Name = bore.Name,
Number = bore.Number,
WL = bore.WL,
X = bore.X,
Y = bore.Y,
Z = bore.Z
};
List<Layer> downW = DownW(bore);
List<Layer> layers = new List<Layer>(UpW(bore));
if (downW.Count > 0) layers.AddRange(downW);
if (layers.Count > 0)
{
res.Layers = new ObservableCollection<Layer>(layers);
res.Layers[res.Layers.Count - 1].Down = res.Layers[res.Layers.Count - 1].Down + bore.DZ;
res.Layers[res.Layers.Count - 1].H = res.Layers[res.Layers.Count - 1].H + bore.DZ;
res.Layers[res.Layers.Count - 1].Z = res.Layers[res.Layers.Count - 1].Z - bore.DZ;
return res;
}
else
{
bore.Layers[bore.Layers.Count - 1].Down = bore.Layers[bore.Layers.Count - 1].Down + bore.DZ;
bore.Layers[bore.Layers.Count - 1].H = bore.Layers[bore.Layers.Count - 1].H + bore.DZ;
bore.Layers[bore.Layers.Count - 1].Z = bore.Layers[bore.Layers.Count - 1].Z - bore.DZ;
return bore;
}
}
internal void CalcDL(Structure str)
{
if (str == null || str.RedPlanning == null || str.RedPlanning.Count == 0) return;
List<Vertex> vrtxs = new List<Vertex>();
Vertex vrtx;
int i = 1;
foreach (PlanningVertex item in str.RedPlanning)
{
vrtx = new Vertex(item.X, item.Y, item.Number, 2);
vrtx.Attributes[0] = item.Red;
vrtx.Attributes[1] = item.Black;
vrtxs.Add(vrtx);
i++;
}
Contour cnt = new Contour(vrtxs);
TriangleNet.Geometry.Polygon polygon = new TriangleNet.Geometry.Polygon();
polygon.Add(cnt);
GenericMesher mesher = new GenericMesher();
ConstraintOptions constraint = new ConstraintOptions();
constraint.Convex = true;
Mesh meshPlanning = (Mesh)mesher.Triangulate(polygon, constraint);
TriangleQuadTree meshTree = new TriangleQuadTree(meshPlanning);
TriangleNet.Topology.Triangle trgl = (TriangleNet.Topology.Triangle)meshTree.Query(X, Y);
if (trgl == null)
{
Dictionary<Vertex, double> valuePairs = new Dictionary<Vertex, double>();
Line2d ln;
foreach (Vertex item in meshPlanning.Vertices)
{
ln = new Line2d(new Point2d(X, Y), new Point2d(item.X, item.Y));
valuePairs.Add(item, ln.Length);
}
IOrderedEnumerable<KeyValuePair<Vertex, double>> selected = from v in valuePairs // определяем каждый объект как
orderby v.Value // упорядочиваем по возрастанию
select v; // выбираем объект
List<KeyValuePair<Vertex, double>> lst = selected.ToList();
foreach (TriangleNet.Topology.Triangle item in meshPlanning.Triangles)
{
if (item.Contains(lst[0].Key) && item.Contains(lst[1].Key)) { trgl = item; break; }
}
}
vrtx = new Vertex(X, Y, Number, 2);
Interpolation.InterpolateAttributes(vrtx, trgl, 1);
DL = Math.Round(vrtx.Attributes[0], 3);
}
internal void CalcDL(Mesh planningMesh)
{
if (planningMesh == null) return;
Vertex vrtx;
TriangleQuadTree meshTree = new TriangleQuadTree(planningMesh);
TriangleNet.Topology.Triangle trgl = (TriangleNet.Topology.Triangle)meshTree.Query(X, Y);
if (trgl == null)
{
Dictionary<Vertex, double> valuePairs = new Dictionary<Vertex, double>();
Line2d ln;
foreach (Vertex item in planningMesh.Vertices)
{
ln = new Line2d(new Point2d(X, Y), new Point2d(item.X, item.Y));
valuePairs.Add(item, ln.Length);
}
IOrderedEnumerable<KeyValuePair<Vertex, double>> selected = from v in valuePairs // определяем каждый объект как
orderby v.Value // упорядочиваем по возрастанию
select v; // выбираем объект
List<KeyValuePair<Vertex, double>> lst = selected.ToList();
foreach (TriangleNet.Topology.Triangle item in planningMesh.Triangles)
{
if (item.Contains(lst[0].Key) && item.Contains(lst[1].Key)) { trgl = item; break; }
}
}
vrtx = new Vertex(X, Y, Number, 2);
Interpolation.InterpolateAttributes(vrtx, trgl, 1);
DL = Math.Round(vrtx.Attributes[0], 3);
}
internal void CalcNL(Mesh blackMesh)
{
if (blackMesh == null) return;
Vertex vrtx;
TriangleQuadTree meshTree = new TriangleQuadTree(blackMesh);
TriangleNet.Topology.Triangle trgl = (TriangleNet.Topology.Triangle)meshTree.Query(X, Y);
if (trgl == null)
{
Dictionary<Vertex, double> valuePairs = new Dictionary<Vertex, double>();
Line2d ln;
foreach (Vertex item in blackMesh.Vertices)
{
ln = new Line2d(new Point2d(X, Y), new Point2d(item.X, item.Y));
valuePairs.Add(item, ln.Length);
}
IOrderedEnumerable<KeyValuePair<Vertex, double>> selected = from v in valuePairs // определяем каждый объект как
orderby v.Value // упорядочиваем по возрастанию
select v; // выбираем объект
List<KeyValuePair<Vertex, double>> lst = selected.ToList();
foreach (TriangleNet.Topology.Triangle item in blackMesh.Triangles)
{
if (item.Contains(lst[0].Key) && item.Contains(lst[1].Key)) { trgl = item; break; }
}
}
vrtx = new Vertex(X, Y, Number, 2);
Interpolation.InterpolateAttributes(vrtx, trgl, 1);
NL = Math.Round(vrtx.Attributes[0], 3);
}
internal void DLtoD1(double nullLevel)
{
double dlt = nullLevel - DL;
D1 = Math.Round(-FL - dlt, 3);
}
internal void D1toDL(double nullLevel)
{
DL = Math.Round(nullLevel + FL + D1, 3);
}
internal void D1toFL(double nullLevel)
{
double dlt = nullLevel - DL;
FL = Math.Round(-dlt - D1, 3);
}
internal void FLtoD1(double nullLevel)
{
double dlt = nullLevel + FL;
D1 = Math.Round(DL - dlt, 3);
}
internal string PropsToString()
{
string s = ";";
return Number + s + Name + s + (int)Type + s + Basement + s + B + s + L + s + H + s + Db + s + D1 + s + Hs + s + Hcf + s + Ycf + s + X + s + Y + s + FL
+ s + DL + s + NL + s + AlfaDeg;
}
internal List<object> PropsToList()
{
return new List<object> { Number, Name, (int)Type, Basement, B, L, H, Db, D1, Hs, Hcf, Ycf, X, Y, FL, DL, NL, AlfaDeg };
}
internal void StringToProps(string line, char separator = ';')
{
string[] src = line.Split(separator);
try
{
Number = Int32.Parse(src[0]);
Name = src[1];
Type = (TypeFound)Int32.Parse(src[2]);
Basement = bool.Parse(src[3]);
B = double.Parse(src[4]);
L = double.Parse(src[5]);
H = double.Parse(src[6]);
Db = double.Parse(src[7]);
D1 = double.Parse(src[8]);
Hs = double.Parse(src[9]);
Hcf = double.Parse(src[10]);
Ycf = double.Parse(src[11]);
X = double.Parse(src[12]);
Y = double.Parse(src[13]);
FL = double.Parse(src[14]);
DL = double.Parse(src[15]);
NL = double.Parse(src[16]);
AlfaDeg = double.Parse(src[17]);
}
catch
{
return;
}
}
internal void ListToProps(List<object> src)
{
try
{
Number = (int)(double)src[0];
Name = (string)src[1];
Type = (TypeFound)(int)(double)src[2];
Basement = (bool)src[3];
B = (double)src[4];
L = (double)src[5];
H = (double)src[6];
Db = (double)src[7];
D1 = (double)src[8];
Hs = (double)src[9];
Hcf = (double)src[10];
Ycf = (double)src[11];
X = (double)src[12];
Y = (double)src[13];
FL = (double)src[14];
DL = (double)src[15];
NL = (double)src[16];
AlfaDeg = (double)src[17];
}
catch
{
return;
}
}
internal void CalcLevels(Mesh planningMesh, Mesh blackMesh)
{
CalcDL(planningMesh);
CalcNL(blackMesh);
}
public void CopyProps(IEnumerable<Foundation> founds)
{
foreach (Foundation item in founds)
{
if (this.Equals(item)) continue;
item.Name = Name;
item.B = B;
item.L = L;
item.H = H;
item.FL = FL;
item.DL = DL;
item.D1 = D1;
item.Loads = Loads;
}
}
internal void CalcContour()
{
if (Type == TypeFound.Круглый) return;
Point2d v1 = new Point2d(-0.5 * B, -0.5 * L);
Point2d v2 = new Point2d(-0.5 * B, 0.5 * L);
Point2d v3 = new Point2d(0.5 * B, 0.5 * L);
Point2d v4 = new Point2d(0.5 * B, -0.5 * L);
double alfa = DegToRad(AlfaDeg);
double x = v1.X; double y = v1.Y;
v1.X = x * Math.Cos(alfa) - y * Math.Sin(alfa) + X;
v1.Y = x * Math.Sin(alfa) + y * Math.Cos(alfa) + Y;
x = v2.X; y = v2.Y;
v2.X = x * Math.Cos(alfa) - y * Math.Sin(alfa) + X;
v2.Y = x * Math.Sin(alfa) + y * Math.Cos(alfa) + Y;
x = v3.X; y = v3.Y;
v3.X = x * Math.Cos(alfa) - y * Math.Sin(alfa) + X;
v3.Y = x * Math.Sin(alfa) + y * Math.Cos(alfa) + Y;
x = v4.X; y = v4.Y;
v4.X = x * Math.Cos(alfa) - y * Math.Sin(alfa) + X;
v4.Y = x * Math.Sin(alfa) + y * Math.Cos(alfa) + Y;
Contour = new Quadrangle(v1, v2, v3, v4);
}
private double RadToDeg(double radians)
{
return radians * 180 / Math.PI;
}
private double DegToRad(double degries)
{
return degries * Math.PI / 180;
}
}
}

168
BL/IGE.cs Normal file
View File

@@ -0,0 +1,168 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public class IGE
{
private string groundType;
public int Number { get; set; }
/// <summary>
/// Номер иженерно-геологического элемента
/// </summary>
public string NumIGE { get; set; }
/// <summary>
/// Тип грунта согласно таблицы 5.4 СП 22.13330.2011
/// </summary>
public string GroundType { get => groundType; set { groundType = value; ChangeTypeGroundIdx(); } }
/// <summary>
/// Плотность грунта для расчетов по 2-й группе предельных сосотояний
/// </summary>
public double RoII { get; set; }
/// <summary>
/// Угол внутреннего трения грунта в градусах для расчетов по 2-й группе предельных сосотояний
/// </summary>
public double FiII { get; set; }
/// <summary>
/// Удельное сцепление для расчетов по 2-й группе предельных сосотояний
/// </summary>
public double CII { get; set; }
/// <summary>
/// Модуль деформации грунта
/// </summary>
public double E { get; set; }
/// <summary>
/// Удельный вес частиц (минеральной части) грунта
/// </summary>
public double Ys { get; set; }
/// <summary>
/// Коэффициент пористости
/// </summary>
public double Ke { get; set; }
/// <summary>
///Показатель текучести
/// </summary>
public double IL { get; set; }
/// <summary>
/// Наличие водонасыщения
/// </summary>
public bool W { get; set; }
/// <summary>
/// Описание слоя грунта
/// </summary>
public string Description { get; set; }
public int GroundTypeIdx { get; private set; }
/// <summary>
/// Типы грунтов согласно таблицы 5.4 СП 22.13330.2011
/// </summary>
private readonly string[] groundTypes = new string[]
{
"Крупнообломочные с песчаным заполнителем и пески кроме мелких и пылеватых",
"Пески мелкие",
"Пески пылеватые маловлажные",
"Пески пылеватые влажные насыщенные водой",
"Пески рыхлые",
"Глинистые, а также крупнообломочные с глинистым заполнителем при IL<=0.25",
"Глинистые, а также крупнообломочные с глинистым заполнителем при 0.25<IL<=0.5",
"Глинистые, а также крупнообломочные с глинистым заполнителем при 0.5<IL"
};
public IGE Clone()
{
return new IGE()
{
Number=Number,
NumIGE=NumIGE,
GroundType = GroundType,
RoII = RoII,
FiII = FiII,
CII = CII,
E = E,
Ys = Ys,
Ke = Ke,
IL = IL,
W = W,
Description = Description
};
}
void ChangeTypeGroundIdx()
{
int i = 1;
foreach (string item in groundTypes)
{
if (item == groundType)
{
GroundTypeIdx = i;
break;
}
i++;
}
}
internal string PropsToString()
{
string s = ";";
return Number.ToString() + s + NumIGE + s + Description + s + RoII.ToString() + s + FiII.ToString() + s + CII.ToString() + s + E.ToString() +
s + Ys.ToString() + s + Ke.ToString() + s + IL.ToString() + s + W.ToString() + s + GroundType + s + GroundTypeIdx.ToString();
}
internal List<object> PropsToList()
{
return new List<object> { Number, NumIGE, Description, RoII, FiII, CII, E, Ys, Ke, IL, W, GroundType, GroundTypeIdx };
}
internal void StringToProps(string line, char separator = ';')
{
string[] src = line.Split(separator);
try
{
Number = Int32.Parse(src[0]);
NumIGE = src[1];
Description = src[2];
RoII = double.Parse(src[3]);
FiII = double.Parse(src[4]);
CII = double.Parse(src[5]);
E = double.Parse(src[6]);
Ys = double.Parse(src[7]);
Ke = double.Parse(src[8]);
IL = double.Parse(src[9]);
W = bool.Parse(src[10]);
GroundType = src[11];
}
catch
{
return;
}
}
internal void ListToProps(List<object> src)
{
try
{
Number = (int)(double)src[0];
NumIGE = (string)src[1];
Description = (string)src[2];
RoII = (double)src[3];
FiII = (double)src[4];
CII = (double)src[5];
E = (double)src[6];
Ys = (double)src[7];
Ke = (double)src[8];
IL = (double)src[9];
W = (bool)src[10];
GroundType = (string)src[11];
}
catch
{
return;
}
}
}
}

96
BL/Layer.cs Normal file
View File

@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public class Layer
{
public int Number { get; set; }
public string NumIGE { get; set; }
public IGE IGE { get; set; }
/// <summary>
///Относительная отметка верхней границы слоя относительно устья скважины
/// </summary>
public double Up { get; set; }
/// <summary>
///Относительная отметка нижней границы слоя относительно устья скважины
/// </summary>
public double Down { get; set; }
/// <summary>
///Мощность слоя
/// </summary>
public double H { get; set; }
/// <summary>
///Абсолютная отметка подошвы слоя
/// </summary>
public double Z { get; set; }
/// <summary>
/// Описание слоя грунта
/// </summary>
public string Description { get; set; }
public Layer Clone()
{
return new Layer()
{
Number = this.Number,
NumIGE = this.NumIGE,
IGE = this.IGE,
Up = this.Up,
Down = this.Down,
H = this.H,
Z = this.Z,
Description = this.Description
};
}
internal string PropsToString()
{
string s = ";";
return Number + s + NumIGE + s + Down + s + H + s + Z;
}
internal List<object> PropsToList()
{
return new List<object> { Number, NumIGE, Down, H, Z };
}
internal void StringToProps(string line, char separator = ';')
{
string[] src = line.Split(separator);
try
{
Number = Int32.Parse(src[0]);
NumIGE = src[1];
Down = double.Parse(src[2]);
H = double.Parse(src[3]);
Z = double.Parse(src[4]);
}
catch
{
return;
}
}
internal void ListToProps(List<object> src)
{
try
{
Number = (int)(double)src[0];
NumIGE = (string)src[1];
Down = (double)src[2];
H = (double)src[3];
Z = (double)src[4];
}
catch
{
return;
}
}
}
}

39
BL/PlanningVertex.cs Normal file
View File

@@ -0,0 +1,39 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public class PlanningVertex : Geo.Point3d
{
public int Number { get; set; }
public double Red { get; set; }
public double Black { get; set; }
internal string PropsToString()
{
string s = ";";
return Number + s + X + s + Y + s + Red + s + Black;
}
internal void StringToProps(string line, char separator = ';')
{
string[] src = line.Split(separator);
try
{
Number = Int32.Parse(src[0]);
X = double.Parse(src[1]);
Y = double.Parse(src[2]);
Red = double.Parse(src[3]);
Black = double.Parse(src[4]);
}
catch
{
return;
}
}
}
}

69
BL/PlayGround.cs Normal file
View File

@@ -0,0 +1,69 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public class PlayGround
{
public string Description { get; set; }
public int Number { get; set; }
public string Name { get; set; }
public ObservableCollection<IGE> IGEs { get; private set; }
public ObservableCollection<Bore> Bores { get; private set; }
public ObservableCollection<Structure> Structures { get; private set; }
public PlayGround()
{
IGEs = new ObservableCollection<IGE>();
Bores = new ObservableCollection<Bore>();
Structures = new ObservableCollection<Structure>();
}
public void AddIGE(IGE ige)
{
if (IGEs == null) IGEs = new ObservableCollection<IGE>();
IGEs.Add(ige);
}
public void AddIGEs(ObservableCollection<IGE> iges)
{
IGEs = iges;
}
public void AddIGEs(List<IGE> iges)
{
if (IGEs == null) IGEs = new ObservableCollection<IGE>();
foreach (var item in iges) IGEs.Add(item);
}
public void AddBore(Bore bore)
{
if (Bores == null) Bores = new ObservableCollection<Bore>();
Bores.Add(bore);
}
public void AddBores(ObservableCollection<Bore> bores)
{
Bores = bores;
}
public void AddBores(List<Bore> bores)
{
if (Bores == null) Bores = new ObservableCollection<Bore>();
foreach (var item in bores) Bores.Add(item);
}
public void DeleteBores()
{
Bores = new ObservableCollection<Bore>();
}
public void DeleteIGEs()
{
IGEs = new ObservableCollection<IGE>();
}
}
}

30
BL/Structure.cs Normal file
View File

@@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
public class Structure
{
public TypeFlexStructure flexStructure { get; set; }
public double L { get; set; }
public double H { get; set; }
public double Null { get; set; }
public int Number { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public ObservableCollection<Foundation> Foundations { get; set; }
public ObservableCollection<PlanningVertex> RedPlanning { get; set; }
public ObservableCollection<PlanningVertex> BlackPlanning { get; set; }
public Structure()
{
Foundations = new ObservableCollection<Foundation>();
RedPlanning = new ObservableCollection<PlanningVertex>();
BlackPlanning = new ObservableCollection<PlanningVertex>();
}
}
}

415
BL/TablesInterolator.cs Normal file
View File

@@ -0,0 +1,415 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Geo;
namespace GroundOrganizer
{
public struct My_Mq_Mc
{
public double My;
public double Mq;
public double Mc;
Dictionary<double, double[]> table_5_5;
public My_Mq_Mc(double fi)
{
table_5_5 = new Dictionary<double, double[]>
{
{0,new double[]{0,1,3.14}},
{1,new double[]{0.01,1.06,3.23}},
{2,new double[]{0.03,1.12,3.32}},
{3,new double[]{0.04,1.18,3.41}},
{4,new double[]{0.06,1.25,3.51}},
{5,new double[]{0.08,1.32,3.61}},
{6,new double[]{0.1,1.39,3.71}},
{7,new double[]{0.12,1.47,3.82}},
{8,new double[]{0.14,1.55,3.93}},
{9,new double[]{0.16,1.64,4.05}},
{10,new double[]{0.18,1.73,4.17}},
{11,new double[]{0.21,1.83,4.29}},
{12,new double[]{0.23,1.94,4.42}},
{13,new double[]{0.26,2.05,4.55}},
{14,new double[]{0.29,2.17,4.69}},
{15,new double[]{0.32,2.3,4.84}},
{16,new double[]{0.36,2.43,4.99}},
{17,new double[]{0.39,2.57,5.15}},
{18,new double[]{0.43,2.73,5.31}},
{19,new double[]{0.47,2.89,5.48}},
{20,new double[]{0.51,3.06,5.66}},
{21,new double[]{0.56,3.24,5.84}},
{22,new double[]{0.61,3.44,6.04}},
{23,new double[]{0.66,3.65,6.24}},
{24,new double[]{0.72,3.87,6.45}},
{25,new double[]{0.78,4.11,6.67}},
{26,new double[]{0.84,4.37,6.9}},
{27,new double[]{0.91,4.64,7.14}},
{28,new double[]{0.98,4.93,7.4}},
{29,new double[]{1.06,5.25,7.67}},
{30,new double[]{1.15,5.59,7.95}},
{31,new double[]{1.24,5.95,8.24}},
{32,new double[]{1.34,6.34,8.55}},
{33,new double[]{1.44,6.76,8.88}},
{34,new double[]{1.55,7.22,9.22}},
{35,new double[]{1.68,7.71,9.58}},
{36,new double[]{1.81,8.24,9.97}},
{37,new double[]{1.95,8.81,10.37}},
{38,new double[]{2.11,9.44,10.8}},
{39,new double[]{2.28,10.11,11.25}},
{40,new double[]{2.46,10.85,11.73}},
{41,new double[]{2.66,11.64,12.24}},
{42,new double[]{2.88,12.51,12.79}},
{43,new double[]{3.12,13.46,13.37}},
{44,new double[]{3.38,14.5,13.98}},
{45,new double[]{3.66,15.64,14.64}}
};
My= table_5_5[fi][0];
Mq = table_5_5[fi][1];
Mc = table_5_5[fi][2];
}
}
public class TablesInterolator
{
static readonly Dictionary<double, double[]> table_5_5 = new Dictionary<double, double[]>
{
{0,new double[]{0,1,3.14}},
{1,new double[]{0.01,1.06,3.23}},
{2,new double[]{0.03,1.12,3.32}},
{3,new double[]{0.04,1.18,3.41}},
{4,new double[]{0.06,1.25,3.51}},
{5,new double[]{0.08,1.32,3.61}},
{6,new double[]{0.1,1.39,3.71}},
{7,new double[]{0.12,1.47,3.82}},
{8,new double[]{0.14,1.55,3.93}},
{9,new double[]{0.16,1.64,4.05}},
{10,new double[]{0.18,1.73,4.17}},
{11,new double[]{0.21,1.83,4.29}},
{12,new double[]{0.23,1.94,4.42}},
{13,new double[]{0.26,2.05,4.55}},
{14,new double[]{0.29,2.17,4.69}},
{15,new double[]{0.32,2.3,4.84}},
{16,new double[]{0.36,2.43,4.99}},
{17,new double[]{0.39,2.57,5.15}},
{18,new double[]{0.43,2.73,5.31}},
{19,new double[]{0.47,2.89,5.48}},
{20,new double[]{0.51,3.06,5.66}},
{21,new double[]{0.56,3.24,5.84}},
{22,new double[]{0.61,3.44,6.04}},
{23,new double[]{0.66,3.65,6.24}},
{24,new double[]{0.72,3.87,6.45}},
{25,new double[]{0.78,4.11,6.67}},
{26,new double[]{0.84,4.37,6.9}},
{27,new double[]{0.91,4.64,7.14}},
{28,new double[]{0.98,4.93,7.4}},
{29,new double[]{1.06,5.25,7.67}},
{30,new double[]{1.15,5.59,7.95}},
{31,new double[]{1.24,5.95,8.24}},
{32,new double[]{1.34,6.34,8.55}},
{33,new double[]{1.44,6.76,8.88}},
{34,new double[]{1.55,7.22,9.22}},
{35,new double[]{1.68,7.71,9.58}},
{36,new double[]{1.81,8.24,9.97}},
{37,new double[]{1.95,8.81,10.37}},
{38,new double[]{2.11,9.44,10.8}},
{39,new double[]{2.28,10.11,11.25}},
{40,new double[]{2.46,10.85,11.73}},
{41,new double[]{2.66,11.64,12.24}},
{42,new double[]{2.88,12.51,12.79}},
{43,new double[]{3.12,13.46,13.37}},
{44,new double[]{3.38,14.5,13.98}},
{45,new double[]{3.66,15.64,14.64}}
};
static readonly Dictionary<string, double[]> table_5_4 = new Dictionary<string, double[]>
{
{"Крупнообломочные с песчаным заполнителем и пески кроме мелких и пылеватых", new double[]{1.4, 1.2, 1.4} },
{"Пески мелкие", new double[]{1.3, 1.1, 1.3} },
{"Пески пылеватые маловлажные", new double[]{1.25, 1.0, 1.2} },
{"Пески пылеватые влажные насыщенные водой", new double[]{1.1, 1.0, 1.2} },
{"Пески рыхлые", new double[]{1.0, 1.0, 1.0} },
{"Глинистые, а также крупнообломочные с глинистым заполнителем при IL<=0.25", new double[]{1.25, 1.0, 1.1} },
{"Глинистые, а также крупнообломочные с глинистым заполнителем при 0.25<IL<=0.5", new double[]{1.2, 1.0, 1.1} },
{"Глинистые, а также крупнообломочные с глинистым заполнителем при 0.5<IL", new double[]{1.1, 1.0, 1.0} },
};
static readonly double[,] table_5_8_R =
{
{ 1, 1, 1, 1, 1, 1, 1 },
{ 0.96, 0.972, 0.975, 0.976, 0.977, 0.977, 0.977 },
{ 0.8, 0.848, 0.866, 0.876, 0.879, 0.881, 0.881 },
{ 0.606, 0.682, 0.717, 0.739, 0.749, 0.754, 0.755 },
{ 0.449, 0.532, 0.578, 0.612, 0.629, 0.639, 0.642 },
{ 0.336, 0.414, 0.463, 0.505, 0.53, 0.545, 0.55 },
{ 0.257, 0.325, 0.374, 0.419, 0.449, 0.47, 0.477 },
{ 0.201, 0.26, 0.304, 0.349, 0.383, 0.41, 0.42 },
{ 0.16, 0.21, 0.251, 0.294, 0.329, 0.36, 0.374 },
{ 0.131, 0.173, 0.209, 0.25, 0.285, 0.319, 0.337 },
{ 0.108, 0.145, 0.176, 0.214, 0.248, 0.285, 0.306 },
{ 0.091, 0.123, 0.15, 0.185, 0.218, 0.255, 0.28 },
{ 0.077, 0.105, 0.13, 0.161, 0.192, 0.23, 0.258 },
{ 0.067, 0.091, 0.113, 0.141, 0.17, 0.208, 0.239 },
{ 0.058, 0.079, 0.099, 0.124, 0.152, 0.189, 0.223 },
{ 0.051, 0.07, 0.087, 0.11, 0.136, 0.173, 0.208 },
{ 0.045, 0.062, 0.077, 0.099, 0.122, 0.158, 0.196 },
{ 0.04, 0.055, 0.069, 0.088, 0.11, 0.145, 0.185 },
{ 0.036, 0.049, 0.062, 0.08, 0.1, 0.133, 0.175 },
{ 0.032, 0.044, 0.056, 0.072, 0.091, 0.123, 0.166 },
{ 0.029, 0.04, 0.051, 0.066, 0.084, 0.113, 0.158 },
{ 0.026, 0.037, 0.046, 0.06, 0.077, 0.105, 0.15 },
{ 0.024, 0.033, 0.042, 0.055, 0.071, 0.098, 0.143 },
{ 0.022, 0.031, 0.039, 0.051, 0.065, 0.091, 0.137 },
{ 0.02, 0.028, 0.036, 0.047, 0.06, 0.085, 0.132 },
{ 0.019, 0.026, 0.033, 0.043, 0.056, 0.079, 0.126 },
{ 0.017, 0.024, 0.031, 0.04, 0.052, 0.074, 0.122 },
{ 0.016, 0.022, 0.029, 0.037, 0.049, 0.069, 0.117 },
{ 0.015, 0.021, 0.027, 0.035, 0.045, 0.065, 0.113 },
{ 0.014, 0.02, 0.025, 0.033, 0.042, 0.061, 0.109 },
{ 0.013, 0.018, 0.023, 0.031, 0.04, 0.058, 0.106 },
};
static readonly double[] table_5_8_C =
{
1, 0.949, 0.756, 0.547, 0.39, 0.285, 0.214, 0.165, 0.13,
0.106, 0.087, 0.073, 0.062, 0.053, 0.046, 0.04, 0.036,
0.031, 0.028, 0.024, 0.022, 0.021, 0.019, 0.017,
0.016, 0.015, 0.014, 0.013, 0.012, 0.011, 0.01
};
static readonly double[] table_5_8_L =
{
1,0.977,0.881,0.755,0.642,0.55,0.477,0.42,0.374,0.337,
0.306,0.28,0.258,0.239,0.223,0.208,0.196,0.185,0.175,
0.166,0.158,0.15,0.143,0.137,0.132,0.126,0.122,0.117,0.113,0.109,0.106
};
static readonly double[] table_5_8_ksi =
{
0,0.4,0.8,1.2,1.6,2,2.4,2.8,3.2,3.6,4,
4.4,4.8,5.2,5.6,6,6.4,6.8,7.2,7.6,8,8.4,
8.8,9.2,9.6,10,10.4,10.8,11.2,11.6,12
};
static readonly double[] table_5_8_nu = { 1, 1.4, 1.8, 2.4, 3.2, 5, 10 };
public static double[] My_Mq_Mc(double fi)
{
return table_5_5[fi];
}
public static double Yc1(string ground)
{
return table_5_4[ground][0];
}
public static double Yc2(string ground, TypeFlexStructure flex = TypeFlexStructure.Гибкая, double L = 0, double H = 1)
{
if (flex == TypeFlexStructure.Гибкая) return 1;
double Yc21 = table_5_4[ground][1];
double Yc22 = table_5_4[ground][2];
Geo.Line2d interpolant = new Geo.Line2d(new Geo.Point2d(4, Yc21), new Geo.Point2d(1.5, Yc22));
if (L / H < 4 && L / H > 1.5) return interpolant.Interpolation(L / H);
else if (L / H >= 4) return Yc21;
else return Yc22;
}
public static double? table_5_8(double z, double b, double l, TypeFound typeFound = TypeFound.Прямоугольный, PointFound ptFound = PointFound.Центр)
{
double nu, ksi;
if (ptFound == PointFound.Центр) ksi = 2 * z / b;
else ksi = z / b;
if (typeFound == TypeFound.Прямоугольный && l / b < 10)
{
nu = l / b;
return BilinearInterpolation(table_5_8_ksi, table_5_8_nu, table_5_8_R, ksi, nu);
}
if (typeFound == TypeFound.Ленточный || l / b >= 10)
{
return LinearInterpolation(table_5_8_ksi, table_5_8_L, ksi);
}
if (typeFound == TypeFound.Круглый)
{
return LinearInterpolation(table_5_8_ksi, table_5_8_C, ksi);
}
return null;
}
public static List<double?> Table_5_8(List<double> z, double b, double l, TypeFound typeFound = TypeFound.Прямоугольный, PointFound ptFound = PointFound.Центр)
{
List<double?> res = new List<double?>();
double nu, ksi;
foreach (double item in z)
{
if (ptFound == PointFound.Центр) ksi = 2 * item / b;
else ksi = item / b;
if (typeFound == TypeFound.Прямоугольный && l / b < 10)
{
nu = l / b;
res.Add(BilinearInterpolation(table_5_8_ksi, table_5_8_nu, table_5_8_R, ksi, nu));
}
if (typeFound == TypeFound.Ленточный || l / b >= 10)
{
res.Add(LinearInterpolation(table_5_8_ksi, table_5_8_L, ksi));
}
if (typeFound == TypeFound.Круглый)
{
res.Add(LinearInterpolation(table_5_8_ksi, table_5_8_C, ksi));
}
}
return res;
}
static double? LinearInterpolation(double[] x, double[] y, double xval)
{
double? zval = null;
Line2d interpolant;
int lx = x.Length;
int ly = y.Length;
if (lx < 2 || ly < 2) return zval;
if (lx != ly) return zval;
for (int i = 0; i < lx - 1; i++)
{
if (xval >= x[i] && xval < x[i + 1])
{
interpolant = new Line2d(new Point2d(x[i], y[i]), new Point2d(x[i + 1], y[i + 1]));
return interpolant.Interpolation(xval);
}
if (xval < x[0])
{
interpolant = new Line2d(new Point2d(x[0], y[0]), new Point2d(x[1], y[1]));
return interpolant.Interpolation(xval);
}
if (xval >= x[lx - 1])
{
interpolant = new Line2d(new Point2d(x[lx - 2], y[lx - 2]), new Point2d(x[lx - 1], y[lx - 1]));
return interpolant.Interpolation(xval);
}
}
return zval;
}
static double? BilinearInterpolation(double[] x, double[] y, double[,] z, double xval, double yval)
{
//calculates single point bilinear interpolation
double? zval = null;
Plane interpolant;
int lx = x.Length;
int ly = y.Length;
if (lx < 2 || ly < 2 || z.Length < 4) return zval;
if (lx !=z.GetLength(0)) return zval;
if (ly !=z.GetLength(1)) return zval;
for (int i = 0; i < lx - 1; i++)
{
for (int j = 0; j < ly - 1; j++)
{
if (xval >= x[i] && xval < x[i + 1] && yval >= y[j] && yval < y[j + 1])
{
interpolant = new Plane(
new Point3d(x[i], y[j], z[i, j]),
new Point3d(x[i + 1], y[j], z[i + 1, j]),
new Point3d(x[i], y[j + 1], z[i, j + 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval >= x[lx-1] && yval >= y[j] && yval < y[j + 1])
{
interpolant = new Plane(
new Point3d(x[lx - 2], y[j], z[lx - 2, j]),
new Point3d(x[lx - 1], y[j], z[lx - 1, j]),
new Point3d(x[lx - 2], y[j + 1], z[lx - 2, j + 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval < x[0] && yval >= y[j] && yval < y[j + 1])
{
interpolant = new Plane(
new Point3d(x[0], y[j], z[0, j]),
new Point3d(x[1], y[j], z[1, j]),
new Point3d(x[0], y[j + 1], z[0, j + 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval >= x[i] && xval < x[i + 1] && yval >= y[ly-1])
{
interpolant = new Plane(
new Point3d(x[i], y[ly - 2], z[i, ly - 2]),
new Point3d(x[i + 1], y[ly - 2], z[i + 1, ly - 2]),
new Point3d(x[i], y[ly - 1], z[i, ly - 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval >= x[i] && xval < x[i + 1] && yval < y[0])
{
interpolant = new Plane(
new Point3d(x[i], y[0], z[i, 0]),
new Point3d(x[i + 1], y[0], z[i + 1, 0]),
new Point3d(x[i], y[1], z[i, 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval < x[0] && yval < y[0])
{
interpolant = new Plane(
new Point3d(x[0], y[0], z[0, 0]),
new Point3d(x[1], y[0], z[1, 0]),
new Point3d(x[0], y[1], z[0, 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval >= x[lx-1] && yval < y[0])
{
interpolant = new Plane(
new Point3d(x[lx - 2], y[0], z[lx - 2, 0]),
new Point3d(x[lx - 1], y[0], z[lx - 1, 0]),
new Point3d(x[lx - 2], y[1], z[lx - 2, 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval < x[0] && yval >= y[ly-1])
{
interpolant = new Plane(
new Point3d(x[0], y[ly - 2], z[0, ly - 2]),
new Point3d(x[0], y[ly - 1], z[0, ly - 1]),
new Point3d(x[1], y[ly - 1], z[1, ly - 1])
);
return interpolant.Interpolation(xval, yval);
}
if (xval >= x[lx-1] && yval >= y[ly - 1])
{
interpolant = new Plane(
new Point3d(x[lx - 2], y[ly - 2], z[lx - 2, ly - 2]),
new Point3d(x[lx - 1], y[ly - 2], z[lx - 1, ly - 2]),
new Point3d(x[lx - 2], y[ly - 1], z[lx - 2, ly - 1])
);
return interpolant.Interpolation(xval, yval);
}
}
}
return zval;
}
//double[] BilinearInterpolation(double[] x, double[] y, double[,] z, double[] xvals, double[] yvals)
//{
// //calculates multiple point bilinear interpolation
// double[] zvals = new double[xvals.Length];
// for (int i = 0; i < xvals.Length; i++)
// zvals[i] = BilinearInterpolation(x, y, z, xvals[i], yvals[i]);
// return zvals;
//}
}
}

15
BL/ToSerializ.cs Normal file
View File

@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
[Serializable]
internal class ToSerializ
{
public ObservableCollection<PlayGround> PlayGroundList { get; set; }
}
}

107
Dictionary.xaml Normal file
View File

@@ -0,0 +1,107 @@
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:GroundOrganizer"
xmlns:col="clr-namespace:System.Collections;assembly=mscorlib"
xmlns:sys="clr-namespace:System;assembly=mscorlib">
<col:ArrayList x:Key="GroundTypeArr" >
<sys:String>Крупнообломочные с песчаным заполнителем и пески кроме мелких и пылеватых</sys:String>
<sys:String>Пески мелкие</sys:String>
<sys:String>Пески пылеватые маловлажные</sys:String>
<sys:String>Пески пылеватые влажные насыщенные водой</sys:String>
<sys:String>Пески рыхлые</sys:String>
<sys:String>Глинистые, а также крупнообломочные с глинистым заполнителем при IL&lt;=0.25</sys:String>
<sys:String>Глинистые, а также крупнообломочные с глинистым заполнителем при 0.25&lt;IL&lt;=0.5</sys:String>
<sys:String>Глинистые, а также крупнообломочные с глинистым заполнителем при 0.5&lt;IL</sys:String>
</col:ArrayList>
<Style x:Key="PlayGroundDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="LavenderBlush" />
<Setter Property="AlternatingRowBackground" Value="LavenderBlush" />
</Style>
<Style x:Key="IGEsDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="PaleGoldenrod" />
<Setter Property="AlternatingRowBackground" Value="PaleGoldenrod" />
</Style>
<Style x:Key="BoresDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="LightBlue" />
<Setter Property="AlternatingRowBackground" Value="LightBlue" />
</Style>
<Style x:Key="LayersDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="Moccasin" />
<Setter Property="AlternatingRowBackground" Value="Moccasin" />
</Style>
<Style x:Key="StructuresDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="Azure" />
<Setter Property="AlternatingRowBackground" Value="Azure" />
</Style>
<Style x:Key="RedPlanningDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="LightPink" />
<Setter Property="AlternatingRowBackground" Value="LightPink" />
</Style>
<Style x:Key="BlackPlanningDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="LightGray" />
<Setter Property="AlternatingRowBackground" Value="LightGray" />
</Style>
<Style x:Key="FoundationsDataGridStyle" TargetType="DataGrid" >
<Setter Property="RowBackground" Value="Bisque" />
<Setter Property="AlternatingRowBackground" Value="Bisque" />
</Style>
<Style x:Key="HeaderGridStyle" TargetType="DataGridColumnHeader" >
<!--<Setter Property="HorizontalAlignment" Value="Center" />-->
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<!--<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="0,0,1,0"/>-->
<!--<Setter Property="Width" Value="520"/>-->
</Style>
<Style x:Key="CellGridStyle" TargetType="DataGridCell">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Width" Value=" 80"/>
</Style>
<Style x:Key="RowGridStyle" TargetType="DataGridRow">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>
<Style x:Key="DataGridHeaderStyle" TargetType="DataGridColumnHeader">
<Setter Property="MinHeight" Value="25"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="0,0,1,2"/>
<Setter Property="Background" Value="LightGray"/>
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
<Style x:Key="buttonStyle" TargetType="Button">
<Setter Property="Margin" Value="3"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="MintCream"/>
</Style>
<TextBlock x:Key="ПараметрыЗаголовок" Margin="3">Параметры проекта</TextBlock>
<TextBlock x:Key="ПлощадкиЗаголовок" Margin="3">Площадки</TextBlock>
<TextBlock x:Key="СеченияЗаголовок" Margin="3">Сечения</TextBlock>
<TextBlock x:Key="УсилияЗаголовок" Margin="3">Усилия</TextBlock>
<TextBlock x:Key="АрматураЗаголовок" Margin="3">Арматура</TextBlock>
<TextBlock x:Key="БетонЗаголовок" Margin="3">Бетон</TextBlock>
<TextBlock x:Key="ЭлементыЗаголовок" Margin="3">Элементы</TextBlock>
<TextBlock x:Key="ТрещиностойкостьЗаголовок" Margin="3">Трещиностойкость</TextBlock>
<TextBlock x:Key="РасчетЗаголовок" Margin="3">Расчет</TextBlock>
<TextBlock x:Key="ВыводЗаголовок" Margin="3">Вывод результатов</TextBlock>
<TextBlock x:Key="ЗакреплениеЗаголовок" Text="Условия закрепления концов элемента" FontSize="12" Foreground="Blue"/>
<TextBlock x:Key="ElemTypeGroupBox" FontSize="12" Foreground="Blue">Тип элементов</TextBlock>
<Image x:Key="Иконка1" Source="/Images/Icon1.png"/>
<sys:Double x:Key="rowsHeight">25</sys:Double>
</ResourceDictionary>

31
Geometry/BoundingBox2d.cs Normal file
View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class BoundingBox2d
{
Point2d min;
Point2d max;
public Point2d Min { get => min; private set => min = value; }
public Point2d Max { get => max; private set => max = value; }
public BoundingBox2d()
{
min = new Point2d();
max = new Point2d();
}
public BoundingBox2d(Point2d minPt, Point2d maxPt)
{
min = minPt;
max = maxPt;
}
}
}

9
Geometry/IVector.cs Normal file
View File

@@ -0,0 +1,9 @@
namespace Geo
{
public interface IVector
{
int N { get; }
double[] ToArray();
}
}

96
Geometry/Line2d.cs Normal file
View File

@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Line2d
{
protected Point3d startPoint;
protected Point3d endPoint;
protected Vector2d directive;
protected Vector2d normal;
public Point3d StartPoint { get => startPoint; set { startPoint = value; if (EndPoint != null) { directive = endPoint.ToPoint2d() - startPoint.ToPoint2d(); CalcLine(); }; } }
public Point3d EndPoint { get => endPoint; set { endPoint = value; directive = endPoint.ToPoint2d() - startPoint.ToPoint2d(); CalcLine(); } }
public Point3d CenterPoint { get; private set; }
public Vector2d Directive { get => directive; private set => directive = value; }
public Vector2d Normal { get => normal; private set => normal = value; }
public double A { get; private set; }
public double B { get; private set; }
public double C { get; private set; }
public double k { get; private set; }
public double b { get; private set; }
public double Length { get => Directive.Norma; }
public double cosAlfa { get; private set; }
public double cosBeta { get; private set; }
public double p { get; private set; }
public Line2d()
{
}
public Line2d(Point2d startPt, Point2d endPt)
{
startPoint = startPt.ToPoint3d(); endPoint = endPt.ToPoint3d();
directive = endPoint.ToPoint2d() - startPoint.ToPoint2d();
CalcLine();
}
public Line2d(Point3d startPt, Point3d endPt)
{
startPoint = startPt;
endPoint = endPt;
directive = endPoint.ToPoint2d() - startPoint.ToPoint2d();
CalcLine();
}
protected void CalcLine()
{
A = Directive.Vy;
B = -Directive.Vx;
normal = new Vector2d(A, B);
C = Directive.Vx * StartPoint.Y - Directive.Vy * StartPoint.X;
if (Directive.Vx != 0) { k = Directive.Vy / Directive.Vx; }
else { k = Double.PositiveInfinity; }
if (Directive.Vx != 0) { b = -Directive.Vy / Directive.Vx * StartPoint.X + StartPoint.Y; }
else { b= Double.PositiveInfinity; }
double normC = 1 / Math.Sqrt(A * A + B * B);
if (C < 0) normC *= -1;
cosAlfa = A * normC;
cosBeta = B * normC;
p = C * normC;
double dx = 0.5 * (EndPoint.X - StartPoint.X);
double dy = 0.5 * (EndPoint.Y - StartPoint.Y);
CenterPoint = new Point3d(StartPoint.X + dx, StartPoint.Y + dy, 0);
}
public double LengthTo(Point2d point)
{
double normC = 1 / Math.Sqrt(A * A + B * B);
if (C < 0) normC *= -1;
cosAlfa = A * normC;
cosBeta = B * normC;
p = C * normC;
return normC * (A * point.X + B * point.Y + C);
}
public double LengthTo(Point3d point)
{
double normC = 1 / Math.Sqrt(A * A + B * B);
if (C < 0) normC *= -1;
cosAlfa = A * normC;
cosBeta = B * normC;
p = C * normC;
return normC * (A * point.X + B * point.Y + C);
}
public double Interpolation(double x)
{
if (B == 0) return double.PositiveInfinity;
else return (-A * x - C) / B;
}
}
}

37
Geometry/Line3d.cs Normal file
View File

@@ -0,0 +1,37 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Line3d
{
Point3d startPoint;
Point3d endPoint;
public Point3d StartPoint { get => startPoint; set { startPoint = value; Directive = endPoint - startPoint; } }
public Point3d EndPoint { get => endPoint; set { endPoint = value; Directive = endPoint - startPoint; } }
public Vector3d Directive { get; private set; }
public double Length { get => Directive.Norma; }
public Line3d()
{
}
public Line3d(Point2d startPt, Point2d endPt)
{
startPoint = startPt.ToPoint3d(); endPoint = endPt.ToPoint3d();
Directive = endPoint - startPoint; ;
}
public Line3d(Point3d startPt, Point3d endPt)
{
startPoint = startPt; endPoint = endPt;
Directive = endPoint - startPoint; ;
}
}
}

200
Geometry/Matrix.cs Normal file
View File

@@ -0,0 +1,200 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Matrix
{
double[,] arr;
int m, n;
public int N
{
get
{
if (n > 0)
return n;
else
return -1;
}
}
public int M
{
get
{
if (m > 0)
return m;
else
return -1;
}
}
public double this[int i, int j]
{
get
{
if (n > 0 && m > 0)
if (i > -1 && j > -1)
return arr[i, j];
else
Console.WriteLine("Неверный индексы");
else
Console.WriteLine("Не задана матрица");
return -1;
}
set
{
if (n > 0 && m > 0)
if (i > -1 && j > -1)
arr[i, j] = value;
else
Console.WriteLine("Неверный индексы");
else
Console.WriteLine("Не задана матрица");
}
}
public Matrix(int N, int M)
{
m = M;
n = N;
arr = new double[N, M];
}
public Matrix(Matrix source)
{
m = source.M;
n = source.N;
arr = new double[source.N, source.M];
arr = (double[,])source.arr.Clone();
}
public Matrix(double[,] source)
{
m = source.GetLength(1);
n = source.GetLength(0);
arr = new double[source.GetLength(0), source.GetLength(1)];
arr = (double[,])source.Clone();
}
public double[,] ToArray()
{
return arr;
}
public Matrix Copy()
{
return new Matrix(this);
}
public static Matrix operator ^(Matrix A, Matrix B)
{
if (A.M != B.N) { throw new System.ArgumentException("Не совпадают размерности матриц"); } //Нужно только одно соответствие
Matrix C = new Matrix(A.N, B.M); //Столько же строк, сколько в А; столько столбцов, сколько в B
for (int i = 0; i < A.N; ++i)
{
for (int j = 0; j < B.M; ++j)
{
C[i, j] = 0;
for (int k = 0; k < A.M; ++k)
{ //ТРЕТИЙ цикл, до A.m=B.n
C[i, j] += A[i, k] * B[k, j]; //Собираем сумму произведений
}
}
}
return C;
}
public static Matrix operator *(Matrix A, Matrix B)
{
if (((A.n != B.n) || (A.m != B.m)) == true) { throw new System.ArgumentException("Не совпадают размерности матриц"); }
double[,] res = new double[A.n, B.m];
for (int i = 0; i < A.n; i++)
{
for (int j = 0; j < B.m; j++)
{
res[i, j] = A[i, j] * B[i, j];
}
}
return new Matrix(res);
}
public static Vector operator *(Matrix A, Vector B)
{
if (A.M != B.N) { throw new System.ArgumentException("Не совпадают размерности матриц"); }
double[] res = new double[A.N];
for (int i = 0; i < A.N; i++)
{
for (int j = 0; j < B.N; j++)
{
res[i] += A[i, j] * B[j];
}
}
return new Vector(res);
}
public static Vector3d operator *(Matrix A, Vector3d B)
{
if (A.n != 3 && A.m != 3) { throw new System.ArgumentException("Не верна размерность матрицы"); }
double[] res = new double[3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
res[i] += A[i, j] * B[j];
}
}
return new Vector3d (res);
}
public static Point3d operator *(Matrix A, Point3d B)
{
if (A.n != 3 && A.m != 3) { throw new System.ArgumentException("Не верна размерность матрицы"); }
double[] res = new double[3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
res[i] += A[i, j] * B[j];
}
}
return new Point3d(res);
}
public static Matrix operator *(Matrix A, double B)
{
double[,] res = new double[A.n, A.m];
for (int i = 0; i < A.n; i++)
{
for (int j = 0; j < A.m; j++)
{
res[i, j] = A[i, j] * B;
}
}
return new Matrix(res);
}
public static Matrix operator +(Matrix A, Matrix B)
{
if (((A.n != B.n) || (A.m != B.m)) == true) { throw new System.ArgumentException("Не совпадают размерности матриц"); }
double[,] res = new double[A.n, B.m];
for (int i = 0; i < A.n; i++)
{
for (int j = 0; j < B.m; j++)
{
res[i, j] = A[i, j] + B[i, j];
}
}
return new Matrix(res);
}
}
}

242
Geometry/Plane.cs Normal file
View File

@@ -0,0 +1,242 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Math;
namespace Geo
{
[Serializable]
public class Plane
{
double a;
double b;
double c;
double d;
double gammaRad;
double gammaDeg;
public double A { get => a; set { a = value; CalcPlane(); } }
public double B { get => b; set { b = value; CalcPlane(); } }
public double C { get => c; set { c = value; CalcPlane(); } }
public double D { get => d; set { d = value; CalcPlane(); } }
public double AlfaRad { get; private set; }
public double BetaRad { get; private set; }
public double GammaRad { get => gammaRad; set { gammaRad = value; RadToDeg(); } }
public double AlfaDeg { get; private set; }
public double BetaDeg { get; private set; }
public double GammaDeg { get => gammaDeg; set { gammaDeg = value; DegToRad(); } }
public Matrix MrAlfa { get; private set; }
public Matrix MrBeta { get; private set; }
public Matrix MrGamma { get; private set; }
public Vector3d X1 { get; private set; }
public Vector3d Y1 { get; private set; }
public Vector3d Z1 { get; private set; }
public Vector3d Normal { get; private set; }
public Matrix Mr { get; private set; }
public Point3d Basis { get; set; }
public Plane()
{
Basis = new Point3d() { X = 0, Y = 0, Z = 0 };
a = 0;
b = 0;
c = 1;
d = 0;
CalcPlane();
}
public Plane(Point3d pt1, Point3d pt2, Point3d pt3)
{
Basis = pt1;
Vector3d v1 = new Vector3d()
{
Vx = pt2.X - pt1.X,
Vy = pt2.Y - pt1.Y,
Vz = pt2.Z - pt1.Z
};
Vector3d v2 = new Vector3d()
{
Vx = pt3.X - pt1.X,
Vy = pt3.Y - pt1.Y,
Vz = pt3.Z - pt1.Z
};
a = v1.Vy * v2.Vz - v1.Vz * v2.Vy;
b = v1.Vz * v2.Vx - v1.Vx * v2.Vz;
c = v1.Vx * v2.Vy - v1.Vy * v2.Vx;
d = -a * pt1.X - b * pt1.Y - c * pt1.Z;
CalcPlane();
RadToDeg();
}
public Plane(Point3d pt1, Point3d pt2, Point3d pt3, Point3d bpt)
{
Basis = bpt;
Vector3d v1 = new Vector3d()
{
Vx = pt2.X - pt1.X,
Vy = pt2.Y - pt1.Y,
Vz = pt2.Z - pt1.Z
};
Vector3d v2 = new Vector3d()
{
Vx = pt3.X - pt1.X,
Vy = pt3.Y - pt1.Y,
Vz = pt3.Z - pt1.Z
};
a = v1.Vy * v2.Vz - v1.Vz * v2.Vy;
b = v1.Vz * v2.Vx - v1.Vx * v2.Vz;
c = v1.Vx * v2.Vy - v1.Vy * v2.Vx;
d = -a * pt1.X - b * pt1.Y - c * pt1.Z;
CalcPlane();
RadToDeg();
}
public double Interpolation(double x, double y)
{
if (C == 0) return double.PositiveInfinity;
else return (-A * x - B * y - D) / C;
}
protected void CreatePlane(Point3d pt1, Point3d pt2, Point3d pt3)
{
Basis = pt1;
Vector3d v1 = new Vector3d()
{
Vx = pt2.X - pt1.X,
Vy = pt2.Y - pt1.Y,
Vz = pt2.Z - pt1.Z
};
Vector3d v2 = new Vector3d()
{
Vx = pt3.X - pt1.X,
Vy = pt3.Y - pt1.Y,
Vz = pt3.Z - pt1.Z
};
a = v1.Vy * v2.Vz - v1.Vz * v2.Vy;
b = v1.Vz * v2.Vx - v1.Vx * v2.Vz;
c = v1.Vx * v2.Vy - v1.Vy * v2.Vx;
d = -a * pt1.X - b * pt1.Y - c * pt1.Z;
CalcPlane();
RadToDeg();
}
protected void CalcPlane()
{
Normal = new Vector3d
{
Vx = a,
Vy = b,
Vz = c
};
Intersect();
CreateMatrix();
}
protected void Intersect()
{
if ((a == 0 & b == 0) == false)
{
Vector3d v3 = new Vector3d { Vx = 0, Vy = 0, Vz = 1 };
Z1 = new Vector3d(Normal.Unit);
X1 = new Vector3d((v3 ^ Z1).Unit);
Y1 = new Vector3d((Z1 ^ X1).Unit);
AlfaRad = -Acos(X1.Vx);
BetaRad = -Acos(Z1.Vz);
//alfaRad = Math.Acos(unitP.Vx);
//betaRad = Math.Acos(unitNormal.Vz);
}
}
protected void CreateMatrix()
{
Vector3d o = new Vector3d();
o[0] = -X1.Vx * Basis.X - X1.Vy * Basis.Y - X1.Vz * Basis.Z;
o[1] = -Y1.Vx * Basis.X - Y1.Vy * Basis.Y - Y1.Vz * Basis.Z;
o[2] = -Z1.Vx * Basis.X - Z1.Vy * Basis.Y - Z1.Vz * Basis.Z;
Mr = new Matrix(4, 4);
Mr[0, 0] = X1.Vx; Mr[0, 1] = X1.Vy; Mr[0, 2] = X1.Vz; Mr[0, 3] = o.Vx;
Mr[1, 0] = Y1.Vx; Mr[1, 1] = Y1.Vy; Mr[1, 2] = Y1.Vz; Mr[1, 3] = o.Vy;
Mr[2, 0] = Z1.Vx; Mr[2, 1] = Z1.Vy; Mr[2, 2] = Z1.Vz; Mr[2, 3] = o.Vz;
Mr[3, 0] = 0; Mr[3, 1] = 0; Mr[3, 2] = 0; Mr[3, 3] = 1;
MrAlfa = new Matrix(3, 3);
MrAlfa[0, 0] = Cos(AlfaRad); MrAlfa[0, 1] = -Sin(AlfaRad); MrAlfa[0, 2] = 0;
MrAlfa[1, 0] = Sin(AlfaRad); MrAlfa[1, 1] = Cos(AlfaRad); MrAlfa[1, 2] = 0;
MrAlfa[2, 0] = 0; MrAlfa[2, 1] = 0; MrAlfa[2, 2] = 0;
MrBeta = new Matrix(3, 3);
MrBeta[0, 0] = 1; MrBeta[0, 1] = 0; MrBeta[0, 2] = 0;
MrBeta[1, 0] = 0; MrBeta[1, 1] = Cos(BetaRad); MrBeta[1, 2] = -Sin(BetaRad);
MrBeta[2, 0] = 0; MrBeta[2, 1] = Sin(BetaRad); MrBeta[2, 2] = Cos(BetaRad);
MrGamma = new Matrix(3, 3);
MrGamma[0, 0] = Cos(gammaRad); MrGamma[0, 1] = -Sin(gammaRad); MrGamma[0, 2] = 0;
MrGamma[1, 0] = Sin(gammaRad); MrGamma[1, 1] = Cos(gammaRad); MrGamma[1, 2] = 0;
MrGamma[2, 0] = 0; MrGamma[2, 1] = 0; MrGamma[2, 2] = 1;
}
public Point3d PointInLCS(Point3d pt)
{
double[] d1 = new double[] { 0, 0, 0, 1 }; ;
Vector v1 = new Vector(d1);
v1[0] = pt.X; v1[1] = pt.Y; v1[2] = pt.Z;
return new Point3d().FromArray((Mr * v1).ToArray());
}
protected double[] MultiplyMtxVec(double[,] _Matrix, double[] _Vector)
{
int n = _Vector.Length;
double[] _Result = new double[n];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
_Result[i] += _Matrix[i, j] * _Vector[j];
}
}
return _Result;
}
protected void RadToDeg()
{
AlfaDeg = AlfaRad * 180 / PI;
BetaDeg = BetaRad * 180 / PI;
gammaDeg = gammaRad * 180 / PI;
}
protected void DegToRad()
{
gammaRad = gammaDeg * 180 / PI;
}
}
}

120
Geometry/Point2d.cs Normal file
View File

@@ -0,0 +1,120 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Point2d
{
double[] arr = new double[2];
public double this[int i] { get => arr[i]; set => arr[i] = value; }
public double X { get => arr[0]; set => arr[0] = value; }
public double Y { get => arr[1]; set => arr[1] = value; }
public Point2d()
{
arr = new double[2];
}
public Point2d(double x, double y)
{
arr = new double[2];
arr[0] = x; arr[1] = y;
}
public Point2d(Point2d source)
{
arr = new double[2];
arr = (double[])source.arr.Clone();
}
public Point2d(Point3d source)
{
arr = new double[2];
arr[0]=source.X; arr[1] = source.Y;
}
public Point2d(double[] source)
{
arr = new double[2];
if (source.Length >= 2)
{
arr[0] = source[0]; arr[1] = source[1];
}
}
public double[] ToArray()
{
return new double[] { X, Y };
}
public Vector2d ToVector2d()
{
return new Vector2d { Vx = X, Vy = Y};
}
public Vector3d ToVector3d()
{
return new Vector3d { Vx = X, Vy = Y, Vz = 0 };
}
public Point3d ToPoint3d()
{
return new Point3d { X = X, Y = Y, Z = 0 };
}
public Point2d FromArray(double[] arr)
{
X = arr[0]; Y = arr[1];
return this;
}
public double LengthTo(Point2d node)
{
Line2d line = new Line2d(this, node);
return line.Length;
}
public static Vector2d operator -(Point2d pt1, Point2d pt2)
{
Vector2d res = new Vector2d();
res[0] = pt1.X - pt2.X;
res[1] = pt1.Y - pt2.Y;
return res;
}
public static bool operator ==(Point2d p1, Point2d p2)
{
bool check = false;
if (p1.X == p2.X && p1.Y == p2.Y)
{
check = true;
}
return (check);
}
public static bool operator !=(Point2d p1, Point2d p2)
{
bool check = true;
if (p1.X == p2.X && p1.Y == p2.Y)
{
check = false;
}
return (check);
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
}

156
Geometry/Point3d.cs Normal file
View File

@@ -0,0 +1,156 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Point3d : IVector
{
double[] arr;
//int n = 3;
public double this[int i] { get => arr[i]; set => arr[i] = value; }
public double X { get => arr[0]; set => arr[0] = value; }
public double Y { get => arr[1]; set => arr[1] = value; }
public double Z { get => arr[2]; set => arr[2] = value; }
public int N => 3;
//int N { get => n; }
public Point3d()
{
arr = new double[3];
}
public Point3d(double x, double y, double z)
{
arr = new double[3];
arr[0] = x; arr[1] = y; arr[2] = z;
}
public Point3d(double x, double y)
{
arr = new double[3];
arr[0] = x; arr[1] = y; arr[2] = 0;
}
public Point3d(Point3d source)
{
arr = new double[3];
arr = (double[])source.arr.Clone();
}
public Point3d(double[] source)
{
arr = new double[3];
if (source.Length >= 3) { arr[0] = source[0]; arr[1] = source[1]; arr[2] = source[2]; }
else if (source.Length == 2) { arr[0] = source[0]; arr[1] = source[1]; }
else { arr[0] = source[0]; }
}
public double[] ToArray()
{
return new double[] { X, Y, Z };
}
public Vector3d ToVector3d()
{
return new Vector3d { Vx = X, Vy = Y, Vz = Z };
}
public Point2d ToPoint2d()
{
return new Point2d { X = X, Y = Y };
}
public Point3d FromArray(double[] arr)
{
X = arr[0]; Y = arr[1]; Z = arr[2];
return this;
}
public double LengthTo(Point3d node)
{
Line3d line = new Line3d(this, node);
return line.Length;
}
public double AngleTo(Point3d startPoint, Point3d endPoint)
{
Point3d tempNode = new Point3d();
Line3d tempLine1 = new Line3d(this, startPoint);
Line3d tempLine2 = new Line3d(this, endPoint);
double cosTo = Vector3d.CosAngleBetVectors(tempLine1.Directive, tempLine2.Directive);
return RadToDeg(Math.Acos(cosTo));
}
public bool NormalDirection(Point3d startNode, Point3d endNode)
{
Line3d tempLine1 = new Line3d(this, startNode);
Line3d tempLine2 = new Line3d(this, endNode);
double norm = (tempLine1.Directive ^ tempLine2.Directive).Vz;
bool res = false;
if (norm > 0) res = true;
return res;
}
private double RadToDeg(double radians)
{
return radians * 180 / Math.PI;
}
public static Point3d operator *(Point3d pt, double prime)
{
return new Point3d
{
X = pt.X * prime,
Y = pt.Y * prime,
Z = pt.Z * prime
};
}
public static Vector3d operator -(Point3d pt1, Point3d pt2)
{
Vector3d res = new Vector3d();
res[0] = pt1.X - pt2.X;
res[1] = pt1.Y - pt2.Y;
res[2] = pt1.Z - pt2.Z;
return res;
}
public static bool operator ==(Point3d p1, Point3d p2)
{
bool check = false;
if (p1.X == p2.X && p1.Y == p2.Y && p1.Z == p2.Z)
{
check = true;
}
return (check);
}
public static bool operator !=(Point3d p1, Point3d p2)
{
bool check = true;
if (p1.X == p2.X && p1.Y == p2.Y && p1.Z == p2.Z)
{
check = false;
}
return (check);
}
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
}
}

663
Geometry/Polygon.cs Normal file
View File

@@ -0,0 +1,663 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Polygon
{
private double area;
private double ix;
private double iy;
private List<Point3d> vertices = new List<Point3d>();
public bool Ckw { get; internal set; }
//public bool? IsSelfItersected { get; private set; }
public double Area { get => Math.Abs(area); }
public double Perimeter { get; internal set; }
public Point3d Centroid { get; internal set; }
public double Ix { get => Math.Abs(ix); }
public double Iy { get => Math.Abs(iy); }
public List<Point3d> Vertices { get => vertices; set { vertices = value; CalcPolygon(); } }
public BoundingBox2d BoundingBox { get; internal set; }
public List<Line2d> Segments { get; internal set; }
public Polygon()
{
}
public Polygon(List<Point3d> vrts)
{
vertices = vrts;
if (vertices[0].X != vertices[vrts.Count - 1].X && vertices[0].Y != vertices[vrts.Count - 1].Y) vertices.Add(vertices[0]);
CalcPolygon();
}
public Polygon(List<Point2d> vrts)
{
foreach (Point2d item in vrts) vertices.Add(item.ToPoint3d());
if (vertices[0].X != vertices[vrts.Count - 1].X && vertices[0].Y != vertices[vrts.Count - 1].Y) vertices.Add(vertices[0]);
CalcPolygon();
}
public virtual void AddVertice(Point2d pt)
{
if (vertices.Count == 0)
{
vertices.Add(pt.ToPoint3d());
return;
}
if (vertices.Count == 1)
{
vertices.Add(pt.ToPoint3d());
vertices.Add(vertices[0]);
return;
}
if (vertices.Count >= 3)
{
vertices.RemoveAt(vertices.Count - 1);
vertices.Add(pt.ToPoint3d());
vertices.Add(vertices[0]);
CalcPolygon();
}
}
public virtual void AddVertice(Point3d pt)
{
if (vertices.Count == 0)
{
vertices.Add(pt);
return;
}
if (vertices.Count == 1)
{
vertices.Add(pt);
vertices.Add(vertices[0]);
return;
}
if (vertices.Count >= 3)
{
vertices.RemoveAt(vertices.Count - 1);
vertices.Add(pt);
vertices.Add(vertices[0]);
CalcPolygon();
}
}
private void CalcBB()
{
double minX = 1000000000;
double minY = 1000000000;
double maxX = -1000000000;
double maxY = -1000000000;
if (vertices.Count > 0)
{
foreach (Point3d item in vertices)
{
if (item.X < minX) { minX = item.X; }
if (item.Y < minY) { minY = item.Y; }
if (item.X > maxX) { maxX = item.X; }
if (item.Y > maxY) { maxY = item.Y; }
}
BoundingBox = new BoundingBox2d(new Point2d(minX, minY), new Point2d(maxX, maxY));
}
}
private void CalcSegs()
{
if (vertices.Count > 3)
{
Segments = new List<Line2d>();
for (int i = 0; i < vertices.Count - 1; i++)
{
Segments.Add(new Line2d(vertices[i], vertices[i + 1]));
}
}
}
protected void CalcI()
{
if (Segments.Count > 2)
{
double tempX = 0;
double tempY = 0;
for (int i = 0; i < Segments.Count; i++)
{
Point3d arrTemp = Segments[i].StartPoint; Point3d arrTemp1 = Segments[i].EndPoint;
tempX += (Math.Pow(arrTemp.X, 2) + arrTemp.X * arrTemp1.X + Math.Pow(arrTemp1.X, 2)) * (arrTemp.X * arrTemp1.Y - arrTemp.Y * arrTemp1.X);
tempY += (Math.Pow(arrTemp.Y, 2) + arrTemp.Y * arrTemp1.Y + Math.Pow(arrTemp1.Y, 2)) * (arrTemp.X * arrTemp1.Y - arrTemp.Y * arrTemp1.X);
}
ix = tempX / 12;
iy = tempY / 12;
}
}
protected void CalcCentroid()
{
if (Segments.Count > 2)
{
Point3d temp = new Point3d();
for (int i = 0; i < Segments.Count; i++)
{
Point3d arrTemp = Segments[i].StartPoint; Point3d arrTemp1 = Segments[i].EndPoint;
temp.X += 1 / (6 * area) * (arrTemp.X + arrTemp1.X) * (arrTemp.X * arrTemp1.Y - arrTemp.Y * arrTemp1.X);
temp.Y += 1 / (6 * area) * (arrTemp.Y + arrTemp1.Y) * (arrTemp.X * arrTemp1.Y - arrTemp.Y * arrTemp1.X);
}
Centroid = temp;
}
}
protected void CalcArea()
{
double temp = 0;
if (Segments.Count > 2)
{
for (int i = 0; i < Segments.Count; i++)
{
Point3d arrTemp = Segments[i].StartPoint; Point3d arrTemp1 = Segments[i].EndPoint;
temp += 0.5 * (arrTemp.X * arrTemp1.Y - arrTemp1.X * arrTemp.Y);
}
area = temp;
}
}
protected void CalcPerimeter()
{
if (Segments.Count > 2)
{
Perimeter = 0;
foreach (Line2d item in Segments)
{
Perimeter += item.Length;
}
}
}
protected void CalcCkw()
{
if (area < 0) Ckw = true;
else Ckw = false;
}
/// <summary>
/// Вычисление свойств полигона
/// </summary>
public void CalcPolygon()
{
if (Vertices.Count > 3)
{
if ((Vertices[0].X != Vertices[vertices.Count - 1].X && Vertices[0].Y != Vertices[Vertices.Count - 1].Y)||
(Vertices[0].X == Vertices[vertices.Count - 1].X && Vertices[0].Y != Vertices[Vertices.Count - 1].Y)||
(Vertices[0].X != Vertices[vertices.Count - 1].X && Vertices[0].Y == Vertices[Vertices.Count - 1].Y))
Vertices.Add(Vertices[0]);
}
CalcBB();
CalcSegs();
CalcPerimeter();
CalcArea();
CalcCkw();
CalcCentroid();
CalcI();
}
/// <summary>
/// Замена вершины полигона
/// </summary>
/// <param name="oldVertIdx">индекс заменяемой вершины</param>
/// <param name="newVert">объект заменяющей вершины</param>
public bool ReplaceVertice( int oldVertIdx, Point3d newVert)
{
try
{
Vertices[oldVertIdx] = newVert;
if (oldVertIdx == 0 || oldVertIdx == Vertices.Count - 1) { Vertices[0] = newVert; Vertices[Vertices.Count - 1] = newVert; }
CalcPolygon();
return true;
}
catch
{
return false;
}
}
public void Triangulation(double shag, out List<Point3d> innerNodes, out List<Triangle> triangles)
{
innerNodes = new List<Point3d>();
triangles = new List<Triangle>();
List<Polygon> polygons = new List<Polygon>();
int n = Tesselation(shag);
Polygon front = new Polygon(Vertices);
//int p = 1;
do
{
if (polygons.Count != 0) { front = polygons[0]; polygons.RemoveAt(0); }
for (int j = 0; j < 1000; j++)
{
AngleIn3Point minAngle;
front.MinAngleDeg(out minAngle);
while (minAngle.AngleDeg == 0 && front.Vertices.Count > 3)
{
if(minAngle.VerticeIdx == 0)
{
front.Vertices.RemoveRange(Vertices.Count - 2, 2);
front.Vertices.RemoveAt(0);
}
else front.Vertices.RemoveRange(minAngle.PreviousIdx, 2);
front.CalcPolygon();
front.MinAngleDeg(out minAngle);
}
if (Math.Round(minAngle.AngleDeg) < 90)
{
triangles.Add(new Triangle(front.Vertices[minAngle.PreviousIdx], front.Vertices[minAngle.VerticeIdx], front.Vertices[minAngle.NextIdx]));
front.Vertices.RemoveAt(minAngle.VerticeIdx);
if (minAngle.VerticeIdx == 0 && front.Vertices.Count > 3) front.Vertices.RemoveAt(front.Vertices.Count - 1);
front.CalcPolygon();
}
else if (Math.Round(minAngle.AngleDeg) == 90 /*&& Math.Round(minAngle.AngleDeg) <= 140*/)
{
Line2d lin = new Line2d(front.Vertices[minAngle.VerticeIdx], front.Vertices[minAngle.PreviousIdx]);
Point3d temp = front.Vertices[minAngle.VerticeIdx];
Point3d g = new Point3d(front.Vertices[minAngle.NextIdx].X + lin.Directive.Vx, front.Vertices[minAngle.NextIdx].Y + lin.Directive.Vy, 0);
Point3d gNode = new Point3d { X = g.X, Y = g.Y, Z = g.Z/*, Number = n*/ };
bool ch = false;
int k = -1;
for (int i = 0; i < front.Vertices.Count - 1; i++)
{
//if (i == minAngle.VerticeIdx) continue;
double d = g.LengthTo(front.Vertices[i]);
if (Math.Round(g.X, 2) == Math.Round(front.Vertices[i].X, 2) && Math.Round(g.Y, 2) == Math.Round(front.Vertices[i].Y, 2))
{ ch = true; k = i; break; }
}
Triangle t1, t2;
if (ch)
{
t1 = new Triangle(front.Vertices[minAngle.VerticeIdx], front.Vertices[minAngle.NextIdx], front.Vertices[k]);
t2 = new Triangle(front.Vertices[minAngle.PreviousIdx], front.Vertices[minAngle.VerticeIdx], front.Vertices[k]);
}
else
{
t1 = new Triangle(front.Vertices[minAngle.VerticeIdx], front.Vertices[minAngle.NextIdx], gNode);
t2 = new Triangle(front.Vertices[minAngle.PreviousIdx], front.Vertices[minAngle.VerticeIdx], gNode);
}
front.ReplaceVertice(minAngle.VerticeIdx, gNode);
if (front.SelfItersectCheck())
{
front.ReplaceVertice(minAngle.VerticeIdx, temp);
double dist = 100000000;
k = -1;
for (int i = 0; i < front.Vertices.Count - 1; i++)
{
if (i == minAngle.NextIdx || i == minAngle.PreviousIdx || i == minAngle.VerticeIdx) continue;
double d = front.Vertices[minAngle.VerticeIdx].LengthTo(front.Vertices[i]);
if (d < dist) { dist = d; k = i; }
}
Polygon sub;
front.Bisection(k, minAngle.VerticeIdx, out sub);
polygons.Add(sub);
}
else
{
if (!ch) { innerNodes.Add(gNode); n++; }
triangles.Add(t1); triangles.Add(t2);
}
}
else
{
Line2d linPrev = new Line2d(front.Vertices[minAngle.VerticeIdx], front.Vertices[minAngle.PreviousIdx]);
Line2d linNext = new Line2d(front.Vertices[minAngle.VerticeIdx], front.Vertices[minAngle.NextIdx]);
double vx = (linPrev.Directive.Unit[0] + linNext.Directive.Unit[0]) * 0.5;
double vy = (linPrev.Directive.Unit[1] + linNext.Directive.Unit[1]) * 0.5;
//double lengthBis = (linPrev.Length + linNext.Length) * 0.5;
double x = front.Vertices[minAngle.VerticeIdx].X + vx * shag;
double y = front.Vertices[minAngle.VerticeIdx].Y + vy * shag;
Point3d temp = front.Vertices[minAngle.VerticeIdx];
Point3d g = new Point3d(x, y, 0);
Line2d linBis = new Line2d(front.Vertices[minAngle.VerticeIdx], g);
x = front.Vertices[minAngle.VerticeIdx].X + linBis.Directive.Unit[0] * shag;
y = front.Vertices[minAngle.VerticeIdx].Y + linBis.Directive.Unit[1] * shag;
g = new Point3d(x, y, 0);
Point3d gNode = new Point3d() { X = g.X, Y = g.Y, Z = g.Z/*, Number = n*/ };
Triangle t1, t2;
t1 = new Triangle(front.Vertices[minAngle.VerticeIdx], front.Vertices[minAngle.NextIdx], gNode);
t2 = new Triangle(front.Vertices[minAngle.PreviousIdx], front.Vertices[minAngle.VerticeIdx], gNode);
front.ReplaceVertice(minAngle.VerticeIdx, gNode);
//if (p == 1) { Shpunt.AcCreator.CreateContour(front); p++; }
if (front.SelfItersectCheck())
{
front.ReplaceVertice(minAngle.VerticeIdx, temp);
double dist = 100000000;
int k = -1;
for (int i = 0; i < front.Vertices.Count - 1; i++)
{
if (i == minAngle.NextIdx || i == minAngle.PreviousIdx || i == minAngle.VerticeIdx) continue;
double d = front.Vertices[minAngle.VerticeIdx].LengthTo(front.Vertices[i]);
if (d < dist) { dist = d; k = i; }
}
Polygon sub;
front.Bisection(k, minAngle.VerticeIdx, out sub);
polygons.Add(sub);
}
else
{
triangles.Add(t1);
triangles.Add(t2);
innerNodes.Add(gNode);
}
n++;
}
if (front.Vertices.Count < 4) break;
}
} while (polygons.Count != 0);
}
/// <summary>
/// Тесселяция полигона с заданным шагом
/// </summary>
/// <param name="shag"> Величина шага тесселяции</param>
public int Tesselation(double shag)
{
List<Point3d> nodes = new List<Point3d>();
int n = 1;
int nD = 0;
foreach (Line2d seg in Segments)
{
Point3d start = seg.StartPoint;
Point3d end = seg.EndPoint;
nD = (int)Math.Round(seg.Length / shag);
if (nD > 1)
{
double delta = seg.Length / nD;
double deltaX = (end.X - start.X) / nD;
double deltaY = (end.Y - start.Y) / nD;
double deltaZ = (end.Z - start.Z) / nD;
for (int j = 0; j < nD; j++)
{
Point3d pt = new Point3d(start.X + j * deltaX, start.Y + j * deltaY, start.Z + j * deltaZ);
//FEA.Node nd = new FEA.Node(pt) { Number = n };
nodes.Add(pt);
n++;
}
}
else
{
Point3d pt = new Point3d(start.X, start.Y, start.Z);
//FEA.Node nd = new FEA.Node(pt) { Number = n };
nodes.Add(pt);
n++;
}
}
Vertices = nodes;
if (!Ckw) { Vertices.Reverse(); CalcPolygon(); }
return n;
}
/// <summary>
/// Деление полигона через указание 2-х точек деления
/// </summary>
/// <param name="sectPointIdx">Индекс первой точки деления(секущей)</param>
/// <param name="basePointIdx">Индекс второй точки деления(базовой)</param>
/// <param name="newPolygon">Возвращаемый отсеченный полигон</param>
public void Bisection(int sectPointIdx,int basePointIdx, out Polygon newPolygon)
{
newPolygon = new Polygon();
List<Point3d> tmp = new List<Point3d>();
if (basePointIdx > sectPointIdx)
{
for (int i = sectPointIdx; i <= basePointIdx; i++)
{
newPolygon.AddVertice(Vertices[i]);
}
newPolygon.CalcPolygon();
Vertices.RemoveRange(sectPointIdx + 1, basePointIdx - sectPointIdx - 1);
CalcPolygon();
}
else
{
for (int i = basePointIdx; i <= sectPointIdx; i++)
{
newPolygon.AddVertice(Vertices[i]);
}
newPolygon.CalcPolygon();
Vertices.RemoveRange(basePointIdx + 1, sectPointIdx - basePointIdx - 1);
CalcPolygon();
}
}
/// <summary>
/// Проверка полигона на самопересечение (возвращает булево значение, если true - полигон самопересекающийся)
/// </summary>
public bool SelfItersectCheck()
{
bool IsSelfItersected = false;
if (Segments.Count < 4) return IsSelfItersected;
for (int i = 0; i < Segments.Count; i++)
{
for (int j = 0; j < Segments.Count; j++)
{
if (i == j) continue;
double a1 = Segments[i].A;
double a2 = Segments[j].A;
double b1 = Segments[i].B;
double b2 = Segments[j].B;
double c1 = Segments[i].C;
double c2 = Segments[j].C;
double p1 = (b2 - b1 * a2 / a1);
if (p1 == 0) continue;
double y = (a2 * c1 / a1 - c2) / p1;
double x = (-b1 * y - c1) / a1;
Point3d ptItersect = new Point3d(x, y, 0);
Line2d linTmp1 = new Line2d(Segments[i].CenterPoint, ptItersect);
Line2d linTmp2 = new Line2d(Segments[j].CenterPoint, ptItersect);
double l1 = Math.Round(linTmp1.Length, 2);
double l11 = Math.Round(Segments[i].Length / 2, 2);
double l2 = Math.Round(linTmp2.Length, 2);
double l22 = Math.Round(Segments[j].Length / 2, 2);
if (Math.Round(linTmp1.Length, 2) < Math.Round(Segments[i].Length / 2, 2) &&
Math.Round(linTmp2.Length, 2) < Math.Round(Segments[j].Length / 2, 2))
{
IsSelfItersected = true;
return IsSelfItersected;
}
}
}
return IsSelfItersected;
}
/// <summary>
/// Вычисление минимального угла полигона в градусах
/// </summary>
/// <returns></returns>
public double MinAngleDeg()
{
double minAngle = 360;
double angleTmp;
bool type;
for (int i = 0; i < Vertices.Count - 1; i++)
{
if (i == 0)
{
angleTmp = Vertices[0].AngleTo(Vertices[Vertices.Count - 2], Vertices[1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[0].NormalDirection(Vertices[Vertices.Count - 2], Vertices[1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp < minAngle) minAngle = angleTmp;
}
else
{
angleTmp = Vertices[i].AngleTo(Vertices[i - 1], Vertices[i + 1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[i].NormalDirection(Vertices[i - 1], Vertices[i + 1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp < minAngle) minAngle = angleTmp;
}
}
return minAngle;
}
/// <summary>
/// Вычисление минимального угла полигона в градусах (возвращает массив индексов 3-х точек на которых был найден угол)
/// </summary>
/// <param name="minAngle"> Возвращаемое значение минимального угла в градусах </param>
public int[] MinAngleDeg(out double minAngle)
{
minAngle = 0;
if (Vertices.Count < 3) return null;
int[] res = new int[3];
minAngle = 360;
double angleTmp;
bool type;
for (int i = 0; i < Vertices.Count - 1; i++)
{
if (i == 0)
{
angleTmp = Vertices[0].AngleTo(Vertices[Vertices.Count - 2], Vertices[i + 1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[i].NormalDirection(Vertices[Vertices.Count - 2], Vertices[i + 1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp < minAngle)
{
res[0] = Vertices.Count - 2;
res[1] = 0;
res[2] = 1;
minAngle = angleTmp;
}
}
else
{
angleTmp = Vertices[i].AngleTo(Vertices[i - 1], Vertices[i + 1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[i].NormalDirection(Vertices[i - 1], Vertices[i + 1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp < minAngle)
{
res[0] = i - 1;
res[1] = i;
res[2] = i + 1;
minAngle = angleTmp;
}
}
}
return res;
}
/// <summary>
/// Вычисление минимального угла полигона в градусах
/// </summary>
/// <param name="result">Возвращаемое значение в виде объекта со свойствами индексов трех точек образуюших угол и значения угла в градусах</param>
public void MinAngleDeg(out AngleIn3Point result)
{
result = new AngleIn3Point();
result.AngleDeg = 0;
if (Vertices.Count < 3) return;
result.AngleDeg = 360;
double angleTmp;
bool type;
for (int i = 0; i < Vertices.Count - 1; i++)
{
if (i == 0)
{
angleTmp = Vertices[0].AngleTo(Vertices[Vertices.Count - 2], Vertices[i + 1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[i].NormalDirection(Vertices[Vertices.Count - 2], Vertices[i + 1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp < result.AngleDeg)
{
result.PreviousIdx = Vertices.Count - 2;
result.VerticeIdx = 0;
result.NextIdx = 1;
result.AngleDeg = angleTmp;
}
}
else
{
angleTmp = Vertices[i].AngleTo(Vertices[i - 1], Vertices[i + 1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[i].NormalDirection(Vertices[i - 1], Vertices[i + 1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp < result.AngleDeg)
{
result.PreviousIdx = i - 1;
result.VerticeIdx = i;
result.NextIdx = i + 1;
result.AngleDeg = angleTmp;
}
}
}
}
/// <summary>
/// Вычисление максимального угла полигона в градусах
/// </summary>
/// <returns></returns>
public double MaxAngleDeg()
{
double minAngle = 0;
double angleTmp;
bool type;
for (int i = 0; i < Vertices.Count - 1; i++)
{
if (i == 0)
{
angleTmp = Vertices[0].AngleTo(Vertices[Vertices.Count - 2], Vertices[i + 1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[i].NormalDirection(Vertices[Vertices.Count - 2], Vertices[i + 1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp > minAngle) minAngle = angleTmp;
}
else
{
angleTmp = Vertices[i].AngleTo(Vertices[i - 1], Vertices[i + 1]);
if (angleTmp is double.NaN) angleTmp = 180;
type = Vertices[i].NormalDirection(Vertices[i - 1], Vertices[i + 1]);
if (!type && angleTmp != 0) angleTmp = 360 - angleTmp;
if (!type && angleTmp == 0) angleTmp = 0;
if (angleTmp > minAngle) minAngle = angleTmp;
}
}
return minAngle;
}
}
/// <summary>
/// Объект-структура со свойствами индексов трех точек образуюших угол и значения угла в градусах
/// </summary>
public struct AngleIn3Point
{
/// <summary>
/// Индекс предыдущей вершины
/// </summary>
public int PreviousIdx { get; set; }
/// <summary>
/// Индех следующей вершины
/// </summary>
public int NextIdx { get; set; }
/// <summary>
/// Индекс вершины, на которой найден угол
/// </summary>
public int VerticeIdx { get; set; }
/// <summary>
/// Значение найденного угла в градусах
/// </summary>
public double AngleDeg { get; set; }
}
}

147
Geometry/Quadrangle.cs Normal file
View File

@@ -0,0 +1,147 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Quadrangle : Polygon
{
private Point3d vertex1 = new Point3d();
private Point3d vertex2 = new Point3d();
private Point3d vertex3 = new Point3d();
private Point3d vertex4 = new Point3d();
public Point3d Vertex1 { get => vertex1; set { vertex1 = value; Vertices[0] = vertex1; CalcQuadrangle(); } }
public Point3d Vertex2 { get => vertex2; set { vertex2 = value; Vertices[1] = vertex2; CalcQuadrangle(); } }
public Point3d Vertex3 { get => vertex3; set { vertex3 = value; Vertices[2] = vertex3; CalcQuadrangle(); } }
public Point3d Vertex4 { get => vertex4; set { vertex4 = value; Vertices[3] = vertex4; CalcQuadrangle(); } }
public double MaxAngleDeg { get; private set; }
public bool IsValid { get; private set; }
public UnitsLin Units { get; set; }
public Quadrangle(Triangle trg1, Triangle trg2)
{
List<Point3d> vrt = new List<Point3d>();
List<Point3d> dgn = new List<Point3d>();
vrt.Add(trg1.Vertex1);
vrt.Add(trg1.Vertex2);
vrt.Add(trg1.Vertex3);
vrt.Add(trg2.Vertex1);
vrt.Add(trg2.Vertex2);
vrt.Add(trg2.Vertex3);
for (int i = 0; i < vrt.Count; i++)
{
for (int j = 0; j < vrt.Count; j++)
{
if (i == j) continue;
if (Math.Round(vrt[i].X, 2) == Math.Round(vrt[j].X,2) && Math.Round(vrt[i].Y,2) == Math.Round(vrt[j].Y,2))
{
dgn.Add(vrt[i]);
vrt.RemoveAt(j);
break;
}
}
}
if (vrt.Count == 4)
{
if (vrt[0].Equals(dgn[0]) && vrt[1].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[2];
AddVertice(Vertex2);
vertex3 = vrt[1];
AddVertice(Vertex3);
vertex4 = vrt[3];
AddVertice(Vertex4);
}
if (vrt[1].Equals(dgn[0]) && vrt[2].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[2];
AddVertice(Vertex2);
vertex3 = vrt[3];
AddVertice(Vertex3);
vertex4 = vrt[1];
AddVertice(Vertex4);
}
if (vrt[0].Equals(dgn[0]) && vrt[2].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[1];
AddVertice(Vertex2);
vertex3 = vrt[2];
AddVertice(Vertex3);
vertex4 = vrt[3];
AddVertice(Vertex4);
}
if (vrt[1].Equals(dgn[0]) && vrt[3].Equals(dgn[1]))
{
vertex1 = vrt[0];
AddVertice(Vertex1);
vertex2 = vrt[1];
AddVertice(Vertex2);
vertex3 = vrt[2];
AddVertice(Vertex3);
vertex4 = vrt[3];
AddVertice(Vertex4);
}
IsValid = true;
CalcQuadrangle();
}
else
{
IsValid = false;
Vertices.Add(new Point3d());
Vertices.Add(new Point3d());
Vertices.Add(new Point3d());
Vertices.Add(new Point3d());
}
}
public Quadrangle(Point3d node1, Point3d node2, Point3d node3, Point3d node4)
{
vertex1 = node1;
AddVertice(node1);
vertex2 = node2;
AddVertice(node2);
vertex3 = node3;
AddVertice(node3);
vertex4 = node4;
AddVertice(node4);
CalcQuadrangle();
IsValid = true;
}
public Quadrangle(Point2d node1, Point2d node2, Point2d node3, Point2d node4)
{
vertex1 = node1.ToPoint3d();
AddVertice(node1);
vertex2 = node2.ToPoint3d();
AddVertice(node2);
vertex3 = node3.ToPoint3d();
AddVertice(node3);
vertex4 = node4.ToPoint3d();
AddVertice(node4);
CalcQuadrangle();
IsValid = true;
}
public void CalcQuadrangle()
{
double ang1, ang2, ang3, ang4;
ang1 = vertex1.AngleTo(vertex4, vertex2);
ang2 = vertex2.AngleTo(vertex1, vertex3);
ang3 = vertex3.AngleTo(vertex2, vertex4);
ang4 = vertex4.AngleTo(vertex3, vertex1);
MaxAngleDeg = Math.Max(Math.Max(Math.Max(ang1, ang2), ang3), ang4);
CalcPolygon();
}
}
}

67
Geometry/Triangle.cs Normal file
View File

@@ -0,0 +1,67 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Triangle : Polygon
{
private Point3d vertex1;
private Point3d vertex2;
private Point3d vertex3;
public Point3d Vertex1 { get => vertex1; set { vertex1 = value; Vertices[0] = vertex1; CalcTriangle(); } }
public Point3d Vertex2 { get => vertex2; set { vertex2 = value; Vertices[1] = vertex2; CalcTriangle(); } }
public Point3d Vertex3 { get => vertex3; set { vertex3 = value; Vertices[2] = vertex3; CalcTriangle(); } }
public double MaxAngleDeg { get; private set; }
public Triangle(Point3d node1, Point3d node2, Point3d node3)
{
vertex1 = node1;
AddVertice(vertex1);
vertex2 = node2;
AddVertice(vertex2);
vertex3 = node3;
AddVertice(vertex3);
CalcTriangle();
}
public Triangle(Point2d node1, Point2d node2, Point2d node3)
{
vertex1 = node1.ToPoint3d();
AddVertice(vertex1);
vertex2 = node2.ToPoint3d();
AddVertice(vertex2);
vertex3 = node3.ToPoint3d();
AddVertice(vertex3);
CalcTriangle();
}
public void CalcTriangle()
{
//Edge1 = new Line3d(vertex1, vertex2);
//Edge2 = new Line3d(vertex2, vertex3);
//Edge3 = new Line3d(vertex3, vertex1);
//Centroid = new Point3d((vertex1.X + vertex2.X + vertex3.X) / 3, (vertex1.Y + vertex2.Y + vertex3.Y) / 3, (vertex1.Z + vertex2.Z + vertex3.Z) / 3);
//Point3d minPt, maxPt;
//minPt = new Point3d(
// Math.Min(Math.Min(vertex1.X, vertex2.X), vertex3.X),
// Math.Min(Math.Min(vertex1.Y, vertex2.Y), vertex3.Y),
// Math.Min(Math.Min(vertex1.Z, vertex2.Z), vertex3.Z));
//maxPt = new Point3d(
// Math.Max(Math.Max(vertex1.X, vertex2.X), vertex3.X),
// Math.Max(Math.Max(vertex1.Y, vertex2.Y), vertex3.Y),
// Math.Max(Math.Max(vertex1.Z, vertex2.Z), vertex3.Z));
//BoundingBox = new BoundingBox2d(minPt.ToPoint2d(), maxPt.ToPoint2d());
double ang1, ang2, ang3;
ang1 = vertex1.AngleTo(vertex3, vertex2);
ang2 = vertex2.AngleTo(vertex1, vertex3);
ang3 = vertex3.AngleTo(vertex2, vertex1);
MaxAngleDeg = Math.Max(Math.Max(ang1, ang2), ang3);
CalcPolygon();
}
}
}

11
Geometry/UnitsEnums.cs Normal file
View File

@@ -0,0 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public enum UnitsLin { м = 1, см = 2, мм = 3, _ = 0 }
public enum UnitsArea { м = 1, см = 2, мм = 3, _ = 0 }
public enum UnitsForce { т = 1, кН = 3, Н = 4, кг = 2, _ = 0 }
public enum UnitsStress { т = 1, кН = 2, Н = 3, МПа = 4, кПа = 5, _ = 0 }
public enum UnitsList { _, м, см, мм, т, кг, Н, кН, кПа, МПа, градус, rad }

57
Geometry/Vector.cs Normal file
View File

@@ -0,0 +1,57 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Geo
{
[Serializable]
public class Vector : IVector
{
double[] arr;
int n;
public int N { get => n; }
public double this[int i] { get => arr[i]; set => arr[i] = value; }
public Vector(int N)
{
n = N;
arr = new double[N];
}
public Vector(Vector source)
{
n = source.N;
arr = new double[source.N];
arr = (double[])source.arr.Clone();
}
public Vector(Vector3d source)
{
n = 3;
arr = new double[n];
arr[0] = source.Vx;
arr[1] = source.Vy;
arr[2] = source.Vz;
}
public Vector(double[] source)
{
n = source.Length;
arr = new double[source.Length];
arr = (double[])source.Clone();
}
public double[] ToArray()
{
return arr;
}
public Vector3d ToVector3d()
{
return new Vector3d { Vx = arr[0], Vy = arr[1], Vz = arr[2] };
}
}
}

97
Geometry/Vector2d.cs Normal file
View File

@@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Math;
namespace Geo
{
[Serializable]
public class Vector2d
{
double[] arr = new double[2];
public double this[int i] { get => arr[i]; set => arr[i] = value; }
public double Vx { get => arr[0]; set => arr[0] = value; }
public double Vy { get => arr[1]; set => arr[1] = value; }
public double Norma { get => Sqrt(Pow(Vx, 2) + Pow(Vy, 2)); }
public double[] Unit { get => new double[] { Vx / Norma, Vy / Norma }; }
public Vector2d()
{
arr = new double[3];
}
public Vector2d(double v1, double v2)
{
arr = new double[2];
arr[0] = v1; arr[1] = v2;
}
public Vector2d(Vector2d source)
{
arr = new double[3];
arr = (double[])source.arr.Clone();
}
public Vector2d(Point2d source)
{
arr = new double[2];
arr[0] = source.X; arr[1] = source.Y;
}
public Vector2d(Vector source)
{
arr = new double[2];
if (source.N >= 2)
{
arr[0] = source[0]; arr[1] = source[1];
}
}
public Vector2d(double[] source)
{
arr = new double[2];
if (source.Length >= 2)
{
arr[0] = source[0]; arr[1] = source[1];
}
}
public static double CosAngleBetVectors(Vector2d v1, Vector2d v2)
{
return (v1.Vx * v2.Vx + v1.Vy * v2.Vy) / (Sqrt(v1.Vx * v1.Vx + v1.Vy * v1.Vy) * Sqrt(v2.Vx * v2.Vx + v2.Vy * v2.Vy));
}
public double[] ToArray()
{
return arr;
}
public Vector ToVector()
{
return new Vector(arr);
}
public static Vector3d operator ^(Vector2d v1, Vector2d v2)
{
Vector3d tempV1 = new Vector3d(v1); Vector3d tempV2 = new Vector3d(v2);
return new Vector3d
{
Vx = tempV1.Vy * tempV2.Vz - tempV1.Vz * tempV2.Vy,
Vy = tempV1.Vz * tempV2.Vx - tempV1.Vx * tempV2.Vz,
Vz = tempV1.Vx * tempV2.Vy - tempV1.Vy * tempV2.Vx
};
}
public static Vector2d operator *(Vector2d v1, Vector2d v2)
{
return new Vector2d
{
Vx = v1.Vx * v2.Vx,
Vy = v1.Vy * v2.Vy
};
}
}
}

107
Geometry/Vector3d.cs Normal file
View File

@@ -0,0 +1,107 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Math;
namespace Geo
{
[Serializable]
public class Vector3d : IVector
{
double[] arr;
int n = 3;
public double this[int i] { get => arr[i]; set => arr[i] = value; }
public double Vx { get => arr[0]; set => arr[0] = value; }
public double Vy { get => arr[1]; set => arr[1] = value; }
public double Vz { get => arr[2]; set => arr[2] = value; }
public double Norma { get => Sqrt(Pow(Vx, 2) + Pow(Vy, 2) + Pow(Vz, 2)); }
public double[] Unit { get => new double[] { Vx / Norma, Vy / Norma, Vz / Norma }; }
public int N { get => n; }
public Vector3d()
{
arr = new double[3];
}
public Vector3d(Vector3d source)
{
arr = new double[3];
arr = (double[])source.arr.Clone();
}
public Vector3d(Point3d source)
{
arr = new double[3];
arr[0] = source.X; arr[1] = source.Y; arr[2] = source.Z;
}
public Vector3d(Vector source)
{
arr = new double[3];
if (source.N >= 3)
{
arr[0] = source[0]; arr[1] = source[1]; arr[2] = source[2];
}
}
public Vector3d(Vector2d source)
{
arr = new double[3];
arr[0] = source.Vx;
arr[1] = source.Vy;
arr[2] = 0;
}
public Vector3d(double[] source)
{
arr = new double[3];
if (source.Length >= 3)
{
arr[0] = source[0]; arr[1] = source[1]; arr[2] = source[2];
}
}
public static double CosAngleBetVectors(Vector3d v1, Vector3d v2)
{
return (v1.Vx * v2.Vx + v1.Vy * v2.Vy + v1.Vz * v2.Vz) / (Sqrt(v1.Vx* v1.Vx + v1.Vy* v1.Vy+ v1.Vz * v1.Vz) * Sqrt(v2.Vx * v2.Vx + v2.Vy * v2.Vy + v2.Vz * v2.Vz));
}
public double[] ToArray()
{
return arr;
}
public Vector2d ToVector2d()
{
return new Vector2d() { Vx = Vx, Vy = Vy };
}
public Vector ToVector()
{
return new Vector(arr);
}
public static Vector3d operator ^(Vector3d v1, Vector3d v2)
{
return new Vector3d
{
Vx = v1.Vy * v2.Vz - v1.Vz * v2.Vy,
Vy = v1.Vz * v2.Vx - v1.Vx * v2.Vz,
Vz = v1.Vx * v2.Vy - v1.Vy * v2.Vx
};
}
public static Vector3d operator *(Vector3d v1, Vector3d v2)
{
return new Vector3d
{
Vx = v1.Vx * v2.Vx,
Vy = v1.Vy * v2.Vy,
Vz = v1.Vz * v2.Vz
};
}
}
}

231
Grapfics/CanvasDrafter.cs Normal file
View File

@@ -0,0 +1,231 @@
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();
}
}
}

View File

@@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
namespace GroundOrganizer
{
public static class RenderVisualService
{
private const double defaultDpi = 96.0;
public static ImageSource RenderToPNGImageSource(Visual targetControl)
{
var renderTargetBitmap = GetRenderTargetBitmapFromControl(targetControl);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
var result = new BitmapImage();
using (var memoryStream = new MemoryStream())
{
encoder.Save(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
result.BeginInit();
result.CacheOption = BitmapCacheOption.OnLoad;
result.StreamSource = memoryStream;
result.EndInit();
}
return result;
}
public static void RenderToPNGFile(Visual targetControl, string filename)
{
var renderTargetBitmap = GetRenderTargetBitmapFromControl(targetControl);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
var result = new BitmapImage();
try
{
using (var fileStream = new FileStream(filename, FileMode.Create))
{
encoder.Save(fileStream);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"There was an error saving the file: {ex.Message}");
}
}
private static BitmapSource GetRenderTargetBitmapFromControl(Visual targetControl, double dpi = defaultDpi)
{
if (targetControl == null) return null;
var bounds = VisualTreeHelper.GetDescendantBounds(targetControl);
var renderTargetBitmap = new RenderTargetBitmap((int)(bounds.Width * dpi / 96.0),
(int)(bounds.Height * dpi / 96.0),
dpi,
dpi,
PixelFormats.Pbgra32);
var drawingVisual = new DrawingVisual();
using (var drawingContext = drawingVisual.RenderOpen())
{
var visualBrush = new VisualBrush(targetControl);
drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(), bounds.Size));
}
renderTargetBitmap.Render(drawingVisual);
return renderTargetBitmap;
}
}
}

312
GroundOrganizer.csproj Normal file
View File

@@ -0,0 +1,312 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{82435CCA-41F6-4074-8C93-A3DCDF9BA0E5}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>GroundOrganizer</RootNamespace>
<AssemblyName>GroundOrganizer</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<WarningLevel>4</WarningLevel>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>Resources\business-color_books_icon-icons.com_53474.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="AForge, Version=2.2.5.0, Culture=neutral, PublicKeyToken=c1db6ff4eaa06aeb, processorArchitecture=MSIL">
<HintPath>..\packages\AForge.2.2.5\lib\AForge.dll</HintPath>
</Reference>
<Reference Include="AForge.Math, Version=2.2.5.0, Culture=neutral, PublicKeyToken=abba2e25397ee8c9, processorArchitecture=MSIL">
<HintPath>..\packages\AForge.Math.2.2.5\lib\AForge.Math.dll</HintPath>
</Reference>
<Reference Include="EPPlus, Version=4.5.3.2, Culture=neutral, PublicKeyToken=ea159fdaa78159a1, processorArchitecture=MSIL">
<HintPath>..\packages\EPPlus.4.5.3.2\lib\net40\EPPlus.dll</HintPath>
</Reference>
<Reference Include="netDxf, Version=2.2.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\netDXF.2.2.0.1\lib\net45\netDxf.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Security" />
<Reference Include="System.Windows.Controls.Ribbon" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
<Reference Include="Triangle">
<HintPath>..\..\..\..\OneDrive\Documents\C#\triangle\sourceCode\sourceCode\Triangle.NET\Triangle\bin\Debug\Triangle.dll</HintPath>
</Reference>
<Reference Include="WindowsBase" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="App.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</ApplicationDefinition>
<Compile Include="BL\DataPair.cs" />
<Compile Include="BL\PlanningVertex.cs" />
<Compile Include="Windows\FoundPropWindow.xaml.cs">
<DependentUpon>FoundPropWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Geometry\BoundingBox2d.cs" />
<Compile Include="Geometry\UnitsEnums.cs" />
<Compile Include="Geometry\Polygon.cs" />
<Compile Include="Geometry\Quadrangle.cs" />
<Compile Include="Geometry\Triangle.cs" />
<Compile Include="Grapfics\CanvasDrafter.cs" />
<Compile Include="Pages\MainPage.xaml.cs">
<DependentUpon>MainPage.xaml</DependentUpon>
</Compile>
<Compile Include="TestWindow.xaml.cs">
<DependentUpon>TestWindow.xaml</DependentUpon>
</Compile>
<Compile Include="VM\CalculationsVM.cs" />
<Compile Include="VM\DrawingVM.cs" />
<Compile Include="VM\PlanningVM.cs" />
<Compile Include="Windows\CanwasWindow.xaml.cs">
<DependentUpon>CanwasWindow.xaml</DependentUpon>
</Compile>
<Compile Include="Grapfics\RenderVisualService.cs" />
<Compile Include="Windows\ImageWindow.xaml.cs">
<DependentUpon>ImageWindow.xaml</DependentUpon>
</Compile>
<Compile Include="VM\HelpsVM.cs" />
<Compile Include="Windows\AlertWindow.xaml.cs">
<DependentUpon>AlertWindow.xaml</DependentUpon>
</Compile>
<Compile Include="BL\Enums.cs" />
<Compile Include="BL\Foundation.cs" />
<Compile Include="BL\FoundLoad.cs" />
<Compile Include="BL\Structure.cs" />
<Compile Include="BL\TablesInterolator.cs" />
<Compile Include="BL\ToSerializ.cs" />
<Compile Include="BL\DataR.cs" />
<Compile Include="BL\DataS.cs" />
<Compile Include="Geometry\IVector.cs" />
<Compile Include="Geometry\Line2d.cs" />
<Compile Include="Geometry\Line3d.cs" />
<Compile Include="Geometry\Matrix.cs" />
<Compile Include="Geometry\Plane.cs" />
<Compile Include="Geometry\Point2d.cs" />
<Compile Include="Geometry\Point3d.cs" />
<Compile Include="Geometry\Vector.cs" />
<Compile Include="Geometry\Vector2d.cs" />
<Compile Include="Geometry\Vector3d.cs" />
<Compile Include="Pages\FoundationsPage.xaml.cs">
<DependentUpon>FoundationsPage.xaml</DependentUpon>
</Compile>
<Compile Include="Pages\StructuresPage.xaml.cs">
<DependentUpon>StructuresPage.xaml</DependentUpon>
</Compile>
<Compile Include="Settings.cs" />
<Compile Include="VM\FoundLoadsVM.cs" />
<Compile Include="VM\FoundationsVM.cs" />
<Compile Include="VM\StructuresVM.cs" />
<Compile Include="VM\BoresVM.cs" />
<Compile Include="VM\LayersVM.cs" />
<Compile Include="VM\IGEsVM.cs" />
<Compile Include="Pages\BoresPage.xaml.cs">
<DependentUpon>BoresPage.xaml</DependentUpon>
</Compile>
<Compile Include="Pages\ResultsPage.cs">
<DependentUpon>ResultsPage.xaml</DependentUpon>
</Compile>
<Compile Include="Pages\IGEsPage.xaml.cs">
<DependentUpon>IGEsPage.xaml</DependentUpon>
</Compile>
<Compile Include="Pages\PlayGroundsPage.xaml.cs">
<DependentUpon>PlayGroundsPage.xaml</DependentUpon>
</Compile>
<Compile Include="VM\RelayCommand.cs" />
<Compile Include="VM\PlayGroundVM.cs" />
<Compile Include="VM\UnitsViewModel .cs" />
<Compile Include="VM\ViewModel.cs" />
<Page Include="Windows\FoundPropWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Pages\MainPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="TestWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Windows\CanwasWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Windows\ImageWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Windows\AlertWindow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Pages\FoundationsPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Pages\StructuresPage.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Pages\BoresPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Pages\ResultsPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Dictionary.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Page Include="Pages\IGEsPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>
</Page>
<Compile Include="App.xaml.cs">
<DependentUpon>App.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="BL\Bore.cs" />
<Compile Include="BL\IGE.cs" />
<Compile Include="BL\Layer.cs" />
<Compile Include="MainWindow.xaml.cs">
<DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Page Include="Pages\PlayGroundsPage.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup>
<ItemGroup>
<Compile Include="BL\PlayGround.cs" />
<Compile Include="Properties\AssemblyInfo.cs">
<SubType>Code</SubType>
</Compile>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<None Include="packages.config" />
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<None Include="Resources\tabl_5_5.csv" />
<None Include="Resources\ИГЭ.xlsx" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\business-color_books_icon-icons.com_53474.ico" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\Аннотация 2019-06-14 145047.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\ShemaFound.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Resources\ShemaLoads.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\ShemaLoads.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\text-list-numbers-icon32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\Bookmark-add-icon32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\Save-icon32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\database-accept-icon.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\Help-and-Support-icon32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\Save_as-80_icon-icons.com32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\icons8-export-csv-32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\icons8-import-csv-32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\interfaceDXF.png" />
</ItemGroup>
<ItemGroup>
<Content Include="Images\drawing1_32.png" />
<Resource Include="Images\XLSX_export-32.png" />
<Resource Include="Images\XLSX_import-32.png" />
<Resource Include="Images\icons8-mesh-32 %281%29.png" />
<Resource Include="Images\icons8-mesh-32.png" />
<Resource Include="Images\icons8-mesh-80_ed1.png" />
<Resource Include="Images\icons8-spiderweb-32.png" />
<Resource Include="Images\drawing32.png" />
</ItemGroup>
<ItemGroup>
<Resource Include="Images\table_1061_32.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

25
GroundOrganizer.sln Normal file
View File

@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35303.130
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GroundOrganizer", "GroundOrganizer.csproj", "{82435CCA-41F6-4074-8C93-A3DCDF9BA0E5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{82435CCA-41F6-4074-8C93-A3DCDF9BA0E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{82435CCA-41F6-4074-8C93-A3DCDF9BA0E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{82435CCA-41F6-4074-8C93-A3DCDF9BA0E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{82435CCA-41F6-4074-8C93-A3DCDF9BA0E5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {94A84522-F2BC-4F49-9D2C-711A3AAAD4BA}
EndGlobalSection
EndGlobal

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
Images/Save-icon32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 961 B

BIN
Images/ShemaLoads.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

BIN
Images/XLSX_export-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
Images/XLSX_import-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
Images/drawing1_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 582 B

BIN
Images/drawing32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1021 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
Images/icons8-mesh-32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
Images/interfaceDXF.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 855 B

BIN
Images/table_1061_32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

125
MainWindow.xaml Normal file
View File

@@ -0,0 +1,125 @@
<Window x:Class="GroundOrganizer.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
FontSize="14"
Margin="5" SizeToContent="WidthAndHeight"
Title="MainWindow" >
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<!--<Window.CommandBindings>
<CommandBinding Command="Open" Executed="CommandBinding_Executed" />
</Window.CommandBindings>-->
<Window.InputBindings>
<KeyBinding Command="{Binding OpenGroundBase}" Key="F2" Modifiers="Ctrl"/>
</Window.InputBindings>
<Grid x:Name="mainGrid">
<StackPanel>
<Menu Background="White" Margin="4">
<MenuItem Header="Файл">
<MenuItem Header="Создать новую базу данных" />
<MenuItem Header="Открыть базу данных" Command="{Binding OpenGroundBase}" />
<MenuItem Header="Сохранить базу данных" />
<MenuItem Header="Сохранить базу данных как"/>
<Separator />
<MenuItem Header="Выход"/>
</MenuItem>
<MenuItem Header="Редактировать" ></MenuItem>
<MenuItem Header="Вид" >
<MenuItem Header="Табличный режим"/>
<MenuItem Header="Графический режим"/>
</MenuItem>
<MenuItem Header="Расчеты" >
<MenuItem Header="Табличный режим"/>
<MenuItem Header="Графический режим"/>
</MenuItem>
</Menu>
<TabControl x:Name="MainTabControl" >
<!--Площадки-->
<TabItem x:Name="PlayGroundTab"
Background="LavenderBlush"
Header="{StaticResource ПлощадкиЗаголовок}" >
<Frame x:Name="PlayGroundFrame"
Source="Pages\PlayGroundsPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--Сооружения-->
<TabItem x:Name="StructuresTab"
Background="Azure"
Header="Сооружения">
<Frame x:Name="StructuresFrame" Source="Pages\StructuresPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--ИГЭ-->
<TabItem x:Name="IGEsTab"
Background="PaleGoldenrod"
Header="ИГЭ">
<Frame x:Name="IGEsFrame"
Source="Pages\IGEsPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--Скважины-->
<TabItem x:Name="BoresTab"
Background="LightBlue"
Header="Скважины">
<Frame x:Name="BoresFrame"
Source="Pages\BoresPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--Фундаменты-->
<TabItem x:Name="FoundationsTab"
Background="Bisque"
Header="Фундаменты">
<Frame x:Name="FoundationsFrame" Source="Pages\FoundationsPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--Resultats-->
<TabItem x:Name="ResultsTab"
Header="Результаты" Background="#FFE0C8F7">
<Frame x:Name="ResulsFrame" NavigationUIVisibility="Hidden"/>
</TabItem>
</TabControl>
<StatusBar>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding BasePath}" FontSize="10" Foreground="Gray"/>
<TextBlock Text=" | " FontSize="10" HorizontalAlignment="Center"/>
<TextBlock Text="Площадка:" FontSize="10" HorizontalAlignment="Center"/>
<TextBlock Text=" " FontSize="10" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding NamePlayGround}" FontSize="10" Foreground="Blue" FontWeight="Bold"/>
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Скважина:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameBore}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Сооружение:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameStructure}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Фундамент:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameFoundation}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Нагрузка:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameFoundLoad}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</StatusBar>
</StackPanel>
</Grid>
</Window>

70
MainWindow.xaml.cs Normal file
View File

@@ -0,0 +1,70 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Collections.ObjectModel;
using System.Windows.Controls.Ribbon;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
ViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = DataContext as ViewModel;
Top = 75;
Left = 75;
double ws = SystemParameters.PrimaryScreenWidth;
double hs = SystemParameters.PrimaryScreenHeight;
MaxWidth = ws - Left - 5;
MaxHeight = hs - Top - 40;
//this.SizeToContent = SizeToContent.Height;
Loaded += MainWindow_Loaded;
}
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
if (File.Exists(Properties.Settings.Default.BasePath) == true)
{
// создаем объект BinaryFormatter
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream fs = new FileStream(Properties.Settings.Default.BasePath, FileMode.OpenOrCreate))
{
ViewModel vm = (ViewModel)DataContext;
//ToSerializ ser = (ToSerializ)formatter.Deserialize(fs);
vm.ListPlayGround = formatter.Deserialize(fs) as ObservableCollection<PlayGround>;
DataContext = vm;
}
}
}
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
vm.ReadDB();
}
//private void MainRibbon_SelectionChanged(object sender, SelectionChangedEventArgs e)
//{
// if(contentFrame!=null) contentFrame.Content = null;
// if (HomeTab.IsSelected && contentFrame != null) contentFrame.Content = new MainPage();
//}
}
}

300
Pages/BoresPage.xaml Normal file
View File

@@ -0,0 +1,300 @@
<Page x:Class="GroundOrganizer.BoresPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
Background="White" FontSize="14"
Title="BoresPage">
<Page.DataContext>
<local:ViewModel/>
</Page.DataContext>
<Grid x:Name="BoresStackPanel">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<GroupBox Grid.Row="0">
<GroupBox.Header>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="Скважины площадки: " HorizontalAlignment="Center" Margin="3" />
<TextBlock Text="{Binding NamePlayGround}" HorizontalAlignment="Center" Margin="3" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="3" HorizontalAlignment="Left">
<Button Command="{Binding AddBore}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumBores}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateBores}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding ExportBoresToXLSX}" Margin="3" Background="White" BorderThickness="0" ToolTip="Экспорт в *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_export-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportBoresFromXLSX}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_import-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding CreateBoresMesh}" Margin="3" Background="White" BorderThickness="0" ToolTip="Создать триангуляционную сеть">
<Button.Content>
<Image Source="/Images/icons8-spiderweb-32.png" />
</Button.Content>
</Button>
</StackPanel>
<Button Grid.Row="0" Width="32" HorizontalAlignment="Right"
Command="" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="BoresDataGrid" HorizontalAlignment="Left"
MaxHeight="300" MinColumnWidth="30"
Margin="3" Grid.Row="1" Grid.Column="0"
ItemsSource="{Binding ListBore}"
AutoGenerateColumns="False"
Style="{StaticResource BoresDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
SelectedItem="{Binding SelectedBore}" ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Header="Номер" Binding="{Binding Path=Name}" CellStyle="{StaticResource CellGridStyle}"/>
<DataGridTextColumn Binding="{Binding Path=X}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="X"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Y}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Y"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Z}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Абс." HorizontalAlignment="Center"/>
<TextBlock Text="отметка" HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="устья" HorizontalAlignment="Center"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=WL}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Отметка" HorizontalAlignment="Center"/>
<TextBlock Text="уровня" HorizontalAlignment="Center"/>
<TextBlock Text="грунтовых" HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="вод*" HorizontalAlignment="Center"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=DZ}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="d"/>
<TextBlock Text="z" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<TextBlock Text="{Binding BoresNote}" FontSize="10" Foreground="Gray" Margin="3,0,0,3" Grid.Row="2" HorizontalAlignment="Left"/>
</Grid>
</GroupBox>
<GroupBox Grid.Row="1">
<GroupBox.Header>
<StackPanel Orientation="Horizontal" Grid.Row="4" Grid.Column="0">
<TextBlock Text="Набор слоев скважины: " HorizontalAlignment="Center" Margin="3" />
<TextBlock Text="{Binding NameBore}" HorizontalAlignment="Center" Margin="3" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="3">
<Button Command="{Binding AddLayer}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumLayers}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateLayers}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding ExportLayersToXLSX}" Margin="3" Background="White" BorderThickness="0" ToolTip="Экспорт в *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_export-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportLayersFromXLSX}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_import-32.png" />
</Button.Content>
</Button>
</StackPanel>
<Button Grid.Row="0" Width="32" HorizontalAlignment="Right"
Command="" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="LayersDataGrid"
MaxHeight="300" MinColumnWidth="40"
Margin="3" Grid.Row="1"
ItemsSource="{Binding ListLayer}"
AutoGenerateColumns="False"
Style="{StaticResource LayersDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridComboBoxColumn x:Name="IGEsListCbxCol"
SelectedItemBinding="{Binding Path=NumIGE}">
<DataGridComboBoxColumn.Header>
<StackPanel>
<TextBlock Text="ИГЭ" />
</StackPanel>
</DataGridComboBoxColumn.Header>
</DataGridComboBoxColumn>
<DataGridTextColumn Binding="{Binding Path=Down}"
CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Глубина"/>
<TextBlock Text="подошвы"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="слоя"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=H}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Мощность"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="слоя"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Z}"
IsReadOnly="True">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Абс." HorizontalAlignment="Center"/>
<TextBlock Text="отметка" HorizontalAlignment="Center"/>
<TextBlock Text="подошвы" HorizontalAlignment="Center"/>
<StackPanel Orientation="Horizontal">
<TextBlock Text="слоя" HorizontalAlignment="Center"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Description}"
MinWidth="128"
IsReadOnly="True">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Грунт"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<StackPanel Orientation="Horizontal" Grid.Row="2">
<Button Content="Отметки по мощности слоя" Command="{Binding RecalcLayerH}" Margin="3"/>
<Button Content="Отметки по глубине подошвы" Command="{Binding RecalcLayerDown}" Margin="3"/>
</StackPanel>
</Grid>
</GroupBox>
</Grid>
</Page>

31
Pages/BoresPage.xaml.cs Normal file
View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для BoresPage.xaml
/// </summary>
public partial class BoresPage : Page
{
private ViewModel vm;
public BoresPage()
{
InitializeComponent();
DataContext = App.Current.MainWindow.DataContext;
vm = DataContext as ViewModel;
}
}
}

377
Pages/FoundationsPage.xaml Normal file
View File

@@ -0,0 +1,377 @@
<Page x:Class="GroundOrganizer.FoundationsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
Background="White" FontSize="14"
Title="FoundationsPage">
<Page.DataContext>
<local:ViewModel/>
</Page.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<GroupBox Grid.Row="0">
<GroupBox.Header>
<StackPanel Orientation="Horizontal" Grid.Column="0">
<TextBlock Text="Формирование списка фундаментов сооружения: " Margin="3" />
<TextBlock Text="{Binding NameStructure}" Margin="3" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="3" HorizontalAlignment="Left">
<Button Command="{Binding AddFoundation}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumFoundations}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateFoundations}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportFoundationsFromCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_import-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ExportFoundationsToCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Экспорт в *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_export-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportFoundationsFromDXF}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.dxf">
<Button.Content>
<Image Source="/Images/interfaceDXF.png" />
</Button.Content>
</Button>
</StackPanel>
<StackPanel Grid.Row="0" HorizontalAlignment="Right" Orientation="Horizontal" Margin="3">
<Button ToolTip="Открыть графический вид"
Command="{Binding DrowFoundations}" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/drawing32.png"/>
</Button.Content>
</Button>
<Button ToolTip="Справка"
Command="{Binding HelpFoundation}" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
</StackPanel>
<DataGrid x:Name="FoundationsDataGrid" Grid.Row="1"
MaxHeight="250" MinColumnWidth="30"
Margin="3"
ItemsSource="{Binding ListFoundation}"
AutoGenerateColumns="False"
Style="{StaticResource FoundationsDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
SelectedItem="{Binding SelectedFoundation}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.ContextMenu>
<ContextMenu Opacity="0.9">
<MenuItem Header="Изменить свойства фундамента" Command="{Binding ShowFoundProps}"></MenuItem>
<MenuItem Header="Пересчитать отметки всех фундаментов" Command="{Binding CalculateLevelsFounds}"></MenuItem>
<!--<MenuItem Header="Перенумеровать" Command="{Binding RenumIGEs}"></MenuItem>
<MenuItem Header="Сохранить в БД" Command="{Binding UpdateIGEs}"></MenuItem>
<MenuItem Header="Сохранить таблицу в *.csv" ></MenuItem>
<MenuItem Header="Заполнить таблицу из *.csv" ></MenuItem>-->
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Header="Марка" Binding="{Binding Path=Name}" CellStyle="{StaticResource CellGridStyle}"/>
<DataGridTextColumn Binding="{Binding Path=B}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="B"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=L}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="L"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=D1}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="d"/>
<TextBlock Text="1" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Db}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="d"/>
<TextBlock Text="b" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Hs}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="h"/>
<TextBlock Text="s" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Hcf}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="h"/>
<TextBlock Text="cf" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Ycf}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel >
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="&#x03B3;" FontSize="16"/>
<TextBlock Text="cf" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Text=" [т" Foreground="DarkGoldenrod"/>
<TextBlock Text="/м" Foreground="DarkGoldenrod"/>
<TextBlock Text="3" FontSize="10" VerticalAlignment="Top" Foreground="DarkGoldenrod"/>
<TextBlock Text="]" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=X}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="X"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Y}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Y"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridCheckBoxColumn Header="Подвал" Binding="{Binding Path=Basement}" CellStyle="{StaticResource CellGridStyle}"/>
<DataGridComboBoxColumn x:Name="typeFondsListCbxCol" SelectedItemBinding="{Binding Path=Type}">
<DataGridComboBoxColumn.Header>
<StackPanel>
<TextBlock Text="Тип" />
</StackPanel>
</DataGridComboBoxColumn.Header>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</GroupBox>
<GroupBox Grid.Row="1">
<GroupBox.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Формирование списка нагрузок на фундамент: " HorizontalAlignment="Center" Margin="3" />
<TextBlock Text="{Binding NameFoundation}" HorizontalAlignment="Center" Margin="3" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="3">
<Button Command="{Binding AddFoundLoad}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumFoundLoads}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateFoundLoads}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportFoundLoadsFromCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_import-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ExportFoundLoadsToCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Экспорт в *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_export-32.png" />
</Button.Content>
</Button>
</StackPanel>
<Button Grid.Row="0" Width="32" HorizontalAlignment="Right"
Command="{Binding HelpLoads}" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="ForcesDataGrid" Grid.Row="1"
MaxHeight="250" MinColumnWidth="40"
Margin="3"
ItemsSource="{Binding ListFoundLoad}"
AutoGenerateColumns="False"
Style="{StaticResource LayersDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
SelectedItem="{Binding SelectedFoundLoad}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Binding="{Binding Path=N}"
CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel >
<StackPanel Orientation="Horizontal">
<TextBlock Text="N"/>
<TextBlock Text=" [тс]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Mx}"
CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="M"/>
<TextBlock Text="x" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [тсм]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=My}"
CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="M"/>
<TextBlock Text="y" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [тсм]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Qx}"
CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Q"/>
<TextBlock Text="x" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [тс]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Qy}"
CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Q"/>
<TextBlock Text="y" FontSize="10" VerticalAlignment="Bottom" Margin="0,6,0,0"/>
<TextBlock Text=" [тс]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=q}"
CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="q"/>
<TextBlock Text=" [т" Foreground="DarkGoldenrod"/>
<TextBlock Text="/м" Foreground="DarkGoldenrod"/>
<TextBlock Text="2" FontSize="10" VerticalAlignment="Top" Foreground="DarkGoldenrod"/>
<TextBlock Text="]" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<UniformGrid Columns="2" Rows="3" Grid.Row="2">
<Button Content="R по скважине" Command="{Binding CalcRinBore}" Margin="3"/>
<Button Content="Осадка по скважине" Command="{Binding CalcSpInBore}" Margin="3"/>
<Button Content="R по скважинам" Command="{Binding CalcRinBores}" Margin="3"/>
<Button Content="Осадка по скважинам" Command="{Binding CalcSpInBores}" Margin="3"/>
<Button Content="R по координатам" Command="{Binding CalcRinCoords}" Margin="3"/>
<Button Content="Осадка по координатам" Command="{Binding RenumFoundLoads}" Margin="3"/>
</UniformGrid>
</Grid>
</GroupBox>
</Grid>
</Page>

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для FoundationsPage.xaml
/// </summary>
public partial class FoundationsPage : Page
{
private ViewModel vm;
public FoundationsPage()
{
InitializeComponent();
DataContext = App.Current.MainWindow.DataContext;
vm = DataContext as ViewModel;
}
}
}

230
Pages/IGEsPage.xaml Normal file
View File

@@ -0,0 +1,230 @@
<Page x:Class="GroundOrganizer.IGEsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
Background="White" FontSize="14"
Title="IGEsPage">
<Page.DataContext>
<local:ViewModel/>
</Page.DataContext>
<Grid x:Name="IGEsGrid">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<GroupBox Grid.Row="0">
<GroupBox.Header>
<StackPanel Orientation="Horizontal" >
<TextBlock Text="ИГЭ площадки: " VerticalAlignment="Center" Margin="3" />
<TextBlock Text="{Binding NamePlayGround}" VerticalAlignment="Center" Margin="3" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" Grid.Row="0">
<StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" Margin="3">
<Button Command="{Binding AddIGE}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumIGEs}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateIGEs}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding SaveIGEsTable}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить как">
<Button.Content>
<Image Source="/Images/Save_as-80_icon-icons.com32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportIGEfromCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_import-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ExportIGEtoCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Экспорт в *.xlsx">
<Button.Content>
<Image Source="/Images/XLSX_export-32.png" />
</Button.Content>
</Button>
</StackPanel>
</StackPanel>
<Button Grid.Column="0" Grid.Row="0" Width="32" HorizontalAlignment="Right"
Command="" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="IGEsDataGrid" Grid.Row="1"
MaxHeight="780" MinColumnWidth="30"
Margin="3"
ItemsSource="{Binding ListIGE}"
AutoGenerateColumns="False"
Style="{StaticResource IGEsDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}" ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}" SelectionUnit="CellOrRowHeader" >
<DataGrid.ContextMenu>
<ContextMenu Opacity="1">
<MenuItem Header="Добавить ИГЭ" Command="{Binding AddIGE}"></MenuItem>
<MenuItem Header="Перенумеровать" Command="{Binding RenumIGEs}"></MenuItem>
<MenuItem Header="Сохранить в БД" Command="{Binding UpdateIGEs}"></MenuItem>
<MenuItem Header="Сохранить таблицу в *.csv" Click="ToCSV_Click"></MenuItem>
<MenuItem Header="Заполнить таблицу из *.csv" Click="FromCSV_Click"></MenuItem>
</ContextMenu>
</DataGrid.ContextMenu>
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Header="ИГЭ" Binding="{Binding Path=NumIGE}" CellStyle="{StaticResource CellGridStyle}"/>
<!--<DataGridTextColumn Binding="{Binding Path=Description}" MaxWidth="350">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Наименование грунта" HorizontalAlignment="Center"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>-->
<DataGridTemplateColumn Header="Наименование грунта" MinWidth="200" MaxWidth="350">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= Description}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path= Description}" TextWrapping="Wrap" Background="LightGoldenrodYellow"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding Path=RoII}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#x03C1;" FontSize="16"/>
<TextBlock Text="II" FontSize="10" VerticalAlignment="Bottom" Margin="0,10,0,0"/>
<TextBlock Text=" [т/м" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
<TextBlock Text="3" FontSize="8" VerticalAlignment="Top" Margin="0,2,0,0" Foreground="DarkGoldenrod"/>
<TextBlock Text="]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=FiII}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#x03C6;" FontSize="16"/>
<TextBlock Text="II" FontSize="10" VerticalAlignment="Bottom" Margin="0,10,0,0"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=CII}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="c" FontSize="16"/>
<TextBlock Text="II" FontSize="10" Margin="0,10,0,0"/>
<TextBlock Text=" [МПа]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=E}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="E" FontSize="16"/>
<TextBlock Text=" [МПа]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Ys}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="&#x03B3;" FontSize="16"/>
<TextBlock Text="s" FontSize="10" VerticalAlignment="Bottom" Margin="0,10,0,0"/>
<TextBlock Text=" [т/м" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
<TextBlock Text="3" FontSize="8" VerticalAlignment="Top" Margin="0,2,0,0" Foreground="DarkGoldenrod"/>
<TextBlock Text="]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Ke}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="e"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=IL}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="I"/>
<TextBlock Text="L" FontSize="10" Margin="0,6,0,0"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridCheckBoxColumn Header="W" Binding="{Binding Path=W}"/>
<DataGridComboBoxColumn ItemsSource="{StaticResource GroundTypeArr}"
SelectedItemBinding="{Binding Path=GroundType}">
<DataGridComboBoxColumn.Header>
<StackPanel>
<TextBlock Text="Тип" />
</StackPanel>
</DataGridComboBoxColumn.Header>
</DataGridComboBoxColumn>
<!--<DataGridTemplateColumn HeaderStyle="{StaticResource HeaderGridStyle}" Header="Описание" MaxWidth="500">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= Description}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path= Description}" TextWrapping="Wrap" Background="LightGoldenrodYellow"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>-->
</DataGrid.Columns>
</DataGrid>
</Grid>
</GroupBox>
<StackPanel x:Name="IGEsStackPanel">
</StackPanel>
</Grid>
</Page>

41
Pages/IGEsPage.xaml.cs Normal file
View File

@@ -0,0 +1,41 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для IGEsPage.xaml
/// </summary>
public partial class IGEsPage : Page
{
private ViewModel vm;
public IGEsPage()
{
InitializeComponent();
vm = App.Current.MainWindow.DataContext as ViewModel;
DataContext = vm;
}
private void ToCSV_Click(object sender, RoutedEventArgs e)
{
vm.SaveIGEsInCsv();
}
private void FromCSV_Click(object sender, RoutedEventArgs e)
{
vm.ReadIGEsFromCsv();
}
}
}

60
Pages/MainPage.xaml Normal file
View File

@@ -0,0 +1,60 @@
<Page x:Class="GroundOrganizer.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
FontSize="14"
VerticalAlignment="Bottom"
Title="MainPage">
<!--d:DesignHeight="450" d:DesignWidth="800"-->
<Page.DataContext>
<local:ViewModel/>
</Page.DataContext>
<Grid>
<TabControl TabStripPlacement="Bottom" >
<!--Площадки-->
<TabItem x:Name="PlayGroundTab"
Background="LavenderBlush"
Header="{StaticResource ПлощадкиЗаголовок}" >
<Frame x:Name="PlayGroundFrame"
Source="PlayGroundsPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--ИГЭ-->
<TabItem x:Name="IGEsTab"
Background="PaleGoldenrod"
Header="ИГЭ">
<Frame x:Name="IGEsFrame"
Source="IGEsPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--Скважины-->
<TabItem x:Name="BoresTab"
Background="LightBlue"
Header="Скважины">
<Frame x:Name="BoresFrame"
Source="BoresPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--Сооружения-->
<TabItem x:Name="StructuresTab"
Background="Azure"
Header="Сооружения">
<Frame x:Name="StructuresFrame" Source="StructuresPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
<!--Фундаменты-->
<TabItem x:Name="FoundationsTab"
Background="Bisque"
Header="Фундаменты">
<Frame x:Name="FoundationsFrame" Source="FoundationsPage.xaml"
NavigationUIVisibility="Hidden"/>
</TabItem>
</TabControl>
</Grid>
</Page>

29
Pages/MainPage.xaml.cs Normal file
View File

@@ -0,0 +1,29 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для MainPage.xaml
/// </summary>
public partial class MainPage : Page
{
public MainPage()
{
InitializeComponent();
DataContext = App.Current.MainWindow.DataContext;
}
}
}

View File

@@ -0,0 +1,90 @@
<Page x:Class="GroundOrganizer.PlayGroundsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
FontSize="14"
Title="PlayGroundsPage">
<Page.DataContext>
<local:ViewModel/>
</Page.DataContext>
<GroupBox Header="Инженерно-геологические площадки">
<Grid x:Name="PlayGroundGrid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<!--<UniformGrid Columns="3" Rows="1">
<Button Content="Добавить" Command="{Binding AddPlayGround}" Margin="3"/>
<Button Content="Перенумеровать" Command="{Binding RenumPlayGrounds}" Margin="3"/>
<Button Content="Сохранить" Command="{Binding UpdatePlayGrounds}" Margin="3"/>
</UniformGrid>-->
<StackPanel Grid.Row="0" Grid.Column="0" Orientation="Horizontal" Margin="3" HorizontalAlignment="Left">
<Button Command="{Binding AddPlayGround}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumPlayGrounds}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdatePlayGrounds}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
</StackPanel>
<Button Grid.Column="0" Grid.Row="0" Width="32" HorizontalAlignment="Right"
Command="" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="PlayGroundDataGrid"
MaxHeight="780"
Margin="3" Grid.Row="1" Grid.Column="0"
HorizontalAlignment="Stretch"
ItemsSource="{Binding ListPlayGround}"
SelectedItem="{Binding SelectedPlayGround}"
AutoGenerateColumns="False"
Style="{StaticResource PlayGroundDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}"/>
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Header="Наименование" Binding="{Binding Path=Name}" Width="400"/>
<DataGridTemplateColumn Header="Описание" Width="800">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= Description}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path= Description}" TextWrapping="Wrap" Background="LightGoldenrodYellow"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<!--<DataGridTextColumn Header="Описание" Binding="{Binding Path=Description}" MinWidth="155" HeaderStyle="{StaticResource HeaderGridStyle}"/>-->
</DataGrid.Columns>
</DataGrid>
<!--<Button Content="Выбор файла базы данных" Command="{Binding GetGroundBasePath}"/>-->
</Grid>
</GroupBox>
</Page>

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для PlayGroundsPage.xaml
/// </summary>
public partial class PlayGroundsPage : Page
{
private ViewModel vm;
public PlayGroundsPage()
{
InitializeComponent();
DataContext = App.Current.MainWindow.DataContext;
vm = DataContext as ViewModel;
}
}
}

31
Pages/ResultsPage.cs Normal file
View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для CalculationsPage.xaml
/// </summary>
public partial class ResultsPage : Page
{
ViewModel vm;
public ResultsPage()
{
InitializeComponent();
DataContext = App.Current.MainWindow.DataContext;
vm = DataContext as ViewModel;
}
}
}

41
Pages/ResultsPage.xaml Normal file
View File

@@ -0,0 +1,41 @@
<Page x:Class="GroundOrganizer.ResultsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Title="ResultsPage">
<Page.DataContext>
<local:ViewModel/>
</Page.DataContext>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<DataGrid x:Name="ResultsDataGrid" Grid.Row="0"
MinColumnWidth="40" MaxHeight="300"
Margin="3" Background="White"
ItemsSource="{Binding ResR}" SelectedItem="{Binding ResRselected}"
AutoGenerateColumns="True" HorizontalAlignment="Left"
Style="{StaticResource LayersDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}"
MaxColumnWidth="150"/>
<DataGrid x:Name="DetailedResultsDataGrid" Grid.Row="1"
Margin="3" Background="White"
MaxHeight="500"
ItemsSource="{Binding ResRdata}"
AutoGenerateColumns="True" HorizontalAlignment="Left"
Style="{StaticResource LayersDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}"
SelectionUnit="Cell">
</DataGrid>
</Grid>
</Page>

350
Pages/StructuresPage.xaml Normal file
View File

@@ -0,0 +1,350 @@
<Page x:Class="GroundOrganizer.StructuresPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
Background="White" FontSize="14"
Title="StructuresPage">
<Page.DataContext>
<local:ViewModel/>
</Page.DataContext>
<Grid x:Name="BoresStackGrid">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<GroupBox Grid.Row="0">
<GroupBox.Header>
<StackPanel Orientation="Horizontal" Grid.Row="0">
<TextBlock Text="Сооружения площадки: " HorizontalAlignment="Center" Margin="3" />
<TextBlock Text="{Binding NamePlayGround}" HorizontalAlignment="Center" Margin="3" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</GroupBox.Header>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="3">
<Button Command="{Binding AddStructure}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumStructures}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateStructures}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportPlanningsFromDXF}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт планировки из *.dxf">
<Button.Content>
<Image Source="/Images/interfaceDXF.png" />
</Button.Content>
</Button>
</StackPanel>
<Button Grid.Row="0" Width="32" HorizontalAlignment="Right"
ToolTip="{Binding StructureNote}"
Command="" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="BoresDataGrid" Grid.Row="1"
MaxHeight="250" MinColumnWidth="30"
Margin="3" HorizontalAlignment="Left"
ItemsSource="{Binding ListStructure}"
AutoGenerateColumns="False"
Style="{StaticResource StructuresDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
SelectedItem="{Binding SelectedStructure}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Header="Наименование" Binding="{Binding Path=Name}"/>
<DataGridTextColumn Binding="{Binding Path=L}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="L"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=H}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="H"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Null}" MinWidth="100">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Абс. отметка"/>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="нуля" HorizontalAlignment="Center"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" HorizontalAlignment="Center" Foreground="DarkGoldenrod"/>
</StackPanel>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridComboBoxColumn x:Name="flexListCbxCol"
SelectedItemBinding="{Binding Path=flexStructure}">
<DataGridComboBoxColumn.Header>
<StackPanel>
<TextBlock Text="Схема" />
</StackPanel>
</DataGridComboBoxColumn.Header>
</DataGridComboBoxColumn>
<DataGridTemplateColumn Header="Описание" MinWidth="200">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path= Description}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{Binding Path= Description}" TextWrapping="Wrap" Background="LightGoldenrodYellow"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</GroupBox>
<GroupBox Grid.Row="1" >
<GroupBox.Header>
<StackPanel Orientation="Horizontal" Grid.Row="0">
<TextBlock Text="Вертикальная планировка сооружения: " HorizontalAlignment="Center" Margin="3" />
<TextBlock Text="{Binding NameStructure}" HorizontalAlignment="Center" Margin="3" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</GroupBox.Header>
<TabControl SelectedIndex="0" TabStripPlacement="Bottom">
<TabItem x:Name="RedPointsTab" Header="Красные отметки" Background="LightPink">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="3" HorizontalAlignment="Left">
<Button Command="{Binding AddRedVertex}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumRedVertexes}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateRedPlanning}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportRedPlanningFromCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.csv">
<Button.Content>
<Image Source="/Images/icons8-import-csv-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ExportRedPlanningToCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Экспорт в *.csv">
<Button.Content>
<Image Source="/Images/icons8-export-csv-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding CreateRedPlanningMesh}" Margin="3" Background="White" BorderThickness="0" ToolTip="Создать триангуляционную сеть">
<Button.Content>
<Image Source="/Images/icons8-spiderweb-32.png" />
</Button.Content>
</Button>
</StackPanel>
<Button Grid.Row="0" Width="32" HorizontalAlignment="Right"
Command="" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="PlanningsDataGrid" Grid.Row="1"
MaxHeight="250" MinColumnWidth="30"
Margin="3" HorizontalAlignment="Left"
ItemsSource="{Binding RedPlanning}"
AutoGenerateColumns="False"
Style="{StaticResource RedPlanningDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
SelectedItem="{Binding SelectedRedVertex}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Binding="{Binding Path=X}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="X"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Y}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Y"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Red}" MinWidth="120">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Красная отметка"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" HorizontalAlignment="Center" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
<TabItem x:Name="BlackPointsTab" Header="Черные отметки" Background="LightGray">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal" Margin="3" HorizontalAlignment="Left">
<Button Command="{Binding AddBlackVertex}" Margin="3" Background="White" BorderThickness="0" ToolTip="Добавить">
<Button.Content>
<Image Source="/Images/Bookmark-add-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding RenumBlackVertexes}" Margin="3" Background="White" BorderThickness="0" ToolTip="Перенумеровать">
<Button.Content>
<Image Source="/Images/text-list-numbers-icon32.png"/>
</Button.Content>
</Button>
<Button Command="{Binding UpdateBlackPlanning}" Margin="3" Background="White" BorderThickness="0" ToolTip="Сохранить в БД">
<Button.Content>
<Image Source="/Images/database-accept-icon.png" />
</Button.Content>
</Button>
<Button Command="{Binding ImportBlackPlanningFromCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Импорт из *.csv">
<Button.Content>
<Image Source="/Images/icons8-import-csv-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding ExportBlackPlanningToCSV}" Margin="3" Background="White" BorderThickness="0" ToolTip="Экспорт в *.csv">
<Button.Content>
<Image Source="/Images/icons8-export-csv-32.png" />
</Button.Content>
</Button>
<Button Command="{Binding CreateBlackPlanningMesh}" Margin="3" Background="White" BorderThickness="0" ToolTip="Создать триангуляционную сеть">
<Button.Content>
<Image Source="/Images/icons8-spiderweb-32.png" />
</Button.Content>
</Button>
</StackPanel>
<Button Grid.Row="0" Width="32" HorizontalAlignment="Right"
Command="" Margin="3" Background="White" BorderThickness="0">
<Button.Content>
<Image Source="/Images/Help-and-Support-icon32.png"/>
</Button.Content>
</Button>
<DataGrid x:Name="BlackPointsDataGrid" Grid.Row="1"
MaxHeight="250" MinColumnWidth="30"
Margin="3" HorizontalAlignment="Left"
ItemsSource="{Binding BlackPlanning}"
SelectedItem="{Binding SelectedBlackVertex}"
AutoGenerateColumns="False"
Style="{StaticResource BlackPlanningDataGridStyle}"
RowHeight="{DynamicResource rowsHeight}"
ColumnHeaderStyle="{DynamicResource DataGridHeaderStyle}">
<DataGrid.Columns >
<DataGridTextColumn Header="#" Binding="{Binding Path=Number}" />
<!--<DataGridTextColumn Header="Класс" Binding="{Binding Path=ClassId}" IsReadOnly="True" HeaderStyle="{StaticResource HeaderGridStyle}" />-->
<DataGridTextColumn Binding="{Binding Path=X}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="X"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Y}" CellStyle="{StaticResource CellGridStyle}">
<DataGridTextColumn.Header>
<StackPanel Orientation="Horizontal">
<TextBlock Text="Y"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Path=Black}" MinWidth="120">
<DataGridTextColumn.Header>
<StackPanel >
<TextBlock Text="Черная отметка"/>
<TextBlock Text=" [м]" VerticalAlignment="Bottom" HorizontalAlignment="Center" Foreground="DarkGoldenrod"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</TabItem>
</TabControl>
</GroupBox>
</Grid>
</Page>

View File

@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для StructuresPage.xaml
/// </summary>
public partial class StructuresPage : Page
{
private ViewModel vm;
public StructuresPage()
{
InitializeComponent();
DataContext = App.Current.MainWindow.DataContext;
vm = DataContext as ViewModel;
}
}
}

View File

@@ -0,0 +1,55 @@
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Windows;
// Общие сведения об этой сборке предоставляются следующим набором
// набор атрибутов. Измените значения этих атрибутов, чтобы изменить сведения,
// связанные со сборкой.
[assembly: AssemblyTitle("GroundOrganizer")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP Inc.")]
[assembly: AssemblyProduct("GroundOrganizer")]
[assembly: AssemblyCopyright("Copyright © HP Inc. 2019")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
// для компонентов COM. Если необходимо обратиться к типу в этой сборке через
// из модели COM, установите атрибут ComVisible для этого типа в значение true.
[assembly: ComVisible(false)]
//Чтобы начать создание локализуемых приложений, задайте
//<UICulture>CultureYouAreCodingWith</UICulture> в файле .csproj
//в <PropertyGroup>. Например, при использовании английского (США)
//в своих исходных файлах установите <UICulture> в en-US. Затем отмените преобразование в комментарий
//атрибута NeutralResourceLanguage ниже. Обновите "en-US" в
//строка внизу для обеспечения соответствия настройки UICulture в файле проекта.
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
[assembly: ThemeInfo(
ResourceDictionaryLocation.None, //где расположены словари ресурсов по конкретным тематикам
//(используется, если ресурс не найден на странице,
// или в словарях ресурсов приложения)
ResourceDictionaryLocation.SourceAssembly //где расположен словарь универсальных ресурсов
//(используется, если ресурс не найден на странице,
// в приложении или в каких-либо словарях ресурсов для конкретной темы)
)]
// Сведения о версии для сборки включают четыре следующих значения:
//
// Основной номер версии
// Дополнительный номер версии
// Номер сборки
// Номер редакции
//
// Можно задать все значения или принять номера сборки и редакции по умолчанию
// используя "*", как показано ниже:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

140
Properties/Resources.Designer.cs generated Normal file
View File

@@ -0,0 +1,140 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace GroundOrganizer.Properties {
using System;
/// <summary>
/// Класс ресурса со строгой типизацией для поиска локализованных строк и т.д.
/// </summary>
// Этот класс создан автоматически классом StronglyTypedResourceBuilder
// с помощью такого средства, как ResGen или Visual Studio.
// Чтобы добавить или удалить член, измените файл .ResX и снова запустите ResGen
// с параметром /str или перестройте свой проект VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources {
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources() {
}
/// <summary>
/// Возвращает кэшированный экземпляр ResourceManager, использованный этим классом.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager {
get {
if (object.ReferenceEquals(resourceMan, null)) {
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("GroundOrganizer.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Перезаписывает свойство CurrentUICulture текущего потока для всех
/// обращений к ресурсу с помощью этого класса ресурса со строгой типизацией.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture {
get {
return resourceCulture;
}
set {
resourceCulture = value;
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Icon, аналогичного (Значок).
/// </summary>
internal static System.Drawing.Icon business_color_books_icon_icons_com_53474 {
get {
object obj = ResourceManager.GetObject("business_color_books_icon_icons_com_53474", resourceCulture);
return ((System.Drawing.Icon)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Byte[].
/// </summary>
internal static byte[] IGE {
get {
object obj = ResourceManager.GetObject("IGE", resourceCulture);
return ((byte[])(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ShemaFound {
get {
object obj = ResourceManager.GetObject("ShemaFound", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Поиск локализованного ресурса типа System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap ShemaLoads {
get {
object obj = ResourceManager.GetObject("ShemaLoads", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary>
/// Ищет локализованную строку, похожую на 0;0;1;3.14
///1;0.01;1.06;3.23
///2;0.03;1.12;3.32
///3;0.04;1.18;3.41
///4;0.06;1.25;3.51
///5;0.08;1.32;3.61
///6;0.1;1.39;3.71
///7;0.12;1.47;3.82
///8;0.14;1.55;3.93
///9;0.16;1.64;4.05
///10;0.18;1.73;4.17
///11;0.21;1.83;4.29
///12;0.23;1.94;4.42
///13;0.26;2.05;4.55
///14;0.29;2.17;4.69
///15;0.32;2.3;4.84
///16;0.36;2.43;4.99
///17;0.39;2.57;5.15
///18;0.43;2.73;5.31
///19;0.47;2.89;5.48
///20;0.51;3.06;5.66
///21;0.56;3.24;5.84
///22;0.61;3.44;6.04
///23;0.66;3.65;6.24
///24;0.72;3.87;6.45
///25;0.78;4.11;6.67
///26;0.84;4.37;6.9
///27;0.91;4.64;7.14
/// [остаток строки не уместился]&quot;;.
/// </summary>
internal static string tabl_5_5 {
get {
return ResourceManager.GetString("tabl_5_5", resourceCulture);
}
}
}
}

136
Properties/Resources.resx Normal file
View File

@@ -0,0 +1,136 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="business_color_books_icon_icons_com_53474" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\business-color_books_icon-icons.com_53474.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="tabl_5_5" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\tabl_5_5.csv;System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;utf-8</value>
</data>
<data name="ShemaFound" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ShemaFound.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="ShemaLoads" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ShemaLoads.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="IGE" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\ИГЭ.xlsx;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
</root>

38
Properties/Settings.Designer.cs generated Normal file
View File

@@ -0,0 +1,38 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Этот код создан программой.
// Исполняемая версия:4.0.30319.42000
//
// Изменения в этом файле могут привести к неправильной работе и будут потеряны в случае
// повторной генерации кода.
// </auto-generated>
//------------------------------------------------------------------------------
namespace GroundOrganizer.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.1.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string BasePath {
get {
return ((string)(this["BasePath"]));
}
set {
this["BasePath"] = value;
}
}
}
}

View File

@@ -0,0 +1,9 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="GroundOrganizer.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="BasePath" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

BIN
Resources/ShemaFound.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
Resources/ShemaLoads.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

46
Resources/tabl_5_5.csv Normal file
View File

@@ -0,0 +1,46 @@
0;0;1;3.14
1;0.01;1.06;3.23
2;0.03;1.12;3.32
3;0.04;1.18;3.41
4;0.06;1.25;3.51
5;0.08;1.32;3.61
6;0.1;1.39;3.71
7;0.12;1.47;3.82
8;0.14;1.55;3.93
9;0.16;1.64;4.05
10;0.18;1.73;4.17
11;0.21;1.83;4.29
12;0.23;1.94;4.42
13;0.26;2.05;4.55
14;0.29;2.17;4.69
15;0.32;2.3;4.84
16;0.36;2.43;4.99
17;0.39;2.57;5.15
18;0.43;2.73;5.31
19;0.47;2.89;5.48
20;0.51;3.06;5.66
21;0.56;3.24;5.84
22;0.61;3.44;6.04
23;0.66;3.65;6.24
24;0.72;3.87;6.45
25;0.78;4.11;6.67
26;0.84;4.37;6.9
27;0.91;4.64;7.14
28;0.98;4.93;7.4
29;1.06;5.25;7.67
30;1.15;5.59;7.95
31;1.24;5.95;8.24
32;1.34;6.34;8.55
33;1.44;6.76;8.88
34;1.55;7.22;9.22
35;1.68;7.71;9.58
36;1.81;8.24;9.97
37;1.95;8.81;10.37
38;2.11;9.44;10.8
39;2.28;10.11;11.25
40;2.46;10.85;11.73
41;2.66;11.64;12.24
42;2.88;12.51;12.79
43;3.12;13.46;13.37
44;3.38;14.5;13.98
45;3.66;15.64;14.64
1 0 0 1 3.14
2 1 0.01 1.06 3.23
3 2 0.03 1.12 3.32
4 3 0.04 1.18 3.41
5 4 0.06 1.25 3.51
6 5 0.08 1.32 3.61
7 6 0.1 1.39 3.71
8 7 0.12 1.47 3.82
9 8 0.14 1.55 3.93
10 9 0.16 1.64 4.05
11 10 0.18 1.73 4.17
12 11 0.21 1.83 4.29
13 12 0.23 1.94 4.42
14 13 0.26 2.05 4.55
15 14 0.29 2.17 4.69
16 15 0.32 2.3 4.84
17 16 0.36 2.43 4.99
18 17 0.39 2.57 5.15
19 18 0.43 2.73 5.31
20 19 0.47 2.89 5.48
21 20 0.51 3.06 5.66
22 21 0.56 3.24 5.84
23 22 0.61 3.44 6.04
24 23 0.66 3.65 6.24
25 24 0.72 3.87 6.45
26 25 0.78 4.11 6.67
27 26 0.84 4.37 6.9
28 27 0.91 4.64 7.14
29 28 0.98 4.93 7.4
30 29 1.06 5.25 7.67
31 30 1.15 5.59 7.95
32 31 1.24 5.95 8.24
33 32 1.34 6.34 8.55
34 33 1.44 6.76 8.88
35 34 1.55 7.22 9.22
36 35 1.68 7.71 9.58
37 36 1.81 8.24 9.97
38 37 1.95 8.81 10.37
39 38 2.11 9.44 10.8
40 39 2.28 10.11 11.25
41 40 2.46 10.85 11.73
42 41 2.66 11.64 12.24
43 42 2.88 12.51 12.79
44 43 3.12 13.46 13.37
45 44 3.38 14.5 13.98
46 45 3.66 15.64 14.64

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
Resources/ИГЭ.xlsx Normal file

Binary file not shown.

28
Settings.cs Normal file
View File

@@ -0,0 +1,28 @@
namespace GroundOrganizer.Properties {
// Этот класс позволяет обрабатывать определенные события в классе параметров:
// Событие SettingChanging возникает перед изменением значения параметра.
// Событие PropertyChanged возникает после изменения значения параметра.
// Событие SettingsLoaded возникает после загрузки значений параметров.
// Событие SettingsSaving возникает перед сохранением значений параметров.
internal sealed partial class Settings {
public Settings() {
// // Для добавления обработчиков событий для сохранения и изменения параметров раскомментируйте приведенные ниже строки:
//
// this.SettingChanging += this.SettingChangingEventHandler;
//
// this.SettingsSaving += this.SettingsSavingEventHandler;
//
}
private void SettingChangingEventHandler(object sender, System.Configuration.SettingChangingEventArgs e) {
// Добавьте здесь код для обработки события SettingChangingEvent.
}
private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) {
// Добавьте здесь код для обработки события SettingsSaving.
}
}
}

120
TestWindow.xaml Normal file
View File

@@ -0,0 +1,120 @@
<RibbonWindow x:Class="GroundOrganizer.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:GroundOrganizer"
mc:Ignorable="d"
Title="TestWindow" >
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<Grid x:Name="MainGrid">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<!--<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>-->
<Ribbon Grid.Row="0" Grid.Column="0" x:Name="mainRibbon" Background="White" SelectedIndex="0" >
<Ribbon.HelpPaneContent>
<RibbonButton Label="Справка"/>
</Ribbon.HelpPaneContent>
<!--<Ribbon.QuickAccessToolBar>
<RibbonQuickAccessToolBar>
<RibbonButton x:Name ="Save" />
<RibbonSplitButton x:Name ="Undo" >
<RibbonSplitMenuItem Header="Undo 1" />
<RibbonSplitMenuItem Header="Undo 2" />
<RibbonSplitMenuItem Header="Undo 3" />
</RibbonSplitButton>
<RibbonSplitButton x:Name="Redo" >
<RibbonSplitMenuItem Header="Redo 1" />
<RibbonSplitMenuItem Header="Redo 2" />
</RibbonSplitButton>
</RibbonQuickAccessToolBar>
</Ribbon.QuickAccessToolBar>-->
<Ribbon.ApplicationMenu>
<RibbonApplicationMenu KeyTip="F">
<RibbonApplicationMenuItem Header="Настройки" />
<RibbonApplicationMenuItem Header="Выход" />
</RibbonApplicationMenu>
</Ribbon.ApplicationMenu>
<RibbonTab x:Name="HomeTab" Header="Главная" KeyTip="P" >
<!-- Home group-->
<RibbonGroup x:Name="PlaygroundGroup" Header="Площадки">
<RibbonButton LargeImageSource="/Images/Bookmark-add-icon32.png" Command="{Binding AddPlayGround}" KeyTip="AP"/>
<RibbonButton LargeImageSource="/Images/text-list-numbers-icon32.png" Command="{Binding RenumPlayGrounds}" KeyTip="X" />
<RibbonButton LargeImageSource="/Images/Save-icon32.png" Command="{Binding UpdatePlayGrounds}" KeyTip="Ctrl+S" />
</RibbonGroup>
</RibbonTab>
<!-- Ribbon Tab #2: -->
<RibbonTab Header="Insert" KeyTip="I">
</RibbonTab>
<!-- Ribbon Tab #3: -->
<RibbonTab Header="PageLayout" KeyTip="L">
</RibbonTab>
</Ribbon>
<!--<Menu x:Name="mainMenu" Grid.Row="0" HorizontalAlignment="Left" Height="22" VerticalAlignment="Top">
<MenuItem Header="Файл">
<MenuItem Header="New Project" ></MenuItem>
<MenuItem Header="Open Project" >
<MenuItem Header="WinForms"></MenuItem>
<MenuItem Header="WPF" ></MenuItem>
</MenuItem>
<Separator />
<MenuItem Header="Exit" ></MenuItem>
</MenuItem>
<MenuItem Header="Изменить" ></MenuItem>
<MenuItem Header="Вид" ></MenuItem>
<Button Content="Кнопка в меню" />
</Menu>-->
<Frame Grid.Row="1" Grid.Column="0" x:Name="contentFrame"
NavigationUIVisibility="Hidden"
VerticalAlignment="Bottom"
Source="/Pages/MainPage.xaml"/>
<StatusBar Grid.Row="2" Grid.Column="0" VerticalAlignment="Bottom" Height="19">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding BasePath}" FontSize="10" Foreground="Gray"/>
<TextBlock Text=" | " FontSize="10" HorizontalAlignment="Center"/>
<TextBlock Text="Площадка:" FontSize="10" HorizontalAlignment="Center"/>
<TextBlock Text=" " FontSize="10" HorizontalAlignment="Center"/>
<TextBlock Text="{Binding NamePlayGround}" FontSize="10" Foreground="Blue" FontWeight="Bold"/>
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Скважина:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameBore}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Сооружение:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameStructure}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Фундамент:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameFoundation}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
<TextBlock Text=" | " FontSize="10" />
<TextBlock Text="Нагрузка:" FontSize="10" />
<TextBlock Text=" " FontSize="10" />
<TextBlock Text="{Binding NameFoundLoad}" FontSize="10" Foreground="Blue" FontWeight="Bold" />
</StackPanel>
</StatusBar>
</Grid>
</RibbonWindow>

28
TestWindow.xaml.cs Normal file
View File

@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Ribbon;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace GroundOrganizer
{
/// <summary>
/// Логика взаимодействия для TestWindow.xaml
/// </summary>
public partial class TestWindow : RibbonWindow
{
public TestWindow()
{
InitializeComponent();
}
}
}

208
VM/BoresVM.cs Normal file
View File

@@ -0,0 +1,208 @@
using Microsoft.Win32;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TriangleNet.Geometry;
using TriangleNet.Meshing;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
private RelayCommand addBore;
private RelayCommand renumBore;
private RelayCommand updateBore;
private RelayCommand createBoresMesh;
private RelayCommand importBoresFromXLSX;
private RelayCommand exportBoresToXLSX;
int numBore = 1;
string nameBore;
private string boresNote;
Bore selectedBore;
ObservableCollection<Bore> listBore = new ObservableCollection<Bore>();
public string BoresNote { get => boresNote; set { boresNote = value; OnPropertyChanged(); } }
public Bore SelectedBore { get => selectedBore; set { selectedBore = value; OnPropertyChanged(); ChangeSelectedBore(); } }
public string NameBore { get => nameBore; set { nameBore = value; OnPropertyChanged(); } }
public ObservableCollection<Bore> ListBore { get => listBore; set { listBore = value; OnPropertyChanged(); } }
public TriangleNet.Mesh MeshBores { get; private set; }
public RelayCommand AddBore
{
get { return addBore ?? (addBore = new RelayCommand(obj => { AddBoreToList(); })); }
}
public RelayCommand UpdateBores
{
get { return updateBore ?? (updateBore = new RelayCommand(obj => { UpdateBoreInList(); })); }
}
public RelayCommand RenumBores
{
get { return renumBore ?? (renumBore = new RelayCommand(obj => { RenumberingBoreInList(); })); }
}
public RelayCommand CreateBoresMesh
{
get { return createBoresMesh ?? (createBoresMesh = new RelayCommand(obj => { CreateMeshBores(); })); }
}
public RelayCommand ExportBoresToXLSX
{
get { return exportBoresToXLSX ?? (exportBoresToXLSX = new RelayCommand(obj => { SaveBoresInXlsx(); })); }
}
public RelayCommand ImportBoresFromXLSX
{
get { return importBoresFromXLSX ?? (importBoresFromXLSX = new RelayCommand(obj => { ReadBoresFromXlsx(); })); }
}
//Чтение таблицы набора скважин из файла *.xlsx
internal void ReadBoresFromXlsx()
{
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();
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; Bore 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 Bore(); item.ListToProps(source);
ListBore.Add(item);
}
}
}
//Сохранение таблицы набора ИГЭ в файл *.csv
internal void SaveBoresInXlsx()
{
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 (Bore item in listBore)
{
content.Add(item.PropsToList().ToArray());
}
using (var p = new ExcelPackage(new FileInfo(sfd.FileName)))
{
try
{
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);
ExcelWorksheet ws = p.Workbook.Worksheets["Скважины"];
//Save the new workbook. We haven't specified the filename so use the Save as method.
ws.Cells["A2"].LoadFromArrays(content);
ws.Select();
p.SaveAs(new FileInfo(sfd.FileName));
}
}
}
private void CreateMeshBores()
{
if (listBore == null || listBore.Count == 0) return;
Polygon polygon = new Polygon();
Vertex vrtx;
int i = 1;
foreach (Bore item in listBore)
{
vrtx = new Vertex(item.X, item.Y, item.Number, 2);
polygon.Add(vrtx);
i++;
}
ConstraintOptions constraint = new ConstraintOptions() { Convex = true };
MeshBores = (TriangleNet.Mesh)polygon.Triangulate(constraint);
Alert("Триангуляционная сеть скважин создана");
}
void AddBoreToList()
{
ListBore.Add(new Bore() { Number = numBore }); numBore++;
//CreateListNumberTypeBet();
//NameBore = listBore[0].Name;
}
void RenumberingBoreInList()
{
int j = 1;
foreach (Bore item in ListBore)
{
item.Number = j;
j++;
}
numBore = j;
ListBore = new ObservableCollection<Bore>(ListBore);
}
void UpdateBoreInList()
{
ListBore = new ObservableCollection<Bore>(ListBore);
SaveDB();
}
void ChangeSelectedBore()
{
if (listBore.Count == 0 || selectedBore == null) return;
NameBore = selectedBore.Name;
ListLayer = selectedBore.Layers;
}
}
}

175
VM/CalculationsVM.cs Normal file
View File

@@ -0,0 +1,175 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing;
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 Microsoft.Win32;
using netDxf;
using netDxf.Entities;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
private RelayCommand calcFoundsContours;
private RelayCommand calcRinBore;
private RelayCommand calcRinBores;
private RelayCommand calcRinCoords;
private RelayCommand calcSpInBore;
private RelayCommand calcSpInBores;
private ObservableCollection<DataR> resR;
private ObservableCollection<DataS> resS;
private List<DataPair> resSdata;
private List<DataPair> resRdata;
private DataR resRselected;
private List<TypeFound> listTypeFounds;
public DataR ResRselected { get => resRselected; set { resRselected = value; OnPropertyChanged(); ChangeSelectedResults(); } }
public ObservableCollection<DataR> ResR { get => resR; set { resR = value; OnPropertyChanged(); } }
public ObservableCollection<DataS> ResS { get => resS; set { resS = value; OnPropertyChanged(); } }
public List<DataPair> ResRdata { get => resRdata; set { resRdata = value; OnPropertyChanged(); } }
public List<DataPair> ResSdata { get => resSdata; set { resSdata = value; OnPropertyChanged(); } }
public RelayCommand CalcFoundsContours
{
get { return calcFoundsContours ?? (calcFoundsContours = new RelayCommand(obj => { CalculateContoursFounds(); })); }
}
public RelayCommand CalcRinBore
{
get { return calcRinBore ?? (calcRinBore = new RelayCommand(obj => { CalculateRinBore(); })); }
}
public RelayCommand CalcRinBores
{
get { return calcRinBores ?? (calcRinBores = new RelayCommand(obj => { CalculateRinBores(); })); }
}
public RelayCommand CalcRinCoords
{
get { return calcRinCoords ?? (calcRinCoords = new RelayCommand(obj => { CalculateRinCoords(); })); }
}
public RelayCommand CalcSpInBore
{
get { return calcSpInBore ?? (calcSpInBore = new RelayCommand(obj => { CalculateSpInBore(); })); }
}
public RelayCommand CalcSpInBores
{
get { return calcSpInBores ?? (calcSpInBores = new RelayCommand(obj => { CalculateSpInBores(); })); }
}
private void CalculateContoursFounds()
{
if (listFoundation == null || listFoundation.Count == 0) return;
foreach (Foundation item in listFoundation) item.CalcContour();
ListFoundation = new ObservableCollection<Foundation>(listFoundation);
}
void ChangeSelectedResults()
{
if (resR == null || resR.Count == 0) return;
ResRdata = resRselected.SmallData;
}
void CalculateSpInBore()
{
if (selectedBore == null) { Alert("Не выбрана расчетная скважина"); return; }
if (selectedFoundation == null) { Alert("Не выбран фундамент для расчета"); return; }
if (selectedFoundLoad == null) { Alert("Не выбрана расчетная нагрузка"); return; }
if (resS == null) ResS = new ObservableCollection<DataS>();
ResS.Clear();
DataS s = selectedFoundation.Sp(selectedBore, selectedFoundLoad);
s.Bore = "Скв. " + nameBore;
s.Base = nameFoundation;
ResS.Add(s);
ResultsPage resPage = new ResultsPage();
MW.ResulsFrame.Content = resPage;
resPage.ResultsDataGrid.ItemsSource = ResS;
MW.MainTabControl.SelectedIndex = 5;
//FoundationsPage foundPage = (FoundationsPage)MW.FoundationsFrame.Content;
//resPage.resultExpander.IsExpanded = true;
}
void CalculateSpInBores()
{
if (listBore == null) { Alert("Площадка не содержит ни одной скважины"); return; }
if (selectedFoundation == null) { Alert("Не выбран фундамент для расчета"); return; }
if (selectedFoundLoad == null) { Alert("Не выбрана расчетная нагрузка"); return; }
if (resS == null) ResS = new ObservableCollection<DataS>();
ResS.Clear();
foreach (Bore item in listBore)
{
DataS s = selectedFoundation.Sp(item, selectedFoundLoad);
s.Bore = "Скв. " + item.Name;
s.Base = nameFoundation;
ResS.Add(s);
}
ResultsPage resPage = new ResultsPage();
MW.ResulsFrame.Content = resPage;
resPage.ResultsDataGrid.ItemsSource = ResS;
MW.MainTabControl.SelectedIndex = 5;
//FoundationsPage foundPage = (FoundationsPage)MW.FoundationsFrame.Content;
//foundPage.ResultsDataGrid.ItemsSource = ResS;
//foundPage.resultExpander.IsExpanded = true;
}
void CalculateRinBore()
{
if (selectedBore == null) { Alert("Не выбрана расчетная скважина"); return; }
if (selectedFoundation == null) { Alert("Не выбран фундамент для расчета"); return; }
if (resR == null) ResR = new ObservableCollection<DataR>();
ResR.Clear();
DataR r = selectedFoundation.P(selectedBore, selectedStructure.flexStructure, selectedStructure.L, selectedStructure.H);
ResR.Add(r);
ResultsPage resPage = new ResultsPage();
MW.ResulsFrame.Content = resPage;
//resPage.ResultsDataGrid.ItemsSource = ResR;
//resPage.DetailedResultsDataGrid.ItemsSource = ResRdata;
MW.MainTabControl.SelectedIndex = 5;
//FoundationsPage foundPage = (FoundationsPage)MW.FoundationsFrame.Content;
//foundPage.ResultsDataGrid.ItemsSource = ResR;
//foundPage.resultExpander.IsExpanded = true;
}
private void CalculateRinBores()
{
if (listBore == null) { Alert("Площадка не содержит ни одной скважины"); return; }
if (selectedFoundation == null) { Alert("Не выбран фундамент для расчета"); return; }
ResR = selectedFoundation.P(ListBore, selectedStructure.flexStructure, selectedStructure.L, selectedStructure.H);
ResultsPage resPage = new ResultsPage();
MW.ResulsFrame.Content = resPage;
//resPage.ResultsDataGrid.ItemsSource = ResR;
//resPage.DetailedResultsDataGrid.ItemsSource = ResRdata;
MW.MainTabControl.SelectedIndex = 5;
//FoundationsPage foundPage = (FoundationsPage)MW.FoundationsFrame.Content;
//foundPage.ResultsDataGrid.ItemsSource = ResR;
//foundPage.resultExpander.IsExpanded = true;
}
private void CalculateRinCoords()
{
if (selectedBore == null) return;
if (resR == null) ResR = new ObservableCollection<DataR>();
ResR.Clear();
DataR r = SelectedFoundation.P(selectedBore, selectedStructure.flexStructure, selectedStructure.L, selectedStructure.H);
r.Bore = "По координатам";
r.Base = nameFoundation;
ResR.Add(r);
//FoundationsPage foundPage = (FoundationsPage)MW.FoundationsFrame.Content;
//foundPage.ResultsDataGrid.ItemsSource = ResR;
//foundPage.resultExpander.IsExpanded = true;
}
}
}

81
VM/DrawingVM.cs Normal file
View File

@@ -0,0 +1,81 @@
using netDxf;
using netDxf.Entities;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
private RelayCommand drowFoundations;
private RelayCommand showFoundProps;
CanwasWindow cw;
public RelayCommand DrowFoundations
{
get { return drowFoundations ?? (drowFoundations = new RelayCommand(obj => { DrowFounds(); })); }
}
public RelayCommand ShowFoundProps
{
get { return showFoundProps ?? (showFoundProps = new RelayCommand(obj => { ShowFoundPropsWindow(); })); }
}
internal void ShowFoundPropsWindow()
{
if (listFoundation.Count == 0) return;
if (listFoundation == null) return;
FoundPropWindow fpw = new FoundPropWindow();
fpw.Owner = MW;
fpw.DataContext = MW.DataContext;
fpw.Top = 75;
fpw.Left = 75;
fpw.ShowDialog();
}
internal void DrowFounds()
{
if (listFoundation.Count == 0) return;
if (listFoundation == null) return;
CalculateContoursFounds();
CreateSmallPropsFounds();
int t = 75;
int l = 75;
double ws = SystemParameters.PrimaryScreenWidth;
double hs = SystemParameters.PrimaryScreenHeight;
cw = new CanwasWindow();
cw.Top = t;
cw.Left = l;
cw.MaxHeight= hs - t - 37;
cw.MaxWidth= ws - l - 5;
cw.CanvasScrollViewer.MaxWidth = cw.MaxWidth;
cw.CanvasScrollViewer.MaxHeight = cw.MaxHeight-60;
cw.Owner = MW;
CanvasDrafter.DrawFoundations(listFoundation, cw.drawArea, cw.MaxHeight - 120);
cw.drawArea.MinHeight = cw.drawArea.Height;
cw.drawArea.MinWidth = cw.drawArea.Width;
cw.EventMouseEnter();
cw.Show();
}
internal void DrowFoundsNums()
{
if (cw == null || cw.IsActive == false) return;
CanvasDrafter.DrawFoundationsNumbers(listFoundation, cw.drawArea);
}
}
}

188
VM/FoundLoadsVM.cs Normal file
View File

@@ -0,0 +1,188 @@
using Microsoft.Win32;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
private RelayCommand addFoundLoad;
private RelayCommand updateFoundLoad;
private RelayCommand renumFoundLoad;
private RelayCommand exportFoundLoadsToCSV;
private RelayCommand importFoundLoadsFromCSV;
int numFoundLoad = 1;
string nameFoundLoad;
FoundLoad selectedFoundLoad;
ObservableCollection<FoundLoad> listFoundLoad = new ObservableCollection<FoundLoad>();
public ObservableCollection<FoundLoad> ListFoundLoad { get => listFoundLoad; set { listFoundLoad = value; OnPropertyChanged(); } }
public RelayCommand AddFoundLoad
{
get { return addFoundLoad ?? (addFoundLoad = new RelayCommand(obj => { AddFoundLoadToList(); })); }
}
public RelayCommand UpdateFoundLoads
{
get { return updateFoundLoad ?? (updateFoundLoad = new RelayCommand(obj => { UpdateFoundLoadInList(); })); }
}
public RelayCommand RenumFoundLoads
{
get { return renumFoundLoad ?? (renumFoundLoad = new RelayCommand(obj => { RenumberingFoundLoadInList(); })); }
}
public RelayCommand ExportFoundLoadsToCSV
{
get { return exportFoundLoadsToCSV ?? (exportFoundLoadsToCSV = new RelayCommand(obj => { SaveLoadsInXlsx(); })); }
}
public RelayCommand ImportFoundLoadsFromCSV
{
get { return importFoundLoadsFromCSV ?? (importFoundLoadsFromCSV = new RelayCommand(obj => { ReadLoadsFromXlsx(); })); }
}
public FoundLoad SelectedFoundLoad { get => selectedFoundLoad; set { selectedFoundLoad = value; OnPropertyChanged(); ChangeSelectedFoundLoad(); } }
public string NameFoundLoad { get => nameFoundLoad; set { nameFoundLoad = value; OnPropertyChanged(); } }
void AddFoundLoadToList()
{
ListFoundLoad.Add(new FoundLoad() { Number = numFoundLoad }); numFoundLoad++;
//CreateListNumberTypeBet();
//NameFoundLoad = listFoundLoad[0].Name;
}
void RenumberingFoundLoadInList()
{
int j = 1;
foreach (FoundLoad item in ListFoundLoad)
{
item.Number = j;
j++;
}
numFoundLoad = j;
ListFoundLoad = new ObservableCollection<FoundLoad>(ListFoundLoad);
SaveDB();
}
internal void UpdateFoundLoadInList()
{
ListFoundLoad = new ObservableCollection<FoundLoad>(ListFoundLoad);
SaveDB();
}
void ChangeSelectedFoundLoad()
{
if (listFoundLoad.Count == 0 || selectedFoundLoad == null) return;
NameFoundLoad = SelectedFoundLoad.Number.ToString();
}
//Сохранение таблицы нагрузок в файл *.xlsx
internal void SaveLoadsInXlsx()
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.DefaultExt = "*.xlsx";
sfd.Filter = "Файл Excel (*.xlsx)|*.xlsx";
sfd.Title = "Сохранение таблицы";
//sfd.AddExtension = true;
sfd.OverwritePrompt = true;
sfd.ShowDialog();
if (sfd.FileName == null || sfd.FileName == "") return;
try
{
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);
}
}
using (var p = new ExcelPackage(new FileInfo(sfd.FileName)))
{
for (int i = 0; i < listFoundation.Count; i++)
{
List<object[]> content = new List<object[]>();
foreach (FoundLoad fli in listFoundation[i].Loads)
{
content.Add(fli.PropsToList().ToArray());
}
ExcelPackage p1 = new ExcelPackage(new FileInfo("ИГЭ.xlsx"));
//A workbook must have at least on cell, so lets add one...
var ws = p1.Workbook.Worksheets["Нагрузки"];
p.Workbook.Worksheets.Add((i + 1).ToString(), ws);
var wsi = p.Workbook.Worksheets[i + 1];
//To set values in the spreadsheet use the Cells indexer.
wsi.Cells["D1"].Value = listFoundation[i].Number;
wsi.Cells["F1"].Value = listFoundation[i].Name;
wsi.Cells["A3"].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 (Exception e)
{
Alert(e.Message);
}
}
//Чтение нагрузок из файла *.xlsx
internal void ReadLoadsFromXlsx()
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.DefaultExt = "*.xlsx";
ofd.Filter = "Файл Excel (*.xlsx)|*.xlsx";
ofd.Title = "Заполнение таблиц";
ofd.ShowDialog();
if (ofd.FileName == null || ofd.FileName == "") return;
//ListFoundLoad.Clear();
try
{
using (var p = new ExcelPackage(new FileInfo(ofd.FileName)))
{
int k = 0;
foreach (ExcelWorksheet wsi in p.Workbook.Worksheets)
{
listFoundation[k].Loads = new ObservableCollection<FoundLoad>();
object[,] content = wsi.Cells.Value as object[,];
List<object> source; FoundLoad item;
for (int i = 2; 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 FoundLoad(); item.ListToProps(source);
listFoundation[k].Loads.Add(item);
}
k++;
}
}
}
catch (Exception e)
{
Alert(e.Message);
}
}
}
}

401
VM/FoundationsVM.cs Normal file
View File

@@ -0,0 +1,401 @@
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();
}
}
}

94
VM/HelpsVM.cs Normal file
View File

@@ -0,0 +1,94 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
private RelayCommand helpFoundation;
private RelayCommand helpLoads;
public RelayCommand HelpFoundation
{
get { return helpFoundation ?? (helpFoundation = new RelayCommand(obj => { HelpFoundAlert(); })); }
}
public RelayCommand HelpLoads
{
get { return helpLoads ?? (helpLoads = new RelayCommand(obj => { HelpLoadsAlert(); })); }
}
void HelpFoundAlert()
{
Alert(Properties.Resources.ShemaFound, 500);
if (MW.OwnedWindows.Count > 0)
{
foreach (Window item in MW.OwnedWindows) item.Close();
Alert(Properties.Resources.ShemaFound, 500);
}
}
void HelpLoadsAlert()
{
Alert(@"\Images\ShemaLoads.png", 200);
if (MW.OwnedWindows.Count > 0)
{
foreach (Window item in MW.OwnedWindows) item.Close();
Alert(@"\Images\ShemaLoads.png", 200);
}
}
void Alert(string alert)
{
AlertWindow aw = new AlertWindow();
aw.Owner = MW;
aw.alertLabel.Content = alert;
//aw.WindowStyle = WindowStyle.None;
aw.ShowDialog();
}
void Alert(string alert, string title)
{
AlertWindow aw = new AlertWindow();
aw.Owner = MW;
aw.alertLabel.Content = alert;
aw.Title = title;
aw.ShowDialog();
}
void Alert(Bitmap resource, int h = 250)
{
ImageWindow aw = new ImageWindow();
//BitmapImage b =new BitmapImage(new Uri("pack://application:,,,/Resources/ShemaFound.png"));
Bitmap br = resource;
BitmapSource b = Imaging.CreateBitmapSourceFromHBitmap(br.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
aw.alertImage.Source = b;
aw.alertImage.Height = h;
aw.Owner = MW;
aw.WindowStartupLocation = WindowStartupLocation.Manual;
aw.Top = MW.Top;
aw.Left = MW.Left + MW.Width;
aw.Show();
}
void Alert(string filepath, int h = 250)
{
Uri uri = new Uri(filepath, UriKind.RelativeOrAbsolute);
BitmapImage b = new BitmapImage(uri);
ImageWindow aw = new ImageWindow();
aw.alertImage.Source = b;
aw.alertImage.Height = h;
aw.Owner = MW;
aw.WindowStartupLocation = WindowStartupLocation.Manual;
aw.Top = MW.Top;
aw.Left = MW.Left + MW.Width;
aw.Show();
}
}
}

278
VM/IGEsVM.cs Normal file
View File

@@ -0,0 +1,278 @@
using Microsoft.Win32;
using OfficeOpenXml;
using OfficeOpenXml.Style;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
int numIGE = 1;
ObservableCollection<IGE> listIGE = new ObservableCollection<IGE>();
public ObservableCollection<IGE> ListIGE { get => listIGE; set { listIGE = value; OnPropertyChanged(); } }
private RelayCommand addIGE;
public RelayCommand AddIGE
{
get { return addIGE ?? (addIGE = new RelayCommand(obj => { AddIGEToList(); })); }
}
private RelayCommand updateIGE;
public RelayCommand UpdateIGEs
{
get { return updateIGE ?? (updateIGE = new RelayCommand(obj => { UpdateIGEInList(); })); }
}
private RelayCommand renumIGE;
public RelayCommand RenumIGEs
{
get { return renumIGE ?? (renumIGE = new RelayCommand(obj => { RenumberingIGEInList(); })); }
}
private RelayCommand exportIGEtoCSV;
public RelayCommand ExportIGEtoCSV
{
get { return exportIGEtoCSV ?? (exportIGEtoCSV = new RelayCommand(obj => { SaveIGEsInCsv(); })); }
}
private RelayCommand importIGEfromCSV;
public RelayCommand ImportIGEfromCSV
{
get { return importIGEfromCSV ?? (importIGEfromCSV = new RelayCommand(obj => { ReadIGEsFromCsv(); })); }
}
private RelayCommand saveIGEsTable;
public RelayCommand SaveIGEsTable
{
get { return saveIGEsTable ?? (saveIGEsTable = new RelayCommand(obj => { SaveIGEs(); })); }
}
private IEnumerable<String> listNumIGEs;
public IEnumerable<String> ListNumIGEs { get => listNumIGEs; set { listNumIGEs = value; OnPropertyChanged(); } }
void AddIGEToList()
{
ListIGE.Add(new IGE() { Number = numIGE }); numIGE++;
CreateListNumIGEs();
//CreateListNumberTypeBet();
//NameIGE = listIGE[0].Name;
}
void RenumberingIGEInList()
{
int j = 1;
foreach (IGE item in ListIGE)
{
item.Number = j;
j++;
}
numIGE = j;
ListIGE = new ObservableCollection<IGE>(ListIGE);
CreateListNumIGEs();
}
void UpdateIGEInList()
{
ListIGE = new ObservableCollection<IGE>(ListIGE);
SaveDB();
}
void CreateListNumIGEs()
{
if (listIGE == null || listPlayGround == null) return;
ListNumIGEs = from bet in listIGE select bet.NumIGE;
try
{
BoresPage boresPage = (BoresPage)MW.BoresFrame.Content;
boresPage.IGEsListCbxCol.ItemsSource = listNumIGEs;
}
catch { return; }
}
//Сохранение таблицы набора ИГЭ в файл *.csv
internal void SaveIGEsInCsv()
{
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 (IGE item in listIGE)
{
content.Add(item.PropsToList().ToArray());
}
using (var p = new ExcelPackage(new FileInfo(sfd.FileName)))
{
try
{
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);
ExcelWorksheet ws = p.Workbook.Worksheets["ИГЭ"];
//Save the new workbook. We haven't specified the filename so use the Save as method.
ws.Cells["A2"].LoadFromArrays(content);
ws.Select();
p.SaveAs(new FileInfo(sfd.FileName));
}
}
//try
//{
// using (StreamWriter sw = new StreamWriter(sfd.FileName, false, System.Text.Encoding.Default))
// {
// foreach (IGE item in listIGE)
// {
// sw.WriteLine(item.PropsToString());
// }
// }
//}
//catch (Exception e)
//{
// Alert(e.Message);
//}
}
//Чтение таблицы набора ИГЭ из файла *.csv
internal void ReadIGEsFromCsv()
{
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();
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; IGE 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 IGE(); item.ListToProps(source);
ListIGE.Add(item);
}
}
//OpenFileDialog ofd = new OpenFileDialog();
//ofd.DefaultExt = "*.*";
//ofd.Filter = "Текстовый файл (*.csv)|*.csv|Все файлы (*.*)|*.*";
//ofd.Title = "Заполнение таблицы";
//ofd.ShowDialog();
//if (ofd.FileName == null || ofd.FileName == "") return;
//ListIGE.Clear();
//try
//{
// using (StreamReader sr = new StreamReader(ofd.FileName, System.Text.Encoding.Default))
// {
// string line;
// IGE ige;
// while ((line = sr.ReadLine()) != null)
// {
// ige = new IGE();
// ige.StringToProps(line);
// ListIGE.Add(ige);
// }
// }
//}
//catch (Exception e)
//{
// Alert(e.Message);
//}
}
internal void SaveIGEs()
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.DefaultExt = "*.igedb";
sfd.Filter = "Таблица ИГЭ (*.igedb)|*.igedb";
sfd.Title = "Сохранение таблицы";
//sfd.AddExtension = true;
sfd.OverwritePrompt = true;
sfd.ShowDialog();
if (sfd.FileName == null || sfd.FileName == "") return;
BinaryFormatter formatter = new BinaryFormatter();
// получаем поток, куда будем записывать сериализованный объект
using (FileStream fs = new FileStream(sfd.FileName, FileMode.OpenOrCreate))
{
formatter.Serialize(fs, ListIGE);
}
//Alert("Введенные данные успешно сохранены");
}
internal void ReadIGEs()
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.DefaultExt = "*.igedb";
ofd.Filter = "Таблица ИГЭ (*.igedb)|*.igedb";
ofd.Title = "Открытие таблицы";
ofd.ShowDialog();
if (ofd.FileName == null || ofd.FileName == "") return;
if (File.Exists(ofd.FileName) == true)
{
// создаем объект BinaryFormatter
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream fs = new FileStream(ofd.FileName, FileMode.OpenOrCreate))
{
List<IGE> tmp = new List<IGE>(ListIGE);
tmp.AddRange(formatter.Deserialize(fs) as ObservableCollection<IGE>);
ListIGE = new ObservableCollection<IGE>(tmp);
}
}
}
}
}

244
VM/LayersVM.cs Normal file
View File

@@ -0,0 +1,244 @@
using Microsoft.Win32;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
private RelayCommand addLayer;
private RelayCommand updateLayer;
private RelayCommand renumLayer;
private RelayCommand recalcLayerH;
private RelayCommand recalcLayerDown;
private RelayCommand exportLayersToXLSX;
private RelayCommand importLayersFromXLSX;
int numLayer = 1;
ObservableCollection<Layer> listLayer = new ObservableCollection<Layer>();
public ObservableCollection<Layer> ListLayer { get => listLayer; set { listLayer = value; OnPropertyChanged(); } }
public RelayCommand AddLayer
{
get { return addLayer ?? (addLayer = new RelayCommand(obj => { AddLayerToList(); })); }
}
public RelayCommand UpdateLayers
{
get { return updateLayer ?? (updateLayer = new RelayCommand(obj => { UpdateLayerInList(); })); }
}
public RelayCommand RenumLayers
{
get { return renumLayer ?? (renumLayer = new RelayCommand(obj => { RenumberingLayerInList(); })); }
}
public RelayCommand RecalcLayerH
{
get { return recalcLayerH ?? (recalcLayerH = new RelayCommand(obj => { RecalcInLayersH(); })); }
}
public RelayCommand RecalcLayerDown
{
get { return recalcLayerDown ?? (recalcLayerDown = new RelayCommand(obj => { RecalcInLayersDown(); })); }
}
public RelayCommand ExportLayersToXLSX
{
get { return exportLayersToXLSX ?? (exportLayersToXLSX = new RelayCommand(obj => { SaveLayersInXlsx(); })); }
}
public RelayCommand ImportLayersFromXLSX
{
get { return importLayersFromXLSX ?? (importLayersFromXLSX = new RelayCommand(obj => { ReadLayersFromXlsx(); })); }
}
void AddLayerToList()
{
ListLayer.Add(new Layer() { Number = numLayer }); numLayer++;
//CreateListNumberTypeBet();
//NameLayer = listLayer[0].Name;
}
void RenumberingLayerInList()
{
int j = 1;
foreach (Layer item in listLayer)
{
item.Number = j;
j++;
}
numLayer = j;
ListLayer = new ObservableCollection<Layer>(listLayer);
}
void UpdateLayerInList()
{
foreach (Layer lay in listLayer)
{
foreach (IGE ige in listIGE)
{
if (lay.NumIGE==ige.NumIGE)
{
lay.IGE = ige.Clone();
lay.Description = ige.Description;
break;
}
}
}
ListLayer = new ObservableCollection<Layer>(listLayer);
selectedBore.Layers = listLayer;
SaveDB();
}
void RecalcInLayersH()
{
if (listLayer == null) return;
if (listLayer.Count == 0) return;
if (selectedBore == null) return;
UpdateLayerInList();
double down = 0;
double up = 0;
double z = selectedBore.Z;
foreach (Layer item in listLayer)
{
z -= item.H;
down += item.H;
item.Down = down;
item.Z = z;
item.Up = up;
up += item.H;
}
ListLayer = new ObservableCollection<Layer>(listLayer);
}
void RecalcInLayersDown()
{
if (listLayer == null) return;
if (listLayer.Count == 0) return;
if (selectedBore == null) return;
UpdateLayerInList();
double up = 0;
double z = selectedBore.Z;
foreach (Layer item in listLayer)
{
item.Up = up;
item.H = item.Down - item.Up;
z -= item.H;
item.Z = z;
up += item.H;
}
ListLayer = new ObservableCollection<Layer>(listLayer);
}
//Сохранение таблиц наборов слоев в файл *.xlsx
internal void SaveLayersInXlsx()
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.DefaultExt = "*.xlsx";
sfd.Filter = "Файл Excel (*.xlsx)|*.xlsx";
sfd.Title = "Сохранение таблицы";
//sfd.AddExtension = true;
sfd.OverwritePrompt = true;
sfd.ShowDialog();
if (sfd.FileName == null || sfd.FileName == "") return;
try
{
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);
}
}
using (var p = new ExcelPackage(new FileInfo(sfd.FileName)))
{
for (int i = 0; i < listBore.Count; i++)
{
List<object[]> content = new List<object[]>();
foreach (Layer fli in listBore[i].Layers)
{
content.Add(fli.PropsToList().ToArray());
}
ExcelPackage p1 = new ExcelPackage(new FileInfo("ИГЭ.xlsx"));
//A workbook must have at least on cell, so lets add one...
var ws = p1.Workbook.Worksheets["Слои"];
p.Workbook.Worksheets.Add((i + 1).ToString(), ws);
var wsi = p.Workbook.Worksheets[i + 1];
//To set values in the spreadsheet use the Cells indexer.
wsi.Cells["D1"].Value = listBore[i].Name;
wsi.Cells["A3"].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 (Exception e)
{
Alert(e.Message);
}
}
//Чтение наборов слоев из файла *.xlsx
internal void ReadLayersFromXlsx()
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.DefaultExt = "*.xlsx";
ofd.Filter = "Файл Excel (*.xlsx)|*.xlsx";
ofd.Title = "Заполнение таблиц";
ofd.ShowDialog();
if (ofd.FileName == null || ofd.FileName == "") return;
//ListFoundLoad.Clear();
try
{
using (var p = new ExcelPackage(new FileInfo(ofd.FileName)))
{
int k = 0;
foreach (ExcelWorksheet wsi in p.Workbook.Worksheets)
{
listBore[k].Layers = new ObservableCollection<Layer>();
object[,] content = wsi.Cells.Value as object[,];
List<object> source; Layer item;
for (int i = 2; 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 Layer(); item.ListToProps(source);
listBore[k].Layers.Add(item);
SelectedBore = listBore[k];
UpdateLayerInList();
}
k++;
}
}
}
catch (Exception e)
{
Alert(e.Message);
}
}
}
}

363
VM/PlanningVM.cs Normal file
View File

@@ -0,0 +1,363 @@
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<PlanningVertex> redPlanning = new ObservableCollection<PlanningVertex>();
ObservableCollection<PlanningVertex> blackPlanning = new ObservableCollection<PlanningVertex>();
public ObservableCollection<PlanningVertex> RedPlanning { get => redPlanning; set { redPlanning = value; OnPropertyChanged(); } }
public ObservableCollection<PlanningVertex> 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<Text> 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<PlanningVertex>(RedPlanning);
}
void UpdateRedVertexesInList()
{
RedPlanning = new ObservableCollection<PlanningVertex>(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<PlanningVertex>(BlackPlanning);
}
void UpdateBlackVertexesInList()
{
BlackPlanning = new ObservableCollection<PlanningVertex>(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("\"Черная\" триангуляционная сеть создана");
}
}
}

87
VM/PlayGroundVM.cs Normal file
View File

@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
int numPG = 1;
PlayGround selectedPlayGround;
string namePlayGround;
ObservableCollection<PlayGround> listPlayGround = new ObservableCollection<PlayGround>();
public ObservableCollection<PlayGround> ListPlayGround { get => listPlayGround; set { listPlayGround = value; OnPropertyChanged(); } }
public string NamePlayGround { get => namePlayGround; set { namePlayGround = value; OnPropertyChanged(); } }
public PlayGround SelectedPlayGround { get => selectedPlayGround; set { selectedPlayGround = value; OnPropertyChanged(); ChangeSelectedPlayGround(); } }
private RelayCommand addPlayGround;
public RelayCommand AddPlayGround
{
get { return addPlayGround ?? (addPlayGround = new RelayCommand(obj => { AddPlayGroundToList(); })); }
}
private RelayCommand updatePlayGround;
public RelayCommand UpdatePlayGrounds
{
get { return updatePlayGround ?? (updatePlayGround = new RelayCommand(obj => { UpdatePlayGroundInList(); })); }
}
private RelayCommand renumPlayGround;
public RelayCommand RenumPlayGrounds
{
get { return renumPlayGround ?? (renumPlayGround = new RelayCommand(obj => { RenumberingPlayGroundInList(); })); }
}
void AddPlayGroundToList()
{
ListPlayGround.Add(new PlayGround() { Number = numPG }); numPG++;
//CreateListNumberTypeBet();
//NamePlayGround = listPlayGround[0].Name;
}
void RenumberingPlayGroundInList()
{
int j = 1;
foreach (PlayGround item in ListPlayGround)
{
item.Number = j;
j++;
}
numPG = j;
ListPlayGround = new ObservableCollection<PlayGround>(ListPlayGround);
}
void UpdatePlayGroundInList()
{
ListPlayGround = new ObservableCollection<PlayGround>(ListPlayGround);
SaveDB();
}
//void ChangeSelClassBet()
//{
// //if (selectedBet==null) return;
// CreateListNumberTypeBet();
//}
//void CreateListNumberTypeBet()
//{
// //listNumberTypeArm = new List<int>();
// ListNumberTypeBet = from bet in listBet select bet.Id;
//}
void ChangeSelectedPlayGround()
{
if (listPlayGround.Count == 0 || selectedPlayGround == null) return;
NamePlayGround = SelectedPlayGround.Name;
ListIGE = selectedPlayGround.IGEs;
ListBore = selectedPlayGround.Bores;
ListStructure = selectedPlayGround.Structures;
CreateListNumIGEs();
CreateListShemas();
CreateListTypeFoundations();
}
}
}

38
VM/RelayCommand.cs Normal file
View File

@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace GroundOrganizer
{
public class RelayCommand : ICommand
{
private Action<object> execute;
private Func<object, bool> canExecute;
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
{
this.execute = execute;
this.canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return this.canExecute == null || this.canExecute(parameter);
}
public void Execute(object parameter)
{
this.execute(parameter);
}
}
}

96
VM/StructuresVM.cs Normal file
View File

@@ -0,0 +1,96 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
int numStructure = 1;
string nameStructure;
private string structureNote;
Structure selectedStructure;
ObservableCollection<Structure> listStructure = new ObservableCollection<Structure>();
public ObservableCollection<Structure> ListStructure { get => listStructure; set { listStructure = value; OnPropertyChanged(); } }
private IEnumerable<TypeFlexStructure> listShemas;
public IEnumerable<TypeFlexStructure> ListShemas { get => listShemas; set { listShemas = value; OnPropertyChanged(); } }
public string StructureNote { get => structureNote; set { structureNote = value; OnPropertyChanged(); } }
private RelayCommand addStructure;
public RelayCommand AddStructure
{
get { return addStructure ?? (addStructure = new RelayCommand(obj => { AddStructureToList(); })); }
}
private RelayCommand updateStructure;
public RelayCommand UpdateStructures
{
get { return updateStructure ?? (updateStructure = new RelayCommand(obj => { UpdateStructureInList(); })); }
}
private RelayCommand renumStructure;
public RelayCommand RenumStructures
{
get { return renumStructure ?? (renumStructure = new RelayCommand(obj => { RenumberingStructureInList(); })); }
}
public Structure SelectedStructure { get => selectedStructure; set { selectedStructure = value; OnPropertyChanged(); ChangeSelectedStructure(); } }
public string NameStructure { get => nameStructure; set { nameStructure = value; OnPropertyChanged(); } }
void AddStructureToList()
{
ListStructure.Add(new Structure() { Number = numStructure }); numStructure++;
//NameStructure = listStructure[0].Name;
}
void RenumberingStructureInList()
{
int j = 1;
foreach (Structure item in ListStructure)
{
item.Number = j;
j++;
}
numStructure = j;
ListStructure = new ObservableCollection<Structure>(ListStructure);
}
void UpdateStructureInList()
{
ListStructure = new ObservableCollection<Structure>(ListStructure);
SaveDB();
}
void ChangeSelectedStructure()
{
if (listStructure.Count == 0 || selectedStructure == null) return;
NameStructure = selectedStructure.Name;
ListFoundation = selectedStructure.Foundations;
RedPlanning = selectedStructure.RedPlanning;
BlackPlanning = selectedStructure.BlackPlanning;
if (redPlanning == null) RedPlanning = new ObservableCollection<PlanningVertex>();
if (blackPlanning == null) BlackPlanning = new ObservableCollection<PlanningVertex>();
}
void CreateListShemas()
{
if (listStructure == null || listPlayGround == null) return;
ListShemas = new List<TypeFlexStructure>() { TypeFlexStructure.Гибкая, TypeFlexStructure.Жесткая };
try
{
StructuresPage structuresPage = (StructuresPage)MW.StructuresFrame.Content;
structuresPage.flexListCbxCol.ItemsSource = listShemas;
}
catch
{
return;
}
}
}
}

131
VM/UnitsViewModel .cs Normal file
View File

@@ -0,0 +1,131 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
UnitsLin[] unitsL = { UnitsLin.м, UnitsLin.см, UnitsLin.мм };
UnitsArea[] unitsA = { UnitsArea.м, UnitsArea.см, UnitsArea.мм };
UnitsForce[] unitsF = { UnitsForce.т, UnitsForce.кН, UnitsForce.Н };
UnitsStress[] unitsS = { UnitsStress.т, UnitsStress.кН, UnitsStress.Н, UnitsStress.МПа, UnitsStress.кПа };
UnitsLin unitsLId = UnitsLin.м;
UnitsLin unitsSectId = UnitsLin.см;
UnitsLin unitsDarmId = UnitsLin.мм;
UnitsArea unitsAarmId = UnitsArea.см;
UnitsArea unitsAMatId = UnitsArea._;
UnitsLin unitsLForcId = UnitsLin.м;
UnitsArea unitsAStressId = UnitsArea._;
UnitsLin unitsCrackId = UnitsLin.мм;
UnitsStress unitsSMatId = UnitsStress.МПа;
UnitsStress unitsSStressId = UnitsStress.МПа;
UnitsForce unitsFForceId = UnitsForce.кН;
internal double scaleDimLength = 1;
internal double scaleDimSect = 0.01;
internal double scaleDimDarm = 0.001;
internal double scaleDimAarm = 0.0001;
internal double scaleDimLfrc = 1;
internal double scaleDimFfrc = 1;
internal double scaleDimStress = 0.001;
internal double scaleDimMat = 0.001;
internal double scaleDimCrack = 0.001;
public UnitsLin[] UnitsL { get => unitsL; set => unitsL = value; }
public UnitsArea[] UnitsA { get => unitsA; set => unitsA = value; }
public UnitsForce[] UnitsF { get => unitsF; set => unitsF = value; }
public UnitsStress[] UnitsS { get => unitsS; set => unitsS = value; }
public UnitsLin UnitsLId { get => unitsLId; set { unitsLId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsLin UnitsSectId { get => unitsSectId; set { unitsSectId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsLin UnitsDarmId { get => unitsDarmId; set { unitsDarmId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsArea UnitsAarmId { get => unitsAarmId; set { unitsAarmId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsArea UnitsAMatId { get => unitsAMatId; set { unitsAMatId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsLin UnitsLForcId { get => unitsLForcId; set { unitsLForcId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsArea UnitsAStressId { get => unitsAStressId; set { unitsAStressId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsLin UnitsCrackId { get => unitsCrackId; set { unitsCrackId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsForce UnitsFForceId { get => unitsFForceId; set { unitsFForceId = value; OnPropertyChanged(); ChangeUnits(); } }
public UnitsStress UnitsSMatId { get => unitsSMatId; set { unitsSMatId = value; OnPropertyChanged(); ChangeUnits();
if (value == UnitsStress.МПа || value == UnitsStress.кПа) UnitsAMatId = UnitsArea._; } }
public UnitsStress UnitsSStressId { get => unitsSStressId; set { unitsSStressId = value; OnPropertyChanged(); ChangeUnits();
if (value == UnitsStress.МПа || value == UnitsStress.кПа) UnitsAStressId = UnitsArea._; } }
void ChangeUnits()
{
scaleDimAarm = ScaleAUnits(unitsAarmId);
scaleDimCrack = ScaleLUnits(unitsCrackId);
scaleDimDarm = ScaleLUnits(unitsDarmId);
scaleDimFfrc = ScaleFUnits(unitsFForceId);
scaleDimLength = ScaleLUnits(unitsLId);
scaleDimLfrc = ScaleLUnits(unitsLForcId);
scaleDimSect = ScaleLUnits(unitsSectId);
scaleDimMat = ScaleSUnits(unitsSMatId,unitsAMatId);
scaleDimStress = ScaleSUnits(unitsSStressId, unitsAStressId);
//Bfloat = B / scaleDimSect;
//Hfloat = H / scaleDimSect;
//Dfloat = D / scaleDimSect;
//D1float = D1 / scaleDimSect;
}
void ChangeValues()
{
//B = bfloat * scaleDimSect;
//H = hfloat * scaleDimSect;
//D = dfloat * scaleDimSect;
//D1 = d1float * scaleDimSect;
}
double ScaleLUnits(UnitsLin unit)
{
double res = 1;
switch (unit)
{
case UnitsLin.мм: res = 1E-3; break;
case UnitsLin.см: res = 1E-2; break;
}
return res;
}
double ScaleAUnits(UnitsArea unit)
{
double res = 1;
switch (unit)
{
case UnitsArea.мм: res = 1E-6; break;
case UnitsArea.см: res = 1E-4; break;
}
return res;
}
double ScaleFUnits(UnitsForce unit)
{
double res = 1;
switch (unit)
{
case UnitsForce.Н: res = 1E+3; break;
case UnitsForce.т: res = 0.10194; break;
}
return res;
}
double ScaleSUnits(UnitsStress unitS, UnitsArea unitA)
{
double res = 1;
if (unitS == UnitsStress.кН && unitA == UnitsArea.см) res = 1E-4;
if (unitS == UnitsStress.кН && unitA == UnitsArea.мм) res = 1E-6;
if (unitS == UnitsStress.Н && unitA == UnitsArea.м) res = 1E+3;
if (unitS == UnitsStress.Н && unitA == UnitsArea.см) res = 0.1;
if (unitS == UnitsStress.Н && unitA == UnitsArea.мм) res = 1E-3;
if (unitS == UnitsStress.т && unitA == UnitsArea.м) res = 0.10194;
if (unitS == UnitsStress.т && unitA == UnitsArea.см) res = 1E-5;
if (unitS == UnitsStress.т && unitA == UnitsArea.мм) res = 1.01937E-7;
if (unitS == UnitsStress.МПа) res = 1E-3;
return res;
}
}
}

101
VM/ViewModel.cs Normal file
View File

@@ -0,0 +1,101 @@
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media.Imaging;
namespace GroundOrganizer
{
public partial class ViewModel : INotifyPropertyChanged
{
string title;
ToSerializ ser = new ToSerializ();
MainWindow MW;
//MainPage MP;
private string basePath;
public string BasePath { get => basePath; set { basePath = value; OnPropertyChanged(); } }
public ViewModel()
{
title = "GroundOrganizer";
MW = App.Current.MainWindow as MainWindow;
//MW.contentFrame.Content = MP;
MW.Title = title;
BasePath = Properties.Settings.Default.BasePath;
StructureNote = "к числу зданий и сооружений с жесткой конструктивной схемой относятся:" +
"\n- здания панельные, блочные и кирпичные, в которых междуэтажные" +
"\nперекрытия опираются по всему контуру на поперечные и продольные" +
"\nстены или только на поперечные несущие стены при малом их шаге;" +
"\n- сооружения типа башен, силосных корпусов, дымовых труб, домен и др.";
BoresNote = "* положительное значение отметки уровня грунтовых вод относительно устья скважины";
}
private RelayCommand openGroundBase;
public RelayCommand OpenGroundBase
{
get { return openGroundBase ?? (openGroundBase = new RelayCommand(obj => { ReadDB(); })); }
}
public string Title { get => title; set => title = value; }
string GetGroundBaseFile()
{
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
ofd.DefaultExt = "*.*";
ofd.Filter = "База данных инженерно-геологических площадок (*.grndb)|*.grndb|Все файлы (*.*)|*.*";
ofd.Title = "Выбор файла с базой данных инженерно-геологических площадок";
ofd.ShowDialog();
return ofd.FileName;
}
internal void SaveDB()
{
//ser = new ToSerializ { PlayGroundList = ListPlayGround };
// создаем объект BinaryFormatter
BinaryFormatter formatter = new BinaryFormatter();
// получаем поток, куда будем записывать сериализованный объект
using (FileStream fs = new FileStream(Properties.Settings.Default.BasePath, FileMode.OpenOrCreate))
{
formatter.Serialize(fs, ListPlayGround);
}
//Alert("Введенные данные успешно сохранены");
}
internal void ReadDB()
{
Properties.Settings.Default.BasePath = GetGroundBaseFile();
Properties.Settings.Default.Save();
BasePath = Properties.Settings.Default.BasePath;
if (File.Exists(Properties.Settings.Default.BasePath) == true)
{
// создаем объект BinaryFormatter
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream fs = new FileStream(Properties.Settings.Default.BasePath, FileMode.OpenOrCreate))
{
//ToSerializ ser = (ToSerializ)formatter.Deserialize(fs);
ListPlayGround = formatter.Deserialize(fs) as ObservableCollection<PlayGround>;
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged([CallerMemberName]string prop = "")
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
}
}
}

Some files were not shown because too many files have changed in this diff Show More