Change Rendering Asset (Images) to a New Directory including BIM 360 Cloud

I had shared an image of this graph online, but was asked to share it so here you go.

  1. Select a directory where you WANT the images to be paths. This can include a BIM 360 path via Desktop Connector.
  2. The Replace Asset python node will iterate each material, see if it has a General Diffuse Asset (image) and then replace it with a matching one in the directory selected if it exists.

image

Any resulting paths are images that were replaced.
image

import clr

clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Visual import *

clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *

clr.AddReference('System')
from System.Collections.Generic import List
from System.IO import *

clr.AddReference('RevitNodes')
import Revit

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

#Preparing input from dynamo to revit
materials = UnwrapElement(IN[0])
SearchPath = IN[1]
PathsChanged = []
#Do some action in a Transaction
TransactionManager.Instance.EnsureInTransaction(doc)
for mat in materials:
	editScope = AppearanceAssetEditScope(doc)
	asset = editScope.Start(mat.AppearanceAssetId)
	if asset != None:
		aProp = asset.FindByName(Generic.GenericDiffuse)
		if aProp != None:
			if aProp.NumberOfConnectedProperties>0:
				cAsset = aProp.GetConnectedProperty(0)
				path = cAsset.FindByName(UnifiedBitmap.UnifiedbitmapBitmap)
			pathName = ""
			#CP3 doesn't have str.Contains as a method
			if '|' in path.Value:
				paths = path.Value.Split('|')
				pathName = paths[paths.Length-1]
			else:
				pathName = path.Value
			
			newPath = Path.Combine(SearchPath[0],Path.GetFileName(pathName))
			if File.Exists(newPath):
				if path.IsValidValue(newPath):
					path.Value = newPath
					editScope.Commit(False)
					#May need to adjust to .Add for IP2
					PathsChanged.append(newPath)
			continue
TransactionManager.Instance.TransactionTaskDone()

OUT = PathsChanged

If the material has a specific type of material asset like “Metal” or “Wood” it will not affect those.
image

Change Material Paths.dyn (23.7 KB)

5 Likes