#ifndef LIGHTPATH_TYPE_HPP_INCLUDED
#define LIGHTPATH_TYPE_HPP_INCLUDED

#include <iostream>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include <NBO/NBO/AcoustoOpticalDeviceSettings_Type.h>
#include <NBO/NBO/AnnotationRef.h>
#include <NBO/NBO/ApertureRef.h>
#include <NBO/NBO/ConfocalScannerSettings.h>
#include <NBO/NBO/Denomination_Type.h>
#include <NBO/NBO/DetectorSettings_Type.h>
#include <NBO/NBO/ElectroOpticalDeviceSettings_Type.h>
#include <NBO/NBO/EmissionFilterRef.h>
#include <NBO/NBO/ExcitationFilterRef.h>
#include <NBO/NBO/FilterSet.h>
#include <NBO/NBO/GenericFilterRef.h>
#include <NBO/NBO/LSID_Type.h>
#include <NBO/NBO/LensSettings.h>
#include <NBO/NBO/LightSourceCouplingRef.h>
#include <NBO/NBO/LightSourceSettings.h>
#include <NBO/NBO/MirroringDeviceSettings.h>
#include <NBO/NBO/OpticalApertureSettings_Type.h>
#include <NBO/NBO/OpticalAssemblyRef.h>
#include <NBO/NBO/PolarizationOpticsRef_Type.h>
#include <NBO/NBO/PrismSettings.h>
#include <NBO/NBO/ShutterSettings.h>
#include <NBO/NBO/StandardDichroicRef.h>
#include <NBO/NBO/TIRFSettings.h>
#include <NBO/NBO/PositiveInt_Type.h>
#include <NBO/NBO/LSID_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 LightPath.
*
* This empty element refers to a LightSourceCoupling component used in this light path.
*/
class NBO_EXPORT LightPath_Type : public NBOBaseClass {

public:
	/*!
	* \brief Represents the XML element LightPathMap.
	*
	* This element holds a Map that records the order in which the different optical component associated with this Light Path are physically laid out.
	*/
	class NBO_EXPORT InlineLightPathMap : public NBOBaseClass {
	
	public:
		/*!
		* \brief Represents the XML element OpticalComponentPosition.
		*
		* This element records the Position of individual optical components in this Light Path.
		*/
		class NBO_EXPORT InlineOpticalComponentPosition : public NBOBaseClass {
		
		public:
			
			InlineOpticalComponentPosition();
			~InlineOpticalComponentPosition();
		
			/*!
			* \brief Cast a NBOBaseClass to a InlineOpticalComponentPosition.
			*
			* \param base The base class to cast
			* \return The casted element, or nullptr if the cast fails
			*/
			static std::shared_ptr<InlineOpticalComponentPosition> fromBase(NBOBaseClassPtr base);
		
			/*!
			* \brief Returns the class type name.
			*
			* \return The class type name
			*/
			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.
			*
			* This is the ID of an existing Optical Component that is present in this Light Path.
			*
			* \param value The value to set
			* \param validate If true, validates constraints on value. Default is true.
			*/
			void setID(const Inscoper::NBO::LSID_TypePtr& value, bool validate = true);
		
			/*!
			* \brief Returns the value of the ID attribute.
			*
			* This is the ID of an existing Optical Component that is present in this Light Path.
			*
			* \return The value of the attribute
			*/
			LSID_TypePtr getID() const;
		
			/*!
			* \brief Resets the ID attribute to an unset state.
			*
			* This is the ID of an existing Optical Component that is present in this Light Path.
			*/
			void resetID();
		
			/*!
			* \brief Checks whether the optional ID attribute is present.
			*
			* This is the ID of an existing Optical Component that is present in this Light Path.
			*
			* \return true if the optional attribute has been set, false otherwise
			*/
			bool hasID() const;
		
			/*!
			* \brief Sets the value of the Order attribute.
			*
			* This field records the Positional order in which this optical component is found in this Light Path during the Acquisition of this Image. 
			*
			* \param value The value to set
			* \param validate If true, validates constraints on value. Default is true.
			*/
			void setOrder(const Inscoper::NBO::PositiveInt_TypePtr& value, bool validate = true);
		
			/*!
			* \brief Returns the value of the Order attribute.
			*
			* This field records the Positional order in which this optical component is found in this Light Path during the Acquisition of this Image. 
			*
			* \return The value of the attribute
			*/
			PositiveInt_TypePtr getOrder() const;
		
			/*!
			* \brief Resets the Order attribute to an unset state.
			*
			* This field records the Positional order in which this optical component is found in this Light Path during the Acquisition of this Image. 
			*/
			void resetOrder();
		
			/*!
			* \brief Checks whether the optional Order attribute is present.
			*
			* This field records the Positional order in which this optical component is found in this Light Path during the Acquisition of this Image. 
			*
			* \return true if the optional attribute has been set, false otherwise
			*/
			bool hasOrder() const;
		
		
		private:
			class Impl;
			std::unique_ptr<Impl> pImpl;
		
			LSID_TypePtr ID = nullptr; // Required attribute
			PositiveInt_TypePtr Order = nullptr; // Required attribute
		};
		
		/*! Shared pointer for InlineOpticalComponentPosition*/
		typedef std::shared_ptr<InlineOpticalComponentPosition> InlineOpticalComponentPositionPtr;
		
		
		InlineLightPathMap();
		~InlineLightPathMap();
	
		/*!
		* \brief Cast a NBOBaseClass to a InlineLightPathMap.
		*
		* \param base The base class to cast
		* \return The casted element, or nullptr if the cast fails
		*/
		static std::shared_ptr<InlineLightPathMap> fromBase(NBOBaseClassPtr base);
	
		/*!
		* \brief Returns the class type name.
		*
		* \return The class type name
		*/
		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::LSID_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
		*/
		LSID_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 list of OpticalComponentPosition elements.
		*
		* This element records the Position of individual optical components in this Light Path.
		*
		* \param value The new list of OpticalComponentPosition elements
		* \param validate If true, validates constraints on value. Default is true.
		*/
		void setOpticalComponentPosition_List(const std::vector<Inscoper::NBO::LightPath_Type::InlineLightPathMap::InlineOpticalComponentPositionPtr>& value, bool validate = true);
	
		/*!
		* \brief Returns the list of OpticalComponentPosition elements.
		*
		* This element records the Position of individual optical components in this Light Path.
		*
		* \return The list of OpticalComponentPosition elements
		*/
		std::vector<Inscoper::NBO::LightPath_Type::InlineLightPathMap::InlineOpticalComponentPositionPtr> getOpticalComponentPosition_List() const;
	
		/*!
		* \brief Adds a new OpticalComponentPosition element to this object.
		*
		* This element records the Position of individual optical components in this Light Path.
		*
		* \param value The element to add
		* \param validate If true, validates constraints on value. Default is true.
		*/
		void addToOpticalComponentPosition_List(const Inscoper::NBO::LightPath_Type::InlineLightPathMap::InlineOpticalComponentPositionPtr& value, bool validate = true);
	
		/*!
		* \brief Clear the list of OpticalComponentPosition.
		*
		* This element records the Position of individual optical components in this Light Path.
		*/
		void clearOpticalComponentPosition_List();
	
	
	private:
		class Impl;
		std::unique_ptr<Impl> pImpl;
	
		LSID_TypePtr ID = nullptr; // Optional attribute
	    std::vector<Inscoper::NBO::LightPath_Type::InlineLightPathMap::InlineOpticalComponentPositionPtr> OpticalComponentPosition_List;
	};
	
	/*! Shared pointer for InlineLightPathMap*/
	typedef std::shared_ptr<InlineLightPathMap> InlineLightPathMapPtr;
	
	
	LightPath_Type();
	~LightPath_Type();

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

	/*!
	* \brief Returns the class type name.
	*
	* \return The class type name
	*/
	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::LSID_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
	*/
	LSID_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 list of LightSourceSettings elements.
	*
	* No description available in the XSD standard.
	*
	* \param value The new list of LightSourceSettings elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLightSourceSettings_List(const std::vector<Inscoper::NBO::LightSourceSettingsPtr>& value, bool validate = true);

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

	/*!
	* \brief Adds a new LightSourceSettings 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 addToLightSourceSettings_List(const Inscoper::NBO::LightSourceSettingsPtr& value, bool validate = true);

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

	/*!
	* \brief Sets the list of LightSourceCouplingRef elements.
	*
	* This empty element refers to a LightSourceCoupling component used in this light path.
	*
	* \param value The new list of LightSourceCouplingRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLightSourceCouplingRef_List(const std::vector<Inscoper::NBO::LightSourceCouplingRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of LightSourceCouplingRef elements.
	*
	* This empty element refers to a LightSourceCoupling component used in this light path.
	*
	* \return The list of LightSourceCouplingRef elements
	*/
	std::vector<Inscoper::NBO::LightSourceCouplingRefPtr> getLightSourceCouplingRef_List() const;

	/*!
	* \brief Adds a new LightSourceCouplingRef element to this object.
	*
	* This empty element refers to a LightSourceCoupling component used in this light path.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToLightSourceCouplingRef_List(const Inscoper::NBO::LightSourceCouplingRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of LightSourceCouplingRef.
	*
	* This empty element refers to a LightSourceCoupling component used in this light path.
	*/
	void clearLightSourceCouplingRef_List();

	/*!
	* \brief Sets the list of ExcitationFilterRef elements.
	*
	* This empty element refers to an ExcitationFilter component used in this light path.
	*
	* \param value The new list of ExcitationFilterRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setExcitationFilterRef_List(const std::vector<Inscoper::NBO::ExcitationFilterRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of ExcitationFilterRef elements.
	*
	* This empty element refers to an ExcitationFilter component used in this light path.
	*
	* \return The list of ExcitationFilterRef elements
	*/
	std::vector<Inscoper::NBO::ExcitationFilterRefPtr> getExcitationFilterRef_List() const;

	/*!
	* \brief Adds a new ExcitationFilterRef element to this object.
	*
	* This empty element refers to an ExcitationFilter component used in this light path.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToExcitationFilterRef_List(const Inscoper::NBO::ExcitationFilterRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of ExcitationFilterRef.
	*
	* This empty element refers to an ExcitationFilter component used in this light path.
	*/
	void clearExcitationFilterRef_List();

	/*!
	* \brief Sets the list of StandardDichroicRef elements.
	*
	* This empty element refers to a StandardDichroic component used in this light path.
	*
	* \param value The new list of StandardDichroicRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setStandardDichroicRef_List(const std::vector<Inscoper::NBO::StandardDichroicRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of StandardDichroicRef elements.
	*
	* This empty element refers to a StandardDichroic component used in this light path.
	*
	* \return The list of StandardDichroicRef elements
	*/
	std::vector<Inscoper::NBO::StandardDichroicRefPtr> getStandardDichroicRef_List() const;

	/*!
	* \brief Adds a new StandardDichroicRef element to this object.
	*
	* This empty element refers to a StandardDichroic component used in this light path.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToStandardDichroicRef_List(const Inscoper::NBO::StandardDichroicRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of StandardDichroicRef.
	*
	* This empty element refers to a StandardDichroic component used in this light path.
	*/
	void clearStandardDichroicRef_List();

	/*!
	* \brief Sets the list of EmissionFilterRef elements.
	*
	* This empty element refers to an EmissionFilter component used in this light path.
	*
	* \param value The new list of EmissionFilterRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setEmissionFilterRef_List(const std::vector<Inscoper::NBO::EmissionFilterRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of EmissionFilterRef elements.
	*
	* This empty element refers to an EmissionFilter component used in this light path.
	*
	* \return The list of EmissionFilterRef elements
	*/
	std::vector<Inscoper::NBO::EmissionFilterRefPtr> getEmissionFilterRef_List() const;

	/*!
	* \brief Adds a new EmissionFilterRef element to this object.
	*
	* This empty element refers to an EmissionFilter component used in this light path.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToEmissionFilterRef_List(const Inscoper::NBO::EmissionFilterRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of EmissionFilterRef.
	*
	* This empty element refers to an EmissionFilter component used in this light path.
	*/
	void clearEmissionFilterRef_List();

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

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

