#ifndef SHAPE_TYPE_HPP_INCLUDED
#define SHAPE_TYPE_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/AffineTransform_Type.h>
#include <NBO/NBO/AnnotationRef.h>
#include <NBO/NBO/Color_Type.h>
#include <NBO/NBO/NonNegativeInt_Type.h>
#include <NBO/NBO/ShapeID_Type.h>
#include <NBO/NBO/UnitsLength_Type.h>
#include <NBO/NBO/ENBOType.h>
#include <NBO/NBOGlobal.h>
#include <NBO/Shared/Base/NBOBaseClass.h>


namespace Inscoper::NBO {

/*!
* \brief Represents the XML complex type Shape.
*
* The shape element contains a single specific ROI shape and links that to any channels, and a timepoint and a z-section. It also records any transform applied to the ROI shape. 
*/
class NBO_EXPORT Shape_Type : public NBOBaseClass {

public:
	
	Shape_Type();
	~Shape_Type();

	/*!
	* \brief Cast a NBOBaseClass to a Shape_Type.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<Shape_Type> fromBase(NBOBaseClassPtr base);

	/*!
	* \brief Returns the class type name.
	*
	* \return The class type name
	*/
	virtual std::string getTypeName() const override;

	/*!
	* \brief Returns the XML element name corresponding to this class.
	*
	* \return The XML element name
	*/
	std::string getXMLName() const override;

	/*!
	* \brief Returns the NBO Type corresponding to this class.
	*
	* \return The NBO Type value
	*/
	ENBOType getNBOType() const override;

	/*!
	* \brief Returns a list of all classes derived from this class.
	*
	* \return The list of derived classes
	*/
	std::vector<NBOBaseClassPtr> getChildren() const override;

	/*!
	* \brief Returns a list of all child elements contained in this class.
	*
	* \return The list of child classes
	*/
	std::vector<NBOBaseClassPtr> getSubElements() const override;

	/*!
	* \brief Populates this object from a JSON file.
	*
	* \param path The path to the JSON file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a JSON string.
	*
	* \param json_string The JSON content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromJsonString(const std::string& json_string, bool validate = true);

	/*!
	* \brief Populates this object from a XML file.
	*
	* \param path The path to the XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlFile(const std::string& path, bool validate = true);

	/*!
	* \brief Populates this object from a XML string.
	*
	* \param xml_string The XML content as a string
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void fromXmlString(const std::string& xml_string, bool validate = true);

	/*!
	* \brief Serializes this object to an XML file.
	*
	* \param filename The path to the output XML file
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void toXmlFile(const std::string& filename, bool validate = true) const;

	/*!
	* \brief Serializes this object to an XML string.
	*
	* \param validate If true, validates constraints on value. Default is true.
	* \return A string containing the XML representation of this object
	*/
	std::string toXmlString(bool validate = true) const;

	/*!
	* \brief Sets the value of the FillColor attribute.
	*
	* The color of the fill - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFillColor(const Inscoper::NBO::Color_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the FillColor attribute.
	*
	* The color of the fill - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*
	* \return The value of the attribute
	*/
	Color_TypePtr getFillColor() const;

	/*!
	* \brief Resets the FillColor attribute to an unset state.
	*
	* The color of the fill - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*/
	void resetFillColor();

	/*!
	* \brief Checks whether the optional FillColor attribute is present.
	*
	* The color of the fill - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasFillColor() const;

	/*!
	* \brief Sets the value of the FillRule attribute.
	*
	* The rule used to decide which parts of the shape to fill. [enumeration] 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFillRule(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the FillRule attribute.
	*
	* The rule used to decide which parts of the shape to fill. [enumeration] 
	*
	* \return The value of the attribute
	*/
	std::string getFillRule() const;

	/*!
	* \brief Resets the FillRule attribute to an unset state.
	*
	* The rule used to decide which parts of the shape to fill. [enumeration] 
	*/
	void resetFillRule();

	/*!
	* \brief Checks whether the FillRule attribute is present.
	*
	* The rule used to decide which parts of the shape to fill. [enumeration] 
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasFillRule() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* The rule used to decide which parts of the shape to fill. [enumeration] 
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getFillRuleAllowedValues();

	/*!
	* \brief Sets the value of the StrokeColor attribute.
	*
	* The color of the stroke - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setStrokeColor(const Inscoper::NBO::Color_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the StrokeColor attribute.
	*
	* The color of the stroke - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*
	* \return The value of the attribute
	*/
	Color_TypePtr getStrokeColor() const;

	/*!
	* \brief Resets the StrokeColor attribute to an unset state.
	*
	* The color of the stroke - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*/
	void resetStrokeColor();

