diff --git a/Gui/CMakeLists.txt b/Gui/CMakeLists.txt index eaa14c95138f323c6bf84f94618a4967821e4728..457b4679edcca1430c278f82b92a498a48cdf656 100644 --- a/Gui/CMakeLists.txt +++ b/Gui/CMakeLists.txt @@ -5,6 +5,11 @@ INCLUDE( ${VTK_USE_FILE} ) SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /ZI /Od /Ob0") +IF(VTKFBXCONVERTER_FOUND) + ADD_DEFINITIONS(-DVTKFBXCONVERTER_FOUND) + INCLUDE_DIRECTORIES(${VTKFBXCONVERTER_INCLUDE_DIRS}) +ENDIF() + # Add subprojects ADD_SUBDIRECTORY( Base ) ADD_SUBDIRECTORY( DataView/StratView ) diff --git a/Gui/DataExplorer.cmake b/Gui/DataExplorer.cmake index 9286cce52ebe4542bf4cfcdef61c125f7d000cce..aeb46fb1154b9f2de0bd8344c2691d3f60264580 100644 --- a/Gui/DataExplorer.cmake +++ b/Gui/DataExplorer.cmake @@ -124,6 +124,10 @@ IF (OGS_USE_OPENSG) TARGET_LINK_LIBRARIES( ogs-gui OgsOpenSG ) ENDIF (OGS_USE_OPENSG) +IF(VTKFBXCONVERTER_FOUND) + TARGET_LINK_LIBRARIES(ogs-gui ${VTKFBXCONVERTER_LIBRARIES}) +ENDIF() + IF(OGS_USE_VRPN) INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR}/Gui/Vrpn ${CMAKE_BINARY_DIR}/Gui/Vrpn ) TARGET_LINK_LIBRARIES( ogs-gui ${VRPN_LIBRARIES} OgsVrpn ) diff --git a/Gui/VtkVis/VtkVisPipelineItem.cpp b/Gui/VtkVis/VtkVisPipelineItem.cpp index aae33aea245f2aff8a311eb277e580f00d0fa305..7d6684d06c3ae7b3ac67599648e023d8a6b49226 100644 --- a/Gui/VtkVis/VtkVisPipelineItem.cpp +++ b/Gui/VtkVis/VtkVisPipelineItem.cpp @@ -35,6 +35,16 @@ #include <OpenSG/OSGSceneFileHandler.h> #endif +#ifdef VTKFBXCONVERTER_FOUND +#include "ThirdParty/VtkFbxConverter/VtkFbxConverter.h" +#include "Common.h" +#include <fbxsdk.h> + + +extern FbxManager* lSdkManager; +extern FbxScene* lScene; +#endif + VtkVisPipelineItem::VtkVisPipelineItem( vtkAlgorithm* algorithm, TreeItem* parentItem, const QList<QVariant> data /*= QList<QVariant>()*/) @@ -126,6 +136,38 @@ int VtkVisPipelineItem::writeToFile(const std::string &filename) const #endif return 0; } +#ifdef VTKFBXCONVERTER_FOUND + else if (filename.substr(filename.size() - 4).find("fbx") != std::string::npos) + { + if(!dynamic_cast<vtkImageActor*>(_actor)) + { + bool lResult; + InitializeSdkObjects(lSdkManager, lScene); + + VtkFbxConverter fbxConverter(static_cast<vtkActor*>(_actor), lScene); + fbxConverter.convert(filename.c_str()); + fbxConverter.convertZUpAxis(); + FbxNode* node = fbxConverter.getNode(); + if(node) + { + lScene->GetRootNode()->AddChild(node); + // Get the file format. Use either "FBX [6.0] binary (*.fbx)" or "FBX [6.0] ascii (*.fbx)" + int fbxFormat = lSdkManager->GetIOPluginRegistry() + ->FindWriterIDByDescription("FBX 6.0 binary (*.fbx)"); + // Embed only works in "FBX 6.0 binary (*.fbx)" + const bool fbxEmbed = true; + SaveScene(lSdkManager, lScene, filename.c_str(), fbxFormat, fbxEmbed); + lScene->Clear(); + } + } + else + QMessageBox::warning(NULL, "Conversion to FBX not possible", + "It is not possible to convert an vtkImageData based object \ + to OpenSG. If you want to convert raster data import it via \" \ + File / Import / Raster Files as PolyData\"!"); + return 0; + } +#endif // VTKFBXCONVERTER_FOUND return callVTKWriter(this->algorithm(), filename); } diff --git a/Gui/VtkVis/VtkVisPipelineView.cpp b/Gui/VtkVis/VtkVisPipelineView.cpp index f8eafc0b6af9a9dd98ff02bedfbeb26165d3fead..37cd300877d8fcc8aaded972fcf30ae5e64af2be 100644 --- a/Gui/VtkVis/VtkVisPipelineView.cpp +++ b/Gui/VtkVis/VtkVisPipelineView.cpp @@ -104,6 +104,9 @@ void VtkVisPipelineView::contextMenuEvent( QContextMenuEvent* event ) menu.addSeparator(); QAction* exportVtkAction = menu.addAction("Export as VTK"); QAction* exportOsgAction = menu.addAction("Export as OpenSG"); +#ifdef VTKFBXCONVERTER_FOUND + QAction* exportFbxAction = menu.addAction("Export as Fbx"); +#endif QAction* removeAction = NULL; if (!isSourceItem || vtkProps->IsRemovable()) { @@ -117,6 +120,10 @@ void VtkVisPipelineView::contextMenuEvent( QContextMenuEvent* event ) SLOT(exportSelectedPipelineItemAsVtk())); connect(exportOsgAction, SIGNAL(triggered()), this, SLOT(exportSelectedPipelineItemAsOsg())); +#ifdef VTKFBXCONVERTER_FOUND + connect(exportFbxAction, SIGNAL(triggered()), this, + SLOT(exportSelectedPipelineItemAsFbx())); +#endif menu.exec(event->globalPos()); } @@ -154,6 +161,24 @@ void VtkVisPipelineView::exportSelectedPipelineItemAsOsg() } } +#ifdef VTKFBXCONVERTER_FOUND +void VtkVisPipelineView::exportSelectedPipelineItemAsFbx() +{ + QSettings settings("UFZ", "OpenGeoSys-5"); + QModelIndex idx = this->selectionModel()->currentIndex(); + QString filename = QFileDialog::getSaveFileName(this, "Export object to Fbx file", + settings.value("lastExportedFileDirectory"). + toString(), "Fbx file (*.fbx)"); + if (!filename.isEmpty()) + { + static_cast<VtkVisPipelineItem*>(static_cast<VtkVisPipeline*>(this->model())-> + getItem(idx))->writeToFile(filename.toStdString()); + QDir dir = QDir(filename); + settings.setValue("lastExportedFileDirectory", dir.absolutePath()); + } +} +#endif // VTKFBXCONVERTER_FOUND + void VtkVisPipelineView::removeSelectedPipelineItem() { emit requestRemovePipelineItem(selectionModel()->currentIndex()); diff --git a/Gui/VtkVis/VtkVisPipelineView.h b/Gui/VtkVis/VtkVisPipelineView.h index c3d6870b811597de42f28c9215929241704cf678..958c3a1e08c3cffc4dcb8e3bed83fe9d6a30edaa 100644 --- a/Gui/VtkVis/VtkVisPipelineView.h +++ b/Gui/VtkVis/VtkVisPipelineView.h @@ -59,6 +59,11 @@ private slots: /// Exports the currently selected item as an OpenSG file void exportSelectedPipelineItemAsOsg(); +#ifdef VTKFBXCONVERTER_FOUND + /// Exports the currently selected item as a Fbx file. + void exportSelectedPipelineItemAsFbx(); +#endif // VTKFBXCONVERTER_FOUND + /// Sends an requestRemovePipelineItem() signal to remove /// the currently selected item. void removeSelectedPipelineItem(); diff --git a/Gui/main.cpp b/Gui/main.cpp index 9f95e98abd3516094c7d1a0ebf35da4b494a092b..a8c40cec051a7ab97ac038659fc880df4c5be5af 100644 --- a/Gui/main.cpp +++ b/Gui/main.cpp @@ -6,11 +6,20 @@ #endif #include "logog/include/logog.hpp" #include "LogogSimpleFormatter.h" +#ifdef VTKFBXCONVERTER_FOUND +#include <fbxsdk.h> +#include "Common.h" +FbxManager* lSdkManager = NULL; +FbxScene* lScene = NULL; +#endif int main(int argc, char* argv[]) { #ifdef OGS_USE_OPENSG OSG::osgInit(argc, argv); +#endif +#ifdef VTKFBXCONVERTER_FOUND + InitializeSdkObjects(lSdkManager, lScene); #endif LOGOG_INITIALIZE(); logog::Cout* logogCout = new logog::Cout; @@ -30,6 +39,9 @@ int main(int argc, char* argv[]) delete formatter; delete logogCout; LOGOG_SHUTDOWN(); +#ifdef VTKFBXCONVERTER_FOUND + DestroySdkObjects(lSdkManager); +#endif #ifdef OGS_USE_OPENSG OSG::osgExit(); #endif // OGS_USE_OPENSG diff --git a/Gui/mainwindow.cpp b/Gui/mainwindow.cpp index 5fb72930215901d88fd0f345109d6bfe6f69a1a5..e38ffd0e3b1a548f7517e6ef374513d8c661724a 100644 --- a/Gui/mainwindow.cpp +++ b/Gui/mainwindow.cpp @@ -735,7 +735,7 @@ QMenu* MainWindow::createImportFilesMenu() QAction* rasterFiles = importFiles->addAction("&Raster Files..."); connect(rasterFiles, SIGNAL(triggered()), _signal_mapper, SLOT(map())); _signal_mapper->setMapping(rasterFiles, ImportFileType::RASTER); -#ifdef OGS_USE_OPENSG +#if defined OGS_USE_OPENSG || defined VTKFBXCONVERTER_FOUND QAction* rasterPolyFiles = importFiles->addAction("R&aster Files as PolyData..."); connect(rasterPolyFiles, SIGNAL(triggered()), this, SLOT(map())); _signal_mapper->setMapping(rasterPolyFiles, ImportFileType::POLYRASTER); diff --git a/ThirdParty/CMakeLists.txt b/ThirdParty/CMakeLists.txt index 25d27330e5168e06a17405e8b5e2b5f02f69ee37..db423b9c620c6108e3d2fbefc5e99abb80dc53f3 100644 --- a/ThirdParty/CMakeLists.txt +++ b/ThirdParty/CMakeLists.txt @@ -9,3 +9,10 @@ SET_PROPERTY(TARGET test-logog PROPERTY FOLDER "logog") ADD_SUBDIRECTORY(zlib) ADD_SUBDIRECTORY(gtest) + +# VtkFbxConverter +#SET(VtkFbxConverter_DIR ${CMAKE_CURRENT_SOURCE_DIR}/VtkFbxConverter) +IF(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/VtkFbxConverter/CMakeLists.txt) + ADD_SUBDIRECTORY(VtkFbxConverter) + SET(VTKFBXCONVERTER_FOUND ON CACHE BOOL "Is the VtkFbxConverter submodule checked out?") +ENDIF() \ No newline at end of file diff --git a/scripts/cmake/ProjectSetup.cmake b/scripts/cmake/ProjectSetup.cmake index b6a44fd93486e19a8664d97b407a9cdf0b1f8ef7..d7b47c118f7081185e1d5a22d813de9fe3c545e1 100644 --- a/scripts/cmake/ProjectSetup.cmake +++ b/scripts/cmake/ProjectSetup.cmake @@ -18,4 +18,6 @@ ELSE() ENDIF() # NOT DEFINED OGS_LOG_LEVEL # Enable Visual Studio project folder grouping -SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) \ No newline at end of file +SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON) + +INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR} ) \ No newline at end of file