Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Vt от 23-12-2015, 17:28:25

Название: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 23-12-2015, 17:28:25
Здравствуйте. Как правильнее реализовать вызов команды или функции, срабатывающей при нажатии на ручку пользовательского примитива, в которой пользователь в дальнейшем будет вводить данные или указывать точки на чертеже. Примитив находиться в dbx а команды в arx. Я попытался в функции setHotGripFunc вызвать AcedCommandS но она не сработала. Александр Ривилис предложил использовать  acDocManager->sendStringToExecute или acedPostCommand. Но как я понял через эти функции можно передать только текстовые данные. А если нужно передать другие данные, например: имя примитива или точку?
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 23-12-2015, 18:03:18
Vitaut Tryputsin
Приветствую на форуме!
Но как я понял через эти функции можно передать только текстовые данные. А если нужно передать другие данные, например: имя примитива или точку?
Имя примитива можно передать через (handent "метка примитива"), точку тоже можно передать в формате "x,y,z"
Вопрос в другом - нужно ли это? Может быть команда не нужна вообще? Это стандартная команда AutoCAD или команда написанная тобой? Объясни задачу целиком - вполне возможно найдётся другое решение.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 23-12-2015, 18:12:18
К примеру есть воздуховод. Пользователь нажимает на ручку. И запускается команда черчения воздуховодов, черчение начинается от конца воздуховода, на котором размещена ручка. В процессе черчения пользователь может менять размер и указывать точки через которые будут проходить воздуховоды и т.д.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 23-12-2015, 18:14:29
И запускается команда черчения воздуховодов
Команда черчения воздуховода твоя?
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 23-12-2015, 18:20:21
Пользователь нажимает на ручку. И запускается команда черчения воздуховодов
Обычно в этой ситуации в AutoCAD принято начинать редактировать выбранный "воздуховод", а не запускать команду черчения другого "воздуховода". Это я на всякий случай уточняю.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 23-12-2015, 18:33:23
да и воздуховод и команда моя. Ручка нужна чтобы вручную не нажимать на команду черчения на панели и не вводить его размер. И начальную точку. Если к примеру бедет требоваться продолжить черчение от конца существующего.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 23-12-2015, 18:44:35
Я напишу как я бы сделал в этой ситуации, а тебе уже решать идти таким путём или нет. Команду оформляешь в arx-файле. Ты её (без параметров) запускаешь из dbx-файла при выборе ручки. Но! До запуска команды ты готовишь в setHotGripFunc все необходимые для команды параметры (имя примитива, точки, и т.д.)
В dbx-файле ты делаешь экспортируемую функцию, которая будет вызваться из arx-файла и получать все необходимые тебе параметры. Например, это может быть статическая функция в классе воздуховода с именем (тоже, например) GetParamsForDraw(). В этом случае команде не нужно напрямую передавать никакие параметры. После запуска она просто вызовет эту статическую функцию и получит всё что нужно.
Как тебе такой вариант?
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 23-12-2015, 18:53:52
Спасибо, Александр. Мне такое решение нравится. Многое при изучении objectarx, я почерпнул из ваших коментариев и статей на форумах.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 23-12-2015, 19:28:58
Пожалуйста! :) Кстати, обрати внимание на кнопки + и - и кнопку Решение.
Если будут проблемы - пиши. Поможем.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 23-12-2015, 19:49:37
Спасибо. С решением разобрался а +/- не нашел
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 23-12-2015, 19:51:42
А все под кармой. Почему-то сразу не заметил
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 23-12-2015, 19:55:26
Vitaut Tryputsin
Будем считать, что прописку на форуме получил!  :)
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 23-12-2015, 20:23:13
 :)
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 24-12-2015, 14:05:01
Попробовал по предложенному способу сделать. Функция GetParamsForDraw() возвращает нулевые значения, когда вызывается в команде черчения. Возможно я не совсем верно понял, что значит экспортируемая функция. Если да, то как предложенную функцию сделать экспортируемой?

Код - C++ [Выбрать]
  1. namespace GripCback
  2. {
  3.                
  4.         static int gripNumber;
  5.                        
  6.         static AcDbObjectId entId;
  7.  
  8.         static void GetParamsForDraw(AcDbObjectId &pEntId, int &pGripNumber)
  9.         {
  10.  
  11.                         pEntId=entId;
  12.                         pGripNumber=gripNumber;
  13.                
  14.                
  15.         };
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 24-12-2015, 14:09:07
1. Обрати внимание у меня в подписи как следует форматировать код на форуме.
2. Я не увидел где у тебя происходит установка gripNumber и entId.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 24-12-2015, 14:17:34
Код - C++ [Выбрать]
  1. void GripCback::SetParamsForDraw(AcDbObjectId pEntId, int pGripNumber)
  2. {
  3.         entId=pEntId;
  4.         gripNumber=pGripNumber;
  5.  
  6. }
  7.  
  8. //Hot grip Call back function Implementation
  9. AcDbGripOperations::ReturnValue
  10. GripCback::hotGripfunc(AcDbGripData                     *pthis,
  11.                                            const AcDbObjectId   &entId,
  12.                                                 int                                      contextFlags)
  13. {
  14.         AcDbGripOperations::ReturnValue gripStat(AcDbGripOperations::eOk);
  15.  
  16.  
  17.         int index =(int) pthis->appData();
  18.        
  19.         SetParamsForDraw(entId,index);
  20.  
  21.        
  22.         acDocManager->sendStringToExecute(acDocManager->document(acdbHostApplicationServices()->workingDatabase()),
  23.                 _T("TVS_Draw\n"), TRUE, FALSE, FALSE);
  24.        
  25.  
  26.         TSTDSTRING *psApppData = static_cast<TSTDSTRING *>(pthis->appData());
  27.         if(psApppData)
  28.         {
  29.                
  30.                 gripStat=AcDbGripOperations::eGripHotToWarm;
  31.                
  32.         }
  33.        
  34.         else
  35.         {
  36.         gripStat=AcDbGripOperations::eOk;
  37.         }
  38.        
  39.         return gripStat;
  40. }
  41.        
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 24-12-2015, 14:25:45
Боюсь, что без отладчика здесь не обойтись. Внешне всё выглядит правильно.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 24-12-2015, 14:36:11
Стоп. Кажется нашёл в чем ошибка. Ты перепутал статическую функцию и статический метод класса. Я имел в виду добавить статический метод в класс воздуховода. Ты же добавил статическую функцию в пространство имён. Это значит, что у тебя в dbx-модуле одна функция, а в arx-модуле другая функция. И они никак между собой не связаны.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Vt от 24-12-2015, 16:30:23
Спасибо, добавил статический метод в класс и все заработало как надо.
Название: Re: Вызов команды по нажатию на ручку customentity
Отправлено: Александр Ривилис от 24-12-2015, 17:18:07
Отлично!