//////////////////////////////////////////////////////////////////////////////
//
//  Copyright 2025 Autodesk, Inc.  All rights reserved.
//
//  Use of this software is subject to the terms of the Autodesk license 
//  agreement provided at the time of installation or download, or which 
//  otherwise accompanies this software in either electronic or hard copy form.   
//
//////////////////////////////////////////////////////////////////////////////

#ifndef __CAUXENTEX_H
#define __CAUXENTEX_H

#include "AdAChar.h"

/////////////////////////////////////////////////////////////////////
//
// Notes:
// the color of -1 means no color at all. It is than controled be
// the caller entityTraits
//
/////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////
// general polyline - just linear segments
// if it has to be closed, than last point must match
// the first point
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxPline.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxPline : public AcmCAuxEntity
{
public:
  ///<summary>the constructor function</summary>
  AcmCAuxPline();
  ///<summary>the constructor function</summary>
  AcmCAuxPline(const AcGePoint3d& from, const AcGePoint3d& to);
  ///<summary>the constructor function</summary>
  AcmCAuxPline(const AcGePoint3dArray& points);
  ///<summary>the constructor function</summary>
  AcmCAuxPline(const AcmCAuxPline& src);
  ///<summary>the constructor function</summary>
  AcmCAuxPline(const AcDbLine* src);
  ///<summary>the destructor function</summary>
  virtual ~AcmCAuxPline();
  
  virtual const AcmCAuxPline& operator=(const AcmCAuxPline& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;
  
  void setPlane(const AcGePlane& pl);
  const AcGePlane *plane() const;
  
  void set(const AcGePoint3d& from,const AcGePoint3d& to);
  void set(const AcGePoint3dArray& points);
  void getPoints(AcGePoint3dArray&);
  void removeAll();
  
  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw* mode);
  virtual void              viewportDraw(AcGiViewportDraw*  mode);
  virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXform,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            AcGePoint3dArray& points,
                                            INT_PTR entGsMarker = 0) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            const AcGePlane& projPlane,
                                            AcGePoint3dArray& points, 
                                            INT_PTR entGsMarker = 0) const;
};


