14/07/2015
Получение свойств примитива в AccoreConsole
"dumpallproperties" – это простейший способ для получения все свойств примитива при помощи Lisp. Но это не работает в scr-файле в AccoreConsole. Простейший способ для получения свойств AccoreConsole - создать CRX-плагин, который использует НЕ-COM систему свойств.Если вы еще не знакомы с НЕ-COM системой свойств, тогда почитайте статью: Перезентация (DevTV): Не-COM система свойств
Пример в этой статье использует порцию кода из предыдущей статьи для создания CRX-приложения. Вот соответствующий код, а полный пример проекта можно скачать здесь:
Код - C++: [Выделить]
- #include "stdafx.h"
- static void ListEntityProperties(void )
- {
- TCHAR entityHandle[133];
- if (acedGetString(
- Adesk::kFalse,
- _T("\nВведите метку примитива : " ),
- entityHandle) != RTNORM)
- {
- acutPrintf(ACRX_T("\nНеправильная метка примитива." ));
- return ;
- }
- CUtils::DisplayProperties(entityHandle);
- }
- void initApp()
- {
- acedRegCmds->addCommand(ACRX_T("MY_COMMANDS" ),
- ACRX_T("EntProps" ),
- ACRX_T("EntProps" ),
- ACRX_CMD_TRANSPARENT,
- ListEntityProperties);
- }
- #include "rxmember.h"
- #include "rxvaluetype.h"
- #include "rxattrib.h"
- #include "rxprop.h"
- #include "dbobjptr.h"
- // Utils.cpp
- void CUtils::DisplayProperties(LPCTSTR handleStr)
- {
- Acad::ErrorStatus es;
- AcApDocument *pActiveDoc
- = acDocManager->mdiActiveDocument();
- AcDbDatabase *pDB = pActiveDoc->database();
- AcDbObjectId id = AcDbObjectId::kNull;
- AcDbHandle objHandle(handleStr);
- es = pDB->getAcDbObjectId(id, false , objHandle);
- if (es != Acad::eOk)
- {
- acutPrintf(_T("\nНеполучается преобразовать метку в ObjectId" ));
- return;
- }
- AcDbObjectPointer<AcDbEntity> entity(id, AcDb::kForRead);
- AcRxMemberIterator * iter = AcRxMemberQueryEngine::theEngine()->newMemberIterator(entity);
- for (; !iter->done(); iter->next())
- {
- printValues(entity, iter->current());
- }
- }
- void CUtils::getAttInfo(
- const AcRxAttribute * att,
- const AcRxObject * member,
- AcString & attInfo)
- {
- if (att->isA() == AcRxCOMAttribute::desc())
- {
- AcRxCOMAttribute * a = AcRxCOMAttribute::cast(att);
- attInfo.format(_T("\n%s - %s" ), att->isA()->name(), a->name());
- }
- else if (att->isA() == AcRxUiPlacementAttribute::desc())
- {
- AcRxUiPlacementAttribute * a
- = AcRxUiPlacementAttribute::cast(att);
- attInfo.format(
- _T("\n%s - %s - %f" ),
- att->isA()->name(),
- a->getCategory(member),
- a->getWeight(member));
- }
- else
- {
- attInfo.format(_T("\n%s" ), att->isA()->name());
- }
- }
- void CUtils::printValues(AcRxObject * entity, const AcRxMember * member)
- {
- Acad::ErrorStatus err = Acad::eOk;
- AcString strValue;
- AcRxProperty * prop = AcRxProperty::cast(member);
- if (prop != NULL)
- {
- AcRxValue value;
- if ((err = prop->getValue(entity, value)) == Acad::eOk)
- {
- ACHAR * szValue = NULL;
- int buffSize = value.toString(NULL, 0);
- if (buffSize > 0)
- {
- buffSize++;
- szValue = new ACHAR[buffSize];
- value.toString(szValue, buffSize);
- }
- strValue.format(
- _T("%s = %s" ),
- value.type().name(),
- (szValue == NULL) ? _T("none" ) : szValue);
- if (szValue)
- delete szValue;
- }
- else
- {
- strValue.format(_T("Код ошибки = %d" ), err);
- }
- }
- AcString str;
- str.format(_T("\n%s - %s [%s]" ), member->isA()->name(),
- member->name(), strValue.kACharPtr());
- acutPrintf(str);
- const AcRxAttributeCollection & atts
- = member->attributes();
- for (int i = 0; i < atts.count(); i++)
- {
- const AcRxAttribute * att = atts.getAt(i);
- AcString attInfo;
- getAttInfo(att, member, attInfo);
- acutPrintf(attInfo);
- }
- if (member->children() != NULL)
- {
- for (int i = 0;
- i < member->children()->length(); i++)
- {
- const AcRxMember * subMember
- = member->children()->at(i);
- printValues(entity, subMember);
- }
- }
- }
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