osgEarth 2.1.1
|
#include <osg/Notify>
#include <osgGA/StateSetManipulator>
#include <osgGA/GUIEventHandler>
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgEarth/MapNode>
#include <osgEarth/XmlUtils>
#include <osgEarthUtil/EarthManipulator>
#include <osgEarthUtil/AutoClipPlaneHandler>
#include <osgEarthUtil/Controls>
#include <osgEarthUtil/Graticule>
#include <osgEarthUtil/SkyNode>
#include <osgEarthUtil/Viewpoint>
#include <osgEarthSymbology/Color>
#include <osgEarthUtil/MeasureTool>
Go to the source code of this file.
Classes | |
class | MyMeasureToolCallback |
struct | TogglePathHandler |
struct | ToggleModeHandler |
Functions | |
int | main (int argc, char **argv) |
int main | ( | int | argc, |
char ** | argv | ||
) |
Definition at line 94 of file osgearth_measure.cpp.
{ osg::ArgumentParser arguments(&argc,argv); osg::DisplaySettings::instance()->setMinimumNumStencilBits( 8 ); // load the .earth file from the command line. osg::Node* earthNode = osgDB::readNodeFiles( arguments ); if (!earthNode) { OE_NOTICE << "Unable to load earth model." << std::endl; return 1; } MapNode* mapNode = MapNode::findMapNode( earthNode ); if ( !mapNode ) { OE_NOTICE << "Input file was not a .earth file" << std::endl; return 1; } earthNode->setNodeMask( 0x1 ); osgViewer::Viewer viewer(arguments); osgEarth::Util::EarthManipulator* earthManip = new EarthManipulator(); viewer.setCameraManipulator( earthManip ); osg::Group* root = new osg::Group(); root->addChild( earthNode ); //Create the MeasureToolHandler MeasureToolHandler* measureTool = new MeasureToolHandler(root, mapNode); measureTool->setIntersectionMask( 0x1 ); viewer.addEventHandler( measureTool ); //Create some controls to interact with the measuretool ControlCanvas* canvas = new ControlCanvas( &viewer ); root->addChild( canvas ); canvas->setNodeMask( 0x1 << 1 ); Grid* grid = new Grid(); grid->setBackColor(0,0,0,0.5); grid->setMargin( 10 ); grid->setPadding( 10 ); grid->setChildSpacing( 10 ); grid->setChildVertAlign( Control::ALIGN_CENTER ); grid->setAbsorbEvents( true ); grid->setVertAlign( Control::ALIGN_BOTTOM ); grid->setFrame(new RoundedFrame()); canvas->addControl( grid ); //Add a label to display the distance // Add a text label: LabelControl* label = new LabelControl(); label->setFont( osgText::readFontFile( "arialbd.ttf" ) ); label->setFontSize( 24.0f ); label->setHorizAlign( Control::ALIGN_LEFT ); label->setText("Distance"); grid->setControl( 0, 0, label); //Add a callback to update the label when the distance changes measureTool->addEventHandler( new MyMeasureToolCallback(label) ); Style style; style.getOrCreate<LineSymbol>()->stroke()->color() = Color::Yellow; measureTool->setLineStyle(style); //Add a checkbox to control if we are doing path based measurement or just point to point grid->setControl( 0, 1, new LabelControl("Path")); CheckBoxControl* checkBox = new CheckBoxControl(false); checkBox->setHorizAlign(Control::ALIGN_LEFT); checkBox->addEventHandler( new TogglePathHandler(measureTool)); grid->setControl( 1, 1, checkBox); //Add a toggle to set the mode of the measuring tool grid->setControl( 0, 2, new LabelControl("Great Circle")); CheckBoxControl* mode = new CheckBoxControl(true); mode->setHorizAlign(Control::ALIGN_LEFT); mode->addEventHandler( new ToggleModeHandler(measureTool)); grid->setControl( 1, 2, mode); viewer.setSceneData( root ); // add some stock OSG handlers: viewer.addEventHandler(new osgViewer::StatsHandler()); viewer.addEventHandler(new osgViewer::WindowSizeHandler()); viewer.addEventHandler(new osgViewer::ThreadingHandler()); viewer.addEventHandler(new osgViewer::LODScaleHandler()); viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet())); viewer.addEventHandler(new osgViewer::HelpHandler(arguments.getApplicationUsage())); return viewer.run(); }