//////////////////////////////////////////////////////////////////////////////
//
//  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 __STDISO_H
#define __STDISO_H

#include "AdAChar.h"

class AcmCfcfImpSymbolISO;

///<summary>This is class AcmStandardISO.</summary>
class STDIMP_DLLSHARE AcmStandardISO : public AcmStandard
{
public:
	ACRX_DECLARE_MEMBERS(AcmStandardISO);
	AcmStandardISO();
	virtual ~AcmStandardISO();
	///<summary>Gets the original name of the standard.</summary>
	virtual LPCTSTR originalName() const;
	///<summary>This function initializes the internal structure of the standard.</summary>
	virtual Adesk::Boolean acmInit();
	///<summary>Returns a list of all supported text heights that conform to the standard setting.</summary>
	virtual void getTextHeightList(AcGeDoubleArray& txtArr) const;
	///<summary>This function is used to initialize the standard.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
	virtual Adesk::Boolean setDimDefaults();

protected:
	///<summary>Constructs arrow services objects.</summary>
	virtual void initArrowServices();
	virtual Adesk::Boolean createDefaultStyle();
};

///<summary>This is class AcmSurfTextStdISO.</summary>
class STDIMP_DLLSHARE AcmSurfTextStdISO : public AcmSurfTextStd
{
public:
	ACRX_DECLARE_MEMBERS(AcmSurfTextStdISO);
	AcmSurfTextStdISO();
	virtual ~AcmSurfTextStdISO();
	///<summary>Gets the information about the standard name and revision.</summary>
	Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;
	///<summary>Provides the basic interface for the AcmStandardManager and hence determines whether AcmSymbolSTD 
	///can be used for a particular standard.</summary>
	Adesk::Boolean   isCompatibleTo(const AcmStandard* pStd) const override;
	void initToEditOriginal() const override;
	void initToEdit() const override;
	///<summary>Sets the factory default values.</summary>
	Adesk::Boolean setFactoryDefaults() override;
	///<summary>Gets a direction of lay symbol descriptor.</summary>
	Adesk::Boolean getLaySymbolList(AcmCObjArray<AcmSymbolDesc4CL>& list,
		const AcmCSurfText* pSubSym = NULL) const override;
	///<summary>Sets the visibility status for all values in the surface texture sub-symbol.</summary>
	Acm::ErrorStatus checkVisibility(AcmCSurfText* pData) const override;
	///<summary>Sets the initial status of variables.</summary>
	Acm::ErrorStatus initFields(AcmCSurfText* pData) const override;
	///<summary>Sets the suggested values for any value in the sub-symbol.</summary>
	Acm::ErrorStatus setSuggested(AcmCSurfText* pData) const override;

	///<summary>Returns the variable of the Surface Texture symbol standard that will hold the input value at the 
	///positional index (as shown in the diagram below).</summary>
	///<param name="dlgIndex">Positional index (See diagram). DO_IMAGE images/surface_texture_requirement.png</param>
	///<param name="var">Variable in Surface Texture symbol standard.</param>
	///<returns>Acad::eOk = If the variable is valid in the Surface Texture symbol standard. Acad::eInvalidInput = If 
	///the index is not valid in the Surface Texture symbol standard.</returns>
	Acad::ErrorStatus getVarFromDlgIndex(Adesk::UInt8 dlgIndex, Acm::Variable& var) const override;

	///<summary>Returns the editability and other information of the drop-down list (Combo box) in Surface Texture
	///symbol standard dialog.</summary>
	///<param name="var">Variable in Surface Texture symbol standard.</param>
	///<param name="varDlgInfo">Information of the drop-down list.</param>
	AcmSurfTextStd::ConfigListState checkConfigListState(Acm::Variable var, CVarDlgInfo& varDlgInfo) const override;

	///<summary>Restore the drop down lists for all variables of surface texture symbol standard to the default preset
	///lists.</summary>
	void restoreAllSuggestedList() override;
	///<param name="symArray">Array indicating state of selection of direction of lay symbols.</param>
	void getDefaultLaySymbols(AcDbIntArray& symArray) const override;
	void getDefaultVarSuggestList(Acm::Variable var, CStringList& list) const override;
};

///<summary>The AcmSurfTextStdISO2002 class is a derived class of the AcmSurfTextStdISO class. The usage of 
///AcmSurfTextStdISO2002 class is the same as that of AcmSurfTextStd class.</summary>
class STDIMP_DLLSHARE AcmSurfTextStdISO2002 : public AcmSurfTextStdISO
{
public:
	ACRX_DECLARE_MEMBERS(AcmSurfTextStdISO2002);
	AcmSurfTextStdISO2002();
	virtual ~AcmSurfTextStdISO2002();
	///<summary>Gets the information about the standard name and revision.</summary>
	Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;

	///<summary>Returns the variable of the Surface Texture symbol standard that will hold the input value at the 
	///positional index (as shown in the diagram below).</summary>
	///<param name="dlgIndex">Positional index (See diagram). DO_IMAGE images/surface_texture_requirement.png</param>
	///<param name="var">Variable in Surface Texture symbol standard.</param>
	///<returns>Acad::eOk = If the variable is valid in the Surface Texture symbol standard. Acad::eInvalidInput = If 
	///the index is not valid in the Surface Texture symbol standard.</returns>
	Acad::ErrorStatus getVarFromDlgIndex(Adesk::UInt8 dlgIndex, Acm::Variable& var) const override;

	///<summary>Returns the editability and other information of the drop-down list (Combo box) in Surface Texture 
	///symbol standard dialog.</summary>
	///<param name="var">Variable in Surface Texture symbol standard.</param>
	///<param name="varDlgInfo">Information of the drop-down list.</param>
	AcmSurfTextStd::ConfigListState checkConfigListState(Acm::Variable var, CVarDlgInfo& varDlgInfo) const override;

	///<summary>Sets the visibility status for all values in the surface texture sub-symbol.</summary>
	Acm::ErrorStatus checkVisibility(AcmCSurfText* pData) const override;
	///<summary>Sets the initial status of variables.</summary>
	Acm::ErrorStatus initFields(AcmCSurfText* pData) const override;
	///<summary>Sets the suggested values for any value in the sub-symbol.</summary>
	Acm::ErrorStatus setSuggested(AcmCSurfText* pData) const override;
	///<summary>Restore the drop down lists for all variables of surface texture symbol standard to the default 
	///preset lists.</summary>
	void restoreAllSuggestedList() override;
	void getDefaultVarSuggestList(Acm::Variable var, CStringList& list) const override;
	///<summary>Returns true if this symbol standard supports surface indication leader. 
	///Otherwise, returns false.</summary>
	Adesk::Boolean isSurfIndLeaderSupported() const override;
protected:
	///<summary>Gets the height of the symbol.</summary>
	///<param name="pSymb">Surface texture symbol of interest.</param>
	///<param name="H1">Reference height 1.</param>
	///<param name="H2">Reference height 2.</param>
	void getHeights(const AcmCSurfText* pSymb,
		double& H1,
		double& H2) const override;
};

class STDIMP_DLLSHARE AcmSurfTextStdISO2021 : public AcmSurfTextStdISO2002
{
public:
    ACRX_DECLARE_MEMBERS(AcmSurfTextStdISO2021);
    AcmSurfTextStdISO2021();
    virtual ~AcmSurfTextStdISO2021();
    ///<summary>Gets the information about the standard name and revision.</summary>
    Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;

public:
    ///<summary>Returns the variable of the Surface Texture symbol standard that will hold the input value at the 
    ///positional index (as shown in the diagram below).</summary>
    ///<param name="dlgIndex">Positional index (See diagram). DO_IMAGE images/surface_texture_requirement.png</param>
    ///<param name="var">Variable in Surface Texture symbol standard.</param>
    ///<returns>Acad::eOk = If the variable is valid in the Surface Texture symbol standard. Acad::eInvalidInput = If 
    ///the index is not valid in the Surface Texture symbol standard.</returns>
    Acad::ErrorStatus getVarFromDlgIndex(Adesk::UInt8 dlgIndex, Acm::Variable& var) const override;

