using netDxf; using netDxf.Blocks; using netDxf.Entities; using netDxf.Header; using System.Diagnostics; using System.IO; using Line = netDxf.Entities.Line; namespace RhSolutions.Services; public class DxfWriter : IWriter { private readonly string file; private readonly DxfDocument doc; private Dictionary productDict; private readonly Block tableBlock; public DxfWriter() { string filepath = RhSolutionsAddIn.Excel.ActiveWorkbook.Path; string filename = Path.GetFileNameWithoutExtension(RhSolutionsAddIn.Excel.ActiveWorkbook.Name); file = Path.Combine(filepath, $"{filename}.dxf"); doc = new DxfDocument(); tableBlock = CreateTable(); } public void WriteProducts(Dictionary products) { WriteProducts(new[] { (string.Empty, products) }); } private IEnumerable WriteRow(int x, int y, Product product, double amount) { string measure = product.ProductMeasure switch { Measure.Kg => "кг", Measure.M => "м", Measure.M2 => "м2", Measure.P => "шт", _ => string.Empty }; return new[] { new Text(product.Name, new Vector2(x + 4180, y), 250) { Alignment = TextAlignment.MiddleLeft, WidthFactor = 0.85 }, new Text(product.ProductSku.ToString(), new Vector2(x + 24750, y), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("«РЕХАУ»", new Vector2(x + 28750, y), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text(measure, new Vector2(x + 32000, y), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text(amount.ToString(), new Vector2(x + 34000, y), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 } }; } public void WriteProducts(IEnumerable<(string, Dictionary)> products) { productDict = products.First().Item2; doc.Layers.Add(new netDxf.Tables.Layer("Таблицы")); int tablesCount = productDict.Count / 27 + (productDict.Count % 27 == 0 ? 0 : 1); int tablePosition = 0; for (int i = 0; i < tablesCount; i++) { int x = i * 43000; var insertion = new Insert(tableBlock, new Vector2(tablePosition, 0)) { Layer = doc.Layers["Таблицы"] }; var pArray = products.First().Item2.Select(p => p.Key).ToArray(); for (int row = 0; row < 27 && i * 27 + row < pArray.Length; row++) { int y = 25400 - row * 800; doc.Entities.Add(WriteRow(x, y, pArray[i * 27 + row], productDict[pArray[i * 27 + row]])); } insertion.Attributes.AttributeWithTag("Sheet").Value = (i + 1).ToString(); tablePosition += 43000; doc.Entities.Add(insertion); } doc.Save(file); DxfVersion dxfVersion = DxfDocument.CheckDxfFileVersion(file); if (dxfVersion < DxfVersion.AutoCad2000) return; } private Block CreateTable() { List entities = new(); entities.AddRange(new[] { new Line(new Vector2(0, 29700), new Vector2(0, 0)), new Line(new Vector2(0, 0), new Vector2(42000, 0)), new Line(new Vector2(42000, 0), new Vector2(42000, 29700)), new Line(new Vector2(42000, 29700), new Vector2(0, 29700)), }); entities.AddRange(new[] { new Line(new Vector2(2000, 29200), new Vector2(2000, 500)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(2000, 500), new Vector2(41500, 500)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(41500, 500), new Vector2(41500, 29200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(41500, 29200), new Vector2(2000, 29200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(800, 9000), new Vector2(2000, 9000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(2000, 6500), new Vector2(800, 6500)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(2000, 3000), new Vector2(800, 3000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(2000, 500), new Vector2(800, 500)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(800, 500), new Vector2(800, 9000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(1300, 500), new Vector2(1300, 9000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(23000,2000), new Vector2(41500, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(23000, 1500), new Vector2(29500, 1500)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(23000, 1000), new Vector2(29500, 1000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(23000, 500), new Vector2(23000, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(24000, 500), new Vector2(24000, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(25000, 500), new Vector2(25000, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(26000, 500), new Vector2(26000, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(27000, 500), new Vector2(27000, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(28500, 500), new Vector2(28500, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(29500, 500), new Vector2(29500, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(40500, 500), new Vector2(40500, 2000)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(40500, 1300), new Vector2(41500, 1300)) { Lineweight = Lineweight.W30 }, }); entities.AddRange(new[] { new Line(new Vector2(4000, 29200), new Vector2(4000, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(17000, 29200), new Vector2(17000, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(23000, 29200), new Vector2(23000, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(26500, 29200), new Vector2(26500, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(31000, 29200), new Vector2(31000, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(33000, 29200), new Vector2(33000, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(35000, 29200), new Vector2(35000, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(37500, 29200), new Vector2(37500, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(4000, 29200), new Vector2(4000, 4200)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(41500, 26500), new Vector2(2000, 26500)) { Lineweight = Lineweight.W30 }, new Line(new Vector2(41500, 25700), new Vector2(2000, 25700)) { Lineweight = Lineweight.W30 } }); int y = 4200; for (int i = 0; i < 27; i++) { var line = new Line(new Vector2(41500, y), new Vector2(2000, y)); entities.Add(line); y += 800; } entities.AddRange(new[] { new Text("Инв.N подл.", new Vector2(1150, 700), 250) { Rotation = 90, WidthFactor = 0.85 }, new Text("Подпись и дата", new Vector2(1150, 3130), 250) { Rotation = 90, WidthFactor = 0.85 }, new Text("Взам.инв.N", new Vector2(1150, 6580), 250) { Rotation = 90, WidthFactor = 0.85 }, new Text("Позиция", new Vector2(3000, 27850), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("1", new Vector2(3000, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Наименование и техническая характеристика", new Vector2(10500, 27850), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("2", new Vector2(10500, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Тип, марка оборудования.", new Vector2(20000, 28250), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Обозначение документа,", new Vector2(20000, 27850), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("опросного листа", new Vector2(20000, 27450), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("3", new Vector2(20000, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Код оборудования,", new Vector2(24750, 28250), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("изделия,", new Vector2(24750, 27850), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("материала", new Vector2(24750, 27450), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("4", new Vector2(24750, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Завод-изготовитель", new Vector2(28750, 27850), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("5", new Vector2(28750, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Единица", new Vector2(32000, 27850), 250) { Alignment = TextAlignment.BottomCenter, WidthFactor = 0.85 }, new Text("измерения", new Vector2(32000, 27850), 250) { Alignment = TextAlignment.TopCenter, WidthFactor = 0.85 }, new Text("6", new Vector2(32000, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Коли-", new Vector2(34000, 27850), 250) { Alignment = TextAlignment.BottomCenter, WidthFactor = 0.85 }, new Text("чество", new Vector2(34000, 27850), 250) { Alignment = TextAlignment.TopCenter, WidthFactor = 0.85 }, new Text("7", new Vector2(34000, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Масса,", new Vector2(36250, 28250), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("единицы,", new Vector2(36250, 27850), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("кг", new Vector2(36250, 27450), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("8", new Vector2(36250, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Примечания", new Vector2(39500, 27850), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("9", new Vector2(39500, 26200), 250) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.85 }, new Text("Изм.", new Vector2(23100, 525), 300) { Alignment = TextAlignment.BottomLeft, WidthFactor = 0.65 }, new Text("Кол.уч", new Vector2(24100, 525), 300) { Alignment = TextAlignment.BottomLeft, WidthFactor = 0.65 }, new Text("Лист", new Vector2(25100, 525), 300) { Alignment = TextAlignment.BottomLeft, WidthFactor = 0.65 }, new Text("Nдок.", new Vector2(26100, 525), 300) { Alignment = TextAlignment.BottomLeft, WidthFactor = 0.65 }, new Text("Подп.", new Vector2(27100, 525), 300) { Alignment = TextAlignment.BottomLeft, WidthFactor = 0.65 }, new Text("Дата", new Vector2(28600, 525), 300) { Alignment = TextAlignment.BottomLeft, WidthFactor = 0.65 }, new Text("Лист", new Vector2(41000, 1650), 300) { Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.65 } }); Block block = new("Таблица спецификации", entities); block.AttributeDefinitions.Add(new AttributeDefinition($"Sheet") { Position = new Vector3(41000, 950, 0), Alignment = TextAlignment.MiddleCenter, WidthFactor = 0.65, Height = 300 }); return block; } public void Dispose() { Process.Start(file); } }