12/11/2015
Как получить доступ и изменить свойства динамического блока в ARX и .NET
Вопрос:
У моего динамического блока есть свойство "Visibility", которое может быть в двух состояниях. Как мне получить доступ к этому свойству и изменить его?
Ответ:
Запустите следующий код с присоединённым в конце статьи чертежом. Выберите вставку динамического блока, код получит доступ к свойству Visibility и изменит его состояние. Вы сможете сразу увидеть результат после завершения работы кода.
Код - C++: [Выделить]
- void SetDynamicBlkProperty()
- {
- ads_name ename;
- ads_point pt;
- if(acedEntSel(L"\nВыберите вставку динамического блока: ", ename, pt) != RTNORM)
- {
- acutPrintf(L"\nОшибка выбора.");
- return;
- }
- AcDbObjectId eId;
- acdbGetObjectId(eId, ename);
- AcDbEntity* pEnt = NULL;
- if (acdbOpenObject(pEnt, eId , AcDb::kForRead) != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при открытии примитива.");
- if(pEnt)
- pEnt->close();
- return;
- }
- if(pEnt->isA() != AcDbBlockReference::desc())
- {
- acutPrintf(L"\nНужно было выбрать вставку блока! ");
- pEnt->close();
- return;
- }
- AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(pEnt);
- // Инициализируем AcDbDynBlockReference используя object id вставки блока
- AcDbDynBlockReference* pDynBlkRef = new AcDbDynBlockReference(pBlkRef->objectId());
- // Не забудьте закрыть вставку блока сейчас,
- // в противном случае вы не сможете изменить ее свойства
- pEnt->close();
- if (pDynBlkRef)
- {
- AcDbDynBlockReferencePropertyArray blkPropAry;
- pDynBlkRef->getBlockProperties(blkPropAry);
- Acad::ErrorStatus err;
- AcDbDynBlockReferenceProperty blkProp;
- for(long lIndex1=0L ; lIndex1<blkPropAry.length() ; ++lIndex1)
- {
- blkProp = blkPropAry[lIndex1];
- // Ищем соответствующее свойство
- if (wcscmp(blkProp.propertyName().kACharPtr(), L"Visibility") != 0) continue;
- // Получаем его допустимые значения
- AcDbEvalVariantArray evalAry;
- if ((err = blkProp.getAllowedValues(evalAry)) == Acad::eOk )
- {
- if( evalAry.length() >= 1)
- {
- AcDbEvalVariant eval = evalAry[1];
- if(!blkProp.readOnly())
- {
- if((err = blkProp.setValue(eval)) != Acad::eOk)
- {
- acutPrintf(L"\nОшибка при установке значения...");
- }
- }
- }
- }
- }
- // Не забываем удалить ссылку – иначе проблем не избежать.
- delete pDynBlkRef;
- }
- }
Это C#-версия:
Код - C#: [Выделить]
- [CommandMethod("SetDynamicBlkProperty")]
- static public void SetDynamicBlkProperty()
- {
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Database db = doc.Database;
- Editor ed = doc.Editor;
- PromptEntityOptions prEntOptions = new PromptEntityOptions(
- "Выберите вставку динамического блока...");
- PromptEntityResult prEntResult = ed.GetEntity(prEntOptions);
- if (prEntResult.Status != PromptStatus.OK)
- {
- ed.WriteMessage("Ошибка...");
- return;
- }
- using(Transaction Tx = db.TransactionManager.StartTransaction())
- {
- BlockReference bref = Tx.GetObject(
- prEntResult.ObjectId,
- OpenMode.ForWrite)
- as BlockReference;
- if (bref.IsDynamicBlock)
- {
- DynamicBlockReferencePropertyCollection props =
- bref.DynamicBlockReferencePropertyCollection;
- foreach (DynamicBlockReferenceProperty prop in props)
- {
- object[] values = prop.GetAllowedValues();
- // Переключаем свойство
- if (prop.PropertyName == "Visibility" && !prop.ReadOnly)
- {
- if (prop.Value.ToString() == values[0].ToString())
- prop.Value = values[1];
- else
- prop.Value = values[0];
- }
- }
- }
- Tx.Commit();
- }
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=3200
Опубликовано 12.11.2015