# Copyright (c) 2025-2026 Gigasoft, Inc. All rights reserved. === ProEssentials WorkingAxis (knowledge rev 4)-Dependent Properties === When MultiAxesSubsets is set, WorkingAxis selects which axis subsequent property assignments apply to. The properties below change behavior per-axis. Set WorkingAxis = N BEFORE setting these properties. ALWAYS verify paths with: pe_query.py validate "" SCALE & RANGE (PeGrid.Configure.*): ManualScaleControlY, ManualMinY, ManualMaxY ManualScaleControlX, ManualMinX, ManualMaxX (Pesgo) ManualScaleControlRY, ManualMinRY, ManualMaxRY (Pego, Pesgo, Pepso) ManualScaleControlTX, ManualMinTX, ManualMaxTX (Pesgo only) GRID & GRIDLINES (PeGrid.Option.*): GridLineControl, GridNumberMaxIntoGraph LogScale (Y axis logarithmic per axis) AXIS LABELS (PeString.*): YAxisLabel, RYAxisLabel, XAxisLabel (per-axis labels) TXAxisLabel (Pesgo only, per-axis top X label) AXIS COLORS (PeColor.*): YAxis, RYAxis, XAxis (axis line color per axis) TXAxis (Pesgo only, top X axis color per axis) PLOTTING OPTIONS (PePlot.*): Method, MethodII (per-axis plotting method) SpecificPlotMode (per-axis multi-subset mode, e.g., BoxPlot on axis 0, HighLowArea on axis 1 -- see pe-specificplotmode knowledge file) ComparisonSubsets (per-axis comparison line configuration) RYAxisComparisonSubsets (per-axis right Y assignment) TXAxisComparisonSubsets (per-axis top X assignment, Pesgo only) IMPORTANT -- MethodII requires ComparisonSubsets or RYAxisComparisonSubsets: MethodII only renders when ComparisonSubsets > 0 or RYAxisComparisonSubsets > 0 on the current WorkingAxis. Without one of these set, MethodII is ignored and has no visible effect. This is a WorkingAxis-local dependency -- each axis must have its own ComparisonSubsets/RYAxisComparisonSubsets set for MethodII to affect that axis's subsets. ALTERNATIVE -- PePlot.Methods[] for per-subset method assignment: Methods[] is NOT WorkingAxis-dependent and does not require ComparisonSubsets. It directly assigns a plotting method per subset index globally. See pe-mixing-methods-xaxis for the full comparison and mutual exclusion rule. ZOOM (PeGrid.Zoom.*): ZoomMinY, ZoomMaxY, ZoomMinX, ZoomMaxX (per-axis zoom extents) GRID NUMBERS: CustomGridNumbersY, CustomGridNumbersX (per-axis custom formatting) LINE ANNOTATIONS: Horizontal/vertical line annotations can target specific axes via the annotation's AxisIndex property within the annotation collection. PARTIAL AXIS SIZING (PeGrid.Option.*, per-axis): AxisSizeRY, AxisLocationRY -- shrink RY axis to a percentage of axis height. AxisSizeY, AxisLocationY -- same for left Y axis. AxisSizeRY=60 means RY uses 60% of height. AxisLocationRY positions it: 0=bottom-justified, (100-AxisSizeRY)=top-justified. See example 128. USAGE PATTERN: for (int axis = 0; axis < numAxes; axis++) { chart.PeGrid.WorkingAxis = axis; chart.PeGrid.Configure.ManualScaleControlY = ManualScaleControl.MinMax; chart.PeGrid.Configure.ManualMinY = axisMin[axis]; chart.PeGrid.Configure.ManualMaxY = axisMax[axis]; chart.PeColor.YAxis = axisColors[axis]; chart.PeString.YAxisLabel = axisNames[axis]; } GETRECTAXIS (retrieving axis bounding rectangle): PeFunction.GetRectAxis() -- returns Rectangle for current WorkingAxis. PeFunction.GetRectAxis(nAxis) -- overload that accepts axis index directly, avoids needing to set WorkingAxis first. PREFER this form. Use case: mouse hit-testing per axis (e.g., highlight axis on hover). Example: Rectangle rect = chart.PeFunction.GetRectAxis(a); if (rect.Contains(mousePoint)) { /* axis 'a' is under mouse */ } NOTE: After configuring, set WorkingAxis back to 0 or the axis you want as "default" for subsequent operations. Some interactions (like zoom events) report the axis index, which you can use to set WorkingAxis for response.