VR-Forces 4.1.1 Class Documentation
Unit Status Widget Logic

The class DtUnitStatusLogic class is repsonsible for displaying information about the currently selected entity


Header file:

/*******************************************************************************
** Copyright (c) 2011 MAK Technologies, Inc.
** All rights reserved.
*******************************************************************************/
//\file DtUnitStatusLogic.h
//\brief Contains makVrfUnitStatusExample::DtUnitStatusLogic class.
namespace makVrv
{
class DtDe;
class DtWindowEllipseAgent;
}
namespace makVrfUnitStatusExample
{
class DtUnitStatusInterface;
class CircleVisualHandler;
class DtUnitStatusLogic
{
public:
//\brief Constructor (protected - use ::create() )
DtUnitStatusLogic(makVrv::DtDe& de, DtUnitStatusInterface* iFace );
//\brief virtual DTOR
virtual ~DtUnitStatusLogic();
protected:
virtual void resetUpdateRate();
virtual void updateLocation(const DtVector&);
virtual void updateVelocity(const DtVector& v);
virtual void updateAcceleration(const DtVector& a);
virtual void updateOrientation(const DtTaitBryan& o);
virtual CircleVisualHandler * createCircleVisualizer();
protected:
DtUnitStatusInterface* myInterface;
CircleVisualHandler * myCircleVisualizer;
};
}

Implementation:

