//-------------------------------------------------------------------------------------------------- // 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
} // 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