FDO API Reference Feature Data Objects

DirectPositionImpl.h

Go to the documentation of this file.
00001 #ifndef _DIRECTPOSITIONIMPL_H_
00002 #define _DIRECTPOSITIONIMPL_H_
00003 
00004 //
00005 // Copyright (C) 2004-2006  Autodesk, Inc.
00006 // 
00007 // This library is free software; you can redistribute it and/or
00008 // modify it under the terms of version 2.1 of the GNU Lesser
00009 // General Public License as published by the Free Software Foundation.
00010 // 
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 // Lesser General Public License for more details.
00015 // 
00016 // You should have received a copy of the GNU Lesser General Public
00017 // License along with this library; if not, write to the Free Software
00018 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00019 //
00020 
00021 
00022 
00023 #ifdef _WIN32
00024 #pragma once
00025 #endif
00026 
00027 #include <FdoCommon.h>
00028 #include <Common/Dimensionality.h>
00029 #include <Geometry/IDirectPosition.h>
00030 
00031 /// \brief
00032 /// The FdoDirectPositionImpl class is a default implementation of FdoIDirectPosition.
00033 /// FdoDirectPositionImpl implements accessors from FdoIDirectPosition, matching mutators, and simple data members.
00034 /// Assignment and exact equality operators are also provided.
00035 class FdoDirectPositionImpl : public FdoIDirectPosition
00036 {
00037 
00038 protected:
00039 /// \cond DOXYGEN-IGNORE
00040     /// Constructors
00041 
00042     /// \brief
00043     /// Constructs a default instance of a FdoDirectPositionImpl object.
00044     /// 
00045     /// \remarks
00046     ///  Ordinate values default to numeric_limits<double>::quiet_NaN().
00047     /// Dimensionality defaults to FdoDimensionality_XY.
00048     /// 
00049     /// \return
00050     /// Returns nothing
00051     /// 
00052     FDO_GEOM_API FdoDirectPositionImpl();
00053 
00054     /// \brief
00055     /// Constructs a 2D FdoDirectPositionImpl object from X and Y ordinates.
00056     /// 
00057     /// \remarks
00058     ///  Z and M ordinate values default to numeric_limits<double>::quiet_NaN().
00059     /// Dimensionality is set to FdoDimensionality_XY.
00060     /// 
00061     /// \param x 
00062     /// Input X ordinate value
00063     /// \param y 
00064     /// Input Y ordinate value
00065     /// 
00066     /// \return
00067     /// Returns nothing
00068     /// 
00069     FDO_GEOM_API FdoDirectPositionImpl(double x, double y);
00070 
00071     /// \brief
00072     /// Constructs a 3D FdoDirectPositionImpl object from X, Y and Z ordinates.
00073     /// 
00074     /// \remarks
00075     ///  M ordinate value defaults to numeric_limits<double>::quiet_NaN().
00076     /// Dimensionality is set to FdoDimensionality_XYZ.
00077     /// 
00078     /// \param x 
00079     /// Input X ordinate value
00080     /// \param y 
00081     /// Input Y ordinate value
00082     /// \param z 
00083     /// Input Z ordinate value
00084     /// 
00085     /// \return
00086     /// Returns nothing
00087     /// 
00088     FDO_GEOM_API FdoDirectPositionImpl(double x, double y, double z);
00089 
00090     /// \brief
00091     /// Constructs a 4D FdoDirectPositionImpl object from X, Y, Z and M ordinates.
00092     /// 
00093     /// \remarks
00094     ///  Dimensionality is set to FdoDimensionality_XYZ|FdoDimensionality_M.
00095     /// 
00096     /// \param x 
00097     /// Input X ordinate value
00098     /// \param y 
00099     /// Input Y ordinate value
00100     /// \param z 
00101     /// Input Z ordinate value
00102     /// \param m 
00103     /// Input M ordinate value
00104     /// 
00105     /// \return
00106     /// Returns nothing
00107     /// 
00108     FDO_GEOM_API FdoDirectPositionImpl(double x, double y, double z, double m);
00109 
00110     /// \brief
00111     /// Constructs a FdoDirectPositionImpl object by copying from an ordinate array.
00112     /// 
00113     /// \param dimensionality 
00114     /// Input dimensionality of the ordinates (see FdoDimensionality)
00115     /// \param ordinates 
00116     /// Input ordinate array
00117     /// 
00118     /// \return
00119     /// Returns a position
00120     /// 
00121     FDO_GEOM_API FdoDirectPositionImpl(FdoInt32 dimensionality, const double * ordinates);
00122 
00123     /// \brief
00124     /// Copy constructor for FdoDirectPositionImpl
00125     /// 
00126     /// \param position 
00127     /// Input position to copy
00128     /// 
00129     /// \return
00130     /// Returns nothing
00131     /// 
00132     FDO_GEOM_API FdoDirectPositionImpl(const FdoDirectPositionImpl& position);
00133 
00134     /// \brief
00135     /// Pseudo-copy constructor for FdoDirectPositionImpl
00136     /// 
00137     /// \remarks
00138     ///  Copies position data using only public methods of FdoIDirectPosition,
00139     /// thus supporting conversion from any implementation of the interface.
00140     /// 
00141     /// \param pos 
00142     /// Input position to copy
00143     /// 
00144     /// \return
00145     /// Returns nothing
00146     /// 
00147     FDO_GEOM_API FdoDirectPositionImpl(const FdoIDirectPosition* pos);
00148 
00149     /// Destructor
00150 
00151     /// \brief
00152     /// Default destructor.
00153     /// 
00154     /// \return
00155     /// Returns nothing
00156     /// 
00157     FDO_GEOM_API virtual ~FdoDirectPositionImpl();
00158 
00159 /// \endcond
00160 
00161 public:
00162 
00163     /// \brief
00164     /// Constructs a default instance of a FdoDirectPositionImpl object.
00165     /// 
00166     /// \remarks
00167     ///  Ordinate values default to numeric_limits<double>::quiet_NaN().
00168     /// Dimensionality defaults to FdoDimensionality_XY.
00169     /// 
00170     /// \return
00171     /// Returns a position
00172     /// 
00173     FDO_GEOM_API static FdoDirectPositionImpl* Create();
00174 
00175     /// \brief
00176     /// Constructs a 2D FdoDirectPositionImpl object from X and Y ordinates.
00177     /// 
00178     /// \remarks
00179     ///  Z and M ordinate values default to numeric_limits<double>::quiet_NaN().
00180     /// Dimensionality is set to FdoDimensionality_XY.
00181     /// 
00182     /// \param x 
00183     /// Input X ordinate value
00184     /// \param y 
00185     /// Input Y ordinate value
00186     /// 
00187     /// \return
00188     /// Returns a position
00189     /// 
00190     FDO_GEOM_API static FdoDirectPositionImpl* Create(double x, double y);
00191 
00192     /// \brief
00193     /// Constructs a 3D FdoDirectPositionImpl object from X, Y and Z ordinates.
00194     /// 
00195     /// \remarks
00196     ///  M ordinate value defaults to numeric_limits<double>::quiet_NaN().
00197     /// Dimensionality is set to FdoDimensionality_XY|FdoDimensionality_Z.
00198     /// 
00199     /// \param x 
00200     /// Input X ordinate value
00201     /// \param y 
00202     /// Input Y ordinate value
00203     /// \param z 
00204     /// Input Z ordinate value
00205     /// 
00206     /// \return
00207     /// Returns a position
00208     /// 
00209     FDO_GEOM_API static FdoDirectPositionImpl* Create(double x, double y, double z);
00210 
00211     /// \brief
00212     /// Constructs a 4D FdoDirectPositionImpl object from X, Y, Z and M ordinates.
00213     /// 
00214     /// \remarks
00215     ///  Dimensionality is set to FdoDimensionality_XY|FdoDimensionality_Z|FdoDimensionality_M.
00216     /// 
00217     /// \param x 
00218     /// Input X ordinate value
00219     /// \param y 
00220     /// Input Y ordinate value
00221     /// \param z 
00222     /// Input Z ordinate value
00223     /// \param m 
00224     /// Input M ordinate value
00225     /// 
00226     /// \return
00227     /// Returns a position
00228     /// 
00229     FDO_GEOM_API static FdoDirectPositionImpl* Create(double x, double y, double z, double m);
00230 
00231     /// \brief
00232     /// Constructs a FdoDirectPositionImpl object by copying from an ordinate array.
00233     /// 
00234     /// \param dimensionality 
00235     /// Input dimensionality of the ordinates (see FdoDimensionality)
00236     /// \param ordinates 
00237     /// Input ordinate array
00238     /// 
00239     /// \return
00240     /// Returns a position
00241     /// 
00242     FDO_GEOM_API static FdoDirectPositionImpl* Create(FdoInt32 dimensionality, const double* ordinates);
00243 
00244     /// \brief
00245     /// Constructs a copy of a FdoDirectPositionImpl
00246     /// 
00247     /// \param position 
00248     /// Input position to copy
00249     /// 
00250     /// \return
00251     /// Returns a position
00252     /// 
00253     FDO_GEOM_API static FdoDirectPositionImpl* Create(const FdoDirectPositionImpl& position);
00254 
00255     /// \brief
00256     /// Constructs a copy of a FdoDirectPositionImpl
00257     /// 
00258     /// \remarks
00259     ///  Copies position data using only public methods of FdoIDirectPosition,
00260     /// thus supporting conversion from any implementation of the interface.
00261     /// 
00262     /// \param pos 
00263     /// Input position to copy
00264     /// 
00265     /// \return
00266     /// Returns a position
00267     /// 
00268     FDO_GEOM_API static FdoDirectPositionImpl* Create(const FdoIDirectPosition* pos);
00269 
00270     /// \brief
00271     /// Assignment operator for FdoDirectPositionImpl.
00272     /// 
00273     /// \param position 
00274     /// Input position to copy
00275     /// 
00276     /// \return
00277     /// Returns a position
00278     /// 
00279     FDO_GEOM_API FdoDirectPositionImpl& operator=(const FdoDirectPositionImpl& position);
00280 
00281     /// \brief
00282     /// Assignment operator for FdoDirectPositionImpl from a FdoIDirectPosition, using public methods.
00283     /// 
00284     /// \param position 
00285     /// Input position to copy
00286     /// 
00287     /// \return
00288     /// Returns a position
00289     /// 
00290     FDO_GEOM_API FdoDirectPositionImpl& operator=(const FdoIDirectPosition& position);
00291 
00292     /// \brief
00293     /// Equality operator for FdoDirectPositionImpl.
00294     /// 
00295     /// \param rhs 
00296     /// Input position for comparison (right-hand-side of equation)
00297     /// 
00298     /// \return
00299     /// Returns true if all ordinates and dimensionality are exactly equal.
00300     /// 
00301     FDO_GEOM_API bool operator==(const FdoDirectPositionImpl& rhs) const;
00302 
00303     /// \brief
00304     /// Gets the X ordinate.
00305     /// 
00306     /// \return
00307     /// Returns the X ordinate; default is numeric_limits<double>::quiet_NaN()
00308     /// 
00309     FDO_GEOM_API double GetX() const;
00310 
00311     /// \brief
00312     /// Gets the Y ordinate.
00313     /// 
00314     /// \return
00315     /// Returns the Y ordinate; default is numeric_limits<double>::quiet_NaN()
00316     /// 
00317     FDO_GEOM_API double GetY() const;
00318 
00319     /// \brief
00320     /// Gets the Z ordinate.
00321     /// 
00322     /// \return
00323     /// Returns the Z ordinate; default is numeric_limits<double>::quiet_NaN()
00324     /// 
00325     FDO_GEOM_API double GetZ() const;
00326 
00327     /// \brief
00328     /// Gets the M ordinate.
00329     /// 
00330     /// \return
00331     /// Returns the M ordinate; default is numeric_limits<double>::quiet_NaN()
00332     /// 
00333     FDO_GEOM_API double GetM() const;
00334 
00335     /// \brief
00336     /// Gets the ordinates as an array.
00337     /// 
00338     /// \remarks
00339     /// The caller must not free the returned array.
00340     /// The ordinates are in the order XYZM, with only those present 
00341     /// according to the dimensionality.
00342     /// 
00343     /// \return
00344     /// Returns the ordinates
00345     /// 
00346     FDO_GEOM_API virtual const double * GetOrdinates();
00347 
00348     /// \brief
00349     /// Gets the dimensionality of ordinates in this position.
00350     /// 
00351     /// \remarks
00352     ///  Values are from the FdoDimensionality enumeration.
00353     /// A return type of "FdoInt32" is used instead of the enumeration, catering to typical use with bit masking.
00354     /// 
00355     /// \return
00356     /// Returns the ordinate dimensionality
00357     /// 
00358     FDO_GEOM_API FdoInt32 GetDimensionality() const;
00359 
00360     /// \brief
00361     /// Sets the X ordinate.
00362     /// 
00363     /// \param x 
00364     /// Input X ordinate value
00365     /// 
00366     /// \return
00367     /// Returns nothing
00368     /// 
00369     FDO_GEOM_API void SetX(double x);
00370 
00371     /// \brief
00372     /// Sets the Y ordinate.
00373     /// 
00374     /// \param y 
00375     /// Input Y ordinate value
00376     /// 
00377     /// \return
00378     /// Returns nothing
00379     /// 
00380     FDO_GEOM_API void SetY(double y);
00381 
00382     /// \brief
00383     /// Sets the Z ordinate.
00384     /// 
00385     /// \param z 
00386     /// Input Z ordinate value
00387     /// 
00388     /// \return
00389     /// Returns nothing
00390     /// 
00391     FDO_GEOM_API void SetZ(double z);
00392 
00393     /// \brief
00394     /// Sets the M ordinate.
00395     /// 
00396     /// \param m 
00397     /// Input M ordinate value
00398     /// 
00399     /// \return
00400     /// Returns nothing
00401     /// 
00402     FDO_GEOM_API void SetM(double m);
00403 
00404     /// \brief
00405     /// Sets the dimensionality.
00406     /// 
00407     /// \remarks
00408     ///  Use values (including bitwise combinations) from the FdoDimensionality enumeration.
00409     /// 
00410     /// \param dimensionality 
00411     /// Input dimensionality value
00412     /// 
00413     /// \return
00414     /// Returns nothing
00415     /// 
00416     FDO_GEOM_API void SetDimensionality(FdoInt32 dimensionality);
00417 
00418 protected:
00419 
00420 /// \cond DOXYGEN-IGNORE
00421     void Dispose();
00422 
00423     double      m_x;
00424     double      m_y;
00425     double      m_z;
00426     double      m_m;
00427     FdoInt32    m_dimensionality;
00428 
00429     /// The following is just to retain ownership of the ordinate array in
00430     /// case GetOrdinates() is called.  An alternative implementation might
00431     /// optimise for GetOrdinates() by always using "double m_ordinates[4]" 
00432     /// instead of the m_x, m_y, ... above.
00433     double *    m_ordinates;
00434 
00435 /// \endcond
00436 };
00437 #endif
00438 
00439 

Comments or suggestions? Send us feedback.