diff --git a/EasyEplanner.Tests/ProjectImportICP.Test/DeviceNameMatchingSaver.Test.cs b/EasyEplanner.Tests/ProjectImportICP.Test/DeviceNameMatchingSaver.Test.cs new file mode 100644 index 00000000..972b73da --- /dev/null +++ b/EasyEplanner.Tests/ProjectImportICP.Test/DeviceNameMatchingSaver.Test.cs @@ -0,0 +1,34 @@ +using EasyEPlanner.ProjectImportICP; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EasyEplannerTests.ProjectImportICPTest +{ + public class DeviceNameMatchingSaverTest + { + [Test] + public void SaveImportDevices() + { + var devices = new List() + { + new ImportDevice() { WagoType = "V", FullNumber = 101, Object = "LINE1", Type = "V", Number = 1, Description = "desc LINE1V1"}, + new ImportDevice() { WagoType = "V", FullNumber = 102, Object = "LINE1", Type = "V", Number = 2, Description = "desc; LINE1V2"}, + }; + + var filePath = Path.Combine(TestContext.CurrentContext.WorkDirectory, "DeviceNameMatching.csv"); + + DeviceNameMatchingSaver.Save(filePath, devices); + + Assert.AreEqual( + "Название в ICP CON;Новое название;Описание\r\n" + + "V101;LINE1V1;desc LINE1V1\r\n" + + "V102;LINE1V2;\"desc; LINE1V2\"\r\n", + File.ReadAllText(filePath)); + } + } +} diff --git a/src/EasyEPlanner.csproj b/src/EasyEPlanner.csproj index e6b95f03..b8a26fd9 100644 --- a/src/EasyEPlanner.csproj +++ b/src/EasyEPlanner.csproj @@ -69,6 +69,9 @@ False libs\Aga.Controls.dll + + packages\CsvHelper.33.0.1\lib\net47\CsvHelper.dll + @@ -80,6 +83,12 @@ False LuaInterface\LuaInterface.dll + + packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll + + + packages\Microsoft.Bcl.HashCode.1.1.1\lib\net461\Microsoft.Bcl.HashCode.dll + False libs\ObjectListView.dll @@ -97,10 +106,26 @@ libs\Spire.XLS.dll + + packages\System.Buffers.4.4.0\lib\netstandard2.0\System.Buffers.dll + + + packages\System.Memory.4.5.0\lib\netstandard2.0\System.Memory.dll + + + + packages\System.Numerics.Vectors.4.4.0\lib\net46\System.Numerics.Vectors.dll + + + packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + @@ -117,10 +142,12 @@ + + @@ -504,6 +531,7 @@ PreserveNewest + diff --git a/src/Main/AddInModule.cs b/src/Main/AddInModule.cs index a1143e87..3871ff82 100644 --- a/src/Main/AddInModule.cs +++ b/src/Main/AddInModule.cs @@ -77,15 +77,15 @@ public bool OnInitGui() true, false); menuID = oMenu.AddMenuItem( - "Создать файл переименования старых устройств", + "Создать/изменить файл переименования устройств", nameof(ImportIcpCreateRenamingMap), - "Создать файл переименования старых устройств", menuID, 1, + "Создать/изменить файл переименования устройств", menuID, 1, false, false); menuID = oMenu.AddMenuItem( - "Модифицировать базу каналов", - nameof(ModifyIcpChbase), - "Модифицировать базу каналов", menuID, 1, + "Документ соответствия названий устройств CSV", + nameof(ImportIcpCreateDeviceNameMathchingFile), + "Документ соответствия названий устройств CSV", menuID, 1, false, false); menuID = oMenu.AddMenuItem( diff --git a/src/Main/ImportIcpCreateDeviceNameMathchingFile.cs b/src/Main/ImportIcpCreateDeviceNameMathchingFile.cs new file mode 100644 index 00000000..b5fcd65f --- /dev/null +++ b/src/Main/ImportIcpCreateDeviceNameMathchingFile.cs @@ -0,0 +1,69 @@ +using CsvHelper.Configuration; +using CsvHelper; +using EasyEPlanner.ProjectImportICP; +using Eplan.EplApi.ApplicationFramework; +using Eplan.EplApi.DataModel; +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using EplanDevice; +using StaticHelper; + +namespace EasyEPlanner +{ + [ExcludeFromCodeCoverage] + public class ImportIcpCreateDeviceNameMathchingFile : IEplAction + { + ~ImportIcpCreateDeviceNameMathchingFile() { } + + public bool Execute(ActionCallingContext oActionCallingContext) + { + try + { + Project currentProject = EProjectManager.GetInstance() + .GetCurrentPrj(); + if (currentProject == null) + { + MessageBox.Show("Нет открытого проекта!", "EPlaner", + MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + return true; + } + + var openFileDialog = new SaveFileDialog() + { + Title = "Сохранение файла соответствия наименований устройств", + Filter = "CSV file (*.scv)|*.csv", + }; + + if (openFileDialog.ShowDialog() != DialogResult.Cancel) + { + DeviceNameMatchingSaver.Save(openFileDialog.FileName, DeviceManager.GetInstance().Devices); + } + } + + catch (Exception ex) + { + MessageBox.Show(ex.Message); + } + + return true; + } + + public bool OnRegister(ref string Name, ref int Ordinal) + { + Name = nameof(ImportIcpCreateDeviceNameMathchingFile); + Ordinal = 30; + + return true; + } + + public void GetActionProperties(ref ActionProperties actionProperties) + { + } + } +} \ No newline at end of file diff --git a/src/Main/ImportIcpWagoProject.cs b/src/Main/ImportIcpWagoProject.cs index 61788394..307fbe89 100644 --- a/src/Main/ImportIcpWagoProject.cs +++ b/src/Main/ImportIcpWagoProject.cs @@ -1,4 +1,6 @@ using BrightIdeasSoftware; +using CsvHelper; +using CsvHelper.Configuration; using EasyEPlanner.ProjectImportICP; using Eplan.EplApi.ApplicationFramework; using Eplan.EplApi.DataModel; @@ -77,6 +79,21 @@ public bool Execute(ActionCallingContext oActionCallingContext) new BindingImporter(modulesImporter.ImportModules, devicesImporter.ImportDevices).Bind(); + if (DialogResult.Yes == MessageBox.Show("Сохранить файл соответствия наименования устройств?", + "EPlanner", MessageBoxButtons.YesNo, MessageBoxIcon.Question)) + { + var openFileDialog = new SaveFileDialog() + { + Title = "Сохранение файла соответствия наименования устройств", + Filter = "CSV file (*.scv)|*.csv", + }; + + if (openFileDialog.ShowDialog() != DialogResult.Cancel) + { + DeviceNameMatchingSaver.Save(openFileDialog.FileName, devicesImporter.ImportDevices); + } + } + Logs.EnableButtons(); Logs.ShowLastLine(); Logs.SetProgress(100); @@ -101,4 +118,4 @@ public void GetActionProperties(ref ActionProperties actionProperties) { } } -} +} \ No newline at end of file diff --git a/src/ProjectImportICP/DeviceNameMatchingSaver.cs b/src/ProjectImportICP/DeviceNameMatchingSaver.cs new file mode 100644 index 00000000..7984d428 --- /dev/null +++ b/src/ProjectImportICP/DeviceNameMatchingSaver.cs @@ -0,0 +1,119 @@ +using CsvHelper.Configuration; +using CsvHelper; +using EplanDevice; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using StaticHelper; +using System.Diagnostics.CodeAnalysis; + +namespace EasyEPlanner.ProjectImportICP +{ + public static class DeviceNameMatchingSaver + { + /// + /// Название 1й колонки в CSV + /// + static public readonly string IcpNameColumn = "Название в ICP CON"; + + /// + /// Название 2й колонки в CSV + /// + static public readonly string NewNameColumn = "Новое название"; + + /// + /// Название 3й колонки в CSV + /// + static public readonly string DescriptionColumn = "Описание"; + + /// + /// Сохранить CSV-файл соответствия названий устройств между
+ /// ICP CON проектом и новым проектом + ///
+ /// Путь для сохранения файла + /// Устройства + public static void Save(string path, IEnumerable devices) + => Save(path, devices); + + /// + /// Сохранить CSV-файл соответствия названий устройств между
+ /// ICP CON проектом и новым проектом + ///
+ /// Путь для сохранения файла + /// Устройства + public static void Save(string path, IEnumerable devices) + => Save(path, devices); + + /// + /// Сохранить CSV-файл соответствия названий устройств между
+ /// ICP CON проектом и новым проектом + ///
+ /// Карта записи объектов в CSV + /// Тип устройства (/) + /// Путь для сохранения файла + /// Список устройства типа + private static void Save(string path, IEnumerable devices) + where TMap : ClassMap + { + using (StreamWriter writer = new StreamWriter(path)) + using (CsvWriter csvWriter = + new CsvWriter(writer, new CsvConfiguration(System.Globalization.CultureInfo.CurrentCulture) + { + Delimiter = ";", + Encoding = Encoding.UTF8, + + })) + { + csvWriter.Context.RegisterClassMap(); + csvWriter.WriteRecords(devices); + } + } + } + + public class CsvImportDeviceMap : ClassMap + { + public CsvImportDeviceMap() + { + Map(m => m.FullNumber) + .Index(0) + .Name(DeviceNameMatchingSaver.IcpNameColumn) + .Convert(m => $"{m.Value.WagoType}{m.Value.FullNumber}"); + + Map(m => m.Number) + .Index(1) + .Name(DeviceNameMatchingSaver.NewNameColumn) + .Convert(m => $"{m.Value.Object}{m.Value.Type}{m.Value.Number}"); + + Map(m => m.Description) + .Index(2) + .Name(DeviceNameMatchingSaver.DescriptionColumn); + } + } + + [ExcludeFromCodeCoverage] + public class CsvIODeviceMap : ClassMap + { + private static readonly ApiHelper ApiHelper = new ApiHelper(); + + public CsvIODeviceMap() + { + Map(m => m.EplanName) + .Index(0) + .Name(DeviceNameMatchingSaver.IcpNameColumn) + .Convert(m => ApiHelper.GetSupplementaryFieldValue(m.Value.EplanObjectFunction, 10)); + + Map(m => m.Name) + .Index(1) + .Name(DeviceNameMatchingSaver.NewNameColumn); + + Map(m => m.Description) + .Index(2) + .Name(DeviceNameMatchingSaver.DescriptionColumn); + } + } + +} diff --git a/src/packages.config b/src/packages.config new file mode 100644 index 00000000..e79c862d --- /dev/null +++ b/src/packages.config @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file