	/*!
	* \brief Checks whether the optional StrokeColor attribute is present.
	*
	* The color of the stroke - encoded as RGBA The value "-1" is #FFFFFFFF so solid white (it is a signed 32 bit value) NOTE: Prior to the 2012-06 schema the default value was incorrect and produced a transparent red not solid white. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasStrokeColor() const;

	/*!
	* \brief Sets the value of the StrokeWidth attribute.
	*
	* The width of the stroke. Units are set by StrokeWidthUnit. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setStrokeWidth(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the StrokeWidth attribute.
	*
	* The width of the stroke. Units are set by StrokeWidthUnit. 
	*
	* \return The value of the attribute
	*/
	float getStrokeWidth() const;

	/*!
	* \brief Resets the StrokeWidth attribute to an unset state.
	*
	* The width of the stroke. Units are set by StrokeWidthUnit. 
	*/
	void resetStrokeWidth();

	/*!
	* \brief Checks whether the StrokeWidth attribute is present.
	*
	* The width of the stroke. Units are set by StrokeWidthUnit. 
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasStrokeWidth() const;

	/*!
	* \brief Sets the value of the StrokeWidthUnit attribute.
	*
	* The units used for the stroke width. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setStrokeWidthUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the StrokeWidthUnit attribute.
	*
	* The units used for the stroke width. 
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getStrokeWidthUnit() const;

	/*!
	* \brief Resets the StrokeWidthUnit attribute to an unset state.
	*
	* The units used for the stroke width. 
	*/
	void resetStrokeWidthUnit();

	/*!
	* \brief Checks whether the optional StrokeWidthUnit attribute is present.
	*
	* The units used for the stroke width. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasStrokeWidthUnit() const;

	/*!
	* \brief Sets the value of the StrokeDashArray attribute.
	*
	* e.g....................... "none", "10 20 30 10" 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setStrokeDashArray(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the StrokeDashArray attribute.
	*
	* e.g....................... "none", "10 20 30 10" 
	*
	* \return The value of the attribute
	*/
	std::string getStrokeDashArray() const;

	/*!
	* \brief Resets the StrokeDashArray attribute to an unset state.
	*
	* e.g....................... "none", "10 20 30 10" 
	*/
	void resetStrokeDashArray();

	/*!
	* \brief Checks whether the StrokeDashArray attribute is present.
	*
	* e.g....................... "none", "10 20 30 10" 
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasStrokeDashArray() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* e.g....................... "none", "10 20 30 10" 
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getStrokeDashArrayAllowedValues();

	/*!
	* \brief Sets the value of the Text attribute.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setText(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the Text attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	std::string getText() const;

	/*!
	* \brief Resets the Text attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetText();

	/*!
	* \brief Checks whether the Text attribute is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasText() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* No description available in the XSD standard.
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getTextAllowedValues();

	/*!
	* \brief Sets the value of the FontFamily attribute.
	*
	* The font family used to draw the text. [enumeration] Note: these values are all lower case so they match the standard HTML/CSS values. "fantasy" has been included for completeness; we do not recommend its regular use. This attribute is under consideration for removal from the OME-XML schema. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFontFamily(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the FontFamily attribute.
	*
	* The font family used to draw the text. [enumeration] Note: these values are all lower case so they match the standard HTML/CSS values. "fantasy" has been included for completeness; we do not recommend its regular use. This attribute is under consideration for removal from the OME-XML schema. 
	*
	* \return The value of the attribute
	*/
	std::string getFontFamily() const;

	/*!
	* \brief Resets the FontFamily attribute to an unset state.
	*
	* The font family used to draw the text. [enumeration] Note: these values are all lower case so they match the standard HTML/CSS values. "fantasy" has been included for completeness; we do not recommend its regular use. This attribute is under consideration for removal from the OME-XML schema. 
	*/
	void resetFontFamily();

	/*!
	* \brief Checks whether the FontFamily attribute is present.
	*
	* The font family used to draw the text. [enumeration] Note: these values are all lower case so they match the standard HTML/CSS values. "fantasy" has been included for completeness; we do not recommend its regular use. This attribute is under consideration for removal from the OME-XML schema. 
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasFontFamily() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* The font family used to draw the text. [enumeration] Note: these values are all lower case so they match the standard HTML/CSS values. "fantasy" has been included for completeness; we do not recommend its regular use. This attribute is under consideration for removal from the OME-XML schema. 
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getFontFamilyAllowedValues();

	/*!
	* \brief Sets the value of the FontSize attribute.
	*
	* Size of the font. Units are set by FontSizeUnit. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFontSize(const Inscoper::NBO::NonNegativeInt_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the FontSize attribute.
	*
	* Size of the font. Units are set by FontSizeUnit. 
	*
	* \return The value of the attribute
	*/
	NonNegativeInt_TypePtr getFontSize() const;

