/* * Copyright (C) 2008,2009,2010 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 . */ #pragma once /* * Author: Thorsten Liebig * Date: 03-12-2008 * Lib: CSXCAD * Version: 0.1a */ #include #include #include #include "ParameterObjects.h" #include "ParameterCoord.h" #include "CSXCAD_Global.h" class CSPrimPoint; class CSPrimBox; class CSPrimMultiBox; class CSPrimSphere; class CSPrimSphericalShell; class CSPrimCylinder; class CSPrimCylindricalShell; class CSPrimPolygon; class CSPrimLinPoly; class CSPrimRotPoly; class CSPrimPolyhedron; class CSPrimPolyhedronReader; class CSPrimCurve; class CSPrimWire; class CSPrimUserDefined; class CSProperties; //include VisualProperties class TiXmlNode; class CSFunctionParser; class CSTransform; /*! Calculate the distance of a point to a line (defined by start/stop coordinates). Foot will return the normalized foot-point on the line. A value between 0..1 means the foot-point is one the given line. foot == 0 --> foot-point is on start, foot == 1 --> foot-point is on stop */ void CSXCAD_EXPORT Point_Line_Distance(const double P[], const double start[], const double stop[], double &foot, double &dist, CoordinateSystem c_system=UNDEFINED_CS); bool CSXCAD_EXPORT CoordInRange(const double* p, const double* start, const double* stop, CoordinateSystem cs_in); //! Abstract base class for different geometrical primitives. /*! This is an abstract base class for different geometrical primitives like boxes, spheres, cylinders etc. !!! Tolerances not yet obeyed !!! */ class CSXCAD_EXPORT CSPrimitives { public: virtual ~CSPrimitives(); virtual void Init(); //! Primitive type definitions. enum PrimitiveType { POINT,BOX,MULTIBOX,SPHERE,SPHERICALSHELL,CYLINDER,CYLINDRICALSHELL,POLYGON,LINPOLY,ROTPOLY,POLYHEDRON,CURVE,WIRE,USERDEFINED, POLYHEDRONREADER }; //! Set or change the property for this primitive. void SetProperty(CSProperties *prop); //! Get the property for this primitive. CSProperties* GetProperty() {return clProperty;} //! Getthe unique ID for this primitive. unsigned int GetID() {return uiID;} //! Change the unique ID for this primitive. This is not recommended! Be sure what you are doing! void SetID(unsigned int ID) {uiID=ID;} //! Get the type of this primitive. \sa PrimitiveType int GetType() {return Type;} std::string GetTypeName() {return PrimTypeName;} //! Create a copy of ths primitive with different property. virtual CSPrimitives* GetCopy(CSProperties *prop=NULL) {return new CSPrimitives(this,prop);} //! Get the bounding box (for the given mesh type) for this special primitive. \sa GetBoundBoxCoordSystem virtual bool GetBoundBox(double dBoundBox[6], bool PreserveOrientation=false) {UNUSED(PreserveOrientation);UNUSED(dBoundBox);return false;} virtual CoordinateSystem GetBoundBoxCoordSystem() const {return m_BoundBox_CoordSys;} //! Get the dimension of this primitive virtual int GetDimension() {return m_Dimension;} //! Check if given Coordinate (in the given mesh type) is inside the Primitive. virtual bool IsInside(const double* Coord, double tol=0) {UNUSED(Coord);UNUSED(tol);return false;} //! Check if the primitive is inside a given box (box must be specified in the bounding box coordinate system) //! @return -1 if not, +1 if it is, 0 if unknown virtual int IsInsideBox(const double* boundbox); //! Check whether this primitive was used. (--> IsInside() return true) \sa SetPrimitiveUsed bool GetPrimitiveUsed() {return m_Primtive_Used;} //! Set the primitve uses flag. \sa GetPrimitiveUsed void SetPrimitiveUsed(bool val) {m_Primtive_Used=val;} //! Set or change the priotity for this primitive. void SetPriority(int val) {iPriority=val;} //! Get the priotity for this primitive. int GetPriority() {return iPriority;} //! Update this primitive with respect to the parameters set. virtual bool Update(std::string *ErrStr=NULL) {UNUSED(ErrStr);return true;} //! Write this primitive to a XML-node. virtual bool Write2XML(TiXmlElement &elem, bool parameterised=true); //! Read this primitive from a XML-node. virtual bool ReadFromXML(TiXmlNode &root); //! Get the corresponing Box-Primitive or NULL in case of different type. CSPrimBox* ToBox() { return ( this && Type == BOX ) ? (CSPrimBox*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing MultiBox-Primitive or NULL in case of different type. CSPrimMultiBox* ToMultiBox() { return ( this && Type == MULTIBOX ) ? (CSPrimMultiBox*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Sphere-Primitive or NULL in case of different type. CSPrimSphere* ToSphere() { return ( this && Type == SPHERE ) ? (CSPrimSphere*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing SphereicalShell-Primitive or NULL in case of different type. CSPrimSphericalShell* ToSphericalShell() { return ( this && Type == SPHERICALSHELL ) ? (CSPrimSphericalShell*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Cylinder-Primitive or NULL in case of different type. CSPrimCylinder* ToCylinder() { return ( this && Type == CYLINDER ) ? (CSPrimCylinder*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing CylindricalShell-Primitive or NULL in case of different type. CSPrimCylindricalShell* ToCylindricalShell() { return ( this && Type == CYLINDRICALSHELL ) ? (CSPrimCylindricalShell*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Polygon-Primitive or NULL in case of different type. CSPrimPolygon* ToPolygon() { return ( this && Type == POLYGON ) ? (CSPrimPolygon*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing LinPoly-Primitive or NULL in case of different type. CSPrimLinPoly* ToLinPoly() { return ( this && Type == LINPOLY ) ? (CSPrimLinPoly*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Cylinder-Primitive or NULL in case of different type. CSPrimRotPoly* ToRotPoly() { return ( this && Type == ROTPOLY ) ? (CSPrimRotPoly*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Polyhedron-Primitive or NULL in case of different type. CSPrimPolyhedron* ToPolyhedron() { return ( this && Type == POLYHEDRON ) ? (CSPrimPolyhedron*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Polyhedron-Import-Primitive or NULL in case of different type. CSPrimPolyhedronReader* ToPolyhedronReader() { return ( this && Type == POLYHEDRONREADER ) ? (CSPrimPolyhedronReader*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Curve-Primitive or NULL in case of different type. CSPrimCurve* ToCurve() { return ( this && Type == CURVE ) ? (CSPrimCurve*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Wire-Primitive or NULL in case of different type. CSPrimWire* ToWire() { return ( this && Type == WIRE ) ? (CSPrimWire*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing UserDefined-Primitive or NULL in case of different type. CSPrimUserDefined* ToUserDefined() { return ( this && Type == USERDEFINED ) ? (CSPrimUserDefined*) this : 0; } /// Cast Primitive to a more defined type. Will return null if not of the requested type. //! Get the corresponing Point-Primitive or 0 in case of different type. CSPrimPoint* ToPoint() { return ( this && Type == POINT ) ? (CSPrimPoint*) this : 0; } //!< Cast Primitive to a more defined type. Will return 0 if not of the requested type. bool operator<(CSPrimitives& vgl) { return iPriority(CSPrimitives& vgl) { return iPriority>vgl.GetPriority();} bool operator==(CSPrimitives& vgl) { return iPriority==vgl.GetPriority();} bool operator!=(CSPrimitives& vgl) { return iPriority!=vgl.GetPriority();} //! Define the input type for the weighting coordinate system 0=cartesian, 1=cylindrical, 2=spherical void SetCoordInputType(CoordinateSystem type, bool doUpdate=true) {m_MeshType=type; if (doUpdate) Update();} //! Get the input type for the weighting coordinate system 0=cartesian, 1=cylindrical, 2=spherical CoordinateSystem GetCoordInputType() const {return m_MeshType;} //! Define the coordinate system this primitive is defined in (may be different to the input mesh type) \sa SetCoordInputType void SetCoordinateSystem(CoordinateSystem cs) {m_PrimCoordSystem=cs;} //! Read the coordinate system for this primitive (may be different to the input mesh type) \sa GetCoordInputType CoordinateSystem GetCoordinateSystem() const {return m_PrimCoordSystem;} //! Get the CSTransform if it exists already or create a new one CSTransform* GetTransform(); //! Show status of this primitve virtual void ShowPrimitiveStatus(std::ostream& stream); protected: CSPrimitives(ParameterSet* paraSet, CSProperties* prop); CSPrimitives(CSPrimitives* prim, CSProperties *prop=NULL); CSPrimitives(unsigned int ID, ParameterSet* paraSet, CSProperties* prop); //! Apply (invers) transformation to the given coordinate in the given coordinate system void TransformCoords(double* Coord, bool invers, CoordinateSystem cs_in) const; unsigned int uiID; int iPriority; CoordinateSystem m_PrimCoordSystem; CoordinateSystem m_MeshType; PrimitiveType Type; ParameterSet* clParaSet; CSProperties* clProperty; CSTransform* m_Transform; std::string PrimTypeName; bool m_Primtive_Used; //internal bounding box, updated by Update(), can be used to speedup IsInside bool m_BoundBoxValid; double m_BoundBox[6]; CoordinateSystem m_BoundBox_CoordSys; int m_Dimension; };