структура решения: СОМ или ObjectARX

Автор Тема: структура решения: СОМ или ObjectARX  (Прочитано 6391 раз)

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

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

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

и вот я читаю-читаю, и понимаю, что у СОМ функционал уже, чем у ObjectARX, и пользуются им реже (и примеров очень мало), но с другой стороны -- вроде мне его достаточно?
не хочется делать чисто плагин -- потому что проект может быть достаточно разветвленный и иметь много файлов и даже подсистем, в том числе я собиралась включать обработку файлов word (всякие титулы-штампы-таблицы). и предпочтительно иметь удобный интерфейс, чтобы этот проект видеть целиком и странно встраивать его в автокад.

может, оптимально делать плагины и вызывать команды из приложения ( через interpop? ) ?
или это плохой путь?


и в догонку вопрос -- на форуме видела много ссылок на перевод руководства пользователя на русский от Андрея Бушмана, и на примеры программ и все эти ссылки мертвые. нагуглить его самостоятельно тоже не получилось. проект закрыт и уничтожен или где-то есть зеркало? 

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #1 : 24-11-2021, 16:26:11 »
Однозначно не COM, если не хочешь иметь проблем. ObjectARX - это только чистый C++. Ты же, я так понимаю, в качестве альтернативы COM имеешь в виду AutoCAD .NET API (которое обертка над ObjectARX). Вот его и рекомендую.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: структура решения: СОМ или ObjectARX
« Ответ #2 : 24-11-2021, 16:37:06 »
в любом случае .Net да
но все примеры, которые я вижу, начинаются с  [CommandMethod(*)], а это, как я понимаю, команда, которая вызывается из уже запущенного чертежа. а мне нужно пробежаться по папке с подготовленными шаблонами открывать файлы, вызвать в каждом команду (или разные команды) с параметром, закрывать файл и открывать следующий. я  не могу найти, как это сделать?


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #3 : 24-11-2021, 16:41:53 »
brook,
Определись с тем что тебе нужно. Это я по поводу команд - вполне возможно, что лучше будет переписать эти команды на .NET, а не вызывать их. Для пакетной обработки dwg-файлов предпочтительнее AcCoreConsole
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: структура решения: СОМ или ObjectARX
« Ответ #4 : 24-11-2021, 19:18:45 »
команды мне действительно не нужны, я просто пока не совсем понимаю, какие есть возможности работать "снаружи" Автокада
 я сейчас наверное спрошу очевидное, но всё равно спрошу --
 вот эти все методы API, которые встречаются в CommandMethod'ах -- они точно так же работают в просто методах приложения, если добавить туда подключение к конкретному файлу?
как правильно тогда подключиться и потом правильно закрыть dwg?
вот например, ваш код, который я сегодня тестировала (минимально подправив под свой блок) -- вместо первой строчки подключения к базе данных текущего документа должно быть подключение с путём к файлу же и остальное не изменится?
Код - C# [Выбрать]
  1.   [CommandMethod("AddBlockTest")]
  2.         static public void AddBlockTest()
  3.         {
  4.             Database db = Application.DocumentManager.MdiActiveDocument.Database;
  5.             using (Transaction myT = db.TransactionManager.StartTransaction())
  6.             {
  7.                 // Получаем определение блока "Check".
  8.                 string blockName = "FSA_Filter_In";
  9.                 BlockTable bt =
  10.                     db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  11.                 BlockTableRecord blockDef =
  12.                   bt[blockName].GetObject(OpenMode.ForRead) as BlockTableRecord;
  13.                 // Открываем пространство модели – мы добавляем наш BlockReference к нему
  14.                 BlockTableRecord ms =
  15.                   bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite)
  16.                                                           as BlockTableRecord;
  17.                 // Создаём BlockReference и связываем его с определением блока
  18.                 Point3d point = new Point3d(-2.0, 4.0, 6.0);
  19.                 using (BlockReference blockRef =
  20.                         new BlockReference(point, blockDef.ObjectId))
  21.                 {
  22.                     // Добавляем вставку блока к пространству модели
  23.                     ms.AppendEntity(blockRef);
  24.                     myT.AddNewlyCreatedDBObject(blockRef, true);
  25.                     // Проходимся по определению блока для поиска всех неконстантных атрибутов
  26.                     int k = 1;
  27.                     foreach (ObjectId id in blockDef)
  28.                     {
  29.                         DBObject obj = id.GetObject(OpenMode.ForRead);
  30.                         AttributeDefinition attDef = obj as AttributeDefinition;
  31.                         if ((attDef != null) && (!attDef.Constant))
  32.                         {
  33.                             // Это неконстантный AttributeDefinition
  34.                             // Создаём новый AttributeReference
  35.                             using (AttributeReference attRef = new AttributeReference())
  36.                             {
  37.                                 attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform);
  38.                                 attRef.TextString = Convert.ToString(k);
  39.                                 // Добавляем AttributeReference к BlockReference
  40.                                 blockRef.AttributeCollection.AppendAttribute(attRef);
  41.                                 myT.AddNewlyCreatedDBObject(attRef, true);
  42.                                 k++;
  43.                             }
  44.                         }
  45.                     }
  46.                 }
  47.                 // Работа выполнена!
  48.                 myT.Commit();
  49.             }
  50.         }
  51.  
