当前位置: 移动技术网 > IT编程>开发语言>c# > C# Winfrom实现Skyline画直线功能的示例代码

C# Winfrom实现Skyline画直线功能的示例代码

2020年03月09日  | 移动技术网IT编程  | 我要评论

前言:

这里记录了我在学习skyline二次开发中所遇到的问题,适合刚接触skyline二次开发的同学查看使用,从逻辑到代码逐一详解,但是还是重在理解,希望对你有所帮助。

1、画线的逻辑:

让我回到terraexplorer pro这个软件中尝试画一条线,从每一步操作去发现,到底发生了什么?
1.鼠标左键在3d窗口中选择一个点(确定第一个点的位置)。
2.挪动鼠标,在第二个点单击鼠标左键(确定第二个点的位置)。
3.按住鼠标左键不放,在3d窗口中挪动地球,松开后发现没有画出线,这时左键单击下一个点又画了一个线。(左键选中拖拽不画线)
4.右键单击取消最后一个点,将上一个点定为线最后的终点(删除最后一个点位,将倒数第二个点定为线的终点)

尝试自己去画一条线很重要,在画完之后上面这些话你会多少理解一些。

2、画线的代码

下面是需要绑定的事件,这个代码有个小bug等待你自己去发现

 sgworld.onrbuttonup += sgworld_onrbuttonup;//绑定鼠标右击抬起事件
 sgworld.onlbuttonup += sgworld_onlbuttonup;//绑定鼠标左击抬起事件
 sgworld.onlbuttondown += sgworld_onlbuttondown;//绑定鼠标左击按下事件
 sgworld.onframe += sgworld_onframe;//绑定实时渲染事件
 
using system;
using system.windows.forms;
using terraexplorerx;//引用skyline的名称空间

namespace skyline画线
{
 public partial class form1 : form
 {
  public form1()
  {
   initializecomponent();
  }
  //全局变量
  sgworld701 sgworld;
  bool drawline = false;
  double centerx = 0;
  double centery = 0;
  iterrainpolyline701 polyline = null;

  //画直线按钮 按钮的name为 drawaline
  private void drawaline_click(object sender, eventargs e)
  {
   drawline = true;
  }
  //窗体加载
  private void form1_load(object sender, eventargs e)
  {
   sgworld = new sgworld701();
   sgworld.project.open("工程路径");
   sgworld.onrbuttonup += sgworld_onrbuttonup;//绑定鼠标右击抬起事件
   sgworld.onlbuttonup += sgworld_onlbuttonup;//绑定鼠标左击抬起事件
   sgworld.onlbuttondown += sgworld_onlbuttondown;//绑定鼠标左击按下事件
   sgworld.onframe += sgworld_onframe;//绑定实时渲染事件
  }
  
  //鼠标左击按下事件 获取屏幕中心点位置
  private bool sgworld_onlbuttondown(int flags, int x, int y)
  {
   iworldpointinfo701 centerofworld1 = sgworld.window.centerpixeltoworld(worldpointtype.wpt_default);
   centerx = centerofworld1.position.x;

   centery = centerofworld1.position.y;
   return false;
  }
  //实时渲染事件 
  private void sgworld_onframe()
  {
   imouseinfo701 mouse1= sgworld.window.getmouseinfo();
   iworldpointinfo701 worldpointinfo = sgworld.window.pixeltoworld(mouse1.x, mouse1.y);
   if (worldpointinfo != null)
   {
    iposition701 pos = worldpointinfo.position;
    if (polyline!=null)
    {
     polyline.geometry.startedit();
     ((ilinestring)polyline.geometry).points.deletepoint(
      ((ilinestring)polyline.geometry).points.count - 1
      );
     ((ilinestring)polyline.geometry).points.addpoint(
      worldpointinfo.position.x,
      worldpointinfo.position.y,
      worldpointinfo.position.altitude
      );
     polyline.geometry.endedit();

    }
   }
  }


  //鼠标右击弹起事件 
  private bool sgworld_onlbuttonup(int flags, int x, int y)
  {

   iworldpointinfo701 centerofworld2 = sgworld.window.centerpixeltoworld(worldpointtype.wpt_default);
   double centerpointdistance = sgworld.coordservices.getdistance(centerofworld2.position.x, centerofworld2.position.y, centerx, centery);
   //判断如果鼠标单击画线按钮后执行下面
   if (drawline == true)
   {
    iworldpointinfo701 ipworldinfor = sgworld.window.pixeltoworld(x, y);
    if (polyline == null)
     {
      double dxcoord = ipworldinfor.position.x;
      double dycoord = ipworldinfor.position.y;
      double[] array = new double[] { };
      array = new double[] { dxcoord, dycoord, 0, dxcoord, dycoord, 0, };
      ilinestring lr = sgworld.creator.geometrycreator.createlinestringgeometry(array);

      polyline = sgworld.creator.createpolyline(lr, 0xffffff, altitudetypecode.atc_terrain_absolute, "", "");
     }
     else
     {
      if (centerpointdistance==0)
      {
      ilinestring new_lr = polyline.geometry as ilinestring;
      new_lr.startedit();
      new_lr.points.addpoint(ipworldinfor.position.x, ipworldinfor.position.y, ipworldinfor.position.altitude);
      new_lr.endedit();

      }
     }
   }
   return false;
  }
  //鼠标右击事件结束画线,并删除最后一个点
  private bool sgworld_onrbuttonup(int flags, int x, int y)
  {
   if (polyline != null)
   {
    polyline.geometry.startedit();
    ((ilinestring)polyline.geometry).points.deletepoint(
        ((ilinestring)polyline.geometry).points.count - 1
        );
    polyline.geometry.endedit();
   }
   
   drawline = false;
   polyline = null;
   return true;
  }
 }
}

由于时间比较紧,本来想一点点分析详解的,大家可以做参考,也可直接复制,但是最重要的是理解,一个东西理解了才能更好的学习。有什么想法大家可以一起讨论学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网