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

14/07/2015

Получение свойств примитива в AccoreConsole

"dumpallproperties" – это простейший способ для получения все свойств примитива при помощи Lisp. Но это не работает в scr-файле в AccoreConsole. Простейший способ для получения свойств AccoreConsole - создать CRX-плагин, который использует НЕ-COM систему свойств.

Если вы еще не знакомы с НЕ-COM системой свойств, тогда почитайте статью: Перезентация (DevTV): Не-COM система свойств

Пример в этой статье использует порцию кода из предыдущей статьи для создания CRX-приложения. Вот соответствующий код, а полный пример проекта можно скачать здесь:

Загрузить EntProps_CRX

Код - C++: [Выделить]
  1. #include "stdafx.h"
  2. static  void  ListEntityProperties(void )
  3. {
  4.   TCHAR entityHandle[133];
  5.   if  (acedGetString(
  6.     Adesk::kFalse,
  7.     _T("\nВведите метку примитива : " ),
  8.     entityHandle) != RTNORM)
  9.   {
  10.     acutPrintf(ACRX_T("\nНеправильная метка примитива." ));
  11.     return ;
  12.   }
  13.   CUtils::DisplayProperties(entityHandle);
  14. }
  15.  
  16. void  initApp()
  17. {
  18.   acedRegCmds->addCommand(ACRX_T("MY_COMMANDS" ),
  19.     ACRX_T("EntProps" ),
  20.     ACRX_T("EntProps" ),
  21.     ACRX_CMD_TRANSPARENT,
  22.     ListEntityProperties);
  23. }
  24.  
  25. #include  "rxmember.h"
  26. #include  "rxvaluetype.h"
  27. #include  "rxattrib.h"
  28. #include  "rxprop.h"
  29. #include  "dbobjptr.h"
  30.  
  31. // Utils.cpp
  32. void  CUtils::DisplayProperties(LPCTSTR handleStr)
  33. {
  34.   Acad::ErrorStatus es;
  35.   AcApDocument *pActiveDoc
  36.     = acDocManager->mdiActiveDocument();
  37.   AcDbDatabase *pDB = pActiveDoc->database();
  38.  
  39.   AcDbObjectId id = AcDbObjectId::kNull;
  40.   AcDbHandle objHandle(handleStr);
  41.   es = pDB->getAcDbObjectId(id, false , objHandle);
  42.   if  (es != Acad::eOk)
  43.   {
  44.     acutPrintf(_T("\nНеполучается преобразовать метку в ObjectId" ));
  45.     return;
  46.   }
  47.  
  48.   AcDbObjectPointer<AcDbEntity> entity(id, AcDb::kForRead);
  49.  
  50.   AcRxMemberIterator * iter = AcRxMemberQueryEngine::theEngine()->newMemberIterator(entity);  
  51.  
  52.   for  (; !iter->done(); iter->next())
  53.   {
  54.     printValues(entity, iter->current());
  55.   }
  56. }
  57.  
  58. void  CUtils::getAttInfo(
  59.   const  AcRxAttribute * att,
  60.   const  AcRxObject * member,
  61.   AcString & attInfo)
  62. {
  63.   if  (att->isA() == AcRxCOMAttribute::desc())
  64.   {
  65.     AcRxCOMAttribute * a = AcRxCOMAttribute::cast(att);
  66.     attInfo.format(_T("\n%s - %s" ), att->isA()->name(), a->name());
  67.   }
  68.   else  if  (att->isA() == AcRxUiPlacementAttribute::desc())
  69.   {
  70.     AcRxUiPlacementAttribute * a
  71.       = AcRxUiPlacementAttribute::cast(att);
  72.     attInfo.format(
  73.       _T("\n%s - %s - %f" ),
  74.       att->isA()->name(),
  75.       a->getCategory(member),
  76.       a->getWeight(member));
  77.   }
  78.   else
  79.   {
  80.     attInfo.format(_T("\n%s" ), att->isA()->name());
  81.   }
  82. }
  83.  
  84. void  CUtils::printValues(AcRxObject * entity, const  AcRxMember * member)
  85. {
  86.   Acad::ErrorStatus err = Acad::eOk;
  87.  
  88.   AcString strValue;
  89.   AcRxProperty * prop = AcRxProperty::cast(member);
  90.   if  (prop != NULL)
  91.   {
  92.     AcRxValue value;
  93.  
  94.     if  ((err = prop->getValue(entity, value)) == Acad::eOk)
  95.     {
  96.       ACHAR * szValue = NULL;
  97.  
  98.       int  buffSize = value.toString(NULL, 0);
  99.       if  (buffSize > 0)
  100.       {
  101.         buffSize++;
  102.         szValue = new  ACHAR[buffSize];
  103.         value.toString(szValue, buffSize);
  104.       }
  105.  
  106.       strValue.format(
  107.         _T("%s = %s" ),
  108.         value.type().name(),
  109.         (szValue == NULL) ? _T("none" ) : szValue); 
  110.  
  111.       if  (szValue)
  112.         delete  szValue;
  113.     }
  114.     else
  115.     {
  116.       strValue.format(_T("Код ошибки = %d" ), err);
  117.     }
  118.   }
  119.  
  120.   AcString str;
  121.   str.format(_T("\n%s - %s [%s]" ), member->isA()->name(),
  122.     member->name(), strValue.kACharPtr());
  123.   acutPrintf(str);
  124.  
  125.   const  AcRxAttributeCollection & atts
  126.     = member->attributes();
  127.  
  128.   for  (int  i = 0; i < atts.count(); i++)
  129.   {
  130.     const  AcRxAttribute * att = atts.getAt(i);
  131.  
  132.     AcString attInfo;
  133.     getAttInfo(att, member, attInfo);
  134.  
  135.     acutPrintf(attInfo);
  136.   }
  137.  
  138.   if  (member->children() != NULL)
  139.   {
  140.     for  (int  i = 0;
  141.       i < member->children()->length(); i++)
  142.     {
  143.       const  AcRxMember * subMember
  144.         = member->children()->at(i);
  145.       printValues(entity, subMember); 
  146.     }
  147.   }
  148. }

CRX-приложение объявляет команду "EntProps", которая требует метку примитива, чьи свойства и будут напечатаны.

Это пример скрипта (scr-файла) для загрузки crx и вызова команды "EntProps":

(arxload "D:\\Temp\\CrxTest1.crx")
EntProps
4C4   ;; Метка примитива для получения свойств

 

Источник: http://adndevblog.typepad.com/autocad/2015/03/retrieving-entity-properties-using-accoreconsole.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2855

Опубликовано 14.07.2015