123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309 |
- #include "ROIController.h"
- #include "ROI.h"
- #include<QDebug>
- #include"HRegion.h"
- ROIController::ROIController()
- {
- roiSeed = NULL;
- activeROIidx = -1;
- deletedIdx = -1;
- currX = currY = -1;
- qRegisterMetaType<ViewMessage>("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);
- }
- }
- }
|