diff options
author | Ruben Undheim <ruben.undheim@gmail.com> | 2016-07-05 18:02:38 +0200 |
---|---|---|
committer | Ruben Undheim <ruben.undheim@gmail.com> | 2016-07-05 18:02:38 +0200 |
commit | ef962f6008f25ab7cbd4ca21bcc72b97a1e2d76f (patch) | |
tree | 8149bee93d1a3f91d4503bfb3853adac4af0a85e /CSXCAD/src/CSPrimRotPoly.cpp |
Imported Upstream version 0.0.34
Diffstat (limited to 'CSXCAD/src/CSPrimRotPoly.cpp')
-rw-r--r-- | CSXCAD/src/CSPrimRotPoly.cpp | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/CSXCAD/src/CSPrimRotPoly.cpp b/CSXCAD/src/CSPrimRotPoly.cpp new file mode 100644 index 0000000..705b08e --- /dev/null +++ b/CSXCAD/src/CSPrimRotPoly.cpp @@ -0,0 +1,191 @@ +/* +* Copyright (C) 2008-2012 Thorsten Liebig (Thorsten.Liebig@gmx.de) +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License as published +* by the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* 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 Lesser General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <sstream> +#include <iostream> +#include <limits> +#include "tinyxml.h" +#include "stdint.h" +#include <math.h> + +#include "CSPrimRotPoly.h" +#include "CSProperties.h" +#include "CSUseful.h" + +CSPrimRotPoly::CSPrimRotPoly(unsigned int ID, ParameterSet* paraSet, CSProperties* prop) : CSPrimPolygon(ID,paraSet,prop) +{ + Type=ROTPOLY; + m_RotAxisDir=0; + PrimTypeName = std::string("RotPoly"); +} + +CSPrimRotPoly::CSPrimRotPoly(CSPrimRotPoly* primRotPoly, CSProperties *prop) : CSPrimPolygon(primRotPoly,prop) +{ + Type=ROTPOLY; + m_RotAxisDir=primRotPoly->m_RotAxisDir; + PrimTypeName = std::string("RotPoly"); +} + +CSPrimRotPoly::CSPrimRotPoly(ParameterSet* paraSet, CSProperties* prop) : CSPrimPolygon(paraSet,prop) +{ + Type=ROTPOLY; + m_RotAxisDir=0; + PrimTypeName = std::string("RotPoly"); +} + +CSPrimRotPoly::~CSPrimRotPoly() +{ +} + +bool CSPrimRotPoly::IsInside(const double* inCoord, double /*tol*/) +{ + if (inCoord==NULL) return false; + + double Coord[3]; + //transform incoming coordinates into cartesian coords + TransformCoordSystem(inCoord,Coord,m_MeshType,CARTESIAN); + if (m_Transform && Type==ROTPOLY) + TransformCoords(Coord,true, CARTESIAN); + + double origin[3]={0,0,0}; + double dir[3]={0,0,0}; + dir[m_RotAxisDir] = 1; + double foot; + double dist; + Point_Line_Distance(Coord, origin, dir, foot, dist); + + int raP = (m_RotAxisDir+1)%3; + int raPP = (m_RotAxisDir+2)%3; + double alpha = atan2(Coord[raPP],Coord[raP]); + if (raP == m_NormDir) + alpha=alpha-M_PI/2; + if (alpha<0) + alpha+=2*M_PI; + + origin[0] = dist;origin[1] = dist;origin[2] = dist; + origin[m_NormDir] = 0; + origin[m_RotAxisDir] = foot; + + if (alpha<m_StartStopAng[0]) + alpha+=2*M_PI; + + if ((CSPrimPolygon::IsInside(origin)) && (alpha<m_StartStopAng[1])) + return true; + + dist*=-1; + alpha=alpha+M_PI; + if (alpha>2*M_PI) + alpha-=2*M_PI; + + if (alpha<m_StartStopAng[0]) + alpha+=2*M_PI; + + if (alpha>m_StartStopAng[1]) + return false; + + origin[0] = dist;origin[1] = dist;origin[2] = dist; + origin[m_NormDir] = 0; + origin[m_RotAxisDir] = foot; + return CSPrimPolygon::IsInside(origin); +} + + +bool CSPrimRotPoly::Update(std::string *ErrStr) +{ + int EC=0; + bool bOK = CSPrimPolygon::Update(ErrStr); + + EC=StartStopAngle[0].Evaluate(); + if (EC!=ParameterScalar::NO_ERROR) bOK=false; + if ((EC!=ParameterScalar::NO_ERROR) && (ErrStr!=NULL)) + { + bOK=false; + std::stringstream stream; + stream << std::endl << "Error in RotPoly Start Angle (ID: " << uiID << "): "; + ErrStr->append(stream.str()); + PSErrorCode2Msg(EC,ErrStr); + } + + EC=StartStopAngle[1].Evaluate(); + if (EC!=ParameterScalar::NO_ERROR) bOK=false; + if ((EC!=ParameterScalar::NO_ERROR) && (ErrStr!=NULL)) + { + bOK=false; + std::stringstream stream; + stream << std::endl << "Error in RotPoly Stop Angle (ID: " << uiID << "): "; + ErrStr->append(stream.str()); + PSErrorCode2Msg(EC,ErrStr); + } + + // make angle range to 0..2*M_PI & stop > start! + m_StartStopAng[0]=StartStopAngle[0].GetValue(); + m_StartStopAng[1]=StartStopAngle[1].GetValue(); + if (m_StartStopAng[0]>m_StartStopAng[1]) + m_StartStopAng[1]+=2*M_PI; + if (m_StartStopAng[0]>2*M_PI) + { + m_StartStopAng[0]-=2*M_PI; + m_StartStopAng[1]-=2*M_PI; + } + if (m_StartStopAng[0]<0) + { + m_StartStopAng[0]+=2*M_PI; + m_StartStopAng[1]+=2*M_PI; + } + + //update local bounding box + m_BoundBoxValid = GetBoundBox(m_BoundBox); + + return bOK; +} + +bool CSPrimRotPoly::Write2XML(TiXmlElement &elem, bool parameterised) +{ + CSPrimPolygon::Write2XML(elem,parameterised); + + elem.SetAttribute("RotAxisDir",m_RotAxisDir); + + TiXmlElement Ang("Angles"); + WriteTerm(StartStopAngle[0],Ang,"Start",parameterised); + WriteTerm(StartStopAngle[1],Ang,"Stop",parameterised); + elem.InsertEndChild(Ang); + return true; +} + +bool CSPrimRotPoly::ReadFromXML(TiXmlNode &root) +{ + if (CSPrimPolygon::ReadFromXML(root)==false) return false; + + if (Elevation.GetValue()!=0) + std::cerr << __func__ << ": Warning: An elevation for a rotational poly is not supported! Skipping!" << std::endl; + Elevation.SetValue(0); + + TiXmlElement *elem = root.ToElement(); + if (elem==NULL) return false; + + int help; + if (elem->QueryIntAttribute("RotAxisDir",&help)!=TIXML_SUCCESS) + return false; + m_RotAxisDir=help; + + TiXmlElement *NV=elem->FirstChildElement("Angles"); + if (NV==NULL) return false; + if (ReadTerm(StartStopAngle[0],*NV,"Start")==false) return false; + if (ReadTerm(StartStopAngle[1],*NV,"Stop")==false) return false; + + return true; +} |