/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package org.eclipse.stem.loggers.imagewriter;

import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EEnum;
import org.eclipse.emf.ecore.EPackage;

import org.eclipse.emf.ecore.EReference;
import org.eclipse.stem.loggers.SimulationLoggerPackage;

/**
 * <!-- begin-user-doc -->
 * The <b>Package</b> for the model.
 * It contains accessors for the meta objects to represent
 * <ul>
 *   <li>each class,</li>
 *   <li>each feature of each class,</li>
 *   <li>each enum,</li>
 *   <li>and each data type</li>
 * </ul>
 * <!-- end-user-doc -->
 * @see org.eclipse.stem.loggers.imagewriter.ImagewriterFactory
 * @model kind="package"
 * @generated
 */
public interface ImagewriterPackage extends EPackage {
	/**
	 * The package name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNAME = "imagewriter";

	/**
	 * The package namespace URI.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_URI = "http://org/eclipse/stem/loggers/imagewriter";

	/**
	 * The package namespace name.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	String eNS_PREFIX = "org.eclipse.stem.loggers.imagewriter.model";

	/**
	 * The singleton instance of the package.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 */
	ImagewriterPackage eINSTANCE = org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl.init();

	/**
	 * The meta object id for the '{@link org.eclipse.stem.loggers.imagewriter.impl.ImageWriterLoggerImpl <em>Image Writer Logger</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImageWriterLoggerImpl
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getImageWriterLogger()
	 * @generated
	 */
	int IMAGE_WRITER_LOGGER = 0;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IMAGE_WRITER_LOGGER__URI = SimulationLoggerPackage.SYNCHRONOUS_LOGGER__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IMAGE_WRITER_LOGGER__TYPE_URI = SimulationLoggerPackage.SYNCHRONOUS_LOGGER__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IMAGE_WRITER_LOGGER__DUBLIN_CORE = SimulationLoggerPackage.SYNCHRONOUS_LOGGER__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IMAGE_WRITER_LOGGER__ENABLED = SimulationLoggerPackage.SYNCHRONOUS_LOGGER__ENABLED;

	/**
	 * The feature id for the '<em><b>Use Default Log Directory</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IMAGE_WRITER_LOGGER__USE_DEFAULT_LOG_DIRECTORY = SimulationLoggerPackage.SYNCHRONOUS_LOGGER_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Data Path</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IMAGE_WRITER_LOGGER__DATA_PATH = SimulationLoggerPackage.SYNCHRONOUS_LOGGER_FEATURE_COUNT + 1;

	/**
	 * The number of structural features of the '<em>Image Writer Logger</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int IMAGE_WRITER_LOGGER_FEATURE_COUNT = SimulationLoggerPackage.SYNCHRONOUS_LOGGER_FEATURE_COUNT + 2;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl <em>Projected Map Image Logger</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getProjectedMapImageLogger()
	 * @generated
	 */
	int PROJECTED_MAP_IMAGE_LOGGER = 1;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__URI = IMAGE_WRITER_LOGGER__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__TYPE_URI = IMAGE_WRITER_LOGGER__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__DUBLIN_CORE = IMAGE_WRITER_LOGGER__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__ENABLED = IMAGE_WRITER_LOGGER__ENABLED;

