diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp index ffc286590837b87defa10ac9c183092dd185f372..ff525ff98eda9eb834dfabb2f6bdfcd42ddb019b 100644 --- a/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp +++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.cpp @@ -7,6 +7,15 @@ #include <Inventor/nodes/SoUnits.h> #include <thread> + +#include <Inventor/actions/SoWriteAction.h> +#include <Inventor/actions/SoToVRML2Action.h> +#include <Inventor/VRMLnodes/SoVRMLGroup.h> +#include <Inventor/nodes/SoRotation.h> +#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h> +#include <VirtualRobot/Visualization/VisualizationFactory.h> + + #include "VisualizationRobot.h" namespace armarx::viz @@ -416,4 +425,37 @@ namespace armarx::viz } } } + + void CoinVisualizer::exportToVRML(const std::string& s) + { + + + SoOutput* so = new SoOutput(); + if (!so->openFile(s.c_str())) + { + ARMARX_ERROR << "Could not open file " << s << " for writing." << std::endl; + return; + } + + so->setHeaderString("#VRML V2.0 utf8"); + + SoGroup* n = new SoGroup; + n->ref(); + n->addChild(root); + SoGroup* newVisu = VirtualRobot::CoinVisualizationFactory::convertSoFileChildren(n); + newVisu->ref(); + + SoToVRML2Action tovrml2; + tovrml2.apply(newVisu); + SoVRMLGroup* newroot = tovrml2.getVRML2SceneGraph(); + newroot->ref(); + SoWriteAction wra(so); + wra.apply(newroot); + newroot->unref(); + + so->closeFile(); + + newVisu->unref(); + n->unref(); + } } diff --git a/source/RobotAPI/components/ArViz/Coin/Visualizer.h b/source/RobotAPI/components/ArViz/Coin/Visualizer.h index f3a2248254821f96067f16a6306b02141a1438a6..e2d9a4634d5f1747174c125292a33233699dceda 100644 --- a/source/RobotAPI/components/ArViz/Coin/Visualizer.h +++ b/source/RobotAPI/components/ArViz/Coin/Visualizer.h @@ -129,6 +129,8 @@ namespace armarx::viz void update(); + void exportToVRML(const std::string& s); + template <typename ElementVisuT> void registerVisualizerFor() { diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui index b5dc5e5dd125a004758a383ad4c431517bd3f1d2..f5bb28f2f794200a6af845cfb107587149929d35 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidget.ui @@ -99,6 +99,30 @@ </column> </widget> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_12"> + <item> + <spacer name="horizontalSpacer_7"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="exportToVRMLButton"> + <property name="text"> + <string>Export To VRML</string> + </property> + </widget> + </item> + </layout> + </item> </layout> </item> <item> diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp index 697ce64b02e1a3f5c3896406f430a8144db202e3..cf42b9ff2bb4d42f04a6067f08803ea6ac69f873 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.cpp @@ -34,6 +34,10 @@ #include <ArmarXCore/observers/variant/Variant.h> + +#include <QFileDialog> +#include <boost/algorithm/string/predicate.hpp> + #define ENABLE_INTROSPECTION 1 @@ -89,6 +93,8 @@ namespace armarx connect(widget.replayStopButton, &QPushButton::clicked, this, &This::onReplayStop); connect(widget.replayTimedButton, &QPushButton::toggled, this, &This::onReplayTimedStart); + connect(widget.exportToVRMLButton, &QPushButton::clicked, this, &This::exportToVRML); + connect(this, &This::connectGui, this, &This::onConnectGui, Qt::QueuedConnection); connect(this, &This::disconnectGui, this, &This::onDisconnectGui, Qt::QueuedConnection); @@ -989,4 +995,23 @@ namespace armarx debugObserverName = configDialog->getProxyName(CONFIG_KEY_DEBUG_OBSERVER); } } + + + void ArVizWidgetController::exportToVRML() + { + + QString fi = QFileDialog::getSaveFileName(Q_NULLPTR, tr("VRML 2.0 File"), QString(), tr("VRML Files (*.wrl)")); + std::string s = std::string(fi.toLatin1()); + + if (s.empty()) + { + return; + } + if (!boost::algorithm::ends_with(s, ".wrl")) + { + s += ".wrl"; + } + + visualizer.exportToVRML(s); + } } diff --git a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h index 4e9c887def80f19350373070799b456dca75d2db..e59b685797f5e8ee4b56220c9c5070109e50a140 100644 --- a/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h +++ b/source/RobotAPI/gui-plugins/ArViz/ArVizWidgetController.h @@ -162,6 +162,7 @@ namespace armarx long getRevisionForTimestamp(long timestamp); void onReplayTimedStart(bool checked); void onReplayTimerTick(); + void exportToVRML(); void changeMode(ArVizWidgetMode newMode); void enableWidgetAccordingToMode();