    ///<summary>Returns the editability and other information of the drop-down list (Combo box) in Surface Texture 
    ///symbol standard dialog.</summary>
    ///<param name="var">Variable in Surface Texture symbol standard.</param>
    ///<param name="varDlgInfo">Information of the drop-down list.</param>
    AcmSurfTextStd::ConfigListState checkConfigListState(Acm::Variable var, CVarDlgInfo& varDlgInfo) const override;

    ///<summary>Sets the visibility status for all values in the surface texture sub-symbol.</summary>
    Acm::ErrorStatus checkVisibility(AcmCSurfText* pData) const override;
    ///<summary>Sets the initial status of variables.</summary>
    Acm::ErrorStatus initFields(AcmCSurfText* pData) const override;
    ///<summary>Sets the suggested values for any value in the sub-symbol.</summary>
    Acm::ErrorStatus setSuggested(AcmCSurfText* pData) const override;
    ///<summary>Restore the drop down lists for all variables of surface texture symbol standard to the default 
    ///preset lists.</summary>
    void restoreAllSuggestedList() override;
    void getDefaultVarSuggestList(Acm::Variable var, CStringList& list) const override;
    ///<summary>Returns true if this symbol standard supports surface indication leader. 
    ///Otherwise, returns false.</summary>
    Adesk::Boolean isSurfIndLeaderSupported() const override;
    ///<summary>Sets the factory default values.</summary>
    Adesk::Boolean setFactoryDefaults() override;
    ///<summary>Gets a profile direction descriptor relative to the predominant direction of the surface lay.</summary>
    Adesk::Boolean getProfileDirSymbolList(AcmCObjArray<AcmSymbolDesc4CL>& list,
                                           const AcmCSurfText* pSubSym = NULL) const override;
    ///<param name="symArray">Array indicating state of selection of profile direction of lay symbols.</param>
    void getDefaultProfileDirSymbols(AcDbIntArray& symArray) const override;

    UINT getSettingsDialogIDD() const override;

    UINT getSymbolDialogIDD() const override;

    Acm::Visibility variableStatus(AcmSurfTextStd::Variable var) const override;

    ///<summary>Sets the default state of variables belonging to the surface texture sub-symbol.</summary>
    void setDefaultSubSymbol(AcmCSurfText* pData) const override;

    ///<summary>Sets the default state of variables in each surface texture sub-symbol.</summary>
    void setDefaultSubSymbol(AcmCSubSymbolsList* pSubSymbolsList) const override;

    ///<summary>Sets the default values for prefix sufix strings of variables in surface texture sub-symbol</summary>
    Acm::ErrorStatus initPost(AcmCSurfText* pData) const override;

    ///<summary> return true when the multi row descriptor is enabled in the surface texture sub-symbol</summary>
    Adesk::Boolean allowedMultiRowDesc() const override;

    ///<summary>Creates a list of all sub-entities, which represents the symbol according the content of its sub-symbols.</summary>
    void getSubEnts(const AcmCSurfText* pSymb, const AcmCSubSymbolsList* pSubSymbolsList, AcmCAuxEntArray& subents) const override;

protected:
    ///<summary>Gets the height of the symbol.</summary>
    ///<param name="pSymb">Surface texture symbol of interest.</param>
    ///<param name="H1">Reference height 1.</param>
    ///<param name="H2">Reference height 2.</param>
    void getHeights(const AcmCSurfText* pSymb,
                    double& H1,
                    double& H2) const override;

    ///<summary>Gets the basic symbol as a list of AcmCAuxEntitys.</summary>
    void getBasicSymbol(const AcmCSurfText* pSymb,
                        double H1, double H2, double H3, double L3,
                        const AcCmColor& symColor,
                        double txtHeight, double tailLength,
                        AcmCAuxEntArray& subents) const override;

private:
    Acm::ErrorStatus getRowDesc(const AcmCSurfText* pSubSymb, Adesk::UInt16 actRow, CString& str) const;
    bool getRowEnts(const AcmCSurfText* pSubSym, AcmCAuxEntArray& subents, AcDbExtents& fullExtent,
                    double txtHeight, double& commonWidth, AcGePoint3d& refPoint) const;

