/*************************************************************************** * Copyright (c) Juergen Riegel * * * * This file is part of the FreeCAD CAx development system. * * * * This library is free software; you can redistribute it and/or * * modify it under the terms of the GNU Library General Public * * License as published by the Free Software Foundation; either * * version 2 of the License, or (at your option) any later version. * * * * This library 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 Library General Public License for more details. * * * * You should have received a copy of the GNU Library General Public * * License along with this library; see the file COPYING.LIB. If not, * * write to the Free Software Foundation, Inc., 59 Temple Place, * * Suite 330, Boston, MA 02111-1307, USA * * * ***************************************************************************/ #include "PreCompiled.h" #ifndef _PreComp_ #ifdef FC_OS_LINUX # include #endif # include #endif #include "PointsAlgos.h" #include "Points.h" #include #include #include #include #include #include using namespace Points; void PointsAlgos::Load(PointKernel &points, const char *FileName) { Base::FileInfo File(FileName); // checking on the file if (!File.isReadable()) throw Base::FileException("File to load not existing or not readable", FileName); if (File.extension() == "asc" ||File.extension() == "ASC") LoadAscii(points,FileName); else throw Base::Exception("Unknown ending"); } void PointsAlgos::LoadAscii(PointKernel &points, const char *FileName) { boost::regex rx("^\\s*([-+]?[0-9]*)\\.?([0-9]+([eE][-+]?[0-9]+)?)" "\\s+([-+]?[0-9]*)\\.?([0-9]+([eE][-+]?[0-9]+)?)" "\\s+([-+]?[0-9]*)\\.?([0-9]+([eE][-+]?[0-9]+)?)\\s*$"); //boost::regex rx("(\\b[0-9]+\\.([0-9]+\\b)?|\\.[0-9]+\\b)"); //boost::regex rx("^\\s*(-?[0-9]*)\\.([0-9]+)\\s+(-?[0-9]*)\\.([0-9]+)\\s+(-?[0-9]*)\\.([0-9]+)\\s*$"); boost::cmatch what; Base::Vector3d pt; int LineCnt=0; std::string line; Base::FileInfo fi(FileName); Base::ifstream tmp_str(fi, std::ios::in); // estimating size while (std::getline(tmp_str,line)) LineCnt++; // resize the PointKernel points.resize(LineCnt); Base::SequencerLauncher seq( "Loading points...", LineCnt ); // again to the beginning Base::ifstream file(fi, std::ios::in); LineCnt = 0; try { // read file while (std::getline(file, line)) { if (boost::regex_match(line.c_str(), what, rx)) { pt.x = std::atof(what[1].first); pt.y = std::atof(what[4].first); pt.z = std::atof(what[7].first); points.setPoint(LineCnt,pt); seq.next(); LineCnt++; } } } catch (...) { points.clear(); throw Base::Exception("Reading in points failed."); } // now remove the last points from the kernel // Note: first we allocate memory corresponding to the number of lines (points and comments) // and read in the file twice. But then the size of the kernel is too high if (LineCnt < (int)points.size()) points.erase(LineCnt, points.size()); }