	/*!
	* \brief Adds a new FilterSet 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 addToFilterSet_List(const Inscoper::NBO::FilterSetPtr& value, bool validate = true);

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

	/*!
	* \brief Sets the list of GenericFilterRef elements.
	*
	* This empty element refers to an additional Generic Filter component placed in this Light Path.
	*
	* \param value The new list of GenericFilterRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setGenericFilterRef_List(const std::vector<Inscoper::NBO::GenericFilterRefPtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of GenericFilterRef elements.
	*
	* This empty element refers to an additional Generic Filter component placed in this Light Path.
	*
	* \return The list of GenericFilterRef elements
	*/
	std::vector<Inscoper::NBO::GenericFilterRefPtr> getGenericFilterRef_List() const;

	/*!
	* \brief Adds a new GenericFilterRef element to this object.
	*
	* This empty element refers to an additional Generic Filter component placed in this Light Path.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToGenericFilterRef_List(const Inscoper::NBO::GenericFilterRefPtr& value, bool validate = true);

	/*!
	* \brief Clear the list of GenericFilterRef.
	*
	* This empty element refers to an additional Generic Filter component placed in this Light Path.
	*/
	void clearGenericFilterRef_List();

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

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

	/*!
	* \brief Adds a new LensSettings 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 addToLensSettings_List(const Inscoper::NBO::LensSettingsPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new MirroringDeviceSettings 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 addToMirroringDeviceSettings_List(const Inscoper::NBO::MirroringDeviceSettingsPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new ApertureRef 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 addToApertureRef_List(const Inscoper::NBO::ApertureRefPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new OpticalAssemblyRef 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 addToOpticalAssemblyRef_List(const Inscoper::NBO::OpticalAssemblyRefPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new OpticalApertureSettingsGroup 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 addToOpticalApertureSettingsGroup_List(const Inscoper::NBO::OpticalApertureSettings_TypePtr& value, bool validate = true);

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

	/*!
	* \brief Sets the list of PolarizationOpticsRef elements.
	*
	* This empty element refers to a PolarizationOptics component placed in this light path.
	*
	* \param value The new list of PolarizationOpticsRef elements
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setPolarizationOpticsRef_List(const std::vector<Inscoper::NBO::PolarizationOpticsRef_TypePtr>& value, bool validate = true);

	/*!
	* \brief Returns the list of PolarizationOpticsRef elements.
	*
	* This empty element refers to a PolarizationOptics component placed in this light path.
	*
	* \return The list of PolarizationOpticsRef elements
	*/
	std::vector<Inscoper::NBO::PolarizationOpticsRef_TypePtr> getPolarizationOpticsRef_List() const;

	/*!
	* \brief Adds a new PolarizationOpticsRef element to this object.
	*
	* This empty element refers to a PolarizationOptics component placed in this light path.
	*
	* \param value The element to add
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void addToPolarizationOpticsRef_List(const Inscoper::NBO::PolarizationOpticsRef_TypePtr& value, bool validate = true);

	/*!
	* \brief Clear the list of PolarizationOpticsRef.
	*
	* This empty element refers to a PolarizationOptics component placed in this light path.
	*/
	void clearPolarizationOpticsRef_List();

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

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

	/*!
	* \brief Adds a new PrismSettings 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 addToPrismSettings_List(const Inscoper::NBO::PrismSettingsPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new ShutterSettings 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 addToShutterSettings_List(const Inscoper::NBO::ShutterSettingsPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new DetectorSettingsGroup 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 addToDetectorSettingsGroup_List(const Inscoper::NBO::DetectorSettings_TypePtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new ConfocalScannerSettings 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 addToConfocalScannerSettings_List(const Inscoper::NBO::ConfocalScannerSettingsPtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new AcoustoOpticalDeviceSettingsGroup 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 addToAcoustoOpticalDeviceSettingsGroup_List(const Inscoper::NBO::AcoustoOpticalDeviceSettings_TypePtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new ElectroOpticalDeviceSettingsGroup 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 addToElectroOpticalDeviceSettingsGroup_List(const Inscoper::NBO::ElectroOpticalDeviceSettings_TypePtr& value, bool validate = true);

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

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

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

	/*!
	* \brief Adds a new TIRFSettings 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 addToTIRFSettings_List(const Inscoper::NBO::TIRFSettingsPtr& value, bool validate = true);

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

	/*!
	* \brief Sets the value of the LightPathMap element.
	*
	* This element holds a Map that records the order in which the different optical component associated with this Light Path are physically laid out.
	*
	* \param value The value to set
	* \param validate If true, validates constraints on value. Default is true.
	*/
	void setLightPathMap(const Inscoper::NBO::LightPath_Type::InlineLightPathMapPtr& value, bool validate = true);

