как выбрать таблицу без открытия чертежа

Автор Тема: как выбрать таблицу без открытия чертежа  (Прочитано 8295 раз)

0 Пользователей и 2 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн brookАвтор темы

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Добрый день.
обрабатываю чертежи с помощью AcCoreConsole, то есть без запросов пользователю с помощью сценария.
как в таком случае найти на чертеже таблицу (которая там одна). нужно будет добавлять колонки и в них вписывать значения, но с этим я разобралась. а самим выбором -- все примеры начинаются с выбора объекта пользователем. даже если имитировать выбор пользователя, в консоли это всё равно не работает.
в юзер гайде найти невозможно, потому что таблицы в API вообще везде. да и подозреваю, что там тоже вариант через выбор пользователя...

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Итерация по modelspace/paperspace (зависит от того в каком пространстве таблица)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн brookАвтор темы

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
получилось что-то такое. работает

Код - C# [Выбрать]
  1.      const double rowHeight = 3.0, colWidth = 5.0;
  2.         const double textHeight = rowHeight * 0.25;
  3.  
  4.         [CommandMethod("MBT")]
  5.         static public void ModifyBlockTable()
  6.         {
  7.             DocumentCollection docs = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager;
  8.             Document aDoc = docs.MdiActiveDocument;            
  9.             if (aDoc == null)
  10.                 return;
  11.             Editor ed = aDoc.Editor;
  12.             // Let's start by asking for a table to be selected
  13.             // var per = ed.GetEntity("\nSelect table");
  14.  
  15.            
  16.            
  17.             bool flag = false;
  18.             using (Database acCurDb = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Database)
  19.             {
  20.                 // Start our transaction
  21.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  22.                 {
  23.                     // Open the Block table for read
  24.                     BlockTable acBlkTbl;
  25.                     acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  26.                                                  OpenMode.ForRead) as BlockTable;
  27.  
  28.                     // Open the Block table record Model space
  29.                     BlockTableRecord acBlkTblRec;
  30.                     acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  31.                                                     OpenMode.ForWrite) as BlockTableRecord;
  32.  
  33.                     // Step through the Block table record
  34.                     foreach (ObjectId asObjId in acBlkTblRec)
  35.                     {
  36.                         if (asObjId.ObjectClass.DxfName == "ACAD_TABLE")
  37.                         {
  38.                            ObjectId tbid = asObjId;
  39.                            Handle tbHandle = asObjId.Handle;
  40.                             var tb = acTrans.GetObject(tbid, OpenMode.ForWrite) as Table;
  41.                             // Insert our column, making it a bit skinnier than the others
  42.  
  43.                             tb.InsertColumns(0, colWidth * 0.5, 1);
  44.  
  45.                             // Populate the cells in this new column (starting with 1,
  46.                             // as if we ask for 0 we'll get the header cell, too)
  47.  
  48.                             for (int i = 1; i < tb.Rows.Count; i++)
  49.                             {
  50.                                 // Insert the index into the cell with appropriate text size
  51.                                 // and justification
  52.  
  53.                                 var num = tb.Cells[i, 0];
  54.                                 num.Value = i;
  55.                                 num.Alignment = CellAlignment.MiddleCenter;
  56.                                 num.TextHeight = textHeight;
  57.                             }
  58.  
  59.                         }
  60.                     }                                      
  61.                                        
  62.  
  63.                     // Commit the transaction
  64.                     acTrans.Commit();
  65.                 }
  66.                 acCurDb.SaveAs(@"D:\Test\Correct\318_FSA_PVU.dwg", DwgVersion.Current);
  67.             }
  68.         }
  69.  

операция с таблицей будет другая, это чисто тест из примера https://www.keanw.com/2015/07/adding-a-new-column-to-an-existing-autocad-table-using-net.html

мне не нравится, что основное действие внутри цикла. но когда я делала его снаружи (после завершения foreach), он ругался, что у tbid не присвоено значение.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
мне не нравится, что основное действие внутри цикла. но когда я делала его снаружи (после завершения foreach), он ругался, что у tbid не присвоено значение.
А кто мешает присвоить ему значение?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн brookАвтор темы

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
вот при выносе из цикла ругается



хотя всё остальное тоже самое.
до цикла присвоить ему какое-нибудь значение, например "0" и вставить проверку, что оно поменялось?

Отмечено как Решение brook 21-12-2021, 10:38:02

Оффлайн brookАвтор темы

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
да, так заработало
Код - C# [Выбрать]
  1.  const double rowHeight = 3.0, colWidth = 5.0;
  2.         const double textHeight = rowHeight * 0.25;
  3.  
  4.         [CommandMethod("MBT")]
  5.         static public void ModifyBlockTable()
  6.         {
  7.             DocumentCollection docs = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager;
  8.             Document aDoc = docs.MdiActiveDocument;            
  9.             if (aDoc == null)
  10.                 return;
  11.             Editor ed = aDoc.Editor;
  12.             // Let's start by asking for a table to be selected
  13.             // var per = ed.GetEntity("\nSelect table");
  14.  
  15.            
  16.            
  17.             bool flag = false;
  18.             using (Database acCurDb = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Database)
  19.             {
  20.                 // Start our transaction
  21.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  22.                 {
  23.                     // Open the Block table for read
  24.                     BlockTable acBlkTbl;
  25.                     acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,
  26.                                                  OpenMode.ForRead) as BlockTable;
  27.  
  28.                     // Open the Block table record Model space for read
  29.                     BlockTableRecord acBlkTblRec;
  30.                     acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],
  31.                                                     OpenMode.ForWrite) as BlockTableRecord;
  32.                     ObjectId tbid = ObjectId.Null;
  33.                     // Step through the Block table record
  34.                     foreach (ObjectId asObjId in acBlkTblRec)
  35.                     {
  36.                         if (asObjId.ObjectClass.DxfName == "ACAD_TABLE")
  37.                         {
  38.                            tbid = asObjId;
  39.                            Handle tbHandle = asObjId.Handle;  
  40.                         }
  41.                     }
  42.                     if (tbid != ObjectId.Null)
  43.                     {
  44.                         var tb = acTrans.GetObject(tbid, OpenMode.ForWrite) as Table;
  45.                         // Insert our column, making it a bit skinnier than the others
  46.  
  47.                         tb.InsertColumns(0, colWidth * 0.5, 1);
  48.  
  49.                         // Populate the cells in this new column (starting with 1,
  50.                         // as if we ask for 0 we'll get the header cell, too)
  51.  
  52.                         for (int i = 1; i < tb.Rows.Count; i++)
  53.                         {
  54.                             // Insert the index into the cell with appropriate text size
  55.                             // and justification
  56.  
  57.                             var num = tb.Cells[i, 0];
  58.                             num.Value = i;
  59.                             num.Alignment = CellAlignment.MiddleCenter;
  60.                             num.TextHeight = textHeight;
  61.                         }
  62.                     }
  63.                    
  64.  
  65.                     // Commit the transaction
  66.                     acTrans.Commit();
  67.                 }
  68.                 acCurDb.SaveAs(@"D:\Test\Correct\318_FSA_PVU.dwg", DwgVersion.Current);
  69.             }
  70.         }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если таблица может быть только одна, то нет смысла сканировать до конца modelspace. Как только нашли таблицу - выходите из цикла. Оператор break вам в помощь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение