Revit SDK:Selections 选择

news2025/1/13 13:55:58

前言

Revit 作为一款成熟的商业软件,它将自己的UI选择功能也通过 API 暴露出来。通过 API 可以按照特定的过滤规则来选择相应的元素,能力和UI基本上是等价的。这个 SDK 用四个例子展示了 API 的能力,内容如下。

内容

在这里插入图片描述

PickforDeletion

核心逻辑:

  1. 通过 m_document.Selection.PickObjects(ObjectType.Element) 选择若干个元素
  2. 通过 m_document.Document.Delete(elemDeleteList) 删除元素

核心代码:

// 保存需要删除的元素
List<ElementId> elemDeleteList = new List<ElementId>();
// 通过PickObjects选择多个元素
IList<Reference> eRefList = m_document.Selection.PickObjects(ObjectType.Element, "Please pick some element to delete. ESC for Cancel.");
// 将选中的元素加入选择集
foreach (Reference eRef in eRefList){
   if (eRef != null && eRef.ElementId != ElementId.InvalidElementId){
      elemDeleteList.Add(eRef.ElementId);
   }
}
// 删除选择集中的元素
m_document.Document.Delete(elemDeleteList);

PlaceAtPointOnWallFace

核心逻辑:

  1. 通过 m_document.Selection.PickObject(ObjectType.PointOnElement) 选择一个点
  2. 放置窗户:m_document.Document.Create.NewFamilyInstance

核心代码:

// 选择墙上的一个点
Reference pickedRefer = m_document.Selection.PickObject(ObjectType.PointOnElement, new WallFaceFilter(m_document.Document), "Please pick a point on Wall face.");
// 找到对应的窗户类型
string symbolName = "36\" x 48\"";
FilteredElementCollector elemCollector = new FilteredElementCollector(m_document.Document);
elemCollector.WhereElementIsElementType();
var query = from element in elemCollector where element.Name == symbolName select element;
Element elemType = query.Single<Element>();
FamilySymbol windowType = elemType as FamilySymbol;
// 放置窗户
m_document.Document.Create.NewFamilyInstance(pickedRefer .GlobalPoint, windowType, m_document.Document.GetElement(pickedRefer ), StructuralType.NonStructural);

PlaceAtPickedFaceWorkplane

核心逻辑:

  1. 选择一个面,m_document.Selection.PickObject(ObjectType.Face)
  2. 提取面,创建工作平面:SketchPlane plane = SketchPlane.Create(m_document.Document, geometryPlane);
  3. 设置新的工作平面:m_document.Document.ActiveView.SketchPlane = faceSketchPlane;m_document.Document.ActiveView.ShowActiveWorkPlane();
  4. 选择工作平面上的一个点:m_document.Selection.PickPoint
  5. 创建模型线:Curve circle = Arc.Create(point, 5, 0, Math.PI * 2, faceSketchPlane.GetPlane().XVec, faceSketchPlane.GetPlane().YVec);m_CreationBase.NewModelCurve(circle, faceSketchPlane);

核心代码:

// 选择一个面
Reference faceRef = m_document.Selection.PickObject(ObjectType.Face, new PlanarFaceFilter(m_document.Document), "Please pick a planar face to set the work plane. ESC for cancel.");
// 通过面的索引获取面的几何
GeometryObject geoObject = m_document.Document.GetElement(faceRef).GetGeometryObjectFromReference(faceRef);
PlanarFace planarFace = geoObject as PlanarFace;
// 创建一个工作平面
Plane geometryPlane = Plane.CreateByNormalAndOrigin(planarFace.FaceNormal, planarFace.Origin);
SketchPlane faceSketchPlane = SketchPlane.Create(m_document.Document, geometryPlane);
// 将新建的工作平面设置为当前视图的活动工作平面
m_document.Document.ActiveView.SketchPlane = faceSketchPlane;
m_document.Document.ActiveView.ShowActiveWorkPlane();
// 选择工作平面上的一个点
ObjectSnapTypes snapType = ObjectSnapTypes.Centers | ObjectSnapTypes.Endpoints | ObjectSnapTypes.Intersections | ObjectSnapTypes.Midpoints | ObjectSnapTypes.Nearest | ObjectSnapTypes.WorkPlaneGrid;
XYZ point = m_document.Selection.PickPoint(snapType, "Please pick a point to place component.");
// 以选中点为中心绘制一个圆
Curve circle = Arc.Create(point, 5, 0, Math.PI * 2, faceSketchPlane.GetPlane().XVec, faceSketchPlane.GetPlane().YVec);
m_CreationBase.NewModelCurve(circle, faceSketchPlane);

