//////////////////////////////////////////////////////////////////////////////
//
//  Copyright 2025 by Autodesk, Inc.  All rights reserved.
//
// This computer source code and related instructions and comments 
// are the unpublished confidential and proprietary information of 
// Autodesk, Inc. and are protected under applicable copyright and 
// trade secret law.  They may not be disclosed to, copied or used 
// by any third party without the prior written consent of Autodesk, Inc.
//
//////////////////////////////////////////////////////////////////////////////
#ifndef __IDSYM_H
#define __IDSYM_H

#ifndef __ACMDEF_H
  #error include 'acmdef.h' before including this file
#endif
#ifndef __CAUXENT_H
  #error include 'cauxent.h' before including this file
#endif

class AcmCId;
class AcmId;
class AcmIdImp;
class AcmCIdImp;
class AcmIdStdImp;

///<summary>This class is used as a common class for supporting the AcmDatumId and AcmFeatId 
///classes and implements all of its virtual member functions.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmIdStd : public AcmSymbolStd
{
public:
  ACRX_DECLARE_MEMBERS(AcmIdStd);
  ///<summary>Destructures the datum standard and feature standard classes.</summary>
  virtual ~AcmIdStd();
  void initToEditOriginal()const override;
  void initToEdit()const override;

  const ACHAR* getBaseSymStdClassName() const override;

  ///<summary>Sets the factory default values.</summary>
  virtual Adesk::Boolean setFactoryDefaults();
  ///<summary>Sets factory default values for surface indication leader properties.</summary>
  Adesk::Boolean setSurfIndLeaderFactoryDefaults() override;
  ///<summary>Since the Datum Id uses a different arrowheads than other symbols, this member function
  ///specifies which one.</summary>
  virtual Acm::ArrowType defaultArrowType() const;
  virtual Acm::ErrorStatus getDescription(CString& desc,
                                          CBitmap*& pBmpLoaded,
                                          CBitmap*& pBmpReg,
                                          Adesk::Boolean& enablePref) const;
  ///<summary>Gets the status for the feature id and datum Id symbols.</summary>
  virtual Adesk::Boolean isSupportedType(Acm::SubSymbolType type) const;
  virtual Adesk::Boolean isLandingSupported(Acm::SubSymbolType type) const;
  ///<summary>Returns whether surface indication leader is supported or not.</summary>
  virtual Adesk::Boolean isSurfIndLeaderSupported(Acm::SubSymbolType type) const;

  virtual double nonDrawingDistance(AcmCId* pData) const;
  ///<summary>Selects all supported arrowhead services available for use for the datum standard and returns
  ///a list of their descriptor objects.</summary>
  virtual Adesk::Boolean getDatumArrowDesc(AcmCObjArray<AcmCArrowDesc>& list, Adesk::Boolean bDarkTheme = Adesk::kFalse) const;

  virtual Acm::ErrorStatus checkVisibility(AcmCId* pData) const;
  virtual Acm::ErrorStatus initSymbolFields(AcmId* pSymbol) const;
  virtual Acm::ErrorStatus initFields(AcmCId* pData) const;
  ///<summary>Sets the suggested values for any value in the sub-symbol.</summary>
  virtual Acm::ErrorStatus setSuggested(AcmCId* pData) const;
  ///<summary>Creates a list of all sub-entities, which represents the symbol according the content of sub-symbol.</summary>
  virtual void getSubEnts(const AcmCId* pSymb,
                          AcmCAuxEntArray& subents) const;
  
  virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer);
  virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const;
  virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* filer);
  virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const;
  
  virtual Adesk::Boolean allowedInclinedDatum() const;

  virtual AcString getOmitedCharacters() const;

  //////////////////////////////////////////////////////////////////////////
// Symbol auto-incrementing label name interface overrides 
  Acm::ErrorStatus getDefaultName(AcString& name, int& count) const override;
  Adesk::Boolean isSymbolCounterSupported() const override;
  //////////////////////////////////////////////////////////////////////////

