第3章、实现一个简单的路线报表


     本例子最主要目的是带领大家实现一个读取ORD平曲线元素属性的例子。在例子中将会一步步实现交互式选取Alignment,遍历Alignment的几何元素,获取几何元素的属性并显示报表。

一、构建程序框架

  1. 我们先创建一个名称为“Lesson3”的Addin项目,并按照上一章的方法配置好项目文件及.bat、.mke文件。
  2. 我们创建一个CommandTable.xml文件,注册“Lesson3 HORIZONTALALIGNMENTS”命令。并新建一个Keyin.cs文件,把“Lesson3 HORIZONTALALIGNMENTS”命令子节点和CmdHorizontalAlignmentReport静态函数绑定。

       3.  在ORD目录下的..\config\appl\文件夹中,创建Lesson3.cfg文件。

       4.  新建派生于System.Windows.Forms.Form的ReporterForm类,并在Form中设置一TextBox,命名为“ReporttextBox”,并把“MultiLine”属性设置为Ture。

二、创建Alignment

  1. 使用Geometry-> Horizontal-> Complex Geometry->Complex by PI菜单命令去绘制Alignment,如下图所示。

       2.  使用的参数为:圆曲线半径为1000m,前缓和曲线长度为100m,后缓和曲线长度为200m。如下图所示:

       3.  绘制结果为下图的平曲线图形。

三、 交互式选取Alignment

  1. 新建PickAlignmentTool类派生于DgnElementSetTool类。

       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)

               return false; 

           Alignment al = (el.ParentElement == null) ? Alignment.CreateFromElement(el) :    Alignment.CreateFromElement(el.ParentElement);

            if (al == null)

               return false; 

           return true;

   }

        其中Alignment类定义在Bentley.CifNET.GeometryModel.SDK命令空间中,我们可以知道Alignment是我们ORD SDK中GeometryModel的重要组成部分,由它可以获取整条路线的信息,其中包括平面、纵断面、空间线、断链等信息。

四、 遍历Alignment的几何元素

  1. 有了上一步获取的Alignment对象,我们可以获取它的几何信息,Alignment类的LinearGeometry属性中包含了它的所有几何信息。
  2. 为了获取Alignment类的LinearGeometry属性中的几何信息,我们定义一个名为HorizontalAlignmentReporter的类。它的一个最重要的函数void ReportAlignment(Alignment al)。ReportAlignment函数在PickAlignmentTool类中的OnDataButton函数中,当按下鼠标左键获取到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为直线几何。

五、 获取几何元素的属性

  1. 为获取几何元素的属性,我们新建AlignmentPropertyReader类,其Read函数可以获取所有属性的属性名称和属性值。
  2. 几何元素的判别通过is操作符实现,如以下代码实现:

        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();

程序运行结果如下:

本章示例代码:

communities.bentley.com/.../Lesson3.zip