14. Revit API: Selection(选择器)

前言

这篇写选择器,经过前面好些篇的讲解,总算把前置内容都写完了。
我们来回忆下都在哪里提到过…
算了,直接进入正文。


一、Selection 命名空间

选择器位于Autodesk.Revit.UI.Selection命名空间下,关系到交互嘛,所以在UI“子”空间下就理所当然了。
所以我们这篇,既是讲整个Selection命名空间下的成员,也会讲Revit选择器的运用。

先来看看都有些什么

Classes 类Interfaces 接口Enumerations 枚举
SelectionISelectionFilterObjectType
SelectableInViewFilterObjectSnapTypes
PickedBoxPickBoxStyle

这个过滤器,上篇已经讲了嗷,就是过滤指定视图的元素。

再瞧瞧,这个PickBox也讲过了嗷,看框选聚焦这篇,虽然是给的框选聚焦代码,但它真就只有那么点东西。没有构造函数,只能通过Selection的方法创建;属性就只有min、max这两个。

再看3枚举,

  1. PickBoxStyle指示怎么选,是接触就算,还是完全包裹才算。
  2. ObjectType指示在选择元素时,哪些能选,就类似可选择集过滤呗,但又不止,好像得放些图看看。
  3. ObjectSnapTypes指示在选择点时,点定位到哪里。比如是起点、终点还是中间啦,这样。

1.1. 选择枚举介绍

上图看效果。

1.1.1. PickBoxStyle(框选枚举)
PickBoxStyle 枚举说明示例
Crossing接触就选上14.pickbox1.png
Enclosing完全包围才选上14.pickbox2.png
Directional从左向右,是包围选择
从右向左,是接触选择
1.1.2. ObjectType(选元素枚举)
ObjectType 枚举说明示例
Nothing啥也不能选
Element啥都能选,返回元素
PointOnElement啥都能选,返回射线于模型的交点
Edge选边,有SolidEdge*才能选
Face选面,有Solid就能选
LinkedElement只有链入Revit的才能选
Subelement没发现和Element的区别

*:什么叫有Solid且有Edge才能选边?讲过了嗷,看这里《获取元素Solid和计算包围盒》。

1.1.3. ObjectSnapTypes(选点枚举)
ObjectSnapTypes 枚举说明示例
None啥也不能选
Endpoints只能选Edge/Curve的端点嗷14.pickpoint1.png
Points哪里都能点,空白处都能点,不知道点的啥东西,或许涉及到屏幕空间坐标转换,不确定。
Midpoints选边/线的中间点14.pickpoint2.png
Nearest选边/线上的最近点image.png
WorkPlaneGrid选工作面上的点。好像是面上的网格交点,搞不懂。image.png
Intersections射线交点呗
Centers(圆)弧的中心image.png
Perpendicular啥?
Tangents弧的切线?没选出来
Quadrants啥?

二、Selection 类

Selection类,不陌生吧,提了好多次了,直接获取

UIDocument uiDoc = commandData.Application.ActiveUIDocument;
Selection selection = uiDoc.Selection;

没啥属性,只有方法,那就直接看看吧。

方法说明
GetElementIdsSetElementIds获取/设置 选择集,就选中变蓝变透明的效果
PickBoxx2框个范围,啥效果木有。可用来范围聚焦。
PickElementsByRectanglex4框个范围,获取框到的元素。向左接触,向右包含。
PickObjectx4,
PickObjectsx4
点选模型。
即可点选,又可框选。
PickPointx4选个点

没了没了,大体上是没了.jpg

2.1. 选择器的问题

哦~又想起来问题了🙃。

多选时,元素不是按选择顺序返回的,而是按ElementId 排序 后返回的。

这破玩意儿真令人头疼,我用的2018版本,不清楚更高版本有没有改变。
这可怎么办呢,凉拌。
我也莫得办法。
要么循环单选。

哎,就写到循环单选这会儿,突然想到 似乎 可以借助AdWindows.dll来模拟多选完成按钮,以此跳出循环单选。用材质变化,来模拟选中状态。

等我有空研究研究AdWindows.dll再来看看嗷。


三、ISelectionFilter(自定义可选范围)

单纯的选择元素是很难满足需求的,我们更希望的是在有限的、可自定义的范围内,让用户进行选择。

基于这个目标,Revit提供了ISelectionFilter这个接口,开发者可以通过是实现该接口,来指定哪些元素可选,哪些又不可选。

这里结合上一篇的过滤器,写一个较为通用的可指定过滤器。

直接看代码吧。

