<!DOCTYPE html>
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
<title>ToolTitle</title>
|
<meta http-equiv="X-UA-Compatible" content="IE=9" />
|
|
<link rel="StyleSheet" href="Style.css" type="text/css">
|
<style>
|
.MenuButton {
|
height: 78px;
|
width: 64px;
|
margin: 3px;
|
padding: 0px;
|
white-space: normal;
|
}
|
|
.MenuButtonHighlight {
|
color: Red;
|
font-weight: bold;
|
}
|
|
html,
|
body {
|
height: 100%;
|
}
|
|
html,
|
body {
|
height: 100%;
|
margin: 0px;
|
padding: 0px;
|
}
|
|
#wrapper {
|
width: 100%;
|
height: 100%;
|
margin: auto;
|
position: relative;
|
}
|
|
#header {
|
height: 40px;
|
}
|
|
#content {
|
position: absolute;
|
bottom: 0px;
|
top: 40px;
|
width: 100%;
|
overflow: auto;
|
}
|
</style>
|
</head>
|
|
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" style="border: 0;
|
overflow: auto; height:100%;overflow:hidden" id="Body" onload="Init()" onunload="Exit();" oncontextmenu_="return false;">
|
|
<div id="waitDiv">
|
<table border=0 style="width:100%; " id="Table1" style="display:none;" cellspacing=0 cellpadding=1>
|
<tr tyle="width:100%">
|
<td align="center">
|
<span class="i18n" style="font-size:24px">Text3</span>
|
</td>
|
</tr>
|
</table>
|
</div>
|
<div id="wrapper">
|
<div id="header">
|
<table border=0 style="width:100%;display:none; " id="mainTbl" cellspacing=0 cellpadding=1>
|
<tr style="width:100%; height:40px;">
|
<td align="left">
|
<span style="padding-left:30px;" />
|
<img src="img/ZoomOut.png" style="cursor:pointer;" onclick="gPlot.zoomOut();" align="absmiddle" />
|
<img src="img/ZoomIn.png" style="cursor:pointer;" onclick="gPlot.zoom();" align="absmiddle" />
|
<img src="img/Zoomall.png" style="cursor:pointer;" onclick="DrawGraph();" align="absmiddle" />
|
<span style="padding-left:30px;" />
|
<input type="checkbox" id="WaypointsID" style="width:15px; vertical-align:middle;" onclick="DrawGraph();" /><img src="img/waypoint.jpg" align="absmiddle" /><span class="i18n">Text50</span>
|
<span style="padding-left:10px;" />
|
<input type="checkbox" id="MinMaxAltID" style="width:15px; vertical-align:middle;" onclick="DrawGraph();" /><img src="img/minmaxAlt.jpg" align="absmiddle" /><span class="i18n">Text48</span>
|
<span style="padding-left:10px;" />
|
<input type="checkbox" id="MinMaxSlopeID" style="width:15px; vertical-align:middle;" onclick="DrawGraph();" /><img src="img/minmaxSlope.jpg" align="absmiddle" /><span class="i18n">Text49</span>
|
<span style="padding-left:10px;" />
|
<span class="i18n">Text51</span> <span class="i18n" id="UnitID"></span>
|
</td>
|
<td align="right">
|
<button style="background-color:#2b2b2b; border:0px solid black; color:White; height:25px;" id="CreateLayerButton" onclick="CreateLayer();"><span class="i18n">Text40</span></button>
|
<span style="padding-left:10px;" />
|
</td>
|
</tr>
|
</table>
|
</div>
|
<div id="content">
|
<div class="demo-container" style="height:100%;width:100%; ">
|
<div id="chartdiv" style="height:100%;width:99%; "></div>
|
</div>
|
</div>
|
</div>
|
<object id="SGWorld" style="display:none" classid="CLSID:B23DDF84-B652-4E34-9E57-77B8731199FE"> </object>
|
|
<script language="javascript" src="js/ToolsCommon65.js"></script>
|
|
|
<script language="javascript" type="text/javascript" src="jquery/jquery.min.js"></script>
|
<script language="javascript" type="text/javascript" src="jquery/jquery.flot.min.js"></script>
|
<script language="javascript" type="text/javascript" src="jquery/jquery.flot.navigate.min.js"></script>
|
<script language="javascript" type="text/javascript" src="jquery/jquery-ui-1.10.4.custom.min.js"></script>
|
<script language="javascript" type="text/javascript" src="jquery/jquery.flot.resize.min.js"></script>
|
<script language="javascript" type="text/javascript" src="jquery/jquery.flot.symbol.min.js"></script>
|
|
|
<script language="JavaScript">
|
//** this is a global variables for the polyline/polygon drawings
|
var gPolyObj = null;
|
var gPolyMethod;
|
var gPolygonText = SGLang.i18n("Text35");
|
var gPolylineText = SGLang.i18n("Text36");
|
var gDrawPolyClick = null;
|
var gEndDrawPoly = DrawPoly;
|
//**
|
|
var isGroupFlag = false;
|
var lineCounter = 0;
|
var objectNameIndex = 0;
|
var gSamplingInterval = [];
|
var gObjectName = [];
|
var gFollowLineGroup;
|
|
var isPolyline = true; // Decided to switch to PolylineLayer. If we want to switch to the point layer in the future, we can change the true condition.
|
//var gPointLayer; // gPointLayer has been changed in order to create a polyline layer with the same code
|
var gLayer;
|
|
var tmpGroundDistance = 0;
|
var gPositionsArray = [];
|
var gAltitudeArray = [];
|
var gPointsArray = [];
|
var gMaxAltitudeArray = [];
|
var gMinAltitudeArray = [];
|
var gMaxSlopeArray = [];
|
var gMinSlopeArray = [];
|
var gWaypointsArray = [];
|
|
var gLinePointsArray = [];
|
var gTotalDistance = [];
|
var gGroundDistance = [];
|
var gHorizontalDistance = [];
|
var gNumPoints = 0;
|
var gPointsIndex = 0;
|
var gNumLines = 0;
|
var gWaypointIndex = 0;
|
var gVisibilityDistance;
|
var gSpacing = 1;
|
var gDensity = 1;
|
var gGraphReady = false;
|
var gFoundLine = false;
|
var gExtraLines = 0;
|
var gUnit = 1.0;
|
var unitMethod = SGLang.i18n("Text57");
|
var gColorArray = ["#ff0000", "#00ff00", "#0000FF", "#FF00FF", "#C0FFFF", "#FFFF00", "#FFC119", "#B16CF8", "#D2FF01", "#AD8943"];
|
var gColorArray2 = [255, 65280, 16711680, 12583104, 16777152, 65535, 4499444, 16280753, 65490, 4426157];
|
|
var gCaption;
|
var gActionType;
|
|
var bInEdit;
|
var bFirstTime;
|
var bDontAskme;
|
var gPlot;
|
///var gTotalHours;
|
|
//--------------
|
// Init
|
function Init() {}
|
|
|
$(document).ready(function() {
|
setTimeout(StartQuery, 500);
|
});
|
//------------
|
// StartQuery
|
function StartQuery() {
|
try {
|
Reset(1, 0);
|
gActionType = GetParamValue("Type", "0");
|
gFollowLineGroup = GetParamValue("ObjID", "0");
|
var Compare = GetParamValue("Compare", "0");
|
gCaption = GetParamValue("Caption", "");
|
gDensity = parseInt(GetParamValue("Density", "1"));
|
if (SGWorld.GetOptionParam("AltitudeAndDistance") == 1) { // Feet
|
gUnit = 3.28084;
|
$("#UnitID").html(SGLang.i18n("Text53"));
|
unitMethod = SGLang.i18n("Text59");
|
} else { // meters
|
$("#UnitID").html(SGLang.i18n("Text52"));
|
}
|
|
|
|
if (Compare == "1") {
|
var ElevationID = GetParamValue("ElevationID", "0");
|
var ElevationObj = SGWorld.Creator.GetObject(ElevationID);
|
|
ElevationObj.Visibility.Show = false;
|
StartProfile(gActionType);
|
ElevationObj.Visibility.Show = true;
|
StartProfile(gActionType);
|
} else
|
StartProfile(gActionType);
|
|
|
setTimeout("resizePopup();", 500);
|
} catch (e) {
|
alert(e);
|
}
|
}
|
//------------
|
// resizePopup
|
function resizePopup() {
|
if (!gFoundLine)
|
return;
|
|
var popupMsg = SGWorld.Window.GetPopupByCaption(gCaption);
|
popupMsg.Left = 1;
|
popupMsg.Top = SGWorld.Window.Rect.Height * 2 / 3;
|
popupMsg.Height = SGWorld.Window.Rect.Height / 3;
|
popupMsg.Width = SGWorld.Window.Rect.Width - 2;
|
|
if (gPointsIndex > 0) {
|
CalcMinMax();
|
gGraphReady = true;
|
DrawGraph();
|
}
|
|
Reset(0, 0);
|
/// setTimeout("$('<span> </span>').appendTo(document.body);", 100); // Do not remove this line. It fixes a redraw problem.
|
|
|
$("#waitDiv").hide();
|
$("#mainTbl").css('display', 'inline');
|
|
setTimeout("resizePopup1();", 1000);
|
}
|
//-------
|
// resizePopup1
|
function resizePopup1() {
|
var popupMsg = SGWorld.Window.GetPopupByCaption(gCaption);
|
popupMsg.Height = popupMsg.Height + 1;
|
}
|
//------------
|
// Exit
|
function Exit() {
|
try {
|
if (gFollowLineGroup != "0" && gActionType != "3") // && !$("#CreateLayerButton")[0].disabled - include this condition to the if if you don't want to remove the FollowLine
|
SGWorld.ProjectTree.DeleteItem(gFollowLineGroup);
|
} catch (e) {}
|
|
}
|
//----------------
|
//-- StartProfile
|
function StartProfile(ActionType) {
|
switch (ActionType) {
|
case "0": // Manual drawing
|
DrawGroup(gFollowLineGroup);
|
break;
|
case "1": // Group selection
|
SelectGroupObjects();
|
break;
|
case "2": // Clipboard
|
SelectClipboardObjects();
|
break;
|
case "3": // 3D line (from Threat Dome analysis)
|
for (var i = 0; i < 10; i++) {
|
var a = "ObjID" + i;
|
var objID = GetParamValue(a, "0");
|
if (objID != "0")
|
Draw3DLine(objID);
|
}
|
break;
|
}
|
}
|
|
//------------------
|
// Reset
|
//------------------
|
function Reset(FirstTime, FromMouseInputMode) {
|
|
|
gPolyObj = null;
|
gLayer = null;
|
bDontAskme = false;
|
gVisibilityDistance = 4000;
|
|
$("#lineButton").removeClass("MenuButtonHighlight");
|
$("#areaButton").removeClass("MenuButtonHighlight");
|
$("#groupButton").removeClass("MenuButtonHighlight");
|
$("#clipboardButton").removeClass("MenuButtonHighlight");
|
|
SGWorld.ProjectTree.EnableRedraw(1);
|
SGWorld.Window.HideMessageBarText();
|
|
bInEdit = false;
|
|
if (FirstTime != 1 && FromMouseInputMode == 0)
|
SGWorld.Window.SetInputMode(0);
|
}
|
//-----------
|
// DrawGroup
|
function DrawGroup(node) {
|
SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text19"));
|
|
searchGeometries2(node, DrawPoly);
|
|
// Reset(0, 0);
|
}
|
//-------------
|
// Draw3DLine
|
function Draw3DLine(node) {
|
gPointsIndex = 0;
|
gPositionsArray[gNumLines] = [];
|
gAltitudeArray[gNumLines] = [];
|
var lineWaypointPositions = [];
|
gFoundLine = true;
|
var totlaDistance = 0;
|
|
var line = SGWorld.Creator.GetObject(node);
|
gNumPoints = line.Geometry.Points.count;
|
for (var k = 0; k < line.Geometry.Points.count; k++) // calculate total distance
|
lineWaypointPositions[k] = SGWorld.Creator.CreatePosition(line.Geometry.Points.Item(k).X, line.Geometry.Points.Item(k).Y, line.Geometry.Points.Item(k).Z, 3, 0, 0, 0, 0);
|
|
for (var k = 1; k < line.Geometry.Points.count; k++) // calculate total distance
|
totlaDistance += lineWaypointPositions[k - 1].DistanceTo(lineWaypointPositions[k]);
|
|
gSpacing = totlaDistance / 1000 / gDensity;
|
|
for (var k = 0; k < line.Geometry.Points.count; k++) // calculate total distance
|
AddPoint(lineWaypointPositions[k], false, true);
|
|
gTotalDistance[gNumLines] = totlaDistance;
|
gSamplingInterval[gNumLines] = gSpacing;
|
|
gNumLines += 1;
|
|
}
|
//-----------
|
// SelectGroupObjects
|
function SelectGroupObjects() {
|
var node = SGWorld.ProjectTree.GetNextItem("", 10);
|
if (node == 0 || !(SGWorld.ProjectTree.IsGroup(node) || SGWorld.ProjectTree.IsLayer(node))) {
|
alert(SGLang.i18n("Text24"));
|
return;
|
}
|
SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text19"));
|
gFoundLine = false;
|
searchGeometries2(node, DrawPoly);
|
GetFunctionName(node);
|
isGroupFlag = true;
|
if (!gFoundLine)
|
alert(SGLang.i18n("Text56"));
|
}
|
//-----------
|
// SelectClipboardObjects
|
function SelectClipboardObjects() {
|
|
SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text19"), -1);
|
gFoundLine = false;
|
searchGeometriesClipboard(DrawPoly);
|
if (!gFoundLine)
|
alert(SGLang.i18n("Text29"));
|
}
|
|
//-------------
|
// DrawPoly
|
function DrawPoly(geometry, type, altitudeType) {
|
SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text19"));
|
SGWorld.ProjectTree.EnableRedraw(0);
|
|
if (!ValidateInput())
|
return false;
|
if (gNumLines > 9) {
|
alert(SGLang.i18n("Text20"));
|
return false;
|
}
|
if (type == 1) {
|
if (!DrawOnPolyline(geometry, type, altitudeType))
|
return false;
|
}
|
|
return true;
|
|
}
|
//----
|
// DrawOnPolyline
|
function DrawOnPolyline(polylineGeometry, type, altitudeType) {
|
var lastCoord;
|
var currCoord;
|
var tmpCoord;
|
var SegmentLength;
|
var lastSegmentLenght;
|
var totlaDistance = 0;
|
var tmpHorizontal = 0;
|
gPointsIndex = 0;
|
gFoundLine = true;
|
gPositionsArray[gNumLines] = [];
|
gAltitudeArray[gNumLines] = [];
|
var lineWaypointPositions = [];
|
|
// Houre glass cursor
|
SGWorld.Window.SetInputMode(1, abspath() + "/hourglass.cur", true);
|
|
for (var k = 0; k < polylineGeometry.Points.count; k++) // calculate total distance
|
{
|
// We must convert the altitudes to absolute to avoid problems related to terrain changes during the loops below
|
//var Altitude = SGWorld.Terrain.GetGroundHeightInfo(polylineGeometry.Points.Item(k).X, polylineGeometry.Points.Item(k).Y, 2, true).Position.Altitude;
|
var Altitude = 0; // According to bug #20540 we decided to flat the polyline by setting all altitdutes to 0
|
lineWaypointPositions[k] = SGWorld.Creator.CreatePosition(polylineGeometry.Points.Item(k).X, polylineGeometry.Points.Item(k).Y, Altitude, 3);
|
if (k > 0) {
|
totlaDistance += lineWaypointPositions[k - 1].DistanceTo(lineWaypointPositions[k]);
|
tmpHorizontal += SGWorld.CoordServices.GetDistance(polylineGeometry.Points(k - 1).X, polylineGeometry.Points(k - 1).Y, polylineGeometry.Points(k).X, polylineGeometry.Points(k).Y);
|
}
|
}
|
|
//gSpacing = Math.max(totlaDistance / 1000 / gDensity, 1 / gDensity);
|
gSpacing = totlaDistance / 1000 / gDensity;
|
|
gNumPoints = totlaDistance / gSpacing;
|
var firstSegment = true;
|
|
for (var i = 1; i < polylineGeometry.Points.count; i++) {
|
lastCoord = lineWaypointPositions[i - 1].copy();
|
currCoord = lineWaypointPositions[i].copy();
|
|
lastCoord.yaw = lastCoord.AimTo(currCoord).yaw;
|
|
// AddWaypoint(lastCoord);
|
var Waypoint = true;
|
if (firstSegment) {
|
tmpCoord = lastCoord.Copy();
|
if (AddPoint(tmpCoord, Waypoint, false) == false)
|
return false;
|
Waypoint = false;
|
}
|
SegmentLength = lastCoord.DistanceTo(currCoord);
|
lastSegmentLenght = SegmentLength;
|
|
while (SegmentLength > 0.00001 && lastSegmentLenght >= SegmentLength) {
|
lastSegmentLenght = SegmentLength;
|
if (SegmentLength < gSpacing)
|
lastCoord = lastCoord.MoveToward(currCoord, SegmentLength);
|
else lastCoord = lastCoord.MoveToward(currCoord, gSpacing);
|
tmpCoord = lastCoord.Copy();
|
if (AddPoint(tmpCoord, Waypoint, false) == false)
|
return false;
|
Waypoint = false;
|
SegmentLength = lastCoord.DistanceTo(currCoord);
|
}
|
|
firstSegment = false;
|
}
|
|
//// Add lst point
|
tmpCoord = currCoord.Copy();
|
if (AddPoint(tmpCoord, true, false) == false)
|
return false;
|
|
// fix for bug #14439
|
//Restore3DModelToGroundObject();
|
|
gNumLines += 1;
|
|
gTotalDistance[lineCounter] = totlaDistance;
|
gSamplingInterval[lineCounter] = gSpacing;
|
gHorizontalDistance[lineCounter] = (tmpHorizontal * gUnit).toFixed(2);
|
gGroundDistance[lineCounter] = (tmpGroundDistance * gUnit).toFixed(2);
|
//var a = (SGWorld.Analysis.MeasureTerrainGroundDistance(polylineGeometry, gSamplingInterval, true) * gUnit).toFixed(2);
|
tmpGroundDistance = 0;
|
lineCounter++;
|
return true;
|
}
|
|
//-------------
|
// AddPoint
|
function AddPoint(pos, waypoint, fromThreatDome) {
|
var position1 = pos.ToAbsolute(0);
|
if (!fromThreatDome) {
|
var Altitude = SGWorld.Terrain.GetGroundHeightInfo(position1.X, position1.Y, 2, true).Position.Altitude;
|
position1.Altitude = Altitude;
|
} else
|
Altitude = pos.Altitude;
|
|
gPointsArray[gNumLines] = gPointsIndex;
|
gPositionsArray[gNumLines][gPointsIndex] = position1;
|
gAltitudeArray[gNumLines][gPointsIndex] = [gPointsIndex * gSpacing * gUnit, Altitude * gUnit];
|
if (waypoint) {
|
gWaypointsArray[gWaypointIndex] = [gPointsIndex * gSpacing * gUnit, Altitude * gUnit];
|
gWaypointIndex += 1;
|
}
|
|
SGWorld.Window.ShowMessageBarText(SGLang.i18n("Text3") + " (" + (gNumLines + 1) + ") : " + Math.floor((gPointsIndex / gNumPoints) * 100) + "%");
|
if (gPointsIndex >= 1)
|
tmpGroundDistance += gPositionsArray[gNumLines][gPointsIndex - 1].DistanceTo(gPositionsArray[gNumLines][gPointsIndex]);
|
gPointsIndex += 1;
|
}
|
//-------------
|
// CalcMinMax
|
function CalcMinMax() {
|
|
for (var Line = 0; Line < gNumLines; Line++) {
|
gMaxAltitudeArray[Line] = [0, -9999999];
|
gMinAltitudeArray[Line] = [0, 9999999];
|
var maxSlope = -999999;
|
var minSlope = 999999;
|
|
for (var Point = 0; Point <= gPointsArray[Line]; Point++) {
|
var Altitude = gPositionsArray[Line][Point].Altitude * gUnit;
|
// Min / Max altitude
|
if (Altitude > gMaxAltitudeArray[Line][1])
|
gMaxAltitudeArray[Line] = gAltitudeArray[Line][Point];
|
|
if (Altitude < gMinAltitudeArray[Line][1])
|
gMinAltitudeArray[Line] = gAltitudeArray[Line][Point];
|
|
// Min / Max Slope
|
var Slope = CalcSlope(Line, Point);
|
if (Slope > maxSlope) {
|
gMaxSlopeArray[Line] = gAltitudeArray[Line][Point];
|
maxSlope = Slope;
|
}
|
|
if (Slope < minSlope) {
|
gMinSlopeArray[Line] = gAltitudeArray[Line][Point];
|
minSlope = Slope;
|
}
|
|
|
}
|
}
|
|
}
|
|
//------------
|
// DrawGraph
|
function DrawGraph() {
|
if (!gGraphReady)
|
return;
|
gExtraLines = 0;
|
lineCounter = 0;
|
var data = [];
|
if ($("#MinMaxAltID").attr('checked')) {
|
data.push({
|
data: gMaxAltitudeArray,
|
points: {
|
show: true,
|
symbol: "square",
|
radius: 4
|
},
|
color: "#ff00ff"
|
});
|
data.push({
|
data: gMinAltitudeArray,
|
points: {
|
show: true,
|
symbol: "square",
|
radius: 4
|
},
|
color: "#ff00ff"
|
});
|
gExtraLines += 2;
|
}
|
if ($("#MinMaxSlopeID").attr('checked')) {
|
data.push({
|
data: gMaxSlopeArray,
|
points: {
|
show: true,
|
symbol: "diamond",
|
radius: 4
|
},
|
lines: {
|
show: false
|
},
|
color: "#0000ff"
|
});
|
data.push({
|
data: gMinSlopeArray,
|
points: {
|
show: true,
|
symbol: "diamond",
|
radius: 4
|
},
|
lines: {
|
show: false
|
},
|
color: "#0000ff"
|
});
|
gExtraLines += 2;
|
}
|
if ($("#WaypointsID").attr('checked')) {
|
data.push({
|
data: gWaypointsArray,
|
points: {
|
show: true,
|
symbol: "circle",
|
radius: 2
|
},
|
lines: {
|
show: false
|
},
|
color: "#000000"
|
});
|
gExtraLines += 1;
|
}
|
//
|
for (var i = 0; i < gNumLines; i++) {
|
data.push({
|
data: gAltitudeArray[i],
|
label: SGLang.i18n("Text15") + ": " + (i + 1) + " " + SGLang.i18n("Text58") + ": " + gGroundDistance[i] + unitMethod,
|
lines: {
|
show: true,
|
fill: false
|
},
|
color: gColorArray[i]
|
});
|
}
|
|
gPlot = $.plot("#chartdiv", data, {
|
xaxis: {
|
zoomRange: [0, ],
|
panRange: [0, ]
|
},
|
|
grid: {
|
hoverable: true,
|
clickable: true
|
},
|
zoom: {
|
interactive: true
|
},
|
pan: {
|
interactive: true
|
},
|
legend: {
|
labelFormatter: function(label, series) {
|
if (lineCounter >= gNumLines)
|
lineCounter = 0;
|
lineCounter++;
|
if (isGroupFlag)
|
return '<div id="labelTooltip" style="cursor:pointer" title="' + SGLang.i18n("Text60") + ': ' + gSamplingInterval[lineCounter - 1].toFixed(1) + ' ' + SGLang.i18n("Text62") + ': ' + gObjectName[lineCounter - 1] + ' ' + SGLang.i18n("Text61") + ': ' + gHorizontalDistance[lineCounter - 1] + '" style=BORDER:1px solid #fdd;font-size:12px;padding:2px;opacity:0.8;>' + label + '</div>';
|
else return '<div id="labelTooltip" style="cursor:pointer" title="' + SGLang.i18n("Text60") + ': ' + gSamplingInterval[lineCounter - 1].toFixed(1) + ' ' + SGLang.i18n("Text61") + ': ' + gHorizontalDistance[lineCounter - 1] + '" style=BORDER:1px solid #fdd;font-size:12px;padding:2px;opacity:0.8;>' + label + '</div>';
|
}
|
}
|
});
|
|
$("<div id='tooltip'></div>").css({
|
position: "absolute",
|
display: "none",
|
border: "1px solid #fdd",
|
padding: "2px",
|
"background-color": "#fee",
|
opacity: 0.80,
|
fontSize: "12px"
|
}).appendTo("body");
|
|
|
// Tooltip
|
$("#chartdiv").bind("plothover", function(event, pos, item) {
|
if (item) {
|
ToolTip(item, item.seriesIndex - gExtraLines, item.dataIndex);
|
} else {
|
$("#tooltip").hide();
|
}
|
});
|
|
// Click the graph
|
$("#chartdiv").bind("plotclick", function(event, pos, item) {
|
if (item) {
|
JumpToPoint(item.seriesIndex - gExtraLines, item.dataIndex);
|
}
|
});
|
|
}
|
//-------------
|
// Tool tip
|
function ToolTip(item, Line, Point) {
|
|
if (Line >= gNumLines) // Max/Min altitude/slope
|
return;
|
|
|
var htmlStr = "";
|
var Slope = CalcSlope(Line, Point);
|
if (SGWorld.GetOptionParam("ShowMGRS")) // if MGRS checkbox is checked
|
htmlStr = "X: " + gPositionsArray[Line][Point].X.toFixed(5) + "<br/>Y: " + gPositionsArray[Line][Point].Y.toFixed(5) + "<br/>MGRS: " + SGWorld.CoordServices.ConvertCoordinateToMGRS(gPositionsArray[Line][Point].X, gPositionsArray[Line][Point].Y) + "<br/>" + SGLang.i18n("Text45") + ": " + gAltitudeArray[Line][Point][1].toFixed(2) + "<br/>" + SGLang.i18n("Text47") + ": " + Slope.toFixed(2) + "\u00B0";
|
else htmlStr = "X: " + gPositionsArray[Line][Point].X.toFixed(5) + "<br/>Y: " + gPositionsArray[Line][Point].Y.toFixed(5) + "<br/>" + SGLang.i18n("Text45") + ": " + gAltitudeArray[Line][Point][1].toFixed(2) + "<br/>" + SGLang.i18n("Text47") + ": " + Slope.toFixed(2) + "\u00B0";
|
|
$("#tooltip").html(htmlStr)
|
.css({
|
top: item.pageY + 5,
|
left: item.pageX + 5
|
})
|
.fadeIn(200);
|
|
}
|
|
//-------------
|
// Tool tip
|
function LineToolTip(item) {
|
var htmlStr = "";
|
htmlStr = "X: " + item;
|
|
$("#labelTooltip").html(htmlStr)
|
.css({
|
top: item.pageY + 5,
|
left: item.pageX + 5
|
})
|
.fadeIn(200);
|
|
}
|
//-------------
|
// CalcSlope
|
function CalcSlope(Line, Point) {
|
var tmpPos = gPositionsArray[Line][Point].Copy();
|
var Slope;
|
|
if (Point >= gPointsArray[Line]) {
|
nextPoint = gPositionsArray[Line][Point - 1].Copy();
|
Slope = nextPoint.AimTo(tmpPos).Pitch;
|
} else {
|
nextPoint = gPositionsArray[Line][Point + 1].Copy();
|
Slope = tmpPos.AimTo(nextPoint).Pitch;
|
}
|
|
return Slope;
|
}
|
//-------------
|
// JumpToPoint
|
function JumpToPoint(Line, Point) {
|
if (Line >= gNumLines) // Max/Min altitude/slope
|
return;
|
|
var nextPoint;
|
var nextSign;
|
|
if (Point >= gPointsArray[Line]) {
|
nextPoint = gPositionsArray[Line][Point - 1].Copy();
|
nextSign = 1;
|
} else {
|
nextPoint = gPositionsArray[Line][Point + 1].Copy();
|
nextSign = -1;
|
}
|
|
var jumpPos = gPositionsArray[Line][Point].Copy();
|
var tmpPos = gPositionsArray[Line][Point].Copy();
|
jumpPos.Distance = 250;
|
jumpPos.Pitch = -60;
|
jumpPos.Yaw = tmpPos.AimTo(nextPoint).Yaw + 90 * nextSign;
|
|
SGWorld.Navigate.JumpTo(jumpPos);
|
}
|
//-----------
|
// Create Layer
|
function CreateLayer() {
|
var cLineString = [];
|
for (var i = 0; i < gNumLines; i++) {
|
for (var j = 0; j < gPointsArray[i]; j++) {
|
cLineString.push(gPositionsArray[i][j].X, gPositionsArray[i][j].Y, gPositionsArray[i][j].Altitude);
|
DrawObject(gPositionsArray[i][j], i, j);
|
}
|
if (isPolyline) {
|
DrawPolyline(cLineString, i);
|
cLineString = [];
|
}
|
}
|
gLayer.Save();
|
if (gFollowLineGroup != "0" && gActionType != "3") {
|
var groupID = SGWorld.ProjectTree.CreateGroup(gLayer.TreeItem.Name, "");
|
SGWorld.ProjectTree.SetParent(gLayer.ID, groupID);
|
//SGWorld.ProjectTree.SetParent(gFollowLineGroup, groupID);
|
}
|
|
$("#CreateLayerButton").attr("disabled", true);
|
}
|
//---------------
|
function DrawObject(position, i, j) {
|
var ObjType;
|
var LayerColor;
|
if (isPolyline)
|
ObjType = "Polyline";
|
else ObjType = "ImageLabel";
|
|
LayerColor = LayerColorFunction(i);
|
|
var size = -2;
|
|
if (gLayer == null) {
|
CreateGroupOrLayer();
|
|
// style the feature group
|
if (featureLayerStyles[ObjType] != null) {
|
var result = featureLayerStyles[ObjType](size, abspath() + "/img/point.gif"); // ,"[Color]");
|
if (result === false)
|
return false;
|
}
|
}
|
try {
|
if (!isPolyline)
|
gLayer.FeatureGroups.Point.CreateFeature([position.X, position.Y, position.Altitude], (i + 1) + ";" + Altitude + ";" + LayerColor);
|
} catch (ex) {
|
alert(ex);
|
}
|
|
return true;
|
|
}
|
|
// --------------
|
function DrawPolyline(cLineString, i) {
|
layerColor = LayerColorFunction(i);
|
|
try {
|
var cLineStringGeometry = SGWorld.Creator.GeometryCreator.CreateLineStringGeometry(cLineString);
|
gLayer.FeatureGroups.Polyline.CreateFeature(cLineStringGeometry, gGroundDistance[i] + ";" + gHorizontalDistance[i] + ";" + layerColor);
|
} catch (err) {
|
alert(err.description);
|
}
|
}
|
|
// ------------
|
function LayerColorFunction(i) {
|
if (i < 10)
|
return gColorArray2[i];
|
else
|
return (255 + 0 * 256 + 0 * 65536); // red
|
|
}
|
|
//----------
|
// CreateGroupOrLayer
|
function CreateGroupOrLayer() {
|
|
|
if (gLayer == null) {
|
var postfix = new Date().getTime();
|
var LayerName = SGLang.i18n("Text13") + " - " + postfix;
|
if (isPolyline) {
|
gLayer = SGWorld.Creator.CreateNewFeatureLayer(LayerName, LayerGeometryType.LGT_POLYLINE, "FileName=TerrainProfile" + postfix + ".shp;TEPlugName=OGR;", SGWorld.ProjectTree.RootID);
|
} else
|
gLayer = SGWorld.Creator.CreateNewFeatureLayer(LayerName, LayerGeometryType.LGT_POINT, "FileName=TerrainProfile" + postfix + ".shp;TEPlugName=OGR;", SGWorld.ProjectTree.RootID);
|
gLayer.Streaming = $("#createAs").val() == "LayerStreaming";
|
gLayer.BlockWidth = gSpacing * 60;
|
gLayer.Refresh();
|
if (isPolyline) {
|
gLayer.DataSourceInfo.Attributes.CreateAttribute(SGLang.i18n("Text54"), 2, 20, 2); // Ground Distance = Total Slope
|
gLayer.DataSourceInfo.Attributes.CreateAttribute(SGLang.i18n("Text55"), 2, 20, 2); // Total Horizontal
|
} else {
|
gLayer.DataSourceInfo.Attributes.CreateAttribute(SGLang.i18n("Text44"), 1, 20, 1); // Line
|
gLayer.DataSourceInfo.Attributes.CreateAttribute(SGLang.i18n("Text45"), 2, 20, 1); // Elevation
|
}
|
gLayer.DataSourceInfo.Attributes.CreateAttribute(SGLang.i18n("Text46"), 1, 20, 0); // Color
|
try {
|
gLayer.DataSourceInfo.Attributes.ImportAll = true;
|
gLayer.Visibility.MaxVisibilityDistance = gVisibilityDistance;
|
} catch (err) {
|
alert(err);
|
}
|
// style the feature group
|
if (isPolyline)
|
gLayer.FeatureGroups.Polyline.DisplayAs = ObjectTypeCode.OT_POLYLINE;
|
else gLayer.FeatureGroups.Point.DisplayAs = ObjectTypeCode.OT_LABEL;
|
|
}
|
|
}
|
var featureLayerStyles = {
|
|
"ImageLabel": function(size, param) {
|
gLayer.FeatureGroups.Point.DisplayAs = ObjectTypeCode.OT_IMAGE_LABEL;
|
gLayer.FeatureGroups.Point.SetProperty("Image file", param)
|
gLayer.FeatureGroups.Point.SetProperty("Image Color", "[" + SGLang.i18n("Text46") + "]")
|
gLayer.FeatureGroups.Point.SetProperty("Scale", size);
|
gLayer.FeatureGroups.Point.SetProperty("Altitude Method", 1);
|
gLayer.FeatureGroups.Point.SetProperty("Limit growth", true);
|
gLayer.FeatureGroups.Point.SetProperty("Tool Tip", SGLang.i18n("Text45") + ": [" + SGLang.i18n("Text45") + "]");
|
},
|
"Polyline": function(size) {
|
gLayer.FeatureGroups.Polyline.SetProperty("Line Color", "[" + SGLang.i18n("Text46") + "]");
|
gLayer.FeatureGroups.Polyline.SetProperty("Altitude Method", 1);
|
gLayer.FeatureGroups.Polyline.SetProperty("Line Width", size);
|
}
|
}
|
|
|
//---------------
|
// ValidateInput
|
function ValidateInput() {
|
return true;
|
}
|
//--------------
|
// CheckNumberEx
|
function CheckNumberEx(field, defVal, MinNum, MaxNum) {
|
try {
|
field.value = validateNumber(field.value);
|
|
if (field.value < MinNum)
|
field.value = MinNum;
|
if (field.value > MaxNum)
|
field.value = MaxNum;
|
} catch (e) {
|
field.value = defVal
|
}
|
}
|
|
function GetFunctionName(node) {
|
var getFunctionNameNode = SGWorld.ProjectTree.GetNextItem(node, 11);
|
while (getFunctionNameNode != "") {
|
if (SGWorld.ProjectTree.IsGroup(getFunctionNameNode) || SGWorld.ProjectTree.IsLayer(getFunctionNameNode))
|
GetFunctionName(getFunctionNameNode);
|
else {
|
var Object = SGWorld.Creator.GetObject(getFunctionNameNode);
|
if (Object != null)
|
if (Object.ObjectType == 1 || Object.ObjectType == 2) {
|
gObjectName[objectNameIndex] = SGWorld.ProjectTree.GetItemName(getFunctionNameNode);
|
objectNameIndex++;
|
}
|
}
|
getFunctionNameNode = SGWorld.ProjectTree.GetNextItem(getFunctionNameNode, 13);
|
}
|
}
|
</script>
|
|
</body>
|
|
</html>
|
|
|
|
<!--Sig:00000040PhETNRh43B2OOaBwhC7aEkjOYSfHLKGg0IBK80Mf4YFGLZJx9bjMRRGx7vIwhbRub3Yc2ssmR4S8L.PfaFKdXLJJ-->
|