X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvOverlayPanel.cxx;h=2a77e8dcaff5a5a335c23f4366571dfb238691e2;hb=58f6f4201ec9091b5150f6576da25bfedeabbdce;hp=f76ee4b15e4224f927e7b6e0a0b548fd11d21dab;hpb=931a42358442f4ee4f314613c991c838d4b4e3b7;p=clitk.git diff --git a/vv/vvOverlayPanel.cxx b/vv/vvOverlayPanel.cxx index f76ee4b..2a77e8d 100644 --- a/vv/vvOverlayPanel.cxx +++ b/vv/vvOverlayPanel.cxx @@ -1,224 +1,333 @@ -#ifndef _vvOverlayPanel_CXX -#define _vvOverlayPanel_CXX - /*========================================================================= + Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Program: vv - Module: $RCSfile: vvOverlayPanel.cxx,v $ - Language: C++ - Date: $Date: 2010/01/06 13:31:57 $ - Version: $Revision: 1.1 $ - Author : Pierre Seroul (pierre.seroul@gmail.com) - -Copyright (C) 200COLUMN_IMAGE_NAME -Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr -CREATIS-LRMN http://www.creatis.insa-lyon.fr + Authors belong to: + - University of LYON http://www.universite-lyon.fr/ + - Léon Bérard cancer center http://www.centreleonberard.fr + - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation, version 3 of the License. + This software is distributed WITHOUT ANY WARRANTY; without even + the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + PURPOSE. See the copyright notices for more information. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . - -=========================================================================*/ + It is distributed under dual licence + - BSD See included LICENSE.txt file + - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html +===========================================================================**/ +#ifndef _vvOverlayPanel_CXX +#define _vvOverlayPanel_CXX #include "vvOverlayPanel.h" #include #include #include "QTreePushButton.h" +#include #include //==================================================================== vvOverlayPanel::vvOverlayPanel(QWidget * parent):QWidget(parent) { - setupUi(this); + disableFusionSignals = true; + disableFusionSequenceSignals = true; - vFFrame->hide(); - compareFrame->hide(); - fusionFrame->hide(); - subSamplingSpinBox->setEnabled(0); - scaleSpinBox->setEnabled(0); - lutCheckBox->hide(); - lutCheckBox->setEnabled(0); - connect(subSamplingSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty())); - connect(scaleSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty())); - connect(lutCheckBox,SIGNAL(clicked()),this,SLOT(setVFProperty())); - connect(colorHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(setOverlayProperty())); - connect(opacityHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(setFusionProperty())); - connect(fusionColorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(setFusionProperty())); - connect(windowSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setFusionProperty())); - connect(levelSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setFusionProperty())); + setupUi(this); + + vFFrame->hide(); + compareFrame->hide(); + fusionFrame->hide(); + fCTUSFrame->hide(); + subSamplingSpinBox->setEnabled(0); + scaleSpinBox->setEnabled(0); + lutCheckBox->hide(); + lutCheckBox->setEnabled(0); + fusionShowLegendCheckBox->setChecked(false); + + connect(subSamplingSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty())); + connect(scaleSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty())); + connect(lutCheckBox,SIGNAL(clicked()),this,SLOT(setVFProperty())); + connect(vfWidthSpinBox,SIGNAL(editingFinished()),this,SLOT(setVFProperty())); + connect(vfColorButton,SIGNAL(clicked()),this,SLOT(VFColorChangeRequest())); + connect(colorHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(setOverlayProperty())); + connect(opacityHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(setFusionProperty())); + connect(thresOpacityHorizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(setFusionProperty())); + connect(fusionColorMapComboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(setFusionProperty())); + connect(fusionWindowSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setFusionProperty())); + connect(fusionLevelSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setFusionProperty())); + connect(fusionOpacitySpin,SIGNAL(valueChanged(double)),this,SLOT(setFusionSpinProperty())); + connect(fusionThresSpin,SIGNAL(valueChanged(double)),this,SLOT(setFusionSpinProperty())); + connect(fusionShowLegendCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setFusionProperty())); + connect(overlayWindowSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setOverlayProperty())); + connect(overlayLevelSpinBox,SIGNAL(valueChanged(double)),this,SLOT(setOverlayProperty())); + connect(overlayLinkCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setOverlayProperty())); + + connect(fCTUSSlider,SIGNAL(valueChanged(int)),this,SLOT(setFusionSequenceProperty())); + connect(fCTUSActivateSpaceSyncCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setFusionSequenceProperty())); + connect(fCTUSActivateTimeSyncCheckBox,SIGNAL(stateChanged(int)),this,SLOT(setFusionSequenceProperty())); + connect(fCTUSLoadCorrespondancesPushButton,SIGNAL(clicked()),this,SIGNAL(FusionSequenceCorrespondancesButtonPressed())); } void vvOverlayPanel::getCurrentImageName(QString name) { - QString filename = "Current image : "; - filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); - currentImageLabel->setText(filename.toStdString().c_str()); + QString filename = "Current image : "; + filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); + currentImageLabel->setText(filename.toStdString().c_str()); } void vvOverlayPanel::getVFProperty(int subsampling, int scale, int log) { - if (subsampling != -1) - { - vFFrame->show(); - vFFrame->setEnabled(1); - subSamplingSpinBox->setEnabled(1); - subSamplingSpinBox->setValue(subsampling); - scaleSpinBox->setEnabled(1); - scaleSpinBox->setValue(scale); - lutCheckBox->setEnabled(1); - if (log > 0) - lutCheckBox->setCheckState(Qt::Checked); - else - lutCheckBox->setCheckState(Qt::Unchecked); - } + if (subsampling != -1) { + vFFrame->show(); + vFFrame->setEnabled(1); + subSamplingSpinBox->setEnabled(1); + subSamplingSpinBox->setValue(subsampling); + scaleSpinBox->setEnabled(1); + scaleSpinBox->setValue(scale); + lutCheckBox->setEnabled(1); + if (log > 0) + lutCheckBox->setCheckState(Qt::Checked); else - { - vFFrame->hide(); - vFFrame->setEnabled(0); - subSamplingSpinBox->setEnabled(0); - subSamplingSpinBox->setValue(0); - scaleSpinBox->setEnabled(0); - scaleSpinBox->setValue(0); - lutCheckBox->setEnabled(0); - lutCheckBox->setCheckState(Qt::Unchecked); - } + lutCheckBox->setCheckState(Qt::Unchecked); + } else { + vFFrame->hide(); + vFFrame->setEnabled(0); + subSamplingSpinBox->setEnabled(0); + subSamplingSpinBox->setValue(0); + scaleSpinBox->setEnabled(0); + scaleSpinBox->setValue(0); + lutCheckBox->setEnabled(0); + lutCheckBox->setCheckState(Qt::Unchecked); + } } void vvOverlayPanel::getVFName(QString name) { - QString filename = "Deformation Field : "; - filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); - vectorFieldNameLabel->setText(filename.toStdString().c_str()); + QString filename = "Deformation Field : "; + filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); + vectorFieldNameLabel->setText(filename.toStdString().c_str()); } void vvOverlayPanel::setVFProperty() { - emit VFPropertyUpdated(subSamplingSpinBox->value(), - scaleSpinBox->value(), - lutCheckBox->checkState()); + QColor color(vfColorButton->palette().color(QPalette::Background)); + emit VFPropertyUpdated(subSamplingSpinBox->value(), + scaleSpinBox->value(), + lutCheckBox->checkState(), + vfWidthSpinBox->value(), + color.redF(), color.greenF(), color.blueF()); } void vvOverlayPanel::getCurrentVectorInfo(int visibility, double x,double y,double z, double value) { - QString motion = "Displacement : "; - QString motionValue = "Length : "; - if (visibility) - { - motion += QString::number(x,'f',1) + " "; - motion += QString::number(y,'f',1) + " "; - motion += QString::number(z,'f',1) + " "; + QString motion = "Displacement : "; + QString motionValue = "Length : "; + if (visibility) { + motion += QString::number(x,'f',1) + " "; + motion += QString::number(y,'f',1) + " "; + motion += QString::number(z,'f',1) + " "; - motionValue += QString::number(value,'f',1); - } - coordinatesLabel->setText(motion); - normLabel->setText(motionValue); + motionValue += QString::number(value,'f',1); + } + coordinatesLabel->setText(motion); + normLabel->setText(motionValue); } void vvOverlayPanel::getOverlayName(QString name) { - QString filename = "Compare with : "; - filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); - imageComparedLabel->setText(filename.toStdString().c_str()); + QString filename = "Compare with : "; + filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); + imageComparedLabel->setText(filename.toStdString().c_str()); } -void vvOverlayPanel::getOverlayProperty(int value) +void vvOverlayPanel::getOverlayProperty(int color, int linked, double window, double level) { - if (value > -1) - { - compareFrame->show(); - compareFrame->setEnabled(1); - colorHorizontalSlider->setEnabled(1); - colorHorizontalSlider->setValue(value); - } - else - { - compareFrame->hide(); - compareFrame->setEnabled(0); - colorHorizontalSlider->setEnabled(0); - colorHorizontalSlider->setValue(0); - } + if (color > -1) { + compareFrame->show(); + compareFrame->setEnabled(1); + colorHorizontalSlider->setEnabled(1); + colorHorizontalSlider->setValue(color); + overlayLinkCheckBox->setCheckState( (linked)?Qt::Checked:Qt::Unchecked ); + overlayWindowSpinBox->setValue(window); + overlayLevelSpinBox->setValue(level); + } else { + compareFrame->hide(); + compareFrame->setEnabled(0); + colorHorizontalSlider->setEnabled(0); + colorHorizontalSlider->setValue(0); + } } void vvOverlayPanel::setOverlayProperty() { - emit OverlayPropertyUpdated(colorHorizontalSlider->value()); + overlayWindowSpinBox->setEnabled(!overlayLinkCheckBox->checkState()); + overlayLevelSpinBox->setEnabled(!overlayLinkCheckBox->checkState()); + emit OverlayPropertyUpdated(colorHorizontalSlider->value(), + overlayLinkCheckBox->checkState(), + overlayWindowSpinBox->value(), + overlayLevelSpinBox->value()); } void vvOverlayPanel::getCurrentOverlayInfo(int visibility,double valueOver, double valueRef) { - QString refValue = "Pixel value in image 1 : "; - QString overlayValue = "Pixel value in image 2 : "; - QString diffValue = "Pixel difference : "; - if (visibility) - { - refValue += QString::number(valueRef); - overlayValue += QString::number(valueOver,'f',1); - diffValue += QString::number(valueRef - valueOver,'f',1); - } - refValueLabel->setText(refValue); - valueLabel->setText(overlayValue); - diffValueLabel->setText(diffValue); + QString refValue = "Pixel value in image 1 : "; + QString overlayValue = "Pixel value in image 2 : "; + QString diffValue = "Pixel difference : "; + if (visibility) { + refValue += QString::number(valueRef); + overlayValue += QString::number(valueOver); + diffValue += QString::number(valueRef - valueOver); + } + refValueLabel->setText(refValue); + valueLabel->setText(overlayValue); + diffValueLabel->setText(diffValue); } void vvOverlayPanel::getFusionName(QString name) { - QString filename = "Fusion with : "; - filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); - dataFusionnedLabel->setText(filename.toStdString().c_str()); -} - -void vvOverlayPanel::getFusionProperty(int opacity, int colormap, double window, double level) -{ - if (opacity > -1) - { - fusionFrame->show(); - fusionFrame->setEnabled(1); - opacityHorizontalSlider->setEnabled(1); - opacityHorizontalSlider->setValue(opacity); - fusionColorMapComboBox->setEnabled(1); - fusionColorMapComboBox->setCurrentIndex(colormap); - windowSpinBox->setEnabled(1); - levelSpinBox->setEnabled(1); - windowSpinBox->setValue(window); - levelSpinBox->setValue(level); - } - else - { - fusionFrame->hide(); - fusionFrame->setEnabled(0); - opacityHorizontalSlider->setEnabled(0); - opacityHorizontalSlider->setValue(0); - fusionColorMapComboBox->setEnabled(0); - fusionColorMapComboBox->setCurrentIndex(-1); - windowSpinBox->setEnabled(0); - levelSpinBox->setEnabled(0); - } + QString filename = "Fusion with : "; + filename += vtksys::SystemTools::GetFilenameWithoutExtension(name.toStdString()).c_str(); + dataFusionnedLabel->setText(filename.toStdString().c_str()); +} + +void vvOverlayPanel::getFusionProperty(int opacity, int thresOpacity, int colormap, double window, double level) +{ + if (opacity > -1) { + //first disable signals generated by each setValue() call + disableFusionSignals = true; + fusionFrame->show(); + fusionFrame->setEnabled(1); + fusionColorMapComboBox->setEnabled(1); + fusionColorMapComboBox->setCurrentIndex(colormap); + opacityHorizontalSlider->setEnabled(1); + opacityHorizontalSlider->setValue(opacity); + thresOpacityHorizontalSlider->setEnabled(1); + thresOpacityHorizontalSlider->setValue(thresOpacity); + fusionOpacitySpin->setValue(opacity); + fusionThresSpin->setValue(thresOpacity); + fusionWindowSpinBox->setEnabled(1); + fusionLevelSpinBox->setEnabled(1); + fusionWindowSpinBox->setValue(window); + fusionLevelSpinBox->setValue(level); + + // re-enable signals and trigger slot function + disableFusionSignals = false; + setFusionProperty(); + } else { + fusionFrame->hide(); + fusionFrame->setEnabled(0); + opacityHorizontalSlider->setEnabled(0); + opacityHorizontalSlider->setValue(0); + thresOpacityHorizontalSlider->setEnabled(0); + thresOpacityHorizontalSlider->setValue(0); + fusionOpacitySpin->setValue(0); + fusionThresSpin->setValue(0); + fusionColorMapComboBox->setEnabled(0); + fusionColorMapComboBox->setCurrentIndex(-1); + fusionWindowSpinBox->setEnabled(0); + fusionLevelSpinBox->setEnabled(0); + } } void vvOverlayPanel::setFusionProperty() { - emit FusionPropertyUpdated(opacityHorizontalSlider->value(), fusionColorMapComboBox->currentIndex(), - windowSpinBox->value(), levelSpinBox->value()); + if (disableFusionSignals) + return; + + fusionOpacitySpin->setValue(opacityHorizontalSlider->value()); + fusionThresSpin->setValue(thresOpacityHorizontalSlider->value()); + + emit FusionPropertyUpdated(opacityHorizontalSlider->value(), thresOpacityHorizontalSlider->value(), fusionColorMapComboBox->currentIndex(), + fusionWindowSpinBox->value(), fusionLevelSpinBox->value(), fusionShowLegendCheckBox->isChecked()); +} + +void vvOverlayPanel::setFusionSpinProperty() +{ + opacityHorizontalSlider->setValue(fusionOpacitySpin->value()); + thresOpacityHorizontalSlider->setValue(fusionThresSpin->value()); } void vvOverlayPanel::getCurrentFusionInfo(int visibility,double value) { - QString fusionValue = "Pixel value in image 2 : "; - if (visibility) - { - fusionValue += QString::number(value,'f',1); - } - valueFusionnedLabel->setText(fusionValue); + QString fusionValue = "Pixel value in image 2 : "; + if (visibility) { + fusionValue += QString::number(value,'f',1); + } + valueFusionnedLabel->setText(fusionValue); +} + + +void vvOverlayPanel::getFusionSequenceProperty(int sequenceFrameIndex, bool spatialSync, unsigned int sequenceLenth, bool temporalSync) +{ + if (sequenceFrameIndex > -1) { + disableFusionSequenceSignals = true; + fCTUSFrame->show(); + fCTUSFrame->setEnabled(1); + fCTUSSlider->setEnabled(1); + fCTUSSlider->setValue(sequenceFrameIndex); + fCTUSSlider->setMaximum(sequenceLenth-1); //the maximum IS included, since we start at 0, go until n-1! + if (spatialSync) fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Checked); + else fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Unchecked); + if (fCTUSActivateTimeSyncCheckBox->isEnabled()) { + if ( temporalSync ) fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Checked); + else fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Unchecked); + } + disableFusionSequenceSignals = false; + setFusionSequenceProperty(); + } else { + disableFusionSequenceSignals = true; + fCTUSFrame->hide(); + fCTUSFrame->setEnabled(0); + fCTUSSlider->setEnabled(0); + fCTUSSlider->setValue(0); + fCTUSSlider->setMaximum(0); + fCTUSActivateSpaceSyncCheckBox->setCheckState(Qt::Unchecked); + fCTUSActivateTimeSyncCheckBox->setCheckState(Qt::Unchecked); + disableFusionSequenceSignals = false; + setFusionSequenceProperty(); + } +} + + +void vvOverlayPanel::setFusionSequenceProperty() +{ + if (disableFusionSequenceSignals) + return; + emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum()+1, fCTUSActivateTimeSyncCheckBox->isChecked()); +} + +void vvOverlayPanel::enableFusionSequenceTemporalSync() { + bool backup = disableFusionSequenceSignals; + disableFusionSequenceSignals=true; //not sure this is necessary, but just in case... + fCTUSActivateTimeSyncCheckBox->setEnabled(1); + fCTUSActivateTimeSyncCheckBox->setChecked(true); + disableFusionSequenceSignals = backup; // + + if (disableFusionSequenceSignals) return; + emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum()+1, fCTUSActivateTimeSyncCheckBox->isChecked()); } +void vvOverlayPanel::updateFusionSequenceSliderValueFromWindow(int val, bool updateVisualization) { + if (fCTUSSlider->value()==val) return; + + disableFusionSequenceSignals = true; //not sure this is necessary, but just in case... + fCTUSSlider->setValue(val); + disableFusionSequenceSignals = false; + + if (disableFusionSequenceSignals) return; + if (updateVisualization) emit FusionSequencePropertyUpdated(fCTUSSlider->value(), fCTUSActivateSpaceSyncCheckBox->isChecked(), fCTUSSlider->maximum()+1, fCTUSActivateTimeSyncCheckBox->isChecked()); +} + +void vvOverlayPanel::VFColorChangeRequest() +{ + QColor color(vfColorButton->palette().color(QPalette::Background)); + color = QColorDialog::getColor(color, this, "Choose the new color of the vector field"); + //vfColorButton->palette().setColor(QPalette::Background, color); SR: Not working? + if (color.isValid()) + vfColorButton->setStyleSheet("* { background-color: " + color.name() + "; border: 0px }"); + this->setVFProperty(); +} + + + #endif /* end #define _vvOverlayPanel_CXX */