C # / AutoCAD .NET API: чтение листов Excel и рисования объектов на основе данных

Я работаю над проектом, где я интегрировал C # с AutoCAD. Я собираюсь сделать команду AutoCAD, которая использует C # (в Visual Studio) для чтения таблицы Excel (которая является данными по электротехнике), а затем на основе данных в электронной таблице она затем нарисует соответствующий графический объект в AutoCAD.

Таблица: (рисунок здесь) . Столбец «Сервис» описывает тип оборудования, которое мы покажем на принципиальной схеме (в AutoCAD). Например, если оборудование представляет собой компрессор, программа должна нарисовать нашу предварительно сконфигурированную схему компрессора в AutoCAD или если оборудование является двигателем насоса VFD, тогда программа должна нарисовать нашу предварительно определенную схему VFD в AutoCAD.

В AutoCAD: схематическая диаграмма предварительно нарисована, а координаты просты в работе с кодом C #. Трудная часть заключается в том, что я хочу прочитать столбец «section» таблицы, а затем использовать этот столбец для указания координат для размещения графических схемных объектов. Например, если значение раздела столбца равно 1A, я пытаюсь поместить этот объект в (x = 7.25, y = 12, z = 0). Тогда, если значение секции равно 3A, затем поместите объект схемы в назначенное значение x, y, z. Выполнение этого при выборе правильного схематического объекта, основанного на другом столбце «Сервис», немного над моей головой. Я придумал возможный метод, но мне нужно написать тонну дублирующего кода, и именно поэтому я пришел сюда, чтобы попросить о помощи.

Проблема / мой вопрос: я не уверен в том, как наилучшим образом подойти к использованию C #, чтобы выбрать правильный объект схемы из столбца «Сервис» таблицы, а затем поместить графический объект, где он принадлежит, в зависимости от его значения «Секция» одной и той же таблицы. Как я мог бы эффективно подойти к этому при написании C #?

До сих пор я мог прочитать электронную таблицу в памяти и нарисовать все на принципиальной схеме («OneLineBackground» в коде ниже), за исключением объектов оборудования, которые должны размещаться по разделам x, y, z по секциям.

У меня два файла C #: One – «Команды», где я создаю базовые команды AutoCAD. Другая – «Логика», где я вызываю методы из класса «Команды».

Вот файл Logic:

class Logic { #region draw one-line diagram CURRENT DWG [CommandMethod("ElecOneLine1")] static public void ElecOneLine1() { string Path = Commands.SelectSpreadsheet(); System.Data.DataTable table = Commands.ReadExcelToTable(Path); Commands.InsertBlocksCurrentDwg(); Commands.DrawOneLineBackgroundCurrentDwg("OneLineBackground", 35.5478, 23.3750, 0, table.Rows[0]); } #endregion 

Вот класс «Команды»:

