//--------------------------------------------------------------------------------------------------
        // Constructor
        //--------------------------------------------------------------------------------------------------

        #region Constructor

        /// <summary>
        /// Basic constructor, assigns visualization methods to dictionaries for event and activity types
        /// </summary>
        /// <param name="drawingSystem">Drawing system used for visualization</param>
        /// <param name="position">Position of control unit visualization on drawing system</param>
        /// <param name="size">Size of control unit visualization on drawing system</param>
        /// <param name="personSize">Size in which persons are visualized</param>
        public WPFVisualizationEngineHealthCareDepartmentControlUnit(DrawingOnCoordinateSystem drawingSystem,
                                                                     Point position,
                                                                     Size size,
                                                                     double personSize) : base(drawingSystem)
        {
            _personSize = personSize;
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityPatient), CreatePatient);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityDoctor), CreateDoctor);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityNurse), CreateNurse);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityTreatmentFacility), CreateTreatmentFacility);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityMultiplePatientTreatmentFacility), CreateMultiplePatientTreatmentFacility);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityWaitingArea), CreateWaitingRoom);

            HoldingEntitiesVisualizationMethods.Add(typeof(EntityWaitingArea), DrawHoldingEntity);
            HoldingEntitiesVisualizationMethods.Add(typeof(EntityMultiplePatientTreatmentFacility), DrawHoldingEntity);

            ActivityEndEventVisualizationMethods.Add(typeof(ActivityHealthCareAction <T>), HealthCareActionEnd);
            ActivityStartEventVisualizationMethods.Add(typeof(ActivityHealthCareAction <T>), HealthCareActionStart);

            ActivityEndEventVisualizationMethods.Add(typeof(ActivityWaitInFacility), WaitInFacilityEnd);
            ActivityStartEventVisualizationMethods.Add(typeof(ActivityWaitInFacility), WaitInFacilityStart);

            EventStandaloneDrawingMethods.Add(typeof(EventEmergencyPatientLeave), EventPatientLeave);
            EventStandaloneDrawingMethods.Add(typeof(EventOutpatientPatientLeave), EventPatientLeave);
            EventStandaloneDrawingMethods.Add(typeof(EventStaffLeave), EventLeavingStaff);

            _position = position;
            _size     = size;
        } // end of BaseWPFControlUnitVisualizationEngine
        //--------------------------------------------------------------------------------------------------
        // Constructor
        //--------------------------------------------------------------------------------------------------

        #region Constructor

        /// <summary>
        /// Basic constructor, sets entity drawing object methods and event and activity visualization methods
        /// </summary>
        /// <param name="drawingSystem"></param>
        public QueueControlVisualizationEngine(DrawingOnCoordinateSystem drawingSystem) : base(drawingSystem)
        {
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityClient), CreateClient);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityQueue), CreateQueue);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityServer), CreateServer);
            ActivityEndEventVisualizationMethods.Add(typeof(ActivityGetServed), GetServedEnd);
            ActivityStartEventVisualizationMethods.Add(typeof(ActivityGetServed), GetServedStart);
            HoldingEntitiesVisualizationMethods.Add(typeof(EntityQueue), DrawHoldingEntity);
        } // end of BaseWPFControlUnitVisualizationEngine
        //--------------------------------------------------------------------------------------------------
        // Constructor
        //--------------------------------------------------------------------------------------------------

        #region Constructor

        /// <summary>
        /// Basic constructor, assigns visualization methods to dictionaries for event and activity types
        /// </summary>
        /// <param name="drawingSystem">Drawing system used for visualization</param>
        /// <param name="position">Position of control unit visualization on drawing system</param>
        /// <param name="size">Size of control unit visualization on drawing system</param>
        /// <param name="personSize">Size in which persons are visualized</param>
        public WPFVisualizationHealthCareOrganizationalUnit(DrawingOnCoordinateSystem drawingSystem,
                                                            double personSize,
                                                            WPFVisualizationEngineHealthCareDepartmentControlUnit <T> parentDepartmentVisualization) : base(drawingSystem)
        {
            _personSize = personSize;
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityPatient), CreatePatient);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityDoctor), CreateDoctor);
            EntityVisualizationObjectCreatingMethodsPerType.Add(typeof(EntityNurse), CreateNurse);

            HoldingEntitiesVisualizationMethods.Add(typeof(EntityMultiplePatientTreatmentFacility), DrawHoldingEntity);

            ActivityEndEventVisualizationMethods.Add(typeof(ActivityHealthCareAction <T>), HealthCareActionEnd);
            ActivityStartEventVisualizationMethods.Add(typeof(ActivityHealthCareAction <T>), HealthCareActionStart);

            ActivityEndEventVisualizationMethods.Add(typeof(ActivityWaitInFacility), WaitInFacilityEnd);
            ActivityStartEventVisualizationMethods.Add(typeof(ActivityWaitInFacility), WaitInFacilityStart);

            EventStandaloneDrawingMethods.Add(typeof(EventStaffLeave), EventLeavingStaff);

            _parentDepartmentVisaulization = parentDepartmentVisualization;
        } // end of BaseWPFControlUnitVisualizationEngine
예제 #4
0
        } // end of RemoveDrawingObjectPerEntity

        #endregion

        //--------------------------------------------------------------------------------------------------
        // Methods
        //--------------------------------------------------------------------------------------------------

        #region VisualizeDynamicModel

        /// <summary>
        /// Creates a visualization of a control unit at a given time. For all events, activities and holding entities it
        /// is checked if methods have been stored in corresponding dictionaries, and if so they are triggered.
        /// </summary>
        /// <param name="currentTime">Time at which model should be visualized</param>
        /// <param name="simModel">Model to visualize</param>
        /// <param name="parentControlUnit">Control unit to visualize</param>
        /// <param name="currentEvents">Currently triggered events in the model</param>
        public void VisualizeDynamicModel(DateTime currentTime, SimulationModel simModel, ControlUnit parentControlUnit, IEnumerable <Event> currentEvents)
        {
            #region VisualizationChangesFromEvents

            // visualization methods for all events are called (if provided)
            foreach (EventActivity ev in currentEvents.Where(p => p is EventActivity && ((EventActivity)p).EventType == EventType.End).Cast <EventActivity>())
            {
                Activity parentActivity = ((EventActivity)ev).ParentActivity;

                if (parentActivity.StartTime == parentActivity.EndTime)
                {
                    continue;
                }

                // if a handling method for the end event is specified it is called
                if (ActivityEndEventVisualizationMethods.ContainsKey(parentActivity.GetType()))
                {
                    ActivityEndEventVisualizationMethods[parentActivity.GetType()](parentActivity, currentTime);
                }
            } // end foreach

            // visualization methods for all events are called (if provided)
            foreach (EventActivity ev in currentEvents.Where(p => p is EventActivity && ((EventActivity)p).EventType == EventType.Start).Cast <EventActivity>())
            {
                Activity parentActivity = ((EventActivity)ev).ParentActivity;

                if (parentActivity.StartTime == parentActivity.EndTime)
                {
                    continue;
                }

                // if a handling method for the start event is specified it is called
                if (ActivityStartEventVisualizationMethods.ContainsKey(parentActivity.GetType()))
                {
                    ActivityStartEventVisualizationMethods[parentActivity.GetType()](parentActivity, currentTime);
                }
            } // end foreach

            // visualization methods for all events are called (if provided)
            foreach (Event ev in currentEvents.Where(p => p.EventType == EventType.Standalone))
            {
                // if a handling method for a standalone event is specified it is called
                if (EventStandaloneDrawingMethods.ContainsKey(ev.GetType()))
                {
                    EventStandaloneDrawingMethods[ev.GetType()](ev);
                }
            } // end foreach

            #endregion

            #region VisualizationDuringActivities

            foreach (Activity activity in parentControlUnit.CurrentActivities)
            {
                // intermediate visualization is only done for times strictly larger
                // than the start time
                if (activity.StartTime == currentTime)
                {
                    continue;
                }

                // if a method has been specified for an activity type it is called
                if (ActivityIntermediateVisualizationMethods.ContainsKey(activity.GetType()))
                {
                    ActivityIntermediateVisualizationMethods[activity.GetType()](activity, currentTime);
                }
            } // end foreach

            #endregion

            #region VisualizeDynamicHoldingEntities

            foreach (IDynamicHoldingEntity holdingEntity in parentControlUnit.AllControlledEntities.Where(p => p is IDynamicHoldingEntity).Cast <IDynamicHoldingEntity>())
            {
                if (HoldingEntitiesVisualizationMethods.ContainsKey(holdingEntity.GetType()))
                {
                    HoldingEntitiesVisualizationMethods[holdingEntity.GetType()](holdingEntity);
                }
            } // end foreach

            #endregion

            AdditionalDynamicVisualization(currentTime, simModel, parentControlUnit, currentEvents);
        } // end of VisualizeDynamicModel