/*******************************************************************************
** Copyright (c) 2011 MAK Technologies, Inc.
** All rights reserved.
*******************************************************************************/
//\file DtUnitStatusLogic.cxx
//\brief Contains DtUnitStatusLogic class.
//VR-Vantage includes
#include <vrvCore/DtWindowEllipseAgent.hpp>
//VR-Link includes
#include <vlpi/appearance.h>
#include <vlpi/entityType.h>
//Qt includes
#include <QtGui/QPixmap>
//std includes
#include <stdio.h>
using namespace makVrv;
using namespace makVrf;
namespace makVrfUnitStatusExample
{
DtUnitStatusLogic::DtUnitStatusLogic(DtDe& de, DtUnitStatusInterface* iFace )
: myDe(de)
, myInterface(iFace)
, mySimEntry(0)
, myIsDestroyed(false)
, myCircleVisualizer(0)
{
DtSelectionManager::instance(de).signal_currentSelectionChanged.connect(boost::bind(
&DtUnitStatusLogic::slot_onCurrentSelectionChanged, this, _1, _2));
DtDisplayUnitsSettingsSignaler::instance(myDe.mainEventQueue());
signaler.signal_displayUnitChanged.connect(
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
}
DtUnitStatusLogic::~DtUnitStatusLogic()
{
DtSelectionManager::instance(myDe).signal_currentSelectionChanged.disconnect(boost::bind(
&DtUnitStatusLogic::slot_onCurrentSelectionChanged, this, _1, _2));
DtDisplayUnitsSettingsSignaler::instance(myDe.mainEventQueue());
signaler.signal_displayUnitChanged.disconnect(
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
signaler.signal_displayUnitDecimalsChanged.disconnect(
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
boost::bind(&DtUnitStatusLogic::displayUnitSettingsChanged, this));
if ( myCircleVisualizer )
{
delete myCircleVisualizer;
myCircleVisualizer = 0;
}
resetUpdateRate();
}
void DtUnitStatusLogic::slot_onCurrentSelectionChanged(
const DtSelectionManager::IdSet& selected,
const DtSelectionManager::IdSet& deselected)
{
delete myCircleVisualizer;
myCircleVisualizer = 0;
if (!selected.size())
{
resetUpdateRate();
mySimEntry = 0;
myKey = "";
myInterface->clear();
}
else
{
DtSelectionManager::IdSet::const_iterator iter = selected.begin();
DtVrfStateViewCollectionManager& manager = DtVrfStateViewCollectionManager::instance(myDe);
DtUniqueID id = manager.simIdFromDisplayId(*iter);
DtSimEntry* entry = myDe.dataBank().simData().findSimEntry(id);
if (!entry)
{
myInterface->clear();
resetUpdateRate();
}
else
{
resetUpdateRate();
myKey = "";
if (stateView)
{
entry->setUpdateRate(DtSimEntryUpdater::At2Hz, stateView);
stateView->signal_stateViewUpdated.connect(boost::bind(&DtUnitStatusLogic::slot_onStateViewUpdated, this, _1));
mySimEntry = entry;
}
else
{
myInterface->clear();
}
}
}
}
bool DtUnitStatusLogic::isDestroyed(DtStateView<DtVrlinkSimulatedEntityState>* s) const
{
DtAppearance app(DtEntityType(view->myEntityType.c_str()));
app.setAppearance(view->myAppearance);
return (app.damageState() == DtDamageDestroyed);
}
void DtUnitStatusLogic::slot_onStateViewUpdated(DtStateView<DtVrlinkSimulatedEntityState>* s)
{
if (myDe.destructing())
{
return;
}
DtEntityType type(s->state().myEntityType.c_str());
DtEntityMapperKey key(s->state().myForce, type.kind(), type.domain(), type.country(), type.category(),
type.subCategory(), type.specific(), type.extra());
bool destroyed = isDestroyed(s);
if ((key.string() != myKey.string()) || (myIsDestroyed != destroyed))
{
myKey = key;
myIsDestroyed = destroyed;
QPixmap pmap = DtVrfGuiSymbolMapper::instance(myDe).getIcon(myKey, myIsDestroyed);
myInterface->setIcon(pmap);
}
myInterface->setUnitName(s->state().myMarkingText);
if ( !myCircleVisualizer )
{
myCircleVisualizer = createCircleVisualizer();
myCircleVisualizer->init();
}
updateMarkingText(s);
updateLocation(s->state().myLocation);
updateVelocity(s->state().myVelocity);
updateAcceleration(s->state().myAcceleration);
updateOrientation(s->state().myOrientation);
}
void DtUnitStatusLogic::updateMarkingText(DtStateView<DtVrlinkSimulatedEntityState>* s)
{
DtVrfStateViewCollectionManager::instance(myDe).objectDataStateViewCollection()->findStateView(s->id()));
if (stateView)
{
myInterface->setMarkingText(stateView->state().myEchelonIdString.c_str());
}
}
void DtUnitStatusLogic::updateVelocity(const DtVector& v)
{
QString velocity = DtDisplayUnitsSettingsManager::instance(myDe).converter().
convertVelocityUnitNativeToDisplayString(v).c_str();
myInterface->setVelocity(velocity);
}
void DtUnitStatusLogic::updateAcceleration(const DtVector& a)
{
QString acceleration = DtDisplayUnitsSettingsManager::instance(myDe).converter().
convertAccelerationUnitNativeToDisplayString(a).c_str();
myInterface->setAcceleration(acceleration);
}
void DtUnitStatusLogic::updateOrientation(const DtTaitBryan& o)
{
std::vector<std::string> strings =
DtDisplayUnitsSettingsManager::instance(myDe).converter().
convertOrientationUnitNativeToDisplayStrings(o);
QString orientation = strings[0].c_str();
orientation += ", ";
orientation += strings[1].c_str();
orientation += ", ";
orientation += strings[2].c_str();
myInterface->setHeading(orientation);
}
void DtUnitStatusLogic::updateLocation(const DtVector& geoc)
{
//Draw circle
if ( myCircleVisualizer )
{
myCircleVisualizer->update(geoc);
}
myInterface->setLocation(DtDisplayUnitsSettingsManager::instance(myDe).converter().
convertPositionToStringList(geoc));
}
void DtUnitStatusLogic::resetUpdateRate()
{
DtVrfStateViewCollectionManager& manager = DtVrfStateViewCollectionManager::instance(myDe);
if (mySimEntry)
{
manager.simulatedEntityStateViewCollection()->findStateView(mySimEntry->id()));
if (stateView)
{
mySimEntry->setUpdateRate(DtSimEntryUpdater::NoUpdates, stateView);
stateView->signal_stateViewUpdated.disconnect(boost::bind(&DtUnitStatusLogic::slot_onStateViewUpdated, this, _1));
}
}
}
void DtUnitStatusLogic::displayUnitSettingsChanged()
{
DtVrfStateViewCollectionManager::instance(myDe);
if (mySimEntry)
{
manager.simulatedEntityStateViewCollection()->findStateView(mySimEntry->id()));
slot_onStateViewUpdated(stateView);
}
}
CircleVisualHandler * DtUnitStatusLogic::createCircleVisualizer()
{
//Now we need to create a visualizer handler to represent the visual object in the scene
//This is where you add things you'd like to be drawn in the scene,ie on the GUI
CircleVisualHandler * visualHandler = new CircleVisualHandler(myDe, myDe.agentManager().createNewUniqueId());
return visualHandler;
}
}

Document ID: Generated on Mon Apr 8 19:24:01 EDT 2013 from SVN revision 125877
Copyright © 2005-2013 VT MÄK. All Rights Reserved (www.mak.com)