不要在ISelectionFilter里进行额外(文档相关、复杂耗时等)操作

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
internal class SelectionCommand : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        UIDocument uiDoc = commandData.Application.ActiveUIDocument;
        Document doc = uiDoc.Document;
        Selection selection = uiDoc.Selection;

        // 过滤器,获取Wall
        FilteredElementCollector collector = new FilteredElementCollector(doc);
        List<ElementId> wallIds = collector.OfCategory(BuiltInCategory.OST_Walls).ToElementIds().ToList();

        // ESC
        try
        {
            MySelectionFilter filter = new MySelectionFilter(wallIds);
            Reference objRef = selection.PickObject(ObjectType.Element, filter, "Select an element");
            Element ele = doc.GetElement(objRef);
            TaskDialog.Show("point", ele.Name);
        }
        catch { }

        return Result.Succeeded;
    }
}

// 自定义选择过滤器
internal class MySelectionFilter : ISelectionFilter
{
    private List<ElementId> _eleIds;  // HashSet

    public MySelectionFilter(List<ElementId> eleIds)
    {
        this._eleIds = eleIds;
    }

    public bool AllowElement(Element elem)
    {
        if (this._eleIds.Contains(elem.Id)) { return true; }
        return false;
    }

    public bool AllowReference(Reference reference, XYZ position)
    {
        return true;
    }
}

14.Selection.gif


总结

得了得了,这篇到这里了,UI基本完了。
下一个,回到DB,那就看看事务(Transaction)吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Dns被莫名篡改的逆向分析定位(笔记)

引言&#xff1a;最近发现用户的多台机器上出现了Dns被莫名修改的问题&#xff0c;从系统事件上看并未能正常确定到是那个具体软件所为&#xff0c;现在的需求就是确定和定位哪个软件具体所为。 解决思路&#xff1a; 首先到IPv4设置页面对Dns进行设置&#xff1a;通过ProcExp…

【Axure高保真原型】中继器表格——移入显示详情卡片案例

今天和大家分享中继器表格——移入显示详情卡片的原型模板&#xff0c;鼠标移入员工号或姓名会弹出员工卡片&#xff0c;可以查看更详细的信息。这个表格是用中继器制作的&#xff0c;所以使用也很方便&#xff0c;只需要维护中继器表格里的信息&#xff0c;即可自动生成交互效…

实操Nginx+Tomcat多实例部署,实现负载均衡和动静分离

