不使用Forge,已知文件名、文件夹及项目ID如何获取Revit云文件ModelPath?
关于Revit云模型同名冲突后获取现有ModelPath的解决方案
核心结论
不依赖Forge API的情况下,无法通过Revit原生API直接获取目标文件夹下同名云模型的GUID。Revit核心API仅围绕当前打开的文档提供操作能力,未内置枚举云项目文件夹内容或根据名称查询云模型标识的接口。
可行替代方案
- 解析异常消息(不推荐生产环境):
RevitServerModelAlreadyExistsException的Message属性可能包含现有模型的GUID信息,但该消息受本地化影响,格式无统一标准,硬编码解析存在兼容性风险。 - 尝试非官方隐藏API(风险高):部分版本的Revit存在未公开的云项目枚举接口,但这类接口不受Autodesk官方支持,可能随Revit版本更新失效,不建议用于正式项目。
- 使用Forge Data Management API(官方推荐):虽然你希望避免,但这是唯一可靠的官方方案——调用Forge接口查询指定云文件夹下的文件列表,根据模型名称匹配获取GUID,再通过
ModelPathUtils.ConvertCloudGUIDsToCloudPath生成ModelPath。
解析异常消息的示例代码(仅作演示)
public static ModelPath SaveAsCloud(Document currentDocument, string modelName, string folderId) { Guid account = new Guid(accountId); Guid project = new Guid(projectId); try { currentDocument.SaveAsCloudModel(account, project, folderId, modelName); currentDocument.EnableCloudWorksharing(); return currentDocument.GetCloudModelPath(); } catch (RevitServerModelAlreadyExistsException ex) { // 尝试从异常消息中提取模型GUID(示例逻辑,需根据实际消息格式调整) Guid modelGuid = Guid.Empty; string msg = ex.Message; // 假设消息包含形如"Model ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"的片段 int idStart = msg.IndexOf("Model ID: ") + 9; if (idStart > 8 && idStart + 36 <= msg.Length) { string guidStr = msg.Substring(idStart, 36); if (Guid.TryParse(guidStr, out modelGuid)) { return ModelPathUtils.ConvertCloudGUIDsToCloudPath(ModelPathUtils.CloudRegionUS, project, modelGuid); } } // 解析失败时抛出异常或返回null throw new InvalidOperationException("无法提取现有云模型的GUID", ex); } }
内容的提问来源于stack exchange,提问作者Julio Polo
相关产品推荐
相关产品推荐

