2016-2018版:如何通过Revit API区分不同设备的Revit模型?
Great question—this is a common pain point when dealing with Revit files across local, server, and cloud environments, especially when working from shared templates. Let's break down reliable approaches using the Revit API that cover all your cases:
1. Persistent Custom GUID Parameter (Recommended)
This method ensures each file gets a unique, permanent identifier even when created from a template, copied, or saved as a new file. Here's how to implement it:
Step 1: Add an empty shared parameter to your template
Create a project-level shared parameter (e.g.,Model_Unique_GUID) of typeStringin your base template. Leave the value blank—don't set a GUID here (that's what caused duplicates before).Step 2: Automatically generate a GUID on first document load
Use an external application or a macro that runs when a document opens to check if theModel_Unique_GUIDparameter has a value. If not, generate a new unique GUID and assign it:public void AssignModelGuid(Document doc) { // Get the project info element (where project parameters are stored) ProjectInfo projectInfo = doc.ProjectInformation; // Check if our parameter exists Parameter guidParam = projectInfo.LookupParameter("Model_Unique_GUID"); if (guidParam != null && string.IsNullOrEmpty(guidParam.AsString())) { using (Transaction trans = new Transaction(doc, "Assign Model GUID")) { trans.Start(); // Generate and set a new GUID guidParam.Set(Guid.NewGuid().ToString()); trans.Commit(); } } }This way, every new file created from the template will get a unique GUID the first time it's opened. The value persists through saves, copies, and syncs to central/cloud models.
Step 3: Retrieve the GUID when needed
To get the unique identifier later, just fetch the parameter value from the project info element:public string GetModelGuid(Document doc) { ProjectInfo projectInfo = doc.ProjectInformation; Parameter guidParam = projectInfo.LookupParameter("Model_Unique_GUID"); return guidParam?.AsString() ?? string.Empty; }
2. Combine Document.UniqueId with File Metadata
If you don't want to add a custom parameter, you can use the built-in Document.UniqueId property along with file system metadata to cover edge cases:
Document.UniqueId: This property gives a unique ID for the document instance. It changes when you use "Save As" in Revit, but stays the same if you copy the file via Windows Explorer.- File Path + Last Modified Timestamp: Adding these helps distinguish copied files (since the path or modified time will differ even if the
UniqueIdis the same).
Example code to get this combined identifier:
public string GetCombinedModelId(Document doc) { string docId = doc.UniqueId; string filePath = doc.PathName; DateTime lastModified = File.GetLastWriteTime(filePath); return $"{docId}_{filePath.GetHashCode()}_{lastModified.Ticks}"; }
Note: This isn't as persistent as the custom GUID (e.g., moving the file changes the path hash), but it's useful if you can't modify templates or add parameters.
3. Central Model GUID Fallback
For BIM 360/Revit Server models, continue using document.GetWorksharingCentralModelPath().GetModelGUID() as your primary ID—this is the most reliable for cloud/server-hosted files. You can combine this with the custom GUID approach for a unified solution that works across all file types:
public string GetUniversalModelId(Document doc) { // Check if it's a central/cloud model first if (doc.IsWorkshared && doc.GetWorksharingCentralModelPath() != null) { return doc.GetWorksharingCentralModelPath().GetModelGUID().ToString(); } // Fallback to custom GUID for local/template files string customGuid = GetModelGuid(doc); if (!string.IsNullOrEmpty(customGuid)) { return customGuid; } // Last resort: combined ID return GetCombinedModelId(doc); }
All these methods work in Revit 2016-2018, and the custom GUID approach is the most robust for ensuring unique identification across all scenarios.
内容的提问来源于stack exchange,提问作者Jacob Scheib

