本例子最主要目的是带领大家实现一个读取ORD平曲线元素属性的例子。在例子中将会一步步实现交互式选取Alignment,遍历Alignment的几何元素,获取几何元素的属性并显示报表。
一、构建程序框架
3. 在ORD目录下的..\config\appl\文件夹中,创建Lesson3.cfg文件。
4. 新建派生于System.Windows.Forms.Form的ReporterForm类,并在Form中设置一TextBox,命名为“ReporttextBox”,并把“MultiLine”属性设置为Ture。
二、创建Alignment
2. 使用的参数为:圆曲线半径为1000m,前缓和曲线长度为100m,后缓和曲线长度为200m。如下图所示:
3. 绘制结果为下图的平曲线图形。
三、 交互式选取Alignment
2. 关于DgnElementSetTool的用法可以见下图所示
3. 在DgnElementSetTool类中重载OnRestartTool、ExitTool、OnPostInstall、OnDataButton、OnElementModify、OnResetButton等函数。
4. 我们需要实现的功能是在鼠标移动到Alignment上以后按下鼠标左键,获取Alignment元素。代码如下:
protected override bool OnDataButton(Bentley.DgnPlatformNET.DgnButtonEvent ev)
{
Bentley.DgnPlatformNET.HitPath hitPath = DoLocate(ev, true, 1);
if (hitPath == null)
return false;
Element el = hitPath.GetCursorElement();
if (el == null)
Alignment al = (el.ParentElement == null) ? Alignment.CreateFromElement(el) : Alignment.CreateFromElement(el.ParentElement);
if (al == null)
return true;
}
其中Alignment类定义在Bentley.CifNET.GeometryModel.SDK命令空间中,我们可以知道Alignment是我们ORD SDK中GeometryModel的重要组成部分,由它可以获取整条路线的信息,其中包括平面、纵断面、空间线、断链等信息。
四、 遍历Alignment的几何元素
………………….
HorizontalAlignmentReporter report = new HorizontalAlignmentReporter();
report.ReportAlignment(al);
3. 上面调用的ReportAlignment 函数实现了以下功能:
internal void ReportAlignment(Alignment al)
// Generate Alignment Header
string name = "Unnamed", style = '';
if (al.Name != null && al.Name != "")
name = al.Name;
if (al.FeatureName != null)
style = al.FeatureName;
// Report Elements in Alignment
LinearElement[] elements = { };
try {
LinearComplex alComplex = (LinearComplex)al.LinearGeometry;
elements = alComplex.GetSubLinearElements();
catch
elements = new LinearElement[1];
elements[0] = al.LinearGeometry;
此函数通过调用alComplex.GetSubLinearElements();获取了Alignment中的所有子LinearElement。
4. 对于Alignment中的子LinearElement的理解我们可以用下图理解:
1为直线几何,2为缓和曲线几何,3为圆弧几何,4为缓和曲线几何,5为直线几何。
五、 获取几何元素的属性
public Dictionary<string, string> Read(LinearElement le)
Dictionary<string, string> properties = new Dictionary<string, string>();
if (le is Line)
properties = ReadLine(le as Line);
else if (le is Spiral)
properties = ReadSpiral(le as Spiral);
else if (le is CircularArc)
properties = ReadCircularArc(le as CircularArc);
if (properties.Count == 0)
properties.Add("No properties read for element", le.GetType().Name);
return properties;
我们可看到Line、Spiral、CircularArc派生于LinearElement。
3. 我们可以通过ReadLine的函数具体实现代码看下Line的几何信息的获取:
internal Dictionary<string, string> ReadLine(Line line)
Dictionary<string, string> lineProperties = new Dictionary<string, string>();
lineProperties.Add("Element", line.GetType().Name);
lineProperties.Add("Start", GeometryHelper.GetStation(m_alignment, line.StartPoint) + " | " + GeometryHelper.FormatCoordinates(line.StartPoint));
lineProperties.Add("End", GeometryHelper.GetStation(m_alignment, line.EndPoint) + " | " + GeometryHelper.FormatCoordinates(line.EndPoint));
lineProperties.Add("Tangential Direction", GeometryHelper.FormatDirection(line.Direction));
lineProperties.Add("Tangential Length", GeometryHelper.FormatDistance(line.Length));
return lineProperties;
我们通过Line(直线)的成员变量获取它的所有属性。同样的Spiral(缓和曲线)和圆弧(CircularArc)。
以上代码中GeometryHelper是一个几何计算类,我们由SDK示例工程中的ManagedSDKExample项目中拷贝而来。
关于ReadSpiral与ReadCircularArc与ReadLine原理是一样的这里就不加以详解,大家可以参考本章所带的示例代码。这三个函数都是把对应几何元素的几何信息提取出来,并放到字典对象中。
4. 几何信息的显示:
我们通过以下代码把几何信息的字典传递给ReporterForm,并在名为“ReporttextBox”的TextBox中显示出来。
ReporterForm form = new ReporterForm();
AlignmentPropertyReader propReader = new AlignmentPropertyReader(al);
foreach (LinearElement le in elements)
Dictionary<string, string> elementProperties = propReader.Read(le);
form.AddElementProperties(elementProperties);
form.Show();
程序运行结果如下:
本章示例代码:
Lesson3.zip