    ///<summary>Returns an array of graphical sub-entities representative of ?Production Method? field variables in 
    ///the given Surface Texture symbol.</summary>
    ///<param name="pSubSym">Surface Texture symbol of interest.</param>
    ///<param name="subents">Array of graphical sub-entities.</param>
    ///<param name="fullExtent">Geometrical extents of the array of sub-entities.</param>
    ///<param name="txtHeight">Text height to be applied to the sub-entities.</param>
    ///<param name="commonWidth">Horizontal displacement of the sub-entities from the reference point.</param>
    ///<param name="refPoint">Reference position used to position the array of graphical sub-entities.</param>
    ///<returns>true if the array is populated successfully, false if the array fails to be populated.</returns>
    bool getSubEntsProd1(const AcmCSurfText* pSubSym,
                        AcmCAuxEntArray& subents,
                        AcDbExtents& fullExtent,
                        double txtHeight,
                        double& commonWidth,
                        AcGePoint3d& refPoint) const override;

    ///<summary>Returns an array of graphical sub-entities representative of "Profile direction" field variable
    ///in the given Surface Texture symbol.</summary>
    ///<param name="pSubSym">Surface Texture symbol of interest.</param>
    ///<param name="subents">Array of graphical sub-entities.</param>
    ///<param name="fullExtent">Geometrical extents of the array of sub-entities.</param>
    ///<param name="txtHeight">Text height to be applied to the sub-entities.</param>
    ///<param name="commonWidth">Horizontal displacement of the sub-entities from the reference point.</param>
    ///<param name="refPoint">Reference position used to position the array of graphical sub-entities.</param>
    ///<returns>true if the array is populated successfully, false if the array fails to be populated.</returns>
    bool getSubEntsProfileDir(const AcmCSurfText* pSubSym,
                              AcmCAuxEntArray& subents,
                              AcDbExtents& fullExtent,
                              double txtHeight,
                              const AcCmColor & txtColor,
                              AcGePoint3d& refPoint) const override;

    void AppendToString(CString& str, CString& addStr) const;
};

///<summary>This derived class implements standard-specific versions of functions available in the AcmFCFStd
///class. Refer to the AcmFCFStd class for further information.</summary>
class STDIMP_DLLSHARE AcmFCFStdISO : public AcmFCFStd
{
public:
	ACRX_DECLARE_MEMBERS(AcmFCFStdISO);
	AcmFCFStdISO();
	virtual ~AcmFCFStdISO();
	///<summary>Gets the information about the standard name and revision.</summary>
	Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;
	///<summary>Provides the basic interface for the AcmStandardManager and hence determines whether AcmSymbolSTD
	///can be used for a particular standard.</summary>
	Adesk::Boolean   isCompatibleTo(const AcmStandard* pStd) const override;
	///<summary>Sets the factory default values.</summary>
	virtual Adesk::Boolean setFactoryDefaults() override;
	void initToEditOriginal() const override;
	void initToEdit() const override;
	///<summary>Get the list of all arrowheads or all standard-supported arrowheads for the FCF symbol std. It will
	///return additional arrowheads on top of those available in AcmSymbolStd.</summary>
	Adesk::Boolean getArrowDesc(AcmCObjArray<AcmCArrowDesc>& list,
                                Adesk::Boolean allSrv = Adesk::kTrue,
                                Adesk::Boolean bDarkTheme = Adesk::kFalse) const override;
	///<summary>Returns the list of available material removal characteristics.</summary>
	Adesk::Boolean getMat(AcmCObjArray<AcmCGDTSymbolDesc>& list) const override;
	///<summary>Checks whether the symbol data is visible or not.</summary>
	Acm::ErrorStatus checkVisibility(AcmCFCF* pData) const override;
	///<summary>This function is used to return the default secondary arrow type for symbol.</summary>
	Acm::ArrowType defaultSecondaryArrowType() const override;
	///<summary>Returns true if this leader line will attach to the center of frame. 
	///Otherwise, returns false.</summary>
	Adesk::Boolean leaderPos() const override;
    ///<summary>Indicates whether or not the symbol has a landing that connects the leader to the symbol.</summary>
    ///<returns>Adesk::kTrue (default), or Adesk::kFalse</returns>
    Adesk::Boolean isLandingAllowed() const override;
};

class STDIMP_DLLSHARE AcmFCFStdISO2004 : public AcmFCFStdISO
{
public:
	ACRX_DECLARE_MEMBERS(AcmFCFStdISO2004);