/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxPolygon.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxPolygon : public AcmCAuxEntity
{
public:
  ///<summary>the constructor function</summary>
  AcmCAuxPolygon();
  ///<summary>the constructor function</summary>
  AcmCAuxPolygon(const AcGePoint3dArray& points,
                 const AcGiFillType fill = kAcGiFillAlways);
  ///<summary>the constructor function</summary>
  AcmCAuxPolygon(const AcmCAuxPolygon& src);
  ///<summary>the destructor function</summary>
  virtual ~AcmCAuxPolygon();
  
  virtual const AcmCAuxPolygon& operator=(const AcmCAuxPolygon& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;
  
  void set(const AcGePoint3dArray& points,
           const AcGiFillType fill = kAcGiFillAlways);
  void removeAll();
  
  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw* mode);
  virtual void              viewportDraw(AcGiViewportDraw*  mode);

  virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXform,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            AcGePoint3dArray& points,
                                            INT_PTR entGsMarker = 0) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            const AcGePlane& projPlane,
                                            AcGePoint3dArray& points, 
                                            INT_PTR entGsMarker = 0) const;
};

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxCircle.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxCircle : public AcmCAuxEntity
{
public:
  ///<summary>the constructor function</summary>
  AcmCAuxCircle();
  ///<summary>the constructor function</summary>
  AcmCAuxCircle(const AcGePoint3d& center,
                double radius,
                const AcGeVector3d& normal = AcGeVector3d::kZAxis);
  ///<summary>the constructor function</summary>
  AcmCAuxCircle(const AcGePoint3d& p1,
                const AcGePoint3d& p2,
                const AcGePoint3d& p3);
  ///<summary>the constructor function</summary>
  AcmCAuxCircle(const AcmCAuxCircle& src);
  ///<summary>the constructor function</summary>
  AcmCAuxCircle(const AcDbCircle* src);
  ///<summary>the destructor function</summary>
  virtual ~AcmCAuxCircle();
  
  void setFillType(const AcGiFillType fill);

  virtual const AcmCAuxCircle& operator=(const AcmCAuxCircle& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;
  
  void set(const AcGePoint3d& center,
           double radius,
           const AcGeVector3d& normal = AcGeVector3d::kZAxis);
  
  void set(const AcGePoint3d& p1,
           const AcGePoint3d& p2,
           const AcGePoint3d& p3);
  
  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw*        mode);
  virtual void              viewportDraw(AcGiViewportDraw*  mode);

  virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXform,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            AcGePoint3dArray& points,
                                            INT_PTR entGsMarker = 0) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            const AcGePlane& projPlane,
                                            AcGePoint3dArray& points, 
                                            INT_PTR entGsMarker = 0) const;
};

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxArc.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxArc : public AcmCAuxEntity
{
public:
  ///<summary>the constructor function</summary>
  AcmCAuxArc();
  ///<summary>the constructor function</summary>
  AcmCAuxArc( const AcGePoint3d& center,
              double radius,
              double sweepAngle,
              const AcGeVector3d& startVect = AcGeVector3d::kXAxis,
              const AcGeVector3d& normal = AcGeVector3d::kZAxis);
  ///<summary>the constructor function</summary>
  AcmCAuxArc( const AcGePoint3d& startPoint,
              const AcGePoint3d& point,
              const AcGePoint3d& endPoint);
  ///<summary>the constructor function</summary>
  AcmCAuxArc(const AcmCAuxArc& src);
  ///<summary>the constructor function</summary>
  AcmCAuxArc(const AcDbArc* src);
  virtual ~AcmCAuxArc();
  
  virtual const AcmCAuxArc& operator=(const AcmCAuxArc& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;

  void set( const AcGePoint3d& center,
            double radius,
            double sweepAngle,
            const AcGeVector3d& refVect = AcGeVector3d::kXAxis,
            const AcGeVector3d& normal = AcGeVector3d::kZAxis);
  
  void set( const AcGePoint3d& startPoint,
            const AcGePoint3d& point,
            const AcGePoint3d& endPoint);

  void setFillType(const AcGiFillType fill);
  void setArcType(const AcGiArcType arcType);

  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw* mode);
  virtual void              viewportDraw(AcGiViewportDraw* mode);

  virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXform,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            AcGePoint3dArray& points,
                                            INT_PTR entGsMarker = 0) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            const AcGePlane& projPlane,
                                            AcGePoint3dArray& points, 
                                            INT_PTR entGsMarker = 0) const;
};


/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////

class ACMSYMBB_CRX_DLLSHARE AcmCAuxText : public AcmCAuxEntity
{
public:
  ///<summary>the constructor function</summary>
  AcmCAuxText();
  ///<summary>the constructor function</summary>
  AcmCAuxText(const AcGePoint3d& location,
              double txtHeight,
              const ACHAR* contents,
              const AcDbMText::AttachmentPoint attachment = AcDbMText::kBottomLeft,
              const AcDbObjectId& txtStyleId = *(AcDbObjectId*)NULL);
  ///<summary>the constructor function</summary>
  AcmCAuxText(const AcmCAuxText&);
  ///<summary>the constructor function</summary>
  AcmCAuxText(const AcDbText* pDef);
  ///<summary>the constructor function</summary>
  AcmCAuxText(const AcDbMText* pDef);
  ///<summary>the destructor</summary>
  virtual ~AcmCAuxText();

  virtual const AcmCAuxText& operator=(const AcmCAuxText& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;
                                          
  void set(const AcGePoint3d& location,
           const ACHAR* contents,
           const AcDbMText::AttachmentPoint attachment = AcDbMText::kBottomLeft,
           double rotation = 0.0);

  void setTextStyle(const AcDbObjectId& txtStyleId);
  void setTextHeight(double height);
  AcDbMText& getMText();
  
  virtual void setProperties(const AcDbObjectId& id,Adesk::Int16 color = -1);
  virtual void setColor(Adesk::Int16 col); 
  virtual void setProperties(const AcDbObjectId& id, const AcCmColor & col);
  virtual void setColor(const AcCmColor & col); 

  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents&     extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw* pMode);
  virtual void              viewportDraw(AcGiViewportDraw* pMode);

};

