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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Возможно ли получить результат выполнения SendCommand в Delphi?

Возможно ли получить результат выполнения SendCommand в Delphi?

Ответ
Поиск в этой теме
Непрочитано 18.04.2012, 17:14 #1
Возможно ли получить результат выполнения SendCommand в Delphi?
daemonatrix
 
Регистрация: 18.04.2012
Сообщений: 5

В общем случае задача следующая. С помощью Delphi запустить на выполнение команду AutoCAD, результат выполнения вернуть обратно приложению на Delphi.

AcadApp.ActiveDocument.SendCommand('(+ 1 1)'+#13);

Возможно ли такое в принципе, т.е. можно ли считывать из COM модели AutoCAD то что находится в command line output AutoCAD?
Просмотров: 4000
 
Непрочитано 18.04.2012, 19:22
#2
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Думаю, что так не получится.
Если выполняется лисп-выражение, как в примере, то результат можно записать лисп-программой в пользовательскую переменную, в реестр, в файл, откуда уже делфи-программа сможет взять эти данные.
Do$ вне форума  
 
Непрочитано 18.04.2012, 20:58
#3
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 12,696


Чтобы такие вопросы не задавать, надо открыть acadauto.chm и читать справку по объектам. SendCommand - это метод, который ничего не возвращает.
Добраться до текстового окна Автокада путем разных ухищрений наверняка можно (как до любого окна в Windows, но пытаться прочиталь из него результат выполнения LISP-выражения совершенно бессмысленно. В окне может оказаться что угодно.

Do$ правильно подсказывает - надо результат помещать в переменную, а переменную в подходящее для чтения место.
ShaggyDoc вне форума  
 
Непрочитано 18.04.2012, 21:03
#4
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,550


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Чтобы такие вопросы не задавать, надо открыть acadauto.chm и читать справку по объектам.
gomer вне форума  
 
Автор темы   Непрочитано 19.04.2012, 12:07
#5
daemonatrix


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


Спасибо за ответы, особенно Do$, Вы действительно направили меня на путь истинный. Просто я не совсем хорошо знаком с объектной моделью AutoCAD.
Подправил Lisp функцию чтобы она записывала в USERS1, а из Delphi считываю результат. Все работает.

AcadApp.ActiveDocument.SendCommand('(load "C:\\1lisp\\test")'+#13);
AcadApp.ActiveDocument.SendCommand('(AX:GETTAGTEXTSTRING doc "GOSTFORM" "FILE_NAME")'+#13);
pt := AcadApp.ActiveDocument.GetVariable('USERS1');
ListBox1.Items.Add(pt);

p.s. Вообще стояла задача считывания атрибутов, мною было реализовано считывание, но из-за модели COM AutoCAD приходилось считывать все объекты ModelSpace или PaperSpace затем перебирать, определять атрибуты, считывание файла с 15000 элементов готового чертежа занимало порядка 15-20 секунд. Поэтому решил воспользоваться Lisp, такой способ гораздо быстрее.
daemonatrix вне форума  
 
Непрочитано 19.04.2012, 14:32
#6
Александр Ривилис

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


Цитата:
Сообщение от daemonatrix Посмотреть сообщение
но из-за модели COM AutoCAD приходилось считывать все объекты ModelSpace или PaperSpace затем перебирать
Да ну... А отфильтровать только вставки блоков с атрибутами было "слабо"?
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 19.04.2012, 16:07
#7
daemonatrix


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


Уважаемый, Александр Ривилис, в связи с тем, что это мое первое приложения для AutoCAD на Delphi, мне трудно понять о чем вы, просто я так понимаю что для того чтобы получить объекты нужно перебирать все элементы PaperSpace.Item(), которых будет PaperSpace.Count.


До этого я делал так(к примеру если чертеж выполнен в PaperSpace):
BlkRef:= Acad.ActiveDocument.PaperSpace.Item(i);

//Делал проверку на ссылку на блок
if BlkRef.ObjectName = 'AcDbBlockReference' then

//Извлекал атрибуты, проверял на нужный и выводил на TextString по TagString
AttrArray := BlkRef.GetAttributes;
LBnd:= VarArrayLowBound(AttrArray, 1);
HBnd:= VarArrayHighBound(AttrArray, 1);
for j:= LBnd to HBnd do
begin
AttrRef:= AttrArray[j];
if AttrRef.TagString = 'FNAME' then
begin
ListBox1.Items.Add(AttrRef.TagString);
ListBox1.Items.Add(AttrRef.TextString);
end;
end;

p.s. Отфильтровать вставки блоков действительно было "слабо", возможно подскажете в какую сторону копать.
daemonatrix вне форума  
 
Непрочитано 19.04.2012, 17:02
#8
Александр Ривилис

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


На Delphi я вообще не пишу, но речь ведь не о языке программирования, а о технологии. Так вот в объектной модели для объекта SelectionSet есть метод Select, которому можно передать фильтр выбора объектов. В качестве фильтра используются коды DXF. Например код 0 соответствует типу примитива (для вставки блока "INSERT"), а код 66 - код наличия атрибутов у блока (1 - есть, 0 - нет).
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 19.04.2012, 18:15
#9
daemonatrix


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


Спасибо за подсказку)
Буду разбираться теперь.
Еще два вопроса по этому поводу:
1. Если я пишу на AutoLisp функцию выборки атрибутов блока, и если использую SelectionSet.Select по быстродействию выполнения будет одинаково?
2. Я так понимаю в SelectionSet.Select можно сделать выборку к примеру примитивов TEXT в области заданной прямоугольником?
daemonatrix вне форума  
 
Непрочитано 19.04.2012, 18:20
#10
Александр Ривилис

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


Цитата:
Сообщение от daemonatrix Посмотреть сообщение
1. Если я пишу на AutoLisp функцию выборки атрибутов блока, и если использую SelectionSet.Select по быстродействию выполнения будет одинаково?
Это зависит от множества факторов. Однозначно не могу сказать.
Цитата:
Сообщение от daemonatrix Посмотреть сообщение
2. Я так понимаю в SelectionSet.Select можно сделать выборку к примеру примитивов TEXT в области заданной прямоугольником?
Можно.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 19.04.2012, 19:59
#11
daemonatrix


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


Вроде бы все понятно, буду приступать к реализации. Еще раз спасибо.
daemonatrix вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Возможно ли получить результат выполнения SendCommand в Delphi?

Система Техэксперт дает уверенность в правильности и эффективности принимаемых инженерных решений!
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Документация Проектировщику на Torrents DEM Разное 259 04.03.2020 08:17
Можно ли в ANSYS 12, получить результат нагрузки элемента с температурой? Freeman2010new ANSYS 7 18.09.2011 16:17
Как не выводить в командную строку результат выполнения функции (lisp)? Иванов Дмитрий LISP 6 28.11.2010 17:54
_copy и _array - результат выполнения? Кулик Алексей aka kpblc Программирование 11 28.03.2007 13:13