	/*!
	* \brief Resets the FontSize attribute to an unset state.
	*
	* Size of the font. Units are set by FontSizeUnit. 
	*/
	void resetFontSize();

	/*!
	* \brief Checks whether the optional FontSize attribute is present.
	*
	* Size of the font. Units are set by FontSizeUnit. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasFontSize() const;

	/*!
	* \brief Sets the value of the FontSizeUnit attribute.
	*
	* The units used for the font size. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFontSizeUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the FontSizeUnit attribute.
	*
	* The units used for the font size. 
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getFontSizeUnit() const;

	/*!
	* \brief Resets the FontSizeUnit attribute to an unset state.
	*
	* The units used for the font size. 
	*/
	void resetFontSizeUnit();

	/*!
	* \brief Checks whether the optional FontSizeUnit attribute is present.
	*
	* The units used for the font size. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasFontSizeUnit() const;

	/*!
	* \brief Sets the value of the FontStyle attribute.
	*
	* The style and weight applied to the text. [enumeration] This is a simplified combination of the HTML/CSS attributes font-style AND font-weight. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setFontStyle(const std::string& value, bool validate = true);

	/*!
	* \brief Returns the value of the FontStyle attribute.
	*
	* The style and weight applied to the text. [enumeration] This is a simplified combination of the HTML/CSS attributes font-style AND font-weight. 
	*
	* \return The value of the attribute
	*/
	std::string getFontStyle() const;

	/*!
	* \brief Resets the FontStyle attribute to an unset state.
	*
	* The style and weight applied to the text. [enumeration] This is a simplified combination of the HTML/CSS attributes font-style AND font-weight. 
	*/
	void resetFontStyle();

	/*!
	* \brief Checks whether the FontStyle attribute is present.
	*
	* The style and weight applied to the text. [enumeration] This is a simplified combination of the HTML/CSS attributes font-style AND font-weight. 
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasFontStyle() const;

	/*!
	* \brief Returns the allowed values for this attribut.
	*
	* The style and weight applied to the text. [enumeration] This is a simplified combination of the HTML/CSS attributes font-style AND font-weight. 
	*
	* \return The list of allowed values
	*/
	static const std::set<std::string>& getFontStyleAllowedValues();

	/*!
	* \brief Sets the value of the Locked attribute.
	*
	* Controls whether the shape is locked and read only, true is locked, false is editable. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLocked(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the Locked attribute.
	*
	* Controls whether the shape is locked and read only, true is locked, false is editable. 
	*
	* \return The value of the attribute
	*/
	bool getLocked() const;

	/*!
	* \brief Resets the Locked attribute to an unset state.
	*
	* Controls whether the shape is locked and read only, true is locked, false is editable. 
	*/
	void resetLocked();

	/*!
	* \brief Checks whether the Locked attribute is present.
	*
	* Controls whether the shape is locked and read only, true is locked, false is editable. 
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasLocked() const;

	/*!
	* \brief Sets the value of the ID attribute.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setID(const Inscoper::NBO::ShapeID_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ID attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	ShapeID_TypePtr getID() const;

	/*!
	* \brief Resets the ID attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetID();

	/*!
	* \brief Checks whether the optional ID attribute is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasID() const;

	/*!
	* \brief Sets the value of the TheZ attribute.
	*
	* No description available in the XSD standard.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTheZ(const Inscoper::NBO::NonNegativeInt_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the TheZ attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	NonNegativeInt_TypePtr getTheZ() const;

	/*!
	* \brief Resets the TheZ attribute to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetTheZ();

	/*!
	* \brief Checks whether the optional TheZ attribute is present.
	*
	* No description available in the XSD standard.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasTheZ() const;

	/*!
	* \brief Sets the value of the TheT attribute.
	*
	* The timepoint the ROI applies to. If not specified then the ROI applies to all the timepoints of the Image. [units:none] This is numbered from 0. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTheT(const Inscoper::NBO::NonNegativeInt_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the TheT attribute.
	*
	* The timepoint the ROI applies to. If not specified then the ROI applies to all the timepoints of the Image. [units:none] This is numbered from 0. 
	*
	* \return The value of the attribute
	*/
	NonNegativeInt_TypePtr getTheT() const;

	/*!
	* \brief Resets the TheT attribute to an unset state.
	*
	* The timepoint the ROI applies to. If not specified then the ROI applies to all the timepoints of the Image. [units:none] This is numbered from 0. 
	*/
	void resetTheT();

