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 @@ ...@@ -7,20 +7,92 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>400</width> <width>400</width>
<height>300</height> <height>94</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>DebugDrawerViewerWidget</string> <string>DebugDrawerViewerWidget</string>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <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"> <widget class="QPushButton" name="btnClearAll">
<property name="toolTip">
<string>Clear all layers</string>
</property>
<property name="text"> <property name="text">
<string>Remove All Visualizations</string> <string>Clear All Layers</string>
</property> </property>
</widget> </widget>
</item> </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> </layout>
</widget> </widget>
<resources/> <resources/>
......
...@@ -19,35 +19,37 @@ ...@@ -19,35 +19,37 @@
* \copyright http://www.gnu.org/licenses/gpl-2.0.txt * \copyright http://www.gnu.org/licenses/gpl-2.0.txt
* GNU General Public License * GNU General Public License
*/ */
#include "DebugDrawerViewerWidgetController.h" #include "DebugDrawerViewerWidgetController.h"
#include <ArmarXCore/core/ArmarXManager.h> #include <ArmarXCore/core/ArmarXManager.h>
#include <QTimer>
#include <string> #include <string>
using namespace armarx; using namespace armarx;
DebugDrawerViewerWidgetController::DebugDrawerViewerWidgetController() DebugDrawerViewerWidgetController::DebugDrawerViewerWidgetController()
{ {
rootVisu = NULL; rootVisu = nullptr;
widget.setupUi(getWidget()); widget.setupUi(getWidget());
} QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(updateComboClearLayer()));
timer->start(100);
DebugDrawerViewerWidgetController::~DebugDrawerViewerWidgetController()
{
} }
void DebugDrawerViewerWidgetController::loadSettings(QSettings* settings) void DebugDrawerViewerWidgetController::loadSettings(QSettings* settings)
{ {
(void) settings; // unused
} }
void DebugDrawerViewerWidgetController::saveSettings(QSettings* settings) void DebugDrawerViewerWidgetController::saveSettings(QSettings* settings)
{ {
(void) settings; // unused
} }
...@@ -59,6 +61,7 @@ void DebugDrawerViewerWidgetController::onInitComponent() ...@@ -59,6 +61,7 @@ void DebugDrawerViewerWidgetController::onInitComponent()
enableMainWidgetAsync(false); enableMainWidgetAsync(false);
connect(widget.btnClearAll, SIGNAL(clicked()), this, SLOT(on_btnClearAll_clicked()), Qt::UniqueConnection); 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() ...@@ -89,28 +92,195 @@ void DebugDrawerViewerWidgetController::onConnectComponent()
enableMainWidgetAsync(true); enableMainWidgetAsync(true);
} }
SoNode* DebugDrawerViewerWidgetController::getScene()
{
return rootVisu;
}
void armarx::DebugDrawerViewerWidgetController::onExitComponent() void armarx::DebugDrawerViewerWidgetController::onExitComponent()
{ {
if (rootVisu) if (rootVisu)
{ {
rootVisu->removeAllChildren(); rootVisu->removeAllChildren();
rootVisu->unref(); rootVisu->unref();
rootVisu = NULL; rootVisu = nullptr;
} }
} }
SoNode* DebugDrawerViewerWidgetController::getScene()
{
return rootVisu;
}
void armarx::DebugDrawerViewerWidgetController::on_btnClearAll_clicked() void armarx::DebugDrawerViewerWidgetController::on_btnClearAll_clicked()
{ {
ARMARX_INFO << "Clearing visu";
if (debugDrawer) if (debugDrawer)
{ {
ARMARX_INFO << "Clearing all visualization layers";
debugDrawer->clearAll(); 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 @@ ...@@ -31,6 +31,7 @@
#include <ArmarXCore/core/system/ImportExportComponent.h> #include <ArmarXCore/core/system/ImportExportComponent.h>
namespace armarx namespace armarx
{ {
/** /**
...@@ -51,30 +52,23 @@ namespace armarx ...@@ -51,30 +52,23 @@ namespace armarx
* Detailed description * Detailed description
*/ */
class ARMARXCOMPONENT_IMPORT_EXPORT class ARMARXCOMPONENT_IMPORT_EXPORT
DebugDrawerViewerWidgetController: DebugDrawerViewerWidgetController :
public ArmarXComponentWidgetControllerTemplate<DebugDrawerViewerWidgetController> public ArmarXComponentWidgetControllerTemplate<DebugDrawerViewerWidgetController>
{ {
Q_OBJECT Q_OBJECT
public: public:
/**
* Controller Constructor /// Controller Constructor
*/
explicit DebugDrawerViewerWidgetController(); explicit DebugDrawerViewerWidgetController();
/** /// Controller destructor
* Controller destructor virtual ~DebugDrawerViewerWidgetController() override = default;
*/
~DebugDrawerViewerWidgetController() override;
/** /// @see ArmarXWidgetController::loadSettings()
* @see ArmarXWidgetController::loadSettings()
*/
void loadSettings(QSettings* settings) override; void loadSettings(QSettings* settings) override;
/** /// @see ArmarXWidgetController::saveSettings()
* @see ArmarXWidgetController::saveSettings()
*/
void saveSettings(QSettings* settings) override; void saveSettings(QSettings* settings) override;
/** /**
...@@ -86,39 +80,54 @@ namespace armarx ...@@ -86,39 +80,54 @@ namespace armarx
return "Visualization.DebugDrawerViewer"; return "Visualization.DebugDrawerViewer";
} }
/** /// @see armarx::Component::onInitComponent()
* \see armarx::Component::onInitComponent()
*/
void onInitComponent() override; void onInitComponent() override;
/** /// @see armarx::Component::onConnectComponent()
* \see armarx::Component::onConnectComponent()
*/
void onConnectComponent() override; void onConnectComponent() override;
void onExitComponent() override; void onExitComponent() override;
public slots: public slots:
/* QT slot declarations */ /* QT slot declarations */
signals: signals:
/* QT signal declarations */ /* 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: 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; Ui::DebugDrawerViewerWidget widget;
/// The debug drawer.
armarx::DebugDrawerComponentPtr debugDrawer; armarx::DebugDrawerComponentPtr debugDrawer;
SoSeparator* rootVisu; SoSeparator* rootVisu;
// ArmarXWidgetController interface // ArmarXWidgetController interface
public: public:
SoNode* getScene() override; SoNode* getScene() override;
private slots:
void on_btnClearAll_clicked();
// ArmarXWidgetController interface // ArmarXWidgetController interface
public: public:
static QIcon GetWidgetIcon() static QIcon GetWidgetIcon()
......
...@@ -11,13 +11,14 @@ find_package(MMMTools QUIET) ...@@ -11,13 +11,14 @@ find_package(MMMTools QUIET)
armarx_build_if(Eigen3_FOUND "Eigen3 not available") armarx_build_if(Eigen3_FOUND "Eigen3 not available")
armarx_build_if(Simox_FOUND "Simox-VirtualRobot 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) if (Eigen3_FOUND AND Simox_FOUND)
include_directories(${Simox_INCLUDE_DIRS}) include_directories(${Simox_INCLUDE_DIRS})
include_directories(SYSTEM ${Eigen3_INCLUDE_DIR}) include_directories(SYSTEM ${Eigen3_INCLUDE_DIR})
endif() endif()
set(LIBS RobotAPIInterfaces ArmarXCoreObservers ArmarXCoreStatechart ArmarXCoreEigen3Variants set(LIBS RobotAPIInterfaces ArmarXCoreObservers ArmarXCoreStatechart ArmarXCoreEigen3Variants
VirtualRobot VirtualRobot
Saba Saba
...@@ -33,7 +34,6 @@ set(LIB_HEADERS ...@@ -33,7 +34,6 @@ set(LIB_HEADERS
) )
if (DMP_FOUND )
message(STATUS "DMP libraries is ${DMP_LIBRARIES}") message(STATUS "DMP libraries is ${DMP_LIBRARIES}")
include_directories(${DMP_INCLUDE_DIRS}) include_directories(${DMP_INCLUDE_DIRS})
...@@ -61,7 +61,6 @@ if (DMP_FOUND ) ...@@ -61,7 +61,6 @@ if (DMP_FOUND )
) )
list(APPEND LIBS ${DMP_LIBRARIES} DMPController) list(APPEND LIBS ${DMP_LIBRARIES} DMPController)
endif ()
armarx_add_library("${LIB_NAME}" "${LIB_FILES}" "${LIB_HEADERS}" "${LIBS}") 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