public:
  ///<summary>Gets the surface indication leader's arrow scale.</summary>
  double surfIndLeaderArwScale() const override;
  ///<summary>Sets the surface indication leader's arrow scale.</summary>
  ///<param name="scale">New arrow scale to set. It should be above zero.</param>
  Acm::ErrorStatus  setSurfIndLeaderArwScale(double scale) override;
  ///<summary>Gets the surface indication leader's arrow scale ByStandard status.</summary>
  Adesk::Boolean    surfIndLeaderArwScaleByStandard() const override;
  ///<summary>Sets the surface indication leader's arrow scale ByStandard status.</summary>
  ///<param name="byStandard">New ByStandard state to set.</param>
  Acm::ErrorStatus  setSurfIndLeaderArwScaleByStandard(Adesk::Boolean byStandard) override;
  ///<summary>Gets the surface indication leader's arrow type.</summary>
  Acm::ArrowType    surfIndLeaderArwType() const override;
  ///<summary>Sets the surface indication leader's arrow type.</summary>
  ///<param name="type">New arrow type to set.</param>
  Acm::ErrorStatus  setSurfIndLeaderArwType(Acm::ArrowType type) override;
  ///<summary>Gets the surface indication leader's arrow type ByStandard status.</summary>
  Adesk::Boolean    surfIndLeaderArwTypeByStandard() const override;
  ///<summary>Sets the surface indication leader's arrow type ByStandard status.</summary>
  ///<param name="byStandard">New ByStandard state to set.</param>
  Acm::ErrorStatus  setSurfIndLeaderArwTypeByStandard(Adesk::Boolean byStandard) override;

  ///<summary>Gets the surface indication leader's far side line type.</summary>
  AcDbObjectId      farSideLineTypeId() const;
  ///<summary>Sets the surface indication leader's far side line type.</summary>
  ///<param name="idType">Specifies the new line type object via its id.</param>
  Acm::ErrorStatus setFarSideLineTypeId(const AcDbObjectId& idType);
  ///<summary>Gets the surface indication leader's far side line type name.</summary>
  ///<param name="strLtypeName">Retrieves the line type name.</param>
  Acm::ErrorStatus farSideLineTypeName(AcString& strLtypeName) const;
  ///<summary>Gets the surface indication leader's far side line type name.</summary>
  ///<param name="strLtypeName">Specifies the line type object via its name.</param>
  Acm::ErrorStatus setFarSideLineTypeName(const ACHAR* pName);

protected:
  AcmIdStd();
  virtual Acad::ErrorStatus  subGetClassID(CLSID* pClsid) const;

protected:
  Acm::ErrorStatus createDefaultLTypeHiddenLeaderLine(const ACHAR* name);
  Adesk::Boolean getDatumNoteSubEnt(const AcmCId* pSymb, const AcGePoint3d& location, void*& pSubEnt) const;
  Adesk::Boolean getThreadNoteSubEnt(const AcmCId* pSymb, const AcGePoint3d& location, void*& pSubEnt) const;

private:
  AcmIdStdImp* mpImp;
};
DBREF_DECLARE(AcmIdStd)

///<summary>This symbol does not have an extended interface implemented. It is inherited from AcmCSubSymbol.
///The basic interface is implemented as described in AcmCSubSymbol.</summary>
class AcmCId : public AcmCSubSymbol
{
public:

  AcmCId(AcmId* pSym);
  virtual ~AcmCId();

  // Copy constructor
  AcmCId(const AcmCId& other);

  AcmCIdImp* getImp() const { return mpImp; }

  Adesk::Boolean operator==(const AcmCId&) const;

  virtual AcmCId& operator=(const AcmCId&);
  AcmCId* clone()const;

  ///<summary>Gets the IDs of private sub-symbols.</summary>
  virtual Acm::SubSymbolType typeId() const;
  ///<summary>Sets the IDs of private sub-symbols.</summary>
  virtual void setTypeId(Acm::SubSymbolType id);
  ///<summary>Gets the attach point of the symbol.</summary>
  virtual Acm::SymbolAttachmentPoint attachPoint() const;

