C# Winfrom实现Skyline画直线功能的示例代码
程序员文章站
2022-05-26 10:03:25
前言:
这里记录了我在学习skyline二次开发中所遇到的问题,适合刚接触skyline二次开发的同学查看使用,从逻辑到代码逐一详解,但是还是重在理解,希望对你有所帮助。...
前言:
这里记录了我在学习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; } } }
由于时间比较紧,本来想一点点分析详解的,大家可以做参考,也可直接复制,但是最重要的是理解,一个东西理解了才能更好的学习。有什么想法大家可以一起讨论学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。