From 5795d552f1543a140e7835000e9ec852f0a6ac98 Mon Sep 17 00:00:00 2001
From: Lars Bilke <lars.bilke@ufz.de>
Date: Wed, 14 Nov 2012 16:04:12 +0100
Subject: [PATCH] Fbx export is working in the gui.

---
 Gui/CMakeLists.txt                |  5 ++++
 Gui/DataExplorer.cmake            |  4 +++
 Gui/VtkVis/VtkVisPipelineItem.cpp | 42 +++++++++++++++++++++++++++++++
 Gui/VtkVis/VtkVisPipelineView.cpp | 25 ++++++++++++++++++
 Gui/VtkVis/VtkVisPipelineView.h   |  5 ++++
 Gui/main.cpp                      | 12 +++++++++
 Gui/mainwindow.cpp                |  2 +-
 ThirdParty/CMakeLists.txt         |  7 ++++++
 scripts/cmake/ProjectSetup.cmake  |  4 ++-
 9 files changed, 104 insertions(+), 2 deletions(-)

diff --git a/Gui/CMakeLists.txt b/Gui/CMakeLists.txt
index eaa14c95138..457b4679edc 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 9286cce52eb..aeb46fb1154 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 aae33aea245..7d6684d06c3 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 f8eafc0b6af..37cd300877d 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 c3d6870b811..958c3a1e08c 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 9f95e98abd3..a8c40cec051 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 5fb72930215..e38ffd0e3b1 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 25d27330e51..db423b9c620 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 b6a44fd9348..d7b47c118f7 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
-- 
GitLab