【Revit二次开发】标高

标高

  • 标高
  • 参考代码

标高

标高和轴网相当于地球的经度和纬度,在Revit里面起到“定海神针”的作用,整个建筑都是基于它们建立起来的,大多数元素都是基于标高来定位。

标高是有限的水平平面,作为“标高托管”图元(如墙、屋顶、楼板和天花板)的参照。在Revit平台API中, 对应的类是Level,它继承自Element 类。。继承的Name属性用于检索Revit用户界面中的标高符号旁的用户可见的标高名称。要检索项目中所有的标高,使用ElementIterator迭代器来搜索Level对象。

在Revit二次开发中,标高是一个重要的概念,用于定义Revit模型中的高程。可以使用Revit API中提供的类来创建、修改和删除标高。

标高(Level):在Revit中,标高是一个定义高程的对象,用于控制Revit模型中的高度信息。您可以使用Level类来表示一个标高,如下所示:

Level level = Level.Create(doc, 100); // 创建高程为100的标高

其中,doc是当前文档对象,100是标高的高程值。

标高的属性:标高有许多属性,例如名称、高程、偏移等。可以使用Level类的属性来获取或设置标高的属性值。例如,可以使用Level.Name属性来获取或设置标高的名称,使用Level.Elevation属性来获取或设置标高的高程。

将标高添加到文档中:创建标高后,需要将它们添加到文档中。可以使用Document类的方法来添加标高或其他几何元素。例如,可以使用doc.Create.NewLevel方法将标高添加到文档中。

需要注意的是,标高是Revit模型中一个重要的概念,它与Revit中的其他几何元素(如墙、柱等)密切相关。在创建Revit构件时,应该考虑它们所在的标高,并根据需要进行标高的创建和修改。同时,应该注意标高的命名和统一,以便于管理和维护Revit模型。

1)标高的高度( Elevation and ProjectElevation)通过Level. Elevation属性(对应的BuiltInParameter是LEVEL_ ELEV)可以获取标高的高度,它代表的是该标高相对于“基面(Elevation Base)”的高度,基面可以是“项目基点”,也可以是“测量点”,在Revit界面上,用户可以通过标高对应的标高的类型(LevelType)属性来确定基面。
注意:该操作将修改所有这一类型的标高的基面

而Level. ProjectElevation属性代表标高相对于项目基点的高度,等同于当基面是项目基点时Level. Elevation的值

2)创建标高
在Revit界面上,用户可以在立面视图或者剖面视图上来创建标高。API中,用户可以使用NewLevel方法来创建: Level Document. Create. NewLevel( double elevation)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;

namespace ElementBasicDemo
{

    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class CreateLevelCmd : IExternalCommand
    {
        ExternalCommandData revit;
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            try
            {
                revit = commandData;
                string levelName = "元素基础标高";
                double levelElevation = 2000.0; // 标高高度:mm



                if (!CheckUtil.IsLegalName(levelName))
                {
                    TaskDialog.Show("Revit", "名称不得包含以下字符:\r\n\\ "
                                                      + ": { } [ ] | ; < > ? ` ~ \r\n和其他任何不可打印的字符.");
                    return Result.Cancelled;
                }

                using (Transaction transaction = new Transaction(revit.Application.ActiveUIDocument.Document))
                {
                    if (transaction.Start("标高") == TransactionStatus.Started)
                    {
                        try
                        {
                            CreateLevel(levelName, levelElevation);

                            if (TransactionStatus.Committed != transaction.Commit())
                            {
                                TaskDialog.Show("失败", "标高创建失败");
                            }
                            else
                            {
                                TaskDialog.Show("成功", "标高创建成功");
                            }
                        }
                        catch (Exception exception)
                        {
                            transaction.RollBack();
                            TaskDialog.Show("失败", exception.Message);
                        }
                    }
                }

                return Autodesk.Revit.UI.Result.Succeeded;
            }
            catch (Exception ex)
            {
                message = ex.Message;
                return Autodesk.Revit.UI.Result.Failed;
            }
        }