SelectionDialog

核心逻辑:

  1. 选择一个元素:m_document.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element
  2. 选择一个目标点:XYZ targetPoint = m_document.Selection.PickPoint("Please pick a point.")
  3. 移动元素到目标点:ElementTransformUtils.MoveElement(m_document.Document,elem.Id, vecToMove);

核心代码:

// 选择要移动的元素,记录初始位置
Reference eRef = m_document.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "Please pick an element.");
SelectedElement = m_document.Document.GetElement(eRef);
m_elemPickedPoint = eRef.GlobalPoint;
// 选择一个目标点
XYZ targetPoint = m_document.Selection.PickPoint("Please pick a point.);
// 移动元素到目标点
XYZ vecToMove = targetPoint - m_elemPickedPoint;
m_elemPickedPoint = targetPoint;
ElementTransformUtils.MoveElement(m_document.Document,elem.Id, vecToMove);

参考

创建族实例,参考博客:https://blog.csdn.net/weixin_44153630/article/details/104650998
ElementTransformUtils,参考博客:https://blog.csdn.net/weixin_44153630/article/details/103884784

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

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

相关文章

RabbitMQ快速上手及讲解

前言&#xff1a;在介绍RabbitMQ之前&#xff0c;我们先来看下面一个场景&#xff1a; 1.1.1.1 异步处理 场景说明&#xff1a; 用户注册后&#xff0c;需要发注册邮件和注册短信&#xff0c;传统的做法有两种 1.串行的方式 (1)串行方式&#xff1a;将注册信息写入数据库后&a…

数据是如何存储在内存中的?听我慢慢道来

数据的存储 1. 前言2. 数据类型2.1 整形家族2.2 浮点数家族2.3 构造类型&#xff08;自定义类型&#xff09;2.4 指针类型2.5 空类型&#xff08;无类型&#xff09; 3. 整数在内存中的存储4. 大小端5. 浮点数在内存中的存储 1. 前言 大家好&#xff0c;我是努力学习游泳的鱼。…

2023年高压快充行业研究报告

第一章 行业概况 1.1 行业定义 高压快充行业是指专注于为电动汽车、移动设备等提供高功率、高效率充电服务的行业。高压快充技术旨在通过采用更高的电压和更大的电流&#xff0c;缩短充电时间并提高充电效率。这种技术可以使电动汽车在短时间内充满电&#xff0c;从而提高其可…

JavaScript基础语法02——JS书写位置

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天继续学习JavaScript基础语法&#xff0c;JS的书写位置&#xff0c;俗话说&#xff1a;好记性不如烂笔头&#xff0c;边学边记&#xff0c;方便回顾。 1、行内JavaScript 代码写在标签内部 示例&#xff1a; <…

dubbo项目traceId链路传递(MDC方案及重复traceId处理)

1.traceId用途 主要用于项目dubbo接口调用链日志追踪使用&#xff0c;可以获取完整的链路日志&#xff0c;协助排查问题。 2.traceId传递及代码实现 本方案是基于 org.slf4j.MDC 进行实现&#xff0c;会出现线程池中线程复用导致traceId重复问题&#xff0c;后面会说解决方案。…

unity 发布apk,在应用内下载安装apk(用于更大大版本)

*注意事项&#xff1a; 1&#xff0c;andriod 7.0 和 android 8.0是安卓系统的分水岭&#xff0c;需要分开来去实现相关内容2&#xff0c;注意自己的包名&#xff0c;在设置一些共享文件的时候需要放自己的包名3,以下是直接用arr包放入unity中直接使用的&#xff0c;不需要导入…

QTday2(信号与槽机制——很重要!!!)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.信号与槽 class Widget : public QWidget {Q_OBJECT //信号与槽的元对象signals:void my_signal(); //自定义信号函数public slots:void my_slot(); //自定义的槽函数public:Widget(Q…

码云使用记录

码云使用记录 主要步骤 1、https://gitee.com 注册 2、下载Git 3、配置SSH 4、创建远程仓库 5、切到本地项目目录下将本地项目推到远程 前两步根据提示进行即可&#xff0c;下面从第三步开始讲解 3、配置SSH&#xff08;用于提交代码和更新代码&#xff09; https://gitee.…

IDEA全局统一设置Maven

原来每次打开新建的项目都需要经过 File-> Settings 重新配置maven&#xff0c;这样很不爽 然而经过 File-> New Projects Setup -> Settings for New Projects 后&#xff0c;再如上图配置后就全局设置好了

文件包含漏洞利用的几种方法

文章目录 安装环境启动环境漏洞花式利用蚁剑连接图片马读取敏感文件&#xff08;hosts&#xff09;读取该网站的php源码 代码审计 安装环境 安装phpstudy&#xff0c;下载MetInfo 5.0.4版本软件&#xff0c;复制到phpstudy目录下的www目录中。 打开phpstudy&#xff0c;访问浏…

Ubuntu系统下配置 Qt Creator 输入中文、配置软件源的服务器地址、修改Ubuntu系统时间

上篇介绍了Ubuntu系统下搭建QtCreator开发环境。我们可以发现安装好的QtCreator不能输入中文&#xff0c;也没有中文输入法供选择&#xff0c;这里需要进行设置。 文章目录 1. 配置软件源的服务器地址2. 先配置Ubuntu系统语言&#xff0c;设置为中文3. 安装Fcitx插件&#xff…

Android 下第一个fragment app 先Java 后Kotlin

看着视频学习的&#xff0c;Fragment&#xff1a;3.Fragment使用方法_哔哩哔哩_bilibili 在android studio 下新建一个工程&#xff0c;类型是 Empty View Activity&#xff0c;本身就有一个Activity。就有文件MainActivity.java 或者kt&#xff0c;还有一个layout 文件&#…

如何给小程序会员添加档案记录

​给小程序会员添加档案记录&#xff0c;可以帮助商家更好地管理会员信息和提供个性化的服务。下面就具体介绍怎么设置档案记录。 1. 找到指定的会员卡。在管理员后台->会员管理处&#xff0c;找到需要添加档案记录的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。…

unity 之 如何获取父物体与子物体

文章目录 获取父物体获取子物体 获取父物体 在Unity中&#xff0c;你可以使用Transform组件的属性来获取对象的父物体。以下是在C#脚本中如何获取父物体的示例代码&#xff1a; using UnityEngine;public class GetParentExample : MonoBehaviour {void Start(){// 获取当前物…

人生中的孤独

孤独是一种深刻而痛苦的情感状态&#xff0c;在这个喧嚣而充满人群的世界中&#xff0c;许多人都曾经或正在经历孤独的阶段。 孤独并不仅仅是身边缺乏他人的陪伴&#xff0c;更是一种内心的空虚和失落。 孤独的人生可能来源于各种原因。 有些人可能因为缺乏亲密的人际关系&…

基于STM32的空气质量检测LCD1602显示报警仿真设计(仿真+程序+讲解)

本设计 基于STM32的空气质量检测报警仿真设计(仿真程序讲解&#xff09; 1.主要功能2.仿真3. 程序4. 资料清单&下载链接 基于STM32的空气质量检测报警仿真设计(仿真程序讲解&#xff09; 仿真图proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设…

信息安全——密钥管理

根据近代密码学观点&#xff0c;密钥体制的安全应当只取决于密钥的安全&#xff0c;而不取决于对密码算法的保密。因此密钥管理是至关重要的。 从技术上讲&#xff0c;密钥管理包括密钥的产生、存储、分配、组织、使用、更换和销毁等一系列技术问题。每个密钥都有其生命周期&a…

医学影像软件 Sante DICOM Viewer Crack

医学影像软件 Sante DICOM Viewer Crack Sante DICOM Viewer是用于恢复&#xff0c;查看&#xff0c;存储&#xff0c;存档&#xff0c;管理和刻录医学图像的最佳软件之一。它是专业的DICOM显示器&#xff0c;转换器&#xff0c;PACS客户端&#xff0c;迷你PACS服务器&#xff…

【0831作业】QTday2 加载资源文件、信号与槽机制(非常重要)、界面跳转

一、思维导图 二、今日面试题 三、今日知识回顾 1 信号与槽的连接 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QDebug> #include<QPushButton> #include<QTextToSpeech>//文本转语音类 QT_BEGIN_NAMESPACE namespace Ui { c…

比较opencv,pillow,matplotlib,skimage读取图像的速度比较

上面这些库都被广泛用于图像处理和计算机视觉任务&#xff1b; 不同的图像读取库&#xff08;OpenCV&#xff0c;Pillow&#xff0c;matplotlib和skimage&#xff09;的读取速度&#xff0c;是怎么样的一个情况&#xff1f; 下面分别从读取速度&#xff0c;以及转换到RGB通道…