void RegistrationImplService::writePreLandmarkRegistration(QString name, LandmarkMap landmarks) { QStringList lm; for (LandmarkMap::iterator iter=landmarks.begin(); iter!=landmarks.end(); ++iter) { lm << mPatientModelService->getLandmarkProperties()[iter->second.getUid()].getName(); } QString msg = QString("Preparing to register [%1] containing the landmarks: [%2]").arg(name).arg(lm.join(",")); report(msg); }
/**Inspect the landmarks in data a and b, find landmarks defined in both of them and * that also is active. * Return the uids of these landmarks. */ std::vector<QString> RegistrationImplService::getUsableLandmarks(const LandmarkMap& data_a, const LandmarkMap& data_b) { std::vector<QString> retval; std::map<QString, LandmarkProperty> props = mPatientModelService->getLandmarkProperties(); std::map<QString, LandmarkProperty>::iterator iter; for (iter=props.begin(); iter!=props.end(); ++iter) { QString uid = iter->first; if (data_a.count(uid) && data_b.count(uid) && iter->second.getActive()) retval.push_back(uid); } return retval; }
std::vector<Landmark> LandmarkRegistrationWidget::getAllLandmarks() const { std::vector<Landmark> retval; LandmarkMap targetData = this->getTargetLandmarks(); std::map<QString, LandmarkProperty> dataData = mServices->patient()->getLandmarkProperties(); std::map<QString, LandmarkProperty>::iterator iter; for (iter = dataData.begin(); iter != dataData.end(); ++iter) { if (targetData.count(iter->first)) retval.push_back(targetData[iter->first]); else retval.push_back(Landmark(iter->first)); } std::sort(retval.begin(), retval.end()); return retval; }
/**Convert the landmarks given by uids to vtk points. * The coordinates are given by the input data, * and should be transformed by M. * * Prerequisite: all uids exist in data. */ vtkPointsPtr RegistrationImplService::convertTovtkPoints(const std::vector<QString>& uids, const LandmarkMap& data, Transform3D M) { vtkPointsPtr retval = vtkPointsPtr::New(); for (unsigned i=0; i<uids.size(); ++i) { QString uid = uids[i]; Vector3D p = M.coord(data.find(uid)->second.getCoord()); retval->InsertNextPoint(p.begin()); } return retval; }
std::vector<Vector3D> RegistrationImplService::convertAndTransformToPoints(const std::vector<QString>& uids, const LandmarkMap& data, Transform3D M) { std::vector<Vector3D> retval; for (unsigned i=0; i<uids.size(); ++i) { QString uid = uids[i]; Vector3D p = M.coord(data.find(uid)->second.getCoord()); retval.push_back(p); } return retval; }
void LandmarkRegistrationWidget::cellClickedSlot(int row, int column) { if (row < 0 || column < 0) return; if (!mLandmarkTableWidget) reportDebug("mLandmarkTableWidget is null"); mActiveLandmark = mLandmarkTableWidget->item(row, column)->data(Qt::UserRole).toString(); LandmarkMap targetData = this->getTargetLandmarks(); if (targetData.count(mActiveLandmark)) { Vector3D p_d = targetData[mActiveLandmark].getCoord(); Vector3D p_r = this->getTargetTransform().coord(p_d); Vector3D p_pr = mServices->patient()->get_rMpr().coord(p_r); this->setManualToolPosition(p_r); } }
void LandmarkRegistrationWidget::prePaintEvent() { mLandmarkTableWidget->blockSignals(true); mLandmarkTableWidget->clear(); QString fixedName; DataPtr fixedData = boost::dynamic_pointer_cast<Data>(mServices->registration()->getFixedData()); if (fixedData) fixedName = fixedData->getName(); std::vector<Landmark> landmarks = this->getAllLandmarks(); LandmarkMap targetData = this->getTargetLandmarks(); Transform3D rMtarget = this->getTargetTransform(); //ready the table widget mLandmarkTableWidget->setRowCount((int)landmarks.size()); mLandmarkTableWidget->setColumnCount(4); QStringList headerItems(QStringList() << "Name" << "Status" << "Coordinates" << "Accuracy (mm)"); mLandmarkTableWidget->setHorizontalHeaderLabels(headerItems); mLandmarkTableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents); mLandmarkTableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); for (unsigned i = 0; i < landmarks.size(); ++i) { std::vector<QTableWidgetItem*> items(4); // name, status, coordinates, accuracy LandmarkProperty prop = mServices->patient()->getLandmarkProperties()[landmarks[i].getUid()]; Vector3D coord = landmarks[i].getCoord(); coord = rMtarget.coord(coord); // display coordinates in space r (in principle, this means all coords should be equal) items[0] = new QTableWidgetItem(qstring_cast(prop.getName())); items[0]->setToolTip(QString("Landmark name. Double-click to rename.")); items[1] = new QTableWidgetItem; if (prop.getActive()) items[1]->setCheckState(Qt::Checked); else items[1]->setCheckState(Qt::Unchecked); items[1]->setToolTip(QString("Check to use landmark in current registration.")); QString coordText = "Not sampled"; if (targetData.count(prop.getUid())) { int width = 5; int prec = 1; coordText = tr("(%1, %2, %3)").arg(coord[0], width, 'f', prec).arg(coord[1], width, 'f', prec).arg( coord[2], width, 'f', prec); } items[2] = new QTableWidgetItem(coordText); items[2]->setToolTip(QString("Landmark coordinates of target [%1] in reference space.").arg(this->getTargetName())); items[3] = new QTableWidgetItem(tr("%1").arg(this->getAccuracy(landmarks[i].getUid()))); items[3]->setToolTip(QString("Distance from target [%1] to fixed [%2].").arg(this->getTargetName()).arg(fixedName)); for (unsigned j = 0; j < items.size(); ++j) { items[j]->setData(Qt::UserRole, qstring_cast(prop.getUid())); mLandmarkTableWidget->setItem(i, j, items[j]); } //highlight selected row if (prop.getUid() == mActiveLandmark) { mLandmarkTableWidget->setCurrentItem(items[2]); } } this->updateAverageAccuracyLabel(); mLandmarkTableWidget->blockSignals(false); }