видео по форматированию кода в сообщении не работает почему-то, извините, что не по правилам...
« Последнее редактирование: 24-11-2021, 20:23:43 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #5 : 24-11-2021, 20:26:13 »
вот эти все методы API, которые встречаются в CommandMethod'ах -- они точно так же работают в просто методах приложения, если добавить туда подключение к конкретному файлу?
Я не знаю что такое "просто методы приложения" и что такое "подключение к конкретному файлу".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #6 : 24-11-2021, 21:14:49 »
видео по форматированию кода в сообщении не работает почему-то, извините, что не по правилам...
Видео уже исправил - какие-то проблемы на стороне Autodesk Screencast
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: структура решения: СОМ или ObjectARX
« Ответ #7 : 24-11-2021, 21:58:12 »
Это я по поводу команд - вполне возможно, что лучше будет переписать эти команды на .NET, а не вызывать их.
ну вот я не понимаю, что значит переписать команды на .Net, если это и так созданные мной команды.

как написать команду, положить куда надо dll с ней и потом в запущенном Автокаде её вызвать -- я разобралась.
и команды которые я видела начинаются с
Код - C# [Выбрать]
  1.  Database db = Application.DocumentManager.MdiActiveDocument.Database;
что логично -- подгружаем базу данных документа, в котором находимся.
а как обратиться к базе данных чертежа по пути, где он лежит, ну например "D:/Project/Shema.dwg"?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #8 : 24-11-2021, 22:39:46 »
как написать команду, положить куда надо dll с ней и потом в запущенном Автокаде её вызвать -- я разобралась.
Отлично!
и команды которые я видела начинаются с
Код - C# [Выбрать]

     Database db = Application.DocumentManager.MdiActiveDocument.Database;

