You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
newValue/src/lpMain/algela/AwesomeImgViewer.cpp

797 lines
23 KiB
C++

/*!
* \file AwesomeImgViewer.cpp
* \date 2018/06/26
*
* \author Lin, Chi
* Contact: lin.chi@hzleaper.com
*
*
* \note
*/
#include "AwesomeImgViewer.h"
#include "AwesomeRoi.h"
#include "qtUtils.h"
#include <QScrollBar>
#include <QMouseEvent>
#include <QApplication>
AwesomeImgViewer::AwesomeImgViewer(QWidget* parent)
: lpImgViewer(parent), mOpState(Reserved), mRoiCounter(0), mRestrictMode(false), mHasImg(false),
mpMaskImgItem(nullptr), mpMaskImg(nullptr)
{
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setRenderHint(QPainter::HighQualityAntialiasing);
}
QGraphicsPixmapItem* AwesomeImgViewer::setImg(QImage& img)
{
QGraphicsPixmapItem* ret = lpImgViewer::setImg(img);
mHasImg = true;
mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, true);
refreshSenseRng();
// refresh restrict area
if (mRestrictMode) {
for(QMap<QString, AwesomeRoiBase*>::iterator it = mMapRoiItems.begin();it!=mMapRoiItems.end();++it)
{
(*it)->setRestricArea(mpImgItem->boundingRect().adjusted(1, 1, -1, -1));
}
}
return ret;
}
QGraphicsPixmapItem* AwesomeImgViewer::setMaskImg(QImage& maskImg)
{
if (mpMaskImg)
delete mpMaskImg;
mpMaskImg = new QImage(maskImg);
if (!mpMaskImgItem)
mpMaskImgItem = scene()->addPixmap(QPixmap::fromImage(maskImg, Qt::NoFormatConversion));
else
mpMaskImgItem->setPixmap(QPixmap::fromImage(maskImg, Qt::NoFormatConversion));
mpMaskImgItem->setParentItem(mpImgItem);
mpMaskImgItem->setOffset(mpImgItem->offset());
return mpMaskImgItem;
}
void AwesomeImgViewer::addRectRoi(
const QPointF& pos,
const QSizeF& size,
double angle,
const QString& label,
const QColor& color,
const QColor& activeColor)
{
QPointF offset = mpImgItem ? mpImgItem->offset() : QPointF();
AwesomeRectRoi* rectRoi = new AwesomeRectRoi(&mCommonProps, QSizeF(abs(size.width()), abs(size.height())), mpImgItem);
if (size.width() < 0 || size.height() < 0)
rectRoi->setRoiSift(true);
rectRoi->setPos(pos + offset);
addRoiCommon(rectRoi, label, color, activeColor);
rectRoi->getGraphicsItem()->setRotation(angle); // should be the last one
//rectRoi->setRoiPicked(false);
}
void AwesomeImgViewer::addAffineRoi(const QPointF& tl, const QPointF& tr, const QPointF& br, const QPointF& bl,
const QString& label, const QColor& color, const QColor& activeColor)
{
AffineRect ar = {tl, tr, br, bl};
AwesomeAffineRoi* affineRoi = new AwesomeAffineRoi(&mCommonProps, ar, mpImgItem);
addRoiCommon(affineRoi, label, color, activeColor);
}
void AwesomeImgViewer::addPointRoi(const QPointF& pos, double r, double angle,
const QString& label, const QColor& color, const QColor& activeColor)
{
AwesomePointRoi* pointRoi = new AwesomePointRoi(&mCommonProps, abs(r), mpImgItem);
if (r < 0) pointRoi->setRoiSift(true);
pointRoi->setPos(pos);
if (angle != DBL_MAX)
pointRoi->setAngle(angle);
addRoiCommon(pointRoi, label, color, activeColor);
}
void AwesomeImgViewer::mousePressEvent(QMouseEvent* e)
{
setCursor(Qt::PointingHandCursor);
{
if (mOpState == Reserved && mHasImg) {
QPoint curpos = (mpImgItem->mapFromScene(this->mapToScene(e->pos())) +
QPointF(mImgOriSize.width() / 2.0, mImgOriSize.height() / 2.0) + QPointF(-0.5, -0.5)).toPoint();
if (curpos.x() >= 0 && curpos.x() < mImgOriSize.width() && curpos.y() >= 0 && curpos.y() < mImgOriSize.height()) {
// report pixel clicked when it's inside the image
emit pixelClicked(curpos);
}
}
}
if (mOpState == Prepared) {
addMousePos2AddingPnt(e, 0);
mOpState = Adding;
clearSelection();
}
else if (mOpState == Picking && mHasImg) {
QPoint curpos = (mpImgItem->mapFromScene(this->mapToScene(e->pos())) +
QPointF(mImgOriSize.width() / 2.0, mImgOriSize.height() / 2.0) + QPointF(-0.5, -0.5)).toPoint();
if (curpos.x() >= 0 && curpos.x() < mImgOriSize.width() && curpos.y() >= 0 && curpos.y() < mImgOriSize.height()) {
// report pixel clicked when it's inside the image
emit pixelClicked(curpos);
}
}
else {
// clear selection if click on empty place
QPointF mpos = getMousePos(e);
bool doClear = true;
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QGraphicsItem* pItem = (*roiItem)->getGraphicsItem();
if ((*roiItem)->senseRect().contains(pItem->mapFromParent(mpos))) {
doClear = false;
if (mCommonProps.siftMode) {
setCursor(Qt::PointingHandCursor);
mCommonProps.isSifting = (*roiItem)->isRoiPicked() ? -1 : 1;
(*roiItem)->setRoiPicked(!(*roiItem)->isRoiPicked());
}
break;
}
}
if (doClear)
clearSelection();
lpImgViewer::mousePressEvent(e);
}
}
void AwesomeImgViewer::mouseMoveEvent(QMouseEvent* e)
{
if (mOpState == Adding) {
addMousePos2AddingPnt(e, 1);
}
else if (mCommonProps.isSifting != 0) {
QPointF mpos = getMousePos(e);
bool doPicked = mCommonProps.isSifting > 0;
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QGraphicsItem* gItem = (*roiItem)->getGraphicsItem();
if ((*roiItem)->isRoiPicked() != doPicked && gItem->boundingRect().contains(gItem->mapFromParent(mpos))) {
(*roiItem)->setRoiPicked(doPicked);
}
}
}
else {
lpImgViewer::mouseMoveEvent(e);
}
}
void AwesomeImgViewer::mouseReleaseEvent(QMouseEvent* e)
{
if (mOpState == Adding) {
addMousePos2AddingPnt(e, 1);
if (mAddingType == AwsRoiRect)
addRectRoi((mAddingPnts[0] + mAddingPnts[1]) / 2,
QSizeF(abs(mAddingPnts[0].x() - mAddingPnts[1].x()), abs(mAddingPnts[0].y() - mAddingPnts[1].y())));
else if (mAddingType == AwsRoiAffine) {
qreal l = std::min<qreal>(mAddingPnts[0].x(), mAddingPnts[1].x());
qreal r = std::max<qreal>(mAddingPnts[0].x(), mAddingPnts[1].x());
qreal t = std::min<qreal>(mAddingPnts[0].y(), mAddingPnts[1].y());
qreal b = std::max<qreal>(mAddingPnts[0].y(), mAddingPnts[1].y());
addAffineRoi(QPointF(l, t), QPointF(r, t), QPointF(r, b), QPointF(l, b));
}
else if (mAddingType == AwsRoiPoint) {
QPointF away = getMousePos(e) - mAddingPnts.front();
if (abs(away.x()) + abs(away.y()) < 4) {
addPointRoi(mAddingPnts.front(), 2);
}
}
resetAdding();
}
else if (mCommonProps.isSifting != 0) {
setCursor(Qt::ArrowCursor);
mCommonProps.isSifting = 0;
}
else if (mOpState != Picking) {
setIsAddingRoi(false);
}
lpImgViewer::mouseReleaseEvent(e);
}
void AwesomeImgViewer::wheelEvent(QWheelEvent* e)
{
lpImgViewer::wheelEvent(e);
refreshSenseRng();
}
void AwesomeImgViewer::keyPressEvent(QKeyEvent* e)
{
if (e->key() == Qt::Key_A && e->modifiers() == Qt::ControlModifier) {
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->setRoiPicked(true);
}
}
else if (e->key() == Qt::Key_Delete) {
onBtnDeleteClicked();
}
else if (e->key() == Qt::Key_Insert) {
}
else if (e->key() == Qt::Key_Escape && mOpState != Reserved) {
resetAdding();
}
else {
lpImgViewer::keyPressEvent(e);
}
}
void AwesomeImgViewer::getAllRoiVertex(QVector<AwesomeRoiInfo>& allRoiInfo)
{
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
AwesomeRoiInfo* pRoiInfo = allRoiInfo.insert(allRoiInfo.end(), AwesomeRoiInfo());
getRoiInfo((*roiItem), *pRoiInfo);
}
}
void AwesomeImgViewer::getDetectVertex(AwesomeRoiInfo& detectRoiInfo)
{
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
if ((*roiItem)->objectName().contains("Detect"))
{
getRoiInfo((*roiItem), detectRoiInfo);
break;
}
}
}
void AwesomeImgViewer::getAllFilterVertex(QList<AwesomeRoiInfo>& allFilterRoiInfo)
{
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
if ((*roiItem)->objectName().contains("Detect"))
continue;
AwesomeRoiInfo roiInfo;
getRoiInfo((*roiItem), roiInfo);
allFilterRoiInfo.append(roiInfo);
}
}
QMap<QString, QVector<QPoint>> AwesomeImgViewer::getAllFilterVectorMap()
{
QMap<QString, QVector<QPoint>> rlt;
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QString strID = (*roiItem)->objectName();
if (strID.contains("Detect"))
continue;
AwesomeRoiInfo roiInfo;
getRoiInfo((*roiItem), roiInfo);
QVector<QPoint> polygon;
for (int i = 0; i < roiInfo.vertex.size(); i++) {
polygon.append(roiInfo.vertex.at(i).toPoint());
}
rlt.insert(strID, polygon);
}
return rlt;
}
QStringList AwesomeImgViewer::getAllSiftRois() const
{
QStringList allSiftRoiNames;
// foreach(AwesomeRoiBase* roiItem, mRoiItems) {
// if (roiItem->isRoiSift()) {
// allSiftRoiNames.append(roiItem->getLabel());
// }
// }
return allSiftRoiNames;
}
void AwesomeImgViewer::enableSingleDetectRoi(bool enable, const QPointF& centerpos, const QSizeF& size, qreal angle, const QString& label)
{
enableSingleMode(enable);//清除所有ROI
if (enable) {
if (centerpos.isNull() || size.isEmpty()) {
QPixmap img = mpImgItem->pixmap();
int w = std::max<int>(std::max<int>(100, img.width() / 5), std::max<int>(100, img.height() / 5));
addRectRoi(QPointF(w / 2. - 1, w / 2. - 1), QSizeF(w, w), angle, label, QColor(0, 200,0), QColor(0, 200, 111));
}
else {
addRectRoi(centerpos, size, angle, label, QColor(0, 200, 0), QColor(0, 200, 111));
}
}
m_detectRoiAngle = angle;
}
void AwesomeImgViewer::enableSingleAffineRoiMode(bool enable,
const QPointF& tl, const QPointF& tr, const QPointF& br, const QPointF& bl, const QString& label)
{
enableSingleMode(enable);
if (enable) {
QPixmap img = mpImgItem->pixmap();
qreal x = img.width() / 2., y = img.height() / 2.;
addAffineRoi(tl.isNull() ? QPointF(-x, -y) : tl, tr.isNull() ? QPointF(x, -y) : tr,
br.isNull() ? QPointF(x, y) : br, bl.isNull() ? QPointF(-x, y) : bl, label);
}
}
void AwesomeImgViewer::changeRoiRect(const QPointF& pos /*= QPointF()*/, const QSizeF& size /*= QSizeF()*/, const QString& label /*= ""*/)
{
for (QMap<QString, AwesomeRoiBase*>::iterator it = mMapRoiItems.begin(); it != mMapRoiItems.end(); ++it)
{
if (it.key().contains("Detect"))
{
((AwesomeRectRoi*)*it)->setPos(pos);
((AwesomeRectRoi*)*it)->setRealRect(QRectF(-size.width() / 2, -size.height() / 2, size.width(), size.height()));
break;
}
}
}
void AwesomeImgViewer::changeFilterRoiRect(const QPointF& pos /*= QPointF()*/, const QSizeF& size /*= QSizeF()*/, const QString& strName /*= ""*/)
{
for (QMap<QString, AwesomeRoiBase*>::iterator it = mMapRoiItems.begin(); it != mMapRoiItems.end(); ++it)
{
if (it.key() == strName)
{
((AwesomeRectRoi*)*it)->setPos(pos);
((AwesomeRectRoi*)*it)->setRealRect(QRectF(-size.width() / 2, -size.height() / 2, size.width(), size.height()));
break;
}
}
}
QStringList AwesomeImgViewer::getAllFilterNames()
{
QStringList filterNames;
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QString strObjName = (*roiItem)->objectName();
if (strObjName.contains("Detect"))
continue;
filterNames.append(strObjName);
}
return filterNames;
}
void AwesomeImgViewer::setFilterROISelect(QString strName)
{
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QString strN = (*roiItem)->objectName();
if(strName == strN)
(*roiItem)->setRoiPicked(true);
else
(*roiItem)->setRoiPicked(false);
}
}
void AwesomeImgViewer::changeRoiRectAngle(qreal angle /*= 0*/, const QString& label /*= ""*/)
{
for (QMap<QString, AwesomeRoiBase*>::iterator it = mMapRoiItems.begin(); it != mMapRoiItems.end(); ++it)
{
if (it.key().contains("Detect"))
{
((AwesomeRectRoi*)*it)->getGraphicsItem()->setRotation(angle);
m_detectRoiAngle = angle;
}
else {
((AwesomeRectRoi*)*it)->getGraphicsItem()->setRotation(angle);
}
}
}
void AwesomeImgViewer::enableSiftMode(bool enable)
{
mCommonProps.siftMode = enable;
if (mCommonProps.siftMode) {
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->getGraphicsItem()->setFlag(QGraphicsItem::ItemIsMovable, false);
}
}
}
void AwesomeImgViewer::enablePickMode(bool enable)
{
if (!mHasImg) return;
if (enable) {
mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, false);
static QPixmap pipettePixmap(":/cursor_pipette.png");
setCursor(QCursor(pipettePixmap, 4, 26));
mOpState = OpState::Picking;
}
else {
mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, true);
setCursor(Qt::ArrowCursor);
mOpState = OpState::Reserved;
}
}
void AwesomeImgViewer::setLabelVisible(bool visible)
{
if (visible) {
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->showLabel();
}
}
else {
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->hideLabel();
}
}
}
void AwesomeImgViewer::enableRoiCtrl(bool enable, const QList<AwesomeRoiType>& enableRoiTypes)
{
// ui->wgtRoiCtrl->setVisible(enable);
// mpCtrlBar->adjustSize();
// if (enableRoiTypes.size() > 0) {
// int c = ui->comboRoiType->count();
// for (int i = c - 1; i >= 0; --i) {
// int t = ui->comboRoiType->itemData(i).toInt();
// if (enableRoiTypes.indexOf(static_cast<AwesomeRoiType>(t)) < 0) {
// ui->comboRoiType->removeItem(i);
// }
// }
// }
}
void AwesomeImgViewer::clear()
{
lpImgViewer::clear();
mMapRoiItems.clear();
mAddingPnts.clear();
mAddingType = AwsRoiReserved;
// set null image to init the root image item
QImage img_root = QImage(":/imagena.png");
setImg(img_root);
mpAddingPath = new QGraphicsPathItem(mpImgItem);
mpAddingPath->setPen(QPen(QColor(20, 20, 20), 1, Qt::DashLine));
mHasImg = false;
mpImgItem->setFlag(QGraphicsItem::ItemIsMovable, false); // disable moving placeholder image
mpMaskImgItem = nullptr;
if (mpMaskImg) {
delete mpMaskImg;
mpMaskImg = nullptr;
}
}
void AwesomeImgViewer::onResetView()
{
scaleImg2(1.0);
setIsAutoResetTransform(true);
}
void AwesomeImgViewer::onSetScale(qreal val)
{
scaleImg2(1.0);
}
void AwesomeImgViewer::onClearAllROI()
{
enableSingleMode(true);
}
void AwesomeImgViewer::onAddFilterROI(const QPointF& pos /*= QPointF()*/, const QSizeF& size /*= QSizeF()*/, qreal angle /*= 0*/, const QString& label /*= ""*/)
{
angle = m_detectRoiAngle;
if (pos.isNull() || size.isEmpty()) {
QPixmap img = mpImgItem->pixmap();
int w = std::min<int>(std::max<int>(50, img.width()), std::max<int>(50, img.height()));
addRectRoi(QPointF(w / 2. - 1, w / 2. - 1), QSizeF(w, w), angle, label, QColor(230, 200, 0), QColor(230, 200, 111));
}
else {
addRectRoi(pos, size, angle, label, QColor(230, 200, 0), QColor(230, 200, 111));
}
}
void AwesomeImgViewer::onClearFilterROIs(const QString& label /*= "Filter"*/)
{
QStringList lstName;
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QString strName = (*roiItem)->objectName();
if (!strName.contains("Filter"))
continue;
scene()->removeItem((*roiItem)->getGraphicsItem());
delete (*roiItem);
lstName.append(strName);
}
foreach(QString var, lstName)
{
mMapRoiItems.remove(var);
}
}
void AwesomeImgViewer::onBtnAddClicked(bool isChecked)
{
// no add op in single roi mode
if (mCommonProps.singleRoiMode) return;
if (mCommonProps.siftMode) {
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
if ((*roiItem)->isRoiPicked()) {
(*roiItem)->setRoiSift(false);
(*roiItem)->setRoiPicked(false); // un-pick
(*roiItem)->setRoiActive(false); // un-active
}
}
}
else
{
// mAddingType = static_cast<AwesomeRoiType>(ui->comboRoiType->currentData().toInt());
// if (mAddingType <= AwsRoiReserved || mAddingType >= AwsRoiLast) return;
// setIsAddingRoi(isChecked);
}
}
void AwesomeImgViewer::onBtnDeleteClicked()
{
// no delete op in single roi mode
// if (mCommonProps.singleRoiMode || mCommonProps.siftMode) return;
//
// for (int i = mRoiItems.size() - 1; i >= 0; i--) {
// AwesomeRoiBase* roiItem = mRoiItems[i];
// if (roiItem->isRoiPicked()) {
// mRoiItems.remove(i);
// scene()->removeItem(roiItem->getGraphicsItem());
// delete roiItem;
// }
// }
// unsetCursor();
}
void AwesomeImgViewer::onBtnSubClicked(bool isChecked)
{
// no add op in single roi mode
// if (mCommonProps.singleRoiMode) return;
//
// if (mCommonProps.siftMode) {
// foreach(AwesomeRoiBase* roiItem, mRoiItems) {
// if (roiItem->isRoiPicked()) {
// roiItem->setRoiSift(true);
// roiItem->setRoiPicked(false); // un-pick
// roiItem->setRoiActive(false); // un-active
// }
// }
// }
}
void AwesomeImgViewer::onBtnHideRoiPressed()
{
// hide all roi
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->getGraphicsItem()->hide();
}
}
void AwesomeImgViewer::onBtnHideRoiReleased()
{
// show all roi
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->getGraphicsItem()->show();
}
}
void AwesomeImgViewer::onRoiSelected(bool isSelected)
{
if (isSelected && mCommonProps.isSifting == 0) {
Qt::KeyboardModifiers k = QApplication::queryKeyboardModifiers();
if (!k.testFlag(Qt::ShiftModifier) && !k.testFlag(Qt::ControlModifier)) {
// not multi-select, clear other selection
clearSelection(sender());
}
}
}
void AwesomeImgViewer::onRoiChanged()
{
AwesomeRoiInfo roiInfo;
AwesomeRoiBase* roiItem = qobject_cast<AwesomeRoiBase*>(sender());
if (roiItem&&roiItem->objectName().contains("Detect")) {
getRoiInfo(roiItem, roiInfo);
emit roiChanged(roiInfo);
}
else
{
getRoiInfo(roiItem, roiInfo);
QString strObj = roiItem->objectName();
emit filterroiChanged(roiInfo, strObj);
}
}
void AwesomeImgViewer::onRoiLockIng()
{
AwesomeRoiBase* roiItem = qobject_cast<AwesomeRoiBase*>(sender());
QString strName = roiItem->objectName();
emit roiLockIng(strName);
}
void AwesomeImgViewer::addRoiCommon(
AwesomeRoiBase* roiItem,
const QString& label,
const QColor& color,
const QColor& activeColor
)
{
if (color.isValid())
roiItem->setNormalColor(color);
else if (mDefaultColor.isValid())
roiItem->setNormalColor(mDefaultColor);
if (activeColor.isValid())
roiItem->setActiveColor(activeColor);
else if (mDefaultActiveColor.isValid())
roiItem->setActiveColor(mDefaultActiveColor);
mRoiCounter++;
if (label.isNull())
roiItem->setLabel(QString::number(mRoiCounter));
else
roiItem->setLabel(label);
QString strObjname = QString("%1").arg(label);
roiItem->setObjectName(strObjname);
if (mRestrictMode)
roiItem->setRestricArea(mpImgItem->boundingRect().adjusted(1, 1, -1, -1));
connect(roiItem, SIGNAL(toggledPick(bool)), this, SLOT(onRoiSelected(bool)));
connect(roiItem, SIGNAL(roiChanged()), this, SLOT(onRoiChanged()));
connect(roiItem, SIGNAL(roiLockIng()), this, SLOT(onRoiLockIng()));
mMapRoiItems.insert(strObjname, roiItem);
}
void AwesomeImgViewer::setIsAddingRoi(bool isAddingRoi)
{
mOpState = isAddingRoi ? Prepared : Reserved;
if (isAddingRoi)
{
setCursor(Qt::CrossCursor);
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QGraphicsItem* gItem = (*roiItem)->getGraphicsItem();
gItem->setEnabled(false);
}
}
else
{
setCursor(Qt::ArrowCursor);
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
QGraphicsItem* gItem = (*roiItem)->getGraphicsItem();
gItem->setEnabled(true);
}
}
}
QPointF AwesomeImgViewer::getMousePos(QMouseEvent* e)
{
if (mpImgItem)
return mpImgItem->mapFromScene(this->mapToScene(e->pos()));
return QPointF();
}
void AwesomeImgViewer::addMousePos2AddingPnt(QMouseEvent* e, int idx)
{
if (mAddingPnts.size() <= idx || idx == -1)
mAddingPnts.append(getMousePos(e));
else
mAddingPnts[idx] = getMousePos(e);
updateAddingPath();
}
void AwesomeImgViewer::updateAddingPath()
{
if (mAddingPnts.size() == 0)
mpAddingPath->setPath(QPainterPath());
else
{
QPainterPath p;
if ((mAddingType == AwsRoiRect || mAddingType == AwsRoiAffine) && mAddingPnts.size() >= 2) {
p.addRect(std::min<qreal>(mAddingPnts[0].x(), mAddingPnts[1].x()),
std::min<qreal>(mAddingPnts[0].y(), mAddingPnts[1].y()),
abs(mAddingPnts[0].x() - mAddingPnts[1].x()),
abs(mAddingPnts[0].y() - mAddingPnts[1].y()));
}
else if (mAddingType == AwsRoiPoint && mAddingPnts.size() >= 1) {
p.addEllipse(mAddingPnts.front(), 2, 2);
}
mpAddingPath->setPath(p);
}
}
void AwesomeImgViewer::resetAdding()
{
mOpState = Reserved;
mAddingPnts.clear();
updateAddingPath();
}
void AwesomeImgViewer::clearSelection(QObject* excludeObj)
{
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
if ((*roiItem) != excludeObj)
(*roiItem)->setRoiPicked(false);
}
}
void AwesomeImgViewer::getRoiOnImg(AwesomeRoiBase* roiItem, QList<QPointF>& roiOnImg)
{
const QList<QPointF>& pnts = roiItem->getVertex();
QGraphicsItem* gItem = roiItem->getGraphicsItem();
foreach(const QPointF& pnt, pnts) {
roiOnImg.append(gItem->mapToParent(pnt) - mpImgItem->offset()); // roi item's parent is the image.
}
}
void AwesomeImgViewer::getRoiInfo(AwesomeRoiBase* roiItem, AwesomeRoiInfo& roiInfo)
{
roiInfo.type = roiItem->getRoiType();
roiInfo.label = roiItem->getLabel();
getRoiOnImg(roiItem, roiInfo.vertex);
}
void AwesomeImgViewer::enableSingleMode(bool enable)
{
mCommonProps.singleRoiMode = enable;
if (enable) {
// delete all roi
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
scene()->removeItem((*roiItem)->getGraphicsItem());
delete (*roiItem);
}
mMapRoiItems.clear();
}
}
float AwesomeImgViewer::getSenseRng()
{
QPointF a = mapToScene(QPoint(0, 15));
QPointF b = mapToScene(QPoint(0, 0));
return abs(a.y() - b.y());
}
void AwesomeImgViewer::refreshSenseRng()
{
if (mpImgItem) {
mCommonProps.senseRng = getSenseRng();
mCommonProps.labelFont = QApplication::font();
QFontMetricsF metrics(mCommonProps.labelFont);
float factor = (mCommonProps.senseRng - 0.5) / metrics.height();
mCommonProps.labelFont.setPointSizeF(mCommonProps.labelFont.pointSizeF() * factor);
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->updateSenseRng();
}
}
}
void AwesomeImgViewer::setLockAll(bool bLock)
{
for (QMap<QString, AwesomeRoiBase*>::iterator roiItem = mMapRoiItems.begin(); roiItem != mMapRoiItems.end(); ++roiItem)
{
(*roiItem)->onSetLock(bLock);
}
}