8. Revit API UI: DockablePane(可停靠窗口)

news2025/1/4 19:31:14

8. Revit API UI: DockablePane(可停靠窗口)

接着前面的预览控件和外部事件,这一篇,我们来看看可停靠窗口DockablePane的实现。

实现流程

可停靠窗口相关的类与接口主要有DockablePaneIDockablePageProvider,都是在UI命名空间下。

流程:

  1. 创建一个Page页,并实现IDockablePageProvider接口;
  2. 生成一个DockablePaneId,需要传入一个Guid,所以最好建立一个映射表;
  3. 在插件入口(即IExteranlApplication)中注册该窗口,使用UIControlledApplication.RegisterDockablePane(..)方法;
  4. 使用时,通过uiApp.GetDockablePane(dpId)方法检索到可停靠窗体,调用Show()显示窗体。

先实现,后面再讲讲我个人测试的遇到的问题。

在这里插入图片描述

示例

本例想接着用上一篇用到的预览窗体界面,但Revit启动时显然是没有View的,就算了。

  1. XAML:新建一个叫"DockablePage"的Page,里头随便放些东西。记得要实现IDockablePageProvider接口。

  2. IExternalApplication:在外部应用启动时注册。

[Transaction(TransactionMode.Manual)]
[Journaling(JournalingMode.NoCommandData)]
public class Application : IExternalApplication
{
    public Result OnStartup(UIControlledApplication application)
    {
        this.RegisterDockablePane(application);
        return Result.Succeeded;
    }

    public Result OnShutdown(UIControlledApplication application)
    {
        return Result.Succeeded;
    }
    
    private void RegisterDockablePane(UIControlledApplication application)
    {
        DockablePaneId dockablePaneId = new DockablePaneId(new Guid(Mapping.DockablePaneId));  // 生成ID
        application.RegisterDockablePane(dockablePaneId, "DockablePane", DockablePage.GetDockablePage());  // 进行注册
    }
}
  1. IExternalCommand:在外部命令中使用。
[Transaction(TransactionMode.Manual)]
[Journaling(JournalingMode.NoCommandData)]
internal class DockablePaneCommand : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        UIApplication uiApp = commandData.Application;
        
        DockablePaneId dockablePaneId = new DockablePaneId(new Guid(Mapping.DockablePaneId));  // 创建ID,根据ID查找
        //TaskDialog.Show("DockablePaneCommand", $"{DockablePane.PaneIsRegistered(dockablePaneId)}\r\n" + $"{DockablePane.PaneExists(dockablePaneId)}");
        DockablePane dockablePane = uiApp.GetDockablePane(dockablePaneId);

        dockablePane.Show();
        return Result.Succeeded;
    }
}

至此,一个完整的可停靠窗口的Demo就完成了。

记录问题

1. 必须在外部应用中注册吗

如果你了解Application相关API,就能够知道UIControlledApplicationUIApplication的大部分类成员都是一样的,效果一样。不了解没关系可以看这篇:5. Revit API: Application。

那么,就一定得在外部应用中注册?

是的,必须在外部应用中注册。

能不能在外部命令中,通过UIApplication注册呢?

答案是可以的,但是只能注册,无法显示。

DockablePane 类中有3个静态方法,通过传入DockablePaneId 进行检测。

方法描述
PaneIsBuiltIn(dpID)检测目标窗口是否为Revit内置窗口
PaneIsRegistered(dpID)检测目标窗口是否已注册
PaneExists(dpID)检测目标窗口是否已创建

通过这三个方法,可以得到结果:

注册位置内置已注册已创建
IExternalApplication
IExternalCommand

当在外部命令中注册,并调用Show()方法时,会报错。

在这里插入图片描述

2. 必须用Page吗

虽然API文档中写建议使用Page及其派生类。那我可偏要看看不用能咋样。

好吧,不用界面就黑了。

Window不行,PageUserControl都可以。Window是最高级别的UI元素,猜测非Window都可以。

下面是使用Window和UserControl的截图

在这里插入图片描述

3. 可停靠窗口中,可以放外部事件吗

可以

上面说了,最开始是想直接使用上一篇的界面,那上面就有ExternalEvent,我测试了那个删除按钮还是有效的。

4. 如何让可停靠窗口的内容变化

例子中创建了个表格,就是想从项目文档中获取信息,进行展示。就像Revit自带的那些窗口一样,内容可以变化,想想就很棒是不是,可惜不得行。

不知道,不会,没搞定😶