        /// 
        /// 创建标高,并将标高的高度赋值给关联的参数
        /// 
        /// 标高名称
        /// 标高的高度
        public void CreateLevel(String levelName, double levelElevation)
        {
            //创建标高
            Level newLevel = Level.Create(revit.Application.ActiveUIDocument.Document, levelElevation);
            //将标高的高度赋值给关联的参数
            Parameter elevationPara = newLevel.get_Parameter(BuiltInParameter.LEVEL_ELEV);
            elevationPara.SetValueString(levelElevation.ToString());
            //为标高命名
            newLevel.Name = levelName;
        }

        /// 
        /// 删除标高
        /// 
        /// 标高的Id值
        public void DeleteLevel(int levelInteger)
        {
            Autodesk.Revit.DB.ElementId levelId = new ElementId(levelInteger);
            revit.Application.ActiveUIDocument.Document.Delete(levelId);
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

//对名称进行合法性检测
namespace ElementBasicDemo
{
    public static class CheckUtil
    {
        public static bool IsLegalName(string newName)
        {
            char[] newNameArray = new char[newName.Length];
            newNameArray = newName.ToCharArray();
            for (int i = 0; i < newName.Length; ++i)
            {
                if ('\\' == newNameArray[i] || ':' == newNameArray[i] || '{' == newNameArray[i] ||
                    '}' == newNameArray[i] || '[' == newNameArray[i] || ']' == newNameArray[i] ||
                    '|' == newNameArray[i] || ';' == newNameArray[i] || '<' == newNameArray[i] ||
                    '>' == newNameArray[i] || '?' == newNameArray[i] || '`' == newNameArray[i] ||
                    '~' == newNameArray[i])
                {

                    return false;
                }
            }
            return true;
        }
    }
}

创建标高的API为Level.Create静态方法,参数Document为数据库级别的文档对象,elevation为标高的标高,方法返回值为标高Level类型的对象。
示例程序中,还将标高进行了命名:“newLevel.Name = levelName”。插件运行后可在视图和属性的名称栏中看到标高的名称;同时,还将标高的高度信息赋值给了“Level_ELEV”内置参数,选中标高后,打开RevitLookupSnoop CurrentSelection, 点击右侧Element下Parameter的值一栏,在弹出窗口中单击左下角的任意按钮,可在弹出界面中找到Level_ELEV查看参数的内容。

注意:使用API创建标高之后,Revit@不会自动创建对应的视图,这点有别于Revit@界面,如果想要创建对应的视图,可以使用ViewPlan. Create 函数: ViewPlan. Create( document,viewFamilyTypeld, levelld ),其中viewFamilyTypeld 代表一个ViewFamilyType的ID。

参考代码

//============代码片段4-1 修改标高的基面============
LevelType levelType = RevitDoc.GetElement(level.GetTypeId()) as LevelType;
Parameter relativeBaseType = levelType.get_Parameter(BuiltInParameter.LEVEL_RELATIVE_BASE_TYPE);
relativeBaseType.Set(1); //项目基点 = 0, 测量点 = 1

//============代码片段4-2 创建标高============
using (Transaction transaction = new Transaction(RevitDoc))
{
   transaction.Start("Create Level");
   Level level = RevitDoc.Create.NewLevel(10.0);
   transaction.Commit();
}

//============代码片段4-3 创建标高对应的视图============
Level level; //已知的标高
//过滤出所有的ViewFamilyType
var classFilter = new ElementClassFilter(typeof(ViewFamilyType));
FilteredElementCollector filteredElements = new FilteredElementCollector(RevitDoc);
filteredElements = filteredElements.WherePasses(classFilter);
foreach (ViewFamilyType viewFamilyType in filteredElements)
{
   //找到ViewFamily类型是FloorPlan或者CeilingPlan的ViewFamilyType
   if (viewFamilyType.ViewFamily == ViewFamily.FloorPlan ||
      viewFamilyType.ViewFamily == ViewFamily.CeilingPlan)
   {
      transaction.Start("Create view of type " + viewFamilyType.ViewFamily);
      //创建视图
      ViewPlan view = ViewPlan.Create(RevitDoc, viewFamilyType.Id, level.Id);
      transaction.Commit();
   }
}

你可能感兴趣的:(revit二次开发,c#,Revit二次开发,BIM二次开发)