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

12/01/2015

Извлечение информации о материале

Вопрос: Как можно с помощью Revit API извлечь типовые свойства представления материала и файл изображения выдавливания?

Я добрался до некоторых свойств представления материала:

Код - C#: [Выделить]
  1. foreach (Element elem in collector)
  2.   {
  3.     Material mat = elem as Material;
  4.     AppearanceAssetElement ae = (AppearanceAssetElement)
  5.       m_CurrentDocument.GetElement(mat.AppearanceAssetId);
  6.     Asset set = ae.GetRenderingAsset();
  7.     ......
  8.   }

Но как получить название и путь к файлу?

Ответ: Класс Asset содержит свойства, которые хранятся в виде ключ-значение. Среди этих свойств должна быть и интересующая вас информация. К сожалению, нет набора предопределенных свойств. Поэтому, вам нужно будет поэкспериментировать со свойствами и понять какое свойство вам нужно и как вы его будете искать. Либо вы жестко закодируете название свойства, либо вы как-то будете вычислять его динамически.

Иногда название свойств меняется, и иногда свойства различны для различных типов материала. Поэтому жестко закодированное название – это самый простой способ, но несет в себе потенциально возможные проблемы.

Надеюсь эта информация окажется полезной.

Ответ: Вот код, который наконец-то заработал:

Код - C#: [Выделить]
  1. void MyCommand(ExternalCommandData commandData)
  2. {
  3.   string genericImage = "";
  4.   string bumpImage = "";
  5.   Element someElement = null; // элемент, который содержит материал
  6.  
  7.   Material theMaterial = someElement as Material;
  8.   AppearanceAssetElement appearanceAsset =
  9.   (AppearanceAssetElement)commandData.Application.ActiveUIDocument.
  10.                   Document.GetElement(theMaterial.AppearanceAssetId);
  11.   Asset asset1 = appearanceAsset.GetRenderingAsset();
  12.   genericImage = GetAssetProperty(asset1, "generic_diffuse");
  13.   bumpImage = GetAssetProperty(asset1, "generic_bump_map");
  14. }
  15.  
  16. private string GetAssetProperty(Asset asset1, string propertyName)
  17. {
  18.   const string BitmapPropertyName = "unifiedbitmap_Bitmap";
  19.   string theValue = "";
  20.   if (asset1 != null)
  21.   {
  22.     AssetProperty property;
  23.     AssetPropertyString stringProperty;
  24.     AssetProperty property2;
  25.     for (int i = 0; i < asset1.Size; i++)
  26.     {
  27.       property = asset1[i];
  28.       if (property != null && property.Name == propertyName)
  29.       {
  30.         IList<AssetProperty> propertiesConnected =
  31.               property.GetAllConnectedProperties();
  32.  
  33.       if (propertiesConnected != null
  34.           && propertiesConnected.Count > 0)
  35.       {
  36.         property2 = propertiesConnected[0];
  37.         if (property2.Type == AssetPropertyType.APT_Asset)
  38.         {
  39.           Asset asset2 = property2 as Asset;
  40.           if (asset2 != null)
  41.           {
  42.             for (int i2 = 0; i2 < asset2.Size; i2++)
  43.             {
  44.               property = asset2[i2];
  45.               if (property != null && property.Name
  46.                   == BitmapPropertyName)
  47.               {
  48.                  stringProperty = property
  49.                    as AssetPropertyString;
  50.                  if (stringProperty != null)
  51.                  {
  52.                    theValue = stringProperty.Value;
  53.                  }
  54.                  return theValue;
  55.               }
  56.             }
  57.           }
  58.         }
  59.        }
  60. // после того, как мы нашли свойство,
  61. // нет необходимости идти дальше
  62.       break;
  63.       }  
  64.     }
  65.   }
  66.   return "";
  67. }

Скриншот того, что требовалось найти:

 

Источник: http://adndevblog.typepad.com/aec/2014/12/au-vegas-and-retrieving-material-and-bump-image-path.html

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

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