Извлечение информации о материале
Вопрос: Как можно с помощью Revit API извлечь типовые свойства представления материала и файл изображения выдавливания?
Я добрался до некоторых свойств представления материала:
- foreach (Element elem in collector)
- {
- Material mat = elem as Material;
- AppearanceAssetElement ae = (AppearanceAssetElement)
- m_CurrentDocument.GetElement(mat.AppearanceAssetId);
- Asset set = ae.GetRenderingAsset();
- ......
- }
Но как получить название и путь к файлу?
Ответ: Класс Asset содержит свойства, которые хранятся в виде ключ-значение. Среди этих свойств должна быть и интересующая вас информация. К сожалению, нет набора предопределенных свойств. Поэтому, вам нужно будет поэкспериментировать со свойствами и понять какое свойство вам нужно и как вы его будете искать. Либо вы жестко закодируете название свойства, либо вы как-то будете вычислять его динамически.
Иногда название свойств меняется, и иногда свойства различны для различных типов материала. Поэтому жестко закодированное название – это самый простой способ, но несет в себе потенциально возможные проблемы.
Надеюсь эта информация окажется полезной.
Ответ: Вот код, который наконец-то заработал:
- void MyCommand(ExternalCommandData commandData)
- {
- string genericImage = "";
- string bumpImage = "";
- Element someElement = null; // элемент, который содержит материал
- Material theMaterial = someElement as Material;
- AppearanceAssetElement appearanceAsset =
- (AppearanceAssetElement)commandData.Application.ActiveUIDocument.
- Document.GetElement(theMaterial.AppearanceAssetId);
- Asset asset1 = appearanceAsset.GetRenderingAsset();
- genericImage = GetAssetProperty(asset1, "generic_diffuse");
- bumpImage = GetAssetProperty(asset1, "generic_bump_map");
- }
- private string GetAssetProperty(Asset asset1, string propertyName)
- {
- const string BitmapPropertyName = "unifiedbitmap_Bitmap";
- string theValue = "";
- if (asset1 != null)
- {
- AssetProperty property;
- AssetPropertyString stringProperty;
- AssetProperty property2;
- for (int i = 0; i < asset1.Size; i++)
- {
- property = asset1[i];
- if (property != null && property.Name == propertyName)
- {
- IList<AssetProperty> propertiesConnected =
- property.GetAllConnectedProperties();
- if (propertiesConnected != null
- && propertiesConnected.Count > 0)
- {
- property2 = propertiesConnected[0];
- if (property2.Type == AssetPropertyType.APT_Asset)
- {
- Asset asset2 = property2 as Asset;
- if (asset2 != null)
- {
- for (int i2 = 0; i2 < asset2.Size; i2++)
- {
- property = asset2[i2];
- if (property != null && property.Name
- == BitmapPropertyName)
- {
- stringProperty = property
- as AssetPropertyString;
- if (stringProperty != null)
- {
- theValue = stringProperty.Value;
- }
- return theValue;
- }
- }
- }
- }
- }
- // после того, как мы нашли свойство,
- // нет необходимости идти дальше
- break;
- }
- }
- }
- return "";
- }
Скриншот того, что требовалось найти:
Источник: 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