0
点赞
收藏
分享

微信扫一扫

Revit二次开发学习笔记

天涯学馆 2022-03-14 阅读 107
学习c#

Revit二次开发学习笔记1

20220314:

  将Revit二次开发入门的基本概念、接口使用方法知识点进行整理:

  • 概念:
    UIApplicationApplicationUIDocumentDocument
  • 接口函数:
    IExternalCommand接口活动窗口ActiveView拉进显示要素ShowElements单选要素Selection.PickObject多选要素Selection.PickObjects获取点Selection.PickPoint

概念:

1、Revit 应用类:UIApplication 和 Application
   UIApplication:表示一个活动的Revit会话,提供了对UI定制、事件及活动文档的访问
   Application:表示一个Revit应用,提供对文档、选项及其他应用范围的数据的访问和设置
   理解:   
2、Revit文档类:UIDocument 和 Document
   UIDocument:包含根UI相关的文档信息和操作,例如:ActiveView 和 ShowElement
               Selection:用于选择Revit模型
               ShowElements:显示适当的元素
               视图管理:①ActiveView:返回或设置当前文档的活动视图②RefershActiveView:刷新当前文档的活动视图
   Document:对象:用于存储Revit的元素、管理视图和数据
             类:提供获取管理元素、文件管理等功能
   理解:UIDocument能getset Document只能get

接口函数:

  • IExternalCommand接口:
    固有格式,只有该结构能将我们的函数与Revit关联起来
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
	[Transaction(TransactionMode.Manual)]
    public class Class : IExternalCommand //Alt+Enter
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
       		//获取应用
            UIApplication uiApp = commandData.Application;
            Application App = uiApp.Application;
            //获取版本号,弹窗显示
            TaskDialog.Show("版本号",App.VersionName);
            //获取活动视图名及ID
            UIDocument uIDocument = uiApp.ActiveUIDocument;
            View view = uIDocument.ActiveView;
            TaskDialog.Show("视图名",view.Name + ":" + view.Id.IntegerValue.ToString());
            Document document = uIDocument.Document;
            return Result.Succeeded;
        }
    }
}
  • 活动窗口ActiveView:
    uIDocument获取活动文档和窗口,或者set活动视图
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
	[Transaction(TransactionMode.Manual)]
    public class Class : IExternalCommand //Alt+Enter
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
       		//获取应用
            UIApplication uiApp = commandData.Application;
            Application App = uiApp.Application;
			UIDocument uIDocument = uiApp.ActiveUIDocument;
			Document document = uIDocument.Document;
			获取要素
            ElementId id = new ElementId(13073);
            //直接对view修改无效
            //view = document.GetElement(id) as View;
            uIDocument.ActiveView = document.GetElement(id) as View;
            //查看活跃视图是否修改
            view = document.ActiveView;
            TaskDialog.Show("提示","修改后活跃视图:" + view.Name);
        }
    }
}
  • 拉进显示要素ShowElements:
    使用uIDocument.ShowElements方法将要素集拉进显示
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
	[Transaction(TransactionMode.Manual)]
    public class Class : IExternalCommand //Alt+Enter
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
       		//获取应用
            UIApplication uiApp = commandData.Application;
            Application App = uiApp.Application;
			UIDocument uIDocument = uiApp.ActiveUIDocument;
			Document document = uIDocument.Document;
            // 显示元素,会将选中的要素拉进显示
            //创建ElementId集合
            List<ElementId> list_id = new List<ElementId>();
            list_id.Add(new ElementId(201112));//使用要素id创建ElementId对象
            list_id.Add(new ElementId(201166));
            list_id.Add(new ElementId(201205));
            uIDocument.ShowElements(list_id);
        }
    }
}
  • 单选要素Selection.PickObject:
    使用uIDocument.Selection.PickObject()方法,获取选中要素的信息
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
	[Transaction(TransactionMode.Manual)]
    public class Class : IExternalCommand //Alt+Enter
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
       		//获取应用
            UIApplication uiApp = commandData.Application;
            Application App = uiApp.Application;
			UIDocument uIDocument = uiApp.ActiveUIDocument;
			Document document = uIDocument.Document;
            //选取一个元素【手动选中一个,会弹出对应信息】
            Reference reference = uIDocument.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
            //得到要素
            Element element =  document.GetElement(reference);
            //弹出属性
            TaskDialog.Show("选中元素ID",element.Id.IntegerValue.ToString() + ":" + element.Name);
        }
    }
}
  • 多选要素Selection.PickObjects:
    使用uIDocument.Selection.PickObjects()方法,实例化ISelectionFilter接口,实现多选并筛选要素。
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
	[Transaction(TransactionMode.Manual)]
    public class Class : IExternalCommand //Alt+Enter
    {
       public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
       {
       	   //获取应用
           UIApplication uiApp = commandData.Application;
           Application App = uiApp.Application;
		   UIDocument uIDocument = uiApp.ActiveUIDocument;
		   Document document = uIDocument.Document;
           //选择多个元素,并使用过滤器
           //需要调用实现了ISelectionFilter接口的DoorFilter类
           IList< Reference > list_Reference = uIDocument.Selection.PickObjects(Autodesk.Revit.UI.Selection.ObjectType.Element,new DoorFilter());
           StringBuilder stringBuilder = new StringBuilder(); 
           foreach (Reference item in list_Reference)
           {
              Element elem = document.GetElement(item);
              stringBuilder.AppendLine(elem.Name + ":" + elem.Id.IntegerValue.ToString());
           }
           TaskDialog.Show("多选对象",stringBuilder.ToString());
        }
    }
}

实现了ISelectionFilter接口的DoorFilter类:

using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Cls_RevitTest
{
    public class DoorFilter : ISelectionFilter
    {
        //一个个传入所有选中的elem
        //由于门窗都是FamilyInstance,需要加深筛选
        public bool AllowElement(Element elem)
        {
            if ((elem is FamilyInstance) && (elem.Category.Name == "门"))
            {
                return true;//选中
            }
            return false; //否则不选中

        }
        public bool AllowReference(Reference reference, XYZ position)
        {
            throw new NotImplementedException();
        }
    }
}
  • 获取点Selection.PickPoint:
    使用uIDocument.Selection.PickPoint()方法,获取点信息。
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.ApplicationServices;
namespace Cls_RevitTest
{
	[Transaction(TransactionMode.Manual)]
    public class Class : IExternalCommand //Alt+Enter
    {
       public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
       {
       	   //获取应用
           UIApplication uiApp = commandData.Application;
           Application App = uiApp.Application;
		   UIDocument uIDocument = uiApp.ActiveUIDocument;
		   Document document = uIDocument.Document;
           //使用点Selection,会显示点选点的三维坐标
            XYZ xyz = uIDocument.Selection.PickPoint();
            TaskDialog.Show("选取点",xyz+"");
            //弹窗显示结果(-28.876987593, 165.312076437, 0.000000000)
        }
    }
}
举报

相关推荐

0 条评论