By using this example, you will learn:
- How to add menu items into the system
- How to subclass an existing visualizer and add your own functionality to it
- How to create an entity to visualizer from a visualizer set
- How to place an entity into the scene
The code fragments are from exampleVisualDefinitionSetPluginInit.cxx code.
- Register the menu items and indicator visualizer to display with the entity
void postInitialize(DtDe& de)
{
de.signal_preTick.disconnect(boost::bind(&postInitialize, _1));
DtStateVisualizerFactory::instance(de).addStateVisualizerCreator(de,
}
{
DtQtMenuAssembler::instance(de).registerMenu(new DtExampleMenu(de));
if(igApp)
{
DtQtMenuAssembler::instance(de).registerMenu(new DtExampleMenu(de));
DtQtMenuAssembler::instance(de).registerMenu(new DtCreateObjectMenuItem(de));
- Implement the functionality to create the entity from visualizers
void DtCreateObjectMenuItem::on_triggered()
- Create the indicator visualizer to display the information about the associated entity.
Building the Example
VR-Vantage includes pre-built versions of the example plug-in. To build it yourself, follow the instructions at Building VR-Vantage Examples, Applications, and Plug-ins.
Running the Example
This example is a plug-in. You can run it by running ./bin/exampleVisualDefinitionSet_stealth.bat (on Windows) or ./bin/exampleVisualDefinitionSet_stealth.sh (on Linux). For more information about running examples, please see Running Applications and Examples.
Example Source Files
DtExampleIndicatorVisualizer.cxx
#include <boost/bind.hpp>
#include <matrix/geodCoord.h>
#include <stdio.h>
namespace makVrv
{
namespace vrvExampleVisualDefinitionSetPlugin
{
: DtEntityIndicatorVisualizer(simulation, listener, modelSet)
, myEntityListener(dynamic_cast<DtEntityStateListener*>(&listener))
{
myConnections.manageConnection(
myEntityListener->signal_velocitySet.connect(boost::bind(&DtExampleIndicatorVisualizer::setUpdateInfo,this, true)));
myConnections.manageConnection(
myEntityListener->signal_locationSet.connect(boost::bind(&DtExampleIndicatorVisualizer::setUpdateInfo,this, true)));
myConnections.manageConnection(
myEntityListener->signal_orientationSet.connect(boost::bind(&DtExampleIndicatorVisualizer::setUpdateInfo,this, true)));
}
DtExampleIndicatorVisualizer::~DtExampleIndicatorVisualizer()
{
}
void DtExampleIndicatorVisualizer::setUpdateInfo(bool b)
{
DtEntityIndicatorVisualizer::setUpdateInfo(b);
postUpdate();
}
DtUnicode DtExampleIndicatorVisualizer::generateInfoString() const
{
const char* entityFormatString =
"Speed :%.2f m/s\n"
"Heading :%.2f Deg\n"
"Location(x, y, z) :%.3f, %.3f, %.1f m above sea level\n";
std::string buffer;
buffer.resize(1024,'0');
int charsWritten = sprintf(const_cast<char*>(buffer.c_str()),entityFormatString,
sqrtf((float)myEntityListener->velocity().magnitudeSquared()),
DtRad2Deg(myEntityListener->orientation().psi()),
myEntityListener->location().x(), myEntityListener->location().y(), myEntityListener->location().z()
);
buffer.resize(charsWritten,'0');
return DtUnicode::fromAscii(buffer);
}
}
}
DtExampleIndicatorVisualizer.h
#ifndef DtExampleIndicatorVisualizer_H_
#define DtExampleIndicatorVisualizer_H_
namespace makVrv
{
class DtEntityStateListener;
namespace vrvExampleVisualDefinitionSetPlugin
{
class DtExampleIndicatorVisualizer : public DtEntityIndicatorVisualizer
{
public:
protected:
protected:
};
}
}
#endif
exampleVisualDefinitionSetPluginInit.cxx
{
return true;
}
namespace makVrv
{
namespace vrvExampleVisualDefinitionSetPlugin
{
void postInitialize(DtDe& de)
{
de.signal_preTick.disconnect(boost::bind(&postInitialize, _1));
}
{
if(igApp)
{
de.signal_preTick.connect(boost::bind(postInitialize, _1));
}
}
}
}
DtExampleMenu.cxx
#include <vlpi/entityType.h>
#include <QtGui/QMenu>
namespace makVrv
{
: DtMenu(de, std::string("DtExampleMenu"))
{
}
DtExampleMenu::~DtExampleMenu()
{
}
{
QMenu* menu =
new QMenu(QMenu::tr(
"&Examples"),parent);
return menu;
}
DtCreateObjectMenuItem::DtCreateObjectMenuItem(DtDe& de)
: DtMenuItem(std::string("DtCreateObjectMenuItem"))
, myDe(de)
{
myRandomNumberGenerator.setSeed(time(0));
}
DtCreateObjectMenuItem::~DtCreateObjectMenuItem()
{
}
void DtCreateObjectMenuItem::on_aboutToShow()
{
myAction->setEnabled(myDe.scene().terrain().terrainPatches().size() != 0);
}
QAction* DtCreateObjectMenuItem::createAction( DtDe&,
QWidget* parent )
{
myAction->setText(DtMenuItem::tr("&Create"));
return myAction;
}
const DtUnicode* DtCreateObjectMenuItem::chooseRandomString(const std::vector<DtUnicode>& definitions)
{
size_t s = definitions.size();
if(s == 0)
{
return 0;
}
else if(s == 1)
{
return &(definitions.front());
}
else
{
int index = myRandomNumberGenerator.generate(0,s-1);
return &(definitions[index]);
}
}
DtUnicode DtCreateObjectMenuItem::modelDefFromVisualSet( const DtVisualizerDefinitionSet& set )
{
std::vector<const DtVisualizerDefinition*> defs;
set.findVisualizerDefinitions(DtBuiltInSchemas::theDtModelSchema().name(),defs);
if(defs.size() == 0)
{
return DtUnicode();
}
const DtVisualizerDefinition* visDef = defs.front();
if ( visDef )
{
const DtVisualizerAttribute* attr = visDef->findAttribute("modeldefinition");
const DtVisualizerAttributeStringVector* multiDefs = dynamic_cast<const DtVisualizerAttributeStringVector*>(attr);
if (multiDefs)
{
const DtUnicode* modelDefinition = chooseRandomString(multiDefs->value());
if(modelDefinition)
{
return *modelDefinition;
}
}
else
{
const DtVisualizerAttributeString* singleDef = dynamic_cast<const DtVisualizerAttributeString*>(attr);
if (singleDef)
{
return singleDef->value();
}
}
}
return DtUnicode();
}
void DtCreateObjectMenuItem::on_triggered()
{
}
}
DtExampleMenu.h
#pragma once
namespace makVrv
{
class DtVisualizerDefinitionSet;
{
public:
DtExampleMenu(DtDe& de);
virtual ~DtExampleMenu();
};
public DtMenuItem
{
public:
DtCreateObjectMenuItem(DtDe& de);
virtual ~DtCreateObjectMenuItem();
virtual void on_triggered();
virtual void on_aboutToShow();
protected:
DtUnicode modelDefFromVisualSet( const DtVisualizerDefinitionSet& set );
const DtUnicode* chooseRandomString(const std::vector<DtUnicode>& definitions);
protected:
DtDe& myDe;
DtRandomNumberGenerator myRandomNumberGenerator;
};
}