void QgsMeasureDialog::mouseMove( const QgsPoint &point ) { mLastMousePoint = point; // show current distance/area while moving the point // by creating a temporary copy of point array // and adding moving point at the end if ( mMeasureArea && mTool->points().size() >= 2 ) { QList<QgsPoint> tmpPoints = mTool->points(); tmpPoints.append( point ); double area = mDa.measurePolygon( tmpPoints ); editTotal->setText( formatArea( area ) ); } else if ( !mMeasureArea && mTool->points().size() >= 1 ) { QgsPoint p1( mTool->points().last() ), p2( point ); double d = mDa.measureLine( p1, p2 ); editTotal->setText( formatDistance( mTotal + d ) ); d = convertLength( d, mDistanceUnits ); // Set moving QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 ); if ( item ) { item->setText( 0, QLocale::system().toString( d, 'f', mDecimalPlaces ) ); QgsDebugMsg( QString( "Final result is %1" ).arg( item->text( 0 ) ) ); } } }
Length StyleBuilderConverter::convertLengthSizing(StyleResolverState& state, CSSValue* value) { CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value); switch (primitiveValue->getValueID()) { case CSSValueInvalid: return convertLength(state, value); case CSSValueIntrinsic: return Length(Intrinsic); case CSSValueMinIntrinsic: return Length(MinIntrinsic); case CSSValueWebkitMinContent: return Length(MinContent); case CSSValueWebkitMaxContent: return Length(MaxContent); case CSSValueWebkitFillAvailable: return Length(FillAvailable); case CSSValueWebkitFitContent: return Length(FitContent); case CSSValueAuto: return Length(Auto); default: ASSERT_NOT_REACHED(); return Length(); } }
void QgsMeasureDialog::removeLastPoint() { int numPoints = mTool->points().size(); if ( mMeasureArea ) { if ( numPoints > 1 ) { QList<QgsPoint> tmpPoints = mTool->points(); tmpPoints.append( mLastMousePoint ); double area = mDa.measurePolygon( tmpPoints ); editTotal->setText( formatArea( area ) ); } else { editTotal->setText( formatArea( 0 ) ); } } else if ( !mMeasureArea && numPoints >= 1 ) { //remove final row delete mTable->takeTopLevelItem( mTable->topLevelItemCount() - 1 ); QgsPoint p1( mTool->points().last() ); double d = mDa.measureLine( p1, mLastMousePoint ); mTotal = mDa.measureLine( mTool->points() ); editTotal->setText( formatDistance( mTotal + d ) ); d = convertLength( d, mDistanceUnits ); QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 ); item->setText( 0, QLocale::system().toString( d, 'f', mDecimalPlaces ) ); } }
unsigned int LittleEndianDataRepresentation::convertBinary(const void* data, size_t dataLengthBytes, unsigned int dataLengthBits, void* convertedData, size_t convertedLengthBytes) { unsigned int ret = 0; BitHelper::swapBytes(convertedData, convertedLengthBytes, data, dataLengthBytes, dataLengthBits); ret = convertLength(dataLengthBits); return ret; }
QString QgsMeasureDialog::formatDistance( double distance, bool convertUnits ) const { QSettings settings; bool baseUnit = settings.value( "/qgis/measure/keepbaseunit", true ).toBool(); if ( convertUnits ) distance = convertLength( distance, mDistanceUnits ); return QgsDistanceArea::formatDistance( distance, mDecimalPlaces, mDistanceUnits, baseUnit ); }
void GraphicsLayerAndroid::updateFixedPosition() { RenderLayer* renderLayer = renderLayerFromClient(m_client); if (!renderLayer) return; RenderView* view = static_cast<RenderView*>(renderLayer->renderer()); if (!view) return; // We will need the Iframe flag in the LayerAndroid tree for fixed position if (view->isRenderIFrame()) m_contentLayer->setIsIframe(true); // If we are a fixed position layer, just set it if (view->isPositioned() && view->style()->position() == FixedPosition) { // We need to get the passed CSS properties for the element SkLength left, top, right, bottom; left = convertLength(view->style()->left()); top = convertLength(view->style()->top()); right = convertLength(view->style()->right()); bottom = convertLength(view->style()->bottom()); // We also need to get the margin... SkLength marginLeft, marginTop, marginRight, marginBottom; marginLeft = convertLength(view->style()->marginLeft()); marginTop = convertLength(view->style()->marginTop()); marginRight = convertLength(view->style()->marginRight()); marginBottom = convertLength(view->style()->marginBottom()); // In order to compute the fixed element's position, we need the width // and height of the element when bottom or right is defined. // And here we should use the non-overflowed value, that means, the // overflowed content (e.g. outset shadow) will not be counted into the // width and height. int w = view->width(); int h = view->height(); int paintingOffsetX = - offsetFromRenderer().width(); int paintingOffsetY = - offsetFromRenderer().height(); SkRect viewRect; viewRect.set(paintingOffsetX, paintingOffsetY, paintingOffsetX + w, paintingOffsetY + h); IntPoint renderLayerPos(renderLayer->x(), renderLayer->y()); m_contentLayer->setFixedPosition(left, top, right, bottom, marginLeft, marginTop, marginRight, marginBottom, renderLayerPos, viewRect); } }
unsigned int LittleEndianDataRepresentation::convertNumeric(const void* data, size_t dataLengthBytes, unsigned int dataLengthBits, void* convertedData, size_t convertedLengthBytes) { unsigned int ret = 0; #if __BYTE_ORDER == __LITTLE_ENDIAN if (convertedLengthBytes >= dataLengthBytes) { memset(convertedData, 0x00, convertedLengthBytes); memcpy(convertedData, data, dataLengthBytes); } ret = convertLength(dataLengthBits); #else BitHelper::swapBytes(convertedData, convertedLengthBytes, data, dataLengthBytes, dataLengthBits); ret = convertLength(dataLengthBits); #endif return ret; }
QString QgsMeasureDialog::formatDistance( double distance, bool convertUnits ) const { QgsSettings settings; bool baseUnit = settings.value( QStringLiteral( "qgis/measure/keepbaseunit" ), true ).toBool(); if ( convertUnits ) distance = convertLength( distance, mDistanceUnits ); int decimals = mDecimalPlaces; if ( mDistanceUnits == QgsUnitTypes::DistanceDegrees && distance < 1 ) { // special handling for degrees - because we can't use smaller units (eg m->mm), we need to make sure there's // enough decimal places to show a usable measurement value int minPlaces = std::round( std::log10( 1.0 / distance ) ) + 1; decimals = std::max( decimals, minPlaces ); } return QgsDistanceArea::formatDistance( distance, decimals, mDistanceUnits, baseUnit ); }
void QgsMeasureDialog::updateUi() { // Set tooltip to indicate how we calculate measurments QString toolTip = tr( "The calculations are based on:" ); bool forceCartesian = false; bool convertToDisplayUnits = true; if ( mMeasureArea ) { if ( mTool->canvas()->mapSettings().destinationCrs().mapUnits() == QgsUnitTypes::DistanceDegrees && ( mAreaUnits == QgsUnitTypes::AreaSquareDegrees || mAreaUnits == QgsUnitTypes::AreaUnknownUnit ) ) { //both source and destination units are degrees toolTip += "<br> * " + tr( "Both project CRS (%1) and measured area are in degrees, so area is calculated using cartesian calculations in square degrees." ).arg( mTool->canvas()->mapSettings().destinationCrs().description() ); forceCartesian = true; convertToDisplayUnits = false; //not required since we will be measuring in degrees } else { QgsUnitTypes::AreaUnit resultUnit = QgsUnitTypes::AreaUnknownUnit; if ( ! mTool->canvas()->hasCrsTransformEnabled() ) { resultUnit = QgsUnitTypes::distanceToAreaUnit( mTool->canvas()->mapSettings().destinationCrs().mapUnits() ); toolTip += "<br> * " + tr( "Project CRS transformation is turned off." ) + ' '; toolTip += tr( "Area is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ), mTool->canvas()->mapSettings().destinationCrs().description() ); toolTip += "<br> * " + tr( "Ellipsoidal calculation is not possible with CRS transformation disabled." ); setWindowTitle( tr( "Measure (OTF off)" ) ); } else { if ( mDa.willUseEllipsoid() ) { resultUnit = QgsUnitTypes::AreaSquareMeters; toolTip += "<br> * " + tr( "Project CRS transformation is turned on and ellipsoidal calculation is selected." ) + ' '; toolTip += "<br> * " + tr( "The coordinates are transformed to the chosen ellipsoid (%1), and the area is calculated in %2." ).arg( mDa.ellipsoid(), QgsUnitTypes::toString( resultUnit ) ); } else { resultUnit = QgsUnitTypes::distanceToAreaUnit( mTool->canvas()->mapSettings().destinationCrs().mapUnits() ); toolTip += "<br> * " + tr( "Project CRS transformation is turned on but ellipsoidal calculation is not selected." ) + ' '; toolTip += tr( "Area is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ), mTool->canvas()->mapSettings().destinationCrs().description() ); } setWindowTitle( tr( "Measure (OTF on)" ) ); } if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Geographic && QgsUnitTypes::unitType( mAreaUnits ) == QgsUnitTypes::Standard ) { toolTip += "<br> * Area is roughly converted to square meters by using scale at equator (1 degree = 111319.49 meters)."; resultUnit = QgsUnitTypes::AreaSquareMeters; } else if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Standard && QgsUnitTypes::unitType( mAreaUnits ) == QgsUnitTypes::Geographic ) { toolTip += "<br> * Area is roughly converted to square degrees by using scale at equator (1 degree = 111319.49 meters)."; resultUnit = QgsUnitTypes::AreaSquareDegrees; } if ( resultUnit != mAreaUnits ) { if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Standard && QgsUnitTypes::unitType( mAreaUnits ) == QgsUnitTypes::Standard ) { // only shown if both conditions are true: // - the display unit is a standard distance measurement (eg square feet) // - either the canvas units is also a standard distance OR we are using an ellipsoid (in which case the // value will be in square meters) toolTip += "<br> * " + tr( "The value is converted from %1 to %2." ).arg( QgsUnitTypes::toString( resultUnit ), QgsUnitTypes::toString( mAreaUnits ) ); } else { //should not be possible! } } } } else { if ( mTool->canvas()->mapSettings().destinationCrs().mapUnits() == QgsUnitTypes::DistanceDegrees && mDistanceUnits == QgsUnitTypes::DistanceDegrees ) { //both source and destination units are degrees toolTip += "<br> * " + tr( "Both project CRS (%1) and measured length are in degrees, so distance is calculated using cartesian calculations in degrees." ).arg( mTool->canvas()->mapSettings().destinationCrs().description() ); forceCartesian = true; convertToDisplayUnits = false; //not required since we will be measuring in degrees } else { QgsUnitTypes::DistanceUnit resultUnit = QgsUnitTypes::DistanceUnknownUnit; if ( ! mTool->canvas()->hasCrsTransformEnabled() ) { resultUnit = mTool->canvas()->mapSettings().destinationCrs().mapUnits(); toolTip += "<br> * " + tr( "Project CRS transformation is turned off." ) + ' '; toolTip += tr( "Distance is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ), mTool->canvas()->mapSettings().destinationCrs().description() ); toolTip += "<br> * " + tr( "Ellipsoidal calculation is not possible with CRS transformation disabled." ); setWindowTitle( tr( "Measure (OTF off)" ) ); } else { if ( mDa.willUseEllipsoid() ) { resultUnit = QgsUnitTypes::DistanceMeters; toolTip += "<br> * " + tr( "Project CRS transformation is turned on and ellipsoidal calculation is selected." ) + ' '; toolTip += "<br> * " + tr( "The coordinates are transformed to the chosen ellipsoid (%1), and the distance is calculated in %2." ).arg( mDa.ellipsoid(), QgsUnitTypes::toString( resultUnit ) ); } else { resultUnit = mTool->canvas()->mapSettings().destinationCrs().mapUnits(); toolTip += "<br> * " + tr( "Project CRS transformation is turned on but ellipsoidal calculation is not selected." ) + ' '; toolTip += tr( "Distance is calculated in %1, based on project CRS (%2)." ).arg( QgsUnitTypes::toString( resultUnit ), mTool->canvas()->mapSettings().destinationCrs().description() ); } setWindowTitle( tr( "Measure (OTF on)" ) ); } if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Geographic && QgsUnitTypes::unitType( mDistanceUnits ) == QgsUnitTypes::Standard ) { toolTip += "<br> * Distance is roughly converted to meters by using scale at equator (1 degree = 111319.49 meters)."; resultUnit = QgsUnitTypes::DistanceMeters; } else if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Standard && QgsUnitTypes::unitType( mDistanceUnits ) == QgsUnitTypes::Geographic ) { toolTip += "<br> * Distance is roughly converted to degrees by using scale at equator (1 degree = 111319.49 meters)."; resultUnit = QgsUnitTypes::DistanceDegrees; } if ( resultUnit != mDistanceUnits ) { if ( QgsUnitTypes::unitType( resultUnit ) == QgsUnitTypes::Standard && QgsUnitTypes::unitType( mDistanceUnits ) == QgsUnitTypes::Standard ) { // only shown if both conditions are true: // - the display unit is a standard distance measurement (eg feet) // - either the canvas units is also a standard distance OR we are using an ellipsoid (in which case the // value will be in meters) toolTip += "<br> * " + tr( "The value is converted from %1 to %2." ).arg( QgsUnitTypes::toString( resultUnit ), QgsUnitTypes::toString( mDistanceUnits ) ); } else { //should not be possible! } } } } editTotal->setToolTip( toolTip ); mTable->setToolTip( toolTip ); mNotesLabel->setText( toolTip ); if ( mMeasureArea ) { mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( mAreaUnits ) ); } else { mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( mDistanceUnits ) ); mTable->setHeaderLabels( QStringList( tr( "Segments [%1]" ).arg( QgsUnitTypes::toString( mDistanceUnits ) ) ) ); } if ( mMeasureArea ) { double area = 0.0; if ( mTool->points().size() > 1 ) { area = mDa.measurePolygon( mTool->points() ); } mTable->hide(); // Hide the table, only show summary. editTotal->setText( formatArea( area ) ); } else { QList<QgsPoint>::const_iterator it; bool b = true; // first point QgsPoint p1, p2; mTotal = 0; for ( it = mTool->points().constBegin(); it != mTool->points().constEnd(); ++it ) { p2 = *it; if ( !b ) { double d = -1; if ( forceCartesian ) { //cartesian calculation forced d = sqrt( p2.sqrDist( p1 ) ); mTotal += d; } else { d = mDa.measureLine( p1, p2 ); d = convertLength( d, mDistanceUnits ); } QTreeWidgetItem *item = new QTreeWidgetItem( QStringList( QLocale::system().toString( d, 'f', mDecimalPlaces ) ) ); item->setTextAlignment( 0, Qt::AlignRight ); mTable->addTopLevelItem( item ); mTable->scrollToItem( item ); } p1 = p2; b = false; } if ( !forceCartesian ) mTotal = mDa.measureLine( mTool->points() ); mTable->show(); // Show the table with items editTotal->setText( formatDistance( mTotal, convertToDisplayUnits ) ); } }