что логично -- подгружаем базу данных документа, в котором находимся.
Никуда ничего не подгружаем. Это просто активная база, которая открыта в редакторе AutoCAD.
а как обратиться к базе данных чертежа по пути, где он лежит, ну например "D:/Project/Shema.dwg"?
Вот. Это уже конкретный вопрос. Для этой цели используется Database.ReadDwgFile - в этом случае с базой можно работать, но она не видна в редакторе AutoCAD. Пример использования: https://adn-cis.org/vstavka-bloka-iz-drugogo-dwg-fajla-s-pomoshhyu-.net.html
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: структура решения: СОМ или ObjectARX
« Ответ #9 : 25-11-2021, 12:36:37 »
поправила подключение к базе данных, вставила в пустое приложение WPF с одной кнопкой на вызов этой функции.
выдал ошибку "Среда выполнения CLR обнаружила недопустимую программу"
что с этим можно сделать? запустить acad.exe  предварительно?



Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using acadApp = Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7. using System.Diagnostics;
  8.  
  9. namespace Test
  10. {
  11.     class WriteDwg
  12.     {
  13.         [CommandMethod("AddBlockTest")]
  14.         static public void AddBlockTest()
  15.         {
  16.            
  17.             using (Database db = new Database(false, true))
  18.             {
  19.                 db.ReadDwgFile(@"D:\Test\318_ФСА_ПВУ.dwg",
  20.                     System.IO.FileShare.ReadWrite, true, "");
  21.  
  22.                 ObjectIdCollection ids = new ObjectIdCollection();
  23.                 using (Transaction tr =
  24.                         db.TransactionManager.StartTransaction())
  25.                 {
  26.                     using (Transaction myT = db.TransactionManager.StartTransaction())
  27.                     {
  28.                         // Получаем определение блока "Check".
  29.                         string blockName = "FSA_Filter_In";
  30.                         BlockTable bt =
  31.                             db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
  32.                         BlockTableRecord blockDef =
  33.                           bt[blockName].GetObject(OpenMode.ForRead) as BlockTableRecord;
  34.                         // Открываем пространство модели – мы добавляем наш BlockReference к нему
  35.                         BlockTableRecord ms =
  36.                           bt[BlockTableRecord.ModelSpace].GetObject(OpenMode.ForWrite)
  37.                                                                   as BlockTableRecord;
  38.                         // Создаём BlockReference и связываем его с определением блока
  39.                         Point3d point = new Point3d(-2.0, 4.0, 6.0);
  40.                         using (BlockReference blockRef =
  41.                                 new BlockReference(point, blockDef.ObjectId))
  42.                         {
  43.                             // Добавляем вставку блока к пространству модели
  44.                             ms.AppendEntity(blockRef);
  45.                             myT.AddNewlyCreatedDBObject(blockRef, true);
  46.                             // Проходимся по определению блока для поиска всех неконстантных атрибутов
  47.                             int k = 1;
  48.                             foreach (ObjectId id in blockDef)
  49.                             {
  50.                                 DBObject obj = id.GetObject(OpenMode.ForRead);
  51.                                 AttributeDefinition attDef = obj as AttributeDefinition;
  52.                                 if ((attDef != null) && (!attDef.Constant))
  53.                                 {
  54.                                     // Это неконстантный AttributeDefinition
  55.                                     // Создаём новый AttributeReference
  56.                                     using (AttributeReference attRef = new AttributeReference())
  57.                                     {
  58.                                         attRef.SetAttributeFromBlock(attDef, blockRef.BlockTransform);
  59.                                         attRef.TextString = Convert.ToString(k);
  60.                                         // Добавляем AttributeReference к BlockReference
  61.                                         blockRef.AttributeCollection.AppendAttribute(attRef);
  62.                                         myT.AddNewlyCreatedDBObject(attRef, true);
  63.                                         k++;
  64.                                     }
  65.                                 }
  66.                             }
  67.                         }
  68.                         // Работа выполнена!
  69.                         myT.Commit();
  70.                     }
  71.  
  72.                 }
  73.  
  74.             }
  75.         }
  76.     }
  77. }

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #10 : 25-11-2021, 12:42:06 »
запустить acad.exe  предварительно?
Не понял. Вы делаете плагин (dll-файл), который нужно загрузить внутрь AutoCAD. И задаете такой странный вопрос.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #11 : 25-11-2021, 12:46:19 »
И что это за вложенные транзакции?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: структура решения: СОМ или ObjectARX
« Ответ #12 : 25-11-2021, 12:56:42 »
запустить acad.exe  предварительно?
Не понял. Вы делаете плагин (dll-файл), который нужно загрузить внутрь AutoCAD. И задаете такой странный вопрос.

вот. так в этом и был изначальный вопрос -- есть ли варианты, кроме как вызывать из внешней программы загруженный плагин? и как его правильно вызывать (если не передавать команду), если по идее приложения пользователь долго что-то настраивает, потом нажимает кнопку типа "Обработка" и по его настройкам формируется пакет документации.
мне  очень не хочется всё управление  запихивать в плагин, кажется это нелогично.

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

  • ADN OPEN
  • Сообщений: 15
  • Карма: 0
Re: структура решения: СОМ или ObjectARX
« Ответ #13 : 25-11-2021, 12:58:18 »
И что это за вложенные транзакции?

а, вложенные транзакции косяк, да, исправлю, но в это раз до них не дошло

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: структура решения: СОМ или ObjectARX
« Ответ #14 : 25-11-2021, 13:01:01 »
вот. так в этом и был изначальный вопрос -- есть ли варианты, кроме как вызывать из внешней программы загруженный плагин?
Из внешней программы нельзя вызвать загруженный плагин. Разве что делать его COM-сервером.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение