pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/gui/building/MeasureItem.cc

134 lines
4.0 KiB
C++

/*
* Copyright (C) 2014 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <iomanip>
#include <sstream>
#include <ignition/math/Angle.hh>
#include "gazebo/gui/building/MeasureItem.hh"
#include "gazebo/gui/building/MeasureItemPrivate.hh"
using namespace gazebo;
using namespace gui;
/////////////////////////////////////////////////
MeasureItem::MeasureItem(const ignition::math::Vector2d &_start,
const ignition::math::Vector2d &_end)
: SegmentItem(), dataPtr(new MeasureItemPrivate())
{
this->editorType = "Measure";
this->setFlag(QGraphicsItem::ItemSendsGeometryChanges);
this->setAcceptHoverEvents(true);
this->SetLine(_start, _end);
this->zValueSelected = 8;
this->setZValue(this->zValueSelected);
this->ShowHandles(false);
this->dataPtr->value = 0;
}
/////////////////////////////////////////////////
MeasureItem::~MeasureItem()
{
}
/////////////////////////////////////////////////
void MeasureItem::paint(QPainter *_painter,
const QStyleOptionGraphicsItem */*_option*/, QWidget */*_widget*/)
{
QPointF p1 = this->line().p1();
QPointF p2 = this->line().p2();
double angle = IGN_DTOR(this->line().angle());
QPen measurePen;
measurePen.setStyle(Qt::SolidLine);
measurePen.setColor(QColor(247, 142, 30, 120));
double tipLength = 10;
measurePen.setWidth(3);
_painter->setPen(measurePen);
// Line
_painter->drawLine(this->line());
// End tips
_painter->drawLine(QPointF(p1.x()+tipLength*qCos(angle+M_PI/2.0),
p1.y()-tipLength*qSin(angle+M_PI/2.0)),
QPointF(p1.x()-tipLength*qCos(angle+M_PI/2.0),
p1.y()+tipLength*qSin(angle+M_PI/2.0)));
_painter->drawLine(QPointF(p2.x()+tipLength*qCos(angle+M_PI/2.0),
p2.y()-tipLength*qSin(angle+M_PI/2.0)),
QPointF(p2.x()-tipLength*qCos(angle+M_PI/2.0),
p2.y()+tipLength*qSin(angle+M_PI/2.0)));
// Value
std::ostringstream stream;
stream << std::fixed << std::setprecision(3)
<< this->dataPtr->value << " m";
double margin = 10;
float textWidth = _painter->fontMetrics().width(stream.str().c_str());
float textHeight = _painter->fontMetrics().height();
float posX = (p1.x()+p2.x())/2;
float posY = (p1.y()+p2.y())/2;
double textAngle = angle;
if (textAngle > M_PI)
textAngle = textAngle - M_PI;
if (textAngle > 0 && textAngle <= M_PI/2.0)
{
posX = (p1.x()+p2.x())/2 + margin*qCos(textAngle+M_PI/2.0)-textWidth;
posY = (p1.y()+p2.y())/2 - margin*qSin(textAngle+M_PI/2.0);
}
else if (textAngle > M_PI/2.0 && textAngle < M_PI)
{
posX = (p1.x()+p2.x())/2 + margin*qCos(textAngle-M_PI/2.0);
posY = (p1.y()+p2.y())/2 - margin*qSin(textAngle-M_PI/2.0);
}
else if (fabs(textAngle) < 0.01 || fabs(textAngle - M_PI) < 0.01)
{
posX = (p1.x()+p2.x())/2 - textWidth/2;
posY = (p1.y()+p2.y())/2 - margin;
}
measurePen.setColor(Qt::white);
measurePen.setWidth(textHeight*1.5);
_painter->setPen(measurePen);
_painter->drawLine(posX+textWidth*0.1, posY-textHeight*0.4,
posX+textWidth*0.9, posY-textHeight*0.4);
measurePen.setColor(QColor(247, 142, 30));
_painter->setPen(measurePen);
_painter->drawText(posX, posY, stream.str().c_str());
}
/////////////////////////////////////////////////
double MeasureItem::Distance() const
{
return this->line().length();
}
/////////////////////////////////////////////////
void MeasureItem::SetValue(double _value)
{
this->dataPtr->value = _value;
}