	/**
	 * The feature id for the '<em><b>Use Default Log Directory</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__USE_DEFAULT_LOG_DIRECTORY = IMAGE_WRITER_LOGGER__USE_DEFAULT_LOG_DIRECTORY;

	/**
	 * The feature id for the '<em><b>Data Path</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__DATA_PATH = IMAGE_WRITER_LOGGER__DATA_PATH;

	/**
	 * The feature id for the '<em><b>Use Log Scaling</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 0;

	/**
	 * The feature id for the '<em><b>Gain</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__GAIN = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 1;

	/**
	 * The feature id for the '<em><b>Log All Decorators</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 2;

	/**
	 * The feature id for the '<em><b>Color Provider</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 3;

	/**
	 * The feature id for the '<em><b>Decorator</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__DECORATOR = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 4;

	/**
	 * The feature id for the '<em><b>Decorator Properties</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 5;

	/**
	 * The feature id for the '<em><b>Width</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__WIDTH = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 6;

	/**
	 * The feature id for the '<em><b>Height</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__HEIGHT = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 7;

	/**
	 * The feature id for the '<em><b>Projection</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER__PROJECTION = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 8;

	/**
	 * The number of structural features of the '<em>Projected Map Image Logger</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int PROJECTED_MAP_IMAGE_LOGGER_FEATURE_COUNT = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 9;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.loggers.imagewriter.impl.MapViewImageWriterLoggerImpl <em>Map View Image Writer Logger</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.loggers.imagewriter.impl.MapViewImageWriterLoggerImpl
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getMapViewImageWriterLogger()
	 * @generated
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER = 2;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER__URI = IMAGE_WRITER_LOGGER__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER__TYPE_URI = IMAGE_WRITER_LOGGER__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER__DUBLIN_CORE = IMAGE_WRITER_LOGGER__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER__ENABLED = IMAGE_WRITER_LOGGER__ENABLED;

	/**
	 * The feature id for the '<em><b>Use Default Log Directory</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER__USE_DEFAULT_LOG_DIRECTORY = IMAGE_WRITER_LOGGER__USE_DEFAULT_LOG_DIRECTORY;

	/**
	 * The feature id for the '<em><b>Data Path</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER__DATA_PATH = IMAGE_WRITER_LOGGER__DATA_PATH;

	/**
	 * The feature id for the '<em><b>Open Map View</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER__OPEN_MAP_VIEW = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 0;

	/**
	 * The number of structural features of the '<em>Map View Image Writer Logger</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int MAP_VIEW_IMAGE_WRITER_LOGGER_FEATURE_COUNT = IMAGE_WRITER_LOGGER_FEATURE_COUNT + 1;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.loggers.imagewriter.impl.EquirectangularMapLoggerImpl <em>Equirectangular Map Logger</em>}' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.loggers.imagewriter.impl.EquirectangularMapLoggerImpl
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getEquirectangularMapLogger()
	 * @generated
	 */
	int EQUIRECTANGULAR_MAP_LOGGER = 3;

	/**
	 * The feature id for the '<em><b>URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__URI = PROJECTED_MAP_IMAGE_LOGGER__URI;

	/**
	 * The feature id for the '<em><b>Type URI</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__TYPE_URI = PROJECTED_MAP_IMAGE_LOGGER__TYPE_URI;

	/**
	 * The feature id for the '<em><b>Dublin Core</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__DUBLIN_CORE = PROJECTED_MAP_IMAGE_LOGGER__DUBLIN_CORE;

	/**
	 * The feature id for the '<em><b>Enabled</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__ENABLED = PROJECTED_MAP_IMAGE_LOGGER__ENABLED;

	/**
	 * The feature id for the '<em><b>Use Default Log Directory</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__USE_DEFAULT_LOG_DIRECTORY = PROJECTED_MAP_IMAGE_LOGGER__USE_DEFAULT_LOG_DIRECTORY;

	/**
	 * The feature id for the '<em><b>Data Path</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__DATA_PATH = PROJECTED_MAP_IMAGE_LOGGER__DATA_PATH;

	/**
	 * The feature id for the '<em><b>Use Log Scaling</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__USE_LOG_SCALING = PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING;

	/**
	 * The feature id for the '<em><b>Gain</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__GAIN = PROJECTED_MAP_IMAGE_LOGGER__GAIN;

	/**
	 * The feature id for the '<em><b>Log All Decorators</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__LOG_ALL_DECORATORS = PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS;

	/**
	 * The feature id for the '<em><b>Color Provider</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__COLOR_PROVIDER = PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER;

	/**
	 * The feature id for the '<em><b>Decorator</b></em>' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__DECORATOR = PROJECTED_MAP_IMAGE_LOGGER__DECORATOR;

	/**
	 * The feature id for the '<em><b>Decorator Properties</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__DECORATOR_PROPERTIES = PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES;

	/**
	 * The feature id for the '<em><b>Width</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__WIDTH = PROJECTED_MAP_IMAGE_LOGGER__WIDTH;

	/**
	 * The feature id for the '<em><b>Height</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__HEIGHT = PROJECTED_MAP_IMAGE_LOGGER__HEIGHT;

	/**
	 * The feature id for the '<em><b>Projection</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER__PROJECTION = PROJECTED_MAP_IMAGE_LOGGER__PROJECTION;

	/**
	 * The number of structural features of the '<em>Equirectangular Map Logger</em>' class.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @generated
	 * @ordered
	 */
	int EQUIRECTANGULAR_MAP_LOGGER_FEATURE_COUNT = PROJECTED_MAP_IMAGE_LOGGER_FEATURE_COUNT + 0;

