X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fbase%2Fdimlinear.cpp;fp=src%2Fbase%2Fdimlinear.cpp;h=0000000000000000000000000000000000000000;hb=9f6ad3fe0b9cb30115a5d38e8af3aebed0d70c08;hp=239d186d47d9f7b5915dc46692d06eac8329992a;hpb=43c13b052d069ba435277d93867380d00c04931f;p=architektonas diff --git a/src/base/dimlinear.cpp b/src/base/dimlinear.cpp deleted file mode 100644 index 239d186..0000000 --- a/src/base/dimlinear.cpp +++ /dev/null @@ -1,333 +0,0 @@ -// dimlinear.cpp -// -// Part of the Architektonas Project -// Originally part of QCad Community Edition by Andrew Mustun -// Extensively rewritten and refactored by James L. Hammons -// Portions copyright (C) 2001-2003 RibbonSoft -// Copyright (C) 2010 Underground Software -// See the README and GPLv2 files for licensing and warranty information -// -// JLH = James L. Hammons -// -// Who When What -// --- ---------- ----------------------------------------------------------- -// JLH 05/28/2010 Added this text. :-) -// - -#include "dimlinear.h" - -#include "constructionline.h" -#include "text.h" -#include "solid.h" -#include "drawing.h" -#include "units.h" - -/** - * Constructor. - * - * @para parent Parent Entity Container. - * @para d Common dimension geometrical data. - * @para ed Extended geometrical data for linear dimension. - */ -DimLinear::DimLinear(EntityContainer * parent, const DimensionData & d, - const DimLinearData & ed): Dimension(parent, d), edata(ed) -{ - calculateBorders(); -} - -/*virtual*/ DimLinear::~DimLinear() -{ -} - -/*virtual*/ Entity * DimLinear::clone() -{ - DimLinear * d = new DimLinear(*this); -#warning "!!! Need to deal with setAutoDelete() Qt3->Qt4 !!!" -// d->entities.setAutoDelete(entities.autoDelete()); - d->initId(); - d->detach(); - - return d; -} - -/** @return RS2::EntityDimLinear */ -/*virtual*/ RS2::EntityType DimLinear::rtti() const -{ - return RS2::EntityDimLinear; -} - -/** - * @return Copy of data that defines the linear dimension. - * @see getData() - */ -DimLinearData DimLinear::getEData() const -{ - return edata; -} - -VectorSolutions DimLinear::getRefPoints() -{ - VectorSolutions ret(edata.extensionPoint1, edata.extensionPoint2, - data.definitionPoint, data.middleOfText); - - return ret; -} - -/** - * @return Automatically created label for the default - * measurement of this dimension. - */ -QString DimLinear::getMeasuredLabel() -{ - // direction of dimension line - Vector dirDim; - dirDim.setPolar(100.0, edata.angle); - - // construction line for dimension line - ConstructionLine dimLine(NULL, ConstructionLineData(data.definitionPoint, - data.definitionPoint + dirDim)); - - Vector dimP1 = dimLine.getNearestPointOnEntity(edata.extensionPoint1); - Vector dimP2 = dimLine.getNearestPointOnEntity(edata.extensionPoint2); - - // Definitive dimension line: - double dist = dimP1.distanceTo(dimP2); - - Drawing * drawing = GetDrawing(); - - if (drawing) - return Units::formatLinear(dist, drawing->getUnit(), - drawing->getLinearFormat(), drawing->getLinearPrecision()); - - return QString("%1").arg(dist); -} - -bool DimLinear::hasEndpointsWithinWindow(Vector v1, Vector v2) -{ - return (edata.extensionPoint1.isInWindow(v1, v2) - || edata.extensionPoint2.isInWindow(v1, v2)); -} - -/** - * Updates the sub entities of this dimension. Called when the - * text or the position, alignment, .. changes. - * - * @param autoText Automatically reposition the text label - */ -void DimLinear::update(bool autoText) -{ - DEBUG->print("DimLinear::update"); - - clear(); - - if (isUndone()) - return; - - // distance from entities (DIMEXO) - double dimexo = getExtensionLineOffset(); - // extension line extension (DIMEXE) - double dimexe = getExtensionLineExtension(); - - LineData ld; - double extAngle = edata.angle + (M_PI / 2.0); - - // direction of dimension line - Vector dirDim; - dirDim.setPolar(100.0, edata.angle); - // direction of extension lines - Vector dirExt; - dirExt.setPolar(100.0, extAngle); - - // construction line for dimension line - ConstructionLine dimLine(NULL, ConstructionLineData(data.definitionPoint, - data.definitionPoint + dirDim)); - - Vector dimP1 = dimLine.getNearestPointOnEntity(edata.extensionPoint1); - Vector dimP2 = dimLine.getNearestPointOnEntity(edata.extensionPoint2); - - // Definitive dimension line: - updateCreateDimensionLine(dimP1, dimP2, true, true, autoText); - /* - ld = LineData(data.definitionPoint, dimP1); - Line* dimensionLine = new Line(this, ld); - addEntity(dimensionLine); - */ - Vector vDimexo1, vDimexe1, vDimexo2, vDimexe2; - vDimexe1.setPolar(dimexe, edata.extensionPoint1.angleTo(dimP1)); - vDimexo1.setPolar(dimexo, edata.extensionPoint1.angleTo(dimP1)); - - vDimexe2.setPolar(dimexe, edata.extensionPoint2.angleTo(dimP2)); - vDimexo2.setPolar(dimexo, edata.extensionPoint2.angleTo(dimP2)); - - if ((edata.extensionPoint1 - dimP1).magnitude() < 1e-6) - { - vDimexe1.setPolar(dimexe, data.definitionPoint.angleTo(dimP1) - M_PI / 2.0); - vDimexo1.setPolar(dimexo, data.definitionPoint.angleTo(dimP1) - M_PI / 2.0); - } - - if ((edata.extensionPoint2 - dimP2).magnitude() < 1e-6) - { - vDimexe2.setPolar(dimexe, data.definitionPoint.angleTo(dimP2) - M_PI / 2.0); - vDimexo2.setPolar(dimexo, data.definitionPoint.angleTo(dimP2) - M_PI / 2.0); - } - - // extension lines: - ld = LineData(edata.extensionPoint1 + vDimexo1, dimP1 + vDimexe1); - Line * line = new Line(this, ld); - line->setPen(Pen(RS2::FlagInvalid)); - line->setLayer(NULL); - addEntity(line); - - ld = LineData(edata.extensionPoint2 + vDimexo2, dimP2 + vDimexe2); - //data.definitionPoint+vDimexe2); - line = new Line(this, ld); - line->setPen(Pen(RS2::FlagInvalid)); - line->setLayer(NULL); - addEntity(line); - - calculateBorders(); -} - -Vector DimLinear::getExtensionPoint1() -{ - return edata.extensionPoint1; -} - -Vector DimLinear::getExtensionPoint2() -{ - return edata.extensionPoint2; -} - -double DimLinear::getAngle() -{ - return edata.angle; -} - -void DimLinear::setAngle(double a) -{ - edata.angle = Math::correctAngle(a); -} - -double DimLinear::getOblique() -{ - return edata.oblique; -} - -void DimLinear::move(Vector offset) -{ - Dimension::move(offset); - - edata.extensionPoint1.move(offset); - edata.extensionPoint2.move(offset); - update(); -} - -void DimLinear::rotate(Vector center, double angle) -{ - Dimension::rotate(center, angle); - - edata.extensionPoint1.rotate(center, angle); - edata.extensionPoint2.rotate(center, angle); - edata.angle = Math::correctAngle(edata.angle+angle); - update(); -} - -void DimLinear::scale(Vector center, Vector factor) -{ - Dimension::scale(center, factor); - - edata.extensionPoint1.scale(center, factor); - edata.extensionPoint2.scale(center, factor); - update(); -} - -void DimLinear::mirror(Vector axisPoint1, Vector axisPoint2) -{ - Dimension::mirror(axisPoint1, axisPoint2); - - edata.extensionPoint1.mirror(axisPoint1, axisPoint2); - edata.extensionPoint2.mirror(axisPoint1, axisPoint2); - - Vector vec; - vec.setPolar(1.0, edata.angle); - vec.mirror(Vector(0.0, 0.0), axisPoint2 - axisPoint1); - edata.angle = vec.angle(); - - update(); -} - -void DimLinear::stretch(Vector firstCorner, Vector secondCorner, Vector offset) -{ - //e->calculateBorders(); - if (getMin().isInWindow(firstCorner, secondCorner) - && getMax().isInWindow(firstCorner, secondCorner)) - { - move(offset); - } - else - { - //Vector v = data.definitionPoint - edata.extensionPoint2; - //double len = edata.extensionPoint2.distanceTo(data.definitionPoint); - //double ang1 = edata.extensionPoint1.angleTo(edata.extensionPoint2) - // + M_PI/2; - - if (edata.extensionPoint1.isInWindow(firstCorner, secondCorner)) - edata.extensionPoint1.move(offset); - - if (edata.extensionPoint2.isInWindow(firstCorner, secondCorner)) - edata.extensionPoint2.move(offset); - - /* - double ang2 = edata.extensionPoint1.angleTo(edata.extensionPoint2) - + M_PI/2; - - double diff = Math::getAngleDifference(ang1, ang2); - if (diff>M_PI) { - diff-=2*M_PI; - } - - if (fabs(diff)>M_PI/2) { - ang2 = Math::correctAngle(ang2+M_PI); - } - - Vector v; - v.setPolar(len, ang2); - data.definitionPoint = edata.extensionPoint2 + v; - */ - } - - update(true); -} - -void DimLinear::moveRef(const Vector & ref, const Vector & offset) -{ - if (ref.distanceTo(data.definitionPoint) < 1.0e-4) - { - data.definitionPoint += offset; - update(true); - } - else if (ref.distanceTo(data.middleOfText) < 1.0e-4) - { - data.middleOfText += offset; - update(false); - } - else if (ref.distanceTo(edata.extensionPoint1) < 1.0e-4) - { - edata.extensionPoint1 += offset; - update(true); - } - else if (ref.distanceTo(edata.extensionPoint2) < 1.0e-4) - { - edata.extensionPoint2 += offset; - update(true); - } -} - -/** - * Dumps the point's data to stdout. - */ -std::ostream & operator<<(std::ostream & os, const DimLinear & d) -{ - os << " DimLinear: " << d.getData() << "\n" << d.getEData() << "\n"; - return os; -}