好吧,没搞定。

DockablePane类中,并没有获取窗体的方法或属性,于是尝试曲线修改。

  • 尝试让数据表绑定在一个静态变量上,可是数据变了没效果。

  • 尝试将页面设为单例,改了还是无效。

然后就没有然后了,怀疑注册时传进去的和Revit创建的就不是同一个东西。

5. 遇到的其它问题

遇到了一个"无法初始化附加模块xxx,因为“…/xx.dll”不存在"的问题。

显然这破问题的原因不在于那个dll不存在。

问题在哪儿呢?还是之前写Ribbon时偷懒了,直接用"xxx"代替了。

这里问题的原因是,Ribbon控件里,命令的路径错了

Ribbon那篇没有示例图片,这里补充一个吧。

private void CreateRibbon(UIControlledApplication application)
{
    string tabName = "Samples";
    string panelName = "Commands";
    RibbonPanel panel = application.CreatePanel(panelName, tabName);

    PushButtonData buttonData_single = new PushButtonData("单个按钮", "单个按钮", addInPath, "RevitAPISamples.Commands.Dialog")
    {
        LargeImage = new BitmapImage(new Uri(Path.Combine(this.buttonIconsFolder, "CreateWall.png"))),
        Image = new BitmapImage(new Uri(Path.Combine(this.buttonIconsFolder, "CreateWall.png"))),
        ToolTip = "按钮(单个)",
        LongDescription = "鼠标放按钮上,就会出现这段文字",
        ToolTipImage = new BitmapImage(new Uri(Path.Combine(this.buttonIconsFolder, "Revit.png"))),
    };
    ContextualHelp contextualHelp = new ContextualHelp(ContextualHelpType.Url, "https://thebuildingcoder.typepad.com/blog/2020/09/on-spaces-in-help-and-renaming-a-parameter.html");
    buttonData_single.SetContextualHelp(contextualHelp);
    panel.AddItem(buttonData_single);
}

在这里插入图片描述

总结

UI篇还有多少来着,不记得了,得去翻翻之前的图。

这篇就到这里了,下篇写什么呢,emm…。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1870149.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索Facebook的未来世界:数字社交的演进之路

在数字化和全球化的浪潮中,社交网络如Facebook已经成为了人们日常生活不可或缺的一部分。然而,随着技术的迅猛发展和用户需求的不断变化,Facebook正在经历着社交平台的演进之路。本文将探索Facebook的未来世界,分析数字社交的发展…

Android 13 为应用创建快捷方式

参考 developer.android.google.cn 创建快捷方式 来自官网的说明: 静态快捷方式 :最适合在用户与应用互动的整个生命周期内使用一致结构链接到内容的应用。由于大多数启动器一次仅显示四个快捷方式,因此静态快捷方式有助于以一致的方式执行…

ADC位数、增益调制与参考电压

位数:12bit、10bit、8bit 一般就是对应的ADC值分别为:4095、1023、255,也就选用对应位数时ADC的最大值。 增益的作用 增益设置用于放大或缩小输入信号,使其适配到ADC的输入范围。增益设置可以通过配置SAADC的通道配置寄存器来实…

第一后裔The First Descendant开服时间、配置要求一览

第一后裔是一款采用虚幻5引擎打造的第三人称合作射击动作RPG,玩家将化身为一名继承者,通过各种任务和故事不断成长,为守护人类与对抗侵略者战斗。该作即将上线,为了不让玩家们错过这款精彩的游戏,本文整理了第一后裔上…

[行业原型] Web端原型案例:康欣医疗后台管理系统

​医疗管理系统是一个业务复杂,功能庞大的系统,以下为HIS医院管理系统的常见模块,供大家参考。 本周为大家带来Web端原型案例:康欣医疗后台管理系统,先上原型: 完整文档加班主任微信号 添加班主任回复 “1…

推荐两款电脑文件处理工具,强大到你不舍得卸载

EasyFileCount EasyFileCount是一款基于Java开发的多功能文件管理工具,旨在帮助用户更轻松地管理和优化他们的文件存储。以下是EasyFileCount的主要功能和特点: 查看文件夹大小:用户可以快速统计和查看文件夹的总大小,实时显示各…

基于C++实现的EventLoop与事件驱动编程

一,概念介绍 事件驱动编程(Event-Driven)是一种编码范式,常被应用在图形用户界面,应用程序,服务器开发等场景。 采用事件驱动编程的代码中,通常要有事件循环,侦听事件,…

