千家信息网

如何使用C#Winfrom实现Skyline画直线功能

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家分享的是有关如何使用C#Winfrom实现Skyline画直线功能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、画线的逻辑:让我回到TerraExplor
千家信息网最后更新 2026年11月01日如何使用C#Winfrom实现Skyline画直线功能

这篇文章给大家分享的是有关如何使用C#Winfrom实现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; } }}

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

感谢各位的阅读!关于"如何使用C#Winfrom实现Skyline画直线功能"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

鼠标 事件 直线 位置 实时 按钮 功能 重要 代码 内容 更多 篇文章 终点 参考 学习 尝试 不错 实用 东西 中心点 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 上海挚品互联网科技有限公司 苏州找大状互联网科技有限公司 互联网科技巨头监管 科技互联网政务服务 金融科技与互联网金融 西安互联网科技 太原新华互联网科技学校怎么样 中国最先进互联网科技公司 移动互联网科技股 汽车互联网创新科技园 中化能源互联网科技招聘 南平创想时代互联网科技有限公司 广州市恰铎互联网科技有限公司 中国科技创新与世界互联网大会 广州新华互联网科技学校电竞方面 玉溪新华互联网科技好不好 2021互联网科技公司排名 互联网科技资金流入 优雇互联网科技有限公司 知域互联网科技有限公司官网 互联网新科技 云之行互联网科技 互联网科技公司税收优惠 互联网与科技金融数据 互联网金融 金融科技 互联网科技金融公司 互联网科技的未来发展 知域互联网科技有限公司大骗子 郑州欣桑互联网科技有限公司 数字互联网科技有限公司
0