地点和位置

每个建筑物在世界上都有一个独特的位置,因为纬度和经度是独一无二的。此外,一个建筑物相对于其他建筑物可以有许多位置。Revit Platform API Site命名空间使用某些类来保存Revit项目的地理位置信息。

注意:Revit Platform API不显示“场地”菜单功能。只有“site”命名空间提供与“管理”选项卡上的“项目位置”面板上的“位置”选项对应的功能。

本节中的页面

  • Place 地点
  • City 城市
  • ProjectLocation 项目地点
  • Project Position 项目位置

地点

在Revit Platform API中,SiteLocation类包含纬度、经度和时区等位置信息。该信息确定项目在世界上的位置。设置纬度或经度时,请注意:

  1. Revit将尝试将坐标与它所知道的城市进行匹配,如果找到匹配,将相应地设置名称。
  2. Revit将尝试自动调整时区值,以匹配使用SunAndShadowSettings.CalculateTimeZone()设置的新经度或纬度值。对于某些边界情况,计算的时区可能不正确,如果需要,可以直接设置TimeZone属性。

img

城市

城市是包含世界上已知城市的地理位置信息的对象。它包含经度、纬度和时区信息。城市列表由Application对象中的Cities属性检索。无法将新城市添加到Revit中的现有列表中。Revit Platform API不会显示当前项目所在的城市。

项目地点

一个项目只有一个场地,那就是在地球上的绝对位置。但是,它可以相对于周围的项目具有不同的位置。根据所使用的坐标和原点,一个项目中可以有多个ProjectLocation对象。

默认情况下,每个Revit项目至少包含一个命名位置Internal。它是活动项目位置。可以使用Document.ActiveProjectLocation属性检索它。使用Document.ProjectLocations属性检索所有现有的ProjectLocation对象。

项目位置

项目位置是表示地理偏移和旋转的对象。它通常由ProjectLocation对象用来获取和设置地理信息。下图显示了更改ProjectLocation地理旋转和同一点的坐标后的结果。但是,您无法看到直接更改ProjectLocation地理偏移的结果。

img

图125:点坐标

注意:东表示位置逆时针旋转;西表示位置顺时针旋转。如果“角度”值介于180度和360度之间,则Revit会自动对其进行变换。例如,如果选择“东”并键入200度作为“角度”,则Revit会将其转换为“西160度”。

img

图126:地理偏移和旋转示意图

下面的示例代码说明如何检索ProjectLocation对象。

代码区域21-1:检索ProjectLocation对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public void ShowActiveProjectLocationUsage(Autodesk.Revit.DB.Document document)
{
// Get the project location handle
ProjectLocation projectLocation = document.ActiveProjectLocation;

// Show the information of current project location
XYZ origin = new XYZ(0, 0, 0);
ProjectPosition position = projectLocation.GetProjectPosition(origin);
if (null == position)
{
throw new Exception("No project position in origin point.");
}

// Format the prompt string to show the message.
String prompt = "Current project location information:\n";
prompt += "\n\t" + "Origin point position:";
prompt += "\n\t\t" + "Angle: " + position.Angle;
prompt += "\n\t\t" + "East to West offset: " + position.EastWest;
prompt += "\n\t\t" + "Elevation: " + position.Elevation;
prompt += "\n\t\t" + "North to South offset: " + position.NorthSouth;

// Angles are in radians when coming from Revit API, so we
// convert to degrees for display
const double angleRatio = Math.PI / 180; // angle conversion factor

SiteLocation site = projectLocation.GetSiteLocation();
string degreeSymbol = ((char)176).ToString();
prompt += "\n\t" + "Site location:";
prompt += "\n\t\t" + "Latitude: " + site.Latitude / angleRatio + degreeSymbol;
prompt += "\n\t\t" + "Longitude: " + site.Longitude / angleRatio + degreeSymbol;
prompt += "\n\t\t" + "TimeZone: " + site.TimeZone;

TaskDialog.Show("Revit", prompt);
}

注意:一次只有一个活动项目位置。若要查看更改ProjectLocation地理偏移和旋转后的结果,请在平面视图“特性”窗格中将“方向”特性从“项目北”更改为“正北”

图128:项目从项目北向正北旋转30度

图129:项目位置信息

创建和删除项目位置

通过使用Duplicate()方法复制现有项目位置来创建新项目位置。下面的代码示例说明如何使用Duplicate()方法创建新的项目位置。

代码区域21-2:创建项目位置

1
2
3
4
5
6
7
8
9
10
11
12
13
public ProjectLocation DuplicateLocation(Autodesk.Revit.DB.Document document, string newName)
{
ProjectLocation currentLocation = document.ActiveProjectLocation;
ProjectLocationSet locations = document.ProjectLocations;
foreach (ProjectLocation projectLocation in locations)
{
if (projectLocation.Name == newName)
{
throw new Exception("The name is same as a project location's name, please change one.");
}
}
return currentLocation.Duplicate(newName);
}

下面的代码示例阐释如何从当前项目中删除现有项目位置。

代码区域21-3:删除项目位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public void DeleteLocation(Autodesk.Revit.DB.Document document)
{
ProjectLocation currentLocation = document.ActiveProjectLocation;
//There must be at least one project location in the project.
ProjectLocationSet locations = document.ProjectLocations;
if (1 == locations.Size)
{
return;
}

string name = "location";
if (name != currentLocation.Name)
{
foreach (ProjectLocation projectLocation in locations)
{
if (projectLocation.Name == name)
{
ICollection<Autodesk.Revit.DB.ElementId> elemSet = document.Delete(projectLocation.Id);
if (elemSet.Count > 0)
{
TaskDialog.Show("Revit","Project Location Deleted!");
}
}
}
}
}

注:以下规则适用于删除项目位置:

  • 无法删除活动项目位置,因为项目中必须至少有一个项目位置。
  • 如果ProjectLocationSet类实例为只读,则不能删除项目位置。

注:翻译自Revit API Developers Guide