Skip to content
Snippets Groups Projects
Commit 51057492 authored by Raphael Grimm's avatar Raphael Grimm
Browse files

Merge remote-tracking branch 'origin/master' into Ice3.7

parents c36d59d5 6e4a9bba
No related branches found
No related tags found
No related merge requests found
......@@ -7,20 +7,92 @@
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
<height>94</height>
</rect>
</property>
<property name="windowTitle">
<string>DebugDrawerViewerWidget</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QComboBox" name="comboClearLayer">
<property name="toolTip">
<string>Select a layer to clear</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnClearLayer">
<property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="toolTip">
<string>Clear the selected layer</string>
</property>
<property name="text">
<string>Clear Layer</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="btnClearAll">
<property name="toolTip">
<string>Clear all layers</string>
</property>
<property name="text">
<string>Remove All Visualizations</string>
<string>Clear All Layers</string>
</property>
</widget>
</item>
<item row="0" column="0">
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="2" column="0">
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<resources/>
......
......@@ -19,35 +19,37 @@
* \copyright http://www.gnu.org/licenses/gpl-2.0.txt
* GNU General Public License
*/
#include "DebugDrawerViewerWidgetController.h"
#include <ArmarXCore/core/ArmarXManager.h>
#include <QTimer>
#include <string>
using namespace armarx;
DebugDrawerViewerWidgetController::DebugDrawerViewerWidgetController()
{
rootVisu = NULL;
rootVisu = nullptr;
widget.setupUi(getWidget());
}
DebugDrawerViewerWidgetController::~DebugDrawerViewerWidgetController()
{
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateComboClearLayer()));
timer->start(100);
}
void DebugDrawerViewerWidgetController::loadSettings(QSettings* settings)
{
(void) settings; // unused
}
void DebugDrawerViewerWidgetController::saveSettings(QSettings* settings)
{
(void) settings; // unused
}
......@@ -59,6 +61,7 @@ void DebugDrawerViewerWidgetController::onInitComponent()
enableMainWidgetAsync(false);
connect(widget.btnClearAll, SIGNAL(clicked()), this, SLOT(on_btnClearAll_clicked()), Qt::UniqueConnection);
connect(widget.btnClearLayer, SIGNAL(clicked()), this, SLOT(on_btnClearLayer_clicked()), Qt::UniqueConnection);
}
......@@ -89,28 +92,195 @@ void DebugDrawerViewerWidgetController::onConnectComponent()
enableMainWidgetAsync(true);
}
SoNode* DebugDrawerViewerWidgetController::getScene()
{
return rootVisu;
}
void armarx::DebugDrawerViewerWidgetController::onExitComponent()
{
if (rootVisu)
{
rootVisu->removeAllChildren();
rootVisu->unref();
rootVisu = NULL;
rootVisu = nullptr;
}
}
SoNode* DebugDrawerViewerWidgetController::getScene()
{
return rootVisu;
}
void armarx::DebugDrawerViewerWidgetController::on_btnClearAll_clicked()
{
ARMARX_INFO << "Clearing visu";
if (debugDrawer)
{
ARMARX_INFO << "Clearing all visualization layers";
debugDrawer->clearAll();
}
}
void DebugDrawerViewerWidgetController::on_btnClearLayer_clicked()
{
if (debugDrawer)
{
int index = widget.comboClearLayer->currentIndex();
std::string layerName = widget.comboClearLayer->itemData(index).toString().toStdString();
if (!layerName.empty())
{
ARMARX_INFO << "Clearing layer: '" << layerName << "'";
debugDrawer->clearLayer(layerName);
}
}
}
void DebugDrawerViewerWidgetController::updateComboClearLayer()
{
QComboBox* combo = widget.comboClearLayer;
auto setItalic = [combo](bool italic)
{
QFont font = combo->font();
font.setItalic(italic);
combo->setFont(font);
};
auto disableButton = [combo, this, &setItalic](const std::string & hint)
{
QString itemText(hint.c_str());
QString itemData("");
setItalic(true);
if (combo->count() != 1)
{
combo->clear();
combo->insertItem(0, itemText, itemData);
}
else
{
combo->setItemText(0, itemText);
combo->setItemData(0, itemData);
}
this->widget.btnClearLayer->setEnabled(false);
};
if (!debugDrawer)
{
disableButton("not connected");
return;
}
// fetch layer information
LayerInformationSequence layers = debugDrawer->layerInformation();
if (layers.empty())
{
disableButton("no layers");
return;
}
else
{
setItalic(false);
this->widget.btnClearLayer->setEnabled(true);
}
// sort the layers by name
std::sort(layers.begin(), layers.end(), [](const LayerInformation & lhs, const LayerInformation & rhs)
{
// compare case insensitively
for (std::size_t i = 0; i < lhs.layerName.size() && i < lhs.layerName.size(); ++i)
{
auto lhsLow = std::tolower(lhs.layerName[i]);
auto rhsLow = std::tolower(rhs.layerName[i]);
if (lhsLow < rhsLow)
{
return true;
}
else if (lhsLow > rhsLow)
{
return false;
}
}
// if one is a prefix of the other, the shorter one "smaller"
return lhs.layerName.size() < rhs.layerName.size();
});
const int numLayers = static_cast<int>(layers.size());
for (int i = 0; i < numLayers; ++i)
{
const LayerInformation& layer = layers[static_cast<std::size_t>(i)];
QString layerName(layer.layerName.c_str());
if (i < combo->count()) // in range
{
QString itemData = combo->itemData(i).toString();
// remove deleted layers
while (itemData.size() != 0 && itemData < layerName)
{
// item layer is smaller than next layer
// => item layer was deleted
combo->removeItem(i);
itemData = i < combo->count() ? combo->itemData(i).toString() : "";
}
// update existing layer
if (itemData == layerName)
{
combo->setItemText(i, makeLayerItemText(layer));
}
else // (itemData > layerName)
{
// item layer is further down than current layer
// => insert current layer here
combo->insertItem(i, makeLayerItemText(layer), layerName);
}
}
else // out of range
{
combo->insertItem(i, makeLayerItemText(layer), layerName);
}
// check invariant
ARMARX_CHECK_EQUAL(combo->itemData(i).toString(), layerName);
}
// remove excessive items
while (combo->count() > numLayers)
{
combo->removeItem(combo->count() - 1);
}
}
QString DebugDrawerViewerWidgetController::makeLayerItemText(const LayerInformation& layer)
{
std::vector<std::string> annotations;
if (layer.elementCount == 0)
{
annotations.push_back("empty");
}
if (!layer.visible)
{
annotations.push_back("hidden");
}
if (annotations.empty())
{
return { layer.layerName.c_str() };
}
else
{
std::stringstream itemText;
itemText << layer.layerName
<< " (" << boost::algorithm::join(annotations, ", ") << ")";
return { itemText.str().c_str() };
}
}
......@@ -31,6 +31,7 @@
#include <ArmarXCore/core/system/ImportExportComponent.h>
namespace armarx
{
/**
......@@ -51,30 +52,23 @@ namespace armarx
* Detailed description
*/
class ARMARXCOMPONENT_IMPORT_EXPORT
DebugDrawerViewerWidgetController:
DebugDrawerViewerWidgetController :
public ArmarXComponentWidgetControllerTemplate<DebugDrawerViewerWidgetController>
{
Q_OBJECT
public:
/**
* Controller Constructor
*/
/// Controller Constructor
explicit DebugDrawerViewerWidgetController();
/**
* Controller destructor
*/
~DebugDrawerViewerWidgetController() override;
/// Controller destructor
virtual ~DebugDrawerViewerWidgetController() override = default;
/**
* @see ArmarXWidgetController::loadSettings()
*/
/// @see ArmarXWidgetController::loadSettings()
void loadSettings(QSettings* settings) override;
/**
* @see ArmarXWidgetController::saveSettings()
*/
/// @see ArmarXWidgetController::saveSettings()
void saveSettings(QSettings* settings) override;
/**
......@@ -86,39 +80,54 @@ namespace armarx
return "Visualization.DebugDrawerViewer";
}
/**
* \see armarx::Component::onInitComponent()
*/
/// @see armarx::Component::onInitComponent()
void onInitComponent() override;
/**
* \see armarx::Component::onConnectComponent()
*/
/// @see armarx::Component::onConnectComponent()
void onConnectComponent() override;
void onExitComponent() override;
public slots:
/* QT slot declarations */
signals:
/* QT signal declarations */
private slots:
/// Clear all layers.
void on_btnClearAll_clicked();
/// Clear the selected layer.
void on_btnClearLayer_clicked();
/// Fetch the layer information and update the combo box items.
void updateComboClearLayer();
private:
/**
* Widget Form
*/
/// Make an item text for a layer entry in the clear layer combo box.
static QString makeLayerItemText(const LayerInformation& layer);
private:
/// Widget Form
Ui::DebugDrawerViewerWidget widget;
/// The debug drawer.
armarx::DebugDrawerComponentPtr debugDrawer;
SoSeparator* rootVisu;
// ArmarXWidgetController interface
public:
SoNode* getScene() override;
private slots:
void on_btnClearAll_clicked();
// ArmarXWidgetController interface
public:
static QIcon GetWidgetIcon()
......
......@@ -11,13 +11,14 @@ find_package(MMMTools QUIET)
armarx_build_if(Eigen3_FOUND "Eigen3 not available")
armarx_build_if(Simox_FOUND "Simox-VirtualRobot not available")
armarx_build_if(DMP_FOUND "DMP not available")
if (Eigen3_FOUND AND Simox_FOUND)
include_directories(${Simox_INCLUDE_DIRS})
include_directories(SYSTEM ${Eigen3_INCLUDE_DIR})
endif()
set(LIBS RobotAPIInterfaces ArmarXCoreObservers ArmarXCoreStatechart ArmarXCoreEigen3Variants
VirtualRobot
Saba
......@@ -33,7 +34,6 @@ set(LIB_HEADERS
)
if (DMP_FOUND )
message(STATUS "DMP libraries is ${DMP_LIBRARIES}")
include_directories(${DMP_INCLUDE_DIRS})
......@@ -61,7 +61,6 @@ if (DMP_FOUND )
)
list(APPEND LIBS ${DMP_LIBRARIES} DMPController)
endif ()
armarx_add_library("${LIB_NAME}" "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}")
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment