#include "ROIController.h" #include "ROI.h" #include #include"HRegion.h" ROIController::ROIController() { roiSeed = NULL; activeROIidx = -1; deletedIdx = -1; currX = currY = -1; qRegisterMetaType("ViewMessage"); viewController = nullptr; } ROIController::~ROIController() { if(roiSeed!=NULL) { delete roiSeed; roiSeed=NULL; } } void ROIController::setViewController(QHalconWindow *view) { viewController = view; } ROI *ROIController::getActiveROI() { if (activeROIidx != -1) { return ROIList[activeROIidx]; } return NULL; } void ROIController::setROIShape(ROI *r) { if(roiSeed!=NULL) { delete roiSeed; roiSeed=NULL; } activeROIidx = -1; roiSeed = r; roiSeed->setOperatorFlag(stateROIOperation); } void ROIController::setROIShapeNoOperator(ROI *r) { if(roiSeed!=NULL) { delete roiSeed; roiSeed=NULL; } activeROIidx = -1; roiSeed = r; roiSeed->setOperatorFlag(ROIOperation::None); for (int i = 0; i < ROIList.count(); i++) { if (ROIList[i]->getOperatorFlag() == ROIOperation::None) { ROI *roiTmp=ROIList[i]; ROIList.removeAt(i); delete roiTmp; } } } void ROIController::setROISign(ROIOperation mode) { //stateROIOperation = mode; if (activeROIidx != -1) { ROIList[activeROIidx]->setOperatorFlag(mode); viewController->refresh(); //淇″?锋Ы瑙﹀?? emit ROIChange(ViewMessage::ChangedROISign); } } void ROIController::setActiveROIidx(const int &index) { activeROIidx = index; // ViewMessage sign=ViewMessage::UpdateROI; emit ROIChange(ViewMessage::UpdateROI); } void ROIController::removeActive() { if (activeROIidx != -1) { ROI* roiTmp = ROIList[activeROIidx]; //delete roiTmp; ROIList.removeAt(activeROIidx); delete roiTmp; deletedIdx = activeROIidx; activeROIidx = -1; viewController->refresh(); emit ROIChange(ViewMessage::DeletedActROI); //TiggerROINotifyEvent(new ViewEventArgs(ViewMessage.DeletedActROI)); } } bool ROIController::defineModelROI() { using namespace HalconCpp; HRegion tmpAdd, tmpDiff, tmp; //double row, col; if (stateROIOperation == ROIOperation::None) return true; tmpAdd.GenEmptyRegion(); tmpDiff.GenEmptyRegion(); modelROI.GenEmptyRegion(); for (int i = 0; i < ROIList.count(); i++) { switch (ROIList[i]->getOperatorFlag()) { case ROIOperation::Positive: tmp = (ROIList[i]->getRegion()); tmpAdd = (tmp.Union2( tmpAdd)); break; case ROIOperation::Negative: tmp = (ROIList[i]->getRegion()); tmpDiff = (tmp.Union2( tmpDiff)); break; default: break; }//end of switch }//end of for if (tmpAdd.IsInitialized()&& tmpAdd.Area() > 0) { tmp = (tmpAdd.Difference(tmpDiff)); if (tmp.Area() > 0) modelROI = tmp; } //in case the set of positiv and negative ROIs dissolve if (modelROI.IsInitialized()==false || ROIList.count() == 0) return false; return true; } void ROIController::reset() { for (int i = 0; i < ROIList.count(); i++) { delete ROIList[i]; } ROIList.clear(); activeROIidx = -1; modelROI.GenEmptyRegion(); roiSeed = NULL; viewController->refresh(); emit ROIChange(ViewMessage::DelectedAllROIs); // TiggerROINotifyEvent(new ViewEventArgs(ViewMessage.DelectedAllROIs)); } void ROIController::paintData(const HTuple &winID,int handleWidth, double zoomWndFactor) { SetDraw(winID, "margin"); SetLineWidth(winID, 1); if (ROIList.count() > 0) { SetColor(winID, inactiveCol); SetDraw(winID, "margin"); for (int i = 0; i < ROIList.count(); i++) { SetLineStyle(winID, ROIList[i]->getFlagLineStyle()); if (ROIList[i]->getOperatorFlag() == ROIOperation::None) { SetColor(winID, serachRegionCol); } else { SetColor(winID, inactiveCol); } ROIList[i]->setHandleWidth(handleWidth); ROIList[i]->drawROI(winID, zoomWndFactor); } if (activeROIidx != -1) { SetColor(winID, activeCol); SetLineStyle(winID, ROIList[activeROIidx]->getFlagLineStyle()); ROIList[activeROIidx]->drawROI(winID, zoomWndFactor); SetColor(winID, activeHdlCol); ROIList[activeROIidx]->displayActive(winID, zoomWndFactor); } SetLineStyle(winID, HTuple()); } } int ROIController::mouseDownAction(const double &imgX, const double &imgY) { int idxROI = -1; double max = 10000, dist = 0; double epsilon = 35.0; // if (roiSeed != Q_NULLPTR) //either a new ROI object is created { roiSeed->createROI(imgX, imgY); ROIList.append(roiSeed); roiSeed = Q_NULLPTR; activeROIidx = ROIList.count() - 1; viewController->refresh(); emit ROIChange(ViewMessage::CreatedROI); // TiggerROINotifyEvent(new ViewEventArgs(ViewMessage.CreatedROI)); } else if (ROIList.count() > 0) // ... or an existing one is manipulated { activeROIidx = -1; for (int i = 0; i < ROIList.count(); i++) { dist = ROIList[i]->distToClosestHandle(imgX, imgY); if ((dist < max) && (dist < epsilon)) { max = dist; idxROI = i; } }//end of for if (idxROI >= 0) { activeROIidx = idxROI; emit ROIChange(ViewMessage::ActivatedROI); // TiggerROINotifyEvent(new ViewEventArgs(ViewMessage.ActivatedROI)); } viewController->refresh(); } return activeROIidx; } void ROIController::mouseMoveAction(const double &newX, const double &newY) { if ((newX == currX) && (newY == currY)) return; ROIList[activeROIidx]->moveByHandle(newX, newY); viewController->refresh(); currX = newX; currY = newY; emit ROIChange(ViewMessage::MovingROI); // TiggerROINotifyEvent(new ViewEventArgs(ViewMessage.MovingROI)); } void ROIController::tiggerROINotifySignals(const ViewMessage &sign) { emit ROIChange(sign); } QCursor ROIController::GetCursor() { if(activeROIidx==-1) { return Qt::ArrowCursor; } return ROIList[activeROIidx]->showByHandle(); } void ROIController::save(QDataStream& ar) { //roi保存 int size = ROIList.size(); ar << (int)size; for (int i = 0; i < ROIList.size(); i++) { ROI* roiTmp = ROIList[i]; ar << (*roiTmp); } } void ROIController::load(QDataStream& ar) { //清理旧的数据 reset(); int count0 = 0; ROI* ptr0 = NULL; ar >> count0; for (int i = 0; i < count0; ++i) { ar >> &ptr0; if (ptr0 != NULL) { ROIList.append(ptr0); } } }