I had shared an image of this graph online, but was asked to share it so here you go.
- Select a directory where you WANT the images to be paths. This can include a BIM 360 path via Desktop Connector.
- 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.
Any resulting paths are images that were replaced.
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.
Change Material Paths.dyn (23.7 KB)