+Z
/________________________
/\ \ \ \ \ \
/ \____\____\____\____\____\
/\ /\ \ \ \ \ \
/ \/ \____\____\____\____\____\
/\ /\ /\ \ \b \ \ \
/ \/ \/ \____\____\____\____\____\
/\ /\ /\ /\ \ \ \ \ \
/ \/ \/ \/ \____\____\____\____\____\
+Y /\ /\ /\ /\ /\ \ \ \ \ \
\/ \/ \/a \/ \/ \____\____\____\____\____\
/\ /\ /\ /\ /\ / / / / / /
-Z \/ \/ \/ \/ \/____/____/____/____/____/
\ /\ /\ /\ / / / / / /
\/ \/ \/ \/____/____/____/____/____/
\ /\ /\ / / / c / / /
\/ \/ \/____/____/____/____/____/
\ /\ / / / / / /
\/ \/____/____/____/____/____/
\ / / / / / /
_\/____/____/____/____/____/_
-X \ +X
-Y
####
function _BoundingBoxDraw( ) {
var minOrMaxX = ( ( this.Parent.Fi < 90 ) || ( this.Parent.Fi >= 270 ) );
var minOrMaxY = ( this.Parent.Fi >= 180 );
var minOrMaxZ = ( this.Parent.Th <= 0 );
drawFace( this, 'z', 'x', 'y', 0, 0, 1, minOrMaxZ, minOrMaxX, minOrMaxY );
drawFace( this, 'y', 'x', 'z', 1, 2, 3, minOrMaxY, minOrMaxX, minOrMaxZ );
drawFace( this, 'x', 'y', 'z', 2, 4, 5, minOrMaxX, minOrMaxY, minOrMaxZ );
}
####
+Y +Y +Z
-Z +----+----+----+----+----+ +Z -X +----+----+----+----+----+ +X -X +----+----+----+----+----+ +X
| | | | | | | | | | | | | | | | | |
+----+----+----+----+----+ +----+----+----+----+----+ +----+----+----+----+----+
| | | | | | | | | | | | | | | | | |
+----+----+----+----+----+ +----+----+----+----+----+ +----+----+----+----+----+
| | | a | | | | | | b | | | | | | c | | |
+----+----+----+----+----+ +----+----+----+----+----+ +----+----+----+----+----+
| | | | | | | | | | | | | | | | | |
+----+----+----+----+----+ +----+----+----+----+----+ +----+----+----+----+----+
| | | | | | | | | | | | | | | | | |
+----+----+----+----+----+ +----+----+----+----+----+ +----+----+----+----+----+
-Y -Y -Z
####
function drawFace( me, face, horizontal, vertical, planeIdx, line1, line2, drawMinFace, cond2, cond3 ) {
var world3D = new Vector( 0,0,0 );
world3D[face] = drawMinFace ? me.Min[face] : me.Max[face];
world3D[horizontal] = me.Min[horizontal];
world3D[vertical] = me.Min[vertical];
var screen2D = me.Parent.ScreenPos( world3D );
// calculate and construct Bbox rectangle path
ss = "M " + screen2D.x + " " + screen2D.y + " "; // move to corner 1
world3D[horizontal] = me.Max[horizontal];
screen2D = me.Parent.ScreenPos( world3D );
ss += "L " + screen2D.x + " " + screen2D.y + " "; // line to corner 2
world3D[vertical] = me.Max[vertical];
screen2D = me.Parent.ScreenPos( world3D );
ss += "L " + screen2D.x + " " + screen2D.y + " "; // line to corner 3
world3D[horizontal] = me.Min[horizontal];
screen2D = me.Parent.ScreenPos( world3D );
ss += "L " + screen2D.x + " " + screen2D.y + " z"; // line to corner 4 and close back to corner 1
me.Plane[planeIdx].setAttribute( "d", ss ); // [d]efine the path for this panes Bbox
world3D[face] = 1; world3D[horizontal] = 0; world3D[vertical] = 0;
// and set its attributes
me.Plane[planeIdx].setAttribute( "fill", me.Parent.GetColor( me.FillColor, me.FillColor, world3D, drawMinFace ? me.Min : me.Max ) );
me.Plane[planeIdx].setAttribute( "stroke", me.StrokeColor );
me.Plane[planeIdx].setAttribute( "stroke-width", me.StrokeWeight );
me.Plane[planeIdx].setAttribute( "visibility", "visible" );
world3D[face] = drawMinFace ? me.Min[face] : me.Max[face];
// Draw the horizontal and vertical grid lines on this Bbox face
drawGrid( me, face, horizontal, vertical, line1, cond3, world3D ); // horizontal
drawGrid( me, face, vertical, horizontal, line2, cond2, world3D ); // vertical
}
####
function drawGrid( me, face, horizontal, vertical, idx, tickPosn, pp ) {
var ii = 0, uu = 0;
var grid = _GetGrid( me.Min[horizontal] / me.Parent.Zoom[horizontal], me.Max[horizontal] / me.Parent.Zoom[horizontal], me.Scale[horizontal] );
if( me.GridDelta[horizontal] != 0 ) grid.step = me.GridDelta[horizontal];
for( var jj = grid.max; jj >= grid.min; jj -= grid.step ) {
pp[horizontal] = jj * me.Parent.Zoom[horizontal];
pp[vertical] = me.Min[vertical];
var vv = me.Parent.ScreenPos( pp );
fromOV( me.Line[idx][ii], vv.x, vv.y ); // Move to the start(min) of this gridline
var xx = vv.x, yy = vv.y; // copy of start x/y for later
pp[vertical] = me.Max[vertical];
vv = me.Parent.ScreenPos( pp ); // pp changed; get again
toOV( me.Line[idx][ii], vv.x, vv.y ); // And draw to the other(max) end
me.Line[idx][ii].setAttribute( "stroke", me.StrokeColor ); // Set the color
me.Line[idx][ii].setAttribute( "visibility", "visible" ); // and make visible
if( tickPosn ) { // Move the tick labels to the appropriate end of the gridlines; 1.06 standoff of label; uu (fudge factor for zooming (not used))
me.Text[idx][ii].setAttribute( "x", Math.floor( xx + ( vv.x - xx ) * 1.06 ) - 50 * uu );
me.Text[idx][ii].setAttribute( "y", Math.floor( yy + ( vv.y - yy ) * 1.06 ) - 7 * uu );
}
else {
me.Text[idx][ii].setAttribute( "x", Math.floor( vv.x + ( xx - vv.x ) * 1.06 ) - 50 * uu );
me.Text[idx][ii].setAttribute( "y", Math.floor( vv.y + ( yy - vv.y ) * 1.06 ) - 7 * uu );
}
me.Text[idx][ii].setAttribute( "fill", me.StrokeColor );
me.Text[idx][ii].setAttribute( "visibility", "visible" );
if( ( ii == 1 ) && ( me.Label[horizontal] ) ) // if 1st (not zeroth?) gridline, add the axis label
innerTextOV( me.Text[idx][ii], me.Label[horizontal] );
else { // otherwise add the tick value
if( isNaN( me.Scale[horizontal] ) ) {
if( me.Scale[horizontal].substr( 0,9 ) == "function " ) {
ff = eval( "window." + me.Scale[horizontal].substr( 9 ) );
if( ff ) innerTextOV( me.Text[idx][ii], ff( _ScaleString( jj, grid.step ) ) );
}
else innerTextOV( me.Text[idx][ii], _ScaleString( jj, grid.step ) + me.Scale[horizontal] );
}
else {
if( me.Scale[horizontal] < 1 ) innerTextOV( me.Text[idx][ii], "" );
if( me.Scale[horizontal] == 1 ) innerTextOV( me.Text[idx][ii], _ScaleString( jj, grid.step ) );
if( me.Scale[horizontal] > 1 ) innerTextOV( me.Text[idx][ii], _DateFormat( jj, grid.step, me.Scale[horizontal] ) );
}
}
ii++;
}
}