Retrieving textures via Navisworks API (no solution)
关于Revit API 获取材质贴图位图 bitMap(可行)
代码如下:
string[] targetMaterialNames = {
// A standard Revit material, with
// textures in standard paths.
"Brick, Common",
// A material with a single image from
// another non-material library path
"Local Path Material"
};
void FindTextureBitmapPaths( Document doc )
{
// Find materials
FilteredElementCollector fec
= new FilteredElementCollector( doc );
fec.OfClass( typeof( Material ) );
IEnumerable<Material> targetMaterials
= fec.Cast<Material>().Where<Material>( mtl =>
targetMaterialNames.Contains( mtl.Name ) );
foreach( Material material in targetMaterials )
{
// Get appearance asset for read
ElementId appearanceAssetId = material
.AppearanceAssetId;
AppearanceAssetElement appearanceAssetElem
= doc.GetElement( appearanceAssetId )
as AppearanceAssetElement;
Asset asset = appearanceAssetElem
.GetRenderingAsset();
// Walk through all first level assets to find
// connected Bitmap properties. Note: it is
// possible to have multilevel connected
// properties with Bitmaps in the leaf nodes.
// So this would need to be recursive.
int size = asset.Size;
for( int assetIdx = 0; assetIdx < size; assetIdx++ )
{
AssetProperty aProperty = asset[assetIdx];
if( aProperty.NumberOfConnectedProperties < 1 )
continue;
// Find first connected property.
// Should work for all current (2018) schemas.
// Safer code would loop through all connected
// properties based on the number provided.
Asset connectedAsset = aProperty
.GetConnectedProperty( 0 ) as Asset;
// We are only checking for bitmap connected assets.
if( connectedAsset.Name == "UnifiedBitmapSchema" )
{
// This line is 2018.1 & up because of the
// property reference to UnifiedBitmap
// .UnifiedbitmapBitmap. In earlier versions,
// you can still reference the string name
// instead: "unifiedbitmap_Bitmap"
AssetPropertyString path = connectedAsset[
UnifiedBitmap.UnifiedbitmapBitmap]
as AssetPropertyString;
// This will be a relative path to the
// built -in materials folder, addiitonal
// render appearance folder, or an
// absolute path.
TaskDialog.Show( "Connected bitmap",
String.Format( "{0} from {2}: {1}",
aProperty.Name, path.Value,
connectedAsset.LibraryName ) );
}
}
}
}
能获取到计算机中位图 bitmap 的路径,但通常是相对路径,C:\Program Files (x86)\Common Files\Autodesk Shared\Materials\Textures,这是Revit默认的材质库,当然用户也可以自定义渲染外观的路径;也会出现绝对路径的情况,也就是贴图文件既不在默认材质库文件夹中,也不在用户添加的渲染外观路径下。
对于绝对路径,我们可以直接找到它,而对于相对路径,我需要做一些逻辑判断,首先判断默认的材质库中是否有该文件,如果没有,再读取 Revit.ini (Initialization File 初始化文件)文件来找到用户定义的其他渲染外观路径,接着在这些路径下找到对应的贴图文件。
Revit.ini 路径: C:\Users\11204\AppData\Roaming\Autodesk\Revit\Autodesk Revit 2018