	AcmFCFStdISO2004();
	virtual ~AcmFCFStdISO2004();
	///<summary>Gets the information about the standard name and revision.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Returns the list of available geometric characteristic descriptor objects.</summary>
	Adesk::Boolean getGeom(AcmCObjArray<AcmCGDTSymbolDesc>& list,
		const AcmCFCF* pSubSym = NULL) const override;
	///<summary>Returns the list of available material removal characteristics.</summary>
	virtual Adesk::Boolean getMat(AcmCObjArray<AcmCGDTSymbolDesc>& list) const;
	///<summary>This function is used to return the default secondary arrow type for symbol.</summary>
	virtual Acm::ArrowType defaultSecondaryArrowType() const;
	///<summary>Sets the factory default values.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
	///<summary>Returns true if this symbol standard supports surface indication leader. 
	///Otherwise, returns false.</summary>
	virtual Adesk::Boolean isSurfIndLeaderSupported() const;
};

class STDIMP_DLLSHARE AcmFCFStdISO2012 : public AcmFCFStdISO2004
{
public:
	ACRX_DECLARE_MEMBERS(AcmFCFStdISO2012);

	AcmFCFStdISO2012();
	virtual ~AcmFCFStdISO2012();
	///<summary>Gets the information about the standard name and revision.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Sets the factory default values.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
	///<summary>Returns the list of available material removal characteristics.</summary>
	virtual Adesk::Boolean getMat(AcmCObjArray<AcmCGDTSymbolDesc>& list) const;

};


class STDIMP_DLLSHARE AcmFCFStdISO2017 : public AcmFCFStdISO2012
{
public:
	ACRX_DECLARE_MEMBERS(AcmFCFStdISO2017);

	AcmFCFStdISO2017();
	virtual ~AcmFCFStdISO2017();
	///<summary>Gets the information about the standard name and revision.</summary>
	Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;

    ///<summary>Initializes the sub-symbol.</summary>
    void setDefaultSubSymbol(AcmCFCF* pSubSym) const override;

    void initToEditOriginal() const override;
    ///<summary>Checks whether the symbol data is visible or not.</summary>
    Acm::ErrorStatus checkVisibility(AcmCFCF* pSubSym) const override;
    ///<summary>Initializes the feature control frame symbol.</summary>
    Acm::ErrorStatus initFields(AcmCFCF* pSubSym) const override;

    ///<summary>Gets a SurfText application modifiers types list.</summary>
    std::vector <Acm::SurfTextAppModifierType> getStAppModifierTypeList() const override;

    ///<summary> return true when the multi row descriptor is enabled in the FCF sub-symbol</summary>
    Adesk::Boolean allowedMultiRowDesc() const override;
    ///<summary> return true when the multi Indicator descriptor is enabled in the FCF sub-symbol</summary>
    Adesk::Boolean allowedMultiIndicatorDesc() const override;

    ///<summary>Gets avalable types of attach position for reference line and symbol geometrical specification</summary>
    std::vector <Acm::FCFAttachmentPoint> getRefLineAttachPositionList() const override;

    ///<summary>Gets avalable types of place and feature indicartor types</summary>
    std::vector <Acm::GdtIndicatorType> getPlaceAndFeatureIndicatorList() const override;

    ///<summary>Gets default type of attach position between reference line and symbol geometrical specification</summary>
    Acm::FCFAttachmentPoint refLineAttachPosition() const override;

    ///<summary>Gets default type of of place and feature indicartor</summary>
    Acm::GdtIndicatorType placeAndFeatureIndicator() const override;

    Adesk::Boolean getPlaneAndFeatDescs(AcmCObjArray<AcmCGDTIndicatorDesc>& list,
        const AcmCFCF* pSubSym = NULL) const override;

    Adesk::Boolean setFactoryDefaults() override;
    ///<summary>Returns the list of available material removal characteristics.</summary>
    Adesk::Boolean getMat(AcmCObjArray<AcmCGDTSymbolDesc>& list) const override;
    ///<summary>Returns the list of available geometric characteristic descriptor objects.</summary>
    Adesk::Boolean getGeom(AcmCObjArray<AcmCGDTSymbolDesc>& list,
                           const AcmCFCF* pSubSym = NULL) const override;