  public class Commands { #region Open File Dialog to load spreadsheet [CommandMethod("LoadSpreadsheet")] static public string SelectSpreadsheet() { Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; OpenFileDialog ofd = new OpenFileDialog( "Select Excel spreadsheet to link", null, "xls; xlsx; xlsm", "ExcelFileToLink", OpenFileDialog.OpenFileDialogFlags.DoNotTransferRemoteFiles ); System.Windows.Forms.DialogResult dr = ofd.ShowDialog(); if (dr != System.Windows.Forms.DialogResult.OK) return null; ed.WriteMessage( "\nFile selected was \"{0}\".", ofd.Filename ); return ofd.Filename; } #endregion #region Read Excel Spreadsheet to Table public static System.Data.DataTable ReadExcelToTable(string path) { string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties='Excel 8.0;HDR=NO;IMEX=1';"; System.Data.DataSet set = new DataSet(); using (OleDbConnection conn = new OleDbConnection(connstring)) { conn.Open(); System.Data.DataTable sheetsName = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); string firstSheetName = sheetsName.Rows[0][2].ToString(); string sql = string.Format("SELECT * FROM [{0}]", firstSheetName); OleDbDataAdapter ada = new OleDbDataAdapter(sql, connstring); ada.Fill(set); conn.Close(); } return set.Tables[0]; } #endregion #region Insert AutoCAD Block Definitions into current dwg from template (.dwt) [CommandMethod("InsertBlocksCurrentDwg")] static public void InsertBlocksCurrentDwg() { Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; using (Database OpenDb = new Database(false, true)) { OpenDb.ReadDwgFile("C:\\Users\\Ben\\Documents\\CADautomation\\ElecOneLines.dwg", System.IO.FileShare.ReadWrite, true, ""); ObjectIdCollection ids = new ObjectIdCollection(); using (Transaction tr = OpenDb.TransactionManager.StartTransaction()) { //For example, Get the block by name BlockTable bt; bt = (BlockTable)tr.GetObject(OpenDb.BlockTableId , OpenMode.ForRead); if (bt.Has("OneLineBackground")) { ids.Add(bt["OneLineBackground"]); } if (bt.Has("vfdPumpMotor")) { ids.Add(bt["vfdPumpMotor"]); } if (bt.Has("compressor")) { ids.Add(bt["compressor"]); } tr.Commit(); } //if found, add the block if (ids.Count != 0) { //get the current drawing database Database destdb = doc.Database; IdMapping iMap = new IdMapping(); destdb.WblockCloneObjects(ids, destdb.BlockTableId, iMap, DuplicateRecordCloning.Ignore, false); } } } #endregion #region Draw Block in correct coordinates current dwg [CommandMethod("DrawOneLineBackgroundCurrentDwg")] static public void DrawOneLineBackgroundCurrentDwg(string name, double x, double y, double z, System.Data.DataRow dr ) { Database db = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Database; using (Transaction myT = db.TransactionManager.StartTransaction()) { //Get the block definition string blockName = name; BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable; BlockTableRecord blockDef = bt[blockName].GetObject(OpenMode.ForRead) as BlockTableRecord; //Also open paper space - we'll be adding our BlockReference to it BlockTableRecord ps = bt[BlockTableRecord.PaperSpace].GetObject(OpenMode.ForWrite) as BlockTableRecord; //Create new BlockReference, and link it to our block definition Point3d point = new Point3d(x, y, z); using (BlockReference blockRef = new BlockReference(point, blockDef.ObjectId)) { //Add the block reference to paper space ps.AppendEntity(blockRef); myT.AddNewlyCreatedDBObject(blockRef, true); //Iterate block definition to find all non-constant // AttributeDefinitions foreach (ObjectId id in blockDef) { DBObject obj = id.GetObject(OpenMode.ForRead); AttributeDefinition attDef = obj as AttributeDefinition; if ((attDef != null) && (!attDef.Constant)) { using (AttributeReference attRef = new AttributeReference()) { attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform); if (attRef.Tag == "ATTTEST1") { attRef.TextString = dr.Table.Rows[6][0].ToString(); } //Add the AttributeReference to the BlockReference blockRef.AttributeCollection.AppendAttribute(attRef); myT.AddNewlyCreatedDBObject(attRef, true); } } } } //complete db transaction myT.Commit(); } } #endregion } 

  • Странная ошибка при объявлении переменной в C # с использованием VS13
  • Что мне нужно сделать, чтобы настроить Visual Studio на возможность управлять файлом Excel?
  • Как обновить Excel во время отладки
  • Streamwriter добавляет лишнюю строку, которая прерывается случайным образом при экспорте из visual studio в csv c #
  • Проверьте превосходство 2010 года
  • Рекурсивная обработка excel с использованием VB.NET
  • C # VS отсутствует цель EXCEL
  • Перерыв всех ссылок в книге Excel
  • NPOI Редактирование файлов Excel с сводными таблицами и динамическими диаграммами
  • CDbl и десятичные разделители в VB .NET. Есть ли способ обойти региональные настройки?
  • Как я могу перебирать один столбец Excel, но остановить его в последней ячейке с данными?
  • Interesting Posts

    копирование данных из строки на одном листе excel на основе данных в другом столбце, на другой лист

    Excel преобразует указанную строку в заданное целое число в следующем столбце

    excel interop: NumberFormat #, ## 0.000 не отображает ожидаемый результат

    Сделать одну ячейку связанной с другой в Excel

    Слияние и форматирование Excel

    Excel VBA Autofilter – несколько критериев «начать с»

    Построение большого количества точек данных в excel

    Excel – функция условной даты

    Как я могу добавить в существующий дополнительный текст ячейки с измененными параметрами шрифта в Microsoft Excel VBA

    VBA только сортирует текст, игнорирует ячейки с формулами

    Взаимные эксклюзивные выпадающие списки в Excel

    Ошибка «Object not set»

    Новое для ошибки времени выполнения VBA 6, сценарий останавливается в пустых ячейках вместо цикла

    Проверьте порядок убывания с формулой массива (с пустыми ячейками в диапазоне) – Excel

    Уточнение, необходимое для предотвращения рекурсии в VBA

    Давайте будем гением компьютера.