许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  Bentley ORD(OpenRoads Designer)二次开发(BIM)第四节:实现简单路线报表

Bentley ORD(OpenRoads Designer)二次开发(BIM)第四节:实现简单路线报表

阅读数 102
点赞 0
article_banner

本例子最主要目的是带领大家实现一个读取 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();

程序运行结果如下:


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空