    ///<summary>Creates a list of all sub-entities, which represents the symbol according the content of sub-symbol.</summary>
    ///<param name="secondLeaderPoint">If specified, this function will be filled with the second point to 
    ///attach leader to.</param>
    ///<param name="pTopBoundingLine">If specified, this function will be filled with the top line of the boundary 
    ///<param name="pBottomBoundingLine">If specified, this function will be filled with the bottom line of the boundary 
    void getSubEnts(const AcmCFCF* pSymb, AcmCAuxEntArray& subents, AcGePoint3d* pSecondLeaderPnt = NULL, 
                    AcGeLineSeg3d* pTopBoundingLine = NULL, AcGeLineSeg3d* pBottomBoundingLine = NULL) const override;

    void getSubEntsTransMat(const AcmCFCF* pSubSym, bool bMTextAttached,
                            AcmCAuxEntArray& subents, AcGeMatrix3d& mat) const override;

    void getSubEntsAllAround(AcmCAuxEntArray& subents, Acm::SurfTextAppModifierType flag,
                             const AcGeMatrix3d& mat) const override;

protected:
    ///<summary>Gets the start and end points of the sub-symbol landing line.</summary>
    void getLandingLinePoints(AcmCAuxEntArray& subents, AcGePoint3d& startPt, AcGePoint3d& endPt) const override;
};

///<summary>The AcmWeldingStdISO class is a derived class of the AcmWeldingStd class. The usage of
///AcmWeldingStdISO class is the same as that of AcmWeldingStd class.</summary>
class STDIMP_DLLSHARE AcmWeldingStdISO : public AcmWeldingStd
{
public:
	ACRX_DECLARE_MEMBERS(AcmWeldingStdISO);
	///<summary>Constructs the class.</summary>
	AcmWeldingStdISO();
	///<summary>Destructs the class.</summary>
	virtual ~AcmWeldingStdISO();

	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	virtual Adesk::Boolean   isCompatibleTo(const AcmStandard* pStd) const;
	///<summary>This class implementation doesn't do anything and returns eNotImplemented if it is not overloaded 
	///in the child class.</summary>
	virtual Acm::ErrorStatus cInit();
	void initToEditOriginal() const override;
	void initToEdit() const override;
	///<summary>Sets the factory default values.</summary>
	virtual Adesk::Boolean setFactoryDefaults();

	virtual void setDefaultSubSymbol(AcmCSubWelding* pData) const;

	virtual Acm::ErrorStatus checkVisibility(AcmCSubWelding* pData) const;
	virtual Adesk::Boolean   initPost(AcmCWeld* pWeld) const;

	virtual void getSubEnts(const AcmCSubWelding* pSubSym,
		AcmCAuxEntArray& subents,
		AcGePoint3d& ptRefEnd) const;

	virtual void getWeldProcessPrefix(CString& bufStr) const;
	///<summary>For internal use only.
	///Extra factor to scale the weld size of ACM2014 or earlier version.</summary>
	virtual double extraScaleFactor() const;
protected:
	virtual Acm::ErrorStatus createDefaultLTypeIdentLine(const ACHAR* name);
};

class STDIMP_DLLSHARE AcmWeldingStdISO2013 : public AcmWeldingStdISO
{
public:
    ACRX_DECLARE_MEMBERS(AcmWeldingStdISO2013);

    AcmWeldingStdISO2013() = default;
    virtual ~AcmWeldingStdISO2013() = default;

    Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;
    Adesk::Boolean setFactoryDefaults() override;
    Acm::ErrorStatus cInit() override;

    Adesk::Boolean isMultipleSymbolsAllowed() const override;
    void setDefaultSubSymbol(AcmCSubWelding* pSubWeld) const override;
    Adesk::Boolean isDistancePaletteAllowed() const override;
	std::vector<Adesk::UInt16> getAllowedDistanceTypes() const override;

    Adesk::Boolean isGapRowEnableWithIndentLine() const override;
    void allowedStaggerType(const AcmCSubWelding* pWelding, Adesk::UInt32& value) const override;
    void getSubEnts(const AcmCSubWelding* pWelding,
        AcmCAuxEntArray& subents,
        AcGePoint3d& ptRefEnd) const override;

