/**************************************************************************** ** ** This file is part of the LibreCAD project, a 2D CAD program ** ** Copyright (C) 2010 R. van Twisk (librecad@rvt.dds.nl) ** Copyright (C) 2001-2003 RibbonSoft. All rights reserved. ** ** ** 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 gpl-2.0.txt included in the ** packaging of this file. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software ** Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA ** ** This copyright notice MUST APPEAR in all copies of the script! ** **********************************************************************/ #include "rs_grid.h" #include "rs_units.h" #include "rs_graphic.h" #include "rs_settings.h" /** * Constructor. */ RS_Grid::RS_Grid(RS_GraphicView* graphicView): baseGrid(false) { this->graphicView = graphicView; pt = NULL; number = 0; metaX = NULL; numMetaX = 0; metaY = NULL; numMetaY = 0; } /** * Destructor. */ RS_Grid::~RS_Grid() { if (pt!=NULL) { delete[] pt; } if (metaX!=NULL) { delete[] metaX; } if (metaY!=NULL) { delete[] metaY; } } /** * find the closest grid point *@return the closest grid to given point *@coord: the given point */ RS_Vector RS_Grid::snapGrid(const RS_Vector& coord) const { if( cellV.xprint("RS_Grid::update"); if (graphicView->isGridOn()) { RS_Graphic* graphic = graphicView->getGraphic(); // auto scale grid? RS_SETTINGS->beginGroup("/Appearance"); bool scaleGrid = (bool)RS_SETTINGS->readNumEntry("/ScaleGrid", 1); if(graphic==NULL){ isometric = (bool)RS_SETTINGS->readNumEntry("/IsometricGrid", 0); crosshairType=static_cast(RS_SETTINGS->readNumEntry("/CrosshairType",0)); } int minGridSpacing = RS_SETTINGS->readNumEntry("/MinGridSpacing", 10); RS_SETTINGS->endGroup(); // get grid setting RS_Vector userGrid; if (graphic!=NULL) { isometric = static_cast(graphic->getVariableInt("$ISOMETRICGRID",0)); crosshairType=graphic->getCrosshairType(); userGrid = graphic->getVariableVector("$GRIDUNIT", RS_Vector(-1.0, -1.0)); } //std::cout<<"Grid userGrid="<print("RS_Grid::update: 001"); // find out unit: RS2::Unit unit = RS2::None; RS2::LinearFormat format = RS2::Decimal; if (graphic!=NULL) { unit = graphic->getUnit(); format = graphic->getLinearFormat(); } RS_Vector gridWidth; // RS_Vector metaGridWidth; // RS_DEBUG->print("RS_Grid::update: 002"); // init grid spacing: // metric grid: if (RS_Units::isMetric(unit) || unit==RS2::None || format==RS2::Decimal || format==RS2::Engineering) { if (userGrid.x>0.0) { gridWidth.x = userGrid.x; } else { gridWidth.x = 0.000001; } if (userGrid.y>0.0) { gridWidth.y = userGrid.y; } else { gridWidth.y = 0.000001; } // RS_DEBUG->print("RS_Grid::update: 003"); // auto scale grid //scale grid by drawing setting as well, bug#3416862 if (scaleGrid|| userGrid.x<=1e-6 || userGrid.y<=1e-6) { if(scaleGrid || userGrid.x<=1e-6) { while (graphicView->toGuiDX(gridWidth.x)toGuiDY(gridWidth.y)print("RS_Grid::update: 004"); } // imperial grid: else { // RS_DEBUG->print("RS_Grid::update: 005"); if (userGrid.x>0.0) { gridWidth.x = userGrid.x; } else { gridWidth.x = 1.0/1024.0; } if (userGrid.y>0.0) { gridWidth.y = userGrid.y; } else { gridWidth.y = 1.0/1024.0; } // RS_DEBUG->print("RS_Grid::update: 006"); if (unit==RS2::Inch) { // RS_DEBUG->print("RS_Grid::update: 007"); // auto scale grid //scale grid by drawing setting as well, bug#3416862 if (scaleGrid|| userGrid.x<=1e-6 || userGrid.y<=1e-6) { if(scaleGrid || userGrid.x<=1e-6) { while (graphicView->toGuiDX(gridWidth.x)=36) { gridWidth.x*=2; } else if (RS_Math::round(gridWidth.x)>=12) { gridWidth.x*=3; } else if (RS_Math::round(gridWidth.x)>=4) { gridWidth.x*=3; } else if (RS_Math::round(gridWidth.x)>=1) { gridWidth.x*=2; } else { gridWidth.x*=2; } } } if(scaleGrid || userGrid.y<=1e-6) { while (graphicView->toGuiDY(gridWidth.y)=36) { gridWidth.y*=2; } else if (RS_Math::round(gridWidth.y)>=12) { gridWidth.y*=3; } else if (RS_Math::round(gridWidth.y)>=4) { gridWidth.y*=3; } else if (RS_Math::round(gridWidth.y)>=1) { gridWidth.y*=2; } else { gridWidth.y*=2; } } } } // RS_DEBUG->print("RS_Grid::update: 008"); // metagrid X shows inches.. metaGridWidth.x = 1.0; if (graphicView->toGuiDX(metaGridWidth.x)toGuiDX(metaGridWidth.x)toGuiDX(metaGridWidth.x)<20) { // metaGridWidth.x = 63360.0; //} // .. or nothing if (graphicView->toGuiDX(metaGridWidth.x)print("RS_Grid::update: 009"); // metagrid Y shows inches.. metaGridWidth.y = 1.0; if (graphicView->toGuiDY(metaGridWidth.y)toGuiDY(metaGridWidth.y)toGuiDY(metaGridWidth.y)<20) { // metaGridWidth.y = 63360.0; //} // .. or nothing if (graphicView->toGuiDY(metaGridWidth.y)print("RS_Grid::update: 010"); } else { // RS_DEBUG->print("RS_Grid::update: 011"); if (scaleGrid) { while (graphicView->toGuiDX(gridWidth.x)toGuiDY(gridWidth.y)print("RS_Grid::update: 012"); } //gridWidth.y = gridWidth.x; //metaGridWidth.y = metaGridWidth.x; } // RS_DEBUG->print("RS_Grid::update: 013"); // for grid info: spacing = gridWidth.x; metaSpacing = metaGridWidth.x; //std::cout<<"Grid spacing="<0 && number<1000000) { pt = new RS_Vector[number]; int i=0; RS_Vector bp0(baseGrid); for (int y=0; y1.0e-6 && metaGridWidth.y>1.0e-6 && graphicView->toGuiDX(metaGridWidth.x)>2 && graphicView->toGuiDY(metaGridWidth.y)>2) { double mleft = (int)(graphicView->toGraphX(0) / metaGridWidth.x) * metaGridWidth.x; double mright = (int)(graphicView->toGraphX(graphicView->getWidth()) / metaGridWidth.x) * metaGridWidth.x; double mtop = (int)(graphicView->toGraphY(0) / metaGridWidth.y) * metaGridWidth.y; double mbottom = (int)(graphicView->toGraphY(graphicView->getHeight()) / metaGridWidth.y) * metaGridWidth.y; mleft -= metaGridWidth.x; mright += metaGridWidth.x; mtop += metaGridWidth.y; mbottom -= metaGridWidth.y; // calculate number of visible meta grid lines: numMetaX = (RS_Math::round((mright-mleft) / metaGridWidth.x) + 1); numMetaY = (RS_Math::round((mtop-mbottom) / metaGridWidth.y) + 1); if (numMetaX>0 && numMetaY>0) { // create meta grid arrays: metaX = new double[numMetaX]; metaY = new double[numMetaY]; int i=0; for (int x=0; xprint("RS_Grid::update: 015"); } } // RS_DEBUG->print("RS_Grid::update: OK"); } // EOF