| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как связаться с Autocad(2014) через Revit(2020)?

Как связаться с Autocad(2014) через Revit(2020)?

Ответ
Поиск в этой теме
Непрочитано 26.08.2019, 17:04 #1
Как связаться с Autocad(2014) через Revit(2020)?
kurstep
 
Регистрация: 27.01.2012
Сообщений: 228

Здравствуйте, пытаюсь построить таблицу в Autocad по данным из Revit... Для связи хотел использовать Activex,На одном форуме нашел такой код:
Код:
[Выделить все]
[Transaction( TransactionMode.Manual )]
public class Command : IExternalCommand
{
  public Result Execute(
    ExternalCommandData commandData,
    ref string message,
    ElementSet elements )
  {
    Autodesk.AutoCAD.Interop.AcadApplication a
      = new Autodesk.AutoCAD.Interop.AcadApplication();
 
    a.Visible = true;
 
    Autodesk.AutoCAD.Interop.AcadDocument doc
      = a.Documents.Application.ActiveDocument;
 
    double[] stpoint = new double[3];
    double[] enpoint = new double[3];
    stpoint[0] = 5;
    stpoint[1] = 5;
    stpoint[2] = 0;
    enpoint[0] = 12;
    enpoint[1] = 3;
    enpoint[2] = 0;
 
    doc.ModelSpace.AddLine( stpoint, enpoint );
 
    doc.SaveAs( "C:/tmp/testline.dwg" );
 
    a.Quit();
 
    return Result.Succeeded;
  }
}
Но такой код часто (не всегда) выдает ошибку такого типа (см. рис).... То есть проблема с COM как я понимаю,Кто подскажет как можно решить проблему, почему код иногда проходит а иногда нет?

Миниатюры
Нажмите на изображение для увеличения
Название: 2.PNG
Просмотров: 39
Размер:	40.1 Кб
ID:	217150  

Просмотров: 1056
 
Непрочитано 26.08.2019, 17:19
#2
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,255
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от kurstep Посмотреть сообщение
То есть проблема с COM как я понимаю,Кто подскажет как можно решить проблему, почему код иногда проходит а иногда нет?
Проблема в том, что AutoCAD часто "занят". Подробнее в этой статье: https://adn-cis.org/kak-ispolzuya-vi...dejstviya.html
Она ориентирована на C++, но с .NET аналогично. Кроме того для AutoCAD 2014 желательно брать Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll из ObjectARX SDK 2014 (или из самого AutoCAD 2014). 100% совместимости с другими версиями AutoCAD не будет.
Александр Ривилис вне форума  
 
Непрочитано 26.08.2019, 17:47
1 | #3
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 6,785


Цитата:
Сообщение от kurstep Посмотреть сообщение
Кто подскажет как можно решить проблему, почему код иногда проходит а иногда нет?
Когда в офис вывожу: просто использую цикл с задержкой - если ошибка, то ждет сотню-другую мс, и снова пробует.. и так несколько раз, и лишь потом сообщается ошибка вывода пользователю. "Подвисает" обработка COM периодически)

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Проблема в том, что AutoCAD часто "занят".
GetAcadState?
Сергей812 вне форума  
 
Непрочитано 26.08.2019, 17:54
1 | 1 #4
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,255
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
GetAcadState?
Увы, но это не всегда помогает, т.к. этот метод можно использовать только тогда, когда AutoCAD нормально запустился и связь с ним установлена.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 26.08.2019, 17:59
#5
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


Александр, большое спасибо за ответ. Autodesk.AutoCAD.Interop.dll и Autodesk.AutoCAD.Interop.Common.dll использую из Autocad2014, с этим все верно. К сожалению я совсем плох в C++ и не смогу перевести код на C#, Может есть решение на C#?
Сергей, вы мне очень поможете если напишите код как вы реализуете свой способ с циклом на c# или Vba

Последний раз редактировалось kurstep, 26.08.2019 в 18:10.
kurstep вне форума  
 
Непрочитано 26.08.2019, 18:16
#6
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,255
Отправить сообщение для Александр Ривилис с помощью Skype™


Для C# здесь частичное решение: https://through-the-interface.typepa...plication.html
Кстати, а установлена только одна версия AutoCAD?
Александр Ривилис вне форума  
 
Непрочитано 26.08.2019, 18:32
#7
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 6,785


Цитата:
Сообщение от kurstep Посмотреть сообщение
если напишите код как вы реализуете свой способ с циклом на c#
1. Вспомогательный флаг ошибки типа bool взводится.
2. Цикл for на несколько итераций (количество попыток, меньше 3-х не имеет смысла).
3. Внутри цикла блок try - catch. В секции try после успешного выполнения COM-операции (если не было сгенерировано исключение) сброс вспомогательного флага и выход из цикла break.
В секции catch временная задержка sleep.
4. После цикла, если вспомогательный флаг остался взведен - не удалось корректно выполнить COM-операцию.

