summaryrefslogtreecommitdiff
path: root/CSXCAD/src/CSPrimSphericalShell.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'CSXCAD/src/CSPrimSphericalShell.cpp')
-rw-r--r--CSXCAD/src/CSPrimSphericalShell.cpp134
1 files changed, 134 insertions, 0 deletions
diff --git a/CSXCAD/src/CSPrimSphericalShell.cpp b/CSXCAD/src/CSPrimSphericalShell.cpp
new file mode 100644
index 0000000..73f2d82
--- /dev/null
+++ b/CSXCAD/src/CSPrimSphericalShell.cpp
@@ -0,0 +1,134 @@
+/*
+* 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 "CSPrimSphericalShell.h"
+#include "CSProperties.h"
+#include "CSUseful.h"
+
+CSPrimSphericalShell::CSPrimSphericalShell(unsigned int ID, ParameterSet* paraSet, CSProperties* prop) : CSPrimSphere(ID,paraSet,prop)
+{
+ Type=SPHERICALSHELL;
+ PrimTypeName = std::string("SphericalShell");
+ psShellWidth.SetParameterSet(paraSet);
+}
+
+CSPrimSphericalShell::CSPrimSphericalShell(CSPrimSphericalShell* sphere, CSProperties *prop) : CSPrimSphere(sphere,prop)
+{
+ Type=SPHERICALSHELL;
+ PrimTypeName = std::string("SphericalShell");
+ psShellWidth.Copy(&sphere->psShellWidth);
+}
+
+CSPrimSphericalShell::CSPrimSphericalShell(ParameterSet* paraSet, CSProperties* prop) : CSPrimSphere(paraSet,prop)
+{
+ Type=SPHERICALSHELL;
+ PrimTypeName = std::string("SphericalShell");
+ psShellWidth.SetParameterSet(paraSet);
+}
+
+
+CSPrimSphericalShell::~CSPrimSphericalShell()
+{
+}
+
+bool CSPrimSphericalShell::GetBoundBox(double dBoundBox[6], bool PreserveOrientation)
+{
+ UNUSED(PreserveOrientation); //has no orientation or preserved anyways
+ const double* center = m_Center.GetCartesianCoords();
+ m_BoundBox_CoordSys=CARTESIAN;
+ double radius = psRadius.GetValue();
+ double shellwidth = psShellWidth.GetValue();
+ for (unsigned int i=0;i<3;++i)
+ {
+ dBoundBox[2*i]=center[i]-radius-shellwidth/2.0;
+ dBoundBox[2*i+1]=center[i]+radius+shellwidth/2.0;
+ }
+ if (shellwidth>0)
+ m_Dimension=3;
+ else if (radius>0)
+ m_Dimension=1;
+ else
+ m_Dimension=0;
+ return true;
+}
+
+bool CSPrimSphericalShell::IsInside(const double* Coord, double /*tol*/)
+{
+ if (Coord==NULL) return false;
+ double out[3];
+ const double* center = m_Center.GetCartesianCoords();
+ TransformCoordSystem(Coord,out,m_MeshType,CARTESIAN);
+ if (m_Transform)
+ m_Transform->InvertTransform(out,out);
+ double dist=sqrt(pow(out[0]-center[0],2)+pow(out[1]-center[1],2)+pow(out[2]-center[2],2));
+ if (fabs(dist-psRadius.GetValue())< psShellWidth.GetValue()/2.0)
+ return true;
+ return false;
+}
+
+bool CSPrimSphericalShell::Update(std::string *ErrStr)
+{
+ int EC=0;
+ bool bOK=CSPrimSphere::Update(ErrStr);
+
+ EC=psShellWidth.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 " << PrimTypeName << " shell-width (ID: " << uiID << "): ";
+ ErrStr->append(stream.str());
+ PSErrorCode2Msg(EC,ErrStr);
+ }
+
+ //update local bounding box
+ m_BoundBoxValid = GetBoundBox(m_BoundBox);
+
+ return bOK;
+}
+
+bool CSPrimSphericalShell::Write2XML(TiXmlElement &elem, bool parameterised)
+{
+ CSPrimSphere::Write2XML(elem,parameterised);
+
+ WriteTerm(psShellWidth,elem,"ShellWidth",parameterised);
+ return true;
+}
+
+bool CSPrimSphericalShell::ReadFromXML(TiXmlNode &root)
+{
+ if (CSPrimSphere::ReadFromXML(root)==false) return false;
+
+ TiXmlElement *elem = root.ToElement();
+ if (elem==NULL) return false;
+ if (ReadTerm(psShellWidth,*elem,"ShellWidth")==false) return false;
+
+ return true;
+}
+
+void CSPrimSphericalShell::ShowPrimitiveStatus(std::ostream& stream)
+{
+ CSPrimSphere::ShowPrimitiveStatus(stream);
+ stream << " Shell width: " << psShellWidth.GetValueString() << std::endl;
+}