  virtual AcGePoint3d origin() const override;
  ///<summary>Sets the origin of the symbol in WCS.</summary>
  virtual void setOrigin(const AcGePoint3d& origin) override;
  ///<summary>Gets the value of any symbol variable.</summary>
  virtual LPCTSTR value(Acm::Variable var) const override;
  ///<summary>Gets the value of any symbol variable.</summary>
  virtual Acm::ErrorStatus getValue(Acm::Variable var, CString& value) const override;
  ///<summary>Sets the value of any symbol variable.</summary>
  virtual Acm::ErrorStatus setValue(Acm::Variable var, LPCTSTR value) override;
  ///<summary>Gets the visibility status of the editing controls.</summary>
  virtual Acm::Visibility  variableStatus(Acm::Variable var) const override;
  ///<summary>Sets the visibility status of the editing controls.</summary>
  virtual Acm::ErrorStatus setVariableStatus(Acm::Variable var, Acm::Visibility status) override;
  ///<summary>Gets the variable support data, such as the help index, dialog index, tooltip string, and label string.</summary>
  virtual Acm::ErrorStatus getVarDlgInfo(Acm::Variable var, CVarDlgInfo& v) const override;
  ///<summary>Sets the variable support data, such as the help index, dialog index, tooltip string, and label string.</summary>
  virtual Acm::ErrorStatus setVarDlgInfo(Acm::Variable var, const CVarDlgInfo& v) override;


  virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer, Adesk::UInt16 ver) override;
  virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const override;

  Acad::ErrorStatus varInFields(const AcmVariant* pVar, AcRxObject* pFiler = nullptr) override;
  Acad::ErrorStatus varOutFields(AcmVariant* pVar, AcRxObject* pFiler = nullptr) const override;


  virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* filer) override;
  virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const override;

private:
    AcmCIdImp* mpImp{ nullptr };
};

