void PixelInfoListCtrl::OnFinishEditing( wxCommandEvent& event ) { LayerCollectionManager* lcm = MainWindow::GetMainWindowPointer()->GetLayerCollectionManager(); LayerCollection* lc = MainWindow::GetMainWindowPointer()->GetLayerCollection( "MRI" ); // see if entered text is valid wxArrayString sa = MyUtils::SplitString( m_textEditor->GetValue(), _(",") ); long ptr = m_listPtr[m_nRowEdited]; Layer* layer_ptr = (Layer*)ptr; if ( ptr == 1 || ( layer_ptr && layer_ptr->IsTypeOf( "MRI" ) ) ) { if ( sa.Count() < 3 ) sa = MyUtils::SplitString( m_textEditor->GetValue(), _(" ") ); if ( sa.Count() < 3 ) { cerr << "Invalid coordinate string. Make sure they are three numbers." << endl; return; } } if ( ptr == 1 ) // RAS { double ras[3]; if ( sa[0].ToDouble( ras ) && sa[1].ToDouble( ras+1 ) && sa[2].ToDouble( ras+2 ) ) { wxListItem item; GetColumn( 0, item ); LayerMRI* layer = (LayerMRI*)lc->GetLayer( 0 ); if ( layer ) layer->RASToTarget( ras, ras ); if ( item.GetText() == _("Cursor") ) { lc->SetCursorRASPosition( ras ); lcm->SetSlicePosition( ras ); } else if ( item.GetText() == _("Mouse") ) lc->SetCurrentRASPosition( ras ); UpdateList(); m_textEditor->Hide(); } else { cerr << "Invalid coordinate string. Make sure they are three numbers." << endl; } } else if ( layer_ptr && layer_ptr->IsTypeOf( "MRI" ) ) // voxel { long x, y, z; if ( sa.Count() < 3 ) { cerr << "Invalid voxel coordinate string. Make sure they are three numbers." << endl; return; } int n = sa[0].Find( wxChar('['), true ); if ( n != wxNOT_FOUND ) sa[0] = sa[0].Mid( n+1 ); n = sa[2].Find( wxChar(']') ); if ( n != wxNOT_FOUND ) sa[2] = sa[2].Left( n ); if ( sa[0].ToLong( &x ) && sa[1].ToLong( &y ) && sa[2].ToLong( &z ) ) { int nv[3] = { x, y, z }; double ras[3]; wxListItem item; GetColumn( 0, item ); LayerMRI* layer = (LayerMRI*)layer_ptr; layer->OriginalIndexToRAS( nv, ras ); layer->RASToTarget( ras, ras ); if ( item.GetText() == _("Cursor") ) { lc->SetCursorRASPosition( ras ); lcm->SetSlicePosition( ras ); } else if ( item.GetText() == _("Mouse") ) lc->SetCurrentRASPosition( ras ); UpdateList(); m_textEditor->Hide(); } else { cerr << "Invalid voxel coordinate string. Make sure they are three numbers." << endl; } } else if ( layer_ptr && layer_ptr->IsTypeOf( "Surface" ) ) // surface { wxString strg = m_textEditor->GetValue(); LayerSurface* layer = (LayerSurface*)layer_ptr; double ras[3]; bool bSuccess = false; if ( m_listValue[m_nRowEdited].Find( _("Coord") ) == 0 ) // coordinate item { sa = MyUtils::SplitString( strg, _(",") ); if ( sa.Count() < 3 ) sa = MyUtils::SplitString( m_textEditor->GetValue(), _(" ") ); if ( sa.Count() >= 3 && sa[0].ToDouble( ras ) && sa[1].ToDouble( ras+1 ) && sa[2].ToDouble( ras+2 ) ) { layer->GetTargetAtSurfaceRAS( ras, ras ); bSuccess = true; } } else // vertex index item { long nIndex; if ( strg.ToLong( &nIndex ) && layer->GetTargetAtVertex( nIndex, ras ) ) bSuccess = true; } if ( bSuccess ) { wxListItem item; GetColumn( 0, item ); if ( item.GetText() == _("Cursor") ) { lc->SetCursorRASPosition( ras ); lcm->SetSlicePosition( ras ); } else if ( item.GetText() == _("Mouse") ) lc->SetCurrentRASPosition( ras ); UpdateList(); m_textEditor->Hide(); } else cerr << "Invalid index or coordinate string." << endl; } }
void InfoTreeWidget::OnEditFinished() { if (!m_itemEdited) { return; } QStringList list = m_editor->text().trimmed().split(",", QString::SkipEmptyParts); QVariantMap map = m_itemEdited->data(1, Qt::UserRole).toMap(); if ( list.size() < 3) { list = m_editor->text().trimmed().split(" ", QString::SkipEmptyParts); } QString type = map["Type"].toString(); double ras[3]; bool bSuccess = false; QObject* layer = map["Object"].value<QObject*>(); if ( type == "SurfaceVertex") { bool bOK; int nVertex = list[0].toInt(&bOK); if (bOK && qobject_cast<LayerSurface*>(layer)->GetTargetAtVertex(nVertex, ras)) { bSuccess = true; } else { std::cerr << "Error: Invalid input"; } } else { if ( list.size() < 3 ) { std::cerr << "Error: Need to enter 3 numbers."; } else { bool bOK; ras[0] = list[0].toDouble(&bOK); ras[1] = list[1].toDouble(&bOK); ras[2] = list[2].toDouble(&bOK); if (bOK) { if (type == "RAS") { LayerMRI* mri = (LayerMRI*)MainWindow::GetMainWindow()->GetLayerCollection("MRI")->GetLayer( 0 ); if ( mri ) { mri->RASToTarget( ras, ras ); } } else if (type == "MRI") { LayerMRI* mri = qobject_cast<LayerMRI*>(layer); int nv[3] = {(int)ras[0], (int)ras[1], (int)ras[2]}; mri->OriginalIndexToRAS( nv, ras ); mri->RASToTarget( ras, ras ); } else if (type == "SurfaceRAS") { qobject_cast<LayerSurface*>(layer)->GetTargetAtSurfaceRAS( ras, ras ); } bSuccess = true; } else { std::cerr << "Error: Invalid input"; } } } if (bSuccess) { m_editor->hide(); emit RASChangeTriggered(ras[0], ras[1], ras[2]); } }