все элементарно)

----- добавлено через ~1 ч. -----
А еще не надо забывать про ROT.

И не пойму только одного - зачем использовать COM, когда есть способы связи между отдельными приложениями на компьютере - например: посылка сообщений, TCP, каналы. Это в мс-офис отчеты выкидывать через COM - самое простое и универсальное (через позднее связывание). А здесь два приложения - изначально поддерживающие загрузку сборок с .Net кодом.
Сергей812 вне форума  
 
Непрочитано 26.08.2019, 20:19
#8
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,255
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
И не пойму только одного - зачем использовать COM, когда есть способы связи между отдельными приложениями на компьютере - например: посылка сообщений, TCP, каналы. Это в мс-офис отчеты выкидывать через COM - самое простое и универсальное (через позднее связывание). А здесь два приложения - изначально поддерживающие загрузку сборок с .Net кодом.
В данном случае я бы подумал вообще про AcCoreConsole.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 27.08.2019, 09:55
#9
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


А где можно скачать работающую AcCoreConsole?
kurstep вне форума  
 
Непрочитано 27.08.2019, 09:59
1 | 1 #10
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,255
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от kurstep Посмотреть сообщение
А где можно скачать работающую AcCoreConsole?
Она в самом AutoCAD (в каталоге с acad.exe)
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 28.08.2019, 09:55
#11
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


Разбираюсь с AcCoreConsole. Посмотрел видеоурок по Autodesk DevTV. Там в примерах создается Скриптовый файл (scr.) -где
1)загружается dll и запускается нужная команда
И .bat файл (где прописывается запуск консоли и скрипта)

А вопрос в том как реализовать с помощью этой консоли мою задачу? А задача в том что через с# .net я получаю какие то данные из Ревит, По ним мне надо в dwg создать чертеж-таблицу.
То есть в моей команде, которую я запускаю через ревит нужно включить функцию которая будет создавать скриптовый файл (через него передать необходимые данные автокад ?) а потом также предусмотреть запуск bat файла (который надо будет создать заранее )через ту же функцию?... Это так надо реализовать? А можно это осуществить без создания доп .scr и .bat файлов?
kurstep вне форума  
 
Непрочитано 28.08.2019, 10:54
#12
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,255
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от kurstep Посмотреть сообщение
Разбираюсь с AcCoreConsole. Посмотрел видеоурок по Autodesk DevTV. Там в примерах создается Скриптовый файл (scr.) -где
1)загружается dll и запускается нужная команда
И .bat файл (где прописывается запуск консоли и скрипта)

А вопрос в том как реализовать с помощью этой консоли мою задачу? А задача в том что через с# .net я получаю какие то данные из Ревит, По ним мне надо в dwg создать чертеж-таблицу.
То есть в моей команде, которую я запускаю через ревит нужно включить функцию которая будет создавать скриптовый файл (через него передать необходимые данные автокад ?) а потом также предусмотреть запуск bat файла (который надо будет создать заранее )через ту же функцию?... Это так надо реализовать? А можно это осуществить без создания доп .scr и .bat файлов?
bat-файл не нужен. Тебе достаточно запустить accoreconsole через Process.Start или как-то аналогично. Данные для построения таблицы можешь передать как угодно (например, через файл).
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 28.08.2019, 11:25
#13
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


Спасибо за помощь. Суть уяснил. Через скрипт файл примерно представляю как решить задачу... Но все-таки если без файла, как еще можно (к сожалению я не так силен в программировании и мне интересно понять как это делается)
Я запускаю свое dll приложение через ревит... В какой-то момент я получаю данные для построения в автокада - я их всех загоняю в List - Armstrings. Дальше запускаю консоль "accoreconsole". Можно ли решить мою проблему дописав код в этом же файле, не создавая отдельную dll для исполнения Консоли. Нельзя ли это решить каким-то таким образом типо (ну то-есть передать метод консоли непосредственно через dll для Revit):



Код:
[Выделить все]
 ArmStrings = Armature.ArmStringfromKarkas(KarkasStrings).Union(ArmStrings).ToList();
  Process DwgConsole = Process.Start("C:/Program Files/Autodesk/AutoCAD 2014/accoreconsole.exe");
DwgConsole.TableMaker(ArmStrings);


     public void TableMaker(ArmStrings ArmStrings)
        {

           ......
        }
kurstep вне форума  
 
Непрочитано 28.08.2019, 11:28
#14
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,255
Отправить сообщение для Александр Ривилис с помощью Skype™


kurstep,
Теоретически ты можешь в scr-файл набор команд для построения таблицы. Мне этот вариант не нравится, но он самый простой.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 29.08.2019, 18:37
#15
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


В итоге решил проблему так:

Код:
[Выделить все]
List<ArmStringforTable> ArmStrings ; ///Приложение запускаю в Revit, получаю список объектов, необходимых для построения

