Skip to content

Commit

Permalink
Merge pull request SimVascular#1031 from ktbolt/No-image-segmentation…
Browse files Browse the repository at this point in the history
…_1029

No image segmentation 1029
  • Loading branch information
ktbolt authored Aug 3, 2023
2 parents f6179e1 + 2640559 commit 60094d1
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 25 deletions.
2 changes: 0 additions & 2 deletions Code/Source/sv3/Segmentation/sv3_CircleContour.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,7 @@ void circleContour::SetRadius(double radius)
void circleContour::SetControlPointByRadius(double radius, double* point)
{
double centerPt[3];
std::cout <<"Point coords: "<<point[0]<<" "<<point[1]<<" "<<point[2]<<std::endl;
m_vtkPlaneGeometry->ProjectPoint(point, centerPt);
std::cout <<"centerPt coords: "<<centerPt[0]<<" "<<centerPt[1]<<" "<<centerPt[2]<<std::endl;
std::array<double,3> dirVec;
if(m_ControlPoints.size()==0)
m_ControlPoints.push_back(std::array<double,3>{centerPt[0],centerPt[1],centerPt[2]});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,10 +238,51 @@ void sv4guiSeg2DEdit::CreateQtPartControl( QWidget *parent )
}
}

//------------------
// EnableGuiControls
//------------------
// Enable/disable GUI controls.
//
// This was added to disable GUI controls if image data
// is not defined.
//
void sv4guiSeg2DEdit::EnableGuiControls(bool enable)
{
ui->btnLevelSet->setEnabled(enable);
ui->btnThreshold->setEnabled(enable);
ui->btnCircle->setEnabled(enable);
ui->btnEllipse->setEnabled(enable);
ui->btnSplinePoly->setEnabled(enable);
ui->btnPolygon->setEnabled(enable);
ui->btnSmooth->setEnabled(enable);
ui->btnCopy->setEnabled(enable);
ui->btnPaste->setEnabled(enable);
ui->btnML->setEnabled(enable);
ui->multiSegButton->setEnabled(enable);
}

//------------------------
// ShowNoImageDataWarning
//------------------------
// Display a popup warning that no image data is defined and the
// tool is mostly disabled.
//
void sv4guiSeg2DEdit::ShowNoImageDataWarning()
{
if (m_NoImageDataWarningShown) {
return;
}

QMessageBox::warning(NULL, "The Segmentation Tool is disabled.",
"No image data has been loaded so the Segmentation Tool is disabled.\n\nLoad an image to enable full functionality.");
m_NoImageDataWarningShown = true;
}

void sv4guiSeg2DEdit::Visible()
{
// ui->resliceSlider->turnOnReslice(true);
OnSelectionChanged(GetDataManagerSelection());

}

