| Quintiq file version 2.0 | 
| #parent: CustomDrawComponentSupplyChainVisualization/CustomDrawDataLayerSCVEdge | 
| Response OnDrawObject ( | 
|   shadow[SCVEdge] object | 
| ) id:Response_CustomDrawComponentSupplyChainVisualization_CustomDrawDataLayerSCVEdge_OnDrawObject | 
| { | 
|   #keys: '[132894.0.877949609]' | 
|   Body: | 
|   [* | 
|     // Draw PISPIPSCVEdge | 
|     scvConfig := DataHolderSCVConfiguration.Data(); | 
|      | 
|     node1 := select( scvConfig, SCVNode, n, | 
|                      object.DestinationKey() = n.Key().AsQUILL() ); | 
|      | 
|     node2 := select( scvConfig, SCVNode, n, | 
|                      object.OriginKey() = n.Key().AsQUILL() );   | 
|      | 
|     sourceNode := ifexpr( node1.IsUpstream(), node1, node2 ); | 
|     targetNode := ifexpr( node1.IsUpstream(), node2, node1 ); | 
|      | 
|     adjustmentX := scvConfig.NodeSize(); | 
|     adjustmentY := floor( scvConfig.NodeSize() / 2 ); | 
|      | 
|     // Adjust line based on its orientations | 
|     topdown := sourceNode.Y() + adjustmentY | 
|                < targetNode.Y() + adjustmentY; | 
|     leftright := sourceNode.X() + adjustmentX | 
|                  < targetNode.X(); | 
|     padding := 6; | 
|      | 
|     fromy := region.Top() + padding; | 
|     toy := region.Height() - padding; | 
|      | 
|     if( topdown ) | 
|     { | 
|       if( not leftright ) | 
|       { | 
|         fromy := region.Top() + padding; | 
|         toy := region.Height() - padding; | 
|       } | 
|     } | 
|     else | 
|     { | 
|       if( leftright ) | 
|       { | 
|         fromy := region.Height() - padding; | 
|         toy := region.Top() + padding; | 
|       } | 
|     } | 
|      | 
|     // Get line quantity and label | 
|     quantity := 0.0; | 
|     lineLabel := FormSupplyChainVisualization.ReturnEdgeLabel( sourceNode, targetNode, quantity ); | 
|      | 
|     // Color the line gray if quantity is 0 or smaller | 
|     lineColor := ColorScheme.SCVEdge(); | 
|     if( quantity <= 0.0 ) | 
|     { | 
|       lineColor := ColorScheme.SCVNode(); | 
|       // Color the text gray too | 
|       surface.TextColor( lineColor ); | 
|     } | 
|      | 
|     //Initialize drawing parameters | 
|     surface.Pen().Color( lineColor ) | 
|                  .Width( 1 ); | 
|     surface.Brush().Color( lineColor ); | 
|      | 
|     // Draw the directional line | 
|     line := GraphicalLine::LineTo( region.Left(), fromy, region.Width(), toy ); | 
|     line.ArrowToEnd( true ).ArrowPos( GraphicalLine::ArrowPosMiddle() ); | 
|     surface.Draw( line ); | 
|      | 
|     // Draw quantity label | 
|     // Get rotation angle to rotate the text to the same angle as the line | 
|     gradient := ( toy - fromy ) / ( region.Width() - region.Left() ); | 
|     degree := atan( -gradient ) * 180 / pi; | 
|     // Get the mid length of the line, it is where the text should start, the reason being | 
|     // rotation rotate with top left of the draw region as the corner.  | 
|     radius := sqrt( sqr( [Real]region.Right() - region.Left() ) + sqr( [Real]region.Bottom() - region.Top() ) ); | 
|      | 
|     surface.Font().Name( scvConfig.FontName() ) | 
|                   .Size( scvConfig.FontSize() ) | 
|                   .Angle( [Number]degree ); | 
|      | 
|     textformat := TextFormat::Construct( TextFormat::AlignCenter() ); | 
|                              | 
|     // Rotate the text to  | 
|     if( sourceNode.Y() = targetNode.Y() ) | 
|     { | 
|       textformat := TextFormat::Construct( TextFormat::AlignCentered() ); | 
|       surface.TextZoom( region.Left(), region.Top() - scvConfig.FontSize() * 2, | 
|                         region.Width(), scvConfig.FontSize() * 2, | 
|                         lineLabel, textformat ); | 
|     } | 
|     else | 
|     { | 
|       // If targetnode and sourcenode have different Y positions, | 
|       // it means there is a gradient and we need to rotate the  | 
|       // text. The hardcoded offsets below are the sweet numbers | 
|       // that we found that allows the text to have even distance to line | 
|       // for any angle of rotation | 
|       surface.TextZoom( region.Left(), ifexpr( gradient > 0, region.Top() - 10, region.Bottom() - 22 ), | 
|                         [Number]radius, region.Height(), | 
|                         lineLabel, textformat );     | 
|     } | 
|   *] | 
|   CanBindMultiple: false | 
|   DefinitionID: 'Responsedef_CustomDrawDataLayer_OnDrawObject' | 
| } |