/////////////////////////////////////////////////////////////////////////////// // Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). // All rights reserved. // // This software and its documentation and related materials are owned by // the Alliance. The software may only be incorporated into application // programs owned by members of the Alliance, subject to a signed // Membership Agreement and Supplemental Software License Agreement with the // Alliance. The structure and organization of this software are the valuable // trade secrets of the Alliance and its suppliers. The software is also // protected by copyright law and international treaty provisions. Application // programs incorporating this software must include the following statement // with their copyright notices: // // This application incorporates Teigha(R) software pursuant to a license // agreement with Open Design Alliance. // Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. // All rights reserved. // // By use of this software, its documentation or related materials, you // acknowledge and accept the above terms. /////////////////////////////////////////////////////////////////////////////// #ifndef OD_GETORUS_H #define OD_GETORUS_H /*!DOM*/ #include "OdPlatform.h" #include "Ge/GeSurface.h" #include "Ge/GeCircArc3d.h" #include "TD_PackPush.h" /** \details This class represents toroidal segments. \remarks The torus is surface generated by revolving a circular arc about an axis of symmetry, where the plane of the circular arc contains the axis of symmetry The torus is located in space by its center, which is a point on the axis of symmetry. The center of the circular arc is at a distance of majorRadius from the center of the torus. The radius of the circular arc is the minorRadius. Parameter U is the longitude (about the axis of symmetry), which for a closed torus defaults to the range [-OdaPI, OdaPI). Zero corresponds to the refAxis (which is a vector orthogonal to the axis of symmetry). Applying the right hand rule along the symmetric axis defines the increasing direction for U. Parameter v parameterizes the circular tube, which for a closed circle defaults to the range [-OdaPI, OdaPI). Applying the right hand rule along the refAxis X-axisOfSymmetry defines the increasing direction for v. The torus is periodic in U, v with a period of Oda2PI. [umin, umax] x [vmin, vmax] defines a four sided toroidal patch bounded by four circular arcs. Following constraints apply to the definition of a toroidal patch. * umin < umax and |umin - umax| <= Oda2PI. * vmin < vmax and |vmin - vmax| <= Oda2PI Library: TD_Ge */ class GE_TOOLKIT_EXPORT OdGeTorus : public OdGeSurface { public: /** \param majorRadius [in] The major *radius* of this *torus*. \param minorRadius [in] The minor *radius* of this *torus*. \param center [in] The origin of the this *torus*. \param axisOfSymmetry [in] Axis of symmetry (rotation). \param refAxis [in] defines thegle 0 about the axis of symmetry. \param startAngleU [in] Start angle about the axis of symmetry. \param endAngleU [in] End angle about the axis of symmetry. \param startAngleV [in] Start angle about the tube. \param endAngleV [in] End angle about the tube. \param source [in] Object to be cloned. */ OdGeTorus(); OdGeTorus( double majorRadius, double minorRadius, const OdGePoint3d& center, const OdGeVector3d& axisOfSymmetry); OdGeTorus( double majorRadius, double minorRadius, const OdGePoint3d& center, const OdGeVector3d& axisOfSymmetry, const OdGeVector3d& refAxis, double startAngleU, double endAngleU, double startAngleV, double endAngleV); OdGeTorus( const OdGeTorus& source); // Geometric properties. // /** \details Returns the major radius of this torus. */ double majorRadius() const; /** \details Returns the minor radius of this torus. */ double minorRadius() const; /** \details Returns the start and end angles about about the axis of symmetry. \param startAngleU [out] Receives the angle about the axis of symmetry. \param endAngleU [out] Receives the end angle about the axis of symmetry. */ void getAnglesInU( double& startAngleU, double& endAngleU) const; /** \details Returns the start and end angles about about the tube. \param startAngleV [out] Receives the start angle about the tube. \param endAngleV [out] Receives the end angle about the tube. */ void getAnglesInV( double& startAngleV, double& endAngleV) const; /** \details Returns the center of this torus. */ OdGePoint3d center() const; /** \details Returns the Axis of symmetry (rotation). */ OdGeVector3d axisOfSymmetry() const; /** \details Returns the reference axis. */ OdGeVector3d refAxis() const; /** \details Returns true if and only if the normal to this surface is pointing outward. */ bool isOuterNormal() const; /** \details Sets the major radius of this torus. \param majorRadius [in] The major radius of this torus. */ OdGeTorus& setMajorRadius( double radius); /** \details Sets the minor radius of this torus. \param minorRadius [in] The minor radius of this torus. */ OdGeTorus& setMinorRadius( double radius); /** \details Sets the start and end angles about about the axis of symmetry. \param startAngleU [in] Start angle about the axis of symmetry. \param endAngleU [in] End angle about the axis of symmetry. */ OdGeTorus& setAnglesInU( double startAngleU, double endAngleU); /** \details Sets the start and end angles about about the tube. \param startAngleV [in] Start angle about the tube. \param endAngleV [in] End angle about the tube. */ OdGeTorus& setAnglesInV( double startAngleV, double endAngleV); /** \details Sets the parameters for this torus according to the arguments. \param majorRadius [in] The major radius of this torus. \param minorRadius [in] The minor radius of this torus. \param center [in] The origin of the this torus. \param axisOfSymmetry [in] Axis of symmetry (rotation). \param refAxis [in] defines thegle 0 about the axis of symmetry. \param startAngleU [in] Start angle about the axis of symmetry. \param endAngleU [in] End angle about the axis of symmetry. \param startAngleV [in] Start angle about the tube. \param endAngleV [in] End angle about the tube. \remarks Returns a reference to this torus. */ OdGeTorus& set( double majorRadius, double minorRadius, const OdGePoint3d& center, const OdGeVector3d& axisOfSymmetry); OdGeTorus& set( double majorRadius, double minorRadius, const OdGePoint3d& center, const OdGeVector3d& axisOfSymmetry, const OdGeVector3d& refAxis, double startAngleU, double endAngleU, double startAngleV, double endAngleV); OdGeTorus& operator =( const OdGeTorus& torus); /** \details Returns True if the torus intersects with the specified line entity, and returns the number of intersections and the points of intersection. \param lineEnt [in] Any 3D line entity. \param numInt [out] Receives the number of intersections. \param p1 [out] Receives the first intersection point. \param p2 [out] Receives the second intersection point. \param p3 [out] Receives the third intersection point. \param p4 [out] Receives the fourth intersection point. \param tol [in] Geometric tolerance. \remarks * p1 is valid if and only if numInt > 0. * p2 is valid if and only if numInt > 1. * p3 is valid if and only if numInt > 2. * p4 is valid if and only if numInt > 3. */ bool intersectWith( const OdGeLinearEnt3d& linEnt, int& numInt, OdGePoint3d& p1, OdGePoint3d& p2, OdGePoint3d& p3, OdGePoint3d& p4, const OdGeTol& tol = OdGeContext::gTol) const; // Shape Classification Functions /** \details Returns true if and only if (majorRadius < 0) and (|majorRadius| < minorRadius), producing a solid with points along the axis of symmetry. \remarks Exactly one of the following functions will be true for a given torus: * isApple() * isDoughnut() * isLemon() * isVortex() */ bool isLemon() const; /** \details Returns true if and only if (0 < majorRadius < minorRadius), creating a solid with dimples at the axis of symmetry. \remarks Exactly one of the following functions will be true for a given torus: * isApple() * isDoughnut() * isLemon() * isVortex() */ bool isApple() const; /** \details Returns true if and only if (minorRadius == majorRadius), producing a donut. with a zero-radius hole. \remarks Exactly one of the following functions will be true for a given torus: * isApple() * isDoughnut() * isLemon() * isVortex() */ bool isVortex() const; /** \details Returns true if and only if (minorRadius < majorRadius), creating a solid with a hole in the middle. \remarks Exactly one of the following functions will be true for a given torus: * isApple() * isDoughnut() * isLemon() * isVortex() */ bool isDoughnut() const; /** \details Returns true if and only if (minorRadius <= 0) OR (majorRadius <= -minorRadius) */ bool isDegenerate() const; /** \details Returns true if and only if there is a hole in the torus. \remarks Returns true if and only if |majorRadius| > |minorRadius| + 1e-10 */ bool isHollow() const; ////////////////////////////////////////////////////////////////////////// }; #include "TD_PackPop.h" #endif // OD_GETORUS_H