00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <wx/stopwatch.h>
00013 #include "iostl.h"
00014 #include "stlparser.h"
00015 #include "stlwriter.h"
00016
00017 using namespace VRUT;
00018
00019
00020 IOStlModule::IOStlModule(const MODULE_ID & _id, const wxString & _name, EventHandler * msgSink)
00021 : IOModule(_id, _name, 0, msgSink)
00022 {
00023 saveBinary = true;
00024 REGISTER_PARAM_GUI_CHECKBOX(saveBinaryParamID, wxT("saveBinary"), wxT("1"), wxT("Use binary format for saving."));
00025 recomputeNormals = true;
00026 REGISTER_PARAM_GUI_CHECKBOX(recomputeNormalsParamID, wxT("recomputeNormals"), wxT("1"), wxT("Recompute normals on import."));
00027 }
00028
00029
00030 IOStlModule::~IOStlModule()
00031 {
00032 }
00033
00034
00035 wxString IOStlModule::GetDesc() const
00036 {
00037 return wxT("Import and export STL files");
00038 }
00039
00040
00041 wxString IOStlModule::GetSupportedExts() const
00042 {
00043 return wxT("STL");
00044 }
00045
00046
00047 void IOStlModule::processEvent(wxCommandEvent & evt)
00048 {
00049 IOModule::processEvent(evt);
00050 switch (evt.GetEventType())
00051 {
00052 case Event::EVT_PARAM_SET:
00053 UPDATE_PARAM_FROM_EVENT_BOOL(saveBinaryParamID, saveBinary, evt);
00054 UPDATE_PARAM_FROM_EVENT_BOOL(recomputeNormalsParamID, recomputeNormals, evt);
00055 break;
00056 default:
00057 break;
00058 }
00059 }
00060
00061
00062 bool IOStlModule::ImportScene(const wxString & fname, SCENE_ID _sceneID, const wxString & rootUid)
00063 {
00064 wxStopWatch sw;
00065 bool ret = false;
00066 wxInputStream * is = GetInputStream(fname);
00067 if (is)
00068 {
00069
00070 STLParser stlParser(is, _sceneID, fname, this);
00071 ret = stlParser.Parse(rootUid, recomputeNormals);
00072 delete is;
00073 }
00074 LOG(wxString::Format(wxT("<IOStlModule>Scene parsed in %.3f secs, ID %i"), 0.001f * sw.Time(), _sceneID));
00075 wxCommandEvent ev = Event::GET_EVT_IO_SCENE_IMPORT_DONE(_sceneID);
00076 PostToKernel(ev);
00077 return ret;
00078 }
00079
00080
00081 bool IOStlModule::ExportScene(const wxString & fname, const Scene * scene)
00082 {
00083 wxOutputStream * sceneStream = new wxFileOutputStream(fname);
00084 if (sceneStream && sceneStream->IsOk())
00085 {
00086 wxBufferedOutputStream *sceneStream2=new wxBufferedOutputStream(*sceneStream);
00087 STLWriter stlWriter(sceneStream2, scene);
00088 stlWriter.Write(saveBinary);
00089 sceneStream2->Sync();
00090 SAFE_DELETE(sceneStream);
00091 return true;
00092 }
00093 SAFE_DELETE(sceneStream);
00094 return false;
00095 }