⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs_solid.cpp

📁 qcad2.05可用于windows和linux的源码
💻 CPP
字号:
/****************************************************************************** $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.************************************************************************/#include "rs_solid.h"#include "rs_graphicview.h"#include "rs_painter.h"/** * Default constructor. */RS_Solid::RS_Solid(RS_EntityContainer* parent,                   const RS_SolidData& d)        :RS_AtomicEntity(parent), data(d) {    calculateBorders();}/** * @return Corner number 'num'.  */RS_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 RS_Vector(false);    }}/** * Shapes this Solid into a standard arrow (used in dimensions). * * @param point The point the arrow points to. * @param angle Direction of the arrow. * @param arrowSize Size of arrow (length). */void RS_Solid::shapeArrow(const RS_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;    data.corner[0] = point;    data.corner[1] = RS_Vector(point.x - cosv1, point.y - sinv1);    data.corner[2] = RS_Vector(point.x - cosv2, point.y - sinv2);    data.corner[3] = RS_Vector(false);    calculateBorders();}void RS_Solid::calculateBorders() {    resetBorders();    for (int i=0; i<4; ++i) {        if (data.corner[i].valid) {            minV = RS_Vector::minimum(minV, data.corner[i]);            maxV = RS_Vector::maximum(maxV, data.corner[i]);        }    }}RS_Vector RS_Solid::getNearestEndpoint(const RS_Vector& coord, double* dist) {    double minDist = RS_MAXDOUBLE;    double curDist;    RS_Vector ret;    for (int i=0; i<4; ++i) {        if (data.corner[i].valid) {            curDist = data.corner[i].distanceTo(coord);            if (curDist<minDist) {                ret = data.corner[i];                minDist = curDist;            }        }    }    if (dist!=NULL) {        *dist = minDist;    }    return ret;}/** * @todo Implement this. */RS_Vector RS_Solid::getNearestPointOnEntity(const RS_Vector& /*coord*/,        bool /*onEntity*/, double* /*dist*/, RS_Entity** /*entity*/) {    RS_Vector ret(false);    return ret;}RS_Vector RS_Solid::getNearestCenter(const RS_Vector& /*coord*/,                                     double* dist) {    if (dist!=NULL) {        *dist = RS_MAXDOUBLE;    }    return RS_Vector(false);}RS_Vector RS_Solid::getNearestMiddle(const RS_Vector& /*coord*/,                                     double* dist) {    if (dist!=NULL) {        *dist = RS_MAXDOUBLE;    }    return RS_Vector(false);}RS_Vector RS_Solid::getNearestDist(double /*distance*/,                                   const RS_Vector& /*coord*/,                                   double* dist) {    if (dist!=NULL) {        *dist = RS_MAXDOUBLE;    }    return RS_Vector(false);}/** * @return Distance from one of the boundry lines of this solid to given point. * * @todo implement */double RS_Solid::getDistanceToPoint(const RS_Vector& /*coord*/,                                    RS_Entity** /*entity*/,                                    RS2::ResolveLevel /*level*/,								    double /*solidDist*/) {    return RS_MAXDOUBLE;}void RS_Solid::move(RS_Vector offset) {    for (int i=0; i<4; ++i) {        data.corner[i].move(offset);    }    calculateBorders();}void RS_Solid::rotate(RS_Vector center, double angle) {    for (int i=0; i<4; ++i) {        data.corner[i].rotate(center, angle);    }    calculateBorders();}void RS_Solid::scale(RS_Vector center, RS_Vector factor) {    for (int i=0; i<4; ++i) {        data.corner[i].scale(center, factor);    }    calculateBorders();}void RS_Solid::mirror(RS_Vector axisPoint1, RS_Vector axisPoint2) {    for (int i=0; i<4; ++i) {        data.corner[i].mirror(axisPoint1, axisPoint2);    }    calculateBorders();}void RS_Solid::draw(RS_Painter* painter, RS_GraphicView* view, 	double /*patternOffset*/) {    if (painter==NULL || view==NULL) {        return;    }    RS_SolidData d = getData();    if (isTriangle()) {        painter->fillTriangle(view->toGui(getCorner(0)),                              view->toGui(getCorner(1)),                              view->toGui(getCorner(2)));    }}/** * Dumps the point's data to stdout. */std::ostream& operator << (std::ostream& os, const RS_Solid& p) {    os << " Solid: " << p.getData() << "\n";    return os;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -