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