//////////////////////Произвожу бинарную сериализацию

 BinaryFormatter formatter = new BinaryFormatter();
                // получаем поток, куда будем записывать сериализованный объект
                using (FileStream fs = new FileStream("ArmStringSerial.dat", FileMode.OpenOrCreate))
                {
                    formatter.Serialize(fs, ArmStrings);

                    Console.WriteLine("Объект сериализован");
                }
////////////////////////////////////////////  Запускаю accoreconsole, указываю ей путь на скрипт
Process DwgConsole = Process.Start
                ("C:/Program Files/Autodesk/AutoCAD 2014/accoreconsole.exe",
                "/s C:\\Users\\Kurovskiy\\source\\repos\\Serial\\ArCoreKGSP\\SpcKGTableMaker.scr  / l en - US"
                );

///////////////Сам скрипт выглядит так

;Loading the .Net module
(command "_.Netload" "C:\\Users\\Kurovskiy\\source\\repos\\Serial\\ArCoreKGSP\\bin\\Debug\\ArCoreKGSP.dll") ///dll Приложение для построения в dwg(консоли)
;
; Run the command
(command "SpcTableMaker" ) ///
_save
"D:\ACCORE\DrawTable.dwg"  //Тут сохраняется нужный чертеж
_y
_quit

//////////////////////////

/////В ArCoreKGSP.dll  произвожу десериализацию и построение dwg файла
  BinaryFormatter formatter = new BinaryFormatter();


            using (FileStream fs = new FileStream("C:\\Users\\Kurovskiy\\source\\repos\\Serial\\KGspRevit\\bin\\Debug\\ArmStringSerial.dat", FileMode.OpenOrCreate))
            {
                List<ArmStringforTable> ArmStrings = (List<ArmStringforTable>)formatter.Deserialize(fs);
                /////////////////


                using (Transaction tr = db.TransactionManager.StartTransaction())
                {

                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);

                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
////............................
////............................
////////////////////////////
Вот как то так работает, Спасибо всем кто помог. Если есть какие-то замечания предложения буду рад выслушать, поучиться)
kurstep вне форума  
 
Автор темы   Непрочитано 12.09.2019, 17:36
#16
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


Подскажите пожалуйста, никак не могу найти... Как передать команду непосредственно консольному приложению Accore... чтоб можно было бы не создавать доп файл скрипта
Пытался вот так, не получается
Код:
[Выделить все]
 Process DwgConsole = Process.Start("C:/Program Files/Autodesk/AutoCAD 2014/accoreconsole.exe");
            DwgConsole.StandardInput.WriteLine("_.Netload");
            DwgConsole.StandardInput.WriteLine("C:\\Users\\Kurovskiy\\source\\repos\\Serial\\ArCoreKGSP\\bin\\Debug\\ArCoreKGSP.dll");
kurstep вне форума  
 
Непрочитано 12.09.2019, 19:31
#17
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 6,785


тыц
Сергей812 вне форума  
 
Автор темы   Непрочитано 12.09.2019, 20:22
#18
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


Сергей, спасибо вам, но статья довольно сложная для понимания. Для себя вынес что простыми средствами framework это сделать невозможно, так ли это ?
kurstep вне форума  
 
Непрочитано 12.09.2019, 21:12
#19
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 6,785


Цитата:
Сообщение от kurstep Посмотреть сообщение
Для себя вынес что простыми средствами framework это сделать невозможно, так ли это ?
если в последних версиях не поменяли) В .Net есть и другие средства обмена информацией, например:
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
посылка сообщений, TCP, каналы
просто чем так файл скрипта помешал - сейчас экономить каждый байт (с времен, когда винчи еще всего на 20 Мб были на 286 компах) давно не актуально, просто "мусорите" в одном месте и подчищайте при старте сборки, например.
Сергей812 вне форума  
 
Автор темы   Непрочитано 13.09.2019, 10:00
#20
kurstep


 
Регистрация: 27.01.2012
Сообщений: 228


Да меня скрипт вполне устраивает, просто интересно разобраться, попробовать другими способами
kurstep вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как связаться с Autocad(2014) через Revit(2020)?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли эвакуироваться через помещение в коридор, ведущий к наружному выходу? snair Пожарная безопасность 2 12.12.2018 08:57
Запрет на проезд локомотивов через эстакаду, какие меры предпринять? Swarka Автомобильные и железные дороги, мосты, тоннели и организация движения 7 01.06.2018 15:21
Изменение масштаба блока при вставке через буфер Immortal_6666 AutoCAD 6 08.05.2018 12:57
Как сделать что бы открывать и сохранять файлы можно было как обычно через мышку, а не через командную строку? beslan AutoCAD 1 17.10.2011 11:43
Через 25 лет стоимость эксплуатации превышает стоимость строительства ? Tyhig Архитектура 41 24.08.2011 11:00