标高和轴网相当于地球的经度和纬度,在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();
}
}