	/**
	 * The meta object id for the '{@link org.eclipse.stem.loggers.imagewriter.MAP_PROJECTIONS <em>MAP PROJECTIONS</em>}' enum.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.loggers.imagewriter.MAP_PROJECTIONS
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getMAP_PROJECTIONS()
	 * @generated
	 */
	int MAP_PROJECTIONS = 4;


	/**
	 * The meta object id for the '<em>IMap Projection</em>' data type.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.loggers.imagewriter.logger.projections.IMapProjection
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getIMapProjection()
	 * @generated
	 */
	int IMAP_PROJECTION = 5;

	/**
	 * The meta object id for the '<em>Color Provider</em>' data type.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @see org.eclipse.stem.ui.adapters.color.ColorProvider
	 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getColorProvider()
	 * @generated
	 */
	int COLOR_PROVIDER = 6;


	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.loggers.imagewriter.ImageWriterLogger <em>Image Writer Logger</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Image Writer Logger</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ImageWriterLogger
	 * @generated
	 */
	EClass getImageWriterLogger();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ImageWriterLogger#isUseDefaultLogDirectory <em>Use Default Log Directory</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Use Default Log Directory</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ImageWriterLogger#isUseDefaultLogDirectory()
	 * @see #getImageWriterLogger()
	 * @generated
	 */
	EAttribute getImageWriterLogger_UseDefaultLogDirectory();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ImageWriterLogger#getDataPath <em>Data Path</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Data Path</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ImageWriterLogger#getDataPath()
	 * @see #getImageWriterLogger()
	 * @generated
	 */
	EAttribute getImageWriterLogger_DataPath();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger <em>Projected Map Image Logger</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Projected Map Image Logger</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger
	 * @generated
	 */
	EClass getProjectedMapImageLogger();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#isUseLogScaling <em>Use Log Scaling</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Use Log Scaling</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#isUseLogScaling()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_UseLogScaling();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getGain <em>Gain</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Gain</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getGain()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_Gain();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#isLogAllDecorators <em>Log All Decorators</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Log All Decorators</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#isLogAllDecorators()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_LogAllDecorators();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getColorProvider <em>Color Provider</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Color Provider</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getColorProvider()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_ColorProvider();

	/**
	 * Returns the meta object for the reference '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getDecorator <em>Decorator</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the reference '<em>Decorator</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getDecorator()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EReference getProjectedMapImageLogger_Decorator();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getDecoratorProperties <em>Decorator Properties</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Decorator Properties</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getDecoratorProperties()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_DecoratorProperties();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getWidth <em>Width</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Width</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getWidth()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_Width();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getHeight <em>Height</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Height</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getHeight()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_Height();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getProjection <em>Projection</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Projection</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.ProjectedMapImageLogger#getProjection()
	 * @see #getProjectedMapImageLogger()
	 * @generated
	 */
	EAttribute getProjectedMapImageLogger_Projection();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.loggers.imagewriter.MapViewImageWriterLogger <em>Map View Image Writer Logger</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Map View Image Writer Logger</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.MapViewImageWriterLogger
	 * @generated
	 */
	EClass getMapViewImageWriterLogger();

	/**
	 * Returns the meta object for the attribute '{@link org.eclipse.stem.loggers.imagewriter.MapViewImageWriterLogger#isOpenMapView <em>Open Map View</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for the attribute '<em>Open Map View</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.MapViewImageWriterLogger#isOpenMapView()
	 * @see #getMapViewImageWriterLogger()
	 * @generated
	 */
	EAttribute getMapViewImageWriterLogger_OpenMapView();

	/**
	 * Returns the meta object for class '{@link org.eclipse.stem.loggers.imagewriter.EquirectangularMapLogger <em>Equirectangular Map Logger</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for class '<em>Equirectangular Map Logger</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.EquirectangularMapLogger
	 * @generated
	 */
	EClass getEquirectangularMapLogger();

	/**
	 * Returns the meta object for enum '{@link org.eclipse.stem.loggers.imagewriter.MAP_PROJECTIONS <em>MAP PROJECTIONS</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for enum '<em>MAP PROJECTIONS</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.MAP_PROJECTIONS
	 * @generated
	 */
	EEnum getMAP_PROJECTIONS();

	/**
	 * Returns the meta object for data type '{@link org.eclipse.stem.loggers.imagewriter.logger.projections.IMapProjection <em>IMap Projection</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for data type '<em>IMap Projection</em>'.
	 * @see org.eclipse.stem.loggers.imagewriter.logger.projections.IMapProjection
	 * @model instanceClass="org.eclipse.stem.loggers.imagewriter.logger.projections.IMapProjection"
	 * @generated
	 */
	EDataType getIMapProjection();

	/**
	 * Returns the meta object for data type '{@link org.eclipse.stem.ui.adapters.color.ColorProvider <em>Color Provider</em>}'.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the meta object for data type '<em>Color Provider</em>'.
	 * @see org.eclipse.stem.ui.adapters.color.ColorProvider
	 * @model instanceClass="org.eclipse.stem.ui.adapters.color.ColorProvider"
	 * @generated
	 */
	EDataType getColorProvider();

	/**
	 * Returns the factory that creates the instances of the model.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @return the factory that creates the instances of the model.
	 * @generated
	 */
	ImagewriterFactory getImagewriterFactory();

	/**
	 * <!-- begin-user-doc -->
	 * Defines literals for the meta objects that represent
	 * <ul>
	 *   <li>each class,</li>
	 *   <li>each feature of each class,</li>
	 *   <li>each enum,</li>
	 *   <li>and each data type</li>
	 * </ul>
	 * <!-- end-user-doc -->
	 * @generated
	 */
	interface Literals {
		/**
		 * The meta object literal for the '{@link org.eclipse.stem.loggers.imagewriter.impl.ImageWriterLoggerImpl <em>Image Writer Logger</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImageWriterLoggerImpl
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getImageWriterLogger()
		 * @generated
		 */
		EClass IMAGE_WRITER_LOGGER = eINSTANCE.getImageWriterLogger();

		/**
		 * The meta object literal for the '<em><b>Use Default Log Directory</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute IMAGE_WRITER_LOGGER__USE_DEFAULT_LOG_DIRECTORY = eINSTANCE.getImageWriterLogger_UseDefaultLogDirectory();

		/**
		 * The meta object literal for the '<em><b>Data Path</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute IMAGE_WRITER_LOGGER__DATA_PATH = eINSTANCE.getImageWriterLogger_DataPath();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl <em>Projected Map Image Logger</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ProjectedMapImageLoggerImpl
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getProjectedMapImageLogger()
		 * @generated
		 */
		EClass PROJECTED_MAP_IMAGE_LOGGER = eINSTANCE.getProjectedMapImageLogger();

		/**
		 * The meta object literal for the '<em><b>Use Log Scaling</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__USE_LOG_SCALING = eINSTANCE.getProjectedMapImageLogger_UseLogScaling();

		/**
		 * The meta object literal for the '<em><b>Gain</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__GAIN = eINSTANCE.getProjectedMapImageLogger_Gain();

		/**
		 * The meta object literal for the '<em><b>Log All Decorators</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__LOG_ALL_DECORATORS = eINSTANCE.getProjectedMapImageLogger_LogAllDecorators();

		/**
		 * The meta object literal for the '<em><b>Color Provider</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__COLOR_PROVIDER = eINSTANCE.getProjectedMapImageLogger_ColorProvider();

		/**
		 * The meta object literal for the '<em><b>Decorator</b></em>' reference feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EReference PROJECTED_MAP_IMAGE_LOGGER__DECORATOR = eINSTANCE.getProjectedMapImageLogger_Decorator();

		/**
		 * The meta object literal for the '<em><b>Decorator Properties</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__DECORATOR_PROPERTIES = eINSTANCE.getProjectedMapImageLogger_DecoratorProperties();

		/**
		 * The meta object literal for the '<em><b>Width</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__WIDTH = eINSTANCE.getProjectedMapImageLogger_Width();

		/**
		 * The meta object literal for the '<em><b>Height</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__HEIGHT = eINSTANCE.getProjectedMapImageLogger_Height();

		/**
		 * The meta object literal for the '<em><b>Projection</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute PROJECTED_MAP_IMAGE_LOGGER__PROJECTION = eINSTANCE.getProjectedMapImageLogger_Projection();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.loggers.imagewriter.impl.MapViewImageWriterLoggerImpl <em>Map View Image Writer Logger</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.loggers.imagewriter.impl.MapViewImageWriterLoggerImpl
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getMapViewImageWriterLogger()
		 * @generated
		 */
		EClass MAP_VIEW_IMAGE_WRITER_LOGGER = eINSTANCE.getMapViewImageWriterLogger();

		/**
		 * The meta object literal for the '<em><b>Open Map View</b></em>' attribute feature.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @generated
		 */
		EAttribute MAP_VIEW_IMAGE_WRITER_LOGGER__OPEN_MAP_VIEW = eINSTANCE.getMapViewImageWriterLogger_OpenMapView();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.loggers.imagewriter.impl.EquirectangularMapLoggerImpl <em>Equirectangular Map Logger</em>}' class.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.loggers.imagewriter.impl.EquirectangularMapLoggerImpl
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getEquirectangularMapLogger()
		 * @generated
		 */
		EClass EQUIRECTANGULAR_MAP_LOGGER = eINSTANCE.getEquirectangularMapLogger();

		/**
		 * The meta object literal for the '{@link org.eclipse.stem.loggers.imagewriter.MAP_PROJECTIONS <em>MAP PROJECTIONS</em>}' enum.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.loggers.imagewriter.MAP_PROJECTIONS
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getMAP_PROJECTIONS()
		 * @generated
		 */
		EEnum MAP_PROJECTIONS = eINSTANCE.getMAP_PROJECTIONS();

		/**
		 * The meta object literal for the '<em>IMap Projection</em>' data type.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.loggers.imagewriter.logger.projections.IMapProjection
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getIMapProjection()
		 * @generated
		 */
		EDataType IMAP_PROJECTION = eINSTANCE.getIMapProjection();

		/**
		 * The meta object literal for the '<em>Color Provider</em>' data type.
		 * <!-- begin-user-doc -->
		 * <!-- end-user-doc -->
		 * @see org.eclipse.stem.ui.adapters.color.ColorProvider
		 * @see org.eclipse.stem.loggers.imagewriter.impl.ImagewriterPackageImpl#getColorProvider()
		 * @generated
		 */
		EDataType COLOR_PROVIDER = eINSTANCE.getColorProvider();

	}

} //ImagewriterPackage
