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

13/11/2015

Как получить доступ и изменить свойства динамического блока в ARX и .NET

Вопрос:

У моего динамического блока есть свойство "Visibility", которое может быть в двух состояниях. Как мне получить доступ к этому свойству и изменить его?

Ответ:

Запустите следующий код с присоединённым в конце статьи чертежом. Выберите вставку динамического блока, код получит доступ к свойству Visibility и изменит его состояние. Вы сможете сразу увидеть результат после завершения работы кода.

Код - C++: [Выделить]
  1. void SetDynamicBlkProperty()
  2. {
  3.  ads_name ename;
  4.  ads_point pt;
  5.  if(acedEntSel(L"\nВыберите вставку динамического блока: ", ename, pt) != RTNORM)
  6.  {
  7.   acutPrintf(L"\nОшибка выбора.");
  8.   return;
  9.  }
  10.  
  11.  AcDbObjectId eId;
  12.  acdbGetObjectId(eId, ename);
  13.  AcDbEntity* pEnt = NULL;
  14.  
  15.  if (acdbOpenObject(pEnt, eId , AcDb::kForRead) != Acad::eOk)
  16.  {
  17.   acutPrintf(L"\nОшибка при открытии примитива.");
  18.   if(pEnt)
  19.     pEnt->close();
  20.   return;
  21.  }
  22.  
  23.  if(pEnt->isA() != AcDbBlockReference::desc())
  24.  {
  25.   acutPrintf(L"\nНужно было выбрать вставку блока! ");
  26.   pEnt->close();
  27.   return;
  28.  }
  29.  
  30.  AcDbBlockReference *pBlkRef = AcDbBlockReference::cast(pEnt);
  31.  
  32.  // Инициализируем AcDbDynBlockReference используя object id вставки блока
  33.  AcDbDynBlockReference* pDynBlkRef = new AcDbDynBlockReference(pBlkRef->objectId());
  34.  
  35.  // Не забудьте закрыть вставку блока сейчас,
  36.  // в противном случае вы не сможете изменить ее свойства
  37.  pEnt->close();
  38.  
  39.  if (pDynBlkRef)
  40.  {
  41.   AcDbDynBlockReferencePropertyArray blkPropAry;
  42.   pDynBlkRef->getBlockProperties(blkPropAry);
  43.  
  44.   Acad::ErrorStatus err;
  45.   AcDbDynBlockReferenceProperty blkProp;
  46.  
  47.   for(long lIndex1=0L ; lIndex1<blkPropAry.length() ; ++lIndex1)
  48.   {
  49.    blkProp = blkPropAry[lIndex1];
  50.  
  51.    // Ищем соответствующее свойство
  52.    if (wcscmp(blkProp.propertyName().kACharPtr(), L"Visibility") != 0) continue;
  53.  
  54.    // Получаем его допустимые значения
  55.    AcDbEvalVariantArray evalAry;
  56.  
  57.    if ((err = blkProp.getAllowedValues(evalAry)) == Acad::eOk )
  58.    {
  59.     if( evalAry.length() >= 1)
  60.     {
  61.      AcDbEvalVariant eval = evalAry[1];
  62.  
  63.      if(!blkProp.readOnly())
  64.      {
  65.       if((err = blkProp.setValue(eval)) != Acad::eOk)
  66.       {
  67.        acutPrintf(L"\nОшибка при установке значения...");
  68.       }
  69.      }
  70.     }
  71.    }
  72.   }
  73.  
  74.   // Не забываем удалить ссылку – иначе проблем не избежать.
  75.   delete pDynBlkRef;
  76.  }
  77. }

 

Это C#-версия:

Код - C#: [Выделить]
  1. [CommandMethod("SetDynamicBlkProperty")]
  2. static public void SetDynamicBlkProperty()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.  
  8.     PromptEntityOptions prEntOptions = new PromptEntityOptions(
  9.         "Выберите вставку динамического блока...");
  10.  
  11.     PromptEntityResult prEntResult = ed.GetEntity(prEntOptions);
  12.  
  13.     if (prEntResult.Status != PromptStatus.OK)
  14.     {
  15.         ed.WriteMessage("Ошибка...");
  16.         return;
  17.     }
  18.  
  19.     using(Transaction Tx = db.TransactionManager.StartTransaction())
  20.     {
  21.         BlockReference bref = Tx.GetObject(
  22.             prEntResult.ObjectId,
  23.             OpenMode.ForWrite)
  24.                 as BlockReference;
  25.  
  26.         if (bref.IsDynamicBlock)
  27.         {
  28.             DynamicBlockReferencePropertyCollection props =
  29.                 bref.DynamicBlockReferencePropertyCollection;
  30.  
  31.             foreach (DynamicBlockReferenceProperty prop in props)
  32.             {
  33.                 object[] values = prop.GetAllowedValues();
  34.  
  35.                 // Переключаем свойство
  36.                 if (prop.PropertyName == "Visibility" && !prop.ReadOnly)
  37.                 {
  38.                     if (prop.Value.ToString() == values[0].ToString())
  39.                         prop.Value = values[1];
  40.  
  41.                     else
  42.                         prop.Value = values[0];
  43.                 }
  44.             }
  45.         }
  46.  
  47.         Tx.Commit();
  48.     }
  49. }

 

Rectangle.dwg

Источник: http://adndevblog.typepad.com/autocad/2012/08/how-to-access-and-modify-a-dynamicblockreference-property-in-arx-and-net.html

 

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

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

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