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

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));  // 生成IDapplication.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.mzph.cn/pingmian/36497.shtml

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

相关文章

具备生成自签名文档证书能力的印章管理软件_电子骑缝章软件

最新版的e-章宝具体生成自签名文档证书的能力,这种证书可用内部文档发布的签名,文档一旦用证书签名并发布,具有不可抵赖性,阅读者也能确认所发布的文档是否是发布者发布的(即中途有没有被他人恶意修改过)&a…

Qt样式表及相关案例

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

第9关:索引(2024数据库期末综合)

第9关:索引(注意看下面的温馨提示!!) 任务描述 湖南人口hnpeople数据表结构如图所示,各字段含义如下 cs(城市)、qx(区县)、rk(人口)、man(男)、woman(女)、child(儿童)、adult(成人)、old(老人)…

揭秘数据合并的秘密:一文掌握一对一、多对一、多对多合并技巧与实战!

使用pd.merge()合并 类似 MySQL 中表和表直接的合并merge与concat的区别在于,merge需要依据某一共同的行或列来进行合并使用pd.merge()合并时,会自动根据两者相同column名称的那一列,作为key来进行合并每一列元素的顺序不要求一致1. 一对一合并 df1 = pd.DataFrame({"…

必应bing搜索广告投放介绍,投放的广告形式和效果

必应Bing搜索广告以其独特的市场定位、高质量的用户群体和强大的全球覆盖能力,成为众多企业拓展业务、提升品牌影响力的重要渠道。作为微软旗下的一款搜索引擎,必应不仅在美国市场占据重要份额,其在全球范围内的影响力也不容小觑。对于寻求国…

前端开源项目Vuejs:让前端开发如虎添翼!

文章目录 引言一、Vue.js的优势二、Vue.js实战技巧三、Vue.js社区与资源结语 引言 在前端开发的世界里,Vue.js凭借其简洁、轻量且功能强大的特性,逐渐崭露头角,成为众多开发者心中的首选框架。 一、Vue.js的优势 Vuejs项目地址 Vue.js之…

Java web应用性能分析之【自定义prometheus监控指标】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 Java web应用性能分析之【java进程问题分析定位】-CSDN博客 Java web应用性能分析之【…

手写SpringMVC之调度器DispatcherServlet

DispatcherServlet:分发、调度 根据上一节,已经实现了将controller的方法添加到容器中,而DispatcherServlet的作用就是接收来自客户端的请求,然后通过URI的组合,来找到对应的RequestMapping注解的方法,调用…

LeetCode 剑指 Offer 40

// void help(int[] a,int l,int r,int k){ // if(k0) return; // if(r-l1 < k){ // for(int il;i<r;i){ // ans[cnt] a[i]; // } // return; // } // // 快排的基准值 // int base a[l]; // int i l, j r; // while(i<j){ // while(i<j &&…

极验行为式验证码适配HarmonyOS 鸿蒙SDK下载

现阶段&#xff0c;越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与&#xff0c;早在去年9月&#xff0c;极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率&#xff0c;方便大家…

Nature推荐的三种ChatGPT论文写作指令(含PDF下载)

1. 润色学术论文 ChatGPT学术润色指令&#xff1a; “I’m writing a paper on [topic]for a leading [discipline] academic journal. WhatItried to say in the following section is [specific point]. Please rephrase itfor clarity, coherence and conciseness, ensuri…

C# 异步编程详解(Task,async/await)

文章目录 1.什么是异步2.Task 产生背景3.Thread(线程) 和 Task(异步)的区别3.1 几个名词3.2 Thread 与 Task 的区别 4.Task API4.1 创建和启动任务4.2 Task 等待、延续和组合4.3 task.Result4.4 Task.Delay() 和 Thread.Sleep() 区别 5.CancellationToken 和 CancellationToken…

最年轻获奖者诞生!一文带你了解历届国家最高科学技术奖获奖人

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;4000字丨15分钟阅读 作为国家层面面向科学、技术领域的最高级别奖励&#xff0c;国家最高科学技术奖于 2000 年由国务院设立&#xff0c;每年评选…

解锁分布式云多集群统一监控的云上最佳实践

作者&#xff1a;在峰 引言 在当今数字化转型加速的时代&#xff0c;随着混合云、多云多集群环境等技术被众多企业广泛应用&#xff0c;分布式云架构已成为众多企业和组织推动业务创新、实现弹性扩展的首选&#xff0c;分布式云容器平台 ACK One&#xff08;Distributed Clou…

OpenGL3.3_C++_Windows(21)

抗锯齿 遇到模型边缘有锯齿&#xff1a;光栅器将顶点数据转化为片段的方式有关 抗锯齿&#xff1a;产生更平滑的边缘SSAA超采样抗锯齿&#xff1a;使用比正常分辨率更高的分辨率&#xff0c;来渲染场景&#xff0c;它也会带来很大的性能开销。 光栅器&#xff1a; 位于最终处…

vi编辑器的常用方法

一、背景描述 在我们连接操作Linux服务器的时候&#xff0c;需要对其配置文件等内容进行一些增删改的操作&#xff0c;一般情况下我们直接使用Linux系统自带vi编辑器进行相应的操作&#xff0c;熟悉vi的常用功能对于我们编辑一些较大的文件效率能够有所提升&#xff0c;使用起来…

全国公共汽车、出租车拥有情况及客运量、货运量数据

基本信息. 数据名称: 全国公共汽车、出租车拥有情况及客运量、货运量数据 数据格式: Shp、Excel 数据时间: 2020-2022年 数据几何类型: 面 数据坐标系: WGS84 数据来源&#xff1a;中国城市统计年鉴 数据可视化. 2022年全年公共汽车客运总量数据示意图 2022年公路客…

Python 基础:使用 unittest 模块进行代码测试

目录 一、测试函数2.1 通过案例2.2 不通过案例2.3 添加新测试 二、测试类2.1 单个测试案例2.2 多个测试案例 三、总结 遇到看不明白的地方&#xff0c;欢迎在评论中留言呐&#xff0c;一起讨论&#xff0c;一起进步&#xff01; 本文参考&#xff1a;《Python编程&#xff1a;…

第六十八:iview里的table,每行数据如果有满足条件的怎么更改颜色

当然了&#xff0c;肯定又是插槽&#xff0c;话不多说直接贴图 话不多说&#xff0c;直接贴代码 <Table :columns"columns" :data"data" border show-summary height"300" sum-text"汇总" v-else :summary-method"handleSumma…

YOLO目标检测综述(2024.6月最新!)

1 基本概念 目标检测&#xff08;Object Detection&#xff09;是计算机视觉领域的重要任务之一&#xff0c;旨在识别图像或视频中的特定目标并将其位置标记出来。与图像分类任务不同&#xff0c;目标检测要求不仅能够识别目标类别&#xff0c;还需要精确地定位目标的位置。由于…