00001 // $Id: SolidSubtraction.h,v 1.15 2007/03/16 15:57:09 cattanem Exp $ 00003 #ifndef DETDESC_SOLIDSUBTRACTION_H 00004 #define DETDESC_SOLIDSUBTRACTION_H 1 00005 00007 #include <algorithm> 00008 #include <functional> 00009 00011 #include "DetDesc/SolidBoolean.h" 00012 00014 class StatusCode; 00015 template <class TYPE> 00016 class SolidFactory; 00017 00026 class SolidSubtraction: public SolidBoolean 00027 { 00029 friend class SolidFactory<SolidSubtraction>; 00030 00031 public: 00032 00037 SolidSubtraction( const std::string& name , ISolid* first ); 00038 00040 virtual ~SolidSubtraction(); 00041 00042 public: 00043 00049 virtual std::string typeName ( ) const { return "SolidSubtraction" ; }; 00050 00060 bool isInside ( const Gaudi::XYZPoint& point ) const ; 00061 bool isInside ( const Gaudi::Polar3DPoint& point ) const ; 00062 bool isInside ( const Gaudi::RhoZPhiPoint& point ) const ; 00063 00069 StatusCode subtract 00070 ( ISolid* solid , 00071 const Gaudi::Transform3D* mtrx ); 00072 00079 StatusCode subtract 00080 ( ISolid* child , 00081 const Gaudi::XYZPoint& position , 00082 const Gaudi::Rotation3D& rotation = Gaudi::Rotation3D() ); 00083 00084 protected: 00085 00089 SolidSubtraction( const std::string& Name = "Anonymous Subtraction"); 00090 00091 private: 00092 00093 SolidSubtraction ( const SolidSubtraction& ) ; 00094 SolidSubtraction& operator=( const SolidSubtraction& ) ; 00095 00101 template <class aPoint> 00102 bool isInsideImpl(const aPoint& point) const; 00103 00104 }; 00105 00107 #endif 00108