X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fbase%2Frs_solid.cpp;h=31600ec564001290f39ecffd5b6d88bf27da431b;hb=d774c2655ba2c3657a565f325411144452392277;hp=0b447a7319d898ee17b8374590f96980f9ad9e2e;hpb=16ce54abf01ca3032e42a5bb11a4afcf9014dcca;p=architektonas diff --git a/src/base/rs_solid.cpp b/src/base/rs_solid.cpp index 0b447a7..31600ec 100644 --- a/src/base/rs_solid.cpp +++ b/src/base/rs_solid.cpp @@ -1,60 +1,85 @@ -/**************************************************************************** -** $Id: rs_solid.cpp 1938 2004-12-09 23:09:53Z andrew $ -** -** Copyright (C) 2001-2003 RibbonSoft. All rights reserved. -** -** This file is part of the qcadlib Library project. -** -** This file may be distributed and/or modified under the terms of the -** GNU General Public License version 2 as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL included in the -** packaging of this file. -** -** Licensees holding valid qcadlib Professional Edition licenses may use -** this file in accordance with the qcadlib Commercial License -** Agreement provided with the Software. -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -** See http://www.ribbonsoft.com for further details. -** -** Contact info@ribbonsoft.com if any conditions of this licensing are -** not clear to you. -** -**********************************************************************/ +// rs_solid.cpp +// +// Part of the Architektonas Project +// Originally part of QCad Community Edition by Andrew Mustun +// Extensively rewritten and refactored by James L. Hammons +// (C) 2010 Underground Software +// +// JLH = James L. Hammons +// +// Who When What +// --- ---------- ----------------------------------------------------------- +// JLH 06/02/2010 Added this text. :-) +// #include "rs_solid.h" -#include "rs_graphicview.h" -//#include "rs_painter.h" -#include "paintintf.h" +#include "graphicview.h" +#include "paintinterface.h" /** * Default constructor. */ -RS_Solid::RS_Solid(RS_EntityContainer* parent, - const RS_SolidData& d) - :RS_AtomicEntity(parent), data(d) { - calculateBorders(); +RS_Solid::RS_Solid(RS_EntityContainer * parent, const RS_SolidData & d): + RS_AtomicEntity(parent), data(d) +{ + calculateBorders(); } +/*virtual*/ RS_Entity * RS_Solid::clone() +{ + RS_Solid * s = new RS_Solid(*this); + s->initId(); + return s; +} +/** @return RS_ENTITY_POINT */ +/*virtual*/ RS2::EntityType RS_Solid::rtti() const +{ + return RS2::EntitySolid; +} /** - * @return Corner number 'num'. + * @return Start point of the entity. */ -Vector RS_Solid::getCorner(int num) { - if (num>=0 && num<4) { - return data.corner[num]; - } else { - RS_DEBUG->print("Illegal corner requested from Solid", - RS_Debug::D_WARNING); - return Vector(false); - } +/*virtual*/ Vector RS_Solid::getStartpoint() const +{ + return Vector(false); } +/** + * @return End point of the entity. + */ +/*virtual*/ Vector RS_Solid::getEndpoint() const +{ + return Vector(false); +} +/** @return Copy of data that defines the point. */ +RS_SolidData RS_Solid::getData() const +{ + return data; +} + +/** @return true if this is a triangle. */ +bool RS_Solid::isTriangle() +{ + return !data.corner[3].valid; +} + +/** + * @return Corner number 'num'. + */ +Vector RS_Solid::getCorner(int num) +{ + if (num >= 0 && num < 4) + return data.corner[num]; + else + { + RS_DEBUG->print("Illegal corner requested from Solid", RS_Debug::D_WARNING); + return Vector(false); + } +} /** * Shapes this Solid into a standard arrow (used in dimensions). @@ -63,163 +88,144 @@ Vector RS_Solid::getCorner(int num) { * @param angle Direction of the arrow. * @param arrowSize Size of arrow (length). */ -void RS_Solid::shapeArrow(const Vector& point, - double angle, - double arrowSize) { - - double cosv1, sinv1, cosv2, sinv2; - double arrowSide = arrowSize/cos(0.165); +void RS_Solid::shapeArrow(const Vector & point, double angle, double arrowSize) +{ + double cosv1, sinv1, cosv2, sinv2; + double arrowSide = arrowSize / cos(0.165); - cosv1 = cos(angle+0.165)*arrowSide; - sinv1 = sin(angle+0.165)*arrowSide; - cosv2 = cos(angle-0.165)*arrowSide; - sinv2 = sin(angle-0.165)*arrowSide; + cosv1 = cos(angle + 0.165) * arrowSide; + sinv1 = sin(angle + 0.165) * arrowSide; + cosv2 = cos(angle - 0.165) * arrowSide; + sinv2 = sin(angle - 0.165) * arrowSide; - data.corner[0] = point; - data.corner[1] = Vector(point.x - cosv1, point.y - sinv1); - data.corner[2] = Vector(point.x - cosv2, point.y - sinv2); - data.corner[3] = Vector(false); + data.corner[0] = point; + data.corner[1] = Vector(point.x - cosv1, point.y - sinv1); + data.corner[2] = Vector(point.x - cosv2, point.y - sinv2); + data.corner[3] = Vector(false); - calculateBorders(); + calculateBorders(); } +void RS_Solid::calculateBorders() +{ + resetBorders(); - -void RS_Solid::calculateBorders() { - resetBorders(); - - for (int i=0; i<4; ++i) { - if (data.corner[i].valid) { - minV = Vector::minimum(minV, data.corner[i]); - maxV = Vector::maximum(maxV, data.corner[i]); - } - } + for(int i=0; i<4; ++i) + { + if (data.corner[i].valid) + { + minV = Vector::minimum(minV, data.corner[i]); + maxV = Vector::maximum(maxV, data.corner[i]); + } + } } +Vector RS_Solid::getNearestEndpoint(const Vector & coord, double * dist) +{ + double minDist = RS_MAXDOUBLE; + double curDist; + Vector ret; + for(int i=0; i<4; ++i) + { + if (data.corner[i].valid) + { + curDist = data.corner[i].distanceTo(coord); -Vector RS_Solid::getNearestEndpoint(const Vector& coord, double* dist) { - - double minDist = RS_MAXDOUBLE; - double curDist; - Vector ret; - - for (int i=0; i<4; ++i) { - if (data.corner[i].valid) { - curDist = data.corner[i].distanceTo(coord); - if (curDist