///<summary>This class overrides all overridden AcDbEntity functions, which is required.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmId : public AcmSymbol
{
public:
  enum AmcIdValues
  {
    kFarSide = 1,
    kLastElement  //must be last!
  };

public:
  ACRX_DECLARE_MEMBERS(AcmId);
  ///<summary>Destructures the AcmId class.</summary>
  virtual ~AcmId();             
  ///<summary>Uses this overloaded member function to set up a symbol properly.</summary>
  ///<param name="pDb">Pointer to database. Default is NULL, and host databse will be used.</param>
  ///<returns>If successful then Acm::eOk is returned. If the symbol standard is not valid, then Acm::eNotSupported
  ///is returned.</returns>
  virtual Acm::ErrorStatus setSymbolDefaults(AcDbDatabase* pDb = NULL);
  Adesk::Boolean  isDatum() const;
  virtual AcmCId* subSymbol() const;
  virtual Acm::SymbolAttachmentPoint symbolAttachment() const;
  LPCTSTR value() const;
  Acm::ErrorStatus setValue(LPCTSTR value);
  ///<summary>Returns the upper bound of GS Selection Markers (number of them) used by all leaders in this class.
  ///The GS markers for surface indication leader are included.</summary>
  virtual INT_PTR numOfGsMarkers() const;
  ///<summary>Gets the visibility status of the editing controls. It can be kHidden, kDisabled, kShaded, kSelectOnly,
  ///kVisible, where kDisabled, kShaded and kSelectOnly have the same meaning.</summary>
  Acm::Visibility  variableStatus(Acm::Variable var = Acm::DatumIdText) const;
  Acm::Visibility  variableStatus(const Adesk::UInt32& var, bool bIsCSymbol) const;
  ///<summary>Sets the visibility status of the editing controls.</summary>
  ///<param name="status">It can be kHidden, kDisabled, kShaded, kSelectOnly, kVisible, where kDisabled, kShaded and
  ///kSelectOnly have the same meaning.</param>
  Acm::ErrorStatus setVariableStatus(Acm::Visibility status, Acm::Variable var = Acm::DatumIdText);
  Acm::ErrorStatus setVariableStatus(Acm::Visibility status, const Adesk::UInt32& var, bool bIsCSymbol);

  Acm::ErrorStatus getVarDlgInfo(CVarDlgInfo& v) const;
  Acm::ErrorStatus setVarDlgInfo(const CVarDlgInfo& v);
  ///<summary>Sends a notification if the tip point of the leader has changed.</summary>
  virtual void leaderTipPointChanged(const AcGeVector3d& offset,
                                     const AcmCLeader* leader);

  using AcmSymbol::transformBy;
  ///<summary>Transforms all leaders. Default implementation doesn't cover any smart behavior.</summary>
  virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform,
                                        double symbolScale);
  ///<summary>This method mirrors AcmSymbol entity.</summary>
  ///<param name="xMirrorForm">Transformation matrix with MIRROR element</param>
  ///<param name="XAxis">Returns mirrored X-Axis of the entity coordinate system</param>
  ///<param name="YAxis">Returns mirrored Y-Axis of the entity coordinate system</param>
  ///<param name="normal">Returns mirrored Normal of the entity coordinate system</param>
  ///<returns>This virtual method will be called when a transformation matrix with MIRROR element is applied to
  ///AcmSymbol entities (through AcmSymbol ::subTransformBy). Note that AcmCLeader and AcmCAttach objects associated
  ///with AcmSymbol entities are not affected by this API. The entity coordinate system passed as references to this
  ///API will be modified by this method to reflect the mirrored entity coordinate system.</returns>
  virtual void mirrorCoordSys(const AcGeMatrix3d& xMirrorForm,
                              AcGeVector3d& XAxis,
                              AcGeVector3d& YAxis,
                              AcGeVector3d& normal) const;

  virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer);
  virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const;
  virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* filer);
  virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const;
  ///<summary>Provides the method for removing the nth- leader in the list.</summary>
  ///<param name="index">Specifies the index in the leader array. If the leader doesn't exist, the function returns
  ///eInvalidInput.</param>
  virtual Acm::ErrorStatus removeLeader(Adesk::UInt16 index);

  bool setSurfExtLinesOffset(double offset);
  bool setSurfExtLinesOvershot(double overshot);
  double getSurfExtLinesOffset()const;
  double getSurfExtLinesOvershot()const;


  virtual Acm::ErrorStatus addStdCompliantLeader (const void* pGeomRef, const AcDbObjectId &viewId, const AcGePoint3d& arrowheadLocation, const AcGePoint3d& endPt);

  virtual Acm::ErrorStatus addAutoRoutingLeader(const void* pGeomRef, const AcDbObjectId &viewId, const AcGePoint3d& arrowheadLocation, AcGePoint3dArray& pointsArray);

  virtual void regen();

  Acm::ErrorStatus getLabelNames(AcStringArray& label) const override;

  //////////////////////////////////////////////////////////////////////////
  //CLI interface
  void buildKeywordsAndPrompt(std::vector<std::pair<AcString, AcString>>& output) const;
  Acm::ErrorStatus getVarForKeyword(const AcString& keyword, Adesk::UInt32& var, bool& bIsCSymbol) const;
  Acm::ErrorStatus getKeywordForVar(const Adesk::UInt32& var, AcString& keyword, bool bIsCSymbol) const;
  AcString getMessage(const Adesk::UInt32& var, bool bIsCSymbol) const;

  Acm::ErrorStatus getValue(const Adesk::UInt32& var, bool bIsCSymbol, CString& value) const;
  Acm::ErrorStatus setValue(const Adesk::UInt32& var, bool bIsCSymbol, LPCTSTR value);

