SkylineGlobe 6.5 如何实现简单多边形的动态绘制 C#示例代码
在Skyline的TEPro软件中,我们可以很容易地绘制出多边形。

那么,在二次开发过程中,该如何绘制一个简单的多边形呢?
通过下面的示例代码,我们可以很容易完成这一项工作。
其中,重点需要了解Geometry对象的定义和使用。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TerraExplorerX; namespace HelloSkyline
{
public partial class CTerrainPolygon: Form
{
SGWorld65 sgworld = null;
String pbhander = "";
ITerrainPolygon65 pITPolygon = null;
List<double> ListVerticsArray = new List<double>(); public CTerrainPolygon()
{
InitializeComponent(); sgworld = new SGWorld65();
sgworld.OnLButtonDown += new _ISGWorld65Events_OnLButtonDownEventHandler(sgworld_OnLButtonDown);
sgworld.OnRButtonDown += new _ISGWorld65Events_OnRButtonDownEventHandler(sgworld_OnRButtonDown);
} bool sgworld_OnRButtonDown(int Flags, int X, int Y)
{
sgworld.Window.SetInputMode(MouseInputMode.MI_FREE_FLIGHT);
pbhander = "";
pITPolygon = null;
return true;
} bool sgworld_OnLButtonDown(int Flags, int X, int Y)
{
IWorldPointInfo65 pIWPInfo = sgworld.Window.PixelToWorld(X, Y, WorldPointType.WPT_TERRAIN);
IPosition65 pIPosition = sgworld.Navigate.GetPosition(AltitudeTypeCode.ATC_ON_TERRAIN); if (pbhander == "TerrainPolygon")
{
if (pITPolygon == null)
{
ILinearRing cRing = null;
double[] cVerticesArray = null;
cVerticesArray = new double[] {
pIPosition.X, pIPosition.Y, ,
pIWPInfo.Position.X, pIWPInfo.Position.Y, pIWPInfo.Position.Distance,
pIWPInfo.Position.X, pIWPInfo.Position.Y, pIWPInfo.Position.Distance,
};
cRing = sgworld.Creator.GeometryCreator.CreateLinearRingGeometry(cVerticesArray); uint nLineColor = 0xFF00FF00;
uint nFillColor = 0x7FFF0000;
AltitudeTypeCode eAltitudeTypeCode = AltitudeTypeCode.ATC_ON_TERRAIN;
string gid = CreateGroup("AnalysisTEMP");
pITPolygon = sgworld.Creator.CreatePolygon(cRing, nLineColor, nFillColor, eAltitudeTypeCode, gid, "Polygon"); IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
polygonGeometry.StartEdit();
foreach (ILinearRing ring in polygonGeometry.Rings)
{
double dx = pIWPInfo.Position.X;
double dy = pIWPInfo.Position.Y;
double dh = pIWPInfo.Position.Distance;
ring.Points.AddPoint(dx, dy, dh);
ring.Points.DeletePoint();
}
IGeometry editedGeometry = polygonGeometry.EndEdit();
pITPolygon.Geometry = editedGeometry;
}
else
{
IPolygon polygonGeometry = pITPolygon.Geometry as IPolygon;
polygonGeometry.StartEdit();
foreach (ILinearRing ring in polygonGeometry.Rings)
{
double dx = pIWPInfo.Position.X;
double dy = pIWPInfo.Position.Y;
double dh = pIWPInfo.Position.Distance;
ring.Points.AddPoint(dx, dy, dh);
}
IGeometry editedGeometry = polygonGeometry.EndEdit();
pITPolygon.Geometry = editedGeometry;
}
}
return false;
} private void button1_Click(object sender, EventArgs e)
{
pbhander = "TerrainPolygon";
sgworld.Window.SetInputMode(MouseInputMode.MI_COM_CLIENT);
} private void button2_Click(object sender, EventArgs e)
{
string gid = sgworld.ProjectTree.FindItem("AnalysisTEMP");
if (gid != null && gid != "")
{
sgworld.ProjectTree.DeleteItem(gid);
}
} private String CreateGroup(String GroupName)
{
string gid = sgworld.ProjectTree.FindItem(GroupName);
if (gid != null && gid != "")
{
return gid;
}
else
{
return sgworld.ProjectTree.CreateLockedGroup(GroupName);
}
}
}
}
SkylineGlobe 6.5 如何实现简单多边形的动态绘制 C#示例代码的更多相关文章
- SkylineGlobe 6.6 三维地图上实现自定义右键菜单示例代码
1.OnRButtonDown.htm <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &quo ...
- iOS可视化动态绘制连通图
上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...
- 【译】用Fragment创建动态的界面布局(附Android示例代码)
原文链接:Building a Dynamic UI with Fragments 为了在Android上创建一个动态和多视图的用户界面,你需要封装UI控件和模块化Activity的行为,以便于你能够 ...
- C# 动态绘制任务栏图标的实现
通常我们在做一个应用时会遇到这样的需求:将收到的消息条数显示到任务栏,比如如下的效果 怎么实现呢? 答案是采用WindowsAPICodePack实现,具体参见:Windows 7 任务栏开发 之 覆 ...
- Linux下c函数dlopen实现加载动态库so文件代码举例
dlopen()是一个强大的库函数.该函数将打开一个新库,并把它装入内存.该函数主要用来加载库中的符号,这些符号在编译的时候是不知道的.这种机制使得在系统中添加或者删除一个模块时,都不需要重新编译了. ...
- 教你怎么用Mono Cecil - 动态注入 (注意代码的注释)
原文 教你怎么用Mono Cecil - 动态注入 (注意代码的注释) 使用 Mono Cecil 进行反编译:using Mono.Cecil; using Mono.Cecil.Cil; //.. ...
- golang动态加载原生代码思路
golang动态加载原生代码思路(非plugin,非so文件.使用mmap形式运行机器码,可释放) 1.用go tool objdump,可以看到任意函数的机器码.汇编指令.偏移.(go源码下面有一个 ...
- iOS可视化动态绘制连通图(Swift版)
上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...
- SkylineGlobe TerraExplorer Pro 7.0 Web 控件版 第一行示例代码
SkylineGlobe TerraExplorer Pro 7.0 是原生的64位应用程序,在Web端用插件方式开发的第一行示例代码如下: 常规代码,需要IE64位: <!DOCTYPE ht ...
随机推荐
- JS实现页面分享代码share,不需要第三方接口
在开发一个页面的时候常常会有这么一个小功能,就是分享该页面中的信息. 常见的分享代码有百度分享,JiaThis分享插件(现在貌似不能用了),bshare分享插件等,我主要分享一下自定义分享代码,如下: ...
- 洛谷P3987 我永远喜欢珂朵莉~(set 树状数组)
题意 题目链接 Sol 不会卡常,自愧不如.下面的代码只有66分.我实在懒得手写平衡树了.. 思路比较直观:拿个set维护每个数出现的位置,再写个线段树维护区间和 #include<bits/s ...
- 【读书笔记】iOS-成为一名开发者
iOS开发者计划是按年付费的,在过期前60天可以开始续费.如果你不续费的话,你将无法发布应用.另外苹果会吊销你的开发者证书和发布证书.最后,苹果将你在iTunes App Store上的所有应用下架. ...
- android开发笔记:Handler、Looper、MessageQueen、Message的关系
一.什么是handler? 注:线程分为主线程(主线程又叫UI线程,只能有一个主线程)和子线程(可以有多个)Handler只能在主线程里运行 handler是Android给我们提供用来更新UI的一套 ...
- 如何打jar包
一.制作只含有字节码文件的jar包1.最简单的jar包——直接输出hello2.含有两个类的jar包——通过调用输出hello3.有目录结构的jar包——通过引包并调用输出hello 二.制作含有ja ...
- linux中使用nfs共享文件
NFS需要使用远程过程调用 (RPC),也就是说,我们并不是只要启动NFS, 还需要启动RPC这个服务 服务器端 CentOS 7.4 ip:172.16.0.1 共享/tmp目录 共享/data目录 ...
- matplotlib多plot可视化
代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 16:37:47 2018 @author: zhen &qu ...
- MySQL中MyISAM与InnoDB区别及选择
InnoDB:支持事务处理等不加锁读取支持外键支持行锁不支持FULLTEXT类型的索引不保存表的具体行数,扫描表来计算有多少行DELETE 表时,是一行一行的删除InnoDB 把数据和索引存放在表空间 ...
- Vue延迟点击
从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 300 毫秒的等待时间 fastclick清除点击延迟,让程序更灵敏 1.导出fastclick import Vue from ...
- mysql常见的错误代码
如果安装时或者工作中有问题,可以看错误日志分析问题原因: 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能 ...