#ifndef SAMPLEPOSITIONING_TYPE_HPP_INCLUDED
#define SAMPLEPOSITIONING_TYPE_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/AnnotationRef.h>
#include <NBO/NBO/Denomination_Type.h>
#include <NBO/NBO/Encoded_Type.h>
#include <NBO/NBO/ManufacturerSpec_Type.h>
#include <NBO/NBO/PositioningType_Type.h>
#include <NBO/NBO/SamplePositioningID_Type.h>
#include <NBO/NBO/StageMovementAxes_Type.h>
#include <NBO/NBO/UnitsAngle_Type.h>
#include <NBO/NBO/UnitsLength_Type.h>
#include <NBO/NBO/UnitsTime_Type.h>
#include <NBO/NBO/UnitsVelocity_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 SamplePositioning.
*
* This element describes a Sample-Optics Positioning device available for this Instrument. An Instrument may have more than one of these devices of different types. For example, a typical setup might include a Mechanical Stage, a Stage Insert, a Turret Objective Focusing, and a Piezoelectric Objective Focusing device.
*/
class NBO_EXPORT SamplePositioning_Type : public ManufacturerSpec_Type {

public:
	
	SamplePositioning_Type();
	~SamplePositioning_Type();

	/*!
	* \brief Cast a NBOBaseClass to a SamplePositioning_Type.
	*
	* \param base The base class to cast
	* \return The casted element, or nullptr if the cast fails
	*/
	static std::shared_ptr<SamplePositioning_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 ID attribute.
	*
	* A Unique Identifier for this component.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setID(const Inscoper::NBO::SamplePositioningID_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ID attribute.
	*
	* A Unique Identifier for this component.
	*
	* \return The value of the attribute
	*/
	SamplePositioningID_TypePtr getID() const;

	/*!
	* \brief Resets the ID attribute to an unset state.
	*
	* A Unique Identifier for this component.
	*/
	void resetID();

	/*!
	* \brief Checks whether the optional ID attribute is present.
	*
	* A Unique Identifier for this component.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasID() const;

	/*!
	* \brief Sets the value of the Name attribute.
	*
	* A User-defined Name for this component.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setName(const Inscoper::NBO::Denomination_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Name attribute.
	*
	* A User-defined Name for this component.
	*
	* \return The value of the attribute
	*/
	Denomination_TypePtr getName() const;

	/*!
	* \brief Resets the Name attribute to an unset state.
	*
	* A User-defined Name for this component.
	*/
	void resetName();

	/*!
	* \brief Checks whether the optional Name attribute is present.
	*
	* A User-defined Name for this component.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasName() const;

	/*!
	* \brief Sets the value of the Encoded attribute.
	*
	* This field describes whether this Sample Positioning Device is equipped with a system (i.e., encoder) to monitor movement and provide automatic positional feedback for high-precision operations, and it specifies the type of encoders it has.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setEncoded(const Inscoper::NBO::Encoded_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Encoded attribute.
	*
	* This field describes whether this Sample Positioning Device is equipped with a system (i.e., encoder) to monitor movement and provide automatic positional feedback for high-precision operations, and it specifies the type of encoders it has.
	*
	* \return The value of the attribute
	*/
	Encoded_TypePtr getEncoded() const;

	/*!
	* \brief Resets the Encoded attribute to an unset state.
	*
	* This field describes whether this Sample Positioning Device is equipped with a system (i.e., encoder) to monitor movement and provide automatic positional feedback for high-precision operations, and it specifies the type of encoders it has.
	*/
	void resetEncoded();

	/*!
	* \brief Checks whether the optional Encoded attribute is present.
	*
	* This field describes whether this Sample Positioning Device is equipped with a system (i.e., encoder) to monitor movement and provide automatic positional feedback for high-precision operations, and it specifies the type of encoders it has.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasEncoded() const;

	/*!
	* \brief Sets the value of the Motorized attribute.
	*
	* This field describes whether (True) or not (False) this Sample Positioning Device is fitted with a Motorized component (i.e., ball-screw drives or rack mechanisms, sometimes equipped with precision calibration) to primarily assist in the translational movement of the sample in the X and Y or Z directions. A Motorized Stage is also often referred to as a Scanning Stage.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMotorized(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the Motorized attribute.
	*
	* This field describes whether (True) or not (False) this Sample Positioning Device is fitted with a Motorized component (i.e., ball-screw drives or rack mechanisms, sometimes equipped with precision calibration) to primarily assist in the translational movement of the sample in the X and Y or Z directions. A Motorized Stage is also often referred to as a Scanning Stage.
	*
	* \return The value of the attribute
	*/
	bool getMotorized() const;

	/*!
	* \brief Resets the Motorized attribute to an unset state.
	*
	* This field describes whether (True) or not (False) this Sample Positioning Device is fitted with a Motorized component (i.e., ball-screw drives or rack mechanisms, sometimes equipped with precision calibration) to primarily assist in the translational movement of the sample in the X and Y or Z directions. A Motorized Stage is also often referred to as a Scanning Stage.
	*/
	void resetMotorized();

	/*!
	* \brief Checks whether the Motorized attribute is present.
	*
	* This field describes whether (True) or not (False) this Sample Positioning Device is fitted with a Motorized component (i.e., ball-screw drives or rack mechanisms, sometimes equipped with precision calibration) to primarily assist in the translational movement of the sample in the X and Y or Z directions. A Motorized Stage is also often referred to as a Scanning Stage.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasMotorized() const;

	/*!
	* \brief Sets the value of the ZMaxVelocity attribute.
	*
	* This field describes the maximum Z-axis Velocity at which this Sample Positioning Device is capable of moving.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZMaxVelocity(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZMaxVelocity attribute.
	*
	* This field describes the maximum Z-axis Velocity at which this Sample Positioning Device is capable of moving.
	*
	* \return The value of the attribute
	*/
	float getZMaxVelocity() const;

	/*!
	* \brief Resets the ZMaxVelocity attribute to an unset state.
	*
	* This field describes the maximum Z-axis Velocity at which this Sample Positioning Device is capable of moving.
	*/
	void resetZMaxVelocity();

	/*!
	* \brief Checks whether the ZMaxVelocity attribute is present.
	*
	* This field describes the maximum Z-axis Velocity at which this Sample Positioning Device is capable of moving.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZMaxVelocity() const;

	/*!
	* \brief Sets the value of the ZMaxVelocityUnit 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 setZMaxVelocityUnit(const Inscoper::NBO::UnitsVelocity_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZMaxVelocityUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsVelocity_TypePtr getZMaxVelocityUnit() const;

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

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

	/*!
	* \brief Sets the value of the ZRepeatability attribute.
	*
	* This field captures the expected Accuracy with which this Sample Positioning Device is capable of returning to a previously visited Z-axis Position, as specified by the Manufacturer. This metric is important for example for Tiling.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZRepeatability(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZRepeatability attribute.
	*
	* This field captures the expected Accuracy with which this Sample Positioning Device is capable of returning to a previously visited Z-axis Position, as specified by the Manufacturer. This metric is important for example for Tiling.
	*
	* \return The value of the attribute
	*/
	float getZRepeatability() const;

	/*!
	* \brief Resets the ZRepeatability attribute to an unset state.
	*
	* This field captures the expected Accuracy with which this Sample Positioning Device is capable of returning to a previously visited Z-axis Position, as specified by the Manufacturer. This metric is important for example for Tiling.
	*/
	void resetZRepeatability();

	/*!
	* \brief Checks whether the ZRepeatability attribute is present.
	*
	* This field captures the expected Accuracy with which this Sample Positioning Device is capable of returning to a previously visited Z-axis Position, as specified by the Manufacturer. This metric is important for example for Tiling.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZRepeatability() const;

	/*!
	* \brief Sets the value of the ZRepeatabilityUnit 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 setZRepeatabilityUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZRepeatabilityUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getZRepeatabilityUnit() const;

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

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

	/*!
	* \brief Sets the value of the ZTravelRange attribute.
	*
	* This field describes the total range in the Z-axis that this Sample Positioning Device can travel.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZTravelRange(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZTravelRange attribute.
	*
	* This field describes the total range in the Z-axis that this Sample Positioning Device can travel.
	*
	* \return The value of the attribute
	*/
	float getZTravelRange() const;

	/*!
	* \brief Resets the ZTravelRange attribute to an unset state.
	*
	* This field describes the total range in the Z-axis that this Sample Positioning Device can travel.
	*/
	void resetZTravelRange();

	/*!
	* \brief Checks whether the ZTravelRange attribute is present.
	*
	* This field describes the total range in the Z-axis that this Sample Positioning Device can travel.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZTravelRange() const;

	/*!
	* \brief Sets the value of the ZTravelRangeUnit 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 setZTravelRangeUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZTravelRangeUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getZTravelRangeUnit() const;

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

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

	/*!
	* \brief Sets the value of the MovementAxes attribute.
	*
	* This field describes the axes or combination of axes along which this Sample Positioning Device is capable of moving.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setMovementAxes(const Inscoper::NBO::StageMovementAxes_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the MovementAxes attribute.
	*
	* This field describes the axes or combination of axes along which this Sample Positioning Device is capable of moving.
	*
	* \return The value of the attribute
	*/
	StageMovementAxes_TypePtr getMovementAxes() const;

	/*!
	* \brief Resets the MovementAxes attribute to an unset state.
	*
	* This field describes the axes or combination of axes along which this Sample Positioning Device is capable of moving.
	*/
	void resetMovementAxes();

	/*!
	* \brief Checks whether the optional MovementAxes attribute is present.
	*
	* This field describes the axes or combination of axes along which this Sample Positioning Device is capable of moving.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasMovementAxes() const;

	/*!
	* \brief Sets the value of the BuiltIn attribute.
	*
	* This field indicates whether this Sample Positioning Device is built into the Microscope Stand (True) or it is removable and interchangeable (False).
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setBuiltIn(const bool& value, bool validate = true);

	/*!
	* \brief Returns the value of the BuiltIn attribute.
	*
	* This field indicates whether this Sample Positioning Device is built into the Microscope Stand (True) or it is removable and interchangeable (False).
	*
	* \return The value of the attribute
	*/
	bool getBuiltIn() const;

	/*!
	* \brief Resets the BuiltIn attribute to an unset state.
	*
	* This field indicates whether this Sample Positioning Device is built into the Microscope Stand (True) or it is removable and interchangeable (False).
	*/
	void resetBuiltIn();

	/*!
	* \brief Checks whether the BuiltIn attribute is present.
	*
	* This field indicates whether this Sample Positioning Device is built into the Microscope Stand (True) or it is removable and interchangeable (False).
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasBuiltIn() const;

	/*!
	* \brief Sets the value of the ZReproducibility attribute.
	*
	* This field captures the expected Precision with which this this Sample Positioning Device is capable of maintaining a given Z-axis Position over time during as specified by the Manufacturer. This metric is generally referred to as Reproducibility and it might also be referred to as Focal Drift. This metric is particularly relevant for Stereology systems and for the calibration of Sample Positioning devices.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZReproducibility(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZReproducibility attribute.
	*
	* This field captures the expected Precision with which this this Sample Positioning Device is capable of maintaining a given Z-axis Position over time during as specified by the Manufacturer. This metric is generally referred to as Reproducibility and it might also be referred to as Focal Drift. This metric is particularly relevant for Stereology systems and for the calibration of Sample Positioning devices.
	*
	* \return The value of the attribute
	*/
	float getZReproducibility() const;

	/*!
	* \brief Resets the ZReproducibility attribute to an unset state.
	*
	* This field captures the expected Precision with which this this Sample Positioning Device is capable of maintaining a given Z-axis Position over time during as specified by the Manufacturer. This metric is generally referred to as Reproducibility and it might also be referred to as Focal Drift. This metric is particularly relevant for Stereology systems and for the calibration of Sample Positioning devices.
	*/
	void resetZReproducibility();

	/*!
	* \brief Checks whether the ZReproducibility attribute is present.
	*
	* This field captures the expected Precision with which this this Sample Positioning Device is capable of maintaining a given Z-axis Position over time during as specified by the Manufacturer. This metric is generally referred to as Reproducibility and it might also be referred to as Focal Drift. This metric is particularly relevant for Stereology systems and for the calibration of Sample Positioning devices.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZReproducibility() const;

	/*!
	* \brief Sets the value of the ZReproducibilityUnit 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 setZReproducibilityUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZReproducibilityUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getZReproducibilityUnit() const;

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

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

	/*!
	* \brief Sets the value of the ZSettlingTime attribute.
	*
	* This field describes the expected time it takes for this Sample Positioning Device to stabilize at the target Z-axis position, as specified by the Manufacturer.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZSettlingTime(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZSettlingTime attribute.
	*
	* This field describes the expected time it takes for this Sample Positioning Device to stabilize at the target Z-axis position, as specified by the Manufacturer.
	*
	* \return The value of the attribute
	*/
	float getZSettlingTime() const;

	/*!
	* \brief Resets the ZSettlingTime attribute to an unset state.
	*
	* This field describes the expected time it takes for this Sample Positioning Device to stabilize at the target Z-axis position, as specified by the Manufacturer.
	*/
	void resetZSettlingTime();

	/*!
	* \brief Checks whether the ZSettlingTime attribute is present.
	*
	* This field describes the expected time it takes for this Sample Positioning Device to stabilize at the target Z-axis position, as specified by the Manufacturer.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZSettlingTime() const;

	/*!
	* \brief Sets the value of the ZSettlingTimeUnit 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 setZSettlingTimeUnit(const Inscoper::NBO::UnitsTime_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZSettlingTimeUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsTime_TypePtr getZSettlingTimeUnit() const;

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

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

	/*!
	* \brief Sets the value of the ZResolution attribute.
	*
	* This field describes the Z-axis motion Resolution of this Sample Positioning Device as specified by the Manufacturer.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZResolution(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZResolution attribute.
	*
	* This field describes the Z-axis motion Resolution of this Sample Positioning Device as specified by the Manufacturer.
	*
	* \return The value of the attribute
	*/
	float getZResolution() const;

	/*!
	* \brief Resets the ZResolution attribute to an unset state.
	*
	* This field describes the Z-axis motion Resolution of this Sample Positioning Device as specified by the Manufacturer.
	*/
	void resetZResolution();

	/*!
	* \brief Checks whether the ZResolution attribute is present.
	*
	* This field describes the Z-axis motion Resolution of this Sample Positioning Device as specified by the Manufacturer.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZResolution() const;

	/*!
	* \brief Sets the value of the ZResolutionUnit 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 setZResolutionUnit(const Inscoper::NBO::UnitsLength_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZResolutionUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsLength_TypePtr getZResolutionUnit() const;

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

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

	/*!
	* \brief Sets the value of the ZPositionLinearityError attribute.
	*
	* This field describes the Z-axis positioning error (typically expressed in % error) associated with this Sample Positioning Device as specified by the Manufacturer.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setZPositionLinearityError(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the ZPositionLinearityError attribute.
	*
	* This field describes the Z-axis positioning error (typically expressed in % error) associated with this Sample Positioning Device as specified by the Manufacturer.
	*
	* \return The value of the attribute
	*/
	float getZPositionLinearityError() const;

	/*!
	* \brief Resets the ZPositionLinearityError attribute to an unset state.
	*
	* This field describes the Z-axis positioning error (typically expressed in % error) associated with this Sample Positioning Device as specified by the Manufacturer.
	*/
	void resetZPositionLinearityError();

	/*!
	* \brief Checks whether the ZPositionLinearityError attribute is present.
	*
	* This field describes the Z-axis positioning error (typically expressed in % error) associated with this Sample Positioning Device as specified by the Manufacturer.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasZPositionLinearityError() const;

	/*!
	* \brief Sets the value of the Type attribute.
	*
	* This field describes the general category of this Sample Positioning Device.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setType(const Inscoper::NBO::PositioningType_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the Type attribute.
	*
	* This field describes the general category of this Sample Positioning Device.
	*
	* \return The value of the attribute
	*/
	PositioningType_TypePtr getType() const;

	/*!
	* \brief Resets the Type attribute to an unset state.
	*
	* This field describes the general category of this Sample Positioning Device.
	*/
	void resetType();

	/*!
	* \brief Checks whether the optional Type attribute is present.
	*
	* This field describes the general category of this Sample Positioning Device.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasType() const;

	/*!
	* \brief Sets the value of the RotationAngle attribute.
	*
	* The angle by which this Sample Positioning Device is capable of rotating.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setRotationAngle(const float& value, bool validate = true);

	/*!
	* \brief Returns the value of the RotationAngle attribute.
	*
	* The angle by which this Sample Positioning Device is capable of rotating.
	*
	* \return The value of the attribute
	*/
	float getRotationAngle() const;

	/*!
	* \brief Resets the RotationAngle attribute to an unset state.
	*
	* The angle by which this Sample Positioning Device is capable of rotating.
	*/
	void resetRotationAngle();

	/*!
	* \brief Checks whether the RotationAngle attribute is present.
	*
	* The angle by which this Sample Positioning Device is capable of rotating.
	*
	* \return true if the attribute has been set, false otherwise
	*/
	bool hasRotationAngle() const;

	/*!
	* \brief Sets the value of the RotationAngleUnit 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 setRotationAngleUnit(const Inscoper::NBO::UnitsAngle_TypePtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the RotationAngleUnit attribute.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the attribute
	*/
	UnitsAngle_TypePtr getRotationAngleUnit() const;

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

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

	/*!
	* \brief Sets the value of the AnnotationRef element.
	*
	* 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 setAnnotationRef(const Inscoper::NBO::AnnotationRefPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the AnnotationRef element.
	*
	* No description available in the XSD standard.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::AnnotationRefPtr getAnnotationRef() const;

	/*!
	* \brief Resets the AnnotationRef element to an unset state.
	*
	* No description available in the XSD standard.
	*/
	void resetAnnotationRef();

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


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

	SamplePositioningID_TypePtr ID = nullptr; // Required attribute
	Denomination_TypePtr Name = nullptr; // Optional attribute
	Encoded_TypePtr Encoded = nullptr; // Required attribute
    std::optional<bool> Motorized; // Required attribute
    std::optional<float> ZMaxVelocity; // Optional attribute
	UnitsVelocity_TypePtr ZMaxVelocityUnit = nullptr; // Optional attribute
    std::optional<float> ZRepeatability; // Required attribute
	UnitsLength_TypePtr ZRepeatabilityUnit = nullptr; // Optional attribute
    std::optional<float> ZTravelRange; // Optional attribute
	UnitsLength_TypePtr ZTravelRangeUnit = nullptr; // Optional attribute
	StageMovementAxes_TypePtr MovementAxes = nullptr; // Required attribute
    std::optional<bool> BuiltIn; // Required attribute
    std::optional<float> ZReproducibility; // Optional attribute
	UnitsLength_TypePtr ZReproducibilityUnit = nullptr; // Optional attribute
    std::optional<float> ZSettlingTime; // Optional attribute
	UnitsTime_TypePtr ZSettlingTimeUnit = nullptr; // Optional attribute
    std::optional<float> ZResolution; // Optional attribute
	UnitsLength_TypePtr ZResolutionUnit = nullptr; // Optional attribute
    std::optional<float> ZPositionLinearityError; // Optional attribute
	PositioningType_TypePtr Type = nullptr; // Optional attribute
    std::optional<float> RotationAngle; // Optional attribute
	UnitsAngle_TypePtr RotationAngleUnit = nullptr; // Optional attribute
    Inscoper::NBO::AnnotationRefPtr AnnotationRef = nullptr;
};

/*! Shared pointer for SamplePositioning_Type*/
typedef std::shared_ptr<SamplePositioning_Type> SamplePositioning_TypePtr;

} // namespace Inscoper::NBO

#endif // SAMPLEPOSITIONING_TYPE_HPP_INCLUDED