    Adesk::Boolean allowedOperation() const override
    {  return  Adesk::kTrue;};
    Adesk::Boolean allowedSpacer() const override
    {  return  Adesk::kTrue;};
protected:
    Adesk::Boolean ShownBackingWeldInSymbPalette() const override;
};

///<summary>This is class AcmDatumStdISO.</summary>
class STDIMP_DLLSHARE AcmDatumStdISO : public AcmDatumStd
{
public:
	ACRX_DECLARE_MEMBERS(AcmDatumStdISO);
	AcmDatumStdISO();
	virtual ~AcmDatumStdISO();
	///<summary>Gets the information about the standard name and revision.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Provides the basic interface for the AcmStandardManager and hence determines whether AcmSymbolSTD 
	///can be used for a particular standard.</summary>
	virtual Adesk::Boolean   isCompatibleTo(const AcmStandard* pStd) const;
	///<summary>Sets the factory default values.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
	///<summary>This class implementation doesn't do anything and returns eNotImplemented if it is not overloaded 
	///in the child class.</summary>
	virtual Acm::ErrorStatus cInit();
};

///<summary>This is class AcmDatumStdISO.</summary>
class STDIMP_DLLSHARE AcmDatumStdISO2012 : public AcmDatumStdISO
{
public:
	ACRX_DECLARE_MEMBERS(AcmDatumStdISO2012);
	AcmDatumStdISO2012();
	virtual ~AcmDatumStdISO2012();
	///<summary>Gets the information about the standard name and revision.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Sets the factory default values.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
    ///<summary>Sets the factory default values.</summary>
    Adesk::Boolean isCompatibleWith(const AcString className) const override;
};

///<summary>This is class AcmDatumStdISO2017.</summary>
class STDIMP_DLLSHARE AcmDatumStdISO2017 : public AcmDatumStdISO2012
{
public:
    ACRX_DECLARE_MEMBERS(AcmDatumStdISO2017);
    AcmDatumStdISO2017();
    virtual ~AcmDatumStdISO2017();
    ///<summary>Gets the information about the standard name and revision.</summary>
    Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;
    ///<summary>Sets the factory default values.</summary>
    Adesk::Boolean isCompatibleWith(const AcString className) const override;
};

///<summary>This is class AcmIdStdISO.</summary>
class STDIMP_DLLSHARE AcmIdStdISO : public AcmIdStd
{
public:
	ACRX_DECLARE_MEMBERS(AcmIdStdISO);
	AcmIdStdISO();
	virtual ~AcmIdStdISO();
	///<summary>Gets the information about the standard name and revision.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Provides the basic interface for the AcmStandardManager and hence determines whether AcmSymbolSTD
	///can be used for a particular standard.</summary>
	virtual Adesk::Boolean   isCompatibleTo(const AcmStandard* pStd) const;
	///<summary>Selects all supported arrowhead services available for use for the datum standard and returns a list
	///of their descriptor objects.</summary>
	Adesk::Boolean getDatumArrowDesc(AcmCObjArray<AcmCArrowDesc>& list, Adesk::Boolean bDarkTheme = Adesk::kFalse) const 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;
};

///<summary>This is class AcmIdStdISO2004.</summary>
class STDIMP_DLLSHARE AcmIdStdISO2004 : public AcmIdStdISO
{
public:
	ACRX_DECLARE_MEMBERS(AcmIdStdISO2004);
	AcmIdStdISO2004();
	virtual ~AcmIdStdISO2004();
	///<summary>Sets factory default values for surface indication leader properties.</summary>
	virtual Adesk::Boolean setSurfIndLeaderFactoryDefaults();
	///<summary>Gets the information about the standard name and revision.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Check the visibility of symbol variables. The "visiblity" always means certain properties are supported 
	///by various master standards, or standard revisions.</summary>
	virtual Acm::ErrorStatus checkVisibility(AcmCId* pData) const;
	///<summary>Gets the status for the feature id and datum Id symbols.</summary>
	virtual Adesk::Boolean isSupportedType(Acm::SubSymbolType type) const;
	///<summary>Returns whether surface indication leader is supported or not.</summary>
	virtual Adesk::Boolean isSurfIndLeaderSupported(Acm::SubSymbolType type) const;
};

