Bringing Order to Chaos: Automating Revit to 3ds Max Workflow Like a Pro
Starting and running a high-end architectural visualization studio isn’t just about producing jaw-dropping renders—it’s about building systems that work smarter, not harder. After all, if you've ever had to manually replace low-res textures in 3ds Max for the hundredth time, you know how draining it can be.
We faced the same challenges at Diorama.Studio. The constant need to extract material data from Revit, replace textures in 3ds Max, and keep everything organized across platforms was not only time-consuming but also chaotic. We knew there had to be a way to automate these repetitive tasks, and that’s when we set out to build a streamlined, fully automated workflow.
Today, we’re diving into the system we created to automate the process of transferring material data from Revit to 3ds Max and applying high-quality PBR textures. Here’s how we did it.
🔥 The Final Automated Workflow
Before we dive into the step-by-step breakdown, here’s a high-level overview of how everything works:
Extract material data from Revit using Dynamo.
Store the data on Synology NAS in a JSON format.
Trigger an automated workflow using n8n to process the data in 3ds Max.
Automatically replace low-res textures with high-quality PBR textures.
By the end of this, we’ll have a fully automated pipeline that saves us hours of manual labor and ensures consistency across all our renders. Let’s break it down.
1️⃣ Select Walls (Categories Node)
We start by selecting the Walls category in Revit. This allows us to isolate all the wall elements in the model that we’re interested in. Using Dynamo’s Categories node, we can easily target and extract the specific category we want, in this case, Walls.
2️⃣ Retrieve Elements (All Elements of Category)
Once the walls are selected, we use the All Elements of Category node to retrieve all the elements that belong to the wall category. This node collects all wall objects within the Revit model, giving us access to their material properties.
3️⃣ Get Materials (Element.GetMaterials)
After retrieving the elements, the next step is to gather all the materials applied to these walls. Using the Element.GetMaterials node, Dynamo extracts the material data linked to each of the selected elements. These materials will contain the information we need to generate texture paths and colors later on.
4️⃣ Flatten List (To Remove Sublists)
When working with Dynamo, the material data might come in a nested format (lists within lists). To make the data more manageable, we use the Flatten List function. This flattens the data structure so that we have a single list of materials, without any nested sublists. This step is crucial for ensuring that the following operations don’t get confused by nested structures.
5️⃣ Remove Duplicates (List.UniqueItems)
Since some materials may be applied to multiple wall elements, it’s common to end up with duplicate material entries. To clean this up, we use the List.UniqueItems node to remove any duplicate materials from the list. This ensures that we only process each material once, reducing unnecessary steps later in the process.
6️⃣ Extract Material Name (Material.Name)
Now that we have a clean, unique list of materials, we extract the Material.Name for each material. This will help us identify and track each material in the automation pipeline and make sure that we’re applying the correct textures later on.
7️⃣ Extract Appearance Asset (Material.AppearanceAssetElement)
The Material.AppearanceAssetElement node allows us to extract the appearance data for each material. This data includes the material’s appearance properties, such as how light interacts with the surface (i.e., shininess, roughness, etc.), which is crucial for ensuring that the materials appear correctly in 3ds Max.
8️⃣ Get Texture Paths (Python or Dynamo)
At this stage, we need to get the texture paths for each material. Using either a Python script or additional Dynamo nodes, we extract the file paths to the textures associated with each material in Revit. These paths are critical for the next step, where we’ll use them to locate and replace textures in 3ds Max.
9️⃣ Extract Material Colors (Material.Color)
In addition to texture paths, we may also need to extract color data for each material. The Material.Color node in Dynamo helps us pull the RGB values for each material’s color, ensuring that we don’t miss any color information that might be crucial to the final render.
🔟 Format JSON and Store It
Now that we have all the necessary material data—names, texture paths, colors, and appearance assets—we format this information into a structured JSON format. This makes it easy to store and process later on. We save this JSON file to a Synology NAS, which acts as a central repository for all our material data.
🚀 Next Steps in the Automation Pipeline
Now that the material data is extracted and stored, we need to automate the next steps. Here’s where the real power of automation comes into play.
✅ Save JSON on Synology NAS
The first thing we do is save the formatted JSON file containing all the material data to our Synology NAS. This centralized storage ensures that all the data is easily accessible for the next steps in the process.
✅ Trigger Automation with n8n
Once the JSON file is saved on the NAS, we set up an automation trigger using n8n. n8n listens for the new JSON file and begins its workflow. Here’s what happens in the n8n automation:
Send Notifications: We use n8n to send notifications (e.g., via Slack) whenever a new JSON file is processed.
Log Versions: n8n also logs the version of each material and updates it in Notion, so we always know the status of our materials.
Sync Data with Notion: We keep track of each material’s metadata, such as version numbers and any changes made, to maintain perfect version control.
✅ Use JSON in 3ds Max to Replace Textures Automatically
Finally, n8n triggers an automated 3ds Max script using MAXScript. This script reads the material data from the JSON file and replaces low-res textures with high-quality PBR textures. The whole process is fully automated, allowing us to seamlessly update materials in 3ds Max without lifting a finger.
Why Automation Matters
Automation isn’t just about saving time—it’s about unlocking creativity. By eliminating repetitive manual tasks, we can focus on what really matters: creating stunning, high-quality renders that showcase our architectural designs at their best.
By automating the workflow between Revit and 3ds Max, we’ve not only saved countless hours but also streamlined our entire process. This allows us to focus more on the artistic side of things and less on the logistical grind.
💡 What’s Next?
We’re just getting started. Future improvements on the horizon include:
AI-powered material mapping, which will automatically identify the best textures for each material.
Live dashboards to monitor the real-time status of material changes and automation processes.
Cloud rendering integration, so we can process materials at scale in the cloud.
If you’re in the architectural visualization space, we’d love to hear about your workflow! What’s your biggest bottleneck? How are you automating your process? Let’s connect and share ideas. 👇
#ArchViz #Automation #RevitTo3dsMax #DioramaStudio #Dialogos #3DRendering #PBRTextures