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