///<summary>This is class AcmCAuxAcDbText.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxAcDbText : public AcmCAuxEntity
{
public:
  ///<summary>the constructor</summary>
  AcmCAuxAcDbText();
  ///<summary>the constructor</summary>
  AcmCAuxAcDbText(const AcmCAuxAcDbText&);
  ///<summary>the constructor</summary>
  AcmCAuxAcDbText(const AcDbText* pDef);

  virtual const AcmCAuxAcDbText& operator=(const AcmCAuxAcDbText& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;
  AcDbText& getText();  
    
  virtual void setProperties(const AcDbObjectId& id,Adesk::Int16 color = -1);
  virtual void setColor(Adesk::Int16 col); 
  
  virtual void setProperties(const AcDbObjectId & id, const AcCmColor & col);
  virtual void setColor(const AcCmColor & col);   

  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents&     extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw* pMode);
  virtual void              viewportDraw(AcGiViewportDraw* pMode);
};

///<summary>This is class AcmCAuxAttribute.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxAttribute : public AcmCAuxText
{
public:
  AcmCAuxAttribute();
  AcmCAuxAttribute(const ACHAR*);
  AcmCAuxAttribute(const AcmCAuxAttribute&);
  AcmCAuxAttribute(const AcDbAttributeDefinition* pDef);
  virtual ~AcmCAuxAttribute();
  
  virtual const AcmCAuxAttribute& operator=(const AcmCAuxAttribute& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;
  Adesk::Boolean isPreset() const;
  void setPreset(Adesk::Boolean preset);
  Adesk::Boolean isInvisible() const;
  void setInvisible(Adesk::Boolean invisible);
  LPCTSTR tag() const;
  void setTag(LPCTSTR name);
  void setPrompt(LPCTSTR name);
  LPCTSTR prompt() const;
};

///<summary>The AcmCAuxScaleText class is a derived class of the AcmCAuxText class. The AcmCAuxScaleText 
///class adds a text width scaling to the AcmCAuxText class.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxScaleText : public AcmCAuxText
{
public:
  ///<summary>Enumerates all available text scale modes for scaling the text width.</summary>
  enum ScaleMode
  {
    ///<summary>Specifies that the text width is scaled by a specified text width factor.</summary>
    kWidthFactor = 0,
    ///<summary>Specifies that the text width is scaled by a specified text width limit.</summary>
    kWidthLimit
  };

public:
  AcmCAuxScaleText();

  ///<param name="oLocation">Input parameter. Specifies the text location to set.</param>
  ///<param name="nTextHeight">Input parameter. Specifies the text height to set.</param>
  ///<param name="strContents">Input parameter. Specifies the text contents to set.</param>
  ///<param name="enAttachment">Input parameter. Specifies the text attachment point to set.</param>
  ///<param name="oTextStyleId">Input parameter. Specifies the text style to set.</param>
  ///<param name="nWidthFactor">Input parameter. Specifies the text width factor to set.Input parameter. 
  ///The text width factor is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthFactor.</param>
  ///<param name="nWidthLimit">Input parameter. Specifies the text width limit to set.Input parameter. 
  ///The text width limit is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthLimit.
  ///Input parameter. The text width is not scaled if the text width is less than the text width limit.</param>
  ///<param name="enScaleMode">Input parameter. Specifies the text scale mode to set.Input parameter. 
  ///The text scale mode indicates the method used to scale the text width.Input parameter. 
  ///Refer to the AcmCAuxScaleText::ScaleMode enumerated type for the available text scale modes.</param>
  AcmCAuxScaleText(const AcGePoint3d& oLocation,
                   double nTextHeight,
                   const ACHAR* strContents,
                   const AcDbMText::AttachmentPoint enAttachment = AcDbMText::kBottomLeft,
                   const AcDbObjectId& oTextStyleId = *(AcDbObjectId*)NULL,
                   double nWidthFactor = 1.0,
                   double nWidthLimit = 0.0,
                   ScaleMode enScaleMode = kWidthFactor);

  ///<param name="oLocation">Input parameter. Specifies the text location to set.</param>
  ///<param name="nTextHeight">Input parameter. Specifies the text height to set.</param>
  ///<param name="strContents">Input parameter. Specifies the text contents to set.</param>
  ///<param name="enAttachment">Input parameter. Specifies the text attachment point to set.</param>
  ///<param name="oTextStyleId">Input parameter. Specifies the text style to set.</param>
  ///<param name="nWidthFactor">Input parameter. Specifies the text width factor to set.Input parameter. 
  ///The text width factor is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthFactor.</param>
  ///<param name="nWidthLimit">Input parameter. Specifies the text width limit to set.Input parameter. 
  ///The text width limit is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthLimit.
  ///Input parameter. The text width is not scaled if the text width is less than the text width limit.</param>
  ///<param name="enScaleMode">Input parameter. Specifies the text scale mode to set.Input parameter.
  ///The text scale mode indicates the method used to scale the text width.Input parameter. 
  ///Refer to the AcmCAuxScaleText::ScaleMode enumerated type for the available text scale modes.</param>
  AcmCAuxScaleText(const AcmCAuxScaleText&);

  ///<param name="oLocation">Input parameter. Specifies the text location to set.</param>
  ///<param name="nTextHeight">Input parameter. Specifies the text height to set.</param>
  ///<param name="strContents">Input parameter. Specifies the text contents to set.</param>
  ///<param name="enAttachment">Input parameter. Specifies the text attachment point to set.</param>
  ///<param name="oTextStyleId">Input parameter. Specifies the text style to set.</param>
  ///<param name="nWidthFactor">Input parameter. Specifies the text width factor to set.Input parameter.
  ///The text width factor is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthFactor.</param>
  ///<param name="nWidthLimit">Input parameter. Specifies the text width limit to set.Input parameter. 
  ///The text width limit is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthLimit.
  ///Input parameter. The text width is not scaled if the text width is less than the text width limit.</param>
  ///<param name="enScaleMode">Input parameter. Specifies the text scale mode to set.Input parameter. 
  ///The text scale mode indicates the method used to scale the text width.Input parameter. 
  ///Refer to the AcmCAuxScaleText::ScaleMode enumerated type for the available text scale modes.</param>
  AcmCAuxScaleText(const AcDbText* pDef);

  ///<param name="oLocation">Input parameter. Specifies the text location to set.</param>
  ///<param name="nTextHeight">Input parameter. Specifies the text height to set.</param>
  ///<param name="strContents">Input parameter. Specifies the text contents to set.</param>
  ///<param name="enAttachment">Input parameter. Specifies the text attachment point to set.</param>
  ///<param name="oTextStyleId">Input parameter. Specifies the text style to set.</param>
  ///<param name="nWidthFactor">Input parameter. Specifies the text width factor to set.Input parameter. 
  ///The text width factor is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthFactor.</param>
  ///<param name="nWidthLimit">Input parameter. Specifies the text width limit to set.Input parameter. 
  ///The text width limit is used to scale the text width when enScaleMode = AcmCAuxScaleText::kWidthLimit.
  ///Input parameter. The text width is not scaled if the text width is less than the text width limit.</param>
  ///<param name="enScaleMode">Input parameter. Specifies the text scale mode to set.Input parameter. 
  ///The text scale mode indicates the method used to scale the text width.Input parameter.
  ///Refer to the AcmCAuxScaleText::ScaleMode enumerated type for the available text scale modes.</param>
  AcmCAuxScaleText(const AcDbMText* pDef);
  virtual ~AcmCAuxScaleText();

  virtual const AcmCAuxScaleText& operator=(const AcmCAuxScaleText& src);
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;

  ///<summary>Sets the text width factor and the text scale mode to AcmCAuxScaleText::kWidthFactor.</summary>
  ///<param name="nWidthFactor">Input parameter. Specifies the text width factor to set.</param>
  void setWidthFactor(double nWidthFactor);

  ///<summary>Retrieves the text width factor.</summary>
  double widthFactor() const;
  ///<summary>Sets the text width limit and the text scale mode to AcmCAuxScaleText::kWidthLimit.</summary>
  ///<param name="nWidthLimit">Input parameter. Specifies the text width limit to set.</param>
  void setWidthLimit(double nWidthLimit);
  ///<summary>Retrieves the text width limit.</summary>
  double widthLimit() const;
  ///<summary>Sets the text scale mode for scaling the text width.</summary>
  ///<param name="enScaleMode">Input parameter. Specifies the text scale mode to set.</param>
  void setScaleMode(ScaleMode enScaleMode);
  ///<summary>Retrieves the text scale mode.</summary>
  ScaleMode scaleMode() const;

  ///<summary>Retrieves the calculated width factor. FIX_THIS_Table Text Scale Mode FIX_THIS_Table
  ///Calculated Width Factor FIX_THIS_Table AcmCAuxScaleText::kWidthFactor FIX_THIS_Table Equals to the 
  ///specified text width factor returned by the widthFactor() method. FIX_THIS_Table AcmCAuxScaleText::kWidthLimit
  ///FIX_THIS_Table Equals to 0, if the text width is less than the text width limit.
  ///Equals to the division of the text width limit by the text width, if the text width is greater than 
  ///the text width limit.</summary>
  double calcWidthFactor() const;
};

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxHatch.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxHatch : public AcmCAuxEntity
{
public:
  AcmCAuxHatch();
  AcmCAuxHatch(const AcmCAuxHatch& src);
  AcmCAuxHatch(const AcDbHatch* pDbHatch);
  AcmCAuxHatch(AcDbHatch::HatchStyle style,
               double elevation = 0.0,
               AcGeVector3d normal = AcGeVector3d::kZAxis);
  ///<summary>the destructor</summary>
  virtual ~AcmCAuxHatch();
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;
  virtual const AcmCAuxHatch& operator=(const AcmCAuxHatch& src);

  Acad::ErrorStatus appendLoop(Adesk::Int32 loopType,
                               const AcGePoint2dArray& vertices,
                               const AcGeDoubleArray& bulges);

  Acad::ErrorStatus appendLoop(Adesk::Int32 loopType,
                               const AcGeVoidPointerArray& edgePtrs,
                               const AcGeIntArray&  edgeTypes);  
  
  virtual void setProperties(const AcDbObjectId& id,Adesk::Int16 color = -1);
  virtual void setColor(Adesk::Int16 col); 
  
  virtual void setProperties(const AcDbObjectId & id, const AcCmColor & col);
  virtual void setColor(const AcCmColor & col); 

  void set(AcDbHatch::HatchStyle style,
           double elevation = 0.0,
           AcGeVector3d normal = AcGeVector3d::kZAxis);

  void setPattern(AcDbHatch::HatchPatternType patType,
                  const ACHAR* patName);

  void setPatternAngle(double angle);
  void setPatternSpace(double space);
  void setPatternDouble(Adesk::Boolean isDouble);
  Acad::ErrorStatus  evaluateHatch();

  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw* mode);
  virtual void              viewportDraw(AcGiViewportDraw* mode);
};

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxEllipse.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxEllipse : public AcmCAuxEntity
{
public:
  AcmCAuxEllipse();
  ///<param name="src">src:</param>
  AcmCAuxEllipse(
      const AcGePoint3d& center,
      const AcGeVector3d& normal,
      const AcGeVector3d& majorAxis,
      double radiusRatio,
      double startAngle = 0.0,
      double endAngle = 6.28318530717958647692);
  ///<param name="src">src:</param>
  AcmCAuxEllipse(const AcmCAuxEllipse& src);
  ///<param name="src">src:</param>
  AcmCAuxEllipse(const AcDbEllipse* src);
  virtual ~AcmCAuxEllipse();
  virtual const AcmCAuxEllipse& operator=(const AcmCAuxEllipse& src);

  AcDbEllipse& getEllipse();
  Acad::ErrorStatus setEllipse(
      const AcGePoint3d& center,
      const AcGeVector3d& normal,
      const AcGeVector3d& majorAxis,
      double radiusRatio,
      double startAngle = 0.0,
      double endAngle = 6.28318530717958647692);
  
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;

  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw*        mode);
  virtual void              viewportDraw(AcGiViewportDraw*  mode);
  virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXform,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            AcGePoint3dArray& points,
                                            INT_PTR entGsMarker = 0) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            const AcGePlane& projPlane,
                                            AcGePoint3dArray& points, 
                                            INT_PTR entGsMarker = 0) const;
};

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxSpline.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxSpline : public AcmCAuxEntity
{
public:
  AcmCAuxSpline();
  AcmCAuxSpline(const AcmCAuxSpline& src);
  AcmCAuxSpline(const AcDbSpline* src);
  AcmCAuxSpline(
      const AcGePoint3d& center,
      const AcGeVector3d& normal,
      const AcGeVector3d& majorAxis,
      double radiusRatio,
      double startAngle = 0.0,
      double endAngle = 6.28318530717958647692);
  AcmCAuxSpline(
      const AcGePoint3dArray& fitPoints,
      int order= 4,
      double fitTolerance = 0.0);
  AcmCAuxSpline(
      const AcGePoint3dArray& fitPoints,
      const AcGeVector3d& startTangent,
      const AcGeVector3d& endTangent,
      int order = 4,
      double fitTolerance= 0.0);
  AcmCAuxSpline(
      int degree,
      Adesk::Boolean isRational,
      Adesk::Boolean isClosed,
      Adesk::Boolean isPeriodic,
      const AcGePoint3dArray& controlPoints,
      const AcGeDoubleArray& knots,
      const AcGeDoubleArray& weights,
      double controlPtTol = 0.0,
      double knotTol = 0.0);
  ///<summary>the destructor</summary>
  virtual ~AcmCAuxSpline();
  virtual const AcmCAuxSpline& operator=(const AcmCAuxSpline& src);

  AcDbSpline& getSpline();
  
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;

  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw*        mode);
  virtual void              viewportDraw(AcGiViewportDraw*  mode);
  virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXform,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            AcGePoint3dArray& points,
                                            INT_PTR entGsMarker = 0) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            const AcGePlane& projPlane,
                                            AcGePoint3dArray& points, 
                                            INT_PTR entGsMarker = 0) const;
};