192.168.10.10 192.168.10.20 192.168.10.30 location ~ \.jsp$ {proxy_pass http://192.168.10.50:8080;} location ~ \.(jsp|html)$ {root /usr/share/nginx/html;}192.168.10.40和192.168.10.50用脚本完成搭建此处安装附上脚本&#xff1a; #!/bin/bash# 定义变量 JDK_PACKA…

生态系统NPP及碳源、碳汇模拟技术教程

原文链接&#xff1a;生态系统NPP及碳源、碳汇模拟技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608293&idx3&sn2604c5c4e061b4f15bb8aa81cf6dadd1&chksmfa826602cdf5ef145c4d170bed2e803cd71266626d6a6818c167e8af0da93557c1288da21a71&a…

nginx 搭理禅道

1.安装nginx。 2.安装禅道。 3.nginx 配置文件 location /zentao/ { proxy_pass http://192.168.100.66/zentao/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-F…

边界无限陈佩文:红蓝对抗安全演练常态化的各方分析

虽然常态化演练尚未正式开始&#xff0c;但我们仍然希望对各方的表现进行一些分析和预测&#xff0c;以辅助我们对市场的判断和决策。同时&#xff0c;也希望通过这些初步的见解&#xff0c;抛砖引玉&#xff0c;引发更多有价值的讨论和观点。 “船停在码头是最安全的&#xf…

【数据库】E-R图、E-R模型到关系模式的转换、关系代数表达式、范式

一、E-R图 1、基本概念 2、实体集之间的联系 3、E-R图要点 &#xff08;1&#xff09;实体&#xff08;型&#xff09;的表示 &#xff08;2&#xff09;E-R图属性的表示 &#xff08;3&#xff09;联系的表示 4、E-R模型的例题 二、E-R模型到关系模式的转换 1、实体型的转换…

pytorch-时间序列

目录 1. 时间序列2. word embedding2.1 one hot2.2 word2vec2.3 GloVe 1. 时间序列 具有时间相关性的序列叫做时间序列&#xff0c;比如&#xff1a;语音、文本句子 2. word embedding 2.1 one hot 针对句子来说&#xff0c;可以用[seq_len, vector_len] 有多少个单词vecto…

因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的 解决方法

目录 1. 问题所示2. 解决方法3. 解决方法1. 问题所示 输入共享文件地址的时候,出现如下信息: 因为文件共享不安全,所以你不能连接到文件共享。此共享需要过时的SMB1协议,而此协议是不安全的,可能会是你的系统遭受攻击。你的系统需要SMB2或更高版本截图如下所示: 2. 解决…

竞赛 深度学习+opencv+python实现车道线检测 - 自动驾驶

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV56 数据集处理7 模型训练8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &am…

【Linux】Linux常用指令合集精讲,一篇让你彻底掌握(万字真言)

文章目录 一、文件与目录操作1.1 ls - 列出目录内容1.2 cd - 切换目录1.3 pwd - 显示当前目录1.4 mkdir - 创建目录1.5 rmdir - 删除空目录1.6 rm - 删除文件或目录1.7 cp - 复制文件或目录1.8 mv - 移动或重命名文件或目录1.9 touch - 创建空文件或更新文件时间戳 二、文件内容…

朗新天霁eHR GetFunc_code.asmx SQL注入致RCE漏洞复现

0x01 产品简介 朗新天霁人力资源管理系统(LongShine eHR)是一款由北京朗新天霁软件技术有限公司研发的人力资源管理系统,该产品融合了国外先进的人力资源管理理念和国内大量人力资源管理实践经验,是国内功能较为全面、性价比较高的人力资源管理系统之一,系统凭借其集成化…

@amap/amap-jsapi-loader实现高德地图嵌入React项目中,并且做到点击地图任意一处,获得它的经纬度

1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7"2.加入项目中 关于接口获取key的接口 大家改成自己对应的项目请求方法 import React, { PureComponent } from react; import { Input…

厂家技术 最新钨蚀刻液的制作方法

网盘 https://pan.baidu.com/s/15ZAiUicstYEiFPvNKK72VA?pwd6u4x VCSEL芯片金薄膜蚀刻液及其蚀刻方法.pdf 废铝蚀刻液回收磷酸的方法.pdf 抑制二氧化硅蚀刻的无C蚀刻液.pdf 氮化硅和钨的选择性蚀刻液.pdf 用于在穿孔中选择性沉积钨的系统和方法.pdf 蚀刻液和使用了所述蚀刻液…

香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别

OrangePi AIpro 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;自发布以来就引起了我的极大关注。其配备的8/20TOPS澎湃算力&#xff0c;堪称目前开发板市场中的顶尖性能&#xff0c;实在令人垂涎三尺。如此强大的板子&#xff0c;当然要亲自体验一番。今天非常荣幸地拿到…

【C++】BMP图片结构深度解析及其在C++中的操作与应用

引言 BMP&#xff08;Bitmap Image File&#xff09;是一种与设备无关的图像文件格式&#xff0c;它采用了一种非常直接的方式来存储图像数据&#xff0c;即按照图像的行和列顺序&#xff0c;逐像素地存储颜色值。由于其简单性和可移植性&#xff0c;BMP文件在图像处理、图像分…

看看这组B端规范,你就会感叹:钱真是万能的。

B端设计规范的作用和价值主要体现在以下几个方面&#xff1a; 统一视觉风格和用户体验&#xff1a;B端设计规范可以规定统一的视觉风格和用户界面&#xff0c;使得不同的产品和服务在外观和交互上保持一致&#xff0c;提升用户的使用体验和满意度。 提高产品开发效率&#xf…

Android Studio下载Gradle特别慢,甚至超时,失败。。。解决方法

使用Android studio下载或更新gradle时超级慢怎么办&#xff1f; 切换服务器&#xff0c;立马解决。打开gradle配置文件 修改服务器路径 distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-7.3.3-bin.zip 最后&#xff0c;同步&#xff0c;下载&#xff0c;速…

【RAG检索增强生成】MaxKB:构建企业级知识库问答系统(Ollama+Qwen2)

目录 引言1、MaxKB概述1.1 定义与目标1.2 特点与优势 2、MaxKB原理3、MaxKB架构4、基于MaxKBOllamaQwen2搭建本地知识库4.1 环境准备4.2 部署MaxKB4.3 部署Ollama4.4 部署运行qwen24.5 知识库配置4.5.1登录 MaxKB 系统4.5.2上传文档4.5.3设置分段规则 4.6 模型配置4.7 创建应用…

一入“网贷”深似海:来自多名负债人的真实自述!

在温州&#xff0c;有个名叫小琴的25岁女孩&#xff0c;她的故事&#xff0c;是许多年轻人深陷网贷泥潭的一个缩影。小琴&#xff0c;一个普通的大学毕业生&#xff0c;两年的职场生涯并未能让她摆脱大学时期留下的网贷阴影。那时&#xff0c;她每月靠着1000元的生活费勉强维持…