///<summary>This is class AcmIdStdISO2012.</summary>
class STDIMP_DLLSHARE AcmIdStdISO2012 : public AcmIdStdISO2004
{
public:
	ACRX_DECLARE_MEMBERS(AcmIdStdISO2012);
	///<summary>Gets the information about the standard name and revision.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Since the Datum Id uses a different arrowheads than other symbols, this member function specifies
	///which one.</summary>
	virtual Acm::ArrowType defaultArrowType() const;
    ///<summary>Sets the factory default values.</summary>
    Adesk::Boolean isCompatibleWith(const AcString className) const override;
};

///<summary>This is class AcmIdStdISO2017.</summary>
class STDIMP_DLLSHARE AcmIdStdISO2017 : public AcmIdStdISO2012
{
public:
    ACRX_DECLARE_MEMBERS(AcmIdStdISO2017);
    ///<summary>Gets the information about the standard name and revision.</summary>
    Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;
    ///<summary>Since the Datum Id uses a different arrowheads than other symbols, this member function specifies
    ///which one.</summary>
    Acm::ArrowType defaultArrowType() const override;

    Adesk::Boolean isCompatibleWith(const AcString className) const override;
};

///<summary>This is class AcmCPartListStdISO.</summary>
class STDIMP_DLLSHARE AcmCPartListStdISO : public AcmCPartListStd
{
public:
	AcmCPartListStdISO(AcmBOMStd *std);
	virtual ~AcmCPartListStdISO();
	///<summary>This member function will forward the call to the parts list standard and balloon standard objects, 
	///if they are defined.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
	///<summary>This member function is implemented for the AcmSymbolStd interface. It is necessary to be able to
	///properly edit the standard.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;

};

///<summary>This is class AcmCBalloonStdISO.</summary>
class STDIMP_DLLSHARE AcmCBalloonStdISO : public AcmCBalloonStd
{
public:
	AcmCBalloonStdISO(AcmBOMStd *std);
	virtual ~AcmCBalloonStdISO();
	///<summary>This member function will forward the call to the parts list standard and balloon standard objects, if
	///they are defined.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;

};

///<summary>The AcmBOMStdISO class is a derived class of the AcmBOMStd class. The usage of AcmBOMStdISO class is
///the same as that of AcmBOMStd class.</summary>
class STDIMP_DLLSHARE AcmBOMStdISO : public AcmBOMStd
{
public:
	ACRX_DECLARE_MEMBERS(AcmBOMStdISO);
	///<summary>the construct function.</summary>
	AcmBOMStdISO();
	///<summary>the destruct function.</summary>
	virtual ~AcmBOMStdISO();
	///<summary>You may overload this method in their classes to initialize the BOM standard with their own parts list
	///standard balloon standards.</summary>
	virtual Acm::ErrorStatus cInit();
	///<summary>This member function will forward the call to the parts list standard and balloon standard objects, if
	///they are defined.</summary>
	virtual Adesk::Boolean setFactoryDefaults();
	///<summary>This member function is implemented for the AcmSymbolStd interface. It is necessary to be able to properly 
	///edit the standard.</summary>
	virtual Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const;
	///<summary>Provides the basic interface for the AcmStandardManager and hence determines whether AcmSymbolSTD can be
	///used for a particular standard.</summary>
	virtual Adesk::Boolean   isCompatibleTo(const AcmStandard* pStd) const;
};

class STDIMP_DLLSHARE AcmWeldingStdISO2019 : public AcmWeldingStdISO2013
{
public:
	ACRX_DECLARE_MEMBERS(AcmWeldingStdISO2019);

	AcmWeldingStdISO2019() = default;
	virtual ~AcmWeldingStdISO2019() = default;

	Acm::ErrorStatus getRevision(CString& rev, Adesk::UInt16& year) const override;
	std::vector<Adesk::UInt16> getAllowedDistanceTypes() const override;
	void setDefaultSubWeld(AcmCWeld* pData) const override;
	Acm::ErrorStatus cInit() override;
};

#endif // STDISO
