Description
Object Model
Public
Properties
Depth |
Gets the depth of the
picked location in the 3D scene. |
Objects |
Gets a collection of
objects that were on the pick stack for the picked object. |
Position |
Gets the position of the
picked location in the central body's fixed reference frame. The
array contains the components of the position arranged in the order
x, y, z. |
Example
Change a model's
color on mouse over
| [C#] |
Copy Code
|
//
// Get a collection of picked objects under the mouse location.
// The collection is sorted with the closest object at index zero.
//
IAgStkGraphicsPickResultCollection collection = scene.Pick(mouseX, mouseY);
if (collection.Count != 0)
{
IAgStkGraphicsObjectCollection objects = collection[0].Objects;
IAgStkGraphicsCompositePrimitive composite = objects[0] as IAgStkGraphicsCompositePrimitive;
//
// Was a model in our composite picked?
//
if (composite == m_Models)
{
IAgStkGraphicsPrimitive model = objects[1] as IAgStkGraphicsPrimitive;
//
// Selected Model
//
model.Color = Color.Cyan;
if (model != m_SelectedModel)
{
//
// Unselect previous model
//
if (m_SelectedModel != null)
{
m_SelectedModel.Color = Color.Red;
}
m_SelectedModel = model;
scene.Render();
}
return;
}
}
//
// Unselect previous model
//
if (m_SelectedModel != null)
{
m_SelectedModel.Color = Color.Red;
m_SelectedModel = null;
scene.Render();
}
|
|
Zoom to a particular
marker in a batch
| [C#] |
Copy Code
|
Array selectedMarkerCartesianPosition = null;
//
// Get a collection of picked objects under the mouse location.
// The collection is sorted with the closest object at index zero.
//
IAgStkGraphicsPickResultCollection collection = scene.Pick(mouseX, mouseY);
if (collection.Count != 0)
{
IAgStkGraphicsObjectCollection objects = collection[0].Objects;
IAgStkGraphicsMarkerBatchPrimitive batchPrimitive = objects[0] as IAgStkGraphicsMarkerBatchPrimitive;
//
// Was a marker in our marker batch picked?
//
if (batchPrimitive == m_MarkerBatch)
{
//
// Get the index of the particular marker we picked
//
IAgStkGraphicsBatchPrimitiveIndex markerIndex = objects[1] as IAgStkGraphicsBatchPrimitiveIndex;
//
// Get the position of the particular marker we picked
//
Array markerCartographic = markerPositions[markerIndex.Index];
IAgPosition markerPosition = root.ConversionUtility.NewPositionOnEarth();
markerPosition.AssignPlanetodetic(
(double)markerCartographic.GetValue(0),
(double)markerCartographic.GetValue(1),
(double)markerCartographic.GetValue(2));
double x, y, z;
markerPosition.QueryCartesian(out x, out y, out z);
selectedMarkerCartesianPosition = new object[] { x, y, z };
}
}
IAgStkGraphicsSceneManager manager = ((IAgScenario)root.CurrentScenario).SceneManager;
IList<Array> positions = new List<Array>();
positions.Add(new object[] {39.88, -75.25, 3000.0 });
positions.Add(new object[] {38.85, -77.04, 3000.0 });
positions.Add(new object[] {38.85, -77.04, 0.0 });
positions.Add(new object[] {29.98, -90.25, 0.0 });
positions.Add(new object[] {37.37, -121.92, 0.0 });
Array positionsArray = Array.CreateInstance(typeof(object), positions.Count * 3);
for (int i = 0; i < positions.Count; ++i)
{
Array position = positions[i];
position.CopyTo(positionsArray, i * 3);
}
IAgStkGraphicsMarkerBatchPrimitive markerBatch = manager.Initializers.MarkerBatchPrimitive.Initialize();
markerBatch.Texture = manager.Textures.LoadFromStringUri(
markerFile);
markerBatch.SetCartographic("Earth", ref positionsArray);
// Save the positions of the markers for use in the pick event
markerPositions = positions;
// Enable per item picking
markerBatch.PerItemPickingEnabled = true;
manager.Primitives.Add((IAgStkGraphicsPrimitive)markerBatch);
|
|
Change model colors
within a rectangular region
| [C#] |
Copy Code
|
IAgStkGraphicsSceneManager manager = ((IAgScenario)root.CurrentScenario).SceneManager;
//
// Get a collection of picked objects in a 100 by 100 rectangular region.
// The collection is sorted with the closest object at index zero.
//
List<IAgStkGraphicsModelPrimitive> newModels = new List<IAgStkGraphicsModelPrimitive>();
IAgStkGraphicsPickResultCollection collection = scene.PickRectangular(mouseX - 50, mouseY + 50, mouseX + 50, mouseY - 50);
foreach (IAgStkGraphicsPickResult pickResult in collection)
{
IAgStkGraphicsObjectCollection objects = pickResult.Objects;
IAgStkGraphicsCompositePrimitive composite = objects[0] as IAgStkGraphicsCompositePrimitive;
//
// Was a model in our composite picked?
//
if (composite == m_Models)
{
IAgStkGraphicsModelPrimitive model = objects[1] as IAgStkGraphicsModelPrimitive;
//
// Selected Model
//
((IAgStkGraphicsPrimitive)model).Color = Color.Cyan;
newModels.Add(model);
}
}
//
// Reset color of models that were previous selected but were not in this pick.
//
foreach (IAgStkGraphicsModelPrimitive selectedModel in SelectedModels)
{
if (!newModels.Contains(selectedModel))
{
((IAgStkGraphicsPrimitive)selectedModel).Color = Color.Red;
}
}
SelectedModels = newModels;
manager.Render();
|
|
Zoom to a model on
double click
| [C#] |
Copy Code
|
IAgStkGraphicsPrimitive selectedModel = null;
//
// Get a collection of picked objects under the mouse location.
// The collection is sorted with the closest object at index zero.
//
IAgStkGraphicsPickResultCollection collection = scene.Pick(mouseX, mouseY);
if (collection.Count != 0)
{
IAgStkGraphicsObjectCollection objects = collection[0].Objects;
IAgStkGraphicsCompositePrimitive composite = objects[0] as IAgStkGraphicsCompositePrimitive;
//
// Was a model in our composite picked?
//
if (composite == m_Models)
{
selectedModel = objects[1] as IAgStkGraphicsPrimitive;
}
}
|
|
Change a model's
color on mouse over
| [Visual Basic .NET] |
Copy Code
|
Dim
collection As
IAgStkGraphicsPickResultCollection = scene.Pick(mouseX, mouseY)
If collection.Count <> 0
Then
Dim objects
As IAgStkGraphicsObjectCollection =
collection(0).Objects
Dim composite
As IAgStkGraphicsCompositePrimitive =
TryCast(objects(0), IAgStkGraphicsCompositePrimitive)
If
composite Is m_Models Then
Dim
model As IAgStkGraphicsPrimitive =
TryCast(objects(1), IAgStkGraphicsPrimitive)
model.Color
= Color.Cyan
If
model IsNot m_SelectedModel Then
If
m_SelectedModel IsNot Nothing
Then
m_SelectedModel.Color
= Color.Red
End
If
m_SelectedModel
= model
scene.Render()
End
If
Return
End
If
End If
If m_SelectedModel IsNot Nothing Then
m_SelectedModel.Color
= Color.Red
m_SelectedModel = Nothing
scene.Render()
|
|
Zoom to a particular
marker in a batch
| [Visual Basic .NET] |
Copy Code
|
Dim
selectedMarkerCartesianPosition As
Array = Nothing
Dim collection As IAgStkGraphicsPickResultCollection =
scene.Pick(mouseX, mouseY)
If collection.Count <> 0
Then
Dim objects
As IAgStkGraphicsObjectCollection =
collection(0).Objects
Dim
batchPrimitive As
IAgStkGraphicsMarkerBatchPrimitive = TryCast(objects(0),
IAgStkGraphicsMarkerBatchPrimitive)
If
batchPrimitive Is m_MarkerBatch
Then
Dim markerIndex As
IAgStkGraphicsBatchPrimitiveIndex = TryCast(objects(1),
IAgStkGraphicsBatchPrimitiveIndex)
Dim markerCartographic As Array =
markerPositions(markerIndex.Index)
Dim markerPosition As
IAgPosition = root.ConversionUtility.NewPositionOnEarth()
markerPosition.AssignPlanetodetic(CDbl(markerCartographic.GetValue(0)),
CDbl(markerCartographic.GetValue(1)),
CDbl(markerCartographic.GetValue(2)))
Dim x As Double, y As
Double, z As Double
markerPosition.QueryCartesian(x,
y, z)
selectedMarkerCartesianPosition
= New Object() {x, y, z}
End
If
End If
Dim manager As IAgStkGraphicsSceneManager =
DirectCast(root.CurrentScenario, IAgScenario).SceneManager
Dim positions As IList(Of Array) =
New List(Of Array)()
positions.Add(New Object() {39.88, -75.25, 3000.0})
positions.Add(New Object() {38.85, -77.04, 3000.0})
positions.Add(New Object() {38.85, -77.04, 0.0})
positions.Add(New Object() {29.98, -90.25, 0.0})
positions.Add(New Object() {37.37, -121.92, 0.0})
Dim positionsArray As Array =
Array.CreateInstance(GetType(Object), positions.Count * 3)
For i As
Integer = 0 To positions.Count - 1
Dim position
As Array
= positions(i)
position.CopyTo(positionsArray, i * 3)
Next
Dim markerBatch As IAgStkGraphicsMarkerBatchPrimitive =
manager.Initializers.MarkerBatchPrimitive.Initialize()
markerBatch.Texture = manager.Textures.LoadFromStringUri( _
markerFile)
markerBatch.SetCartographic("Earth",
positionsArray)
markerPositions = positions
markerBatch.PerItemPickingEnabled = True
manager.Primitives.Add(DirectCast(markerBatch,
IAgStkGraphicsPrimitive))
|
|
Change model colors
within a rectangular region
| [Visual Basic .NET] |
Copy Code
|
Dim
manager As IAgStkGraphicsSceneManager
= DirectCast(root.CurrentScenario, IAgScenario).SceneManager
Dim newModels As New List(Of
IAgStkGraphicsModelPrimitive)()
Dim collection As IAgStkGraphicsPickResultCollection =
scene.PickRectangular(mouseX - 50, mouseY + 50, mouseX + 50, mouseY
- 50)
For Each
pickResult As IAgStkGraphicsPickResult
In collection
Dim objects
As IAgStkGraphicsObjectCollection =
pickResult.Objects
Dim composite
As IAgStkGraphicsCompositePrimitive =
TryCast(objects(0), IAgStkGraphicsCompositePrimitive)
If composite
Is m_Models Then
Dim model As
IAgStkGraphicsModelPrimitive = TryCast(objects(1),
IAgStkGraphicsModelPrimitive)
DirectCast(model,
IAgStkGraphicsPrimitive).Color = Color.Cyan
newModels.Add(model)
End
If
Next
For Each
selectedModel As
IAgStkGraphicsModelPrimitive In
SelectedModels
If
Not newModels.Contains(selectedModel)
Then
DirectCast(selectedModel,
IAgStkGraphicsPrimitive).Color = Color.Red
End
If
Next
SelectedModels = newModels
|
|
Zoom to a model on
double click
| [Visual Basic .NET] |
Copy Code
|
Dim
selectedModel As
IAgStkGraphicsPrimitive = Nothing
Dim collection As IAgStkGraphicsPickResultCollection =
scene.Pick(mouseX, mouseY)
If collection.Count <> 0
Then
Dim objects
As IAgStkGraphicsObjectCollection =
collection(0).Objects
Dim composite
As IAgStkGraphicsCompositePrimitive =
TryCast(objects(0), IAgStkGraphicsCompositePrimitive)
If composite
Is m_Models Then
selectedModel =
TryCast(objects(1), IAgStkGraphicsPrimitive)
End
If
|
|
See Also