/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
///<summary>This is class AcmCAuxRasterImage.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmCAuxRasterImage : public AcmCAuxEntity
{
public:
  AcmCAuxRasterImage();
  AcmCAuxRasterImage(const AcmCAuxRasterImage& src);
  AcmCAuxRasterImage(const AcDbRasterImage* src);
  ///<summary>the destructor</summary>
  ~AcmCAuxRasterImage();
  virtual const AcmCAuxRasterImage& operator=(const AcmCAuxRasterImage& src);

  AcDbRasterImage& getRasterImage();
  
  virtual AcmCAuxEntity* clone() const;
  virtual AcmCAuxEntity::Type type() const;

  virtual Acad::ErrorStatus getGeomExtents(AcDbExtents& extents) const;
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
  virtual Acad::ErrorStatus explode(AcDbVoidPtrArray& entitySet,const AcDbEntity*) const;
  virtual Adesk::Boolean    worldDraw(AcGiWorldDraw*        mode);
  virtual void              viewportDraw(AcGiViewportDraw*  mode);
  virtual Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXform,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            AcGePoint3dArray& points,
                                            INT_PTR entGsMarker = 0) const;
  virtual  Acad::ErrorStatus  intersectWith(const AcDbEntity* ent,
                                            AcDb::Intersect intType, 
                                            const AcGePlane& projPlane,
                                            AcGePoint3dArray& points, 
                                            INT_PTR entGsMarker = 0) const;
};

#endif