Qt样式表及相关案例

一.Qt样式表介绍 Qt样式表是一个可以自定义部件外观的强大机制,样式表的概念、术语、语法均受到HTML的层叠样式表(Cascading Style Sheets,CSS)的启发。 样式表可通过QApplication::setStyleSheet()函数将其设置到整个应用程序上,也可以使用QWidget::se…

突然!某大客户核心凌晨突然崩溃....

这几天实在太忙,刚弄完文档。业务线的同事就找到我,说一个银行客户的核心系统昨晚出了故障,还没找到原因,希望能帮忙分析下。 从提供的信息来看是业务跑任务报错,遇到了Oracle-00600和ora-07445 错误。 Doing block re…

使用Python实现深度学习模型通常涉及以下几个步骤

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中……) 4、牛逼哄哄的 IDEA编程利器技巧(编写中……) 5、面经吐血整理的 面试技…

2024年【焊工(初级)】实操考试视频及焊工(初级)考试试题

题库来源:安全生产模拟考试一点通公众号小程序 焊工(初级)实操考试视频根据新焊工(初级)考试大纲要求,安全生产模拟考试一点通将焊工(初级)模拟考试试题进行汇编,组成一…

Windows条件竞争提权漏洞复现(CVE-2024-300889)

漏洞原理 当内核将当前令牌对象的 _AUTHZBASEP_SECURITY_ATTRIBUTES_INFORMATION 复制到用户模式时,错误位于函数 AuthzBasepCopyoutInternalSecurityAttributes 内部,该模式的结构如下: //0x30 bytes (sizeof) struct _AUTHZBASEP_SECURIT…

有哪些方法可以恢复ios15不小心删除的照片?

ios15怎么恢复删除的照片?在手机相册里意外删除了重要的照片?别担心!本文将为你介绍如何在iOS 15系统中恢复已删除的照片。无需专业知识,只需要按照以下步骤操作,你就能轻松找回宝贵的回忆。 一、从iCloud云端恢复删除…

台式机通过网线直连笔记本,台式机通过笔记本上网【解决台式机没有网络的问题】

一、总览 将笔记本电脑和台式机使用网线连接起来。在笔记本电脑上打开网络和共享中心,进入“更改适配器设置”选项,找到当前连接的网卡,右键点击选择“属性”。在网卡属性中,找到“共享”选项卡,勾选“允许其他网络用…

怎么打印加密的Excel文件,有哪些方法?

很多小伙伴都喜欢使用Excel来创建或是编辑表格文档,因为Excel中的功能十分的丰富且强大,在Excel中我们可以对表格文档进行各种操作。有的小伙伴可能在打印时需要给每一页表格添加页码,但又不知道该在哪里找到相关操作,其实很简单&…

elasticsearch重置密码

0 案例背景 Elasticsearch三台集群环境,对外端口为6200,忘记elasticsearch密码,进行重置操作 注:若无特殊说明,三台服务器均需进行处理操作 1 停止es /rpa/bin/elasticsearch.sh stop 检查状态 ps -ef|grep elast…

武汉星起航:深度洞察消费趋势,亚马逊美国站选品独具匠心

亚马逊美国站作为全球电商巨头的重要分支,其选品特点不仅反映了美国市场的消费趋势,更引领着全球消费者的购物潮流。从运动户外、宠物用品到美容个人护理,亚马逊美国站的选品策略始终紧跟市场脉搏,为消费者提供丰富多样、品质优良…

深入浅出:npm常用命令详解与实战

theme: smartblue npm是什么 npm(Node Package Manager)是Node.js平台的默认包管理器,它让JavaScript开发者能够轻松地共享、管理和使用彼此编写的代码模块。npm不仅仅是一个安装工具,它还是一个全面的生态系统,用于发…

应用监控pinpoint调研

参考 https://blog.csdn.net/Rose_juvenile/article/details/135285508?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-135285508-blog-132330996.235^v43^pc_blog_bottom_relevance_base6&spm1001.2101.3001.4242.1&a…

2024年6月大众点评广州餐饮店铺POI分析20万家

2024年6月大众点评广州餐饮店铺POI共有199175家 店铺POI点位示例: 店铺id k9uiFADtAvs9EdPC 店铺名称 点都德(聚福楼店) 十分制服务评分 8.6 十分制环境评分 8.3 十分制划算评分 8.5 人均价格 77 评价数量 41673 店铺地址 惠福东路470号(富临食府对面) 大…