+++ /dev/null
-// 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 <jlhamm@acm.org>
-//
-// 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;
-}