protected:
  AcmId();             
  virtual Adesk::Boolean    subWorldDraw(AcGiWorldDraw* mode);
  ///<summary>Lists all leaders including their vertices, standard name and original name, server name and version.</summary>
  virtual void              subList() const;
  virtual Acad::ErrorStatus subTransformBy(const AcGeMatrix3d& xform);
  ///<summary>Queries the standard for sub-entities for all leaders and then the server for all sub-entities for all
  ///sub-symbols. All sub-entities are then exploded.</summary>
  virtual Acad::ErrorStatus subExplode(AcDbVoidPtrArray& entitySet) const;
  ///<summary>Determines the leaders to which indices belong and apply moveGripPointsAt to them. If the tip point is 
  ///being edited, then the leaderTipPointChanged() member function of the symbol will be called. If the leader
  ///contains a landing and it is changed, then the leaderLanding() member function of the symbol is called.</summary>
  virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
                                             const AcGeVector3d& offset);

  virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbVoidPtrArray& gripAppData, 
                                                const AcGeVector3d& offset, 
                                                const int bitflags);
  ///<summary>Implemented by calling the moveGripPointsAt member function.</summary>
  virtual Acad::ErrorStatus subMoveStretchPointsAt(const AcDbIntArray& indices,
                                                const AcGeVector3d& offset);
  ///<summary>Queries all leaders for their grip points.</summary>
  virtual Acad::ErrorStatus subGetGripPoints(AcGePoint3dArray& gripPoints,
                                          AcDbIntArray&     osnapModes,
                                          AcDbIntArray&     geomIds) const;

  virtual Acad::ErrorStatus  subGetGripPoints(AcDbGripDataPtrArray& grips,
      const double curViewUnitSize,
      const int gripSize,
      const AcGeVector3d& curViewDir,
      const int bitflags) const;

  ///<summary>Determines which sub-symbols or leaders belong to the GS marker. Then, it asks for sub-entities and
  ///applies getOsnapPoints to them.</summary>
  virtual Acad::ErrorStatus subGetOsnapPoints(AcDb::OsnapMode     osnapMode,
                                           INT_PTR             gsSelectionMark,
                                           const AcGePoint3d&  pickPoint,
                                           const AcGePoint3d&  lastPoint,
                                           const AcGeMatrix3d& viewXfrm,
                                           AcGePoint3dArray&   snapPoints,
                                           AcDbIntArray&       geomIds) const;
  virtual Acad::ErrorStatus  subGetClassID(CLSID* pClsid) const;

  virtual Acad::ErrorStatus subGetGeomExtents(AcDbExtents& extents) const;

protected:
  AcmIdImp* mpIdImp;
};    
DBREF_DECLARE(AcmId)

