From 3d740c23254f4303a154577151b9200b1277a09e Mon Sep 17 00:00:00 2001 From: Felix de las Pozas Alvarez Date: Mon, 19 Aug 2019 23:20:05 +0200 Subject: [PATCH] Fix: contour crashing on new VTK version. Installer files. --- AxesRender.cpp | 6 +++++ CMakeLists.txt | 3 ++- ContourRepresentationGlyph.cpp | 9 ++++--- ContourWidget.cpp | 8 +++--- DataManager.cpp | 5 ++++ Editor.cpp | 10 +++----- EditorOperations.cpp | 18 +++++++++++--- EditorOperations.h | 5 ++++ EspinaVolumeEditor.cpp | 27 ++++++++++++++++++++ ProgressAccumulator.cpp | 9 ++++++- ProgressAccumulator.h | 5 ++++ QtAbout.ui | 2 +- Selection.cpp | 45 +++++++++++++++++++++------------- SliceVisualization.cpp | 37 +++++++++++++++++++++++++--- VoxelVolumeRender.cpp | 8 ++++-- VoxelVolumeRender.h | 2 +- installer/script.iss.in | 36 +++++++++++++++++++++++++++ readme.md | 8 +++--- 18 files changed, 196 insertions(+), 47 deletions(-) create mode 100644 installer/script.iss.in diff --git a/AxesRender.cpp b/AxesRender.cpp index e456638..570b6b5 100644 --- a/AxesRender.cpp +++ b/AxesRender.cpp @@ -48,6 +48,12 @@ AxesRender::~AxesRender() m_renderer->RemoveActor(m_planesActors[i]); m_renderer->RemoveActor(m_crossActors[i]); } + + m_crossActors.clear(); + m_planesActors.clear(); + m_POILines.clear(); + m_planes.clear(); + m_renderer = nullptr; } } diff --git a/CMakeLists.txt b/CMakeLists.txt index f7ae9a2..b082288 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,7 +6,7 @@ PROJECT(EspinaVolumeEditor) # Version Number set (ESPINAEDITOR_VERSION_MAJOR 2) set (ESPINAEDITOR_VERSION_MINOR 0) -set (ESPINAEDITOR_VERSION_PATCH 0) +set (ESPINAEDITOR_VERSION_PATCH 1) # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -32,6 +32,7 @@ endif (CMAKE_BUILD_TYPE MATCHES Debug) if(DEFINED MINGW) configure_file("${PROJECT_SOURCE_DIR}/EspinaEditor.rc.in" "${PROJECT_BINARY_DIR}/EspinaEditor.rc") + configure_file("${PROJECT_SOURCE_DIR}/installer/script.iss.in" "${PROJECT_BINARY_DIR}/script.iss") set(RC_FILE ${CMAKE_CURRENT_BINARY_DIR}/ESPINAEDITOR.rc) set(CMAKE_RC_COMPILE_OBJECT " -O coff -o -i ") enable_language(RC) diff --git a/ContourRepresentationGlyph.cpp b/ContourRepresentationGlyph.cpp index 334a210..cdc50be 100644 --- a/ContourRepresentationGlyph.cpp +++ b/ContourRepresentationGlyph.cpp @@ -153,12 +153,10 @@ ContourRepresentationGlyph::ContourRepresentationGlyph() this->Mapper->SetInputData(this->Glypher->GetOutput()); this->Mapper->SetResolveCoincidentTopologyToPolygonOffset(); this->Mapper->ScalarVisibilityOff(); - this->Mapper->ImmediateModeRenderingOn(); this->ActiveMapper->SetInputData(this->ActiveGlypher->GetOutput()); this->ActiveMapper->SetResolveCoincidentTopologyToPolygonOffset(); this->ActiveMapper->ScalarVisibilityOff(); - this->ActiveMapper->ImmediateModeRenderingOn(); // Set up the initial properties this->SetDefaultProperties(); @@ -231,6 +229,12 @@ void ContourRepresentationGlyph::SetRenderer(vtkRenderer *ren) /////////////////////////////////////////////////////////////////////////////////////////////////// int ContourRepresentationGlyph::ComputeInteractionState(int X, int Y, int vtkNotUsed(modified)) { + if(this->FocalPoint->GetNumberOfPoints() == 0) + { + this->InteractionState = ContourRepresentation::Outside; + return this->InteractionState; + } + double pos[4]; this->FocalPoint->GetPoint(0, pos); pos[3] = 1.0; @@ -921,7 +925,6 @@ void ContourRepresentationGlyph::CreateSelectedNodesRepresentation() this->SelectedNodesMapper->SetInputData(this->SelectedNodesGlypher->GetOutput()); this->SelectedNodesMapper->SetResolveCoincidentTopologyToPolygonOffset(); this->SelectedNodesMapper->ScalarVisibilityOff(); - this->SelectedNodesMapper->ImmediateModeRenderingOn(); auto selectionProperty = vtkSmartPointer::New(); selectionProperty->SetColor(0.0, 1.0, 0.0); diff --git a/ContourWidget.cpp b/ContourWidget.cpp index 9aed4e9..40c1bdd 100644 --- a/ContourWidget.cpp +++ b/ContourWidget.cpp @@ -152,7 +152,7 @@ void ContourWidget::SelectAction(vtkAbstractWidget *widget) auto Y = self->Interactor->GetEventPosition()[1]; self->WidgetRep->ComputeInteractionState(X, Y); - auto state = self->WidgetRep->GetInteractionState(); + auto state = rep->GetInteractionState(); self->SetCursor(state); double pos[2]{static_cast(X), static_cast(Y)}; @@ -218,12 +218,12 @@ void ContourWidget::SelectAction(vtkAbstractWidget *widget) if (pressedKeys & Qt::ShiftModifier) { self->DeleteAction(widget); - state = self->WidgetRep->GetInteractionState(); + state = rep->GetInteractionState(); self->SetCursor(state); break; } - if (self->WidgetRep->GetInteractionState() == ContourRepresentation::Inside) + if (rep->GetInteractionState() == ContourRepresentation::Inside) { self->TranslateContourAction(widget); break; @@ -252,6 +252,8 @@ void ContourWidget::SelectAction(vtkAbstractWidget *widget) } break; } + default: + break; } if (rep->GetNeedToRender()) diff --git a/DataManager.cpp b/DataManager.cpp index 7cb8bf0..284a523 100644 --- a/DataManager.cpp +++ b/DataManager.cpp @@ -135,6 +135,11 @@ DataManager::~DataManager() it.second = nullptr; } ActionInformationVector.clear(); + + m_labelMap = nullptr; + m_structuredPoints = nullptr; + m_lookupTable = nullptr; + } ////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Editor.cpp b/Editor.cpp index 2394a59..b841f1e 100644 --- a/Editor.cpp +++ b/Editor.cpp @@ -13,11 +13,9 @@ int main(int argc, char * argv[]) { - auto app = new QApplication(argc, argv); - auto editor = new EspinaVolumeEditor(app); + QApplication app(argc, argv); + EspinaVolumeEditor editor(&app); + editor.showMaximized(); - editor->showMaximized(); - app->exec(); - - delete editor; + return app.exec(); } diff --git a/EditorOperations.cpp b/EditorOperations.cpp index d7de0f8..edfc4db 100644 --- a/EditorOperations.cpp +++ b/EditorOperations.cpp @@ -51,7 +51,6 @@ #include #include #include -#include #include #include #include @@ -903,19 +902,21 @@ void EditorOperations::SetSliceViews(std::shared_ptr axial, std::shared_ptr coronal, std::shared_ptr sagittal) { - m_selection->setSliceViews(axial, coronal, sagittal); + if(m_selection) m_selection->setSliceViews(axial, coronal, sagittal); } /////////////////////////////////////////////////////////////////////////////////////////////////// void EditorOperations::ClearSelection(void) { - m_selection->clear(); + if(m_selection) m_selection->clear(); } /////////////////////////////////////////////////////////////////////////////////////////////////// Selection::Type EditorOperations::GetSelectionType(void) const { - return m_selection->type(); + if(m_selection) return m_selection->type(); + + return Selection::Type::EMPTY; } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -981,3 +982,12 @@ void EditorOperations::Erase(const std::set labels) m_dataManager->SignalDataAsModified(); } } + +/////////////////////////////////////////////////////////////////////////////////////////////////// +EditorOperations::~EditorOperations() +{ + m_orientation = nullptr; + m_dataManager = nullptr; + m_selection = nullptr; + m_progress = nullptr; +} diff --git a/EditorOperations.h b/EditorOperations.h index 19fcc74..382ac20 100644 --- a/EditorOperations.h +++ b/EditorOperations.h @@ -48,6 +48,11 @@ class EditorOperations */ explicit EditorOperations(std::shared_ptr dataManager); + /** \brief EditorOperations class destructor. + * + */ + ~EditorOperations(); + /** \brief Initializes the class. * \param[in] renderer view's renderer. * \param[in] coordinates image orientation data. diff --git a/EspinaVolumeEditor.cpp b/EspinaVolumeEditor.cpp index 4f56c8f..005f0ec 100644 --- a/EspinaVolumeEditor.cpp +++ b/EspinaVolumeEditor.cpp @@ -312,6 +312,31 @@ EspinaVolumeEditor::EspinaVolumeEditor(QApplication *app, QWidget *parent) EspinaVolumeEditor::~EspinaVolumeEditor() { removeSessionFiles(); + + m_dataManager = nullptr; + m_editorOperations = nullptr; + m_progress = nullptr; + + for(auto view: {m_axialRenderer, m_coronalRenderer, m_sagittalRenderer, m_volumeRenderer}) + { + vtkProp *actor = nullptr; + while(actor = view->GetViewProps()->GetNextProp()) + { + view->RemoveViewProp(actor); + } + } + + m_axesWidget = nullptr; + m_axialRenderer = nullptr; + m_coronalRenderer = nullptr; + m_sagittalRenderer = nullptr; + m_volumeRenderer = nullptr; + m_axesRender = nullptr; + m_axialView = nullptr; + m_coronalView = nullptr; + m_sagittalView = nullptr; + m_volumeView = nullptr; + m_connections = nullptr; } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -934,6 +959,8 @@ void EspinaVolumeEditor::save() /////////////////////////////////////////////////////////////////////////////////////////////////// void EspinaVolumeEditor::exit() { + if(m_editorOperations) m_editorOperations->ClearSelection(); + QApplication::exit(); } diff --git a/ProgressAccumulator.cpp b/ProgressAccumulator.cpp index 5a58ba9..ac16b76 100644 --- a/ProgressAccumulator.cpp +++ b/ProgressAccumulator.cpp @@ -53,7 +53,7 @@ void ProgressAccumulator::SetProgressBar(QProgressBar *bar) m_ITKCommand = ITKCommandType::New(); m_ITKCommand->SetCallbackFunction(this, &ProgressAccumulator::ITKProcessEvent); - m_VTKCommand = VTKCommandType::New(); + m_VTKCommand = vtkSmartPointer::New(); m_VTKCommand->SetCallback(&ProgressAccumulator::VTKProcessEvent); m_VTKCommand->SetClientData(this); @@ -281,3 +281,10 @@ void ProgressAccumulator::ManualReset(bool calledFromThread) QApplication::processEvents(QEventLoop::ExcludeUserInputEvents); } } + +/////////////////////////////////////////////////////////////////////////////////////////////////// +ProgressAccumulator::~ProgressAccumulator() +{ + m_ITKCommand = nullptr; + m_VTKCommand = nullptr; +} diff --git a/ProgressAccumulator.h b/ProgressAccumulator.h index 13a8b20..e432859 100644 --- a/ProgressAccumulator.h +++ b/ProgressAccumulator.h @@ -61,6 +61,11 @@ class ProgressAccumulator */ ProgressAccumulator(); + /** \brief ProgressAccumulator class destructor. + * + */ + ~ProgressAccumulator(); + /** \brief Sets the progress bar that this class will use. * \param[in] bar progress bar used by accumulator. * \param[in] label label of the bar. diff --git a/QtAbout.ui b/QtAbout.ui index a4b7cc6..2562ae4 100644 --- a/QtAbout.ui +++ b/QtAbout.ui @@ -59,7 +59,7 @@ - Espina Volume Editor 2.0.0 + Espina Volume Editor 2.0.1 Qt::AlignCenter diff --git a/Selection.cpp b/Selection.cpp index 400896d..baa70c7 100644 --- a/Selection.cpp +++ b/Selection.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include // itk includes @@ -78,8 +79,10 @@ Selection::Selection() /////////////////////////////////////////////////////////////////////////////////////////////////// Selection::~Selection() { - deleteSelectionActors(); - deleteSelectionVolumes(); + m_widgetsCallbackCommand = nullptr; + + if(!m_selectionActorsList.empty()) deleteSelectionActors(); + if(!m_selectionVolumesList.empty()) deleteSelectionVolumes(); } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -305,11 +308,12 @@ void Selection::computeSelectionCube() /////////////////////////////////////////////////////////////////////////////////////////////////// void Selection::clear() { - deleteSelectionActors(); - deleteSelectionVolumes(); - m_axial->clearSelections(); - m_coronal->clearSelections(); - m_sagittal->clearSelections(); + if(!m_selectionActorsList.empty()) deleteSelectionActors(); + if(!m_selectionVolumesList.empty()) deleteSelectionVolumes(); + + if(m_axial) m_axial->clearSelections(); + if(m_coronal) m_coronal->clearSelections(); + if(m_sagittal) m_sagittal->clearSelections(); if (m_selectionType == Type::CUBE) { @@ -780,7 +784,7 @@ void Selection::setSelectionDisc(const Vector3i &point, const unsigned int radiu for (int b = 0; b <= extent[3]; b++) { auto pointer = static_cast(image->GetScalarPointer(a, b, 0)); - if (((pow(abs(radius - 1 - a), 2) + pow(abs(radius - 1 - b), 2))) <= pow(radius - 1, 2)) + if (((pow(abs(static_cast(radius) - 1 - a), 2) + pow(abs(static_cast(radius) - 1 - b), 2))) <= pow(radius - 1, 2)) *pointer = static_cast(Selection::VOXEL_SELECTED); else *pointer = static_cast(Selection::VOXEL_UNSELECTED); @@ -793,7 +797,7 @@ void Selection::setSelectionDisc(const Vector3i &point, const unsigned int radiu for (int b = 0; b <= extent[5]; b++) { auto pointer = static_cast(image->GetScalarPointer(a, 0, b)); - if (((pow(abs(radius - 1 - a), 2) + pow(abs(radius - 1 - b), 2))) <= pow(radius - 1, 2)) + if (((pow(abs(static_cast(radius) - 1 - a), 2) + pow(abs(static_cast(radius) - 1 - b), 2))) <= pow(radius - 1, 2)) *pointer = static_cast(Selection::VOXEL_SELECTED); else *pointer = static_cast(Selection::VOXEL_UNSELECTED); @@ -806,7 +810,7 @@ void Selection::setSelectionDisc(const Vector3i &point, const unsigned int radiu for (int b = 0; b <= extent[5]; b++) { auto pointer = static_cast(image->GetScalarPointer(0, a, b)); - if (((pow(abs(radius - 1 - a), 2) + pow(abs(radius - 1 - b), 2))) <= pow(radius - 1, 2)) + if (((pow(abs(static_cast(radius) - 1 - a), 2) + pow(abs(static_cast(radius) - 1 - b), 2))) <= pow(radius - 1, 2)) *pointer = static_cast(Selection::VOXEL_SELECTED); else *pointer = static_cast(Selection::VOXEL_UNSELECTED); @@ -855,21 +859,21 @@ void Selection::setSelectionDisc(const Vector3i &point, const unsigned int radiu switch (view->orientationType()) { case SliceVisualization::Orientation::Axial: - clipperExtent[0] = ((point[0] - radius) < 0) ? abs(point[0] - radius) : 0; + clipperExtent[0] = ((point[0] - radius) < 0) ? std::abs(point[0] - static_cast(radius)) : 0; clipperExtent[1] = ((point[0] + radius) > m_size[0]) ? (radius - point[0] + m_size[0]) : (radius * 2) - 2; - clipperExtent[2] = ((point[1] - radius) < 0) ? abs(point[1] - radius) : 0; + clipperExtent[2] = ((point[1] - radius) < 0) ? std::abs(point[1] - static_cast(radius)) : 0; clipperExtent[3] = ((point[1] + radius) > m_size[1]) ? (radius - point[1] + m_size[1]) : (radius * 2) - 2; break; case SliceVisualization::Orientation::Coronal: - clipperExtent[0] = ((point[0] - radius) < 0) ? abs(point[0] - radius) : 0; + clipperExtent[0] = ((point[0] - radius) < 0) ? std::abs(point[0] - static_cast(radius)) : 0; clipperExtent[1] = ((point[0] + radius) > m_size[0]) ? (radius - point[0] + m_size[0]) : (radius * 2) - 2; - clipperExtent[4] = ((point[2] - radius) < 0) ? abs(point[2] - radius) : 0; + clipperExtent[4] = ((point[2] - radius) < 0) ? std::abs(point[2] - static_cast(radius)) : 0; clipperExtent[5] = ((point[2] + radius) > m_size[2]) ? (radius - point[2] + m_size[2]) : (radius * 2) - 2; break; case SliceVisualization::Orientation::Sagittal: - clipperExtent[2] = ((point[1] - radius) < 0) ? abs(point[1] - radius) : 0; + clipperExtent[2] = ((point[1] - radius) < 0) ? std::abs(point[1] - static_cast(radius)) : 0; clipperExtent[3] = ((point[1] + radius) > m_size[1]) ? (radius - point[1] + m_size[1]) : (radius * 2) - 2; - clipperExtent[4] = ((point[2] - radius) < 0) ? abs(point[2] - radius) : 0; + clipperExtent[4] = ((point[2] - radius) < 0) ? std::abs(point[2] - static_cast(radius)) : 0; clipperExtent[5] = ((point[2] + radius) > m_size[2]) ? (radius - point[2] + m_size[2]) : (radius * 2) - 2; break; default: @@ -909,7 +913,9 @@ void Selection::boxSelectionWidgetCallback(vtkObject *caller, unsigned long even auto max = self->maximumBouds(); auto callerWidget = static_cast(caller); + if(!callerWidget) return; auto callerRepresentation = static_cast(callerWidget->GetRepresentation()); + if(!callerRepresentation) return; double *spacing = callerRepresentation->Getm_spacing(); double *pos1 = callerRepresentation->GetPosition(); double *pos2 = callerRepresentation->GetPosition2(); @@ -992,7 +998,9 @@ void Selection::boxSelectionWidgetCallback(vtkObject *caller, unsigned long even /////////////////////////////////////////////////////////////////////////////////////////////////// void Selection::computeLassoBounds(int *iBounds) { + if(!m_contourWidget) return; auto rep = static_cast(m_contourWidget->GetRepresentation()); + if(!rep) return; auto bounds = rep->GetBounds(); // this copy is needed because we want to change the values and we mustn't do it in the original pointer or we will mess @@ -1112,6 +1120,7 @@ void Selection::addContourInitialPoint(const Vector3ui &point, std::shared_ptr::New(); m_contourWidget->SetInteractor(callerSlice->renderer()->GetRenderWindow()->GetInteractor()); + m_contourWidget->SetDefaultRenderer(callerSlice->renderer()); m_contourWidget->SetContinuousDraw(true); m_contourWidget->SetFollowCursor(true); @@ -1193,7 +1202,7 @@ void Selection::addContourInitialPoint(const Vector3ui &point, std::shared_ptrSetOutsideValue(VOXEL_UNSELECTED); // bootstrap operations - m_contourWidget->SelectAction(m_contourWidget); + m_contourWidget->SelectAction(m_contourWidget.Get()); } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -1201,7 +1210,9 @@ void Selection::contourSelectionWidgetCallback(vtkObject *caller, unsigned long { auto self = static_cast(clientdata); auto widget = static_cast(caller); + if(!widget) return; auto rep = static_cast(widget->GetRepresentation()); + if(!rep) return; // if bounds are not defined or are invalid means that the rep is not valid auto bounds = rep->GetBounds(); diff --git a/SliceVisualization.cpp b/SliceVisualization.cpp index d8d8408..13fea0b 100644 --- a/SliceVisualization.cpp +++ b/SliceVisualization.cpp @@ -187,6 +187,37 @@ SliceVisualization::~SliceVisualization() m_renderer->GetRenderWindow()->RemoveRenderer(m_thumbRenderer); m_renderer->RemoveAllViewProps(); } + + m_picker = nullptr; + m_renderer = nullptr; + m_thumbRenderer = nullptr; + m_texture = nullptr; + m_textActor = nullptr; + m_axesMatrix = nullptr; + m_horizontalCrosshair = nullptr; + m_horizontalCrosshairActor = nullptr; + m_verticalCrosshair = nullptr; + m_verticalCrosshairActor = nullptr; + m_focusData = nullptr; + m_focusActor = nullptr; + m_referenceImageMapper = nullptr; + m_referenceReslice = nullptr; + m_imageBlender = nullptr; + m_segmentationReslice = nullptr; + m_segmentationsMapper = nullptr; + m_segmentationsActor = nullptr; + m_selectionReslice = nullptr; + m_caster = nullptr; + m_geometryFilter = nullptr; + m_iconFilter = nullptr; + m_selectionMapper = nullptr; + m_selectionActor = nullptr; + + for(auto data: m_actorList) + { + data->actor = nullptr; + } + m_actorList.clear(); } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -712,8 +743,7 @@ void SliceVisualization::setReferenceImage(vtkSmartPointer m_referenceImageMapper->SetInputData(m_referenceReslice->GetOutput()); m_referenceImageMapper->SetLookupTable(colorTable); m_referenceImageMapper->SetOutputFormatToRGBA(); - m_referenceImageMapper->SetUpdateExtentToWholeExtent(); - m_referenceImageMapper->Update(); + m_referenceImageMapper->UpdateWholeExtent(); // remove actual actor and add the blended actor with both the segmentation and the stack m_imageBlender = vtkSmartPointer::New(); @@ -722,8 +752,7 @@ void SliceVisualization::setReferenceImage(vtkSmartPointer m_imageBlender->SetOpacity(0, 1.0); m_imageBlender->SetOpacity(1, m_segmentationOpacity); m_imageBlender->SetBlendModeToNormal(); - m_imageBlender->SetUpdateExtentToWholeExtent(); - m_imageBlender->Update(); + m_imageBlender->UpdateWholeExtent(); m_segmentationsActor->SetInputData(m_imageBlender->GetOutput()); m_segmentationsActor->PickableOn(); diff --git a/VoxelVolumeRender.cpp b/VoxelVolumeRender.cpp index ff9552a..cce383c 100644 --- a/VoxelVolumeRender.cpp +++ b/VoxelVolumeRender.cpp @@ -28,7 +28,6 @@ #include #include #include -#include #include #include #include @@ -71,6 +70,12 @@ VoxelVolumeRender::~VoxelVolumeRender() m_renderer->RemoveActor(it.second->mesh); } + m_renderer = nullptr; + m_opacityfunction = nullptr; + m_colorfunction = nullptr; + m_volumeMapper = nullptr; + m_volume = nullptr; + m_mesh = nullptr; m_actors.clear(); } @@ -230,7 +235,6 @@ void VoxelVolumeRender::computeMesh(const unsigned short label) m_progress->Observe(isoMapper, "Map", weight); isoMapper->SetInputConnection(normals->GetOutputPort()); isoMapper->ReleaseDataFlagOn(); - isoMapper->ImmediateModeRenderingOn(); isoMapper->ScalarVisibilityOff(); isoMapper->Update(); m_progress->Ignore(isoMapper); diff --git a/VoxelVolumeRender.h b/VoxelVolumeRender.h index ee8c5a7..847be88 100644 --- a/VoxelVolumeRender.h +++ b/VoxelVolumeRender.h @@ -137,7 +137,7 @@ class VoxelVolumeRender Vector3ui min; /** bounding box minimum point. */ Vector3ui max; /** bounding box maximum point. */ - Pipeline(): min{Vector3ui{0,0,0}}, max{Vector3ui{0,0,0}}, mesh{nullptr} {}; + Pipeline(): min(Vector3ui{0,0,0}), max(Vector3ui{0,0,0}), mesh{nullptr} {}; }; std::map> m_actors; /** list of actors in the view. */ diff --git a/installer/script.iss.in b/installer/script.iss.in new file mode 100644 index 0000000..77e3971 --- /dev/null +++ b/installer/script.iss.in @@ -0,0 +1,36 @@ +; Mingw64 Distribution Inno Setup File + +[Setup] +AppName=EspinaEditor +AppVersion=@ESPINAEDITOR_VERSION_MAJOR@.@ESPINAEDITOR_VERSION_MINOR@.@ESPINAEDITOR_VERSION_PATCH@ +DefaultDirName={pf64}\EspinaEditor +DefaultGroupName=Espina Editor +OutputDir=@PROJECT_BINARY_DIR@ +AppComments=Espina Editor +AppContact=Felix de las Pozas Alvarez +AppCopyright=(c)2019 Felix de las Pozas Alvarez +AppPublisher=Felix de las Pozas Alvarez +ArchitecturesAllowed=x64 +Compression=lzma2/ultra64 +CreateUninstallRegKey=yes +Uninstallable=yes +DisableFinishedPage=no +DisableWelcomePage=no +ChangesAssociations=no +CloseApplications=yes +UninstallDisplayIcon=@CMAKE_SOURCE_DIR@/icons/brain.ico +UninstallDisplayName=EspinaEditor v@ESPINAEDITOR_VERSION_MAJOR@.@ESPINAEDITOR_VERSION_MINOR@.@ESPINAEDITOR_VERSION_PATCH@ +SourceDir=@PROJECT_BINARY_DIR@ +SetupIconFile=@CMAKE_SOURCE_DIR@/icons/brain.ico +OutputBaseFilename=EspinaEditor_v@ESPINAEDITOR_VERSION_MAJOR@.@ESPINAEDITOR_VERSION_MINOR@.@ESPINAEDITOR_VERSION_PATCH@_Setup + +[Files] +Source: "EspinaEditor.exe"; DestDir: "{app}"; +Source: "*.dll"; DestDir: "{app}"; +Source: "iconengines/*.*"; DestDir: "{app}/iconengines/"; +Source: "imageformats/*.*"; DestDir: "{app}/imageformats/"; +Source: "platforms/*.*"; DestDir: "{app}/platforms/"; +Source: "testImages/*.*"; DestDir: "{app}/testImages/"; + +[Run] +Filename: "{app}\EspinaEditor.exe"; Description: "Launch Espina Editor"; Flags: postinstall nowait skipifsilent unchecked diff --git a/readme.md b/readme.md index 210e6fc..92748bf 100644 --- a/readme.md +++ b/readme.md @@ -81,7 +81,7 @@ The lasso tool in action over the sagittal view, showing the selected voxels. | Language |files |blank |comment |code | |:-----------------------------|--------------:|------------:|------------:|-------:| -| C++ | 26 | 2265 | 1447 | 10820 | -| C/C++ Header | 27 | 875 | 2207 | 2052 | -| CMake | 1 | 18 | 8 | 99 | -| **Total** | **54** | **3158** | **3662** | **12971** | +| C++ | 26 | 2279 | 1449 | 10907 | +| C/C++ Header | 27 | 877 | 2213 | 2054 | +| CMake | 1 | 18 | 8 | 100 | +| **Total** | **54** | **3174** | **3670** | **13061** |