void sv4guiSeg2DEdit::Hidden()
Expand Down Expand Up @@ -281,8 +322,6 @@ int sv4guiSeg2DEdit::GetTimeStep()
//
void sv4guiSeg2DEdit::OnSelectionChanged(std::vector<mitk::DataNode*> nodes )
{
std::cout << "OnSelectionChanged\n";

if(!IsVisible())
{
return;
Expand All @@ -298,7 +337,7 @@ void sv4guiSeg2DEdit::OnSelectionChanged(std::vector<mitk::DataNode*> nodes )

mitk::DataNode::Pointer groupNode=nodes.front();

if(m_ContourGroupNode==groupNode)
if(m_ContourGroupNode==groupNode && m_HasImageData)
{
ui->resliceSlider->turnOnReslice(true);
return;
Expand All @@ -310,7 +349,7 @@ void sv4guiSeg2DEdit::OnSelectionChanged(std::vector<mitk::DataNode*> nodes )
m_ContourGroup=dynamic_cast<sv4guiContourGroup*>(groupNode->GetData());
if(!m_ContourGroup)
{
std::cout << "no contour group selected\n";
std::cout << "No contour group selected\n";
ui->resliceSlider->turnOnReslice(false);
ClearAll();
ui->SinglePathTab->setEnabled(false);
Expand Down Expand Up @@ -338,13 +377,21 @@ void sv4guiSeg2DEdit::OnSelectionChanged(std::vector<mitk::DataNode*> nodes )
if(rs->size()>0) {
mitk::DataNode::Pointer imageFolderNode=rs->GetElement(0);
rs=GetDataStorage()->GetDerivations(imageFolderNode);

if(rs->size()>0) {
imageNode=rs->GetElement(0);
if(imageNode.IsNotNull()) {
m_Image= dynamic_cast<mitk::Image*>(imageNode->GetData());
}
}

// If there is no image data then disable the reslice slider
// and most GUI controls to prevent SV from crashing.
//
} else {
ui->resliceSlider->turnOnReslice(false);
m_HasImageData = false;
EnableGuiControls(false);
}
}

rs=GetDataStorage()->GetDerivations(projFolderNode,mitk::NodePredicateDataType::New("sv4guiPathFolder"));
Expand Down Expand Up @@ -517,14 +564,26 @@ void sv4guiSeg2DEdit::OnSelectionChanged(std::vector<mitk::DataNode*> nodes )
m_ContourGroupNode->GetBoolProperty("lofting",lofting);
ui->checkBoxLoftingPreview->setChecked(lofting);

ui->resliceSlider->turnOnReslice(true);
if (m_HasImageData) {
ui->resliceSlider->turnOnReslice(true);

// If there is no image data then disable the reslice slider
// and most GUI controls to prevent SV from crashing.
//
} else {
ui->resliceSlider->turnOnReslice(false);
EnableGuiControls(false);
}

m_DataInteractor->SetPathPoints(m_PathPoints);
m_DataInteractor->SetPathPoint(ui->resliceSlider->getCurrentPathPoint());
m_DataInteractor->SetSubdivisionSpacing(GetVolumeImageSpacing());

connect(ui->resliceSlider,SIGNAL(reslicePositionChanged(int)), this, SLOT(UpdatePathPoint(int)) );

if (!m_HasImageData) {
ShowNoImageDataWarning();
}
}

double sv4guiSeg2DEdit::GetVolumeImageSpacing()
Expand Down Expand Up @@ -1779,8 +1838,6 @@ void sv4guiSeg2DEdit::ShowPath(bool checked)
//
void sv4guiSeg2DEdit::PreparePreviewInteraction(QString method)
{
//std::cout << "========== sv4guiSeg2DEdit::PreparePreviewInteraction ========== " << std::endl;

// Create Data Node to show threshold contour.
m_PreviewContourModel = sv4guiContourModel::New();
m_PreviewDataNode = mitk::DataNode::New();
Expand Down Expand Up @@ -1956,7 +2013,6 @@ void sv4guiSeg2DEdit::segTabSelected(){
*/
void sv4guiSeg2DEdit::initialize()
{
std::cout << "========== sv4guiSeg2DEdit::initialize ==========" << std::endl;
bool ml_init;
GetDataStorage()->GetNamedNode("Segmentations")->GetBoolProperty("ml_init",ml_init);

Expand All @@ -1974,7 +2030,6 @@ void sv4guiSeg2DEdit::initialize()

std::string projPath;
projFolderNode->GetStringProperty("project path", projPath);
std::cout << "[initialize] projPath: " << projPath << std::endl;
mitk::DataNode::Pointer imageNode;

auto rs = GetDataStorage()->GetDerivations(projFolderNode,mitk::NodePredicateDataType::New("sv4guiImageFolder"));
Expand All @@ -1987,12 +2042,10 @@ void sv4guiSeg2DEdit::initialize()
}

if (imageNode.IsNull()) {
std::cout << "[initialize] imageNode is nullptr " << std::endl;
return;
}

if (imageNode->GetStringProperty("image_absolute_file_name", m_imageFilePath)) {
std::cout << "[initialize] image_absolute_file_name: " << m_imageFilePath << std::endl;
}

ml_utils = sv4gui_MachineLearningUtils::getInstance("googlenet_c30_train300k_aug10_clean");
Expand Down Expand Up @@ -2032,7 +2085,7 @@ void sv4guiSeg2DEdit::updatePaths(){
return ;
}

auto rs = dss->GetDerivations(path_folder_node);
auto rs = dss->GetDerivations(path_folder_node);

if (rs->size() == 0){
std::cout << "No paths found\n";
Expand Down Expand Up @@ -2104,7 +2157,6 @@ void sv4guiSeg2DEdit::segmentPaths(){
}

m_selected_paths.push_back(name);
std::cout << "selected " << name << "\n";
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,9 @@ public slots:

virtual void Hidden() override;

void EnableGuiControls(bool enable);
void ShowNoImageDataWarning();

// bool IsExclusiveFunctionality() const override;

void PreparePreviewInteraction(QString method);
Expand Down Expand Up @@ -317,6 +320,8 @@ public slots:

bool m_MachineLearninginitialized = false;

bool m_HasImageData = true;
bool m_NoImageDataWarningShown = false;
};

#endif // SV4GUI_SEG2DEDIT_H
Original file line number Diff line number Diff line change
Expand Up @@ -735,7 +735,6 @@ Dmg_get_path(PyObject* self, PyObject* args)
if (!PyArg_ParseTuple(args, api.format, &pathName)) {
return api.argsError();
}
std::cout << "[Dmg_get_path] Path name: " << pathName << std::endl;

// Get the Data Storage node.
auto dataStorage = GetDataStorage(api);
Expand All @@ -759,13 +758,11 @@ Dmg_get_path(PyObject* self, PyObject* args)
return nullptr;
}

std::cout << "[Dmg_get_path] Get path from node ... " << std::endl;
auto path = dynamic_cast<sv4guiPath*>(node->GetData());
if (path == nullptr) {
api.error("The Path node '" + std::string(pathName) + "' does not have data.");
return nullptr;
}
std::cout << "[Dmg_get_path] Path: "<< path << std::endl;

// Create a copy of the path.
auto pathElem = path->GetPathElement();
Expand Down Expand Up @@ -903,11 +900,9 @@ Dmg_add_segmentation(PyObject* self, PyObject* args, PyObject* kwargs)
}

// Get the Segmentation node.
std::cout << "##### GetToolNode" << std::endl;
auto segNode = GetToolNode(dataStorage, projFolderNode, SvDataManagerNodes::Segmentation);

// Get a list of segmentation objects.
std::cout << "##### Get a list of segmentation objects" << std::endl;
int numSegmentations = PyList_Size(segList);
std::vector<PySegmentation*> segmentations;
for (int i = 0; i < numSegmentations; i++) {
Expand All @@ -916,7 +911,6 @@ Dmg_add_segmentation(PyObject* self, PyObject* args, PyObject* kwargs)
}

// Add the segmentation data node.
std::cout << "##### AddSegmentationDataNode " << std::endl;
if (AddSegmentationDataNode(dataStorage, segmentations, segNode, segName, pathName, path) == SV_ERROR) {
api.error("Error adding the segmentation data node '" + std::string(segName) + "' to the parent node '" +
segNode->GetName() + "'.");
Expand Down Expand Up @@ -1119,14 +1113,11 @@ Dmg_add_model(PyObject* self, PyObject* args, PyObject* kwargs)
int time = 0;
auto solidModelElement = model->GetModelElement(time);
int numFaces = solidModelElement->GetFaceNumber();
std::cout << "[add_model] numFaces: " << numFaces << std::endl;

auto mepd = dynamic_cast<sv4guiModelElementPolyData*>(solidModelElement);
double angle = 30.0;
bool success = mepd->ExtractFaces(angle);
numFaces = solidModelElement->GetFaceNumber();
std::cout << "[add_model] numFaces: " << numFaces << std::endl;


return SV_PYTHON_OK;
}
Expand Down

0 comments on commit 60094d1

Please sign in to comment.