	/*!
	* \brief Checks whether the optional TheT attribute is present.
	*
	* The timepoint the ROI applies to. If not specified then the ROI applies to all the timepoints of the Image. [units:none] This is numbered from 0. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasTheT() const;

	/*!
	* \brief Sets the value of the TheC attribute.
	*
	* The Channel the ROI applies to. If not specified then the ROI applies to all the channels of the Image. [units:none] This is numbered from 0. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTheC(const Inscoper::NBO::NonNegativeInt_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the TheC attribute.
	*
	* The Channel the ROI applies to. If not specified then the ROI applies to all the channels of the Image. [units:none] This is numbered from 0. 
	*
	* \return The value of the attribute
	*/
	NonNegativeInt_TypePtr getTheC() const;

	/*!
	* \brief Resets the TheC attribute to an unset state.
	*
	* The Channel the ROI applies to. If not specified then the ROI applies to all the channels of the Image. [units:none] This is numbered from 0. 
	*/
	void resetTheC();

	/*!
	* \brief Checks whether the optional TheC attribute is present.
	*
	* The Channel the ROI applies to. If not specified then the ROI applies to all the channels of the Image. [units:none] This is numbered from 0. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasTheC() const;

	/*!
	* \brief Sets the value of the Transform element.
	*
	* This is a matrix used to transform the shape. The element has 6 xsd:float attributes. If the element is present then all 6 values must be included. 
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setTransform(const Inscoper::NBO::AffineTransform_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Transform element.
	*
	* This is a matrix used to transform the shape. The element has 6 xsd:float attributes. If the element is present then all 6 values must be included. 
	*
	* \return The value of the element
	*/
	Inscoper::NBO::AffineTransform_TypePtr getTransform() const;

	/*!
	* \brief Resets the Transform element to an unset state.
	*
	* This is a matrix used to transform the shape. The element has 6 xsd:float attributes. If the element is present then all 6 values must be included. 
	*/
	void resetTransform();

	/*!
	* \brief Checks whether the optional Transform element is present.
	*
	* This is a matrix used to transform the shape. The element has 6 xsd:float attributes. If the element is present then all 6 values must be included. 
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasTransform() const;

	/*!
	* \brief Sets the list of AnnotationRef elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of AnnotationRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setAnnotationRef_List(const std::vector<Inscoper::NBO::AnnotationRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of AnnotationRef elements.
	*
	* No description available in the XSD standard.
	*
	* \return The list of AnnotationRef elements
	*/
	std::vector<Inscoper::NBO::AnnotationRefPtr> getAnnotationRef_List() const;

	/*!
	* \brief Adds a new AnnotationRef element to this object.
	*
	* No description available in the XSD standard.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToAnnotationRef_List(const Inscoper::NBO::AnnotationRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of AnnotationRef.
	*
	* No description available in the XSD standard.
	*/
	void clearAnnotationRef_List();


private:
	class Impl;
	std::unique_ptr<Impl> pImpl;

	Color_TypePtr FillColor = nullptr; // Optional attribute
    std::optional<std::string> FillRule; // Optional attribute
    static const std::set<std::string> FillRuleAllowedValues;
	Color_TypePtr StrokeColor = nullptr; // Optional attribute
    std::optional<float> StrokeWidth; // Optional attribute
	UnitsLength_TypePtr StrokeWidthUnit = nullptr; // Optional attribute
    std::optional<std::string> StrokeDashArray; // Optional attribute
    static const std::set<std::string> StrokeDashArrayAllowedValues;
    std::optional<std::string> Text; // Optional attribute
    static const std::set<std::string> TextAllowedValues;
    std::optional<std::string> FontFamily; // Optional attribute
    static const std::set<std::string> FontFamilyAllowedValues;
	NonNegativeInt_TypePtr FontSize = nullptr; // Optional attribute
	UnitsLength_TypePtr FontSizeUnit = nullptr; // Optional attribute
    std::optional<std::string> FontStyle; // Optional attribute
    static const std::set<std::string> FontStyleAllowedValues;
    std::optional<bool> Locked; // Optional attribute
	ShapeID_TypePtr ID = nullptr; // Required attribute
	NonNegativeInt_TypePtr TheZ = nullptr; // Optional attribute
	NonNegativeInt_TypePtr TheT = nullptr; // Optional attribute
	NonNegativeInt_TypePtr TheC = nullptr; // Optional attribute
    Inscoper::NBO::AffineTransform_TypePtr Transform = nullptr;
    std::vector<Inscoper::NBO::AnnotationRefPtr> AnnotationRef_List;
};

/*! Shared pointer for Shape_Type*/
typedef std::shared_ptr<Shape_Type> Shape_TypePtr;

} // namespace Inscoper::NBO

#endif // SHAPE_TYPE_HPP_INCLUDED