前言
这个例子介绍如何在 Revit 中加入自己的资源。
内容
ExternalResourceDBServer
效果
在注释标记设定和链接RVT文件中增加外部资源。
关键逻辑
必须使用 IExternalDBApplication
,在 Revit 启动的时候就进行加载。
从下面的代码可知,关键点在于注册和增加 SampleExternalResourceDBServer
。
public ExternalDBApplicationResult OnStartup(ControlledApplication application)
{
// Get Revit's ExternalResourceService.
ExternalService externalResourceService = ExternalServiceRegistry.GetService(ExternalServices.BuiltInExternalServices.ExternalResourceService);
if (externalResourceService == null)
return ExternalDBApplicationResult.Failed;
// Create an instance of your IExternalResourceServer and register it with the ExternalResourceService.
IExternalResourceServer sampleServer = new SampleExternalResourceDBServer();
externalResourceService.AddServer(sampleServer);
return ExternalDBApplicationResult.Succeeded;
}
通过上述的操作,可以将用户的服务加入到 Revit 的系统中去。SampleExternalResourceDBServer
继承自 IExternalResourceServer
。
namespace Autodesk.Revit.DB
{
public interface IExternalResourceServer : ExternalService.IExternalServer
{
bool AreSameResources(IDictionary<string, string> reference1, IDictionary<string, string> reference2);
string GetIconPath();
string GetInSessionPath(ExternalResourceReference reference, string originalDisplayPath);
ResourceVersionStatus GetResourceVersionStatus(ExternalResourceReference reference);
string GetShortName();
void GetTypeSpecificServerOperations(ExternalResourceServerExtensions extensions);
bool IsResourceWellFormed(ExternalResourceReference extRef);
void LoadResource(Guid loadRequestId, ExternalResourceType resourceType, ExternalResourceReference desiredResource, ExternalResourceLoadContext loadContext, ExternalResourceLoadContent loadResults);
void SetupBrowserData(ExternalResourceBrowserData browseData);
bool SupportsExternalResourceType(ExternalResourceType type);
}
}
从接口名称可知,也可自行调试例子:
SetupBrowserData
- 用来在对话框展示内容,用户可以自己控制展示的内容LoadResource
- 把资源加载进来,理论上可以加载任何地方的资源,本地或者网络
内建支持的可用的扩展资源类型:
namespace Autodesk.Revit.DB
{
public static class ExternalResourceTypes
{
public static class BuiltInExternalResourceTypes
{
public static ExternalResourceType TopographyLink { get; }
public static ExternalResourceType RevitLink { get; }
public static ExternalResourceType PointCloud { get; }
public static ExternalResourceType KeynoteTable { get; }
public static ExternalResourceType Image { get; }
public static ExternalResourceType IFCLink { get; }
public static ExternalResourceType FabricationConfiguration { get; }
public static ExternalResourceType CADLink { get; }
public static ExternalResourceType AssemblyCodeTable { get; }
}
}
}
ExternalResourceUIServer
与上面类似,需要在 Revit 启动的时候加载,IExternalApplication
:
public Result OnStartup(UIControlledApplication application)
{
ExternalService externalResourceUIService = ExternalServiceRegistry.GetService(ExternalServices.BuiltInExternalServices.ExternalResourceUIService);
if (externalResourceUIService == null)
return Result.Failed;
// Create an instance of your IExternalResourceUIServer and register it with the ExternalResourceUIService.
IExternalResourceUIServer sampleUIServer = new SampleExternalResourceUIServer();
externalResourceUIService.AddServer(sampleUIServer);
return Result.Succeeded;
}
SampleExternalResourceUIServer
继承自 IExternalResourceUIServer
,这个接口在资源浏览和加载的时候给用户提供了 UI 操作的接口:
namespace Autodesk.Revit.UI
{
public interface IExternalResourceUIServer : DB.ExternalService.IExternalServer
{
Guid GetDBServerId();
void HandleBrowseResult(ExternalResourceUIBrowseResultType resultType, string browsingItemPath);
void HandleLoadResourceResults(Document document, IList<DB.ExternalResourceLoadData> loadData);
}
}