Revit & Navisworks 二次開發—獲取材質貼圖

關注公衆號及時獲取文章更新

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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章