Как получить набор предварительного вызова

Автор Тема: Как получить набор предварительного вызова  (Прочитано 6538 раз)

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

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

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

Код - C++ [Выбрать]
  1.         static void CPickUp_pickup(void)
  2.         {
  3.                 while (true)
  4.                 {
  5.                         struct resbuf eb;
  6.                         TCHAR sbuf[10];
  7.                         eb.restype=0; // имя примитива
  8.                         _tcscpy(sbuf,_T("INSERT"));
  9.                         eb.resval.rstring=sbuf;
  10.                         eb.rbnext=0;
  11.                         ads_name ss;
  12.                         if(acedSSGet(0,0,0,&eb,ss) !=RTNORM)
  13.                         {
  14.                                 acutRelRb(&eb);
  15.                                 return;
  16.                         }
  17.                         acutRelRb(&eb);
  18.  
  19.                         long length=0;
  20.                         if((acedSSLength(ss,&length)!=RTNORM)||(length==0))
  21.                         {
  22.                                 acedSSFree(ss);
  23.                                 return;
  24.                         }
  25.  
  26.                         ads_point pointBaz;
  27.                         ads_real Zlevel=0.0;
  28.  
  29.                         int stat;
  30.                         TCHAR kw[20];
  31.                         acedInitGet(RSG_OTHER,0);
  32.                         bool b=true;
  33.                         while(b)
  34.                         {
  35.                                 if((stat=acedGetPoint(0,_T("\nВыбери точку или введи значение: "),pointBaz))==RTCAN)
  36.                                 {
  37.                                         acedSSFree(ss);
  38.                                         return;
  39.                                 }
  40.                                 else if (stat==RTNORM)
  41.                                 {
  42.                                         Zlevel=pointBaz[Z];
  43.                                         b=false;
  44.                                 }
  45.                                 else if(stat==RTKWORD && acedGetInput(kw) == RTNORM)
  46.                                         {
  47.                                                 if( (stat=acdbDisToF(kw, -1, &Zlevel))== RTNORM)
  48.                                                 b=false;
  49.                                         }
  50.                         }
  51.  
  52.                         ads_name ent;
  53.                         AcDbObjectId id = AcDbObjectId::kNull;
  54.                         // Walk through the selection set and open each entity
  55.                         for (long i = 0; i < length; i++)
  56.                         {
  57.                                 if (acedSSName(ss,i,ent) != RTNORM) continue;
  58.                                 if (acdbGetObjectId(id,ent) != Acad::eOk) continue;
  59.                                 AcDbEntity* pEnt = NULL;
  60.                                 if (acdbOpenAcDbEntity(pEnt,id,AcDb::kForWrite) != Acad::eOk)
  61.                                         continue;
  62.                                 if ( !pEnt->isKindOf (AcDbBlockReference::desc ()) )
  63.                                 {
  64.                                         pEnt->close();
  65.                                         continue;
  66.                                 }
  67.                                 AcDbBlockReference* pBl=AcDbBlockReference::cast(pEnt);
  68.                                 AcGePoint3d pPoint=pBl->position();
  69.                                 resbuf fromrb, torb;
  70.                                 fromrb.restype=RTSHORT;
  71.                                 fromrb.resval.rint=0;   // WCS
  72.                                 torb.restype=RTSHORT;
  73.                                 torb.resval.rint=1;     // UCS
  74.                                 // disp==0 indicates that pt is a point??????????????
  75.                                 ads_point result, objPoint;
  76.                                 objPoint[0]=pPoint[0];objPoint[1]=pPoint[1];objPoint[2]=pPoint[2];
  77.                                 acedTrans(objPoint,&fromrb,&torb,false,result);
  78.                                 result[Z]=Zlevel;
  79.                                 fromrb.resval.rint=1;   // UCS
  80.                                 torb.resval.rint=0;     // WCS
  81.                                 acedTrans(result,&fromrb,&torb,false,objPoint);
  82.  
  83.                                 AcGePoint3d oldPosition= pBl->position();
  84.                                 AcGePoint3d newPosinion(objPoint[X],objPoint[Y],objPoint[Z]);
  85.                                 AcGeVector3d v=newPosinion-oldPosition;
  86.                                 pBl->transformBy(AcGeMatrix3d().setToTranslation(v));
  87.                                
  88.                                 pEnt->close(); pEnt=0;
  89.                         }
  90.                         acedSSFree(ss);
  91.                 }
  92.                 return;
  93.         }

Но хочется большего, что если пользователь выделит объекты (блоки) до того как запустит эту команду? Как получить доступ к выделенным ранее объектам?

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

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

Отмечено как Решение Эд 12-10-2016, 07:30:45

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Для получения набора предварительного выбора можно пользоваться функциями acedSSGet(_T("_I"),....) или acedSSGetFirst
При этом команда должна быть зарегистрирована с флагом ACRX_CMD_USEPICKSET. Пример такой команды создаётся ObjectARX Wizard. Я её немного облагородил и перевёл:
Код - C++ [Выбрать]
  1. // Модальная команда с набором предварительного выбора
  2. // ACED_ARXCOMMAND_ENTRY_AUTO(CArxProject1App, MyGroup, MyPickFirst, MyPickFirstLocal, ACRX_CMD_MODAL | ACRX_CMD_USEPICKSET)
  3. static void MyGroupMyPickFirst () {
  4.         ads_name result ;
  5.         ///// Можно 4-ым параметром передать фильтр выбора для выбора только блоков
  6.         int iRet =acedSSGet (ACRX_T("_I"), NULL, NULL, NULL, result) ;
  7.         if ( iRet == RTNORM )
  8.         {
  9.                 // Что-то было выбрано до запуска команды
  10.                 // Можем обработать предварительный выбор
  11.         }
  12.         else
  13.         {
  14.                 // До запуска команды ничего не было выбрано
  15.                 // Нужно попросить пользователя что-то выбрать
  16.         }
  17. }
  18.  
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение