23 #define FONT_WORKAROUND_SCALE 10 //scale factor for upscaling fontsize and downscaling painter
26 #define M_DEG2RAD 0.0174532925
36 double angleRad = angle / 180.0 *
M_PI;
43 p1Rotated.
setX( p1.
x() * cos( angleRad ) + p1.
y() * -sin( angleRad ) );
44 p1Rotated.
setY( p1.
x() * sin( angleRad ) + p1.
y() * cos( angleRad ) );
45 p2Rotated.
setX( p2.
x() * cos( angleRad ) + p2.
y() * -sin( angleRad ) );
46 p2Rotated.
setY( p2.
x() * sin( angleRad ) + p2.
y() * cos( angleRad ) );
49 arrowHeadPoly << middlePoint;
50 arrowHeadPoly <<
QPointF( middlePoint.x() + p1Rotated.
x(), middlePoint.y() + p1Rotated.
y() );
51 arrowHeadPoly <<
QPointF( middlePoint.x() + p2Rotated.
x(), middlePoint.y() + p2Rotated.
y() );
58 arrowBrush.
setStyle( Qt::SolidPattern );
61 arrowBrush.
setStyle( Qt::SolidPattern );
69 double xDiff = p2.
x() - p1.
x();
70 double yDiff = p2.
y() - p1.
y();
71 double length = sqrt( xDiff * xDiff + yDiff * yDiff );
77 double angle = acos(( -yDiff * length ) / ( length * length ) ) * 180 /
M_PI;
80 return ( 360 - angle );
87 double rotToRad = angle *
M_PI / 180.0;
89 xRot = x * cos( rotToRad ) - y * sin( rotToRad );
90 yRot = x * sin( rotToRad ) + y * cos( rotToRad );
97 double clippedAngle =
angle;
98 if ( clippedAngle >= 360.0 || clippedAngle <= -360.0 )
100 clippedAngle = fmod( clippedAngle, 360.0 );
102 if ( clippedAngle < 0.0 )
104 clippedAngle += 360.0;
115 if ( clippedAngle >= 22.5 && clippedAngle < 67.5 )
119 else if ( clippedAngle >= 67.5 && clippedAngle < 112.5 )
123 else if ( clippedAngle >= 112.5 && clippedAngle < 157.5 )
127 else if ( clippedAngle >= 157.5 && clippedAngle < 202.5 )
131 else if ( clippedAngle >= 202.5 && clippedAngle < 247.5 )
135 else if ( clippedAngle >= 247.5 && clippedAngle < 292.5 )
139 else if ( clippedAngle >= 292.5 && clippedAngle < 337.5 )
151 double originalWidth = originalRect.
width();
152 double originalHeight = originalRect.
height();
153 double boundsWidth = boundsRect.
width();
154 double boundsHeight = boundsRect.
height();
155 double ratioBoundsRect = boundsWidth / boundsHeight;
160 if ( clippedRotation == 0 || clippedRotation == 90 || clippedRotation == 180 || clippedRotation == 270 )
163 if ( clippedRotation == 0 || clippedRotation == 180 )
165 rectScale = (( originalWidth / originalHeight ) > ratioBoundsRect ) ? boundsWidth / originalWidth : boundsHeight / originalHeight;
169 rectScale = (( originalHeight / originalWidth ) > ratioBoundsRect ) ? boundsWidth / originalHeight : boundsHeight / originalWidth;
171 double rectScaledWidth = rectScale * originalWidth;
172 double rectScaledHeight = rectScale * originalHeight;
174 if ( clippedRotation == 0 || clippedRotation == 180 )
176 return QRectF(( boundsWidth - rectScaledWidth ) / 2.0, ( boundsHeight - rectScaledHeight ) / 2.0, rectScaledWidth, rectScaledHeight );
180 return QRectF(( boundsWidth - rectScaledHeight ) / 2.0, ( boundsHeight - rectScaledWidth ) / 2.0, rectScaledWidth, rectScaledHeight );
185 double angleRad = -clippedRotation *
M_DEG2RAD;
186 double cosAngle = cos( angleRad );
187 double sinAngle = sin( angleRad );
190 double widthBoundsRotatedRect = originalWidth * fabs( cosAngle ) + originalHeight * fabs( sinAngle );
191 double heightBoundsRotatedRect = originalHeight * fabs( cosAngle ) + originalWidth * fabs( sinAngle );
195 double ratioBoundsRotatedRect = widthBoundsRotatedRect / heightBoundsRotatedRect;
196 double rectScale = ratioBoundsRotatedRect > ratioBoundsRect ? boundsWidth / widthBoundsRotatedRect : boundsHeight / heightBoundsRotatedRect;
197 double rectScaledWidth = rectScale * originalWidth;
198 double rectScaledHeight = rectScale * originalHeight;
202 double currentCornerX = 0;
204 currentCornerX += rectScaledWidth * cosAngle;
205 minX = minX < currentCornerX ? minX : currentCornerX;
206 currentCornerX += rectScaledHeight * sinAngle;
207 minX = minX < currentCornerX ? minX : currentCornerX;
208 currentCornerX -= rectScaledWidth * cosAngle;
209 minX = minX < currentCornerX ? minX : currentCornerX;
211 double currentCornerY = 0;
213 currentCornerY -= rectScaledWidth * sinAngle;
214 minY = minY < currentCornerY ? minY : currentCornerY;
215 currentCornerY += rectScaledHeight * cosAngle;
216 minY = minY < currentCornerY ? minY : currentCornerY;
217 currentCornerY += rectScaledWidth * sinAngle;
218 minY = minY < currentCornerY ? minY : currentCornerY;
221 double offsetX = ratioBoundsRotatedRect > ratioBoundsRect ? 0 : ( boundsWidth - rectScale * widthBoundsRotatedRect ) / 2.0;
222 offsetX += fabs( minX );
223 double offsetY = ratioBoundsRotatedRect > ratioBoundsRect ? ( boundsHeight - rectScale * heightBoundsRotatedRect ) / 2.0 : 0;
224 offsetY += fabs( minY );
226 return QRectF( offsetX, offsetY, rectScaledWidth, rectScaledHeight );
232 return ( pointSize * 0.3527 );
238 return ( mmSize / 0.3527 );
249 rectToResize.
setRect( left, top, right - left, bottom - top );
255 double m = ( afterMax - afterMin ) / ( beforeMax - beforeMin );
256 double c = afterMin - ( beforeMin * m );
259 return m * position + c;
264 if ( orientationString.
compare(
"Portrait", Qt::CaseInsensitive ) == 0 )
269 if ( orientationString.
compare(
"Landscape", Qt::CaseInsensitive ) == 0 )
286 presets << qMakePair(
QString(
"A0" ),
QSizeF( 841, 1189 ) );
291 presets << qMakePair(
QString(
"B1" ),
QSizeF( 707, 1000 ) );
292 presets << qMakePair(
QString(
"B0" ),
QSizeF( 1000, 1414 ) );
294 presets << qMakePair(
QString(
"Legal" ),
QSizeF( 215.9, 355.6 ) );
295 presets << qMakePair(
QString(
"Letter" ),
QSizeF( 215.9, 279.4 ) );
296 presets << qMakePair(
QString(
"ANSI A" ),
QSizeF( 215.9, 279.4 ) );
297 presets << qMakePair(
QString(
"ANSI B" ),
QSizeF( 279.4, 431.8 ) );
298 presets << qMakePair(
QString(
"ANSI C" ),
QSizeF( 431.8, 558.8 ) );
299 presets << qMakePair(
QString(
"ANSI D" ),
QSizeF( 558.8, 863.6 ) );
300 presets << qMakePair(
QString(
"ANSI E" ),
QSizeF( 863.6, 1117.6 ) );
301 presets << qMakePair(
QString(
"Arch A" ),
QSizeF( 228.6, 304.8 ) );
302 presets << qMakePair(
QString(
"Arch B" ),
QSizeF( 304.8, 457.2 ) );
303 presets << qMakePair(
QString(
"Arch C" ),
QSizeF( 457.2, 609.6 ) );
304 presets << qMakePair(
QString(
"Arch D" ),
QSizeF( 609.6, 914.4 ) );
305 presets << qMakePair(
QString(
"Arch E" ),
QSizeF( 914.4, 1219.2 ) );
306 presets << qMakePair(
QString(
"Arch E1" ),
QSizeF( 762, 1066.8 ) );
309 for ( ;presetIt != presets.
constEnd(); ++presetIt )
311 if ( presetString.
compare(( *presetIt ).first, Qt::CaseInsensitive ) == 0 )
313 width = ( *presetIt ).second.width();
314 height = ( *presetIt ).second.height();
324 for ( ; i != dataDefinedNames->
constEnd(); ++i )
328 if ( ddNodeList.
size() > 0 )
347 if ( it != dataDefinedProperties->
constEnd() )
355 dataDefinedProperties->
insert( property, dd );
360 if ( active.
compare(
"true", Qt::CaseInsensitive ) == 0 )
371 if ( useExpr.
compare(
"true", Qt::CaseInsensitive ) == 0 )
384 for ( ; i != dataDefinedNames->
constEnd(); ++i )
389 if ( it != dataDefinedProperties->
constEnd() )
399 bool defaultVals = ( !active && !useExpr && expr.
isEmpty() && field.
isEmpty() );
433 QFont scaledFont = font;
487 int lines = multiLineSplit.
size();
494 double fontHeight = fontMetrics.
ascent() + fontMetrics.
descent();
495 double textHeight = fontMetrics.
ascent() + ( double )(( lines - 1 ) * fontHeight * multiLineHeight );
518 painter->
scale( scaleFactor, scaleFactor );
544 painter->
scale( scaleFactor, scaleFactor );
545 painter->
drawText( scaledRect, halignment | valignment | flags, text );
static void relativeResizeRect(QRectF &rectToResize, const QRectF &boundsBefore, const QRectF &boundsAfter)
Resizes a QRectF relative to a resized bounding rectangle.
QDomNodeList elementsByTagName(const QString &tagname) const
void setActive(bool active)
A container class for data source field mapping or expression.
static double normalizedAngle(const double angle)
Ensures that an angle is in the range 0 <= angle < 360.
QDomNode appendChild(const QDomNode &newChild)
QString field() const
Get the field which this QgsDataDefined represents.
QString attribute(const QString &name, const QString &defValue) const
QStringList split(const QString &sep, SplitBehavior behavior, Qt::CaseSensitivity cs) const
static double relativePosition(const double position, const double beforeMin, const double beforeMax, const double afterMin, const double afterMax)
Returns a scaled position given a before and after range.
void scale(qreal sx, qreal sy)
const_iterator constBegin() const
static void readDataDefinedPropertyMap(const QDomElement &itemElem, QMap< QgsComposerObject::DataDefinedProperty, QString > *dataDefinedNames, QMap< QgsComposerObject::DataDefinedProperty, QgsDataDefined * > *dataDefinedProperties)
Reads all data defined properties from xml.
static void drawText(QPainter *painter, const QPointF &pos, const QString &text, const QFont &font, const QColor &color=QColor())
Draws text on a painter at a specific position, taking care of composer specific issues (calculation ...
void drawPolygon(const QPointF *points, int pointCount, Qt::FillRule fillRule)
void setJoinStyle(Qt::PenJoinStyle style)
QString expressionString() const
Returns the expression string of this QgsDataDefined.
static double fontAscentMM(const QFont &font)
Calculate font ascent in millimeters, including workarounds for QT font rendering issues...
const_iterator constFind(const Key &key) const
static QFont scaledFontPixelSize(const QFont &font)
Returns a font where size is set in pixels and the size has been upscaled with FONT_WORKAROUND_SCALE ...
DataDefinedProperty
Data defined properties for different item types.
static void writeDataDefinedPropertyMap(QDomElement &itemElem, QDomDocument &doc, const QMap< QgsComposerObject::DataDefinedProperty, QString > *dataDefinedNames, const QMap< QgsComposerObject::DataDefinedProperty, QgsDataDefined * > *dataDefinedProperties)
Writes data defined properties to xml.
static double fontDescentMM(const QFont &font)
Calculate font descent in millimeters, including workarounds for QT font rendering issues...
void setStyle(Qt::BrushStyle style)
qreal width(const QString &text) const
static void readDataDefinedProperty(const QgsComposerObject::DataDefinedProperty property, const QDomElement &ddElem, QMap< QgsComposerObject::DataDefinedProperty, QgsDataDefined * > *dataDefinedProperties)
Reads a single data defined property from xml DOM element.
QDomElement toElement() const
void setPixelSize(int pixelSize)
void setUseExpression(bool use)
Controls if the field or the expression part is active.
static void drawArrowHead(QPainter *p, const double x, const double y, const double angle, const double arrowHeadWidth)
Draws an arrow head on to a QPainter.
void setFont(const QFont &font)
static double fontHeightCharacterMM(const QFont &font, const QChar &character)
Calculate font height in millimeters of a single character, including workarounds for QT font renderi...
void setPen(const QColor &color)
QRectF boundingRect(const QString &text) const
void setAttribute(const QString &name, const QString &value)
void setField(const QString &field)
Set the field name which this QgsDataDefined represents.
const_iterator constEnd() const
static QRectF largestRotatedRectWithinBounds(const QRectF &originalRect, const QRectF &boundsRect, const double rotation)
Calculates the largest scaled version of originalRect which fits within boundsRect, when it is rotated by a specified amount.
void setBrush(const QBrush &brush)
void drawText(const QPointF &position, const QString &text)
bool useExpression() const
Returns if the field or the expression part is active.
static void rotate(const double angle, double &x, double &y)
Rotates a point / vector around the origin.
double ANALYSIS_EXPORT angle(Point3D *p1, Point3D *p2, Point3D *p3, Point3D *p4)
Calculates the angle between two segments (in 2 dimension, z-values are ignored)
const QBrush & brush() const
static bool decodePresetPaperSize(const QString &presetString, double &width, double &height)
Decodes a string representing a preset page size.
const Key key(const T &value) const
static double textWidthMM(const QFont &font, const QString &text)
Calculate font width in millimeters for a string, including workarounds for QT font rendering issues...
static double fontHeightMM(const QFont &font)
Calculate font height in millimeters, including workarounds for QT font rendering issues The font hei...
static double textHeightMM(const QFont &font, const QString &text, double multiLineHeight=1.0)
Calculate font height in millimeters for a string, including workarounds for QT font rendering issues...
static double pointsToMM(const double pointSize)
Returns the size in mm corresponding to a font point size.
static double snappedAngle(const double angle)
Snaps an angle to its closest 45 degree angle.
#define FONT_WORKAROUND_SCALE
iterator insert(const Key &key, const T &value)
void setRect(qreal x, qreal y, qreal width, qreal height)
static double angle(const QPointF &p1, const QPointF &p2)
Calculates the angle of the line from p1 to p2 (counter clockwise, starting from a line from north to...
const_iterator constEnd() const
QDomElement createElement(const QString &tagName)
const_iterator constBegin() const
int compare(const QString &other) const
void setExpressionString(const QString &expr)
Sets the expression for this QgsDataDefined.
iterator find(const Key &key)
static QgsComposition::PaperOrientation decodePaperOrientation(const QString &orientationString, bool &ok)
Decodes a string representing a paper orientation.
QDomNode at(int index) const
const T value(const Key &key) const
static double mmToPoints(const double mmSize)
Returns the size in mm corresponding to a font point size.