///<summary>This class is inherited from AcmId and defines the override for the Datum Id symbol.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmDatumId : public AcmId
{
  friend class AcmCEditSurfIndLeader;
public:
  ACRX_DECLARE_MEMBERS(AcmDatumId);
  ///<summary>Constructs the AcmDatumId class. The constructor is protected.</summary>
  AcmDatumId();
  ///<summary>Destructures the AcmDatumId class.</summary>
  virtual ~AcmDatumId();
  ///<summary>Uses this overloaded member function to set up a symbol properly.</summary>
  virtual Acm::ErrorStatus setSymbolDefaults(AcDbDatabase* pDb = NULL);
  ///<summary>Creates a new leader using supplied points.</summary>
  virtual Acm::ErrorStatus addLeader(const AcGePoint3dArray &ptrArray);
  ///<summary>Override this function to remove surface indication leader together with leader.</summary>
  virtual Acm::ErrorStatus removeLeader(Adesk::UInt16 index);
  ///<summary>Creates a new leader together with surface indication leader using supplied points.</summary>
  virtual Acm::ErrorStatus addLeaderWithSurfIndLeader(const AcGePoint3dArray& ptrArray);
  virtual Acm::SymbolAttachmentPoint symbolAttachment() const;
  virtual Adesk::Boolean makeNonInclinedDatum();
  ///<summary>Override this function to don't update primary leader's start point when attach with surface indication leader.
  ///The primary leader's start point should be the landing's midde point of surface indication leader.</summary>
  virtual Acm::ErrorStatus attachGeomRef(const void* pGeomRef, const AcGePoint3d &arrowheadLocation);
  ///<summary>Override this function to don't update primary leader's start point when attach with surface indication leader.
  ///The primary leader's start point should be the landing's midde point of surface indication leader.</summary>
  virtual Acm::ErrorStatus attachGeomRef(const void* pGeomRef, const AcDbObjectId &viewId, const AcGePoint3d &arrowheadLocation);
  ///<summary>Sets the datum note value.</summary>
  ///<param name="value">Specifies the new datum note value.</param>
  ///<returns>Returns Acm::eNotSupported if the symbol doesn't support datum note.
  ///Returns Acm::eOk if the new value is set correctly, otherwise returns Acm::eBad.</returns>
  Acm::ErrorStatus  setDatumNote(const ACHAR* value);
  ///<summary>Gets the datum note value.</summary>
  ///<param name="datumNote">Retrieves the new datum note value.</param>
  ///<returns>Returns Acm::eOk if the datum value is retrieved correctly, otherwsie returns Acm::eBad.</returns>
  Acm::ErrorStatus  datumNote(AcString& datumNote) const;
  ///<summary>Sets the thread note value.</summary>
  ///<param name="value">Specifies the new thread note value.</param>
  ///<returns>Returns Acm::eNotSupported if the symbol doesn't support thread note.
  ///Returns Acm::eOk if the new thread note value is set correctly, otherwsie returns Acm::eBad.</returns>
  Acm::ErrorStatus  setThreadNote(const ACHAR* value);
  ///<summary>Gets the thread note value.</summary>
  ///<param name="threadNote">Retrieves the new thread note value.</param>
  ///<returns>Returns Acm::eOk if the thread value is retrieved correctly, otherwsie returns Acm::eBad.</returns>
  Acm::ErrorStatus  threadNote(AcString& threadNote) const;
  ///<summary>Gets the surface indication leader far side option status.</summary>
  Adesk::Boolean    farSideStatus() const;
  ///<summary>Sets the surface indication leader far side option status, and it's line type is updated also.</summary>
  ///<param name="bChecked">Specifies the far side option is checked or not.</param>
  Acm::ErrorStatus  setFarSideStatus(Adesk::Boolean bChecked);
  ///<summary>Gets surface indication leader.</summary>
  ///<returns>Returns NULL if there is no surface indication leader.</returns>
  const AcmCLeader* getSurfIndLeader() const override;
  AcmCLeader* getSurfIndLeader() override;
  ///<summary>For internal use only.
  ///Gets whether the datum id symbol is attached to a feature control frame.</summary>
  Adesk::Boolean isAttachToFCF() const;
  ///<summary>Return whether we allow attaching to specified symbol(like FCF symbol).</summary>
  virtual  Adesk::Boolean isAttachToSymbolAllowed(const AcRxClass* pSymbolClass) const;

protected:
  ///<summary>Lists all leaders including their vertices, standard name and original name, server name and version.</summary>
  virtual void subList() const;
  ///<summary>Determines the leaders to which indices belong and apply moveGripPointsAt to them. If the tip point
  ///is being edited, then the leaderTipPointChanged() member function of the symbol will be called. If the leader
  ///contains a landing and it is changed, then the leaderLanding() member function of the symbol is called.</summary>
  virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbIntArray& indices,
                                             const AcGeVector3d& offset);
  virtual Acad::ErrorStatus  subGetClassID(CLSID* pClsid) const;
};                      
DBREF_DECLARE(AcmDatumId)
                  
///<summary>This class is inherited from AcmId and defines the override for the Datum Id symbol.</summary>
class ACMSYMBB_CRX_DLLSHARE AcmFeatId : public AcmId
{
public:
  ACRX_DECLARE_MEMBERS(AcmFeatId);
  ///<summary>Constructs the AcmFeatId class. The constructor is protected.</summary>
  AcmFeatId();
  virtual ~AcmFeatId();
  ///<summary>Uses this overloaded member function to set up a symbol properly.</summary>
  virtual Acm::ErrorStatus setSymbolDefaults(AcDbDatabase* pDb = NULL);
  ///<summary>Creates a new leader using supplied points.</summary>
  virtual Acm::ErrorStatus addLeader(const AcGePoint3dArray &ptrArray);
  ///<summary>Lists all leaders including their vertices, standard name and original name, server name and version.</summary>
  virtual void subList() const;

  virtual Acm::SymbolAttachmentPoint symbolAttachment() const;

  virtual Acad::ErrorStatus subGetGripPoints(AcDbGripDataPtrArray& grips,
    const double curViewUnitSize,
    const int gripSize, 
    const AcGeVector3d& curViewDir, 
    const int bitflags) const;

  virtual Acad::ErrorStatus subMoveGripPointsAt(const AcDbVoidPtrArray& gripAppData, 
    const AcGeVector3d& offset, 
    const int bitflags);

protected:
  ///<summary>Gets the symbol class ID.</summary>
  virtual Acad::ErrorStatus  subGetClassID(CLSID* pClsid) const;
};                      
DBREF_DECLARE(AcmFeatId)

#endif //__IDSYM_H
