Quintiq file version 2.0 #parent: #root Method DrawNode ( internal[DrawNodeInfo] drawinfo, UnitPeriod element ) id:Method_FormCapacityPlanning_DrawNode { #keys: '[145730.1.1156292293]' Body: [* // Determine colors for gantt chart nodes nr := MacroPlan.GlobalParameters_MP().NumberOfDecimals(); below := element.BottleneckThreshold(); above := element.OverloadThreshold(); changeoverratio := Duration::Zero(); if( element.istype( UnitPeriodTimeBase ) ) { changeoverratio := element.astype( UnitPeriodTimeBase ).ChangeoverDurationRatio(); } if( element.Duration() > Duration::Zero() ) { // Quantity aggregated unit without child, show as irrelevant if( element.Unit().CapacityType() = GlobalParameters_MP::GetCapacityTypeQuantityAggregation() and element.ChildOfUnitDimension( relsize ) = 0 ) { color := ifexpr( element.HasConstraintViolations(), ColorScheme.GanttChart_Error(),ColorScheme.GanttChart_Irrelevant() ); drawinfo.AddCompartment( color, element.FreeCapacityRatio() ); } //infinte and no child, show purple else if ( not element.Unit().IsPotentialBottleneck() ) { color := ifexpr( element.HasConstraintViolations(), ColorScheme.GanttChart_Error(), ColorScheme.GanttChart_Neutral1() ); drawinfo.AddCompartment( color, element.Duration() ); } //infinite but with child, show constraint violation if its children is overloaded else if ( element.Unit().HasCapacityTypeInfinite() and element.Unit().IsPotentialBottleneck() ) { color := ifexpr( element.HasConstraintViolations(), ColorScheme.GanttChart_Error(), ColorScheme.GanttChart_Neutral1() ); drawinfo.AddCompartment( color, element.UsedCapacityRatio() ); drawinfo.AddCompartment( ColorScheme.GanttChart_Free(), element.FreeCapacityRatio() ); } //units which are part of an aggregation else if ( element.Unit().IsForCapacityAggregation() ) { color := ifexpr( element.HasConstraintViolations(), ColorScheme.GanttChart_Error(), ColorScheme.GanttChart_Custom2() ); drawinfo.AddCompartment( color, element.UsedCapacityRatio() ); drawinfo.AddCompartment( ColorScheme.GanttChart_Changeover(), changeoverratio ); drawinfo.AddCompartment( ColorScheme.GanttChart_Free(), element.FreeCapacityRatio() ); //drawinfo.AddCompartment( ColorScheme.GanttChart_Irrelevant(), element.TotalUnavailableCapacityRatio() ); } // IsPlannedInfinite, show purple else if ( element.IsPlannedInfinite() ) { color := ifexpr( element.HasConstraintViolations(), ColorScheme.GanttChart_Error(), ColorScheme.GanttChart_Neutral1() ); drawinfo.AddCompartment( color, element.Duration() ); } else { displayutilizationpercentage := element.DisplayUtilizationPercentageWithMaxLoadRatio(); loadpercentage := displayutilizationpercentage.Round( nr ); color := ColorScheme.GanttChart_Good(); if ( element.HasConstraintViolations() ) { color := ColorScheme.GanttChart_Error(); } else if ( below > 0 and above > 0 ) { if ( loadpercentage > below and loadpercentage <= above and element.Period_MP().IsWithinBottleneckWindow() ) { color := ColorScheme.GanttChart_Warning2(); } else if ( loadpercentage > above ) { color := ColorScheme.GanttChart_Warning1(); } } usedCapacityRatio := ifexpr( element.Unit().CapacityType() = GlobalParameters_MP::GetCapacityTypeTransportQuantity() ,element.astype( UnitPeriodTransportQuantity).DisplayUsedCapacityRatio() ,element.UsedCapacityRatio() ); freeCapacityRatio := ifexpr( element.Unit().CapacityType() = GlobalParameters_MP::GetCapacityTypeTransportQuantity() ,element.astype( UnitPeriodTransportQuantity).DisplayFreeCapacityRatio() ,element.FreeCapacityRatio() ); drawinfo.AddCompartment( color, usedCapacityRatio ); drawinfo.AddCompartment( ColorScheme.GanttChart_Changeover(), changeoverratio ); drawinfo.AddCompartment( ColorScheme.GanttChart_Free(), freeCapacityRatio ); } color := ifexpr( not element.HasOpenUnit(), ColorScheme.GanttChart_Error(), ColorScheme.GanttChart_Irrelevant() ); drawinfo.AddCompartment( color, element.TotalUnavailableCapacityRatio() ); } if ( drawinfo.BackgroundColor().IsDark() ) { drawinfo.TextColor( Color::White() ); } *] Declarative: true }