	/*!
	* \brief Returns the value of the LightPathMap element.
	*
	* This element holds a Map that records the order in which the different optical component associated with this Light Path are physically laid out.
	*
	* \return The value of the element
	*/
	Inscoper::NBO::LightPath_Type::InlineLightPathMapPtr getLightPathMap() const;

	/*!
	* \brief Resets the LightPathMap element to an unset state.
	*
	* This element holds a Map that records the order in which the different optical component associated with this Light Path are physically laid out.
	*/
	void resetLightPathMap();

	/*!
	* \brief Checks whether the optional LightPathMap element is present.
	*
	* This element holds a Map that records the order in which the different optical component associated with this Light Path are physically laid out.
	*
	* \return true if the optional attribute has been set, false otherwise
	*/
	bool hasLightPathMap() 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;

	LSID_TypePtr ID = nullptr; // Required attribute
	Denomination_TypePtr Name = nullptr; // Optional attribute
    std::vector<Inscoper::NBO::LightSourceSettingsPtr> LightSourceSettings_List;
    std::vector<Inscoper::NBO::LightSourceCouplingRefPtr> LightSourceCouplingRef_List;
    std::vector<Inscoper::NBO::ExcitationFilterRefPtr> ExcitationFilterRef_List;
    std::vector<Inscoper::NBO::StandardDichroicRefPtr> StandardDichroicRef_List;
    std::vector<Inscoper::NBO::EmissionFilterRefPtr> EmissionFilterRef_List;
    std::vector<Inscoper::NBO::FilterSetPtr> FilterSet_List;
    std::vector<Inscoper::NBO::GenericFilterRefPtr> GenericFilterRef_List;
    std::vector<Inscoper::NBO::LensSettingsPtr> LensSettings_List;
    std::vector<Inscoper::NBO::MirroringDeviceSettingsPtr> MirroringDeviceSettings_List;
    std::vector<Inscoper::NBO::ApertureRefPtr> ApertureRef_List;
    std::vector<Inscoper::NBO::OpticalAssemblyRefPtr> OpticalAssemblyRef_List;
    std::vector<Inscoper::NBO::OpticalApertureSettings_TypePtr> OpticalApertureSettingsGroup_List;
    std::vector<Inscoper::NBO::PolarizationOpticsRef_TypePtr> PolarizationOpticsRef_List;
    std::vector<Inscoper::NBO::PrismSettingsPtr> PrismSettings_List;
    std::vector<Inscoper::NBO::ShutterSettingsPtr> ShutterSettings_List;
    std::vector<Inscoper::NBO::DetectorSettings_TypePtr> DetectorSettingsGroup_List;
    std::vector<Inscoper::NBO::ConfocalScannerSettingsPtr> ConfocalScannerSettings_List;
    std::vector<Inscoper::NBO::AcoustoOpticalDeviceSettings_TypePtr> AcoustoOpticalDeviceSettingsGroup_List;
    std::vector<Inscoper::NBO::ElectroOpticalDeviceSettings_TypePtr> ElectroOpticalDeviceSettingsGroup_List;
    std::vector<Inscoper::NBO::TIRFSettingsPtr> TIRFSettings_List;
    Inscoper::NBO::LightPath_Type::InlineLightPathMapPtr LightPathMap = nullptr;
    std::vector<Inscoper::NBO::AnnotationRefPtr> AnnotationRef_List;
};

/*! Shared pointer for LightPath_Type*/
typedef std::shared_ptr<LightPath_Type> LightPath_TypePtr;

} // namespace Inscoper::NBO

#endif // LIGHTPATH_TYPE_HPP_INCLUDED