├── .gitignore ├── CMakeLists.txt ├── CornerOverlay.cpp ├── CornerOverlay.h ├── LICENSE ├── MPRMaker.cpp ├── MPRMaker.h ├── OverlayInfo.h ├── README.md ├── TagDialog.cpp ├── TagDialog.h ├── TagDialog.ui ├── VtkInclude.h ├── main.cpp ├── res ├── 0.png ├── 1.png ├── 2.png ├── 3.png ├── 3d_icon.png ├── 4.png ├── SLC │ ├── 0000.dcm │ ├── 0001.dcm │ ├── 0002.dcm │ ├── 0003.dcm │ ├── 0004.dcm │ ├── 0005.dcm │ ├── 0006.dcm │ ├── 0007.dcm │ ├── 0008.dcm │ ├── 0009.dcm │ ├── 0010.dcm │ ├── 0011.dcm │ ├── 0012.dcm │ ├── 0013.dcm │ ├── 0014.dcm │ ├── 0015.dcm │ ├── 0016.dcm │ ├── 0017.dcm │ ├── 0018.dcm │ ├── 0019.dcm │ ├── 0020.dcm │ ├── 0021.dcm │ ├── 0022.dcm │ ├── 0023.dcm │ ├── 0024.dcm │ ├── 0025.dcm │ ├── 0026.dcm │ ├── 0027.dcm │ ├── 0028.dcm │ ├── 0029.dcm │ ├── 0030.dcm │ ├── 0031.dcm │ ├── 0032.dcm │ ├── 0033.dcm │ ├── 0034.dcm │ ├── 0035.dcm │ ├── 0036.dcm │ ├── 0037.dcm │ ├── 0038.dcm │ ├── 0039.dcm │ ├── 0040.dcm │ ├── 0041.dcm │ ├── 0042.dcm │ ├── 0043.dcm │ ├── 0044.dcm │ ├── 0045.dcm │ ├── 0046.dcm │ ├── 0047.dcm │ ├── 0048.dcm │ ├── 0049.dcm │ ├── 0050.dcm │ ├── 0051.dcm │ ├── 0052.dcm │ ├── 0053.dcm │ ├── 0054.dcm │ ├── 0055.dcm │ ├── 0056.dcm │ ├── 0057.dcm │ ├── 0058.dcm │ ├── 0059.dcm │ ├── 0060.dcm │ ├── 0061.dcm │ ├── 0062.dcm │ ├── 0063.dcm │ ├── 0064.dcm │ ├── 0065.dcm │ ├── 0066.dcm │ ├── 0067.dcm │ ├── 0068.dcm │ ├── 0069.dcm │ ├── 0070.dcm │ ├── 0071.dcm │ ├── 0072.dcm │ ├── 0073.dcm │ ├── 0074.dcm │ ├── 0075.dcm │ ├── 0076.dcm │ ├── 0077.dcm │ ├── 0078.dcm │ ├── 0079.dcm │ ├── 0080.dcm │ ├── 0081.dcm │ ├── 0082.dcm │ ├── 0083.dcm │ ├── 0084.dcm │ ├── 0085.dcm │ ├── 0086.dcm │ ├── 0087.dcm │ ├── 0088.dcm │ ├── 0089.dcm │ ├── 0090.dcm │ ├── 0091.dcm │ ├── 0092.dcm │ ├── 0093.dcm │ ├── 0094.dcm │ ├── 0095.dcm │ ├── 0096.dcm │ ├── 0097.dcm │ ├── 0098.dcm │ ├── 0099.dcm │ ├── 0100.dcm │ ├── 0101.dcm │ ├── 0102.dcm │ ├── 0103.dcm │ ├── 0104.dcm │ ├── 0105.dcm │ ├── 0106.dcm │ ├── 0107.dcm │ ├── 0108.dcm │ ├── 0109.dcm │ ├── 0110.dcm │ ├── 0111.dcm │ ├── 0112.dcm │ ├── 0113.dcm │ ├── 0114.dcm │ ├── 0115.dcm │ ├── 0116.dcm │ ├── 0117.dcm │ ├── 0118.dcm │ ├── 0119.dcm │ ├── 0120.dcm │ ├── 0121.dcm │ ├── 0122.dcm │ ├── 0123.dcm │ ├── 0124.dcm │ ├── 0125.dcm │ ├── 0126.dcm │ ├── 0127.dcm │ ├── 0128.dcm │ ├── 0129.dcm │ ├── 0130.dcm │ ├── 0131.dcm │ ├── 0132.dcm │ ├── 0133.dcm │ ├── 0134.dcm │ ├── 0135.dcm │ ├── 0136.dcm │ ├── 0137.dcm │ ├── 0138.dcm │ ├── 0139.dcm │ ├── 0140.dcm │ ├── 0141.dcm │ ├── 0142.dcm │ ├── 0143.dcm │ ├── 0144.dcm │ ├── 0145.dcm │ ├── 0146.dcm │ ├── 0147.dcm │ ├── 0148.dcm │ ├── 0149.dcm │ ├── 0150.dcm │ ├── 0151.dcm │ ├── 0152.dcm │ ├── 0153.dcm │ ├── 0154.dcm │ ├── 0155.dcm │ ├── 0156.dcm │ ├── 0157.dcm │ ├── 0158.dcm │ ├── 0159.dcm │ ├── 0160.dcm │ ├── 0161.dcm │ ├── 0162.dcm │ ├── 0163.dcm │ ├── 0164.dcm │ ├── 0165.dcm │ ├── 0166.dcm │ ├── 0167.dcm │ ├── 0168.dcm │ ├── 0169.dcm │ ├── 0170.dcm │ ├── 0171.dcm │ ├── 0172.dcm │ ├── 0173.dcm │ ├── 0174.dcm │ ├── 0175.dcm │ ├── 0176.dcm │ ├── 0177.dcm │ ├── 0178.dcm │ ├── 0179.dcm │ ├── 0180.dcm │ ├── 0181.dcm │ ├── 0182.dcm │ ├── 0183.dcm │ ├── 0184.dcm │ ├── 0185.dcm │ ├── 0186.dcm │ ├── 0187.dcm │ ├── 0188.dcm │ ├── 0189.dcm │ ├── 0190.dcm │ ├── 0191.dcm │ ├── 0192.dcm │ ├── 0193.dcm │ ├── 0194.dcm │ ├── 0195.dcm │ ├── 0196.dcm │ ├── 0197.dcm │ ├── 0198.dcm │ ├── 0199.dcm │ ├── 0200.dcm │ ├── 0201.dcm │ ├── 0202.dcm │ ├── 0203.dcm │ ├── 0204.dcm │ ├── 0205.dcm │ ├── 0206.dcm │ ├── 0207.dcm │ ├── 0208.dcm │ ├── 0209.dcm │ ├── 0210.dcm │ ├── 0211.dcm │ ├── 0212.dcm │ ├── 0213.dcm │ ├── 0214.dcm │ ├── 0215.dcm │ ├── 0216.dcm │ ├── 0217.dcm │ ├── 0218.dcm │ ├── 0219.dcm │ ├── 0220.dcm │ ├── 0221.dcm │ ├── 0222.dcm │ ├── 0223.dcm │ ├── 0224.dcm │ ├── 0225.dcm │ ├── 0226.dcm │ ├── 0227.dcm │ ├── 0228.dcm │ ├── 0229.dcm │ ├── 0230.dcm │ ├── 0231.dcm │ ├── 0232.dcm │ ├── 0233.dcm │ ├── 0234.dcm │ ├── 0235.dcm │ ├── 0236.dcm │ ├── 0237.dcm │ ├── 0238.dcm │ ├── 0239.dcm │ ├── 0240.dcm │ ├── 0241.dcm │ ├── 0242.dcm │ ├── 0243.dcm │ ├── 0244.dcm │ ├── 0245.dcm │ ├── 0246.dcm │ ├── 0247.dcm │ ├── 0248.dcm │ ├── 0249.dcm │ ├── 0250.dcm │ ├── 0251.dcm │ ├── 0252.dcm │ ├── 0253.dcm │ ├── 0254.dcm │ ├── 0255.dcm │ ├── 0256.dcm │ ├── 0257.dcm │ ├── 0258.dcm │ ├── 0259.dcm │ ├── 0260.dcm │ ├── 0261.dcm │ ├── 0262.dcm │ ├── 0263.dcm │ ├── 0264.dcm │ ├── 0265.dcm │ ├── 0266.dcm │ ├── 0267.dcm │ ├── 0268.dcm │ ├── 0269.dcm │ ├── 0270.dcm │ ├── 0271.dcm │ ├── 0272.dcm │ ├── 0273.dcm │ ├── 0274.dcm │ ├── 0275.dcm │ ├── 0276.dcm │ ├── 0277.dcm │ ├── 0278.dcm │ ├── 0279.dcm │ ├── 0280.dcm │ ├── 0281.dcm │ ├── 0282.dcm │ ├── 0283.dcm │ ├── 0284.dcm │ ├── 0285.dcm │ ├── 0286.dcm │ ├── 0287.dcm │ ├── 0288.dcm │ ├── 0289.dcm │ ├── 0290.dcm │ ├── 0291.dcm │ ├── 0292.dcm │ ├── 0293.dcm │ ├── 0294.dcm │ ├── 0295.dcm │ ├── 0296.dcm │ ├── 0297.dcm │ ├── 0298.dcm │ ├── 0299.dcm │ ├── 0300.dcm │ ├── 0301.dcm │ ├── 0302.dcm │ ├── 0303.dcm │ ├── 0304.dcm │ ├── 0305.dcm │ ├── 0306.dcm │ ├── 0307.dcm │ ├── 0308.dcm │ ├── 0309.dcm │ ├── 0310.dcm │ ├── 0311.dcm │ ├── 0312.dcm │ ├── 0313.dcm │ ├── 0314.dcm │ ├── 0315.dcm │ ├── 0316.dcm │ ├── 0317.dcm │ ├── 0318.dcm │ └── 0319.dcm ├── arrow_icon.png ├── close-button1.png ├── close-button2.png ├── closeAll_icon.png ├── closeTab_icon.png ├── coronavirus_icon.png ├── crop_icon.png ├── fliphorizontal_icon.png ├── flipvertical_icon.png ├── folder.svg ├── icon_big.png ├── icon_file.png ├── icon_folder.png ├── icon_layout.png ├── icon_reslice.png ├── icon_small.png ├── invert_icon.png ├── loading_gif.gif ├── maximize-button1.png ├── maximize-button2.png ├── minimize-button1.png ├── mpr_icon.png ├── open.svg ├── overlays.json ├── reset_icon.png ├── rotateleft_icon.png ├── rotateright_icon.png ├── scroll2d.css ├── tag.svg ├── tag2.svg ├── tag_fill.png └── wenjianjia.svg ├── simpleTK.cpp ├── simpleTK.h ├── simpleTK.qrc ├── simpleTK.ui ├── transferfunction.cpp ├── transferfunction.h ├── utility.cpp ├── utility.h ├── vtkBoxWidget3DCallback.cpp ├── vtkBoxWidget3DCallback.h ├── vtkResliceActor.cpp ├── vtkResliceCallback.h ├── vtkResliceCursorCallback.h ├── vtkReslicePlaneCursorWidget.cpp ├── vtkReslicePlaneCursorWidget.h ├── vtkResliceRotator.cpp ├── vtkResliceTranslator.cpp ├── vtkResliceTranslator.h ├── vtkResliceWidget.cpp ├── vtkResliceWidget.h ├── vtkWidget3D.cpp ├── vtkWidget3D.h ├── vtkWidgetBase.cpp ├── vtkWidgetBase.h ├── vtkWidgetMPR.cpp ├── vtkWidgetMPR.h ├── vtkWidgetMPRCallback.cpp ├── vtkWidgetMPRInteractorStyle.cpp ├── vtkresliceactor.h ├── vtkreslicecallback.cpp ├── vtkreslicerotator.h ├── vtkreslicewidgetrepresentation.cpp ├── vtkreslicewidgetrepresentation.h ├── vtkwidget3dinteractorstyle.cpp ├── vtkwidget3dinteractorstyle.h ├── vtkwidgetmprcallback.h └── vtkwidgetmprinteractorstyle.h /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | build/ 4 | x64 5 | # Compiled Object files 6 | *.slo 7 | *.lo 8 | *.o 9 | *.obj 10 | 11 | # Precompiled Headers 12 | *.gch 13 | *.pch 14 | 15 | # Compiled Dynamic libraries 16 | *.so 17 | *.dylib 18 | *.dll 19 | 20 | # Fortran module files 21 | *.mod 22 | *.smod 23 | 24 | # Compiled Static libraries 25 | *.lai 26 | *.la 27 | *.a 28 | *.lib 29 | 30 | # Executables 31 | *.exe 32 | *.out 33 | *.app 34 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required( VERSION 3.18 ) 2 | 3 | ########### 4 | # Project # 5 | ########### 6 | SET(PROJECT_NAME simpleTK) 7 | project(${PROJECT_NAME}) 8 | set(CMAKE_INCLUDE_CURRENT_DIR ON) 9 | 10 | # Link to external third-party libraries 11 | set(CMAKE_INCLUDE_CURRENT_DIR ON) 12 | set(CMAKE_AUTOMOC ON) 13 | set(CMAKE_AUTOUIC ON) 14 | set(CMAKE_AUTORCC ON) 15 | set(CMAKE_CXX_STANDARD 17) 16 | 17 | 18 | #find_package( ITK REQUIRED ) 19 | #include( ${ITK_USE_FILE}) 20 | 21 | 22 | find_package( VTK REQUIRED ) 23 | #include( ${VTK_USE_FILE} ) 24 | 25 | 26 | #find_package(OpenCV REQUIRED) 27 | #include_directories(${OpenCV_INCLUDE_DIRS}) 28 | 29 | find_package(Qt5 REQUIRED QUIET COMPONENTS Core Widgets OpenGL) 30 | find_package(Qt5Widgets) 31 | include_directories(${PROJECT_SOURCE_DIR} 32 | ${CMAKE_CURRENT_BINARY_DIR} 33 | ${VTK_DIR} 34 | #${ITK_DIR} 35 | #${OpenCV_LIBRARY_DIRS} 36 | ) 37 | 38 | #find_package(DICOM QUIET) 39 | #if(DICOM_FOUND) 40 | #include_directories( ${DICOM_USE_FILE} ) 41 | #endif() 42 | #set(VTK_DICOM_LIBRARIES vtkDICOM) 43 | 44 | 45 | #find_package(DCMTK REQUIRED ${DCMTK_FIND_PACKAGE_STATEGY}) 46 | #include_directories(${DCMTK_INCLUDE_DIRS}) 47 | 48 | ########### 49 | # Targets # 50 | ########### 51 | 52 | #file(GLOB_RECURSE SOURCE "*.cpp" "*.cxx" "*.cc") 53 | #file(GLOB_RECURSE RESOURCES "*.qrc") 54 | #file(GLOB_RECURSE HEADERS "*.h") 55 | #file(GLOB_RECURSE FORMS *.ui) 56 | 57 | #set(SRCS ${SOURCE} ${HEADERS} ${RESOURCES} ${FORMS}) 58 | 59 | FILE(GLOB SRC_FILES "./*.cpp") 60 | FILE(GLOB HEAD_FILES "./*.h") 61 | FILE(GLOB UI_FILES "./*.ui") 62 | file(GLOB_RECURSE RESOURCES "*.qrc") 63 | qt5_wrap_ui(WRAP_FILES ${UI_FILES}) 64 | #set(RCC_FILES RcfServer.qrc) 65 | source_group("Ui" FILES ${UI_FILES} ${WRAP_FILES} ) 66 | 67 | add_executable(${PROJECT_NAME} ${SRC_FILES} ${HEAD_FILES} ${WRAP_FILES} ${RESOURCES}) 68 | 69 | 70 | 71 | 72 | #set(PROJECT_HDRS 73 | #simpleTK.h 74 | #VtkInclude.h 75 | #TagDialog.h 76 | #) 77 | 78 | #set(PROJECT_SRCS 79 | #main.cpp 80 | #simpleTK.cpp 81 | #TagDialog.cpp 82 | #) 83 | 84 | #file(GLOB PROJECT_UIS "*.ui") 85 | #QT5_WRAP_UI(PROJECT_UIS_H ${PROJECT_UIS}) 86 | 87 | #set(PROJECT_MOC_HDRS 88 | #simpleTK.h 89 | #TagDialog.h 90 | #) 91 | #QT5_WRAP_CPP(PROJECT_MOC_SRCS ${PROJECT_MOC_HDRS}) 92 | 93 | #set(RESOURCE_FILE simpleTK.qrc) 94 | #QT5_ADD_RESOURCES(RESOURCE ${RESOURCE_FILE}) 95 | 96 | 97 | TARGET_LINK_LIBRARIES ( 98 | ${PROJECT_NAME} 99 | ${VTK_LIBRARIES} 100 | #${DCMTK_LIBRARIES} 101 | #${VTK_DICOM_LIBRARIES} 102 | #${OpenCV_LIBS} 103 | Qt5::Widgets 104 | Qt5::Core 105 | Qt5::Gui 106 | ) 107 | vtk_module_autoinit(TARGETS simpleTK MODULES ${VTK_LIBRARIES}) 108 | -------------------------------------------------------------------------------- /CornerOverlay.cpp: -------------------------------------------------------------------------------- 1 | #include "corneroverlay.h" 2 | 3 | vtkOpenGLTextActor* CornerOverlay::getTextActor() 4 | { 5 | initTextActor(); 6 | return m_textActor; 7 | } 8 | 9 | //----------------------------------------------------------------------------- 10 | std::string CornerOverlay::getOverlayFromInfo() 11 | { 12 | std::string values; 13 | for (const auto& value : m_overlaysInfo) 14 | { 15 | values.append(value.second); 16 | } 17 | return values; 18 | } 19 | -------------------------------------------------------------------------------- /CornerOverlay.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | 9 | class CornerOverlay 10 | { 11 | public: 12 | CornerOverlay() = default; 13 | ~CornerOverlay() = default; 14 | 15 | //getters 16 | [[nodiscard]] int getNumberOfCorner() const { return m_numberOfCorner; } 17 | [[nodiscard]] vtkOpenGLTextActor* getTextActor(); 18 | [[nodiscard]] std::string getOverlayFromInfo(); 19 | 20 | //setters 21 | void setNumberOfCorner(const int& t_nr) { m_numberOfCorner = t_nr; } 22 | void setOverlayInfo(const std::string& t_key, const std::string& t_value) { m_overlaysInfo[t_key] = t_value; } 23 | void setTextActorProperty(vtkTextProperty* t_property) const { m_textActor->SetTextProperty(t_property); } 24 | 25 | void initTextActor() { m_textActor->SetInput(getOverlayFromInfo().c_str()); } 26 | void clearOverlaysInfo() { m_overlaysInfo.clear(); } 27 | 28 | private: 29 | std::map m_overlaysInfo = {}; 30 | int m_numberOfCorner = -1; 31 | vtkNew m_textActor; 32 | }; 33 | 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2022, simp1e 4 | All rights reserved. 5 | 6 | Redistribution and use in source and binary forms, with or without 7 | modification, are permitted provided that the following conditions are met: 8 | 9 | 1. Redistributions of source code must retain the above copyright notice, this 10 | list of conditions and the following disclaimer. 11 | 12 | 2. Redistributions in binary form must reproduce the above copyright notice, 13 | this list of conditions and the following disclaimer in the documentation 14 | and/or other materials provided with the distribution. 15 | 16 | 3. Neither the name of the copyright holder nor the names of its 17 | contributors may be used to endorse or promote products derived from 18 | this software without specific prior written permission. 19 | 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 | -------------------------------------------------------------------------------- /MPRMaker.cpp: -------------------------------------------------------------------------------- 1 | #include "MPRMaker.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | //#include "image.h" 9 | //#include "series.h" 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | 17 | 18 | //----------------------------------------------------------------------------- 19 | void MPRMaker::SetRenderWindows(const vtkSmartPointer& t_sagittalWindow, 20 | const vtkSmartPointer& t_coronalWindow, 21 | const vtkSmartPointer& t_axialWindow) 22 | { 23 | m_renderWindow[0] = t_sagittalWindow; 24 | m_renderWindow[1] = t_coronalWindow; 25 | m_renderWindow[2] = t_axialWindow; 26 | } 27 | 28 | //----------------------------------------------------------------------------- 29 | vtkImageReslice* MPRMaker::getOriginalValueImageReslice(const int t_plane) 30 | { 31 | m_originalValuesReslicer[t_plane]->SetResliceAxes(m_reslicer[t_plane]->GetResliceAxes()); 32 | return m_originalValuesReslicer[t_plane]; 33 | } 34 | 35 | //----------------------------------------------------------------------------- 36 | double MPRMaker::getCenterSliceZPosition(const int t_plane) const 37 | { 38 | int* const extent = m_reader->GetOutput()->GetExtent(); 39 | return 0.5 * (extent[t_plane * 2] + extent[t_plane * 2 + 1]); 40 | } 41 | 42 | //----------------------------------------------------------------------------- 43 | void MPRMaker::create3DMatrix() 44 | { 45 | // if (!m_series) 46 | // { 47 | // m_series = m_image->getParentObject(); 48 | // } 49 | // 50 | // m_reader = 51 | // m_image && m_image->getIsMultiFrame() 52 | // ? m_image->getImageReader() 53 | // : m_series->getReaderForAllSingleFrameImages(); 54 | } 55 | 56 | //----------------------------------------------------------------------------- 57 | void MPRMaker::createMPR(vtkSmartPointer reader) 58 | { 59 | this->m_reader = reader; 60 | createMprViews(); 61 | } 62 | 63 | //----------------------------------------------------------------------------- 64 | void MPRMaker::resetMatrixesToInitialPosition() 65 | { 66 | setInitialMatrix(); 67 | for (auto i = 0; i < 3; ++i) 68 | { 69 | setMiddleSlice(i, m_reader); 70 | } 71 | } 72 | 73 | //----------------------------------------------------------------------------- 74 | void MPRMaker::resetWindowLevel() 75 | { 76 | const double level = 77 | m_reader->GetMetaData()->Get(DC::WindowCenter).AsInt(); 78 | const double window = 79 | m_reader->GetMetaData()->Get(DC::WindowWidth).AsInt(); 80 | if (!m_colorMap) 81 | { 82 | m_colorMap = vtkSmartPointer::New(); 83 | } 84 | m_colorMap->SetRange(level - 0.5 * window, level + 0.5 * window); 85 | } 86 | 87 | //----------------------------------------------------------------------------- 88 | void MPRMaker::initialize() 89 | { 90 | for (auto i = 0; i < 3; ++i) 91 | { 92 | m_reslicer[i] = vtkSmartPointer::New(); 93 | m_originalValuesReslicer[i] = vtkSmartPointer::New(); 94 | mTextActor[i] = vtkSmartPointer::New(); 95 | } 96 | setInitialMatrix(); 97 | } 98 | 99 | //----------------------------------------------------------------------------- 100 | void MPRMaker::setInitialMatrix() 101 | { 102 | vtkNew axialMatrix; 103 | axialMatrix->DeepCopy(m_axialMatrix); 104 | m_reslicer[2]->SetResliceAxes(axialMatrix); 105 | vtkNew sagittalMatrix; 106 | sagittalMatrix->DeepCopy(m_sagittalMatrix); 107 | m_reslicer[0]->SetResliceAxes(sagittalMatrix); 108 | vtkNew coronalMatrix; 109 | coronalMatrix->DeepCopy(m_coronalMatrix); 110 | m_reslicer[1]->SetResliceAxes(coronalMatrix); 111 | } 112 | 113 | //----------------------------------------------------------------------------- 114 | void MPRMaker::createMprViews() 115 | { 116 | for (auto i = 0; i < 3; i++) 117 | { 118 | renderPlaneOffScreen(i); 119 | } 120 | } 121 | 122 | //----------------------------------------------------------------------------- 123 | void MPRMaker::setMiddleSlice(const int t_plane, const vtkSmartPointer& t_reader) 124 | { 125 | double spacing[3]; 126 | double origin[3]; 127 | double center[3]; 128 | auto* const extent = m_reader->GetOutput()->GetExtent(); 129 | t_reader->GetOutputInformation(0)->Get( 130 | vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent); 131 | t_reader->GetOutput()->GetSpacing(spacing); 132 | t_reader->GetOutput()->GetOrigin(origin); 133 | center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]); 134 | center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]); 135 | center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]); 136 | m_reslicer[t_plane]->GetResliceAxes()->SetElement(0, 3, center[0]); 137 | m_reslicer[t_plane]->GetResliceAxes()->SetElement(1, 3, center[1]); 138 | m_reslicer[t_plane]->GetResliceAxes()->SetElement(2, 3, center[2]); 139 | } 140 | 141 | //----------------------------------------------------------------------------- 142 | void MPRMaker::renderPlaneOffScreen(const int t_plane) 143 | { 144 | const double level = m_initialWindow == 0 145 | ? m_reader->GetMetaData()->Get(DC::WindowCenter).AsInt() 146 | : m_initialWindow; 147 | const double window = m_initialLevel == 0 ? m_reader->GetMetaData()->Get(DC::WindowWidth).AsInt() : m_initialLevel; 148 | 149 | setMiddleSlice(t_plane, m_reader); 150 | if (!m_colorMap) 151 | { 152 | m_colorMap = vtkSmartPointer::New(); 153 | m_colorMap->SetRange(level - 0.5 * window, level + 0.5 * window); 154 | } 155 | m_reslicer[t_plane]->SetInputData(m_reader->GetOutput()); 156 | m_reslicer[t_plane]->BypassOff(); 157 | m_reslicer[t_plane]->SetInformationInput(m_reader->GetOutput()); 158 | m_reslicer[t_plane]->SetOutputDimensionality(2); 159 | m_reslicer[t_plane]->SetSlabNumberOfSlices(0); 160 | m_reslicer[t_plane]->SetLookupTable(m_colorMap); 161 | m_reslicer[t_plane]->SetOutputFormatToRGB(); 162 | m_reslicer[t_plane]->Update(); 163 | m_originalValuesReslicer[t_plane]->SetInputData(m_reader->GetOutput()); 164 | m_originalValuesReslicer[t_plane]->SetInformationInput(m_reader->GetOutput()); 165 | m_originalValuesReslicer[t_plane]->SetOutputDimensionality(2); 166 | m_originalValuesReslicer[t_plane]->SetResliceAxes(m_reslicer[t_plane]->GetResliceAxes()); 167 | m_originalValuesReslicer[t_plane]->Update(); 168 | 169 | switch (t_plane) 170 | { 171 | case 0: 172 | mTextActor[t_plane]->SetInput("Sagittal"); 173 | mTextActor[t_plane]->GetTextProperty()->SetColor(0, 1, 0); 174 | 175 | break; 176 | case 1: 177 | mTextActor[t_plane]->SetInput("Coronal"); 178 | mTextActor[t_plane]->GetTextProperty()->SetColor(0, 0, 1); 179 | break; 180 | case 2: 181 | mTextActor[t_plane]->SetInput("Axial"); 182 | mTextActor[t_plane]->GetTextProperty()->SetColor(1, 0, 0); 183 | break; 184 | default: 185 | break; 186 | } 187 | 188 | //mTextActor[t_plane]->SetDisplayPosition(0,220); 189 | mTextActor[t_plane]->GetTextProperty()->SetFontSize(20); 190 | vtkNew slice; 191 | vtkNew renderer; 192 | vtkNew mapper; 193 | mapper->SeparateWindowLevelOperationOff(); 194 | mapper->SetInputConnection(m_reslicer[t_plane]->GetOutputPort()); 195 | slice->GetProperty()->SetInterpolationTypeToCubic(); 196 | slice->SetMapper(mapper); 197 | renderer->AddViewProp(slice); 198 | renderer->AddActor(mTextActor[t_plane]); 199 | renderer->SetBackground(0, 0, 0); 200 | renderer->GetActiveCamera()->SetParallelProjection(1); 201 | renderer->ResetCamera(); 202 | m_renderWindow[t_plane]->AddRenderer(renderer); 203 | m_renderWindow[t_plane]->Render(); 204 | } 205 | -------------------------------------------------------------------------------- /MPRMaker.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | //class Image; 21 | //class Series; 22 | 23 | class MPRMaker 24 | { 25 | public: 26 | MPRMaker() { initialize(); } 27 | ~MPRMaker() = default; 28 | 29 | void setInitialWindow(const int& t_window) { m_initialWindow = t_window; } 30 | void setInitialLevel(const int& t_level) { m_initialLevel = t_level; } 31 | //void setSeries(core::Series* t_series) { m_series = t_series; } 32 | //void setImage(core::Image* t_image) { m_image = t_image; } 33 | void SetRenderWindows( 34 | const vtkSmartPointer& t_sagittalWindow, 35 | const vtkSmartPointer& t_coronalWindow, 36 | const vtkSmartPointer& t_axialWindow); 37 | 38 | //getters 39 | //[[nodiscard]] core::Series* getSeries() const { return m_series; } 40 | //[[nodiscard]] core::Image* getImage() const { return m_image; } 41 | [[nodiscard]] int getInitialWindow() const { return m_initialWindow; } 42 | [[nodiscard]] int getInitalLevel() const { return m_initialLevel; } 43 | [[nodiscard]] vtkImageResliceToColors* getImageReslice(const int t_plane) const { return m_reslicer[t_plane]; } 44 | [[nodiscard]] vtkImageReslice* getOriginalValueImageReslice(int t_plane); 45 | [[nodiscard]] vtkImageData* getInputData() const { return m_reader->GetOutput(); } 46 | [[nodiscard]] double getCenterSliceZPosition(int t_plane) const; 47 | [[nodiscard]] vtkSmartPointer getColorMapScalar() const { return m_colorMap; } 48 | 49 | 50 | void create3DMatrix(); 51 | void createMPR(vtkSmartPointer reader); 52 | void resetMatrixesToInitialPosition(); 53 | void resetWindowLevel(); 54 | 55 | private: 56 | //core::Series* m_series = {}; 57 | //core::Image* m_image = {}; 58 | int m_initialWindow = 0; 59 | int m_initialLevel = 0; 60 | vtkSmartPointer m_reader = {}; 61 | vtkSmartPointer m_reslicer[3] = {}; 62 | vtkSmartPointer m_originalValuesReslicer[3] = {}; 63 | vtkSmartPointer m_renderWindow[3] = {}; 64 | vtkSmartPointer mTextActor[3] = {}; 65 | vtkSmartPointer m_colorMap = {}; 66 | 67 | double m_sagittalMatrix[16] = { 68 | 0, 0, 1, 0, 69 | -1, 0, 0, 0, 70 | 0, -1, 0, 0, 71 | 0, 0, 0, 1 72 | }; 73 | double m_coronalMatrix[16] = { 74 | 1, 0, 0, 0, 75 | 0, 0, 1, 0, 76 | 0, -1, 0, 0, 77 | 0, 0, 0, 1 78 | }; 79 | double m_axialMatrix[16] = { 80 | 1, 0, 0, 0, 81 | 0, 1, 0, 0, 82 | 0, 0, 1, 0, 83 | 0, 0, 0, 1 84 | }; 85 | 86 | void initialize(); 87 | void setInitialMatrix(); 88 | void createMprViews(); 89 | void setMiddleSlice(int t_plane, const vtkSmartPointer& t_reader); 90 | void renderPlaneOffScreen(int t_plane); 91 | }; 92 | 93 | -------------------------------------------------------------------------------- /OverlayInfo.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | 4 | 5 | class OverlayInfo 6 | { 7 | public: 8 | OverlayInfo() = default; 9 | ~OverlayInfo() = default; 10 | 11 | //getters 12 | [[nodiscard]] std::string getTextBefore() const { return m_textBefore; } 13 | [[nodiscard]] std::string getTextAfter() const { return m_textAfter; } 14 | [[nodiscard]] unsigned int getTagKey() const { return m_tagKey; } 15 | [[nodiscard]] int getCorner() const { return m_corner; } 16 | 17 | //setters 18 | void setTextBefore(const std::string& t_text) { m_textBefore = t_text; } 19 | void setTextAfter(const std::string& t_text) { m_textAfter = t_text; } 20 | void setTagKey(const unsigned long& t_tagKey) { m_tagKey = t_tagKey; } 21 | void setCorner(const int& t_corner) { m_corner = t_corner; } 22 | 23 | private: 24 | std::string m_textAfter; 25 | std::string m_textBefore; 26 | unsigned int m_tagKey = 0; 27 | int m_corner = 0; 28 | }; 29 | 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # simpleTK 2 | 3 | vtk-9.0 4 | vtkdicom 5 | Qt5.13.2 6 | ![image](https://github.com/0xsimple/simpleTK/assets/49086386/b5685e8f-3ae5-41b9-8461-38335acbdede) 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /TagDialog.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include "ui_TagDialog.h" 4 | 5 | class TagDialog final : public QDialog 6 | { 7 | Q_OBJECT 8 | 9 | public: 10 | explicit TagDialog(QDialog* parent, QString filePath); 11 | ~TagDialog(); 12 | 13 | 14 | private: 15 | Ui::Dialog ui; 16 | QString path; 17 | 18 | 19 | 20 | private: 21 | 22 | 23 | private slots: 24 | //void okPressed(); 25 | //void cancelPressed(); 26 | //void findText() const; 27 | }; 28 | 29 | 30 | -------------------------------------------------------------------------------- /TagDialog.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | Dialog 4 | 5 | 6 | 7 | 0 8 | 0 9 | 891 10 | 548 11 | 12 | 13 | 14 | Dialog 15 | 16 | 17 | 18 | 19 | 75 20 | 41 21 | 751 22 | 451 23 | 24 | 25 | 26 | 27 | Tag ID 28 | 29 | 30 | 31 | 32 | VR 33 | 34 | 35 | 36 | 37 | VM 38 | 39 | 40 | 41 | 42 | Length 43 | 44 | 45 | 46 | 47 | Description 48 | 49 | 50 | 51 | 52 | Value 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /VtkInclude.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include "vtkSmartVolumeMapper.h" 3 | #include "vtkBoundedPlanePointPlacer.h" 4 | #include "vtkCellPicker.h" 5 | #include "vtkCommand.h" 6 | #include "vtkDICOMImageReader.h" 7 | #include "vtkDistanceRepresentation.h" 8 | #include "vtkDistanceRepresentation2D.h" 9 | #include "vtkDistanceWidget.h" 10 | #include 11 | #include "vtkHandleRepresentation.h" 12 | #include "vtkImageData.h" 13 | #include "vtkImageMapToWindowLevelColors.h" 14 | #include "vtkImageSlabReslice.h" 15 | #include "vtkInteractorStyleImage.h" 16 | #include "vtkLookupTable.h" 17 | #include "vtkPlane.h" 18 | #include "vtkPlaneSource.h" 19 | #include "vtkPointHandleRepresentation2D.h" 20 | #include "vtkPointHandleRepresentation3D.h" 21 | #include "vtkProperty.h" 22 | #include 23 | #include 24 | #include "vtkRenderWindowInteractor.h" 25 | #include "vtkResliceImageViewer.h" 26 | #include "vtkResliceCursorLineRepresentation.h" 27 | #include "vtkResliceCursorThickLineRepresentation.h" 28 | #include "vtkResliceCursorWidget.h" 29 | #include "vtkResliceCursorActor.h" 30 | #include "vtkResliceCursorPolyDataAlgorithm.h" 31 | #include "vtkResliceCursor.h" 32 | #include "vtkResliceImageViewerMeasurements.h" 33 | #include 34 | #include 35 | #include 36 | #include 37 | #include "vtkVolumePicker.h" 38 | #include "vtkPicker.h" 39 | #include "vtkCellPicker.h" 40 | #include 41 | #include 42 | #include 43 | #include 44 | #include 45 | #include 46 | #include 47 | #include 48 | #include 49 | 50 | #include 51 | #include 52 | #include 53 | #include 54 | #include 55 | #include 56 | #include 57 | #include "vtkImageReslice.h" 58 | #include "vtkNamedColors.h" 59 | 60 | #include 61 | #include 62 | #include 63 | #include 64 | #include 65 | #include 66 | #include 67 | #include 68 | #include 69 | #include 70 | #include 71 | //VTL include header 72 | 73 | 74 | #include 75 | #include 76 | #include 77 | #include 78 | #include 79 | #include 80 | #include 81 | #include 82 | #include 83 | #include 84 | #include 85 | #include 86 | #include 87 | #include 88 | 89 | #include 90 | #include 91 | #include 92 | #include 93 | #include 94 | #include 95 | #include 96 | #include 97 | #include 98 | #include 99 | #include 100 | #include 101 | #include 102 | 103 | //filter 104 | #include 105 | #include 106 | #include 107 | #include 108 | #include 109 | 110 | #include 111 | #include 112 | #include 113 | #include 114 | 115 | #include 116 | #include 117 | #include 118 | #include 119 | #include 120 | 121 | //for vtk line storing and showing 122 | #include 123 | #include 124 | #include 125 | #include 126 | #include 127 | #include 128 | 129 | //for screenshot 130 | #include 131 | #include 132 | 133 | //for volume calculation 134 | #include 135 | 136 | //for image 137 | #include 138 | #include 139 | #include 140 | #include 141 | #include 142 | #include 143 | #include 144 | #include 145 | #include 146 | #include 147 | #include 148 | #include 149 | #include 150 | #include 151 | #include 152 | #include 153 | #include 154 | #include 155 | #include 156 | #include 157 | #include 158 | #include 159 | #include 160 | #include 161 | #include 162 | #include 163 | #include 164 | #include 165 | #include 166 | #include 167 | #include 168 | #include 169 | -------------------------------------------------------------------------------- /main.cpp: -------------------------------------------------------------------------------- 1 | #include "simpleTK.h" 2 | #include 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | QApplication application(argc, argv); 7 | vtkObject::GlobalWarningDisplayOff(); 8 | application.setWindowIcon(QIcon(iconapp)); 9 | simpleTK w; 10 | w.show(); 11 | return application.exec(); 12 | } 13 | -------------------------------------------------------------------------------- /res/0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/0.png -------------------------------------------------------------------------------- /res/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/1.png -------------------------------------------------------------------------------- /res/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/2.png -------------------------------------------------------------------------------- /res/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/3.png -------------------------------------------------------------------------------- /res/3d_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/3d_icon.png -------------------------------------------------------------------------------- /res/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/4.png -------------------------------------------------------------------------------- /res/SLC/0000.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0000.dcm -------------------------------------------------------------------------------- /res/SLC/0001.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0001.dcm -------------------------------------------------------------------------------- /res/SLC/0002.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0002.dcm -------------------------------------------------------------------------------- /res/SLC/0003.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0003.dcm -------------------------------------------------------------------------------- /res/SLC/0004.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0004.dcm -------------------------------------------------------------------------------- /res/SLC/0005.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0005.dcm -------------------------------------------------------------------------------- /res/SLC/0006.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0006.dcm -------------------------------------------------------------------------------- /res/SLC/0007.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0007.dcm -------------------------------------------------------------------------------- /res/SLC/0008.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0008.dcm -------------------------------------------------------------------------------- /res/SLC/0009.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0009.dcm -------------------------------------------------------------------------------- /res/SLC/0010.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0010.dcm -------------------------------------------------------------------------------- /res/SLC/0011.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0011.dcm -------------------------------------------------------------------------------- /res/SLC/0012.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0012.dcm -------------------------------------------------------------------------------- /res/SLC/0013.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0013.dcm -------------------------------------------------------------------------------- /res/SLC/0014.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0014.dcm -------------------------------------------------------------------------------- /res/SLC/0015.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0015.dcm -------------------------------------------------------------------------------- /res/SLC/0016.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0016.dcm -------------------------------------------------------------------------------- /res/SLC/0017.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0017.dcm -------------------------------------------------------------------------------- /res/SLC/0018.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0018.dcm -------------------------------------------------------------------------------- /res/SLC/0019.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0019.dcm -------------------------------------------------------------------------------- /res/SLC/0020.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0020.dcm -------------------------------------------------------------------------------- /res/SLC/0021.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0021.dcm -------------------------------------------------------------------------------- /res/SLC/0022.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0022.dcm -------------------------------------------------------------------------------- /res/SLC/0023.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0023.dcm -------------------------------------------------------------------------------- /res/SLC/0024.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0024.dcm -------------------------------------------------------------------------------- /res/SLC/0025.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0025.dcm -------------------------------------------------------------------------------- /res/SLC/0026.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0026.dcm -------------------------------------------------------------------------------- /res/SLC/0027.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0027.dcm -------------------------------------------------------------------------------- /res/SLC/0028.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0028.dcm -------------------------------------------------------------------------------- /res/SLC/0029.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0029.dcm -------------------------------------------------------------------------------- /res/SLC/0030.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0030.dcm -------------------------------------------------------------------------------- /res/SLC/0031.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0031.dcm -------------------------------------------------------------------------------- /res/SLC/0032.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0032.dcm -------------------------------------------------------------------------------- /res/SLC/0033.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0033.dcm -------------------------------------------------------------------------------- /res/SLC/0034.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0034.dcm -------------------------------------------------------------------------------- /res/SLC/0035.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0035.dcm -------------------------------------------------------------------------------- /res/SLC/0036.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0036.dcm -------------------------------------------------------------------------------- /res/SLC/0037.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0037.dcm -------------------------------------------------------------------------------- /res/SLC/0038.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0038.dcm -------------------------------------------------------------------------------- /res/SLC/0039.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0039.dcm -------------------------------------------------------------------------------- /res/SLC/0040.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0040.dcm -------------------------------------------------------------------------------- /res/SLC/0041.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0041.dcm -------------------------------------------------------------------------------- /res/SLC/0042.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0042.dcm -------------------------------------------------------------------------------- /res/SLC/0043.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0043.dcm -------------------------------------------------------------------------------- /res/SLC/0044.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0044.dcm -------------------------------------------------------------------------------- /res/SLC/0045.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0045.dcm -------------------------------------------------------------------------------- /res/SLC/0046.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0046.dcm -------------------------------------------------------------------------------- /res/SLC/0047.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0047.dcm -------------------------------------------------------------------------------- /res/SLC/0048.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0048.dcm -------------------------------------------------------------------------------- /res/SLC/0049.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0049.dcm -------------------------------------------------------------------------------- /res/SLC/0050.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0050.dcm -------------------------------------------------------------------------------- /res/SLC/0051.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0051.dcm -------------------------------------------------------------------------------- /res/SLC/0052.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0052.dcm -------------------------------------------------------------------------------- /res/SLC/0053.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0053.dcm -------------------------------------------------------------------------------- /res/SLC/0054.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0054.dcm -------------------------------------------------------------------------------- /res/SLC/0055.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0055.dcm -------------------------------------------------------------------------------- /res/SLC/0056.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0056.dcm -------------------------------------------------------------------------------- /res/SLC/0057.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0057.dcm -------------------------------------------------------------------------------- /res/SLC/0058.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0058.dcm -------------------------------------------------------------------------------- /res/SLC/0059.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0059.dcm -------------------------------------------------------------------------------- /res/SLC/0060.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0060.dcm -------------------------------------------------------------------------------- /res/SLC/0061.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0061.dcm -------------------------------------------------------------------------------- /res/SLC/0062.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0062.dcm -------------------------------------------------------------------------------- /res/SLC/0063.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0063.dcm -------------------------------------------------------------------------------- /res/SLC/0064.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0064.dcm -------------------------------------------------------------------------------- /res/SLC/0065.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0065.dcm -------------------------------------------------------------------------------- /res/SLC/0066.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0066.dcm -------------------------------------------------------------------------------- /res/SLC/0067.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0067.dcm -------------------------------------------------------------------------------- /res/SLC/0068.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0068.dcm -------------------------------------------------------------------------------- /res/SLC/0069.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0069.dcm -------------------------------------------------------------------------------- /res/SLC/0070.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0070.dcm -------------------------------------------------------------------------------- /res/SLC/0071.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0071.dcm -------------------------------------------------------------------------------- /res/SLC/0072.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0072.dcm -------------------------------------------------------------------------------- /res/SLC/0073.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0073.dcm -------------------------------------------------------------------------------- /res/SLC/0074.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0074.dcm -------------------------------------------------------------------------------- /res/SLC/0075.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0075.dcm -------------------------------------------------------------------------------- /res/SLC/0076.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0076.dcm -------------------------------------------------------------------------------- /res/SLC/0077.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0077.dcm -------------------------------------------------------------------------------- /res/SLC/0078.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0078.dcm -------------------------------------------------------------------------------- /res/SLC/0079.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0079.dcm -------------------------------------------------------------------------------- /res/SLC/0080.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0080.dcm -------------------------------------------------------------------------------- /res/SLC/0081.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0081.dcm -------------------------------------------------------------------------------- /res/SLC/0082.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0082.dcm -------------------------------------------------------------------------------- /res/SLC/0083.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0083.dcm -------------------------------------------------------------------------------- /res/SLC/0084.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0084.dcm -------------------------------------------------------------------------------- /res/SLC/0085.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0085.dcm -------------------------------------------------------------------------------- /res/SLC/0086.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0086.dcm -------------------------------------------------------------------------------- /res/SLC/0087.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0087.dcm -------------------------------------------------------------------------------- /res/SLC/0088.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0088.dcm -------------------------------------------------------------------------------- /res/SLC/0089.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0089.dcm -------------------------------------------------------------------------------- /res/SLC/0090.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0090.dcm -------------------------------------------------------------------------------- /res/SLC/0091.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0091.dcm -------------------------------------------------------------------------------- /res/SLC/0092.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0092.dcm -------------------------------------------------------------------------------- /res/SLC/0093.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0093.dcm -------------------------------------------------------------------------------- /res/SLC/0094.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0094.dcm -------------------------------------------------------------------------------- /res/SLC/0095.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0095.dcm -------------------------------------------------------------------------------- /res/SLC/0096.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0096.dcm -------------------------------------------------------------------------------- /res/SLC/0097.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0097.dcm -------------------------------------------------------------------------------- /res/SLC/0098.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0098.dcm -------------------------------------------------------------------------------- /res/SLC/0099.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0099.dcm -------------------------------------------------------------------------------- /res/SLC/0100.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0100.dcm -------------------------------------------------------------------------------- /res/SLC/0101.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0101.dcm -------------------------------------------------------------------------------- /res/SLC/0102.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0102.dcm -------------------------------------------------------------------------------- /res/SLC/0103.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0103.dcm -------------------------------------------------------------------------------- /res/SLC/0104.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0104.dcm -------------------------------------------------------------------------------- /res/SLC/0105.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0105.dcm -------------------------------------------------------------------------------- /res/SLC/0106.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0106.dcm -------------------------------------------------------------------------------- /res/SLC/0107.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0107.dcm -------------------------------------------------------------------------------- /res/SLC/0108.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0108.dcm -------------------------------------------------------------------------------- /res/SLC/0109.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0109.dcm -------------------------------------------------------------------------------- /res/SLC/0110.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0110.dcm -------------------------------------------------------------------------------- /res/SLC/0111.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0111.dcm -------------------------------------------------------------------------------- /res/SLC/0112.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0112.dcm -------------------------------------------------------------------------------- /res/SLC/0113.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0113.dcm -------------------------------------------------------------------------------- /res/SLC/0114.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0114.dcm -------------------------------------------------------------------------------- /res/SLC/0115.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0115.dcm -------------------------------------------------------------------------------- /res/SLC/0116.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0116.dcm -------------------------------------------------------------------------------- /res/SLC/0117.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0117.dcm -------------------------------------------------------------------------------- /res/SLC/0118.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0118.dcm -------------------------------------------------------------------------------- /res/SLC/0119.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0119.dcm -------------------------------------------------------------------------------- /res/SLC/0120.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0120.dcm -------------------------------------------------------------------------------- /res/SLC/0121.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0121.dcm -------------------------------------------------------------------------------- /res/SLC/0122.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0122.dcm -------------------------------------------------------------------------------- /res/SLC/0123.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0123.dcm -------------------------------------------------------------------------------- /res/SLC/0124.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0124.dcm -------------------------------------------------------------------------------- /res/SLC/0125.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0125.dcm -------------------------------------------------------------------------------- /res/SLC/0126.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0126.dcm -------------------------------------------------------------------------------- /res/SLC/0127.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0127.dcm -------------------------------------------------------------------------------- /res/SLC/0128.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0128.dcm -------------------------------------------------------------------------------- /res/SLC/0129.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0129.dcm -------------------------------------------------------------------------------- /res/SLC/0130.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0130.dcm -------------------------------------------------------------------------------- /res/SLC/0131.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0131.dcm -------------------------------------------------------------------------------- /res/SLC/0132.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0132.dcm -------------------------------------------------------------------------------- /res/SLC/0133.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0133.dcm -------------------------------------------------------------------------------- /res/SLC/0134.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0134.dcm -------------------------------------------------------------------------------- /res/SLC/0135.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0135.dcm -------------------------------------------------------------------------------- /res/SLC/0136.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0136.dcm -------------------------------------------------------------------------------- /res/SLC/0137.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0137.dcm -------------------------------------------------------------------------------- /res/SLC/0138.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0138.dcm -------------------------------------------------------------------------------- /res/SLC/0139.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0139.dcm -------------------------------------------------------------------------------- /res/SLC/0140.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0140.dcm -------------------------------------------------------------------------------- /res/SLC/0141.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0141.dcm -------------------------------------------------------------------------------- /res/SLC/0142.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0142.dcm -------------------------------------------------------------------------------- /res/SLC/0143.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0143.dcm -------------------------------------------------------------------------------- /res/SLC/0144.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0144.dcm -------------------------------------------------------------------------------- /res/SLC/0145.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0145.dcm -------------------------------------------------------------------------------- /res/SLC/0146.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0146.dcm -------------------------------------------------------------------------------- /res/SLC/0147.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0147.dcm -------------------------------------------------------------------------------- /res/SLC/0148.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0148.dcm -------------------------------------------------------------------------------- /res/SLC/0149.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0149.dcm -------------------------------------------------------------------------------- /res/SLC/0150.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0150.dcm -------------------------------------------------------------------------------- /res/SLC/0151.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0151.dcm -------------------------------------------------------------------------------- /res/SLC/0152.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0152.dcm -------------------------------------------------------------------------------- /res/SLC/0153.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0153.dcm -------------------------------------------------------------------------------- /res/SLC/0154.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0154.dcm -------------------------------------------------------------------------------- /res/SLC/0155.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0155.dcm -------------------------------------------------------------------------------- /res/SLC/0156.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0156.dcm -------------------------------------------------------------------------------- /res/SLC/0157.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0157.dcm -------------------------------------------------------------------------------- /res/SLC/0158.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0158.dcm -------------------------------------------------------------------------------- /res/SLC/0159.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0159.dcm -------------------------------------------------------------------------------- /res/SLC/0160.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0160.dcm -------------------------------------------------------------------------------- /res/SLC/0161.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0161.dcm -------------------------------------------------------------------------------- /res/SLC/0162.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0162.dcm -------------------------------------------------------------------------------- /res/SLC/0163.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0163.dcm -------------------------------------------------------------------------------- /res/SLC/0164.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0164.dcm -------------------------------------------------------------------------------- /res/SLC/0165.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0165.dcm -------------------------------------------------------------------------------- /res/SLC/0166.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0166.dcm -------------------------------------------------------------------------------- /res/SLC/0167.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0167.dcm -------------------------------------------------------------------------------- /res/SLC/0168.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0168.dcm -------------------------------------------------------------------------------- /res/SLC/0169.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0169.dcm -------------------------------------------------------------------------------- /res/SLC/0170.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0170.dcm -------------------------------------------------------------------------------- /res/SLC/0171.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0171.dcm -------------------------------------------------------------------------------- /res/SLC/0172.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0172.dcm -------------------------------------------------------------------------------- /res/SLC/0173.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0173.dcm -------------------------------------------------------------------------------- /res/SLC/0174.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0174.dcm -------------------------------------------------------------------------------- /res/SLC/0175.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0175.dcm -------------------------------------------------------------------------------- /res/SLC/0176.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0176.dcm -------------------------------------------------------------------------------- /res/SLC/0177.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0177.dcm -------------------------------------------------------------------------------- /res/SLC/0178.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0178.dcm -------------------------------------------------------------------------------- /res/SLC/0179.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0179.dcm -------------------------------------------------------------------------------- /res/SLC/0180.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0180.dcm -------------------------------------------------------------------------------- /res/SLC/0181.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0181.dcm -------------------------------------------------------------------------------- /res/SLC/0182.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0182.dcm -------------------------------------------------------------------------------- /res/SLC/0183.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0183.dcm -------------------------------------------------------------------------------- /res/SLC/0184.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0184.dcm -------------------------------------------------------------------------------- /res/SLC/0185.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0185.dcm -------------------------------------------------------------------------------- /res/SLC/0186.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0186.dcm -------------------------------------------------------------------------------- /res/SLC/0187.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0187.dcm -------------------------------------------------------------------------------- /res/SLC/0188.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0188.dcm -------------------------------------------------------------------------------- /res/SLC/0189.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0189.dcm -------------------------------------------------------------------------------- /res/SLC/0190.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0190.dcm -------------------------------------------------------------------------------- /res/SLC/0191.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0191.dcm -------------------------------------------------------------------------------- /res/SLC/0192.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0192.dcm -------------------------------------------------------------------------------- /res/SLC/0193.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0193.dcm -------------------------------------------------------------------------------- /res/SLC/0194.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0194.dcm -------------------------------------------------------------------------------- /res/SLC/0195.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0195.dcm -------------------------------------------------------------------------------- /res/SLC/0196.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0196.dcm -------------------------------------------------------------------------------- /res/SLC/0197.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0197.dcm -------------------------------------------------------------------------------- /res/SLC/0198.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0198.dcm -------------------------------------------------------------------------------- /res/SLC/0199.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0199.dcm -------------------------------------------------------------------------------- /res/SLC/0200.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0200.dcm -------------------------------------------------------------------------------- /res/SLC/0201.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0201.dcm -------------------------------------------------------------------------------- /res/SLC/0202.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0202.dcm -------------------------------------------------------------------------------- /res/SLC/0203.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0203.dcm -------------------------------------------------------------------------------- /res/SLC/0204.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0204.dcm -------------------------------------------------------------------------------- /res/SLC/0205.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0205.dcm -------------------------------------------------------------------------------- /res/SLC/0206.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0206.dcm -------------------------------------------------------------------------------- /res/SLC/0207.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0207.dcm -------------------------------------------------------------------------------- /res/SLC/0208.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0208.dcm -------------------------------------------------------------------------------- /res/SLC/0209.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0209.dcm -------------------------------------------------------------------------------- /res/SLC/0210.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0210.dcm -------------------------------------------------------------------------------- /res/SLC/0211.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0211.dcm -------------------------------------------------------------------------------- /res/SLC/0212.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0212.dcm -------------------------------------------------------------------------------- /res/SLC/0213.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0213.dcm -------------------------------------------------------------------------------- /res/SLC/0214.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0214.dcm -------------------------------------------------------------------------------- /res/SLC/0215.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0215.dcm -------------------------------------------------------------------------------- /res/SLC/0216.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0216.dcm -------------------------------------------------------------------------------- /res/SLC/0217.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0217.dcm -------------------------------------------------------------------------------- /res/SLC/0218.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0218.dcm -------------------------------------------------------------------------------- /res/SLC/0219.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0219.dcm -------------------------------------------------------------------------------- /res/SLC/0220.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0220.dcm -------------------------------------------------------------------------------- /res/SLC/0221.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0221.dcm -------------------------------------------------------------------------------- /res/SLC/0222.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0222.dcm -------------------------------------------------------------------------------- /res/SLC/0223.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0223.dcm -------------------------------------------------------------------------------- /res/SLC/0224.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0224.dcm -------------------------------------------------------------------------------- /res/SLC/0225.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0225.dcm -------------------------------------------------------------------------------- /res/SLC/0226.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0226.dcm -------------------------------------------------------------------------------- /res/SLC/0227.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0227.dcm -------------------------------------------------------------------------------- /res/SLC/0228.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0228.dcm -------------------------------------------------------------------------------- /res/SLC/0229.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0229.dcm -------------------------------------------------------------------------------- /res/SLC/0230.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0230.dcm -------------------------------------------------------------------------------- /res/SLC/0231.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0231.dcm -------------------------------------------------------------------------------- /res/SLC/0232.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0232.dcm -------------------------------------------------------------------------------- /res/SLC/0233.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0233.dcm -------------------------------------------------------------------------------- /res/SLC/0234.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0234.dcm -------------------------------------------------------------------------------- /res/SLC/0235.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0235.dcm -------------------------------------------------------------------------------- /res/SLC/0236.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0236.dcm -------------------------------------------------------------------------------- /res/SLC/0237.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0237.dcm -------------------------------------------------------------------------------- /res/SLC/0238.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0238.dcm -------------------------------------------------------------------------------- /res/SLC/0239.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0239.dcm -------------------------------------------------------------------------------- /res/SLC/0240.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0240.dcm -------------------------------------------------------------------------------- /res/SLC/0241.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0241.dcm -------------------------------------------------------------------------------- /res/SLC/0242.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0242.dcm -------------------------------------------------------------------------------- /res/SLC/0243.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0243.dcm -------------------------------------------------------------------------------- /res/SLC/0244.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0244.dcm -------------------------------------------------------------------------------- /res/SLC/0245.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0245.dcm -------------------------------------------------------------------------------- /res/SLC/0246.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0246.dcm -------------------------------------------------------------------------------- /res/SLC/0247.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0247.dcm -------------------------------------------------------------------------------- /res/SLC/0248.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0248.dcm -------------------------------------------------------------------------------- /res/SLC/0249.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0249.dcm -------------------------------------------------------------------------------- /res/SLC/0250.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0250.dcm -------------------------------------------------------------------------------- /res/SLC/0251.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0251.dcm -------------------------------------------------------------------------------- /res/SLC/0252.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0252.dcm -------------------------------------------------------------------------------- /res/SLC/0253.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0253.dcm -------------------------------------------------------------------------------- /res/SLC/0254.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0254.dcm -------------------------------------------------------------------------------- /res/SLC/0255.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0255.dcm -------------------------------------------------------------------------------- /res/SLC/0256.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0256.dcm -------------------------------------------------------------------------------- /res/SLC/0257.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0257.dcm -------------------------------------------------------------------------------- /res/SLC/0258.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0258.dcm -------------------------------------------------------------------------------- /res/SLC/0259.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0259.dcm -------------------------------------------------------------------------------- /res/SLC/0260.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0260.dcm -------------------------------------------------------------------------------- /res/SLC/0261.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0261.dcm -------------------------------------------------------------------------------- /res/SLC/0262.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0262.dcm -------------------------------------------------------------------------------- /res/SLC/0263.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0263.dcm -------------------------------------------------------------------------------- /res/SLC/0264.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0264.dcm -------------------------------------------------------------------------------- /res/SLC/0265.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0265.dcm -------------------------------------------------------------------------------- /res/SLC/0266.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0266.dcm -------------------------------------------------------------------------------- /res/SLC/0267.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0267.dcm -------------------------------------------------------------------------------- /res/SLC/0268.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0268.dcm -------------------------------------------------------------------------------- /res/SLC/0269.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0269.dcm -------------------------------------------------------------------------------- /res/SLC/0270.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0270.dcm -------------------------------------------------------------------------------- /res/SLC/0271.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0271.dcm -------------------------------------------------------------------------------- /res/SLC/0272.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0272.dcm -------------------------------------------------------------------------------- /res/SLC/0273.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0273.dcm -------------------------------------------------------------------------------- /res/SLC/0274.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0274.dcm -------------------------------------------------------------------------------- /res/SLC/0275.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0275.dcm -------------------------------------------------------------------------------- /res/SLC/0276.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0276.dcm -------------------------------------------------------------------------------- /res/SLC/0277.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0277.dcm -------------------------------------------------------------------------------- /res/SLC/0278.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0278.dcm -------------------------------------------------------------------------------- /res/SLC/0279.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0279.dcm -------------------------------------------------------------------------------- /res/SLC/0280.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0280.dcm -------------------------------------------------------------------------------- /res/SLC/0281.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0281.dcm -------------------------------------------------------------------------------- /res/SLC/0282.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0282.dcm -------------------------------------------------------------------------------- /res/SLC/0283.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0283.dcm -------------------------------------------------------------------------------- /res/SLC/0284.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0284.dcm -------------------------------------------------------------------------------- /res/SLC/0285.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0285.dcm -------------------------------------------------------------------------------- /res/SLC/0286.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0286.dcm -------------------------------------------------------------------------------- /res/SLC/0287.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0287.dcm -------------------------------------------------------------------------------- /res/SLC/0288.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0288.dcm -------------------------------------------------------------------------------- /res/SLC/0289.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0289.dcm -------------------------------------------------------------------------------- /res/SLC/0290.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0290.dcm -------------------------------------------------------------------------------- /res/SLC/0291.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0291.dcm -------------------------------------------------------------------------------- /res/SLC/0292.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0292.dcm -------------------------------------------------------------------------------- /res/SLC/0293.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0293.dcm -------------------------------------------------------------------------------- /res/SLC/0294.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0294.dcm -------------------------------------------------------------------------------- /res/SLC/0295.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0295.dcm -------------------------------------------------------------------------------- /res/SLC/0296.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0296.dcm -------------------------------------------------------------------------------- /res/SLC/0297.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0297.dcm -------------------------------------------------------------------------------- /res/SLC/0298.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0298.dcm -------------------------------------------------------------------------------- /res/SLC/0299.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0299.dcm -------------------------------------------------------------------------------- /res/SLC/0300.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0300.dcm -------------------------------------------------------------------------------- /res/SLC/0301.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0301.dcm -------------------------------------------------------------------------------- /res/SLC/0302.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0302.dcm -------------------------------------------------------------------------------- /res/SLC/0303.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0303.dcm -------------------------------------------------------------------------------- /res/SLC/0304.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0304.dcm -------------------------------------------------------------------------------- /res/SLC/0305.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0305.dcm -------------------------------------------------------------------------------- /res/SLC/0306.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0306.dcm -------------------------------------------------------------------------------- /res/SLC/0307.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0307.dcm -------------------------------------------------------------------------------- /res/SLC/0308.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0308.dcm -------------------------------------------------------------------------------- /res/SLC/0309.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0309.dcm -------------------------------------------------------------------------------- /res/SLC/0310.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0310.dcm -------------------------------------------------------------------------------- /res/SLC/0311.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0311.dcm -------------------------------------------------------------------------------- /res/SLC/0312.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0312.dcm -------------------------------------------------------------------------------- /res/SLC/0313.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0313.dcm -------------------------------------------------------------------------------- /res/SLC/0314.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0314.dcm -------------------------------------------------------------------------------- /res/SLC/0315.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0315.dcm -------------------------------------------------------------------------------- /res/SLC/0316.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0316.dcm -------------------------------------------------------------------------------- /res/SLC/0317.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0317.dcm -------------------------------------------------------------------------------- /res/SLC/0318.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0318.dcm -------------------------------------------------------------------------------- /res/SLC/0319.dcm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/SLC/0319.dcm -------------------------------------------------------------------------------- /res/arrow_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/arrow_icon.png -------------------------------------------------------------------------------- /res/close-button1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/close-button1.png -------------------------------------------------------------------------------- /res/close-button2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/close-button2.png -------------------------------------------------------------------------------- /res/closeAll_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/closeAll_icon.png -------------------------------------------------------------------------------- /res/closeTab_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/closeTab_icon.png -------------------------------------------------------------------------------- /res/coronavirus_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/coronavirus_icon.png -------------------------------------------------------------------------------- /res/crop_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/crop_icon.png -------------------------------------------------------------------------------- /res/fliphorizontal_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/fliphorizontal_icon.png -------------------------------------------------------------------------------- /res/flipvertical_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/flipvertical_icon.png -------------------------------------------------------------------------------- /res/folder.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /res/icon_big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/icon_big.png -------------------------------------------------------------------------------- /res/icon_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/icon_file.png -------------------------------------------------------------------------------- /res/icon_folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/icon_folder.png -------------------------------------------------------------------------------- /res/icon_layout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/icon_layout.png -------------------------------------------------------------------------------- /res/icon_reslice.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/icon_reslice.png -------------------------------------------------------------------------------- /res/icon_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/icon_small.png -------------------------------------------------------------------------------- /res/invert_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/invert_icon.png -------------------------------------------------------------------------------- /res/loading_gif.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/loading_gif.gif -------------------------------------------------------------------------------- /res/maximize-button1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/maximize-button1.png -------------------------------------------------------------------------------- /res/maximize-button2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/maximize-button2.png -------------------------------------------------------------------------------- /res/minimize-button1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/minimize-button1.png -------------------------------------------------------------------------------- /res/mpr_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/mpr_icon.png -------------------------------------------------------------------------------- /res/open.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /res/overlays.json: -------------------------------------------------------------------------------- 1 | { 2 | "Overlay": 3 | [ 4 | { 5 | "Corner" : 1, 6 | "TagKey" : 524416, 7 | "TextAfter" : "\n", 8 | "TextBefore" : "" 9 | }, 10 | { 11 | "Corner" : 1, 12 | "TagKey" : 1048592, 13 | "TextAfter" : "\n", 14 | "TextBefore" : "" 15 | }, 16 | { 17 | "Corner" : 1, 18 | "TagKey" : 1048624, 19 | "TextAfter" : "\n", 20 | "TextBefore" : "" 21 | }, 22 | { 23 | "Corner" : 1, 24 | "TagKey" : 1048640, 25 | "TextAfter" : "\n", 26 | "TextBefore" : "" 27 | }, 28 | { 29 | "Corner" : 1, 30 | "TagKey" : 1052688, 31 | "TextAfter" : "\n", 32 | "TextBefore" : "" 33 | }, 34 | { 35 | "Corner" : 1, 36 | "TagKey" : 1048608, 37 | "TextAfter" : "\n", 38 | "TextBefore" : "" 39 | }, 40 | { 41 | "Corner" : 1, 42 | "TagKey" : 528432, 43 | "TextAfter" : "\n", 44 | "TextBefore" : "" 45 | }, 46 | { 47 | "Corner" : 1, 48 | "TagKey" : 528446, 49 | "TextAfter" : "\n", 50 | "TextBefore" : "" 51 | }, 52 | { 53 | "Corner" : 2, 54 | "TagKey" : 1001, 55 | "TextAfter" : "\n", 56 | "TextBefore" : "Zoom: " 57 | }, 58 | { 59 | "Corner" : 2, 60 | "TagKey" : 1003, 61 | "TextAfter" : "\n", 62 | "TextBefore" : "Series: " 63 | }, 64 | { 65 | "Corner" : 2, 66 | "TagKey" : 2625617, 67 | "TextAfter" : "\n", 68 | "TextBefore" : " / WW: " 69 | }, 70 | { 71 | "Corner" : 2, 72 | "TagKey" : 2625616, 73 | "TextAfter" : "", 74 | "TextBefore" : "WL: " 75 | }, 76 | { 77 | "Corner" : 3, 78 | "TagKey" : 1577297, 79 | "TextAfter" : " mA", 80 | "TextBefore" : "" 81 | }, 82 | { 83 | "Corner" : 3, 84 | "TagKey" : 1572960, 85 | "TextAfter" : " kV ", 86 | "TextBefore" : "" 87 | }, 88 | { 89 | "Corner" : 0, 90 | "TagKey" : 524320, 91 | "TextAfter" : "", 92 | "TextBefore" : "" 93 | }, 94 | { 95 | "Corner" : 0, 96 | "TagKey" : 524338, 97 | "TextAfter" : "", 98 | "TextBefore" : "\n" 99 | } 100 | ] 101 | } -------------------------------------------------------------------------------- /res/reset_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/reset_icon.png -------------------------------------------------------------------------------- /res/rotateleft_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/rotateleft_icon.png -------------------------------------------------------------------------------- /res/rotateright_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/rotateright_icon.png -------------------------------------------------------------------------------- /res/scroll2d.css: -------------------------------------------------------------------------------- 1 | QScrollBar:vertical { 2 | background: #000000; 3 | width: 5px; 4 | margin: 0; 5 | } 6 | 7 | QScrollBar::handle:vertical { 8 | background: #888; 9 | } 10 | 11 | QScrollBar::handle:hover:vertical { 12 | background: #555; 13 | } 14 | 15 | QScrollBar::add-line:vertical { 16 | height: 0px; 17 | } 18 | 19 | QScrollBar::sub-line:vertical { 20 | height: 0px; 21 | } 22 | 23 | QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { 24 | height: 0px; 25 | background: none; 26 | } -------------------------------------------------------------------------------- /res/tag.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /res/tag2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /res/tag_fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/res/tag_fill.png -------------------------------------------------------------------------------- /res/wenjianjia.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /simpleTK.cpp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/MedRobot-Forum/simpleTK/13eb84df84992a3ffe9ad237b6f74e97764c8b8e/simpleTK.cpp -------------------------------------------------------------------------------- /simpleTK.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "ui_simpleTK.h" 5 | #include 6 | #include 7 | //#include "vtkDICOMDirectory.h" 8 | //#include "vtkDICOMItem.h" 9 | //#include "vtkDICOMMetaData.h" 10 | //#include "vtkDICOMReader.h" 11 | //#include "vtkDICOMDictionary.h" 12 | #include "TagDialog.h" 13 | #include "vtkSmartPointer.h" 14 | #include "vtkStringArray.h" 15 | #include "vtkIntArray.h" 16 | 17 | #include "utility.h" 18 | //#include "MPRMaker.h" 19 | #include "vtkDICOMDirectory.h" 20 | #include 21 | #include "vtkwidgetmpr.h" 22 | #include 23 | #include "vtkboxwidget3dcallback.h" 24 | class simpleTK : public QMainWindow 25 | { 26 | Q_OBJECT 27 | 28 | public: 29 | simpleTK(QWidget *parent = nullptr); 30 | ~simpleTK(); 31 | 32 | 33 | public slots: 34 | void openFolder(); 35 | void openDicomTag(); 36 | void showCursorReslize(bool flag); 37 | void showBoxCrop(bool flag); 38 | void init(); 39 | //void constructMPR(double *center); 40 | void constructMPR(); 41 | void constructMPR2(vtkSmartPointer imageData); 42 | void constructMPR3(vtkSmartPointer imageData); 43 | //void GetVector1(vtkPlaneSource* planeSource, double v1[3]); 44 | //void GetVector2(vtkPlaneSource* planeSource, double v2[3]); 45 | 46 | void volumeRender(vtkSmartPointer imageData); 47 | void UpdateRenderModel(int value); 48 | void activateBoxWidget(const bool& t_flag); 49 | private: 50 | void initBoxWidget(); 51 | void initBoxWidgetCallback(); 52 | private: 53 | Ui::simpleTKClass ui; 54 | //std::unique_ptr m_mprMaker = {}; 55 | std::unique_ptr m_widgetMPR = {}; 56 | std::string m_path = {}; 57 | TagDialog* tagDialog = nullptr; 58 | 59 | private: 60 | 61 | vtkSmartPointer imageViewer[3]; 62 | vtkSmartPointer renderer[3]; 63 | vtkSmartPointer windowInteractor[3]; 64 | vtkSmartPointer irenderWindow[3]; 65 | 66 | //3d 67 | vtkSmartPointer volumeRenderer; 68 | vtkSmartPointer m_boxWidget; 69 | vtkSmartPointer m_boxWidgetCallback = {}; 70 | 71 | 72 | 73 | /////////////////////////////////////////////////////// 74 | //vtkSmartPointer mReader = vtkSmartPointer::New(); 75 | vtkSmartPointer mReader = vtkSmartPointer::New(); 76 | //vtkSmartPointer mImageViewer[3]; 77 | //vtkSmartPointer renderer[4]; 78 | //vtkSmartPointer mImageViewerWindowInteractor[3]; 79 | //vtkSmartPointer mImageViewerRenderWindow[3]; 80 | vtkSmartPointer mViewImage2D[3]; 81 | vtkSmartPointer mpColors; 82 | vtkSmartPointer mpSlicePlanes[3]; 83 | vtkSmartPointer mpSlicePlaneActors[3]; 84 | vtkSmartPointer renderWindows[4] = {}; 85 | vtkSmartPointer reslice[3]; 86 | //vtkSmartPointer windowInteractor[4]; 87 | 88 | vtkSmartPointer volumeMapper; 89 | vtkSmartPointer volume; 90 | vtkSmartPointer volumeProperty = vtkSmartPointer::New(); 91 | 92 | 93 | 94 | vtkSmartPointer riw[3]; 95 | vtkSmartPointer planeWidget[3]; 96 | vtkSmartPointer DistanceWidget[3]; 97 | vtkSmartPointer ResliceMeasurements; 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | }; 110 | -------------------------------------------------------------------------------- /simpleTK.qrc: -------------------------------------------------------------------------------- 1 | 2 | 3 | res/crop_icon.png 4 | res/icon_reslice.png 5 | res/folder.svg 6 | res/tag2.svg 7 | res/tag_fill.png 8 | res/icon_big.png 9 | res/wenjianjia.svg 10 | res/tag.svg 11 | res/icon_small.png 12 | 13 | 14 | -------------------------------------------------------------------------------- /simpleTK.ui: -------------------------------------------------------------------------------- 1 | 2 | 3 | simpleTKClass 4 | 5 | 6 | 7 | 0 8 | 0 9 | 777 10 | 604 11 | 12 | 13 | 14 | simpleTK 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | TopToolBarArea 56 | 57 | 58 | false 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | :/res/res/tag2.svg:/res/res/tag2.svg 69 | 70 | 71 | Tag 72 | 73 | 74 | Tag 75 | 76 | 77 | 78 | 79 | 80 | :/res/res/folder.svg:/res/res/folder.svg 81 | 82 | 83 | Folder 84 | 85 | 86 | 87 | 88 | 89 | :/res/res/icon_reslice.png:/res/res/icon_reslice.png 90 | 91 | 92 | reslize 93 | 94 | 95 | 96 | 97 | 98 | :/res/res/crop_icon.png:/res/res/crop_icon.png 99 | 100 | 101 | actionCrop 102 | 103 | 104 | 105 | 106 | 107 | 108 | QVTKOpenGLNativeWidget 109 | QWidget 110 |
qvtkopenglnativewidget.h
111 |
112 |
113 | 114 | 115 | 116 | 117 |
118 | -------------------------------------------------------------------------------- /transferfunction.cpp: -------------------------------------------------------------------------------- 1 | #include "transferfunction.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | //----------------------------------------------------------------------------- 8 | void TransferFunction::setMaximumIntensityProjectionFunction(const int& t_windowCenter, 9 | const int& t_windowWidth) 10 | { 11 | m_ambient = 0.1; 12 | m_diffuse = 0.7; 13 | m_specular = 1; 14 | m_specularPower = 64; 15 | m_window = t_windowCenter; 16 | m_level = t_windowWidth; 17 | m_shade = true; 18 | } 19 | 20 | //----------------------------------------------------------------------------- 21 | void TransferFunction::updateWindowLevel(const double& t_window, const double& t_level) 22 | { 23 | m_window += t_window; 24 | m_level += t_level; 25 | if (m_colorFunction) 26 | { 27 | m_colorFunction->RemoveAllPoints(); 28 | for (const auto& colorPoint : m_colors) 29 | { 30 | m_colorFunction->AddRGBPoint( 31 | m_level + m_window * 32 | colorPoint->getValue() / 1000, 33 | colorPoint->getRed(), 34 | colorPoint->getGreen(), 35 | colorPoint->getBlue()); 36 | } 37 | } 38 | if (m_opacityFunction) 39 | { 40 | m_opacityFunction->RemoveAllPoints(); 41 | for (const auto& opacityPoint : m_opacities) 42 | { 43 | m_opacityFunction->AddPoint( 44 | m_level + m_window * 45 | opacityPoint->getValue() / 1000, 46 | opacityPoint->getAlpha()); 47 | } 48 | } 49 | } 50 | 51 | //----------------------------------------------------------------------------- 52 | void TransferFunction::loadFilterFromFile(const QString& t_fileName) 53 | { 54 | QFile filter(t_fileName); 55 | if (filter.open(QIODevice::ReadOnly | QIODevice::Text)) 56 | { 57 | const QByteArray data = filter.readAll(); 58 | filter.close(); 59 | const auto doc = QJsonDocument::fromJson(data); 60 | const QJsonObject root = doc.object(); 61 | extractColorFunctionInfo(root.value("color").toArray()); 62 | extractOpacityFunctionInfo(root.value("opacity").toArray()); 63 | m_ambient = root.value("ambient").toObject()["value"].toDouble(); 64 | m_diffuse = root.value("diffuse").toObject()["value"].toDouble(); 65 | m_specular = root.value("specular").toObject()["value"].toDouble(); 66 | m_specularPower = root.value("specularpower").toObject()["value"].toDouble(); 67 | m_shade = root.value("shade").toObject()["value"].toInt(); 68 | m_window = 1000; 69 | m_level = 0; 70 | } 71 | else 72 | { 73 | throw std::runtime_error("Filter file not found!"); 74 | } 75 | } 76 | 77 | //----------------------------------------------------------------------------- 78 | void TransferFunction::extractColorFunctionInfo(const QJsonArray& t_array) 79 | { 80 | m_colorFunction = vtkSmartPointer::New(); 81 | m_colors.clear(); 82 | for (const auto& value : t_array) 83 | { 84 | m_colors.emplace_back(std::make_unique()); 85 | m_colors.back()->setValue(value.toObject()["value"].toDouble()); 86 | m_colors.back()->setRed(value.toObject()["red"].toDouble()); 87 | m_colors.back()->setGreen(value.toObject()["green"].toDouble()); 88 | m_colors.back()->setBlue(value.toObject()["blue"].toDouble()); 89 | m_colorFunction->AddRGBPoint(m_colors.back()->getValue(), 90 | m_colors.back()->getRed(), m_colors.back()->getGreen(), 91 | m_colors.back()->getBlue()); 92 | } 93 | } 94 | 95 | //----------------------------------------------------------------------------- 96 | void TransferFunction::extractOpacityFunctionInfo(const QJsonArray& t_array) 97 | { 98 | m_opacityFunction = vtkSmartPointer::New(); 99 | m_opacities.clear(); 100 | for (const auto& value : t_array) 101 | { 102 | m_opacities.emplace_back(std::make_unique()); 103 | m_opacities.back()->setValue(value.toObject()["value"].toDouble()); 104 | m_opacities.back()->setAlpha(value.toObject()["alpha"].toDouble()); 105 | m_opacityFunction->AddPoint(m_opacities.back()->getValue(), 106 | m_opacities.back()->getAlpha()); 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /transferfunction.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | class QJsonArray; 10 | class QString; 11 | 12 | 13 | class Color 14 | { 15 | public: 16 | Color() = default; 17 | ~Color() = default; 18 | 19 | //getters 20 | [[nodiscard]] int getValue() const { return m_value; } 21 | [[nodiscard]] double getRed() const { return m_red; } 22 | [[nodiscard]] double getGreen() const { return m_green; } 23 | [[nodiscard]] double getBlue() const { return m_blue; } 24 | 25 | //setters 26 | void setValue(const int& t_value) { m_value = t_value; } 27 | void setRed(const double& t_red) { m_red = t_red; } 28 | void setGreen(const double& t_green) { m_green = t_green; } 29 | void setBlue(const double& t_blue) { m_blue = t_blue; } 30 | 31 | private: 32 | int m_value = {}; 33 | double m_red = {}; 34 | double m_green = {}; 35 | double m_blue = {}; 36 | }; 37 | 38 | class Opacity 39 | { 40 | public: 41 | Opacity() = default; 42 | ~Opacity() = default; 43 | 44 | //getters 45 | [[nodiscard]] int getValue() const { return m_value; } 46 | [[nodiscard]] double getAlpha() const { return m_alpha; } 47 | 48 | //setters 49 | void setValue(const int& t_value) { m_value = t_value; } 50 | void setAlpha(const double& t_alpha) { m_alpha = t_alpha; } 51 | 52 | private: 53 | int m_value = {}; 54 | double m_alpha = {}; 55 | }; 56 | 57 | class TransferFunction 58 | { 59 | public: 60 | TransferFunction() = default; 61 | ~TransferFunction() = default; 62 | 63 | //getters 64 | [[nodiscard]] int getWindow() const { return m_window; } 65 | [[nodiscard]] int getLevel() const { return m_level; } 66 | [[nodiscard]] double getAmbient() const { return m_ambient; } 67 | [[nodiscard]] double getDiffuse() const { return m_diffuse; } 68 | [[nodiscard]] double getSpecular() const { return m_specular; } 69 | [[nodiscard]] double getSpecularPower() const { return m_specularPower; } 70 | [[nodiscard]] bool getHasShade() const { return m_shade; } 71 | [[nodiscard]] vtkColorTransferFunction* getColorFunction() const { return m_colorFunction ? m_colorFunction : nullptr; } 72 | [[nodiscard]] vtkPiecewiseFunction* getOpacityFunction() const { return m_opacityFunction ? m_opacityFunction : nullptr; } 73 | 74 | //setters 75 | void setWindow(const int& t_window) { m_window = t_window; } 76 | void setLevel(const int& t_level) { m_level = t_level; } 77 | void setAmbient(const double& t_ambient) { m_ambient = t_ambient; } 78 | void setDiffuse(const double& t_diffuse) { m_diffuse = t_diffuse; } 79 | void setSpecular(const double& t_specular) { m_specular = t_specular; } 80 | void setSpecularPower(const double& t_specularPower) { m_specularPower = t_specularPower; } 81 | void setHasShade(const bool& t_shade) { m_shade = t_shade; } 82 | void setMaximumIntensityProjectionFunction(const int& t_windowCenter, const int& t_windowWidth); 83 | 84 | void updateWindowLevel(const double& t_window, const double& t_level); 85 | void loadFilterFromFile(const QString& t_fileName); 86 | 87 | 88 | private: 89 | int m_window = {}; 90 | int m_level = {}; 91 | double m_ambient = 0.1; 92 | double m_diffuse = 0.9; 93 | double m_specular = 1.0; 94 | double m_specularPower = 64; 95 | bool m_shade = true; 96 | std::vector> m_colors = {}; 97 | std::vector> m_opacities = {}; 98 | vtkSmartPointer m_colorFunction = {}; 99 | vtkSmartPointer m_opacityFunction = {}; 100 | 101 | 102 | void extractColorFunctionInfo(const QJsonArray& t_array); 103 | void extractOpacityFunctionInfo(const QJsonArray& t_array); 104 | 105 | }; 106 | 107 | -------------------------------------------------------------------------------- /utility.cpp: -------------------------------------------------------------------------------- 1 | #include "utility.h" 2 | -------------------------------------------------------------------------------- /utility.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | class utility 5 | { 6 | }; 7 | constexpr auto iconTitleBar = ":/res/res/icon_small.png"; 8 | constexpr auto iconapp = ":/res/res/icon_big.png"; 9 | enum class transformationType 10 | { 11 | none, 12 | flipHorizontal, 13 | flipVertical, 14 | rotateLeft, 15 | rotateRight, 16 | invert, 17 | scrollMouse, 18 | zoom, 19 | pan, 20 | windowLevel 21 | }; 22 | 23 | enum class overlayKey 24 | { 25 | zoom = 1001, 26 | series = 1003, 27 | window = 2625616, 28 | level = 2625617 29 | }; 30 | 31 | enum vtkCustomEvents : unsigned long 32 | { 33 | changeScrollValue = vtkCommand::UserEvent + 1, 34 | defaultCursor = changeScrollValue + 1, 35 | cursorMove = defaultCursor + 1, 36 | cursorFinishMovement = cursorMove + 1, 37 | cursorRotate = cursorFinishMovement + 1, 38 | imageChanged = cursorRotate + 1, 39 | qualityLow = imageChanged + 1, 40 | qualityHigh = qualityLow + 1, 41 | }; -------------------------------------------------------------------------------- /vtkBoxWidget3DCallback.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "vtkboxwidget3dcallback.h" 6 | 7 | vtkStandardNewMacro(vtkBoxWidget3DCallback); 8 | 9 | void vtkBoxWidget3DCallback::Execute(vtkObject* caller, [[maybe_unused]] unsigned long eventId, [[maybe_unused]] void* callData) 10 | { 11 | auto* const boxWidget = 12 | vtkBoxWidget2::SafeDownCast(caller); 13 | auto* const boxRepresentation = 14 | vtkBoxRepresentation::SafeDownCast(boxWidget->GetRepresentation()); 15 | boxRepresentation->SetInsideOut(1); 16 | boxRepresentation->GetPlanes(m_planes); 17 | m_volume->GetMapper()->SetClippingPlanes(m_planes); 18 | } 19 | -------------------------------------------------------------------------------- /vtkBoxWidget3DCallback.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | 11 | class vtkBoxWidget3DCallback final : public vtkCommand 12 | { 13 | public: 14 | static vtkBoxWidget3DCallback* New(); 15 | vtkTypeMacro(vtkBoxWidget3DCallback, vtkCommand); 16 | vtkBoxWidget3DCallback() : m_transform(vtkSmartPointer::New()) {} 17 | ~vtkBoxWidget3DCallback() = default; 18 | 19 | //getters 20 | [[nodiscard]] vtkVolume* getVolume() const { return m_volume; } 21 | 22 | //setters 23 | void setVolume(vtkVolume* t_volume) { m_volume = t_volume; } 24 | 25 | void Execute(vtkObject* caller, unsigned long eventId, void* callData) override; 26 | 27 | private: 28 | vtkVolume* m_volume = {}; 29 | vtkNew m_planes; 30 | vtkSmartPointer m_transform = {}; 31 | }; 32 | 33 | -------------------------------------------------------------------------------- /vtkResliceActor.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkresliceactor.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | vtkStandardNewMacro(vtkResliceActor); 10 | 11 | void vtkResliceActor::createActor() 12 | { 13 | m_appender = vtkSmartPointer::New(); 14 | for (auto i = 0; i < 2; ++i) 15 | { 16 | m_cursorLines[i] = vtkSmartPointer::New(); 17 | m_appender->AddInputConnection(m_cursorLines[i]->GetOutputPort()); 18 | } 19 | m_mapper = 20 | vtkSmartPointer::New(); 21 | m_mapper->SetInputConnection(m_appender->GetOutputPort()); 22 | m_mapper->ScalarVisibilityOn(); 23 | m_mapper->SetScalarModeToUsePointFieldData(); 24 | m_mapper->SelectColorArray("Colors"); 25 | m_actor = 26 | vtkSmartPointer::New(); 27 | m_actor->SetMapper(m_mapper); 28 | m_actor->GetProperty()->SetInterpolationToGouraud(); 29 | } 30 | 31 | //----------------------------------------------------------------------------- 32 | void vtkResliceActor::reset() const 33 | { 34 | auto* const orientation = m_actor->GetOrientation(); 35 | m_actor->RotateZ(-orientation[2]); 36 | m_actor->SetPosition(0, 0, 0); 37 | } 38 | 39 | //----------------------------------------------------------------------------- 40 | void vtkResliceActor::setDisplaySize(const double* t_size) 41 | { 42 | m_windowSize[0] = t_size[0]; 43 | m_windowSize[1] = t_size[1]; 44 | m_windowSize[2] = t_size[2]; 45 | } 46 | 47 | //----------------------------------------------------------------------------- 48 | void vtkResliceActor::setDisplayOriginPoint(const double* t_point) 49 | { 50 | m_windowOrigin[0] = t_point[0]; 51 | m_windowOrigin[1] = t_point[1]; 52 | m_windowOrigin[2] = t_point[2]; 53 | } 54 | 55 | //----------------------------------------------------------------------------- 56 | void vtkResliceActor::setCenterPosition(const double* t_center) 57 | { 58 | m_centerPointDisplayPosition[0] = t_center[0]; 59 | m_centerPointDisplayPosition[1] = t_center[1]; 60 | m_centerPointDisplayPosition[2] = t_center[2]; 61 | } 62 | 63 | //----------------------------------------------------------------------------- 64 | void vtkResliceActor::update() 65 | { 66 | if (m_start == 0) 67 | { 68 | m_cursorLines[0]->SetPoint1(m_windowOrigin[0], 69 | m_centerPointDisplayPosition[1], 0.01); 70 | m_cursorLines[0]->SetPoint2(m_windowSize[0], 71 | m_centerPointDisplayPosition[1], 0.01); 72 | m_cursorLines[0]->Update(); 73 | m_cursorLines[0]->GetOutput()->GetPointData()->AddArray(m_colors[1]); 74 | m_cursorLines[1]->SetPoint1(m_centerPointDisplayPosition[0], 75 | m_windowOrigin[1], 0.01); 76 | m_cursorLines[1]->SetPoint2(m_centerPointDisplayPosition[0], 77 | m_windowSize[1], 0.01); 78 | m_cursorLines[1]->Update(); 79 | m_cursorLines[1]->GetOutput()->GetPointData()->AddArray(m_colors[0]); 80 | m_actor->SetScale(5); 81 | m_start = 1; 82 | } 83 | else 84 | { 85 | m_actor->SetPosition( 86 | m_centerPointDisplayPosition[0], 87 | m_centerPointDisplayPosition[1], 88 | 0.01); 89 | } 90 | } 91 | 92 | //----------------------------------------------------------------------------- 93 | void vtkResliceActor::createColors(double* t_color1, double* t_color2) 94 | { 95 | m_colors[0] = 96 | vtkSmartPointer::New(); 97 | m_colors[0]->SetName("Colors"); 98 | m_colors[0]->SetNumberOfComponents(3); 99 | m_colors[0]->SetNumberOfTuples(100); 100 | for (auto j = 0; j < 100; j++) 101 | { 102 | m_colors[0]->InsertTuple3(j, t_color1[0], 103 | t_color1[1], t_color1[2]); 104 | } 105 | m_colors[1] = 106 | vtkSmartPointer::New(); 107 | m_colors[1]->SetName("Colors"); 108 | m_colors[1]->SetNumberOfComponents(3); 109 | m_colors[1]->SetNumberOfTuples(100); 110 | for (auto j = 0; j < 100; j++) 111 | { 112 | m_colors[1]->InsertTuple3(j, t_color2[0], 113 | t_color2[1], t_color2[2]); 114 | } 115 | } 116 | -------------------------------------------------------------------------------- /vtkResliceCallback.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "vtkreslicewidget.h" 5 | 6 | 7 | class vtkResliceCallback final : public vtkCommand 8 | { 9 | public: 10 | static vtkResliceCallback* New(); 11 | vtkTypeMacro(vtkResliceCallback, vtkCommand); 12 | vtkResliceCallback() = default; 13 | ~vtkResliceCallback() = default; 14 | 15 | 16 | //getters 17 | [[nodiscard]] vtkResliceWidget* getWidget() const { return m_resliceWidget; } 18 | [[nodiscard]] vtkRenderWindow* getRenderWindow() const { return m_window; } 19 | [[nodiscard]] int getHandleNumber() const { return m_handleNumber; } 20 | 21 | //setters 22 | void setWidget(vtkResliceWidget* t_widget) { m_resliceWidget = t_widget; } 23 | void setRenderWindow(vtkRenderWindow* t_window) { m_window = t_window; } 24 | void setHandleNumber(const int& t_nr) { m_handleNumber = t_nr; } 25 | 26 | void Execute(vtkObject* caller, unsigned long eventId, void* callData) override; 27 | 28 | private: 29 | vtkResliceWidget* m_resliceWidget = {}; 30 | vtkRenderWindow* m_window = {}; 31 | int m_handleNumber = {}; 32 | 33 | void setCursorPositiontoDefault() const; 34 | void rotateCursor(double t_angle) const; 35 | void moveCursor(double* t_position) const; 36 | void changeMatrixCenterPosition( 37 | vtkMatrix4x4* t_sourceMatrix, vtkMatrix4x4* t_destinationMatrix); 38 | }; 39 | 40 | -------------------------------------------------------------------------------- /vtkResliceCursorCallback.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | class vtkResliceCursorCallback : public vtkCommand 5 | { 6 | public: 7 | static vtkResliceCursorCallback* New() { return new vtkResliceCursorCallback; } 8 | 9 | void Execute(vtkObject* caller, unsigned long ev, void* callData) override 10 | { 11 | 12 | if (ev == vtkResliceCursorWidget::WindowLevelEvent || ev == vtkCommand::WindowLevelEvent || 13 | ev == vtkResliceCursorWidget::ResliceThicknessChangedEvent) 14 | { 15 | // Render everything 16 | for (int i = 0; i < 3; i++) 17 | { 18 | this->RCW[i]->Render(); 19 | } 20 | this->IPW[0]->GetInteractor()->GetRenderWindow()->Render(); 21 | return; 22 | } 23 | 24 | vtkImagePlaneWidget* ipw = dynamic_cast(caller); 25 | if (ipw) 26 | { 27 | double* wl = static_cast(callData); 28 | 29 | if (ipw == this->IPW[0]) 30 | { 31 | this->IPW[1]->SetWindowLevel(wl[0], wl[1], 1); 32 | this->IPW[2]->SetWindowLevel(wl[0], wl[1], 1); 33 | } 34 | else if (ipw == this->IPW[1]) 35 | { 36 | this->IPW[0]->SetWindowLevel(wl[0], wl[1], 1); 37 | this->IPW[2]->SetWindowLevel(wl[0], wl[1], 1); 38 | } 39 | else if (ipw == this->IPW[2]) 40 | { 41 | this->IPW[0]->SetWindowLevel(wl[0], wl[1], 1); 42 | this->IPW[1]->SetWindowLevel(wl[0], wl[1], 1); 43 | } 44 | } 45 | 46 | vtkResliceCursorWidget* rcw = dynamic_cast(caller); 47 | if (rcw) 48 | { 49 | vtkResliceCursorLineRepresentation* rep = 50 | dynamic_cast(rcw->GetRepresentation()); 51 | // Although the return value is not used, we keep the get calls 52 | // in case they had side-effects 53 | rep->GetResliceCursorActor()->GetCursorAlgorithm()->GetResliceCursor(); 54 | for (int i = 0; i < 3; i++) 55 | { 56 | vtkPlaneSource* ps = static_cast(this->IPW[i]->GetPolyDataAlgorithm()); 57 | ps->SetOrigin( 58 | this->RCW[i]->GetResliceCursorRepresentation()->GetPlaneSource()->GetOrigin()); 59 | ps->SetPoint1( 60 | this->RCW[i]->GetResliceCursorRepresentation()->GetPlaneSource()->GetPoint1()); 61 | ps->SetPoint2( 62 | this->RCW[i]->GetResliceCursorRepresentation()->GetPlaneSource()->GetPoint2()); 63 | 64 | // If the reslice plane has modified, update it on the 3D widget 65 | this->IPW[i]->UpdatePlacement(); 66 | } 67 | } 68 | 69 | // Render everything 70 | for (int i = 0; i < 3; i++) 71 | { 72 | this->RCW[i]->Render(); 73 | } 74 | this->IPW[0]->GetInteractor()->GetRenderWindow()->Render(); 75 | } 76 | 77 | vtkResliceCursorCallback() {} 78 | vtkImagePlaneWidget* IPW[3]; 79 | vtkResliceCursorWidget* RCW[3]; 80 | }; -------------------------------------------------------------------------------- /vtkReslicePlaneCursorWidget.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | class vtkReslicePlaneCursorCallback; 8 | class vtkReslicePlaneCursorWidget final : public vtkAbstractWidget 9 | { 10 | public: 11 | 12 | static vtkReslicePlaneCursorWidget* New(); 13 | vtkTypeMacro(vtkReslicePlaneCursorWidget, vtkAbstractWidget); 14 | 15 | vtkReslicePlaneCursorWidget(); 16 | ~vtkReslicePlaneCursorWidget(); 17 | 18 | void CreateDefaultRepresentation() override; 19 | void SetEnabled(int) override; 20 | void setPlane(int t_plane); 21 | void SetCursor(int) override; 22 | void setCursorPosition(double* t_position) const; 23 | void setCursorCenterPosition(const double* t_position); 24 | double* getCursorCenterPosition(); 25 | 26 | 27 | private: 28 | vtkSmartPointer m_centerMovementWidget = {}; 29 | vtkSmartPointer m_centerMovementCallback = {}; 30 | 31 | void initializeWidget(); 32 | 33 | enum widgetState { start = 0, rotate, translate, thickness_horizontal, thickness_vertical }; 34 | 35 | protected: 36 | int m_state = 0; 37 | int m_plane = -1; 38 | double lastCursorPos[3]{}; 39 | double m_cursorCenterPosition[3]{}; 40 | 41 | void startWidgetInteraction(int handleNum); 42 | void widgetInteraction(int handleNum); 43 | void endWidgetInteraction(int handleNum); 44 | 45 | static void leftMouseDownAction(vtkAbstractWidget* w); 46 | static void moveMouse(vtkAbstractWidget* w); 47 | static void leftMouseUpAction(vtkAbstractWidget* w); 48 | 49 | void rotateCursor(double t_angle) const; 50 | 51 | friend class vtkReslicePlaneCursorCallback; 52 | }; -------------------------------------------------------------------------------- /vtkResliceRotator.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkreslicerotator.h" 2 | #include 3 | #include 4 | 5 | void vtkResliceRotator::rotatePlane(vtkMatrix4x4* t_sourceMatrix, 6 | vtkMatrix4x4* t_destinationMatrix, const double t_angle) 7 | { 8 | vtkNew transform2; 9 | vtkNew destinationPlaneTransform; 10 | destinationPlaneTransform->SetMatrix(t_destinationMatrix); 11 | double defaultMatrix[16] = { 12 | 1, 0, 0, 0, 13 | 0, 1, 0, 0, 14 | 0, 0, 1, 0, 15 | 0, 0, 0, 1 16 | }; 17 | double* destinationPlaneOrientation = destinationPlaneTransform->GetOrientation(); 18 | const double xRotation = destinationPlaneOrientation[0]; 19 | const double yRotation = destinationPlaneOrientation[1]; 20 | const double zRotation = destinationPlaneOrientation[2]; 21 | const double xCenter = t_destinationMatrix->GetElement(0, 3); 22 | const double yCenter = t_destinationMatrix->GetElement(1, 3); 23 | const double zCenter = t_destinationMatrix->GetElement(2, 3); 24 | transform2->SetMatrix(defaultMatrix); 25 | transform2->Translate(xCenter, yCenter, zCenter); 26 | transform2->RotateWXYZ(t_angle, 27 | t_sourceMatrix->GetElement(0, 2), 28 | t_sourceMatrix->GetElement(1, 2), 29 | t_sourceMatrix->GetElement(2, 2)); 30 | transform2->RotateZ(zRotation); 31 | transform2->RotateX(xRotation); 32 | transform2->RotateY(yRotation); 33 | t_destinationMatrix->DeepCopy(transform2->GetMatrix()); 34 | } 35 | -------------------------------------------------------------------------------- /vtkResliceTranslator.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkreslicetranslator.h" 2 | #include 3 | #include 4 | #include "vtkMatrix4x4.h" 5 | 6 | void vtkResliceTranslator::movePlaneX(vtkMatrix4x4* t_sourceMatrix, 7 | vtkMatrix4x4* t_destinationMatrix1, 8 | vtkMatrix4x4* t_destinationMatrix2, double* t_point) 9 | { 10 | vtkNew transform; 11 | transform->SetMatrix(t_sourceMatrix); 12 | transform->Translate(t_point[0], t_point[1], 0); 13 | double center[3] = 14 | { 15 | transform->GetMatrix()->GetElement(0, 3), 16 | transform->GetMatrix()->GetElement(1, 3), 17 | transform->GetMatrix()->GetElement(2, 3) 18 | }; 19 | t_destinationMatrix1->SetElement(0, 3, center[0]); 20 | t_destinationMatrix1->SetElement(1, 3, center[1]); 21 | t_destinationMatrix1->SetElement(2, 3, center[2]); 22 | t_destinationMatrix2->SetElement(0, 3, center[0]); 23 | t_destinationMatrix2->SetElement(1, 3, center[1]); 24 | t_destinationMatrix2->SetElement(2, 3, center[2]); 25 | } -------------------------------------------------------------------------------- /vtkResliceTranslator.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | class vtkImageResliceToColors; 4 | class vtkImageResliceToColor; 5 | class vtkMatrix4x4; 6 | 7 | 8 | class vtkResliceTranslator 9 | { 10 | public: 11 | vtkResliceTranslator() = default; 12 | ~vtkResliceTranslator() = default; 13 | static void movePlaneX(vtkMatrix4x4*, 14 | vtkMatrix4x4*, vtkMatrix4x4*, double* t_point); 15 | }; 16 | -------------------------------------------------------------------------------- /vtkResliceWidget.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkreslicewidget.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include "utility.h" 12 | #include "vtkreslicecallback.h" 13 | #include "vtkreslicewidgetrepresentation.h" 14 | 15 | 16 | vtkStandardNewMacro(vtkResliceWidget); 17 | 18 | /*------------------------------------------------------------------------------------*/ 19 | void vtkResliceWidget::SetEnabled(const int enabling) 20 | { 21 | if (enabling) //---------------- 22 | { 23 | vtkDebugMacro(<< "Enabling widget"); 24 | if (Enabled) 25 | { 26 | return; 27 | } 28 | if (!m_windows[0] || 29 | !m_windows[1] || 30 | !m_windows[2]) 31 | { 32 | vtkErrorMacro(<< "No render windows"); 33 | return; 34 | } 35 | CreateDefaultRepresentation(); 36 | for (int i = 0; i < 3; ++i) 37 | { 38 | m_cursorWidget[i]->setPlane(i); 39 | m_cursorWidget[i]->SetInteractor(m_windows[i]->GetInteractor()); 40 | m_cursorWidget[i]->SetEnabled(1); 41 | m_cbk[i]->setRenderWindow(m_windows[i]); 42 | m_windows[i]->Render(); 43 | } 44 | Enabled = 1; 45 | } 46 | else 47 | { 48 | for (auto& widget : m_cursorWidget) 49 | { 50 | if (widget) 51 | { 52 | widget->RemoveAllObservers(); 53 | widget = nullptr; 54 | } 55 | } 56 | refreshWindows(-1); 57 | Enabled = 0; 58 | } 59 | } 60 | 61 | /*------------------------------------------------------------------------------------*/ 62 | void vtkResliceWidget::CreateDefaultRepresentation() 63 | { 64 | for (auto i = 0; i < 3; ++i) 65 | { 66 | if (!m_cursorWidget[i]) 67 | { 68 | m_cursorWidget[i] = 69 | vtkSmartPointer::New(); 70 | m_cbk[i] = vtkSmartPointer::New(); 71 | m_cbk[i]->setHandleNumber(i); 72 | m_cbk[i]->setWidget(this); 73 | m_cursorWidget[i]->AddObserver(cursorRotate, m_cbk[i]); 74 | m_cursorWidget[i]->AddObserver(cursorMove, m_cbk[i]); 75 | m_cursorWidget[i]->AddObserver(qualityLow, m_cbk[i]); 76 | m_cursorWidget[i]->AddObserver(qualityHigh, m_cbk[i]); 77 | m_cursorWidget[i]->AddObserver(vtkCommand::LeftButtonReleaseEvent, m_cbk[i]); 78 | m_cursorWidget[i]->AddObserver(cursorFinishMovement, m_cbk[i]); 79 | m_windows[i]->GetInteractor()->GetInteractorStyle()->AddObserver( 80 | imageChanged, m_cbk[i]); 81 | } 82 | } 83 | } 84 | 85 | /*------------------------------------------------------------------------------------*/ 86 | void vtkResliceWidget::setImageReslicers( 87 | const vtkSmartPointer& m_firstReslice, 88 | const vtkSmartPointer& m_secondReslice, 89 | const vtkSmartPointer& m_thirdReslice) 90 | { 91 | m_imageReslice[0] = m_firstReslice; 92 | m_imageReslice[1] = m_secondReslice; 93 | m_imageReslice[2] = m_thirdReslice; 94 | } 95 | 96 | /*------------------------------------------------------------------------------------*/ 97 | void vtkResliceWidget::setRenderWindows( 98 | vtkSmartPointer* t_windows) 99 | { 100 | m_windows[0] = t_windows[0]; 101 | m_windows[1] = t_windows[1]; 102 | m_windows[2] = t_windows[2]; 103 | } 104 | 105 | /*------------------------------------------------------------------------------------*/ 106 | void vtkResliceWidget::refreshWindows(const int t_windowNumber) 107 | { 108 | for (auto i = 0; i < 3; ++i) 109 | { 110 | if (t_windowNumber == i) 111 | { 112 | continue; 113 | } 114 | if (t_windowNumber != -1) 115 | { 116 | if (m_isCameraCentered) 117 | { 118 | resetCamera(m_windows[i]); 119 | } 120 | } 121 | m_windows[i]->Render(); 122 | } 123 | } 124 | 125 | /*------------------------------------------------------------------------------------*/ 126 | void vtkResliceWidget::setVisible(const bool t_visible) 127 | { 128 | for (auto& m_cursorWidget : m_cursorWidget) 129 | { 130 | if (m_cursorWidget) 131 | { 132 | m_cursorWidget->GetRepresentation()-> 133 | SetVisibility(static_cast(t_visible)); 134 | } 135 | } 136 | refreshWindows(-1); 137 | } 138 | 139 | /*------------------------------------------------------------------------------------*/ 140 | void vtkResliceWidget::setCameraCentered(const int t_centered) 141 | { 142 | m_isCameraCentered = t_centered; 143 | } 144 | 145 | /*------------------------------------------------------------------------------------*/ 146 | void vtkResliceWidget::centerImageActors(const int t_excludedCursor) 147 | { 148 | for (auto i = 0; i < 3; ++i) 149 | { 150 | if (i == t_excludedCursor) 151 | { 152 | continue; 153 | } 154 | vtkPropCollection* actorCollection = m_windows[i]->GetRenderers()->GetFirstRenderer()->GetViewProps(); 155 | actorCollection->InitTraversal(); 156 | for (vtkIdType j = 0; j < actorCollection->GetNumberOfItems(); j++) 157 | { 158 | vtkProp* nextProp = actorCollection->GetNextProp(); 159 | if (nextProp->IsA("vtkImageSlice")) 160 | { 161 | auto* const actor = reinterpret_cast(nextProp); 162 | auto* const actorPosition = actor->GetPosition(); 163 | auto* const cursorPosition = m_cursorWidget[i]->getCursorCenterPosition(); 164 | double newPosition[3] = { 165 | cursorPosition[0] + actorPosition[0] - actor->GetCenter()[0], 166 | cursorPosition[1] + actorPosition[1] - actor->GetCenter()[1], 167 | 0.1 168 | }; 169 | m_cursorWidget[i]->setCursorPosition(newPosition); 170 | actor->SetPosition(actorPosition[0] - actor->GetCenter()[0], 171 | actorPosition[1] - actor->GetCenter()[1], 172 | actorPosition[2] - actor->GetCenter()[2]); 173 | } 174 | } 175 | } 176 | } 177 | 178 | /*------------------------------------------------------------------------------------*/ 179 | void vtkResliceWidget::resetCamera(vtkRenderWindow* t_window) 180 | { 181 | vtkRenderer* currentWindowRenderer = t_window->GetRenderers()->GetFirstRenderer(); 182 | currentWindowRenderer->SetBackground(0, 0, 0); 183 | currentWindowRenderer->SetBackground2(0, 0, 0); 184 | vtkCamera* camera = currentWindowRenderer->GetActiveCamera(); 185 | double* actorCenter = getImageActorCenterPosition(t_window); 186 | if (actorCenter) 187 | { 188 | double* currentFocalPoint = camera->GetFocalPoint(); 189 | double* currentCameraPosition = camera->GetPosition(); 190 | camera->SetFocalPoint(actorCenter[0], actorCenter[1], currentFocalPoint[2]); 191 | camera->SetPosition(actorCenter[0], actorCenter[1], currentCameraPosition[2]); 192 | } 193 | } 194 | 195 | /*------------------------------------------------------------------------------------*/ 196 | double* vtkResliceWidget::getImageActorCenterPosition(vtkRenderWindow* t_window) 197 | { 198 | vtkPropCollection* actorCollection = 199 | t_window->GetRenderers()->GetFirstRenderer()->GetViewProps(); 200 | actorCollection->InitTraversal(); 201 | 202 | for (vtkIdType j = 0; j < actorCollection->GetNumberOfItems(); j++) 203 | { 204 | vtkProp* nextProp = actorCollection->GetNextProp(); 205 | if (nextProp->IsA("vtkImageSlice")) 206 | { 207 | return reinterpret_cast(nextProp)->GetCenter(); 208 | } 209 | } 210 | return nullptr; 211 | } 212 | 213 | /*------------------------------------------------------------------------------------*/ 214 | void vtkResliceWidget::setHighQuality(const int t_highQuality, const int t_plane) 215 | { 216 | for (auto i = 0; i < 3; ++i) 217 | { 218 | if (i == t_plane) 219 | { 220 | continue; 221 | } 222 | vtkPropCollection* actorCollection = 223 | m_windows[i]->GetRenderers()->GetFirstRenderer()->GetViewProps(); 224 | actorCollection->InitTraversal(); 225 | for (vtkIdType j = 0; j < actorCollection->GetNumberOfItems(); j++) 226 | { 227 | vtkProp* nextProp = actorCollection->GetNextProp(); 228 | if (nextProp->IsA("vtkImageSlice")) 229 | { 230 | if (t_highQuality == 0) 231 | { 232 | setQualityToLow(i, reinterpret_cast(nextProp)); 233 | } 234 | else 235 | { 236 | setQualityToHigh(i, reinterpret_cast(nextProp)); 237 | } 238 | break; 239 | } 240 | } 241 | } 242 | } 243 | 244 | /*------------------------------------------------------------------------------------*/ 245 | void vtkResliceWidget::resetResliceCursor() 246 | { 247 | for (auto const& cursor : m_cursorWidget) 248 | { 249 | double pos[2] = { 0, 0 }; 250 | cursor->setCursorCenterPosition(pos); 251 | auto* const rep = 252 | dynamic_cast( 253 | cursor->GetRepresentation()); 254 | if (rep) 255 | { 256 | rep->getResliceActor()->reset(); 257 | } 258 | } 259 | for (auto const& window : m_windows) 260 | { 261 | resetCamera(window); 262 | window->Render(); 263 | } 264 | } 265 | 266 | /*------------------------------------------------------------------------------------*/ 267 | void vtkResliceWidget::setQualityToHigh( 268 | const int t_windowNumber, vtkImageActor* t_actor) 269 | { 270 | reinterpret_cast( 271 | t_actor->GetMapper())->SetResampleToScreenPixels(1); 272 | m_imageReslice[t_windowNumber]->SetOutputExtentToDefault(); 273 | m_imageReslice[t_windowNumber]->SetOutputSpacingToDefault(); 274 | m_imageReslice[t_windowNumber]->SetInterpolationModeToCubic(); 275 | m_imageReslice[t_windowNumber]->Update(); 276 | } 277 | 278 | /*------------------------------------------------------------------------------------*/ 279 | void vtkResliceWidget::setQualityToLow( 280 | const int t_windowNumber, vtkImageActor* t_actor) 281 | { 282 | reinterpret_cast( 283 | t_actor->GetMapper())->SetResampleToScreenPixels(0); 284 | m_imageReslice[t_windowNumber]->SetInterpolationModeToLinear(); 285 | m_imageReslice[t_windowNumber]->SetOutputSpacing(2, 2, 2); 286 | m_imageReslice[t_windowNumber]->Update(); 287 | } 288 | -------------------------------------------------------------------------------- /vtkResliceWidget.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "vtkresliceplanecursorwidget.h" 8 | #include 9 | 10 | class vtkResliceCallback; 11 | 12 | class vtkResliceWidget final : public vtkAbstractWidget 13 | { 14 | public: 15 | static vtkResliceWidget* New(); 16 | vtkTypeMacro(vtkResliceWidget, vtkAbstractWidget); 17 | vtkResliceWidget() = default; 18 | ~vtkResliceWidget() = default; 19 | 20 | //getters 21 | [[nodiscard]] vtkRenderWindow* getTestRenderWindow() const { return m_testRenderWindow; } 22 | [[nodiscard]] int getIsCameraCentered() const { return m_isCameraCentered; } 23 | 24 | //setters 25 | void SetEnabled(int) override; 26 | void setImageReslicers( 27 | const vtkSmartPointer& m_firstReslice, 28 | const vtkSmartPointer& m_secondReslice, 29 | const vtkSmartPointer& m_thirdReslice); 30 | vtkSmartPointer* getImageReslicers() { return m_imageReslice; } 31 | void setRenderWindows(vtkSmartPointer* t_windows); 32 | void refreshWindows(int t_windowNumber); 33 | void setVisible(bool); 34 | void setCameraCentered(int t_centered); 35 | void setHighQuality(int t_highQuality, int t_plane); 36 | 37 | void CreateDefaultRepresentation() override; 38 | void centerImageActors(int t_excludedCursor); 39 | void resetResliceCursor(); 40 | 41 | enum widgetState { start = 0, rotate, translate }; 42 | 43 | private: 44 | vtkSmartPointer m_imageReslice[3] = {}; 45 | vtkSmartPointer m_windows[3] = {}; 46 | vtkSmartPointer m_cursorWidget[3] = {}; 47 | vtkSmartPointer m_cbk[3] = {}; 48 | vtkRenderWindow* m_testRenderWindow = nullptr; 49 | int m_isCameraCentered = 0; 50 | 51 | void resetCamera(vtkRenderWindow* t_window); 52 | double* getImageActorCenterPosition(vtkRenderWindow* t_window); 53 | void setQualityToHigh(int t_windowNumber, vtkImageActor* t_actor); 54 | void setQualityToLow(int t_windowNumber, vtkImageActor* t_actor); 55 | 56 | protected: 57 | friend class vtkResliceCallback; 58 | }; 59 | 60 | -------------------------------------------------------------------------------- /vtkWidget3D.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkwidget3d.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | void vtkWidget3D::initWidget() 11 | { 12 | m_renderWindows[0] = vtkSmartPointer::New(); 13 | m_mapper = vtkSmartPointer::New(); 14 | m_renderer = vtkSmartPointer::New(); 15 | m_volume = vtkSmartPointer::New(); 16 | m_transferFunction = std::make_unique(); 17 | } 18 | 19 | //----------------------------------------------------------------------------- 20 | void vtkWidget3D::initBoxWidget() 21 | { 22 | if (!m_renderer || !m_volume) 23 | { 24 | return; 25 | } 26 | m_boxWidget = vtkSmartPointer::New(); 27 | m_boxWidget->SetInteractor(m_renderer->GetRenderWindow()->GetInteractor()); 28 | m_boxWidget->CreateDefaultRepresentation(); 29 | m_boxWidget->GetRepresentation()->SetPlaceFactor(1); 30 | m_boxWidget->GetRepresentation()->PlaceWidget(m_volume->GetBounds()); 31 | initBoxWidgetCallback(); 32 | } 33 | 34 | //----------------------------------------------------------------------------- 35 | void vtkWidget3D::initBoxWidgetCallback() 36 | { 37 | m_boxWidgetCallback = vtkSmartPointer::New(); 38 | m_boxWidgetCallback->setVolume(m_volume); 39 | m_boxWidget->AddObserver(vtkCommand::InteractionEvent, m_boxWidgetCallback); 40 | } 41 | 42 | //----------------------------------------------------------------------------- 43 | void vtkWidget3D::initInteractorStyle() 44 | { 45 | m_interactorStyle = 46 | vtkSmartPointer::New(); 47 | m_interactorStyle->setWidget(this); 48 | m_interactorStyle->setTransferFunction(m_transferFunction.get()); 49 | m_interactor->SetInteractorStyle(m_interactorStyle); 50 | } 51 | 52 | //----------------------------------------------------------------------------- 53 | void vtkWidget3D::setVolumeMapperBlend() const 54 | { 55 | m_mapper->SetBlendMode(vtkVolumeMapper::COMPOSITE_BLEND); 56 | } 57 | 58 | //----------------------------------------------------------------------------- 59 | // std::tuple vtkWidget3D::getWindowLevel() const 60 | // { 61 | // // const auto imageReader = 62 | // // m_image->getImageReader(); 63 | // // return std::make_tuple(imageReader-> 64 | // // GetMetaData()->Get(DC::WindowCenter).AsInt(), 65 | // // imageReader->GetMetaData()->Get(DC::WindowWidth).AsInt()); 66 | // } 67 | 68 | //----------------------------------------------------------------------------- 69 | void vtkWidget3D::setFilter(const QString& t_filePath) 70 | { 71 | // try 72 | // { 73 | // if (t_filePath == "MIP") 74 | // { 75 | // m_transferFunction.reset(); 76 | // m_transferFunction = std::make_unique(); 77 | // m_mapper->SetBlendMode(vtkVolumeMapper::MAXIMUM_INTENSITY_BLEND); 78 | // m_transferFunction->setMaximumIntensityProjectionFunction(0, 0); 79 | // const auto[window, level] = getWindowLevel(); 80 | // m_transferFunction->updateWindowLevel(window, level); 81 | // } 82 | // else 83 | // { 84 | // m_mapper->SetBlendMode(vtkVolumeMapper::COMPOSITE_BLEND); 85 | // m_transferFunction->loadFilterFromFile(t_filePath); 86 | // } 87 | // updateFilter(); 88 | // m_interactorStyle->setTransferFunction(m_transferFunction.get()); 89 | // 90 | // } 91 | // catch (const std::exception& ex) 92 | // { 93 | // //todo log 94 | // } 95 | } 96 | 97 | //----------------------------------------------------------------------------- 98 | // void vtkWidget3D::render() 99 | // { 100 | // m_renderWindows[0]->OffScreenRenderingOn(); 101 | // setVolumeMapperBlend(); 102 | // const auto[window, level] = getWindowLevel(); 103 | // //const auto reader = m_image && m_image->getIsMultiFrame() 104 | // //? m_image->getImageReader() 105 | // //: m_series->getReaderForAllSingleFrameImages(); 106 | // //m_mapper->SetInputConnection(reader->GetOutputPort()); 107 | // m_transferFunction->updateWindowLevel(window, level); 108 | // m_volume->SetMapper(m_mapper); 109 | // m_renderer->AddActor(m_volume); 110 | // m_renderWindows[0]->AddRenderer(m_renderer); 111 | // m_renderWindows[0]->Render(); 112 | // m_renderWindows[0]->OffScreenRenderingOff(); 113 | // auto* const extend = m_volume->GetBounds(); 114 | // m_volume->SetOrigin(extend[0] + (extend[1] - extend[0]) / 2, 115 | // extend[2] + (extend[3] - extend[2]) / 2, 0); 116 | // initInteractorStyle(); 117 | //} 118 | 119 | //----------------------------------------------------------------------------- 120 | void vtkWidget3D::activateBoxWidget(const bool& t_flag) 121 | { 122 | if (!m_boxWidget) 123 | { 124 | initBoxWidget(); 125 | } 126 | m_boxWidget->SetEnabled(t_flag); 127 | } 128 | 129 | //----------------------------------------------------------------------------- 130 | void vtkWidget3D::updateFilter() const 131 | { 132 | m_volume->GetProperty()->SetInterpolationTypeToLinear(); 133 | m_volume->GetProperty()->SetScalarOpacity(m_transferFunction->getOpacityFunction()); 134 | m_volume->GetProperty()->SetAmbient(m_transferFunction->getAmbient()); 135 | m_volume->GetProperty()->SetColor(m_transferFunction->getColorFunction()); 136 | m_volume->GetProperty()->SetDiffuse(m_transferFunction->getDiffuse()); 137 | m_volume->GetProperty()->SetSpecular(m_transferFunction->getSpecular()); 138 | m_volume->GetProperty()->SetSpecularPower(m_transferFunction->getSpecularPower()); 139 | m_volume->GetProperty()->GetIsoSurfaceValues()->SetValue(0, 0); 140 | (m_transferFunction->getHasShade()) ? m_volume->GetProperty()->ShadeOn() : m_volume->GetProperty()->ShadeOff(); 141 | } 142 | -------------------------------------------------------------------------------- /vtkWidget3D.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include "transferfunction.h" 7 | #include "vtkboxwidget3dcallback.h" 8 | #include "vtkwidget3dinteractorstyle.h" 9 | #include "vtkwidgetbase.h" 10 | 11 | 12 | class vtkWidget3D final : public vtkWidgetBase 13 | { 14 | public: 15 | vtkWidget3D() { initWidget(); }; 16 | ~vtkWidget3D() = default; 17 | 18 | //getters 19 | [[nodiscard]] vtkSmartVolumeMapper* getvtkWidget3DSmartVolumeMapper() const { return m_mapper; } 20 | 21 | //setters 22 | void setInteractor(const vtkSmartPointer& t_interactor) override { m_interactor = t_interactor; } 23 | void setFilter(const QString& t_filePath); 24 | //void render() override; 25 | void activateBoxWidget(const bool& t_flag); 26 | void updateFilter() const; 27 | 28 | private: 29 | std::unique_ptr m_transferFunction = {}; 30 | vtkSmartPointer m_interactorStyle = {}; 31 | vtkSmartPointer m_mapper; 32 | vtkSmartPointer m_renderer; 33 | vtkSmartPointer m_volume; 34 | vtkSmartPointer m_boxWidget; 35 | vtkSmartPointer m_boxWidgetCallback = {}; 36 | vtkRenderWindowInteractor* m_interactor = {}; 37 | 38 | void initWidget(); 39 | void initBoxWidget(); 40 | void initBoxWidgetCallback(); 41 | void initInteractorStyle(); 42 | void setVolumeMapperBlend() const; 43 | //[[nodiscard]] std::tuple< int, int> getWindowLevel() const; 44 | }; 45 | 46 | -------------------------------------------------------------------------------- /vtkWidgetBase.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkwidgetbase.h" 2 | 3 | void vtkWidgetBase::setRenderWindowsMPR(const vtkSmartPointer& t_sagittal, 4 | const vtkSmartPointer& t_coronal, 5 | const vtkSmartPointer& t_axial) 6 | { 7 | m_renderWindows[0] = t_sagittal; 8 | m_renderWindows[1] = t_coronal; 9 | m_renderWindows[2] = t_axial; 10 | } -------------------------------------------------------------------------------- /vtkWidgetBase.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include 4 | 5 | class vtkWidgetBase 6 | { 7 | public: 8 | vtkWidgetBase() = default; 9 | virtual ~vtkWidgetBase() = default; 10 | 11 | //getters 12 | vtkSmartPointer* getRenderWindows() { return m_renderWindows; } 13 | vtkRenderWindow* getActiveRenderWindow() const { return m_activeRenderWindow; } 14 | //[[nodiscard]] core::Image* getImage() const { return m_image; } 15 | //[[nodiscard]] core::Series* getSeries() const { return m_series; } 16 | 17 | //setters 18 | //void setImage(core::Image* t_image) { m_image = t_image; } 19 | //void setSeries(core::Series* t_series) { m_series = t_series; } 20 | void setRenderWindow(const vtkSmartPointer& t_renderWindow) { m_renderWindows[0] = t_renderWindow; } 21 | void setRenderWindowsMPR(const vtkSmartPointer& t_sagittal, 22 | const vtkSmartPointer& t_coronal, 23 | const vtkSmartPointer& t_axial); 24 | virtual void setInteractor(const vtkSmartPointer& t_interactor) = 0; 25 | 26 | virtual void render(vtkSmartPointer reader) = 0; 27 | 28 | protected: 29 | vtkSmartPointer m_renderWindows[3] = {}; 30 | vtkRenderWindow* m_activeRenderWindow = nullptr; 31 | //core::Series* m_series = {}; 32 | //core::Image* m_image = {}; 33 | }; -------------------------------------------------------------------------------- /vtkWidgetMPR.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkwidgetmpr.h" 2 | #include 3 | #include 4 | //#include "image.h" 5 | #include "vtkwidgetmprinteractorstyle.h" 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | 13 | vtkWidgetMPR::~vtkWidgetMPR() 14 | { 15 | for (int i = 0; i < 3; ++i) 16 | { 17 | m_renderWindows[i]->RemoveObserver(m_callbackTags[i]); 18 | } 19 | } 20 | 21 | //----------------------------------------------------------------------------- 22 | int vtkWidgetMPR::getNumberOfRenderWindow(vtkRenderWindow* t_window) const 23 | { 24 | for (auto i = 0; i < 3; ++i) 25 | { 26 | if (m_renderWindows[i] == t_window) 27 | { 28 | return i; 29 | } 30 | } 31 | return -1; 32 | } 33 | 34 | //----------------------------------------------------------------------------- 35 | void vtkWidgetMPR::setWindowLevel(const int& t_window, const int& t_level) 36 | { 37 | for (const auto& window : m_renderWindows) 38 | { 39 | changeWindowLevel(window, t_window, t_level, false); 40 | } 41 | } 42 | 43 | //----------------------------------------------------------------------------- 44 | void vtkWidgetMPR::setCameraCentered(const int& t_centered) const 45 | { 46 | if (m_resliceWidget) 47 | { 48 | m_resliceWidget->setCameraCentered(t_centered); 49 | } 50 | } 51 | 52 | //----------------------------------------------------------------------------- 53 | void vtkWidgetMPR::render(vtkSmartPointer reader) 54 | { 55 | if (!m_mprMaker) 56 | { 57 | return; 58 | } 59 | m_mprMaker->SetRenderWindows( 60 | m_renderWindows[0], 61 | m_renderWindows[1], 62 | m_renderWindows[2]); 63 | //m_mprMaker->setInitialWindow(m_image->getWindowCenter()); 64 | //m_mprMaker->setInitialLevel(m_image->getWindowWidth()); 65 | m_mprMaker->createMPR(reader); 66 | m_callback = vtkSmartPointer::New(); 67 | m_callback->setWidget(this); 68 | for (auto i = 0; i < 3; ++i) 69 | { 70 | vtkNew interactorStyle; 71 | interactorStyle->setImageReslice(m_mprMaker->getImageReslice(i)); 72 | const int minExtendPosition = i * 2; 73 | const int maxExtendPosition = i * 2 + 1; 74 | interactorStyle->setMinMax( 75 | m_mprMaker->getInputData()->GetExtent()[minExtendPosition], 76 | m_mprMaker->getInputData()->GetExtent()[maxExtendPosition]); 77 | interactorStyle->SetCurrentImageNumber(m_mprMaker->getCenterSliceZPosition(i)); 78 | interactorStyle->setWidget(this); 79 | m_renderWindows[i]->GetInteractor()->SetInteractorStyle(interactorStyle); 80 | interactorStyle->SetCurrentRenderer(m_renderWindows[i]->GetRenderers()->GetFirstRenderer()); 81 | interactorStyle->setAxisActor2D( 82 | createScaleActor(m_renderWindows[i])); 83 | interactorStyle->rescaleAxisActor(); 84 | //m_widgetOverlay[i] = std::make_unique(); 85 | //createVTKkWidgetOverlay(m_renderWindows[i], i); 86 | m_callbackTags[i] = m_renderWindows[i]->AddObserver(vtkCommand::ModifiedEvent, 87 | m_callback); 88 | } 89 | createResliceWidget(); 90 | } 91 | 92 | //----------------------------------------------------------------------------- 93 | void vtkWidgetMPR::resetResliceWidget() 94 | { 95 | if (m_resliceWidget) 96 | { 97 | m_mprMaker->resetMatrixesToInitialPosition(); 98 | m_mprMaker->resetWindowLevel(); 99 | m_resliceWidget->centerImageActors(-1); 100 | m_resliceWidget->resetResliceCursor(); 101 | m_renderWindows[0]->Render(); 102 | m_renderWindows[1]->Render(); 103 | m_renderWindows[2]->Render(); 104 | } 105 | } 106 | 107 | //----------------------------------------------------------------------------- 108 | void vtkWidgetMPR::changeWindowLevel(vtkRenderWindow* t_renderWindow, const int& t_window, 109 | const int& t_level, const bool t_append) 110 | { 111 | // int window; 112 | // int level; 113 | // if (t_append) 114 | // { 115 | // auto* const range = 116 | // m_mprMaker->getColorMapScalar()->GetRange(); 117 | // window = range[1] - range[0]; 118 | // level = range[0] + window / 2; 119 | // window += t_window; 120 | // level += t_level; 121 | // } 122 | // else 123 | // { 124 | // window = t_window; 125 | // level = t_level; 126 | // } 127 | // m_mprMaker->getColorMapScalar()->SetRange(level - 0.5 * window, level + 0.5 * window); 128 | // auto const windowNumber = 129 | // getNumberOfRenderWindow(t_renderWindow); 130 | // if (windowNumber == -1) 131 | // { 132 | // return; 133 | // } 134 | // std::string ww; 135 | // ww.append("WW: ").append(std::to_string(window)); 136 | // std::string wl; 137 | // wl.append(" / WL: ").append(std::to_string(level)).append("\n"); 138 | // m_widgetOverlay[windowNumber]->updateOverlayInCorner(2, "2625616", ww); 139 | // m_widgetOverlay[windowNumber]->updateOverlayInCorner(2, "2625617", wl); 140 | // refreshOverlayInCorner(t_renderWindow, windowNumber, 2); 141 | } 142 | 143 | void vtkWidgetMPR::create3DMatrix() const 144 | { 145 | // if (m_image) 146 | // { 147 | // m_mprMaker->setImage(m_image); 148 | // } 149 | // else 150 | // { 151 | // m_mprMaker->setSeries(m_series); 152 | // m_mprMaker->setImage(m_series->getSinlgeFrameImages().begin()->get()); 153 | // } 154 | // m_mprMaker->create3DMatrix(); 155 | } 156 | 157 | //----------------------------------------------------------------------------- 158 | void vtkWidgetMPR::initializeWidget() 159 | { 160 | m_mprMaker = std::make_unique(); 161 | for (auto& window : m_renderWindows) 162 | { 163 | if (!window) 164 | { 165 | window = vtkSmartPointer::New(); 166 | } 167 | } 168 | } 169 | 170 | //----------------------------------------------------------------------------- 171 | void vtkWidgetMPR::createResliceWidget() 172 | { 173 | if (!m_resliceWidget) 174 | { 175 | m_resliceWidget = 176 | vtkSmartPointer::New(); 177 | } 178 | m_resliceWidget->setRenderWindows(m_renderWindows); 179 | m_resliceWidget->setImageReslicers( 180 | m_mprMaker->getImageReslice(0), 181 | m_mprMaker->getImageReslice(1), 182 | m_mprMaker->getImageReslice(2)); 183 | m_resliceWidget->SetInteractor(m_renderWindows[0]->GetInteractor()); 184 | m_resliceWidget->SetEnabled(1); 185 | m_resliceWidget->setVisible(false); 186 | } 187 | 188 | //----------------------------------------------------------------------------- 189 | //void vtkWidgetMPR::createVTKkWidgetOverlay(vtkRenderWindow* t_window, int& t_windowNumber) 190 | //{ 191 | // auto* const renderer = 192 | // t_window->GetRenderers()->GetFirstRenderer(); 193 | // auto* const metadata = 194 | // m_image->getIsMultiFrame() 195 | // ? m_image->getImageReader()->GetMetaData() 196 | // : m_series->getMetaDataForSeries().Get(); 197 | // m_widgetOverlay[t_windowNumber]->setRenderer(renderer); 198 | // m_widgetOverlay[t_windowNumber]->createOverlay(t_window, metadata); 199 | //} 200 | 201 | //----------------------------------------------------------------------------- 202 | // void vtkWidgetMPR::refreshOverlayInCorner(vtkRenderWindow* t_window, const int t_windowNumber, 203 | // const int t_corner) 204 | // { 205 | // m_widgetOverlay[t_windowNumber]->setOverlayInCorner(t_corner); 206 | // t_window->Render(); 207 | // } 208 | 209 | //----------------------------------------------------------------------------- 210 | vtkAxisActor2D* vtkWidgetMPR::createScaleActor(vtkRenderWindow* t_window) 211 | { 212 | vtkNew m_scaleActor; 213 | m_scaleActor->GetPoint1Coordinate()->SetCoordinateSystemToDisplay(); 214 | m_scaleActor->GetPoint2Coordinate()->SetCoordinateSystemToDisplay(); 215 | m_scaleActor->SetNumberOfLabels(5); 216 | m_scaleActor->LabelVisibilityOff(); 217 | m_scaleActor->AdjustLabelsOff(); 218 | m_scaleActor->GetTitleTextProperty()->SetBold(1); 219 | m_scaleActor->GetTitleTextProperty()->SetItalic(1); 220 | m_scaleActor->GetTitleTextProperty()->SetShadow(1); 221 | m_scaleActor->GetTitleTextProperty()->SetFontFamilyToArial(); 222 | m_scaleActor->GetProperty()->SetColor(1, 1, 1); 223 | t_window->GetRenderers()->GetFirstRenderer()->AddActor(m_scaleActor); 224 | return m_scaleActor; 225 | } 226 | -------------------------------------------------------------------------------- /vtkWidgetMPR.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #include 3 | #include "vtkwidgetbase.h" 4 | #include "mprmaker.h" 5 | //#include "vtkwidgetoverlay.h" 6 | #include "vtkreslicewidget.h" 7 | #include "vtkwidgetmprcallback.h" 8 | 9 | class vtkWidgetMPR final : public vtkWidgetBase 10 | { 11 | public: 12 | vtkWidgetMPR() { initializeWidget(); } 13 | ~vtkWidgetMPR(); 14 | 15 | //getters 16 | int getNumberOfRenderWindow(vtkRenderWindow* t_window) const; 17 | 18 | 19 | //setters 20 | void setInteractor(const vtkSmartPointer& t_interactor) override {} 21 | void setActiveRenderWindow(vtkRenderWindow* t_window) { m_activeRenderWindow = t_window; } 22 | void setWindowLevel(const int& t_window, const int& t_level); 23 | void setCameraCentered(const int& t_centered) const; 24 | void setShowCursor(const bool& t_flag) const { m_resliceWidget->setVisible(t_flag); } 25 | 26 | void render(vtkSmartPointer reader) override; 27 | void resetResliceWidget(); 28 | void changeWindowLevel(vtkRenderWindow* t_renderWindow, const int& t_window, 29 | const int& t_level, bool t_append = true); 30 | void create3DMatrix() const; 31 | 32 | private: 33 | vtkSmartPointer m_callback = {}; 34 | vtkSmartPointer m_resliceWidget = {}; 35 | std::unique_ptr m_mprMaker = {}; 36 | //std::unique_ptr m_widgetOverlay[3] = {}; 37 | unsigned int m_callbackTags[3] = {}; 38 | 39 | void initializeWidget(); 40 | void createResliceWidget(); 41 | //void createVTKkWidgetOverlay(vtkRenderWindow* t_window, int& t_windowNumber); 42 | //void refreshOverlayInCorner(vtkRenderWindow* t_window, int t_windowNumber, int t_corner); 43 | [[nodiscard]] vtkAxisActor2D* createScaleActor(vtkRenderWindow* t_window); 44 | }; -------------------------------------------------------------------------------- /vtkWidgetMPRCallback.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkwidgetmprcallback.h" 2 | #include 3 | #include 4 | #include "vtkwidgetmprinteractorstyle.h" 5 | 6 | vtkStandardNewMacro(vtkWidgetMPRCallback); 7 | 8 | //----------------------------------------------------------------------------- 9 | void vtkWidgetMPRCallback::Execute(vtkObject* caller, const unsigned long eventId, void* callData) 10 | { 11 | if (eventId == ModifiedEvent) 12 | { 13 | if (auto* const interactorStyle = dynamic_cast( 14 | vtkRenderWindow::SafeDownCast(caller) 15 | ->GetInteractor()->GetInteractorStyle()); interactorStyle) 16 | { 17 | interactorStyle->rescaleAxisActor(); 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /vtkWidgetMPRInteractorStyle.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkwidgetmprinteractorstyle.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "vtkwidgetmpr.h" 8 | 9 | vtkStandardNewMacro(vtkWidgetMPRInteractorStyle); 10 | 11 | void vtkWidgetMPRInteractorStyle::rescaleAxisActor() 12 | { 13 | auto* const bounds = 14 | m_imageReslice->GetOutput()->GetBounds(); 15 | vtkNew newCoord; 16 | newCoord->SetCoordinateSystemToWorld(); 17 | newCoord->SetValue(0, bounds[2], 0); 18 | const auto yMin = 19 | newCoord->GetComputedDisplayValue(GetCurrentRenderer())[1]; 20 | newCoord->SetValue(0, bounds[3], 0); 21 | const auto yMax = 22 | newCoord->GetComputedDisplayValue(GetCurrentRenderer())[1]; 23 | m_axisActor->SetPoint1(1, yMin); 24 | m_axisActor->SetPoint2(1, yMax); 25 | Interactor->Render(); 26 | } 27 | 28 | //----------------------------------------------------------------------------- 29 | void vtkWidgetMPRInteractorStyle::moveToSlice(const int& t_number) 30 | { 31 | moveSlice(t_number - CurrentImageNumber); 32 | } 33 | 34 | //----------------------------------------------------------------------------- 35 | void vtkWidgetMPRInteractorStyle::OnMouseMove() 36 | { 37 | const auto x = 38 | Interactor->GetEventPosition()[0] - Interactor->GetLastEventPosition()[0]; 39 | const auto y = 40 | Interactor->GetEventPosition()[1] - Interactor->GetLastEventPosition()[1]; 41 | switch (State) 42 | { 43 | case VTKIS_DOLLY: 44 | rescaleAxisActor(); 45 | break; 46 | case VTKIS_WINDOW_LEVEL: 47 | m_widget->changeWindowLevel(Interactor->GetRenderWindow(), x, y); 48 | return; 49 | default: 50 | break; 51 | } 52 | vtkInteractorStyleImage::OnMouseMove(); 53 | } 54 | 55 | //----------------------------------------------------------------------------- 56 | void vtkWidgetMPRInteractorStyle::OnMouseWheelForward() 57 | { 58 | moveSlice(1); 59 | } 60 | 61 | //----------------------------------------------------------------------------- 62 | void vtkWidgetMPRInteractorStyle::OnMouseWheelBackward() 63 | { 64 | moveSlice(-1); 65 | } 66 | 67 | //----------------------------------------------------------------------------- 68 | void vtkWidgetMPRInteractorStyle::OnLeftButtonDown() 69 | { 70 | startAction(transformationType::windowLevel); 71 | } 72 | 73 | //----------------------------------------------------------------------------- 74 | void vtkWidgetMPRInteractorStyle::OnLeftButtonUp() 75 | { 76 | auto* const windows = 77 | m_widget->getRenderWindows(); 78 | for (auto i = 0; i < 3; ++i) 79 | { 80 | if (windows[i] != Interactor->GetRenderWindow()) 81 | { 82 | m_widget->changeWindowLevel(windows[i], 83 | 0, 0); 84 | } 85 | } 86 | StopState(); 87 | vtkInteractorStyleImage::OnLeftButtonUp(); 88 | } 89 | 90 | //----------------------------------------------------------------------------- 91 | void vtkWidgetMPRInteractorStyle::OnRightButtonDown() 92 | { 93 | startAction(transformationType::zoom); 94 | } 95 | 96 | //----------------------------------------------------------------------------- 97 | void vtkWidgetMPRInteractorStyle::OnRightButtonUp() 98 | { 99 | StopState(); 100 | vtkInteractorStyleImage::OnRightButtonUp(); 101 | } 102 | 103 | //----------------------------------------------------------------------------- 104 | void vtkWidgetMPRInteractorStyle::OnMiddleButtonDown() 105 | { 106 | startAction(transformationType::pan); 107 | } 108 | 109 | //----------------------------------------------------------------------------- 110 | void vtkWidgetMPRInteractorStyle::OnMiddleButtonUp() 111 | { 112 | StopState(); 113 | vtkInteractorStyleImage::OnMiddleButtonUp(); 114 | } 115 | 116 | //----------------------------------------------------------------------------- 117 | void vtkWidgetMPRInteractorStyle::startAction(const transformationType& t_action) 118 | { 119 | const int x = Interactor->GetEventPosition()[0]; 120 | const int y = Interactor->GetEventPosition()[1]; 121 | FindPokedRenderer(x, y); 122 | if (!CurrentRenderer) 123 | { 124 | return; 125 | } 126 | GrabFocus(EventCallbackCommand); 127 | switch (t_action) 128 | { 129 | case transformationType::zoom: 130 | StartDolly(); 131 | break; 132 | case transformationType::pan: 133 | StartPan(); 134 | break; 135 | case transformationType::windowLevel: 136 | StartWindowLevel(); 137 | break; 138 | default: 139 | break; 140 | } 141 | } 142 | 143 | //----------------------------------------------------------------------------- 144 | void vtkWidgetMPRInteractorStyle::moveSlice(const int& t_delta) 145 | { 146 | const int nextSlice = 147 | CurrentImageNumber + t_delta; 148 | if (nextSlice > m_max || nextSlice < m_min) 149 | { 150 | return; 151 | } 152 | const double sliceSpacing = 153 | m_imageReslice->GetOutput()->GetSpacing()[2]; 154 | vtkMatrix4x4* matrix = 155 | m_imageReslice->GetResliceAxes(); 156 | double point[4]; 157 | double center[4]; 158 | point[0] = 0.0; 159 | point[1] = 0.0; 160 | point[2] = sliceSpacing * t_delta; 161 | point[3] = 1.0; 162 | matrix->MultiplyPoint(point, center); 163 | matrix->SetElement(0, 3, center[0]); 164 | matrix->SetElement(1, 3, center[1]); 165 | matrix->SetElement(2, 3, center[2]); 166 | SetCurrentImageNumber(nextSlice); 167 | m_imageReslice->Update(); 168 | Interactor->Render(); 169 | } 170 | -------------------------------------------------------------------------------- /vtkresliceactor.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | 10 | 11 | class vtkResliceActor final : public vtkObject 12 | { 13 | public: 14 | static vtkResliceActor* New(); 15 | vtkTypeMacro(vtkResliceActor, vtkObject); 16 | vtkResliceActor() { createActor(); } 17 | ~vtkResliceActor() = default; 18 | 19 | //getters 20 | [[nodiscard]] vtkActor* getActor() const { return m_actor; } 21 | [[nodiscard]] vtkMTimeType getLineTime() const { return m_cursorLines[0]->GetMTime(); } 22 | 23 | //setters 24 | void setCameraDistance(const double t_distance) { m_cameraDistance = t_distance; } 25 | void setDisplaySize(const double* t_size); 26 | void setDisplayOriginPoint(const double* t_point); 27 | void setCenterPosition(const double* t_center); 28 | 29 | void createActor(); 30 | void update(); 31 | void reset() const; 32 | void createColors(double* t_color1, double* t_color2); 33 | 34 | private: 35 | vtkSmartPointer m_appender = {}; 36 | vtkSmartPointer m_actor = {}; 37 | vtkSmartPointer m_filter = {}; 38 | vtkSmartPointer m_cursorLines[4] = {}; 39 | vtkSmartPointer m_colors[3] = {}; 40 | vtkSmartPointer m_mapper = {}; 41 | double m_windowSize[3] = {}; 42 | double m_windowOrigin[3] = {}; 43 | double m_centerPointDisplayPosition[3] = {}; 44 | double m_cameraDistance = 0; 45 | int m_start = 0; 46 | }; 47 | 48 | -------------------------------------------------------------------------------- /vtkreslicecallback.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkreslicecallback.h" 2 | #include 3 | #include 4 | #include 5 | #include "utility.h" 6 | #include "vtkreslicerotator.h" 7 | #include "vtkreslicetranslator.h" 8 | #include "vtkreslicewidgetrepresentation.h" 9 | 10 | vtkStandardNewMacro(vtkResliceCallback); 11 | 12 | void vtkResliceCallback::Execute( 13 | vtkObject* caller, const unsigned long eventId, void* callData) 14 | { 15 | auto* const data = static_cast(callData); 16 | switch (eventId) 17 | { 18 | case LeftButtonReleaseEvent: 19 | m_resliceWidget->refreshWindows(-1); 20 | break; 21 | case cursorRotate: 22 | rotateCursor(data[0]); 23 | m_resliceWidget->centerImageActors(m_handleNumber); 24 | m_resliceWidget->refreshWindows(m_handleNumber); 25 | break; 26 | case cursorMove: 27 | moveCursor(data); 28 | m_resliceWidget->centerImageActors(m_handleNumber); 29 | m_resliceWidget->refreshWindows(m_handleNumber); 30 | break; 31 | case cursorFinishMovement: 32 | { 33 | setCursorPositiontoDefault(); 34 | m_resliceWidget->centerImageActors(-1); 35 | m_resliceWidget->refreshWindows(-1); 36 | } 37 | break; 38 | case qualityLow: 39 | case qualityHigh: 40 | m_resliceWidget->setHighQuality( 41 | eventId - qualityLow, 42 | *(static_cast(callData))); 43 | break; 44 | case imageChanged: 45 | changeMatrixCenterPosition(m_resliceWidget->getImageReslicers()[m_handleNumber]->GetResliceAxes(), 46 | m_resliceWidget->getImageReslicers()[(m_handleNumber + 1) % 3]->GetResliceAxes()); 47 | changeMatrixCenterPosition(m_resliceWidget->getImageReslicers()[m_handleNumber]->GetResliceAxes(), 48 | m_resliceWidget->getImageReslicers()[(m_handleNumber + 2) % 3]->GetResliceAxes()); 49 | m_resliceWidget->centerImageActors(-1); 50 | m_resliceWidget->refreshWindows(m_handleNumber); 51 | break; 52 | default: 53 | break; 54 | } 55 | } 56 | 57 | //----------------------------------------------------------------------------- 58 | void vtkResliceCallback::rotateCursor(const double t_angle) const 59 | { 60 | vtkMatrix4x4* sourceMatrix = 61 | m_resliceWidget->getImageReslicers()[m_handleNumber]->GetResliceAxes(); 62 | vtkMatrix4x4* matrix = 63 | m_resliceWidget->getImageReslicers()[(m_handleNumber + 1) % 3]->GetResliceAxes();; 64 | vtkMatrix4x4* matrix2 = 65 | m_resliceWidget->getImageReslicers()[(m_handleNumber + 2) % 3]->GetResliceAxes();; 66 | vtkResliceRotator::rotatePlane(sourceMatrix, matrix, t_angle); 67 | vtkResliceRotator::rotatePlane(sourceMatrix, matrix2, t_angle); 68 | } 69 | 70 | //----------------------------------------------------------------------------- 71 | void vtkResliceCallback::moveCursor(double* t_position) const 72 | { 73 | vtkMatrix4x4* matrix = nullptr; 74 | vtkMatrix4x4* matrix2 = nullptr; 75 | vtkMatrix4x4* sourceMatrix = 76 | m_resliceWidget->getImageReslicers()[m_handleNumber]->GetResliceAxes(); 77 | switch (m_handleNumber) 78 | { 79 | case 0: 80 | matrix = m_resliceWidget->getImageReslicers()[1]->GetResliceAxes(); 81 | matrix2 = m_resliceWidget->getImageReslicers()[2]->GetResliceAxes(); 82 | break; 83 | case 1: 84 | matrix = m_resliceWidget->getImageReslicers()[0]->GetResliceAxes(); 85 | matrix2 = m_resliceWidget->getImageReslicers()[2]->GetResliceAxes(); 86 | break; 87 | case 2: 88 | matrix = m_resliceWidget->getImageReslicers()[0]->GetResliceAxes(); 89 | matrix2 = m_resliceWidget->getImageReslicers()[1]->GetResliceAxes(); 90 | break; 91 | default: 92 | break; 93 | } 94 | if (m_window) 95 | { 96 | vtkResliceTranslator::movePlaneX( 97 | sourceMatrix, matrix, matrix2, t_position); 98 | } 99 | } 100 | 101 | //----------------------------------------------------------------------------- 102 | void vtkResliceCallback::setCursorPositiontoDefault() const 103 | { 104 | vtkMatrix4x4* matrix2 = 105 | m_resliceWidget->getImageReslicers()[(m_handleNumber + 1) % 3]->GetResliceAxes();; 106 | vtkMatrix4x4* sourceMatrix = 107 | m_resliceWidget->getImageReslicers()[m_handleNumber]->GetResliceAxes(); 108 | sourceMatrix->SetElement(0, 3, matrix2->GetElement(0, 3)); 109 | sourceMatrix->SetElement(1, 3, matrix2->GetElement(1, 3)); 110 | sourceMatrix->SetElement(2, 3, matrix2->GetElement(2, 3)); 111 | } 112 | 113 | //----------------------------------------------------------------------------- 114 | void vtkResliceCallback::changeMatrixCenterPosition(vtkMatrix4x4* t_sourceMatrix, 115 | vtkMatrix4x4* t_destinationMatrix) 116 | { 117 | t_destinationMatrix->SetElement(0, 3, t_sourceMatrix->GetElement(0, 3)); 118 | t_destinationMatrix->SetElement(1, 3, t_sourceMatrix->GetElement(1, 3)); 119 | t_destinationMatrix->SetElement(2, 3, t_sourceMatrix->GetElement(2, 3)); 120 | } 121 | -------------------------------------------------------------------------------- /vtkreslicerotator.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | 5 | class vtkImageResliceToColors; 6 | 7 | 8 | class vtkResliceRotator 9 | { 10 | public: 11 | vtkResliceRotator() = default; 12 | ~vtkResliceRotator() = default; 13 | static void rotatePlane(vtkMatrix4x4* t_sourceMatrix, 14 | vtkMatrix4x4* t_destinationMatrix, double t_angle); 15 | }; 16 | 17 | -------------------------------------------------------------------------------- /vtkreslicewidgetrepresentation.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkreslicewidgetrepresentation.h" 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | vtkStandardNewMacro(vtkResliceWidgetRepresentation); 13 | 14 | vtkResliceWidgetRepresentation::vtkResliceWidgetRepresentation() 15 | { 16 | initializeRepresentation(); 17 | } 18 | 19 | //----------------------------------------------------------------------------- 20 | void vtkResliceWidgetRepresentation::initializeRepresentation() 21 | { 22 | m_handleRepresentation = vtkSmartPointer::New(); 23 | m_handleRepresentation->SetSmoothMotion(1); 24 | m_handleRepresentation->SetHandleSize(0); 25 | m_handleRepresentation->SetTolerance(15); 26 | m_handleRepresentation->AllOff(); 27 | m_handleRepresentation->TranslationModeOn(); 28 | createCursor(); 29 | instantiateHandleRepresentation(); 30 | } 31 | 32 | //----------------------------------------------------------------------------- 33 | void vtkResliceWidgetRepresentation::createCursor() 34 | { 35 | m_cursorActor = vtkSmartPointer::New(); 36 | m_cursorVisibility = true; 37 | } 38 | 39 | //----------------------------------------------------------------------------- 40 | void vtkResliceWidgetRepresentation::SetVisibility(const int _arg) 41 | { 42 | m_cursorVisibility = static_cast(_arg); 43 | } 44 | 45 | //----------------------------------------------------------------------------- 46 | int vtkResliceWidgetRepresentation::GetVisibility() 47 | { 48 | return static_cast(m_cursorVisibility); 49 | } 50 | 51 | //----------------------------------------------------------------------------- 52 | int vtkResliceWidgetRepresentation::ComputeInteractionState( 53 | const int X, const int Y, int modify) 54 | { 55 | if (m_centerMovementPointRepresentation->ComputeInteractionState(X, Y) 56 | != vtkHandleRepresentation::Outside) 57 | { 58 | return handleCursor; 59 | }; 60 | vtkNew picker; 61 | picker->SetTolerance(0.01); 62 | picker->InitializePickList(); 63 | picker->PickFromListOn(); 64 | picker->AddPickList(m_cursorActor->getActor()); 65 | if (picker->Pick(X, Y, 0, Renderer)) 66 | { 67 | return mprCursor; 68 | } 69 | return outside; 70 | } 71 | 72 | //----------------------------------------------------------------------------- 73 | void vtkResliceWidgetRepresentation::instantiateHandleRepresentation() 74 | { 75 | if (!m_centerMovementPointRepresentation) 76 | { 77 | m_centerMovementPointRepresentation = 78 | m_handleRepresentation->NewInstance(); 79 | m_centerMovementPointRepresentation-> 80 | ShallowCopy(m_handleRepresentation); 81 | } 82 | } 83 | 84 | //----------------------------------------------------------------------------- 85 | void vtkResliceWidgetRepresentation::BuildRepresentation() 86 | { 87 | if (GetMTime() > BuildTime || 88 | getCenterMovementRepresentation()->GetMTime() > BuildTime || 89 | Renderer && Renderer->GetVTKWindow() && 90 | Renderer->GetVTKWindow()->GetMTime() > BuildTime) 91 | { 92 | double centerPos[3]; 93 | m_centerMovementPointRepresentation->GetWorldPosition(centerPos); 94 | Renderer->GetVTKWindow()->GetSize(); 95 | m_cursorActor->setCameraDistance( 96 | Renderer->GetActiveCamera()->GetDistance()); 97 | vtkNew coord; 98 | coord->SetCoordinateSystemToDisplay(); 99 | coord->SetValue( 100 | Renderer->GetVTKWindow()->GetSize()[0], 101 | Renderer->GetVTKWindow()->GetSize()[1], 0); 102 | double* size = coord->GetComputedWorldValue(Renderer); 103 | m_cursorActor->setCenterPosition(centerPos); 104 | m_cursorActor->setDisplaySize(size); 105 | coord->SetValue(0, 0); 106 | double* origin = coord->GetComputedWorldValue(Renderer); 107 | m_cursorActor->setDisplayOriginPoint(origin); 108 | m_cursorActor->update(); 109 | BuildTime.Modified(); 110 | } 111 | } 112 | 113 | //----------------------------------------------------------------------------- 114 | void vtkResliceWidgetRepresentation::ReleaseGraphicsResources( 115 | vtkWindow* w) 116 | { 117 | if (m_cursorActor && m_cursorVisibility) 118 | { 119 | m_cursorActor->getActor()->ReleaseGraphicsResources(w); 120 | } 121 | } 122 | 123 | //----------------------------------------------------------------------------- 124 | int vtkResliceWidgetRepresentation::RenderOverlay( 125 | vtkViewport* viewport) 126 | { 127 | int count = 0; 128 | if (m_cursorActor->getActor() && m_cursorVisibility) 129 | { 130 | count += m_cursorActor->getActor()->RenderOverlay(viewport); 131 | } 132 | return count; 133 | } 134 | 135 | //----------------------------------------------------------------------------- 136 | int vtkResliceWidgetRepresentation::RenderOpaqueGeometry( 137 | vtkViewport* viewport) 138 | { 139 | if (m_cursorActor->getActor() && 140 | m_cursorActor->getActor()->GetVisibility() && 141 | m_cursorVisibility) 142 | { 143 | m_cursorActor->getActor()->RenderOpaqueGeometry(viewport); 144 | } 145 | else 146 | { 147 | return 0; 148 | } 149 | return 1; 150 | } 151 | 152 | //----------------------------------------------------------------------------- 153 | int vtkResliceWidgetRepresentation::HasTranslucentPolygonalGeometry() 154 | { 155 | BuildRepresentation(); 156 | return m_cursorActor->getActor() 157 | ? m_cursorActor->getActor()->HasTranslucentPolygonalGeometry() 158 | : 0; 159 | } 160 | 161 | //----------------------------------------------------------------------------- 162 | void vtkResliceWidgetRepresentation::rotate(const double t_angle) 163 | { 164 | m_rotationAngle += t_angle; 165 | m_cursorActor->getActor()->RotateZ(vtkMath::DegreesFromRadians(t_angle)); 166 | } 167 | 168 | //----------------------------------------------------------------------------- 169 | void vtkResliceWidgetRepresentation::setPlane(const int t_plane) 170 | { 171 | m_plane = t_plane; 172 | double verticalColor[3] = { 3, 218, 198 }; 173 | double horizontalColor[3] = { 3, 218, 198 }; 174 | if (m_cursorActor) 175 | { 176 | m_cursorActor->createColors(verticalColor, horizontalColor); 177 | } 178 | } 179 | 180 | //----------------------------------------------------------------------------- 181 | void vtkResliceWidgetRepresentation::setCursorPosition(double* t_position) 182 | { 183 | m_centerMovementPointRepresentation->SetWorldPosition(t_position); 184 | BuildRepresentation(); 185 | } 186 | -------------------------------------------------------------------------------- /vtkreslicewidgetrepresentation.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include "vtkresliceactor.h" 7 | 8 | 9 | class vtkResliceWidgetRepresentation final : public vtkWidgetRepresentation 10 | { 11 | public: 12 | static vtkResliceWidgetRepresentation* New(); 13 | vtkTypeMacro(vtkResliceWidgetRepresentation, vtkWidgetRepresentation); 14 | vtkResliceWidgetRepresentation(); 15 | ~vtkResliceWidgetRepresentation() = default; 16 | 17 | void instantiateHandleRepresentation(); 18 | void StartWidgetInteraction(double eventPos[2]) override {}; 19 | void WidgetInteraction(double newEventPos[2]) override {}; 20 | void BuildRepresentation() override; 21 | void ReleaseGraphicsResources(vtkWindow* w) override; 22 | int RenderOverlay(vtkViewport* viewport) override; 23 | int RenderOpaqueGeometry(vtkViewport* viewport) override; 24 | int HasTranslucentPolygonalGeometry() override; 25 | 26 | void rotate(double t_angle); 27 | void setPlane(int t_plane); 28 | 29 | void setCursorPosition(double* t_position); 30 | void SetVisibility(int _arg) override; 31 | int GetVisibility() override; 32 | int ComputeInteractionState(int X, int Y, int modify) override; 33 | 34 | [[nodiscard]] vtkSmartPointer getResliceActor() const { return m_cursorActor; } 35 | [[nodiscard]] vtkSmartPointer getCenterMovementRepresentation() const { 36 | return m_centerMovementPointRepresentation; 37 | } 38 | enum InteractionState { outside = 0, mprCursor, mipCursor, handleCursor }; 39 | 40 | private: 41 | vtkSmartPointer m_handleRepresentation = {}; 42 | vtkSmartPointer m_centerMovementPointRepresentation = {}; 43 | vtkSmartPointer m_cursorActor; 44 | bool m_cursorVisibility = false; 45 | double m_rotationAngle = 0; 46 | int m_plane = -1; 47 | 48 | void initializeRepresentation(); 49 | void createCursor(); 50 | }; 51 | 52 | -------------------------------------------------------------------------------- /vtkwidget3dinteractorstyle.cpp: -------------------------------------------------------------------------------- 1 | #include "vtkwidget3dinteractorstyle.h" 2 | #include 3 | #include 4 | #include "vtkwidget3d.h" 5 | 6 | vtkStandardNewMacro(vtkWidget3DInteractorStyle); 7 | 8 | void vtkWidget3DInteractorStyle::OnMouseMove() 9 | { 10 | auto* const currentEventPosition = 11 | Interactor->GetEventPosition(); 12 | auto* const lastEventPosition = 13 | Interactor->GetLastEventPosition(); 14 | if (State == VTKIS_SPIN) 15 | { 16 | m_transferFunction-> 17 | updateWindowLevel(currentEventPosition[0] - lastEventPosition[0], 18 | currentEventPosition[1] - lastEventPosition[1]); 19 | m_widget3D->updateFilter(); 20 | Interactor->Render(); 21 | return; 22 | } 23 | vtkInteractorStyleTrackballCamera::OnMouseMove(); 24 | } 25 | -------------------------------------------------------------------------------- /vtkwidget3dinteractorstyle.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include "transferfunction.h" 5 | 6 | 7 | class vtkWidget3D; 8 | 9 | class vtkWidget3DInteractorStyle final : public vtkInteractorStyleTrackballCamera 10 | { 11 | public: 12 | static vtkWidget3DInteractorStyle* New(); 13 | vtkTypeMacro(vtkWidget3DInteractorStyle, vtkInteractorStyleTrackballCamera); 14 | vtkWidget3DInteractorStyle() = default; 15 | ~vtkWidget3DInteractorStyle() = default; 16 | 17 | //getters 18 | [[nodiscard]] vtkWidget3D* getWidget() const { return m_widget3D; } 19 | [[nodiscard]] TransferFunction* getTransferFunction() const { return m_transferFunction; } 20 | 21 | //setters 22 | void setWidget(vtkWidget3D* t_widget) { m_widget3D = t_widget; } 23 | void setTransferFunction(TransferFunction* t_function) { m_transferFunction = t_function; } 24 | 25 | protected: 26 | void OnMouseMove() override; 27 | 28 | private: 29 | vtkWidget3D* m_widget3D = {}; 30 | TransferFunction* m_transferFunction = {}; 31 | }; 32 | 33 | 34 | -------------------------------------------------------------------------------- /vtkwidgetmprcallback.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | 7 | class vtkWidgetMPR; 8 | 9 | class vtkWidgetMPRCallback final : public vtkCommand 10 | { 11 | public: 12 | static vtkWidgetMPRCallback* New(); 13 | vtkTypeMacro(vtkWidgetMPRCallback, vtkCommand); 14 | vtkWidgetMPRCallback() = default; 15 | ~vtkWidgetMPRCallback() = default; 16 | 17 | //setters 18 | void setWidget(vtkWidgetMPR* t_widget) { m_widget = t_widget; } 19 | 20 | void Execute(vtkObject* caller, unsigned long eventId, void* callData) override; 21 | 22 | private: 23 | vtkWidgetMPR* m_widget = {}; 24 | }; 25 | -------------------------------------------------------------------------------- /vtkwidgetmprinteractorstyle.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | #include 4 | #include 5 | #include 6 | #include "utility.h" 7 | class vtkWidgetMPR; 8 | 9 | class vtkWidgetMPRInteractorStyle final : public vtkInteractorStyleImage 10 | { 11 | public: 12 | static vtkWidgetMPRInteractorStyle* New(); 13 | vtkTypeMacro(vtkWidgetMPRInteractorStyle, vtkInteractorStyleImage); 14 | vtkWidgetMPRInteractorStyle() = default; 15 | ~vtkWidgetMPRInteractorStyle() = default; 16 | 17 | //getters 18 | int getMax() const { return m_max; } 19 | int getMin() const { return m_min; } 20 | vtkWidgetMPR* getWidget() const { return m_widget; } 21 | vtkAxisActor2D* getAxisActor2D() const { return m_axisActor; } 22 | vtkImageResliceToColors* getImageReslice() const { return m_imageReslice; } 23 | 24 | //setters 25 | void setMinMax(const int& t_min, const int& t_max) { m_min = t_min; m_max = t_max; } 26 | void setWidget(vtkWidgetMPR* t_widget) { m_widget = t_widget; } 27 | void setAxisActor2D(vtkAxisActor2D* t_actor) { m_axisActor = t_actor; } 28 | void setImageReslice(vtkImageResliceToColors* t_imageReslice) { m_imageReslice = t_imageReslice; } 29 | 30 | void rescaleAxisActor(); 31 | void moveToSlice(const int& t_number); 32 | 33 | protected: 34 | void OnMouseMove() override; 35 | void OnMouseWheelForward() override; 36 | void OnMouseWheelBackward() override; 37 | void OnLeftButtonDown() override; 38 | void OnLeftButtonUp() override; 39 | void OnRightButtonDown() override; 40 | void OnRightButtonUp() override; 41 | void OnMiddleButtonDown() override; 42 | void OnMiddleButtonUp() override; 43 | 44 | private: 45 | vtkWidgetMPR* m_widget = {}; 46 | vtkAxisActor2D* m_axisActor = {}; 47 | vtkImageResliceToColors* m_imageReslice = {}; 48 | int m_max = 0; 49 | int m_min = 0; 50 | 51 | void startAction(const transformationType& t_action); 52 | void moveSlice(const int& t_delta); 53 | }; 54 | 55 | --------------------------------------------------------------------------------