C# Winfrom实现Skyline画直线功能的示例代码
前言:
这里记录了我在学习Skyline二次开发中所遇到的问题,适合刚接触Skyline二次开发的同学查看使用,从逻辑到代码逐一详解,但是还是重在理解,希望对你有所帮助。
1、画线的逻辑:
让我回到TerraExplorerPro这个软件中尝试画一条线,从每一步操作去发现,到底发生了什么?
1.鼠标左键在3D窗口中选择一个点(确定第一个点的位置)。
2.挪动鼠标,在第二个点单击鼠标左键(确定第二个点的位置)。
3.按住鼠标左键不放,在3D窗口中挪动地球,松开后发现没有画出线,这时左键单击下一个点又画了一个线。(左键选中拖拽不画线)
4.右键单击取消最后一个点,将上一个点定为线最后的终点(删除最后一个点位,将倒数第二个点定为线的终点)
尝试自己去画一条线很重要,在画完之后上面这些话你会多少理解一些。
2、画线的代码
下面是需要绑定的事件,这个代码有个小Bug等待你自己去发现
sgworld.OnRButtonUp+=Sgworld_OnRButtonUp;//绑定鼠标右击抬起事件 sgworld.OnLButtonUp+=Sgworld_OnLButtonUp;//绑定鼠标左击抬起事件 sgworld.OnLButtonDown+=Sgworld_OnLButtonDown;//绑定鼠标左击按下事件 sgworld.OnFrame+=Sgworld_OnFrame;//绑定实时渲染事件
usingSystem;
usingSystem.Windows.Forms;
usingTerraExplorerX;//引用Skyline的名称空间
namespaceSkyline画线
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
}
//全局变量
SGWorld701sgworld;
boolDrawline=false;
doublecenterX=0;
doublecenterY=0;
ITerrainPolyline701polyline=null;
//画直线按钮按钮的Name为Drawaline
privatevoidDrawaline_Click(objectsender,EventArgse)
{
Drawline=true;
}
//窗体加载
privatevoidForm1_Load(objectsender,EventArgse)
{
sgworld=newSGWorld701();
sgworld.Project.Open("工程路径");
sgworld.OnRButtonUp+=Sgworld_OnRButtonUp;//绑定鼠标右击抬起事件
sgworld.OnLButtonUp+=Sgworld_OnLButtonUp;//绑定鼠标左击抬起事件
sgworld.OnLButtonDown+=Sgworld_OnLButtonDown;//绑定鼠标左击按下事件
sgworld.OnFrame+=Sgworld_OnFrame;//绑定实时渲染事件
}
//鼠标左击按下事件获取屏幕中心点位置
privateboolSgworld_OnLButtonDown(intFlags,intX,intY)
{
IWorldPointInfo701centerOfWorld1=sgworld.Window.CenterPixelToWorld(WorldPointType.WPT_DEFAULT);
centerX=centerOfWorld1.Position.X;
centerY=centerOfWorld1.Position.Y;
returnfalse;
}
//实时渲染事件
privatevoidSgworld_OnFrame()
{
IMouseInfo701mouse1=sgworld.Window.GetMouseInfo();
IWorldPointInfo701worldPointInfo=sgworld.Window.PixelToWorld(mouse1.X,mouse1.Y);
if(worldPointInfo!=null)
{
IPosition701pos=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();
}
}
}
//鼠标右击弹起事件
privateboolSgworld_OnLButtonUp(intFlags,intX,intY)
{
IWorldPointInfo701centerOfWorld2=sgworld.Window.CenterPixelToWorld(WorldPointType.WPT_DEFAULT);
doublecenterPointDistance=sgworld.CoordServices.GetDistance(centerOfWorld2.Position.X,centerOfWorld2.Position.Y,centerX,centerY);
//判断如果鼠标单击画线按钮后执行下面
if(Drawline==true)
{
IWorldPointInfo701ipWorldInfor=sgworld.Window.PixelToWorld(X,Y);
if(polyline==null)
{
doubledXCoord=ipWorldInfor.Position.X;
doubledYCoord=ipWorldInfor.Position.Y;
double[]array=newdouble[]{};
array=newdouble[]{dXCoord,dYCoord,0,dXCoord,dYCoord,0,};
ILineStringlr=sgworld.Creator.GeometryCreator.CreateLineStringGeometry(array);
polyline=sgworld.Creator.CreatePolyline(lr,0xffffff,AltitudeTypeCode.ATC_TERRAIN_ABSOLUTE,"","");
}
else
{
if(centerPointDistance==0)
{
ILineStringnew_lr=polyline.GeometryasILineString;
new_lr.StartEdit();
new_lr.Points.AddPoint(ipWorldInfor.Position.X,ipWorldInfor.Position.Y,ipWorldInfor.Position.Altitude);
new_lr.EndEdit();
}
}
}
returnfalse;
}
//鼠标右击事件结束画线,并删除最后一个点
privateboolSgworld_OnRButtonUp(intFlags,intX,intY)
{
if(polyline!=null)
{
polyline.Geometry.StartEdit();
((ILineString)polyline.Geometry).Points.DeletePoint(
((ILineString)polyline.Geometry).Points.Count-1
);
polyline.Geometry.EndEdit();
}
Drawline=false;
polyline=null;
returntrue;
}
}
}
由于时间比较紧,本来想一点点分析详解的,大家可以做参考,也可直接复制,但是最重要的是理解,一个东西理解了才能更好的学习。有什么想法大家可以一起讨论学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
