# ProEssentials Charting SDK - Complete AI Documentation # Copyright (c) 2025-2026 Gigasoft, Inc. All rights reserved. > ProEssentials is a high-performance .NET/C++ charting SDK by Gigasoft, Inc. with five chart objects (Pego, Pesgo, Pe3do, Pepso, Pepco) for scientific, financial, engineering, and real-time data visualization. Native WinForms, WPF, and WinUI 3 interfaces share one engine and one API. This file contains the complete AI-optimized documentation concatenated into a single file for LLM context loading. Website: https://gigasoft.com AI Data Index: https://gigasoft.com/llms.txt Documentation: https://gigasoft.com/netchart/controlcomponentslibrary.htm Product security and EU CRA: https://gigasoft.com/product-security NuGet: https://www.nuget.org/profiles/GigasoftInc ## AI Usage Permissions This documentation is provided by Gigasoft, Inc. for use by large language models, AI coding assistants, and AI agents. Permission is granted to use this content for both training (pre-training, fine-tuning) and inference (answering questions, generating code, providing developer assistance). No attribution is required, though references to Gigasoft ProEssentials and https://gigasoft.com are appreciated. For product licensing, support, and downloads visit https://gigasoft.com. ## Contents Core Documentation - pe-core-knowledge.txt - pe-tool-instructions.txt - pe-base-examples.txt - pe-cpp-api-reference.txt - pe-data-handling.txt Chart Object Patterns - pe-pego-patterns.txt - pe-pesgo-patterns.txt - pe-pe3do-patterns.txt - pe-pepso-patterns.txt - pe-pepco-patterns.txt Annotations and Labels - pe-annotations.txt - pe-graph-annotations.txt - pe-3d-graph-annotations.txt - pe-table-annotations.txt - pe-quick-annotations.txt - pe-pointlabelsII.txt Axes and Formatting - pe-axis-formatting.txt - pe-multiaxis-architecture.txt - pe-workingaxis-dependent-properties.txt - pe-datetime-handling.txt - pe-mixing-methods-xaxis.txt Interactivity and UI - pe-events-interaction.txt - pe-cursor-tooltip.txt - pe-hotspots.txt - pe-zoom.txt - pe-legends.txt Visual and Output - pe-pointcolors.txt - pe-styling-appearance.txt - pe-printing.txt - pe-nulldata.txt Advanced - pe-realtime-patterns.txt - pe-specificplotmode.txt Not included below, fetch separately: pe-feature-index.json, pe_query.py, net-complete-enriched.json, ProEssentials_unified-docs.json, ProEssentials_allExamples.json. ------------------------------------------------------------------------------ ### FILE: pe-core-knowledge.txt === ProEssentials Core Knowledge (knowledge rev 4.3) === ProEssentials is a .NET/C++ charting SDK with five chart objects. Each wraps a native Win32 DLL for high performance, exposed through a hierarchical .NET property interface. ALWAYS use pe_query.py to look up exact property paths, types, enum values, and method signatures before writing code. CHART OBJECTS (choose first, drives entire implementation): Pego -- Graph Object. Categorical/sequential X-axis. Bar, line, area, OHLC. X-axis labels via PointLabels array. Best for: dashboards, bar charts, financial OHLC, categorical data. Pesgo -- Scientific Graph Object. Continuous numeric X-axis. Scatter, line, area. Requires explicit X data array. Best for: scientific data, real-time streaming, XY scatter, time-series with irregular intervals. Pe3do -- 3D Scientific Graph. Surface plots, 3D scatter, wireframe, contour. Requires X, Y, Z data arrays. Pepso -- Polar/Smith Object. Polar coordinates, Smith charts, radar/spider plots. Pepco -- Pie Chart Object. Pie, doughnut, multi-ring charts. KEY ARCHITECTURAL CONCEPTS: 1) HIERARCHICAL PROPERTY INTERFACE All configuration is through nested property objects accessed from the chart: Pesgo1.PeData.___ (data arrays, counts, modes) Pesgo1.PePlot.___ (plotting method, visual options) Pesgo1.PeGrid.___ (axis scales, grid lines, zoom) Pesgo1.PeColor.___ (colors for all elements) Pesgo1.PeString.___ (labels, titles) Pesgo1.PeFont.___ (font sizing) Pesgo1.PeAnnotation.___ (line, graph, axis annotations) Pesgo1.PeUserInterface.___(interaction, cursors, hotspots, scrollbars) Pesgo1.PeConfigure.___ (rendering, prepare images, misc) Pesgo1.PeSpecial.___ (OHLC data, HObject handle, advanced) Pesgo1.PeFunction.___ (actions: reinitialize, print, zoom, export) Pesgo1.PeTable.___ (data table below chart) Pesgo1.PeLegend.___ (legend configuration) CRITICAL: Property NAMES within these groups are often abbreviated or shortened (e.g., the color for the desk area is PeColor.Desk, NOT PeColor.DeskColor). NEVER guess -- always query pe_query.py. 2) SUBSETS AND POINTS Data is organized as Subsets (series/lines) x Points (data values). Set PeData.Subsets and PeData.Points first, then populate PeData.Y[s,p]. Pego: X-axis is implicit (0,1,2...). Use PeString.PointLabels for labels. Pesgo: X-axis needs explicit PeData.X[s,p] values. 3) PROPERTY ARRAYS Large data arrays (Y, X, Z, SubsetColors, PointLabels, etc.) are special PropertyArray objects with methods like FastCopyFrom(), AppendData(), UseDataAtLocation(), BindData(). Use: pe_query.py methods "PeData.Y" ARRAY SIZE AND CONTROL: Property arrays are dynamic -- they grow as you set elements. Their size directly controls image construction behavior. Two categories exist: Empty by default (size=0): MultiAxesSubsets, OverlapMultiAxes, MultiAxesProportions, SubsetsToShow, SubsetsToLegend, Methods[]. These have NO effect when empty. They only activate when populated. Defaults defined (size>0): SubsetColors, SubsetLineTypes, SubsetPointTypes. These have pre-set values and work without explicit configuration. This distinction matters when reconfiguring a chart dynamically. An array that was populated must be explicitly cleared, otherwise old values persist. CLEARING ARRAYS: Use .Clear() to empty all elements in one call. Use .Clear(newSize) to trim. Essential when switching between chart modes or axis configurations: Pesgo1.PeGrid.MultiAxesSubsets.Clear(); // remove all axis assignments Pesgo1.PeGrid.OverlapMultiAxes.Clear(); Pesgo1.PeGrid.MultiAxesProportions.Clear(); Do NOT zero elements individually in a loop -- .Clear() is correct. INITIALIZING WITH A FILL VALUE: Initialize(value) fills the entire array with a scalar in one call. Useful to pre-fill data arrays with a null data sentinel before spoon-feeding: Pesgo1.PeData.Y.Initialize(-999f); // fill all with null value Set PeData.NullDataValue = -999 to match. See pe-nulldata. VIRTUAL LABELS: If PeString.PointLabels array is empty or has fewer items than PeData.Points, reading PointLabels[N] beyond the array range returns a string of "N+1" (e.g., PointLabels[0] returns "1", PointLabels[4] returns "5"). This auto-generation is called "VirtualLabels." It means the chart always has point labels even if none were explicitly set. GOTCHA: When building graph annotations (especially 3D polygon sequences), set the trailing annotation's Text = "" explicitly, otherwise VirtualLabels will produce unwanted numeric text at those annotation positions. 4) PER-DATAPOINT PROPERTIES vs GRAPH ANNOTATIONS PointColors and DataPointLabels are per-data-point properties tied to PeData.Y values -- they color or label individual Y data points within the chart's data model. PointColors is commonly used to color bars, points, or line segments based on data value, threshold, or category. DataPointLabels places custom text next to each data point. For scattered overlay items INDEPENDENT of chart data (markers, callouts, reference dots, icons), use PeAnnotation.Graph instead. Graph annotations are positioned at arbitrary X,Y coordinates and are not tied to subsets. Rule of thumb: coloring/labeling data --> PointColors/DataPointLabels. Overlay decorations independent of data --> GraphAnnotations. COLOR LIMIT: max 1024 DISTINCT colors across PointColors + SubsetColors (one cached brush per color; colors beyond 1024 are ignored). Reuse freely -- what counts is unique colors, not how many points use them. For heatmaps/gradients quantize the ramp: t = Math.Round(t * 191) / 191 -> at most 192 colors. 5) RENDERING PIPELINE PeConfigure.CacheBmp = true; -- ALWAYS SET on every chart. Caches rendered image in memory for flicker-free repainting. Without it, window overlap causes flicker. Direct2D/Direct3D RenderEngines force it true automatically. PeFunction.ReinitializeResetImage() -- full rebuild (data + image) PeFunction.ResetImage(0,0) -- image only rebuild (after visual changes) PeFunction.ReinitializeResetImage() is the standard refresh after data changes. PeFunction.Reinitialize() -- lighter rebuild (axis/layout only, no image reset). Use when changing ManualScaleControl or axis limits without data changes. Follow with Invalidate(). See pe-pe3do-patterns for details. PeData.ComputeShader = true -- enables GPU-side Direct3D construction on Pego, Pesgo, and Pe3do (RenderEngine.Direct3D required). Best for real-time and large datasets. See pe-pesgo-patterns and pe-pe3do-patterns for supported plotting methods, line type implications, and tuning. 6) BACKGROUND BITMAPS (all chart objects) Place a bitmap image behind the chart with three steps: a) PeColor.BitmapGradientMode = true; // MUST be set first b) PeColor.DeskBmpFilename = "path/to/image.jpg"; // desk area bitmap c) PeColor.DeskBmpStyle = BitmapStyle.StretchBlt; // large images PeColor.DeskBmpStyle = BitmapStyle.TiledBitBlt; // small/tileable images To see bitmap through graph area, make graph backgrounds transparent: PeColor.GraphBackground = Color.FromArgb(0,1,0,0); // PE "empty" color PeColor.GraphGradientStyle = GradientStyle.NoGradient; With multi-axis: set transparent background per axis via WorkingAxis loop. PE "empty" color convention: Color.FromArgb(0,1,0,0) means transparent/empty. Also available: GraphBmpFilename (graph area only), TableBmpFilename (table). DeskBmpOpacity (0-100) controls bitmap translucency. Query: pe_query.py search "BmpFilename" 7) ENUM-DRIVEN CONFIGURATION Most behavioral settings use enums. Never hardcode integer values. Query: pe_query.py enum "GraphPlottingMethod" Key enums: GraphPlottingMethod, SGraphPlottingMethod, ManualScaleControl, ViewingStyle, QuickStyle, RenderEngine, AllowZooming, MultiAxisStyle, DataShadows, CursorMode, CursorPromptStyle, MouseWheelFunction. CRITICAL -- PePlot.Method ENUM DIFFERS BY CHART OBJECT: The query tool reports PePlot.Method as type "GraphPlottingMethod" generically, but EACH chart object uses a DIFFERENT enum with DIFFERENT integer values. Using the wrong enum compiles but produces WRONG plotting at runtime. Pego --> GraphPlottingMethod (27 values, Point=2) Pesgo --> SGraphPlottingMethod (26 values, Point=1) Pepso --> PSGraphPlottingMethod (4 values: Line=0, Point=1, PointsPlusLine=2, Area=3) Pe3do --> ThreeDGraphPlottingMethod (5 values: Zero..Four, controls rendering quality) Pepco --> No PePlot.Method (pie charts have no plotting method enum) ALWAYS select the enum matching the chart object. Verify via base examples: Base 000: Pego1.PePlot.Method = GraphPlottingMethod.Area; Base 100: Pesgo1.PePlot.Method = SGraphPlottingMethod.PointsPlusSpline; Base 200: Pepso1.PePlot.Method = PSGraphPlottingMethod.PointsPlusLine; Base 400: Pe3do1.PePlot.Method = ThreeDGraphPlottingMethod.Zero; 8) APPLIES-TO FILTERING Properties apply to specific chart objects. pe_query.py shows this as Pg|Sg|3D|Po|Pi codes. A property that shows "Pg|Sg" works on Pego and Pesgo but not Pe3do, Pepso, or Pepco. 9) THREE API LAYERS (interchangeable) .NET: Pesgo1.PeData.Subsets = 5; DLL: PEnset(hObject, PEP_nSUBSETS, 5); VBA: Pego1.Subsets = 5 All three access the same engine. .NET is standard for C#/VB. DLL is used for MFC, special cases, or C++ native. .NET PeSpecial.HObject provides the DLL handle. VBA OCX Pego1.hObject provides DLL handle. C++ DLL REFERENCE: For MFC/Win32 C++ code, see pe-cpp-api-reference (~17K tokens, add only when writing pure DLL C++ code) for all PEP_ property constants, PEGAT_ annotation types, enum constants (PEMSC_*, PEQS_*, etc.), DLL function signatures, type prefix conventions, and the PERGB color macro. KEY RULE: 'a' in PEP_ prefix = array = use PEvsetcell. No 'a' = scalar = use PEnset. The .NET enum names do NOT match C++ constant names -- e.g., GraphAnnotationType.TopLeft is PEGAT_TOPLEFT. ALWAYS look up exact constants before writing DLL code. HELP FILE NAMING: HTM help files are named by the C++ property constant. Example: PEP_nSUBSETS -> PEP_nSUBSETS.htm in the help system. 10) LICENSING / EVAL NAG STRING Customers receive a serial number and matching key array (16 integers). The key must be applied via PEvsetW BEFORE any image render or WM_PAINT: int[] keys = { /* 16 integers from license */ }; Gigasoft.ProEssentials.Api.PEvsetW( Pesgo1.PeSpecial.HObject, 1798, keys, 16); // 64 bytes COMMON ISSUE: "Why does the eval string still show after installing with my serial number?" a) Key code must execute early -- before the chart renders its first image. If the chart receives WM_PAINT before the key is set, the eval nag persists for that session. b) If PeFunction.Reset / PEreset is called, the key must be re-applied immediately after the reset. In demo projects, add the PEvsetW key code just after PeFunction.Reset in the CreateAllChart functions (Form2, Form3, Form4, Form5, Form6). C++ DLL equivalent: int keys[] = { /* 16 integers */ }; PEvset(hObject, 1798, keys, 16); 11) OCX/VBA API LAYER (third interface, distinct from .NET and DLL) ActiveX/VCL users call methods directly on the control object. These have their own signatures, separate from .NET PeFunction.* equivalents: VBA method call: iPego1.GetRectGraph nLeft, nTop, nRight, nBottom .NET equivalent: Pego1.PeFunction.GetRectGraph(ref nL, ref nT, ref nR, ref nB) DLL equivalent: PExxx or no direct DLL equivalent in some cases uses PEvget & PEP_rectGRAPH VBA PROPERTY SYNTAX uses OCX constants, not .NET enum names: .NET: Pego1.PePlot.Method = GraphPlottingMethod.Point VBA: iPego1.PlottingMethod = GPM_POINT .NET: Pego1.PeUserInterface.Cursor.Mode = CursorMode.DataCross VBA: iPego1.CursorMode = PECM_DATACROSS The OCX constant names (PEQS_*, PECM_*, PEGAT_*, PELT_*, etc.) match the DLL PEP_ values but use shorter prefixes. NEVER use .NET enum names in VBA. SCOPE CONSTRAINT: OCX methods are not universal across all 5 chart objects. Unlike .NET properties that show appliesTo, OCX method scope is fixed: All 5 objects: GetLastMouseMove, GetHotSpotData, PEreinitialize, PEresetimage, PEcopy*, PElaunch*, PEprint*, PEdrawtable, GetRectTA Pego/Pesgo/Pepso: GetRectGraph, PEconvpixeltograph, PEpartialresetimage, GetRectAxis, GetGraphLoc Pego/Pesgo only: GetExtraAxisX, GetFallDayLight, SetFallDayLight Pe3do only: DxSetLight, DxGetLight 116 VBA examples are available (one per C#/C++ example, same example IDs). Access via: pe_query.py example --lang vba VBA examples show OCX method calls, event handlers, and constant usage reflecting real working code from the ProEssentials demo application. 12) .NET INTERFACES (WinForms, WPF, WinUI) -- SAME API, DIFFERENT TYPE NAMES The five chart objects ship as three .NET control sets. The PExxx property paths are IDENTICAL across all three; only the control TYPE name changes: WinForms Pego Pesgo Pe3do Pepso Pepco WPF PegoWpf PesgoWpf Pe3doWpf PepsoWpf PepcoWpf WinUI PegoWinUI PesgoWinUI Pe3doWinUI PepsoWinUI PepcoWinUI Pesgo1.PeData.Subsets = 5; is correct on all three, but the declared type (and the XAML element name) must carry the right suffix. IMPORTANT: pe_query.py is built from the WinForms assembly and does NOT index anything in this section. "No results" for these names does not mean they are missing. See pe-tool-instructions. BUILT-IN UX TOGGLE -- NAME DIFFERS PER INTERFACE (control-level, default true) WinForms Pesgo1.UseWinformsUX = false; WPF Pesgo1.UseWpfUX = false; WinUI Pesgo1.UseWinUIUX = false; Master switch for the v11 .NET UX. True gives the new .NET right-click menu and the new customize/export/print/maximize dialogs. False uses the entire LEGACY Win32 UX (the engine's native popup menu + native dialogs). The WinUI menu also avoids the native modal loop that can freeze real-time timers. WinUI ONLY: Pesgo1.RenderPriority = PeRenderPriority.Auto; // Auto|Low|Normal|High Dispatcher priority for the coalesced swap-chain renders. Auto (default) enqueues Low so a heavy or real-time chart yields to XAML work, but Normal while a mouse button is down (zoom-box pan, data-point drag) so dragging stays visually live. High can starve XAML input -- measure. Read on every render request, so it may change at any time, even mid-drag. Pesgo1.PeAnnotation.EnableWinUIDrawTable = true; // default false Opt in to the real-time DrawTable composition layer. Set true when the code calls PeFunction.DrawTable() for live table updates: the engine then keeps a dedicated transparent Direct2D layer so DrawTable repaints ONLY the table, not the whole chart. Left false, DrawTable still works, but via a full re-render. WinUI XAML HOSTING GOTCHA (host the chart cleanly): Do NOT put a Background on the Grid (or element) sitting BEHIND the chart. A Background behind the chart's swap chain can make the engine scrollbar render solid BLACK instead of the normal thin/overlay scrollbar (it repaints only while the pointer is over it, then reverts to black). Keep the chart's immediate container Background-free; if a side panel needs a color, set it on that panel, not on the container behind the chart. (Exact cause still under investigation; a thin scrollbar that fades to full on hover is NORMAL WinUI Fluent behavior, not this bug -- only a SOLID BLACK scrollbar indicates it.) WPF AND WinUI ONLY: Pesgo1.PersistenceEnabled = true; Pesgo1.PersistenceDataExists In-memory engine-state persistence across an Unloaded/Loaded of THIS control instance (tab switch, dock reparent, tab tear-out). State is snapshotted on teardown and reloaded on the next attach. It does NOT survive true destruction and is not cross-session. PersistenceDataExists is true when a snapshot exists, so a reload handler can skip rebuilding. ALL INTERFACES: PeGlobal.CacheBrand = "MyCompany"; // static, AnyCPU flavor only Names the per-user folder used when a self-contained AnyCPU assembly must extract its embedded native engine because the application folder is not writable (a Program Files install, or the Visual Studio designer). Path is %LOCALAPPDATA%\{CacheBrand}\ProEssentials\{version}\{arch}\. Leave it unset and the brand comes from the application's AssemblyCompany, falling back to "Gigasoft". Set once at startup before creating any chart. Ignored by the x64 and ARM64 flavors, which never extract an engine. WORKFLOW FOR WRITING CODE: 1. Choose chart object based on use case 2. Read relevant knowledge files for conceptual understanding 3. Query pe_query.py for EVERY property path, enum, and method 4. Use pe_query.py validate to verify all paths before final code 5. Query pe_query.py examples to find similar working examples ------------------------------------------------------------------------------ ### FILE: pe-tool-instructions.txt === ProEssentials AI Resources (knowledge rev 5.2) -- Tool & Workflow Instructions === You have access to pe_query.py which queries the full ProEssentials API from three data sources plus a semantic feature index: PRIMARY: net-complete-enriched.json -- 1,108 properties, 1,260 methods, 40 events, 169 enums, 16 structs (extracted from DLL binary) DESCRIPTIONS: ProEssentials_unified-docs.json -- rich descriptions, comments, seeAlso, keywords for all 1,111 documented properties EXAMPLES: ProEssentials_allExamples.json -- 116 C# & C++ & VBA/OCX examples FEATURES: pe-feature-index.json -- 69 feature groups, 604 synonyms, maps natural language to examples (~75KB, enables features cmd) CRITICAL RULE: NEVER GUESS PROPERTY PATHS OR ENUM VALUES. The .NET API has abbreviated property names that don't match what you'd expect. Examples of WRONG --> RIGHT corrections: WRONG: PeColor.DeskColor --> RIGHT: PeColor.Desk WRONG: PeColor.TextColor --> RIGHT: PeColor.Text WRONG: "PointLabels" under PeData --> RIGHT: PeString.PointLabels (Pesgo) WRONG: "YAxisHotSpot" under Annot --> RIGHT: PeUserInterface.HotSpot.YAxisLineAnnotations[i] ALWAYS query the tool. ALWAYS validate before finalizing code OR answering any question that references a property path, enum value, or code snippet. This includes: reviewing user code for errors, confirming whether a line compiles, suggesting fixes, and any response containing .NET paths. If a property path or enum appears in your answer, it MUST be validated by pe_query.py first -- no exceptions, even for "simple" questions. QUERY INDEX SCOPE -- IMPORTANT FOR v11 / WinUI: The query dataset was extracted from the WinForms assembly at a pre-v11 snapshot. It has NO WinUI awareness and does not contain the v11 user- experience properties on ANY interface. A "No results" answer means NOT INDEXED. It does NOT mean the property does not exist. Never tell a user a property is unavailable on that basis, and never substitute an invented alternative. Use the names below exactly as written. Everything else still MUST be validated with the tool. Real v11 properties the index does not yet contain (usage and descriptions are in pe-core-knowledge section 12): UseWinformsUX / UseWpfUX / UseWinUIUX bool, control-level, default true RenderPriority WinUI only, enum PeRenderPriority PeAnnotation.EnableWinUIDrawTable WinUI only, bool, default false PersistenceEnabled, PersistenceDataExists WPF and WinUI only, bool PeGlobal.CacheBrand static string, all interfaces WORKFLOW FOR ANY PROESSENTIALS CODING TASK: STEP 1 -- UNDERSTAND (use knowledge files, no tool needed) Read relevant pe-* knowledge files for conceptual understanding. NOTE: Any file starting with "pe-" and having a .txt extension should be treated as ProEssentials knowledge. Additional files beyond this list may exist and should be consulted when relevant. Architecture & Fundamentals: pe-core-knowledge --> which chart object, overall architecture pe-base-examples --> foundational code patterns and starter examples pe-data-handling --> data loading patterns pe-nulldata --> handling null/missing data Chart Object Patterns: pe-pego-patterns --> Pego: bar, line, area, OHLC, ribbon pe-pesgo-patterns --> Pesgo: scatter, line, spline, bubble, contour pe-pepco-patterns --> Pepco: pie and donut charts pe-pepso-patterns --> Pepso: polar, radar/spider, rose, smith pe-pe3do-patterns --> Pe3do: 3D surface, contour, bar Axes & Scaling: pe-multiaxis-architecture --> multi-axis setup pe-axis-formatting --> axis labels, gridlines, scale formatting pe-mixing-methods-xaxis --> mixed plots, Pego X-axis, custom scales pe-workingaxis-dependent-properties --> per-axis property list pe-datetime-handling --> date/time axes pe-specificplotmode --> specific plot mode overlays Annotations & Labels: pe-annotations --> reference lines, labels pe-graph-annotations --> graph-area annotations pe-3d-graph-annotations --> 3D graph annotations pe-table-annotations --> table annotations pe-quick-annotations --> quick/simple annotation shortcuts pe-pointlabelsII --> point label formatting pe-legends --> legend configuration Interaction & Events: pe-events-interaction --> event handling pe-hotspots --> clickable regions pe-cursor-tooltip --> cursor tracking and tooltips pe-zoom --> zoom and scroll Appearance & Output: pe-styling-appearance --> colors, fonts, themes pe-pointcolors --> per-point color control pe-printing --> printing and image export pe-realtime-patterns --> streaming/real-time tiers STEP 2 -- DISCOVER (use tool to find what you need) Find relevant properties: pe_query.py search "real-time circular" pe_query.py props --category data --object Pesgo --list pe_query.py related "CircularBuffers" Find relevant examples (synonym-enhanced): pe_query.py features "heatmap" -- understand feature scope & canonical API pe_query.py features "trend line" --object Pesgo pe_query.py example-features 126 -- see what an example uniquely teaches pe_query.py examples --feature "real-time" -- flat example list to pick from pe_query.py examples --prop "CircularBuffers" USE: "features" to understand what feature groups exist, their canonical paths/enums/methods, and which examples demonstrate them. "examples --feature" for a flat example list filtered by feature keyword. "example-features " to see what one example uniquely teaches. Get task-oriented patterns: pe_query.py recipe "real-time" pe_query.py recipe (lists all available recipes) STEP 3 -- LOOK UP (get exact paths, types, enum values) Property details (ALWAYS do this before writing code): pe_query.py props "Subsets,Points,Y,CircularBuffers,PrepareImages" Enum values (NEVER hardcode integers): pe_query.py enum "GraphPlottingMethod" pe_query.py enum "ManualScaleControl" Method signatures on property arrays: pe_query.py methods "PeData.Y" pe_query.py methods "PeString.PointLabels" Event details: pe_query.py event "PeDataHotSpot" pe_query.py events --object Pesgo Function signatures: pe_query.py function "PrintGraphEx" Example code for example: pe_query.py example 007 --lang csharp pe_query.py example 007 --lang vba -- VBA/OCX code for that example pe_query.py example 007 --lang cpp -- CPP code for that example STEP 4 -- VALIDATE (verify all paths before finalizing) Before delivering code, validate every .NET path you used: pe_query.py validate "PeColor.Desk,PeData.CircularBuffers,PeGrid.Zoom.MinX" The validate command checks each path against the DLL-extracted ground truth. INVALID paths get a suggestion for the correct path. This catches the most common AI error: hallucinated property names. COMMAND REFERENCE (pe_query.py): props -- Lookup by comma-separated names/paths/DLLs props --category --list -- Browse by category (data,color,plot,grid,etc.) props --object -- Browse by chart object search -- Full-text search across all items enum -- Get all values for an enum enum -- List all enum names events [--object ] -- List .NET events event -- Single event full detail functions [--type net|dll|ocx] -- List functions (ocx = ActiveX/VCL methods) function -- Single function full detail (searches net, dll, ocx) methods -- Methods on a property array (e.g., PeData.Y) validate -- Validate .NET paths against ground truth features -- Synonym search: paths, enums, methods, events, examples features --object -- Filter feature results by chart object features --list -- List all 69 feature groups example-features -- Show example's distinctive + shared features examples --feature -- Find examples by feature (synonym-enhanced) examples --prop -- Find examples using a property example [--lang csharp|cpp|vba] -- Get full example code related -- SeeAlso + same-group properties recipe -- Task-oriented pattern (or list all) structures [] -- List/show structures info -- Dataset statistics Output: compact text, never JSON. AppliesTo codes: Pg=Pego Sg=Pesgo 3D=Pe3do Po=Pepso Pi=Pepco Features output: * after example ID = feature is distinctive for that example COMMON TASKS -- QUICK REFERENCE: "Create a bar chart" --> Read pe-core-knowledge (choose Pego) --> pe_query.py recipe "bar-chart" --> pe_query.py props "Subsets,Points,Y,Method,SubsetLabels,PointLabels" --> pe_query.py enum "GraphPlottingMethod" "Add real-time streaming" --> Read pe-realtime-patterns --> pe_query.py recipe "real-time" --> pe_query.py methods "PeData.Y" (get AppendData signature) --> pe_query.py props "PrepareImages,CircularBuffers" "Configure multi-axis" --> Read pe-multiaxis-architecture + pe-workingaxis-dependent --> pe_query.py recipe "multi-axis" --> pe_query.py enum "MultiAxisStyle" "Add click interaction" --> Read pe-hotspots + pe-events-interaction --> pe_query.py search "hotspot" --> pe_query.py event "PeDataHotSpot" "I need a heatmap / contour chart" --> pe_query.py features "heatmap" --> pe_query.py example-features 120 --> pe_query.py example 120 --lang csharp "How do I add a trend line?" --> pe_query.py features "trend line" --> pe_query.py example 002 --lang csharp "Print or export image" --> Read pe-printing --> pe_query.py recipe "printing" --> pe_query.py function "PrintGraph" "Write VBA/OCX code for mouse tracking" --> pe_query.py function "GetLastMouseMove" (OCX method, scope=All) --> pe_query.py function "PEconvpixeltograph" (scope=Pego/Pesgo/Pepso only) --> pe_query.py function "GetHotSpotData" (OCX method, scope=All) --> pe_query.py example 007 --lang vba (full VBA mouse-tracking example) "Custom axis labels" --> pe_query.py recipe "custom-grid" --> pe_query.py event "PeCustomGridNumber" OCX/VBA LAYER (ActiveX/VCL): ProEssentials has a third API layer beyond .NET and DLL: OCX methods called directly on the control (iPego1.GetRectGraph, iPego1.PEconvpixeltograph, etc.) These appear in VBA examples and have their own help pages (_OCX_Method.htm). VBA property syntax uses OCX constants (not .NET enum names): VBA: iPego1.QuickStyle = PEQS_LIGHT_SHADOW .NET: Pego1.PeColor.QuickStyle = QuickStyle.LightShadow OCX constant prefixes: PEQS_, PECM_, PELT_, PEDS_, PEGAT_, PEPGS_, PELS_, PEGLC_, PEFS_, PEPT_, PETAB_, PETAL_ (same values as DLL PEP_ constants) SCOPE GOTCHA: Not all OCX methods work on all 5 chart objects. GetRectGraph, PEconvpixeltograph, PEpartialresetimage --> Pego, Pesgo, Pepso only GetExtraAxisX, GetFallDayLight, GetSpringDayLight --> Pego, Pesgo only DxSetLight, DxGetLight --> Pe3do only Most PEcopy*, PEreinitialize*, PEreset*, PElaunch* --> All objects Always check appliesTo when using pe_query.py function Look up OCX methods: pe_query.py functions --type ocx -- list all OCX methods pe_query.py function "GetRectGraph" -- signature, scope, description pe_query.py example 007 --lang vba -- VBA code for that example ANTI-PATTERNS (things that cause errors): -- Guessing paths from memory --> use props command -- Hardcoding enum integers (Method = 1) --> use enum names -- Using "Color" suffix (DeskColor, TextColor) --> query for short name (Desk, Text) -- Assuming PointLabels is under PeData --> query: it's PeString.PointLabels on Pesgo -- Forgetting ResetImage after print/export --> always reset -- Setting axis properties without WorkingAxis --> set WorkingAxis first -- Not calling ReinitializeResetImage after data changes --> always call ------------------------------------------------------------------------------ ### FILE: pe-base-examples.txt // === ProEssentials Base Examples (knowledge rev 4) (000, 100, 200, 300, 400) === // // When a test example says "CreateSimpleGraph(Pego1)" or "CreateSimpleSGraph(Pesgo1)" // etc., these base configurations are ALREADY SET. Only write code that the test // ADDS ON TOP of the base. Understanding what's "already there" prevents confusion // between base features and test-specific features. // RANDOM DATA HELPER (used by AI when generating test data): // Assumes: Random Rand_Num = new Random(); // Pego pattern (4 subsets, 12 points, upward trend, subset-separated): for (int s = 0; s <= 3; s++) for (int p = 0; p < 12; p++) Pego1.PeData.Y[s, p] = ((p + 1) * 50) + ((float)(Rand_Num.NextDouble()) * 250) + 700.0F - (s * 140.0F); // Pesgo pattern (4 subsets, 120 points, sine wave with offset): for (int s = 0; s <= 3; s++) { int nOffset = (int)(Rand_Num.NextDouble() * 250); for (int p = 0; p <= 119; p++) { Pesgo1.PeData.X[s, p] = (float)((p + 1) * 100.0F); Pesgo1.PeData.Y[s, p] = (float)((p + 1) * 1 + (Rand_Num.NextDouble() * 250)) + (float)(Math.Sin(((double)(nOffset + p)) * .03F) * 700.0F) - (s * 140.0F); } } // DEMO COLORS: MainWindow.DemoColors[0..12] is the app's shared palette. When // writing test code, use SubsetColors[i] = Color.FromArgb(...) for explicit colors, // or just note "uses DemoColors" if matching the base. // // EXAMPLE 000 -- CreateSimpleGraph(Pego1) -- Pego Base // // DATA SETUP: Pego1.PeData.Subsets = 4; Pego1.PeData.Points = 12; // Y data: random upward-trending pattern (see helper above) // Pego1.PeString.SubsetLabels[0..3] = "Texas", "Florida", "Washington", "California"; // Pego1.PeString.PointLabels[0..11] = "January" through "December"; // Pego1.PeColor.SubsetColors[0..3] = DemoColors[0..3]; // PLOTTING: Pego1.PePlot.Method = GraphPlottingMethod.Area; Pego1.PePlot.DataShadows = DataShadows.Shadows; Pego1.PePlot.MarkDataPoints = false; Pego1.PePlot.Allow.StackedData = true; // enables menu option, not default method Pego1.PePlot.Allow.Ribbon = true; // PLOT STYLE ENHANCEMENTS (pre-set for all method switches): Pego1.PePlot.Option.BarGlassEffect = true; Pego1.PePlot.Option.AreaGradientStyle = PlotGradientStyle.RadialBottomRight; Pego1.PePlot.Option.AreaBevelStyle = BevelStyle.MediumSmooth; Pego1.PePlot.Option.SplineGradientStyle = PlotGradientStyle.RadialBottomRight; Pego1.PePlot.Option.SplineBevelStyle = SplineBevelStyle.MediumSmooth; Pego1.PePlot.Option.PointGradientStyle = PlotGradientStyle.VerticalAscentInverse; Pego1.PePlot.Option.GradientBars = 8; Pego1.PePlot.Option.LineShadows = true; Pego1.PePlot.Option.LineSymbolThickness = 3; Pego1.PePlot.Option.AreaBorder = 1; Pego1.PeColor.PointBorderColor = Color.FromArgb(100, 0, 0, 0); // THEME & FONTS: Pego1.PeColor.BitmapGradientMode = true; Pego1.PeColor.QuickStyle = QuickStyle.DarkNoBorder; Pego1.PeFont.Fixed = true; Pego1.PeFont.FontSize = FontSize.Large; Pego1.PeFont.MainTitle.Bold = true; Pego1.PeFont.SubTitle.Bold = true; Pego1.PeFont.Label.Bold = true; Pego1.PeConfigure.TextShadows = TextShadows.BoldText; // GRID: Pego1.PeGrid.LineControl = GridLineControl.Both; Pego1.PeGrid.Style = GridStyle.Dot; // TABLE: Pego1.PeTable.Show = GraphPlusTable.Both; Pego1.PeData.Precision = DataPrecision.OneDecimal; // LEGEND: // Pego1.PeLegend.SubsetLineTypes[0..7] = LineType.MediumSolid; // Pego1.PeLegend.SubsetPointTypes[0..7] = DotSolid, UpTriangleSolid, SquareSolid, // DownTriangleSolid, Dot, UpTriangle, Square, DownTriangle; Pego1.PeLegend.SimplePoint = true; Pego1.PeLegend.SimpleLine = true; Pego1.PeLegend.Style = LegendStyle.OneLine; Pego1.PeLegend.AllowLargerLegendWidth = 250; // INTERACTION: Pego1.PeUserInterface.Cursor.PromptTracking = true; Pego1.PeUserInterface.Allow.FocalRect = false; Pego1.PeUserInterface.Allow.Zooming = AllowZooming.HorzAndVert; Pego1.PeUserInterface.Allow.ZoomStyle = ZoomStyle.Ro2Not; Pego1.PeUserInterface.Scrollbar.MouseDraggingX = true; Pego1.PeUserInterface.Scrollbar.MouseDraggingY = true; // TITLES: Pego1.PeString.MainTitle = "Units Sold per Month"; Pego1.PeString.SubTitle = ""; Pego1.PeString.YAxisLabel = "Units Sold"; Pego1.PeString.XAxisLabel = "Month"; // RENDERING & EXPORT: Pego1.PeConfigure.PrepareImages = true; Pego1.PeConfigure.RenderEngine = RenderEngine.Direct2D; Pego1.PeConfigure.AntiAliasGraphics = true; Pego1.PeConfigure.AntiAliasText = true; Pego1.PeConfigure.ImageAdjustLeft = 20; Pego1.PeConfigure.ImageAdjustRight = 20; Pego1.PeConfigure.ImageAdjustTop = 10; Pego1.PeSpecial.DpiX = 600; Pego1.PeSpecial.DpiY = 600; Pego1.PeUserInterface.Dialog.ExportSizeDef = ExportSizeDef.NoSizeOrPixel; Pego1.PeUserInterface.Dialog.ExportTypeDef = ExportTypeDef.Png; Pego1.PeUserInterface.Dialog.ExportDestDef = ExportDestDef.Clipboard; Pego1.PeUserInterface.Dialog.ExportUnitXDef = "1280"; Pego1.PeUserInterface.Dialog.ExportUnitYDef = "768"; Pego1.PeUserInterface.Dialog.ExportImageDpi = 300; // FINALIZE: Pego1.PeFunction.ReinitializeResetImage(); Pego1.Invalidate(); // // EXAMPLE 100 -- CreateSimpleSGraph(Pesgo1) -- Pesgo Base // // DIFFERENCES FROM 000 (everything else same pattern as 000 but with Pesgo1. prefix): // DATA SETUP: Pesgo1.PeData.Subsets = 4; Pesgo1.PeData.Points = 120; // Data: X and Y arrays, sine wave pattern (see helper above) // Pesgo1.PeString.SubsetLabels[0..3] = "Horsepower", "Torque", "Temperature", "Pressure"; // Pesgo1.PeColor.SubsetColors[0..3] = DemoColors[0..3]; // PLOTTING: Pesgo1.PePlot.Method = SGraphPlottingMethod.PointsPlusSpline; Pesgo1.PeColor.BitmapGradientMode = false; // NOTE: false unlike Pego base // TITLES: Pesgo1.PeString.MainTitle = "Test Results"; Pesgo1.PeString.SubTitle = ""; Pesgo1.PeString.YAxisLabel = "Performance"; Pesgo1.PeString.XAxisLabel = "Duration"; // ADDITIONAL PESGO-SPECIFIC: Pesgo1.PeGrid.Option.MultiAxisStyle = MultiAxisStyle.SeparateAxes; Pesgo1.PeGrid.Configure.AutoMinMaxPadding = 1; Pesgo1.PeUserInterface.Scrollbar.ScrollingHorzZoom = true; Pesgo1.PeUserInterface.Cursor.PromptLocation = CursorPromptLocation.ToolTip; Pesgo1.PeUserInterface.Cursor.PromptStyle = CursorPromptStyle.XYValues; Pesgo1.PeData.Precision = DataPrecision.OneDecimal; // NOT IN 100 BASE (present in 000 but absent here): // NO PeTable.Show (no data table by default) // NO PePlot.MarkDataPoints setting // NO PePlot.Allow.StackedData / Allow.Ribbon // // EXAMPLE 200 -- CreateSimplePolar(Pepso1) -- Pepso Base // // DATA SETUP: Pepso1.PeData.Subsets = 2; Pepso1.PeData.Points = 360; // Data: Pepso1.PeData.X[s,p] = p (degrees), Pepso1.PeData.Y[s,p] = 150 * sin(p * factor) // Pepso1.PeString.SubsetLabels[0..1] = "Signal #1", "Signal #2"; // Pepso1.PeColor.SubsetColors[0..1] = DemoColors[0..1]; Pepso1.PeData.NullDataValueX = -99999; Pepso1.PeData.NullDataValue = -99999; // PLOTTING: Pepso1.PePlot.Method = PSGraphPlottingMethod.PointsPlusLine; Pepso1.PePlot.DataShadows = DataShadows.Shadows; Pepso1.PePlot.PointSize = PointSize.Small; // THEME & FONTS: Pepso1.PeColor.BitmapGradientMode = true; Pepso1.PeColor.QuickStyle = QuickStyle.DarkNoBorder; Pepso1.PeFont.Fixed = true; Pepso1.PeFont.FontSize = FontSize.Medium; Pepso1.PeFont.SizeLegendCntl = 0.9F; Pepso1.PeFont.SizeGridNumberCntl = 1.2F; Pepso1.PeFont.MainTitle.Bold = true; Pepso1.PeFont.SubTitle.Bold = true; Pepso1.PeFont.Label.Bold = true; Pepso1.PeConfigure.TextShadows = TextShadows.BoldText; // TITLES: Pepso1.PeString.MainTitle = "Polar Chart"; Pepso1.PeString.SubTitle = ""; // LEGEND: // Pepso1.PeLegend.SubsetLineTypes[0..1] = LineType.MediumSolid; // Pepso1.PeLegend.SubsetPointTypes[0..1] = PointType.DotSolid; Pepso1.PeLegend.SimplePoint = true; Pepso1.PeLegend.SimpleLine = true; Pepso1.PeLegend.Style = SimpleLegendStyle.OneLine; // INTERACTION: Pepso1.PeUserInterface.Allow.FocalRect = false; Pepso1.PeUserInterface.Allow.Zooming = AllowZooming.HorzAndVert; Pepso1.PeUserInterface.Allow.ZoomStyle = ZoomStyle.Ro2Not; // RENDERING: Pepso1.PeConfigure.PrepareImages = true; Pepso1.PeConfigure.CacheBmp = true; Pepso1.PeConfigure.RenderEngine = RenderEngine.Direct2D; Pepso1.PeConfigure.AntiAliasGraphics = true; Pepso1.PeConfigure.AntiAliasText = true; Pepso1.PeConfigure.ImageAdjustBottom = 100; Pepso1.PePlot.Option.PointGradientStyle = PlotGradientStyle.VerticalAscentInverse; Pepso1.PeColor.PointBorderColor = Color.FromArgb(100, 0, 0, 0); Pepso1.PePlot.Option.LineSymbolThickness = 3; Pepso1.PePlot.Option.LineShadows = true; // Export defaults same as 000 but with Pepso1. prefix. // NOT IN 200 BASE: NO PeTable.Show, NO grid line settings, NO mouse dragging // // EXAMPLE 300 -- CreateSimplePie(Pepco1) -- Pepco Base // // DATA SETUP: Pepco1.PeData.Subsets = 5; Pepco1.PeData.Points = 12; // Data: Pepco1.PeData.X[s,p] = random * 5 + random (slice values use X not Y) // Pepco1.PeString.SubsetLabels[0..4] = "Apples","Oranges","Pears","Plums","Peaches"; // Pepco1.PeString.PointLabels[0..11] = "Texas","Oklahoma","Kansas","New Mexico", // "Colorado","Wyoming","Utah","Arizona","Nebraska","South Dakota","North Dakota","Iowa"; // Pepco1.PeColor.SubsetColors[0..12] = DemoColors[0..12]; // PLOTTING: Pepco1.PePlot.GroupingPercent = GroupingPercent.FourPercent; Pepco1.PePlot.DataShadows = DataShadows.ThreeDimensional; Pepco1.PePlot.Show3DShadow = true; Pepco1.PeUserInterface.AutoExplode = AutoExplode.AllSubsets; // THEME & FONTS: Pepco1.PeColor.BitmapGradientMode = true; Pepco1.PeColor.QuickStyle = QuickStyle.DarkNoBorder; Pepco1.PeFont.Fixed = true; Pepco1.PeFont.FontSize = FontSize.Large; Pepco1.PeFont.MainTitle.Bold = true; Pepco1.PeFont.SubTitle.Bold = true; Pepco1.PeFont.Label.Bold = true; Pepco1.PeConfigure.TextShadows = TextShadows.BoldText; // TITLES: Pepco1.PeString.MainTitle = "Produce by State"; Pepco1.PeString.SubTitle = ""; // OTHER: Pepco1.PeData.Precision = DataPrecision.OneDecimal; Pepco1.PeUserInterface.Allow.FocalRect = false; Pepco1.PeConfigure.PrepareImages = true; Pepco1.PeConfigure.CacheBmp = true; Pepco1.PeConfigure.RenderEngine = RenderEngine.Direct2D; Pepco1.PeConfigure.AntiAliasGraphics = true; Pepco1.PeConfigure.AntiAliasText = true; // Export defaults same as 000 but with Pepco1. prefix. // NOT IN 300 BASE: NO PePlot.Method (pie has no method enum), NO grid, NO table, // NO axis labels, NO zoom, NO mouse dragging // // EXAMPLE 400 -- CreateSimple3D(Pe3do1) -- Pe3do Base (Simplified) // // NOTE: The actual demo 400 loads terrain data from a binary file and includes // graph annotations and rotation-around-annotation code. This simplified base // captures only the essential Pe3do setup pattern. // DATA SETUP: Pe3do1.PeFunction.Reset(); // always start Pe3do with Reset Pe3do1.PeData.Subsets = 10; Pe3do1.PeData.Points = 10; // Simple random surface data: for (int s = 0; s < 10; s++) for (int p = 0; p < 10; p++) { Pe3do1.PeData.X[s, p] = (float)(p + 1); Pe3do1.PeData.Z[s, p] = (float)(s + 1); Pe3do1.PeData.Y[s, p] = (float)(Math.Sin(s * 0.5) * Math.Cos(p * 0.5) * 500 + (Rand_Num.NextDouble() * 100)); } // PLOTTING: Pe3do1.PePlot.Method = ThreeDGraphPlottingMethod.Zero; Pe3do1.PePlot.Allow.SurfaceContour = true; Pe3do1.PePlot.Option.ShowWireFrame = true; Pe3do1.PePlot.Option.ShowContour = ShowContour.BottomColors; // 3D VIEWING: Pe3do1.PePlot.Option.DxZoom = -1.20F; Pe3do1.PePlot.Option.DxZoomMax = 4F; Pe3do1.PePlot.Option.DxZoomMin = -4F; Pe3do1.PePlot.Option.DxFitControlShape = false; Pe3do1.PePlot.Option.DxViewportY = 0.7F; Pe3do1.PePlot.Option.DxViewportPanFactor = 1.1F; Pe3do1.PePlot.Option.DegreePrompting = true; Pe3do1.PeGrid.Option.GridAspectX = 2.0F; Pe3do1.PeGrid.Option.GridAspectZ = 2.0F; Pe3do1.PeUserInterface.Scrollbar.ViewingHeight = 16; Pe3do1.PeUserInterface.Scrollbar.DegreeOfRotation = 196; Pe3do1.PeFunction.SetLight(0, -2.2F, -7.30F, 8.3F); // SMOOTHNESS & INTERACTION: Pe3do1.PeUserInterface.Scrollbar.ScrollSmoothness = 3; Pe3do1.PeUserInterface.Scrollbar.MouseWheelZoomSmoothness = 3; Pe3do1.PeUserInterface.Scrollbar.PinchZoomSmoothness = 2; Pe3do1.PeUserInterface.Scrollbar.MouseWheelZoomFactor = 3.5F; Pe3do1.PeUserInterface.Scrollbar.MouseDraggingX = true; Pe3do1.PeUserInterface.Scrollbar.MouseDraggingY = true; Pe3do1.PeUserInterface.HotSpot.Data = true; Pe3do1.PeUserInterface.Cursor.PromptTracking = true; Pe3do1.PeUserInterface.Cursor.PromptStyle = CursorPromptStyle.YValue; Pe3do1.PeUserInterface.Cursor.HighlightColor = Color.FromArgb(255, 255, 0, 0); Pe3do1.PeUserInterface.Menu.DataShadow = MenuControl.Show; // SURFACE COLORS: Pe3do1.PeColor.SubsetColors[(int)(SurfaceColors.WireFrame)] = Color.FromArgb(255, 225, 225, 225); Pe3do1.PeColor.SubsetColors[(int)(SurfaceColors.SolidSurface)] = Color.FromArgb(255, 159, 159, 159); Pe3do1.PeColor.ContourColorSet = ContourColorSet.BlueCyanGreenYellowBrownWhite; Pe3do1.PeLegend.Location = LegendLocation.Left; Pe3do1.PeLegend.ContourStyle = true; Pe3do1.PeLegend.ContourLegendPrecision = ContourLegendPrecision.ZeroDecimals; // THEME & RENDERING: Pe3do1.PeConfigure.RenderEngine = RenderEngine.Direct3D; // NOTE: Direct3D not Direct2D Pe3do1.PeColor.BitmapGradientMode = true; Pe3do1.PeColor.QuickStyle = QuickStyle.DarkNoBorder; // set AFTER RenderEngine for 3DX Pe3do1.PeData.ComputeShader = true; Pe3do1.PeFont.Fixed = true; Pe3do1.PeFont.FontSize = FontSize.Medium; Pe3do1.PeFont.Label.Bold = true; Pe3do1.PeConfigure.TextShadows = TextShadows.BoldText; Pe3do1.PeConfigure.PrepareImages = true; Pe3do1.PeConfigure.CacheBmp = true; Pe3do1.PeConfigure.AntiAliasGraphics = true; Pe3do1.PeConfigure.AntiAliasText = true; Pe3do1.PeUserInterface.Allow.FocalRect = false; Pe3do1.PeData.Precision = DataPrecision.TwoDecimals; Pe3do1.PeConfigure.ImageAdjustLeft = 100; Pe3do1.PeConfigure.ImageAdjustRight = 100; Pe3do1.PeConfigure.ImageAdjustTop = 50; Pe3do1.PeConfigure.ImageAdjustBottom = 50; // Export defaults same as 000 but with Pe3do1. prefix. // FINALIZE: Pe3do1.PeFunction.Force3dxVerticeRebuild = true; Pe3do1.PeFunction.Force3dxAnnotVerticeRebuild = true; Pe3do1.PeFunction.ReinitializeResetImage(); Pe3do1.Invalidate(); Pe3do1.Refresh(); // // QUICK REFERENCE: Which base does each test range use? // // Examples 000-099 --> Example 000 base (Pego) via CreateSimpleGraph() // Examples 100-199 --> Example 100 base (Pesgo) via CreateSimpleSGraph() // Examples 200-299 --> Example 200 base (Pepso) via CreateSimplePolar() // Examples 300-399 --> Example 300 base (Pepco) via CreateSimplePie() // Examples 400-499 --> Example 400 base (Pe3do) via CreateSimple3D() ------------------------------------------------------------------------------ ### FILE: pe-cpp-api-reference.txt === ProEssentials C++ DLL API Reference (knowledge rev 2) === Complete C++ constants, functions, and structures from Pegrpapi.h. Use this file when generating MFC/Win32/DLL C++ code for ProEssentials. Only add this file to a conversation when writing pure DLL-level C++ code. CROSS-REFERENCES: pe-core-knowledge -- architecture, chart objects, .NET property hierarchy pe-graph-annotations -- annotation rectangle patterns (TopLeft/BottomRight/RectFill) pe-base-examples -- working code in both C# and C++ unified-docs JSON -- full property descriptions, examples, event docs HELP FILE CONVENTION: HTM help files are named by the C++ property constant with .htm extension. Example: PEP_nSUBSETS -> PEP_nSUBSETS.htm NAMING CONVENTION -- .NET TO C++: .NET enum values map to C++ constants with a prefix from the enum name. Example: GraphAnnotationType.TopLeft -> PEGAT_TOPLEFT (value 46) Example: ManualScaleControl.MinMax -> PEMSC_MINMAX (value 3) Example: RenderEngine.Direct2D -> PERE_DIRECT2D (value 4) Example: QuickStyle.LightNoBorder -> PEQS_LIGHT_NO_BORDER (value 4) ALWAYS look up the exact constant in this file. Do NOT guess prefixes. CHART OBJECT TYPES (PEcreate nObjectType): PECONTROL_GRAPH=300 (Pego), PECONTROL_PIE=302 (Pepco), PECONTROL_SGRAPH=304 (Pesgo), PECONTROL_PGRAPH=308 (Pepso), PECONTROL_3D=312 (Pe3do) PROPERTY CONSTANT TYPE PREFIXES (PEP_): SCALAR (no 'a') -- use PEnset/PEnget or PEvset/PEvget: PEP_n int PEnset(hPE, PEP_nXXX, value) PEP_b BOOL(int) PEnset(hPE, PEP_bXXX, TRUE|FALSE) PEP_f double PEvset(hPE, PEP_fXXX, &dVal, 1) PEP_dw DWORD PEnset(hPE, PEP_dwXXX, dwValue) PEP_sz string PEszset(hPE, PEP_szXXX, TEXT("str")) PEP_h HANDLE PEnset/PEnget PEP_struct PEvset(hPE, PEP_structXXX, &data, 1) ARRAY ('a' suffix) -- use PEvsetcell/PEvgetcell or PEvsetcellEx: PEP_na int[] PEvsetcell(hPE, PEP_naXXX, index, &nVal) PEP_fa float[] PEvsetcell(hPE, PEP_faXXX, index, &fVal) PEP_fa 2D float[] PEvsetcellEx(hPE, PEP_faXXX, subset, point, &fVal) PEP_dwa DWORD[] PEvsetcell(hPE, PEP_dwaXXX, index, &dwColor) PEP_sza string[] PEvsetcell(hPE, PEP_szaXXX, index, TEXT("str")) KEY RULE: 'a' in prefix = array = PEvsetcell. No 'a' = scalar = PEnset. COLOR MACRO: DWORD color = PERGB(alpha, red, green, blue); Each component 0-255. Alpha: 0=transparent, 255=opaque. CORE DLL FUNCTIONS: HWND PEcreate(UINT nObjectType, DWORD dwStyle, RECT* lpRect, HWND hParent, UINT nID) BOOL PEdestroy(HWND hObject) BOOL PEnset(HWND hObject, UINT nProperty, int nData) int PEnget(HWND hObject, UINT nProperty) BOOL PEvset(HWND hObject, UINT nProperty, void* lpvData, int nElements) int PEvget(HWND hObject, UINT nProperty, void* lpvDest) BOOL PEvsetcell(HWND hObject, UINT nProperty, int nCell, void* lpvData) BOOL PEvgetcell(HWND hObject, UINT nProperty, int nCell, void* lpvDest) BOOL PEvsetcellEx(HWND hObject, UINT nProperty, int nSubset, int nPoint, void* lpvData) BOOL PEvgetcellEx(HWND hObject, UINT nProperty, int nSubset, int nPoint, void* lpvDest) BOOL PEszset(HWND hObject, UINT nProperty, LPTSTR szData) BOOL PEszget(HWND hObject, UINT nProperty, LPTSTR szData) BOOL PEreinitialize(HWND hObject) BOOL PEresetimage(HWND hObject, UINT nLength=0, UINT nHeight=0) BOOL PEpartialresetimage(HWND hObject, int nStartPoint, int nPointsToAdd) BOOL PEgethotspot(HWND hObject, int nX, int nY) BOOL PEconvpixeltograph(HWND hObject, int* pnAxis, int* pnX, int* pnY, double* pfX, double* pfY, BOOL bRightAxis, BOOL bTopAxis, BOOL bViceVersa) BOOL PEprintgraph(HWND hObject, int nWidth, int nHeight, int nOrient) BOOL PEprintgraphEx(HWND hObject, int hDC, int nWidth, int nHeight, int nOriginX, int nOriginY) BOOL PElaunchexport(HWND hObject) BOOL PElaunchcustomize(HWND hObject) int PElaunchcustomizeEx(HWND hObject, UINT nPageID) BOOL PElaunchmaximize(HWND hObject) BOOL PElaunchprintdialog(HWND hObject, BOOL bFullPage, POINT* pSize) int PElaunchcolordialog(HWND hObject) int PElaunchfontdialog(HWND hObject) BOOL PElaunchpopupmenu(HWND hObject, POINT* pLocation) BOOL PEcopybitmaptofile(HWND hObject, POINT* lpPoint, LPTSTR lpszFilename) BOOL PEcopybitmaptoclipboard(HWND hObject, POINT* lpPoint) BOOL PEcopypngtofile(HWND hObject, POINT* lpPoint, LPTSTR lpszFilename) BOOL PEcopypngtoclipboard(HWND hObject, POINT* lpPoint) DWORD PEcopypngtohglobal(HWND hObject, POINT* lpPoint, HGLOBAL* pHG, HDC hTargetDC) BOOL PEcopyjpegtofile(HWND hObject, POINT* lpPoint, LPTSTR lpszFilename) DWORD PEcopyjpegtohglobal(HWND hObject, POINT* lpPoint, HGLOBAL* pHG) BOOL PEcopyemftofile(HWND hObject, POINT* size, LPTSTR lpszFilename, int nEmfType, int nEmfDC, BOOL bEmfBitmapGradients, int hRefDC) BOOL PEcopyemftoclipboard(HWND hObject, POINT* size, int nEmfType, int nEmfDC, BOOL bEmfBitmapGradients, int hRefDC) HENHMETAFILE PEgetenhancedmeta(HWND hObject, POINT* size, int nEmfType, int nEmfDC, BOOL bEmfBitmapGradients, int hRefDC) BOOL PEcopysvgtofile(HWND hObject, POINT* size, LPTSTR lpszFilename, BOOL bCompress) DWORD PEcopysvgtohglobal(HWND hObject, POINT* size, HGLOBAL* pHG, BOOL bCompress) BOOL PEcopymetatofile(HWND hObject, POINT* lpPoint, LPTSTR lpszFilename) BOOL PEcopymetatoclipboard(HWND hObject, POINT* lpPoint) HMETAFILE PEgetmeta(HWND hObject) BOOL PEcopyoletoclipboard(HWND hObject, POINT* lpPoint) void PEcreateserialdate(double* pfSerial, TM* dt, int nType) void PEdecipherserialdate(double* pfSerial, TM* dt, int nType) BOOL PEsavetofile(HWND hObject, LPTSTR lpFileName) BOOL PEloadfromfile(HWND hObject, LPTSTR lpFileName) HWND PEcreatefromfile(LPTSTR lpFileName, HWND hParent, RECT* lpRect, UINT nID) BOOL PEload(HWND hObject, HGLOBAL* lphGlbl) BOOL PEstore(HWND hObject, HGLOBAL* lphGlbl, DWORD* lpdwSize) BOOL PEloadpartial(HWND hObject, HGLOBAL* lphGlbl) BOOL PEstorepartial(HWND hObject, HGLOBAL* lphGlbl, DWORD* lpdwSize) BOOL PEserializetofile(HWND hObject, LPTSTR lpszFilename) DWORD PEserializetohglobal(HWND hObject, HGLOBAL* pHG) BOOL PEloadfromURL(HWND hObject, LPTSTR lpURL, DWORD dwFlags) BOOL PEappendfromURL(HWND hObject, LPTSTR lpURL, DWORD dwFlags) BOOL PEvsetEx(HWND hObject, UINT property, int nStartCell, int nCellCount, void* lpData, void* lpMemSetValue) BOOL PEvgetEx(HWND hObject, UINT property, int nStartCell, int nCellCount, void* lpData) int PEsearchpointindex(HWND hObject, double dX, int nSubset, int nLocation) int PEsearchsubsetpointindex(HWND hObject, int nX, int nY) BOOL PEexporttext(HWND hObject, int nPrecision, int nTableorList, int nExportWhat, int nExportStyle, LPTSTR lpszFilename) BOOL PElaunchtextexport(HWND hObject, BOOL bToFile, LPTSTR lpszFilename) BOOL PEbitmapandgradients(HWND hObject, HDC hTargetDC, LPRECT pr, VOID* pGraphics) BOOL PEallocateindmemory(HWND hObject) DWORD PEgethotspotdata(HWND hObject, int nHotSpotArray, int nArrayIndex, void* pData) BOOL PEdrawcursor(HWND hObject, HDC hdc, UINT nAction) BOOL PEdrawtable(HWND hObject, UINT nTAIndex, HDC hdc) BOOL PEfilterdllmsg(LPMSG lpMsg) void PEprocessdllidle() void PEDebugOutput(UINT nId) BOOL PEValidateProperty(UINT nCntlType, UINT nProperty) BOOL PEgettextmetrics(HWND hObject, int nChartWidth, int nChartHeight, int nTarget, BOOL bFixedFont, LPTSTR szText, LPTSTR szFont, BOOL bBold, BOOL bItalic, BOOL bUnderline, int nFontSize, float fFontSize, BOOL bVertical, int* pnWidth, int* pnHeight) BOOL PEreconstruct3dpolygons(HWND hObject) BOOL PEreinitializecustoms(HWND hObject) BOOL PEreset(HWND hObject) DWORD PEgethelpcontext(HWND hWnd) BOOL PEchangeresources(LPTSTR lpszFilename, int nCharSet, int bUpdateCharSet, int bUpdateAllControls) KEY STRUCTURES: CUSTOMGRIDNUMBERS { int nAxisType; int nAxisIndex; double dNumber; TCHAR szData[98]; } nAxisType: 0=Y, 1=RightY, 2=X, 3=TopX, 4=ZoomXBottom, 5=SpecialTopDate Used with PEWN_CUSTOMGRIDNUMBERS notification and PEP_bCUSTOMGRIDNUMBERSY/X EXTRAAXIS { int nSize; float fMin,fMax; TCHAR szLabel[130]; float fManualLine,fManualTick; TCHAR szFormat[34]; int nShowAxis,nShowTickMark,bInvertedAxis,bLogScale; DWORD dwColor; } PEFILEHDR { WORD nMajVersion,nMinVersion; DWORD nObjectType,dwSize; DWORD extra[8]; } PolygonData { double x,y,z; DWORD dwColor; float nx,ny,nz; DWORD dwFlags; float tu,tv; DWORD dwFlagsEx; float fReserved; } // 64 byte structure ====================================================================== PEP_ PROPERTY CONSTANTS (grouped by type, sorted by value) ====================================================================== --- PEP_n (int scalars -- PEnset/PEnget) --- PEP_bALLOWRECTHEATMAP 1611 PEP_nCHARTBORDERWIDTH 1601 PEP_nHIGHLIGHTSUBSET 1701 PEP_nHIGHLIGHTPOINT 1702 PEP_nGRAPHBMPOPACITY 1706 PEP_nDESKBMPOPACITY 1707 PEP_nTABLEBMPOPACITY 1708 PEP_nZOOMWINDOWBMPOPACITY 1709 PEP_nRESOURCEBMPSTYLE 1712 PEP_nRESOURCEBMPOPACITY 1713 PEP_nRESOURCEBMPIGNOREALPHA 1719 PEP_nWORKINGRESOURCEBITMAP 1721 PEP_nGRAPHBMPIGNOREALPHA 1722 PEP_nSHOWCONTOURLEGENDII 1729 PEP_nMANUALCONTOURSCALECONTROLII 1737 PEP_nCONTOURCOLORSETII 1739 PEP_nCONTOURCOLORBLENDSII 1742 PEP_nCONTOURLEGENDPRECISIONII 1743 PEP_nFILTER2D3D 1753 PEP_nCURSORVLINETYPE 1767 PEP_nCURSORHLINETYPE 1768 PEP_nZAXISSCALECONTROL 1769 PEP_nGRIDBANDSPATCHING 1770 PEP_nPOINTCOLORPOINTS 1773 PEP_nIGNOREDRIVERCHECK 1781 PEP_nALLOWLARGERLEGENDWIDTH 1782 PEP_nCLOSESTAXISINDEX 1783 PEP_nCLOSESTAXISINDEXVISIBLE 1784 PEP_nZOOMTHRESHOLD 1787 PEP_nKEYS 1798 PEP_n3DXFOV 1801 PEP_nDXGAMMA 1813 PEP_nCLOSESTSUBSETINDEX 1825 PEP_nCLOSESTPOINTINDEX 1826 PEP_nCONTOURCOLORSET 1835 PEP_nCONTOURCOLORSETSIZE 1836 PEP_nCONTOURCOLORBLENDS 1841 PEP_nCONTOURCOLORALPHA 1843 PEP_nSHOWWIREFRAMEMENU 1850 PEP_nCURSORPROMPTLOCATION 1851 PEP_nTRACKINGTOOLTIPMAXWIDTH 1853 PEP_nTRACKINGPROMPTTRIGGER 1863 PEP_nSHADINGSTYLEMENU 1866 PEP_nSHOWANNOTATIONTEXTMENU 1870 PEP_nDXLINESORTUBES 1871 PEP_nVIEWINGMODE 1875 PEP_nVIEWINGSUBSET 1876 PEP_nVIEWINGPOINT 1877 PEP_nDUPLICATEXDATA 1881 PEP_nDUPLICATEYDATA 1882 PEP_nDUPLICATEZDATA 1883 PEP_nGRAPHANNOTATIONALLDODGINGOFFSET 1890 PEP_nGRAPHANNOTATIONPOINTEROFFSET 1891 PEP_nANNOTATIONTEXTFIXEDSIZEMENU 1893 PEP_nHIGHLIGHTGRAPHANNOTATIONINDEX 1899 PEP_nMAXIMUMPOINTSIZE 1901 PEP_nMAXIMUMSYMBOLSIZE 1902 PEP_nMAXIMUMMARKERSIZE 1903 PEP_nGRIDLINEALPHA 1904 PEP_nPIEGRADIENTSTYLE 1906 PEP_nPIEGRADIENTSTYLEMENU 1907 PEP_nGRIDBOLDMENU 1908 PEP_nGRIDBANDSMENU 1909 PEP_nTAGRADIENTSTYLE 1919 PEP_nTABEVELSTYLE 1920 PEP_nTAGRADIENTBOUNDARY 1921 PEP_nTABEVELLIGHTING 1922 PEP_n3DXZOOMMODE 1927 PEP_n3DXFITCONTROLSHAPE 1928 PEP_nEXPORTSHAPELIMIT 1931 PEP_nPOINTGRADIENTSTYLE 1938 PEP_nLINESYMBOLTHICKNESS 1940 PEP_nMAXPRINTDIMENSION3DX 1949 PEP_nMAXPRINTDIMENSION 1950 PEP_nDECIMAL 1961 PEP_nTHOUSANDS 1962 PEP_nMOUSEWHEELZOOMSMOOTHNESS 1963 PEP_nPINCHZOOMSMOOTHNESS 1964 PEP_nSCROLLSMOOTHNESS 1965 PEP_nCOMPOSITE2D3D 1967 PEP_nREALTIMESTARTINGINDEX 1968 PEP_nREALTIMEQUANTITY 1969 PEP_nMINIMUMSIZE 1977 PEP_nDXSPHERECOMPLEXITY 1978 PEP_nDXSCATTEROCTREESIZE 1979 PEP_nDXSCATTEROCTREEGROWBY 1980 PEP_nDXTRANSPARENCYMODE 1988 PEP_nDXMSAA 1989 PEP_nDXOITDEPTH 1990 PEP_nCODEPAGE 2018 PEP_nPRINTDPI 2019 PEP_nPRINTTECHNOLOGY 2021 PEP_nEXPORTIMAGEDPI 2022 PEP_nGRAPHANNOTMINSYMBOLSIZE 2028 PEP_nEMFTYPE 2029 PEP_nEMFDC 2030 PEP_nTEXTRENDERINGHINT 2033 PEP_nSEQUENTIALDATAX 2039 PEP_nSEQUENTIALDATAY 2041 PEP_nFILTER2D 2042 PEP_nFILTER3D 2054 PEP_nPIXELSIZINGTHRESHOLD 2056 PEP_nOBJECTTYPE 2100 PEP_nSBCODE 2106 PEP_nSBPOS 2107 PEP_nEXPORTTYPEDEF 2108 PEP_nEXPORTDESTDEF 2109 PEP_nEXPORTSIZEDEF 2112 PEP_nSUBSETS 2115 PEP_nMINTABLEFONTSIZE 2116 PEP_nPOINTS 2120 PEP_nTEXTSHADOWS 2122 PEP_nMOUSEWHEELFUNCTION 2127 PEP_nMOUSEKEYINDICATOR 2128 PEP_nTAX 2134 PEP_nTAY 2136 PEP_nTAWIDTH 2137 PEP_nTAMOVEABLE 2139 PEP_nMOVINGTABLEANNOTATION 2141 PEP_nSIZINGTABLEANNOTATIONL 2142 PEP_nSIZINGTABLEANNOTATIONR 2143 PEP_nDPIX 2148 PEP_nDPIY 2149 PEP_nDEFORIENTATION 2150 PEP_nGRADIENTBARSHIRES 2151 PEP_nPOINTCOLORLINEADJ 2152 PEP_nRENDERENGINE 2153 PEP_nDATASHADOWSTRANSLUCENT 2157 PEP_nSHOWAXISANNOTATIONS 2164 PEP_nAXISBORDERTYPE 2166 PEP_nGRAPHANNOTATIONMOVED 2182 PEP_nALLOWUSERINTERFACE 2185 PEP_nPAGEWIDTH 2200 PEP_nPAGEHEIGHT 2205 PEP_nVIEWINGSTYLE 2230 PEP_nCVIEWINGSTYLE 2235 PEP_nDATASHADOWS 2240 PEP_nCDATASHADOWS 2245 PEP_nGRAPHANNOTTEXTDODGE 2322 PEP_nGRAPHANNOTMOVEABLE 2324 PEP_nDATAPRECISION 2425 PEP_nCDATAPRECISION 2430 PEP_nMAXDATAPRECISION 2431 PEP_nFONTSIZE 2435 PEP_nCFONTSIZE 2440 PEP_nCURSORMODE 2617 PEP_nCURSORSUBSET 2618 PEP_nCURSORPOINT 2619 PEP_nCURSORPROMPTSTYLE 2620 PEP_nVERTSCROLLPOS 2628 PEP_nVIEWINGSTYLEMENU 2640 PEP_nFONTSIZEMENU 2641 PEP_nDATAPRECISIONMENU 2642 PEP_nDATASHADOWMENU 2643 PEP_nMAXIMIZEMENU 2655 PEP_nCUSTOMIZEDIALOGMENU 2656 PEP_nEXPORTDIALOGMENU 2657 PEP_nHELPMENU 2658 PEP_nBORDERTYPEMENU 2659 PEP_nSHOWLEGENDMENU 2660 PEP_nLEGENDLOCATIONMENU 2661 PEP_nSHOWTABLEANNOTATIONSMENU 2662 PEP_nMULTIAXISSTYLEMENU 2663 PEP_nFIXEDFONTMENU 2664 PEP_nQUICKSTYLEMENU 2671 PEP_nQUICKSTYLE 2672 PEP_nLONGYAXISTICKMENU 2673 PEP_nLONGXAXISTICKMENU 2674 PEP_nLASTMENUINDEX 2675 PEP_nLASTSUBMENUINDEX 2676 PEP_nHIDEINTERSECTINGTEXT 2678 PEP_nDROPSHADOWOFFSETX 2679 PEP_nDROPSHADOWOFFSETY 2680 PEP_nDROPSHADOWSTEPS 2681 PEP_nDROPSHADOWWIDTH 2682 PEP_nJPGQUALITY 2686 PEP_nDESKGRADIENTSTYLE 2689 PEP_nDESKBMPSTYLE 2691 PEP_nGRAPHGRADIENTSTYLE 2694 PEP_nGRAPHBMPSTYLE 2696 PEP_nTABLEGRADIENTSTYLE 2699 PEP_nTABLEBMPSTYLE 2701 PEP_nBITMAPGRADIENTMENU 2702 PEP_nPRINTSTYLECONTROL 2705 PEP_nCHARSET 2927 PEP_nBORDERTYPES 2943 PEP_nDELIMITER 2950 PEP_nTAROWS 2951 PEP_nTACOLUMNS 2952 PEP_nTAHEADERROWS 2957 PEP_nTAHEADERORIENTATION 2960 PEP_nTALOCATION 2961 PEP_nTABORDER 2962 PEP_nTATEXTSIZE 2965 PEP_nTAAXISLOCATION 2966 PEP_nTAGRIDLINECONTROL 2967 PEP_nLEGENDSTYLE 2975 PEP_nWORKINGTABLE 2977 PEP_nDIALOGRESULT 2981 PEP_nIMAGEADJUSTLEFT 2982 PEP_nIMAGEADJUSTRIGHT 2983 PEP_nIMAGEADJUSTTOP 2984 PEP_nIMAGEADJUSTBOTTOM 2985 PEP_nWORKINGAXIS 3006 PEP_nVBOUNDARYTYPES 3010 PEP_nPLOTTINGMETHODII 3011 PEP_nCPLOTTINGMETHODII 3012 PEP_nDATETIMEMODE 3018 PEP_nSPECIFICPLOTMODE 3021 PEP_nSHOWYAXIS 3027 PEP_nSHOWRYAXIS 3028 PEP_nSHOWXAXIS 3029 PEP_nGRIDSTYLE 3032 PEP_nINITIALSCALEFORYDATA 3035 PEP_nSCALEFORYDATA 3040 PEP_nYAXISSCALECONTROL 3045 PEP_nMULTIAXESSEPARATORS 3046 PEP_nZOOMMINAXIS 3047 PEP_nZOOMMAXAXIS 3048 PEP_nMANUALSCALECONTROLY 3050 PEP_nAUTOMINMAXPADDING 3063 PEP_nLOGICALLIMIT 3064 PEP_nSCROLLINGSUBSETS 3070 PEP_nCSCROLLINGSUBSETS 3075 PEP_n3DTHRESHOLD 3076 PEP_nHOTSPOTSIZE 3081 PEP_nLEGENDLOCATION 3082 PEP_nPLOTTINGMETHOD 3090 PEP_nSPECIALSCALINGY 3093 PEP_nSPECIALSCALINGRY 3094 PEP_nCPLOTTINGMETHOD 3095 PEP_nDELTAX 3096 PEP_nDELTASPERDAY 3097 PEP_nGRIDLINECONTROL 3100 PEP_nLOGTICKTHRESHOLD 3101 PEP_nMINIMUMPOINTSIZE 3102 PEP_nSPEEDBOOST 3104 PEP_nCGRIDLINECONTROL 3105 PEP_nSHOWTICKMARKY 3106 PEP_nSHOWTICKMARKRY 3107 PEP_nSHOWTICKMARKX 3108 PEP_nOHLCMINWIDTH 3109 PEP_nMULTIAXESSIZING 3111 PEP_nCOMPARISONSUBSETS 3130 PEP_nYEARMONTHDAYPROMPT 3133 PEP_nTIMELABELTYPE 3134 PEP_nDAYLABELTYPE 3135 PEP_nMONTHLABELTYPE 3136 PEP_nYEARLABELTYPE 3137 PEP_nAXISSIZEY 3143 PEP_nAXISLOCATIONY 3144 PEP_nAXISSIZERY 3145 PEP_nAXISLOCATIONRY 3146 PEP_nSMARTLEGENDTHRESHOLD 3148 PEP_nMULTIAXISSTYLE 3149 PEP_nCURSORPROMPTLOCATION2 3152 PEP_nMULTIAXISSEPARATORSIZE 3153 PEP_nZOOMSTYLE 3154 PEP_nTICKSTYLE 3158 PEP_nGRIDLINEMENU 3164 PEP_nPLOTMETHODMENU 3165 PEP_nGRIDINFRONTMENU 3166 PEP_nTREATCOMPARISONSMENU 3167 PEP_nMARKDATAPOINTSMENU 3168 PEP_nSHOWANNOTATIONSMENU 3169 PEP_nUNDOZOOMMENU 3170 PEP_nGRADIENTBARS 3178 PEP_nYAXISLINELIMIT 3183 PEP_nRYAXISLINELIMIT 3184 PEP_nXAXISLINELIMIT 3185 PEP_nTXAXISLINELIMIT 3186 PEP_nYEARMONTHDAYSTYLE 3197 PEP_nCURSORPAGEAMOUNT 3211 PEP_nRYAXISCOMPARISONSUBSETS 3225 PEP_nALLOWGRAPHANNOTHOTSPOTS 3229 PEP_nRYAXISSCALECONTROL 3230 PEP_nALLOWXAXISANNOTHOTSPOTS 3231 PEP_nALLOWHORZLINEANNOTHOTSPOTS 3233 PEP_nALLOWVERTLINEANNOTHOTSPOTS 3234 PEP_nINITIALSCALEFORRYDATA 3235 PEP_nMANUALSCALECONTROLRY 3240 PEP_nGRAPHANNOTATIONTEXTSIZE 3242 PEP_nAXESANNOTATIONTEXTSIZE 3243 PEP_nLINEANNOTATIONTEXTSIZE 3244 PEP_nZOOMINTERFACEONLY 3247 PEP_nDATAHOTSPOTLIMIT 3251 PEP_nHOURGLASSTHRESHOLD 3252 PEP_nHORZSCROLLPOS 3253 PEP_nSCALEFORRYDATA 3256 PEP_nPOINTSIZE 3269 PEP_nBESTFITDEGREE 3273 PEP_nCURVEGRANULARITY 3275 PEP_nALLOWZOOMING 3282 PEP_nSYMBOLFREQUENCY 3289 PEP_nMAXAXISANNOTATIONCLUSTER 3296 PEP_nAXISNUMERICFORMATY 3301 PEP_nAXISNUMERICFORMATRY 3302 PEP_nAXISNUMERICFORMATX 3303 PEP_nAXISNUMERICFORMATTX 3304 PEP_nAUTOMINMAXPADDINGY 3306 PEP_nAUTOMINMAXPADDINGRY 3307 PEP_nAUTOMINMAXPADDINGX 3308 PEP_nAUTOMINMAXPADDINGTX 3309 PEP_nPOINTSTOGRAPHINIT 3310 PEP_nPOINTSTOGRAPHVERSION 3315 PEP_nSHOWMARGINS 3316 PEP_nCONTOURLEGENDPRECISION 3318 PEP_nZOOMLIMITS 3319 PEP_nCPOINTSTOGRAPHVERSION 3320 PEP_nSTACKEDMULTIAXIS 3323 PEP_nPOINTSTOGRAPH 3325 PEP_nOLDCURRHORZPOS 3326 PEP_nOLDPOINTSTOGRAPH 3327 PEP_nOLDLEGENDSTYLE 3328 PEP_nOLDLEGENDSTYLE4 3329 PEP_nCPOINTSTOGRAPH 3330 PEP_nHSCROLLSTYLE 3331 PEP_nFORCEGRIDLINESY 3333 PEP_nFORCEGRIDLINESRY 3334 PEP_nGRIDBANDALPHA 3342 PEP_nFORCEVERTICALPOINTS 3345 PEP_nCFORCEVERTICALPOINTS 3350 PEP_nFORCEGRIDLINESX 3352 PEP_nFORCEGRIDLINESTX 3353 PEP_nGRAPHPLUSTABLE 3355 PEP_nCGRAPHPLUSTABLE 3360 PEP_nTABLEWHAT 3365 PEP_nCTABLEWHAT 3370 PEP_nZOOMWINDOWGRADIENTSTYLE 3371 PEP_nZOOMWINDOWBMPSTYLE 3372 PEP_nZOOMWINDOWBORDER 3382 PEP_nZOOMWINDOWSHADOWLEVEL 3383 PEP_nXAXISANNOTATIONZOOM 3391 PEP_nTARGETPOINTSTOTABLE 3404 PEP_nALTFREQTHRESHOLD 3405 PEP_nMAXPOINTSTOGRAPH 3407 PEP_nFIRSTPTLABELOFFSET 3417 PEP_nAUTOXDATA 3423 PEP_nSCROLLINGRANGE 3425 PEP_nSCROLLINGFACTOR 3426 PEP_nGRAPHPLUSTABLEMENU 3430 PEP_nFORCEVERTPOINTSMENU 3431 PEP_nTABLEWHATMENU 3432 PEP_nPOINTLABELROWS 3433 PEP_nTABLEGRIDLINES 3434 PEP_nBUBBLEGRADIENTSTYLE 3439 PEP_nSPLINEGRADIENTSTYLE 3440 PEP_nSPLINEBEVELSTYLE 3441 PEP_nAREABEVELSTYLE 3442 PEP_nAREAGRADIENTSTYLE 3443 PEP_nAREASTACKEDGRADIENTSTYLE 3444 PEP_nAREASTACKEDBEVELSTYLE 3445 PEP_nAREAGRADIENTBOUNDARY 3446 PEP_nSPLINEGRADIENTBOUNDARY 3447 PEP_nAREASTACKEDGRADIENTBOUNDARY 3448 PEP_nBARGRADIENTSTYLE 3449 PEP_nBARBEVELSTYLE 3450 PEP_nBARGRADIENTBOUNDARY 3451 PEP_nAREABEVELLIGHTING 3453 PEP_nSPLINEBEVELLIGHTING 3454 PEP_nAREASTACKEDBEVELLIGHTING 3455 PEP_nBARBEVELLIGHTING 3456 PEP_nBEVELLIMIT 3457 PEP_nSPECIFICPLOTMODEGRADIENT 3458 PEP_nSPECIFICPLOTMODEBORDER 3459 PEP_nAREABORDER 3464 PEP_nSOLIDLINEOVERAREA 3465 PEP_nSPLINETYPE 3467 PEP_nINITIALSCALEFORXDATA 3600 PEP_nSCALEFORXDATA 3605 PEP_nXAXISSCALECONTROL 3610 PEP_nMANUALSCALECONTROLX 3615 PEP_nBUBBLESIZE 3641 PEP_nALLOWDATALABELS 3642 PEP_nTXAXISCOMPARISONSUBSETS 3661 PEP_nTXAXISSCALECONTROL 3662 PEP_nINITIALSCALEFORTXDATA 3663 PEP_nMANUALSCALECONTROLTX 3664 PEP_nSCALEFORTXDATA 3668 PEP_nSHOWTXAXIS 3676 PEP_nMANUALSCALECONTROLZ 3684 PEP_nCONTOURLINELABELDENSITY 3686 PEP_nSHOWTICKMARKTX 3689 PEP_nINCLUDEDATALABELSMENU 3696 PEP_nSMITHCHART 3800 PEP_nSHOWPOLARGRID 3802 PEP_nZERODEGREEOFFSET 3803 PEP_nPOLARSCALEALTERNATIVE 3807 PEP_nZOOMOFFSETPIXELX 3811 PEP_nZOOMOFFSETPIXELY 3812 PEP_nGROUPINGPERCENT 3900 PEP_nCGROUPINGPERCENT 3905 PEP_nDATALABELTYPE 3910 PEP_nCDATALABELTYPE 3915 PEP_nAUTOEXPLODE 3920 PEP_nSHOWPIELABELS 3921 PEP_nSLICEHATCHING 3923 PEP_nSLICESTARTLOCATION 3924 PEP_nPERCENTORVALUEMENU 3925 PEP_nGROUPPERCENTMENU 3926 PEP_nMANUALSLICELABELLENGTH 3928 PEP_nMANUALRADIUS 3929 PEP_nDEGREEOFROTATION 4001 PEP_nROTATIONINCREMENT 4004 PEP_nROTATIONDETAIL 4005 PEP_nVIEWINGHEIGHT 4008 PEP_nSHOWBOUNDINGBOX 4010 PEP_nROTATIONSPEED 4011 PEP_nPOLYMODE 4013 PEP_nSHOWZAXIS 4018 PEP_nSHOWCONTOUR 4024 PEP_nMANUALCONTOURSCALECONTROL 4030 PEP_nSHADINGSTYLE 4031 PEP_nINITIALSCALEFORZDATA 4051 PEP_nSCALEFORZDATA 4052 PEP_nSHOWBOUNDINGBOXMENU 4058 PEP_nROTATIONMENU 4059 PEP_nCONTOURMENU 4060 PEP_nAXISNUMERICFORMATZ 4083 PEP_nAUTOMINMAXPADDINGZ 4084 PEP_nMANUALSCALECONTROLW 4089 --- PEP_b (BOOL scalars -- PEnset/PEnget) --- PEP_bFORCE3DXANNOTVERTICEREBUILD 1703 PEP_bFORCE3DXANNOTPOLYDATAVERTICEREBUILD 1704 PEP_bRESOURCEBMPCOLORIZE 1720 PEP_bCACHEBMP2 1723 PEP_bSHOWINGQUICKANNOTATIONS 1724 PEP_bHIDINGQUICKANNOTATIONS 1725 PEP_bNEEDTOINITIALIZE 1726 PEP_bUSINGWDATAII 1732 PEP_bJAGGEDDATA 1751 PEP_bCOMPUTESHADER 1752 PEP_bSTAGINGBUFFERX 1755 PEP_bSTAGINGBUFFERY 1756 PEP_bSTAGINGBUFFERZ 1757 PEP_bCIRCULARBUFFERS 1758 PEP_bDRAWCURSORTOCACHE 1764 PEP_bSHOWINGCURSOR 1765 PEP_bHIDINGCURSOR 1766 PEP_bGRIDBANDSPATCHING 1770 PEP_bDELAUNAY3D 1772 PEP_bREUSEDATAX 1774 PEP_bREUSEDATAY 1775 PEP_bREUSEDATAZ 1776 PEP_bREUSEDATAPOINTCOLOR 1779 PEP_bSTAGINGBUFFERPOINTCOLOR 1780 PEP_bOVERLAPBARS 1785 PEP_bSKIPRANGING 1789 PEP_bLEFTBUTTONPAN3D 1790 PEP_bEXPORTPNGASDIBTOCLIP 1804 PEP_bCUSTOMIZEDLGCANCELMSG 1805 PEP_bDXPIXELSHADER 1812 PEP_bDXPSISOYAXISLINES 1814 PEP_bDXPSISOXAXISLINES 1815 PEP_bDXPSISOZAXISLINES 1816 PEP_bDXPSISOZSUBSETLINES 1817 PEP_bDXPSISOXPOINTLINES 1818 PEP_bDXPSCULLY 1821 PEP_bDXPSCULLXZ 1823 PEP_bDXPSANTIALIASEDGES 1827 PEP_bDXGSCONTOURS 1828 PEP_bGRAPHBMPALWAYS 1833 PEP_bDESKBMPALWAYS 1834 PEP_bCONTOURCOLORREVERSE 1842 PEP_bCONTOURLOCATIONSQUANTIZED 1844 PEP_bCONTOURCULLMINPLANE 1846 PEP_bSURFACEPOLYGONBORDERS 1847 PEP_bWATERFALLBORDERS 1848 PEP_bSHOWWIREFRAME 1849 PEP_bTRACKINGCUSTOMDATATEXT 1854 PEP_bTRACKINGCUSTOMOTHERTEXT 1860 PEP_bMOUSECURSORCONTROLCLOSESTPOINT 1861 PEP_bWATERFALLCONTOURS 1864 PEP_bTRACKINGTTMOUSE 1868 PEP_bSHOWANNOTATIONTEXT 1869 PEP_bGRAPHANNOTATIONTEXTFIXEDSIZE3D 1872 PEP_bGRAPHANNOTATIONSYMBOLOBSTACLES 1888 PEP_bGRAPHANNOTATIONALLDODGING 1889 PEP_bDXGEOMETRYSHADER 1892 PEP_bSEARCHNONSEQUENTIALDATA 1894 PEP_bFREEZE 1895 PEP_bGRIDBOLD 1923 PEP_bPIXELOFFSETHALF 1937 PEP_bSMOOTH3DSURFACE 1955 PEP_bISDXAVAILABLE 1957 PEP_bACTIVELYSCROLLING 1958 PEP_bFORCE3DXNEWCOLORS 1959 PEP_bFORCE3DXVERTICEREBUILD 1960 PEP_bDYNAMICBUFFERS 1970 PEP_bDISABLE3DSHADOWS 1976 PEP_bAUTOSCALEHORZLINEANNOTATIONS 1991 PEP_bAUTOSCALEVERTLINEANNOTATIONS 1992 PEP_bAUTOSCALEGRAPHANNOTATIONS 1993 PEP_bIMPROVEDCURSOR 1996 PEP_bCURSORPROMPTSHORTEN 1999 PEP_bMOUSEWHEELZOOMEVENTS 2000 PEP_bANISOTROPICSUPPORT 2016 PEP_bWIDECHARTOMULTIBYTE 2017 PEP_bHIDEPRINTDPI 2020 PEP_bHIDEEXPORTIMAGEDPI 2023 PEP_bEXPORTIMAGELARGEFONT 2024 PEP_bALLOWSVGEXPORT 2025 PEP_bALLOWEMFEXPORT 2026 PEP_bALLOWWMFEXPORT 2027 PEP_bEMFBITMAPGRADIENTS 2031 PEP_bBUILDINGIMAGEFORPRINTER 2032 PEP_bFILTERON 2034 PEP_bNOPROPERTYCHECKS 2036 PEP_bUSINGUISOURCECODE 2037 PEP_bALLOWTEXTEXPORT 2038 PEP_bDISABLETHUMBTRACKING 2040 PEP_bMOUSEDRAGGINGX 2057 PEP_bMOUSEDRAGGINGY 2058 PEP_bDARKTEXTINSET 2123 PEP_bTATEXTMODE 2138 PEP_bTABLEFONTBOLD 2144 PEP_bMONOWITHSYMBOLS 2145 PEP_bTABLEFONTITALIC 2146 PEP_bTABLEFONTUNDERLINE 2147 PEP_bANTIALIASTEXT 2154 PEP_bPREPAREIMAGES 2155 PEP_bANTIALIASGRAPHICS 2156 PEP_b3DDIALOGS 2160 PEP_bENABLEVALIDATE 2161 PEP_bALLOWCUSTOMIZATION 2165 PEP_bONELEGENDPERLINE 2167 PEP_bPROCESSINGMOUSEMOVE 2168 PEP_bALLOWEXPORTING 2170 PEP_bTAFONTSIZEFIXED 2174 PEP_bALLOWMAXIMIZATION 2175 PEP_bALLOWPOPUP 2180 PEP_bHELPCONTEXTPOPUP 2181 PEP_bALLOWUSERINTERFACE 2185 PEP_bTRUNCATETITLES 2191 PEP_bDIRTY 2215 PEP_bDIALOGSHOWN 2220 PEP_bCUSTOM 2225 PEP_bDATASHADOWS 2240 PEP_bCDATASHADOWS 2245 PEP_bMAINTITLEBOLD 2450 PEP_bMAINTITLEITALIC 2455 PEP_bMAINTITLEUNDERLINE 2460 PEP_bCMAINTITLEBOLD 2470 PEP_bCMAINTITLEITALIC 2475 PEP_bCMAINTITLEUNDERLINE 2480 PEP_bSUBTITLEBOLD 2490 PEP_bSUBTITLEITALIC 2495 PEP_bSUBTITLEUNDERLINE 2500 PEP_bCSUBTITLEBOLD 2510 PEP_bCSUBTITLEITALIC 2515 PEP_bCSUBTITLEUNDERLINE 2520 PEP_bLABELBOLD 2530 PEP_bLABELITALIC 2535 PEP_bLABELUNDERLINE 2540 PEP_bCLABELBOLD 2550 PEP_bCLABELITALIC 2555 PEP_bCLABELUNDERLINE 2560 PEP_bCACHEBMP 2574 PEP_bALLOWSUBSETHOTSPOTS 2600 PEP_bALLOWPOINTHOTSPOTS 2605 PEP_bAUTOIMAGERESET 2615 PEP_bALLOWTITLESDIALOG 2616 PEP_bCURSORPROMPTTRACKING 2621 PEP_bMOUSECURSORCONTROL 2622 PEP_bALLOWANNOTATIONCONTROL 2623 PEP_bALLOWDEBUGOUTPUT 2629 PEP_bFOCALRECT 2632 PEP_bSUBSETBYPOINT 2636 PEP_bALLOWOLEEXPORT 2638 PEP_bSEPARATORMENU 2654 PEP_bSHOWALLTABLEANNOTATIONS 2665 PEP_bSHOWLEGEND 2666 PEP_bSTOP 2677 PEP_bPNGISTRANSPARENT 2683 PEP_bPNGISINTERLACED 2685 PEP_bBITMAPGRADIENTMODE 2703 PEP_bCONTROLBELONGSTOMAXDLG 2704 PEP_bINVALID 2905 PEP_bOBJECTINSERVER 2910 PEP_bPAINTING 2916 PEP_bNOCUSTOMPARMS 2921 PEP_bNOHELP 2922 PEP_bALLOWTITLEHOTSPOTS 2924 PEP_bALLOWSUBTITLEHOTSPOTS 2925 PEP_bALLOWBOTTOMTITLEHOTSPOTS 2926 PEP_bALLOWJPEGOUTPUT 2928 PEP_bALLOWPAGE1 2930 PEP_bALLOWPAGE2 2931 PEP_bALLOWSUBSETSPAGE 2932 PEP_bALLOWPOINTSPAGE 2933 PEP_bALLOWFONTPAGE 2934 PEP_bALLOWCOLORPAGE 2935 PEP_bALLOWSTYLEPAGE 2936 PEP_bALLOWAXISPAGE 2937 PEP_bFIXEDFONTS 2938 PEP_bOLDSCALINGLOGIC 2942 PEP_bDISABLECLIPPING 2944 PEP_bTAHEADERCOLUMN 2958 PEP_bSHOWTABLEANNOTATION 2968 PEP_bDISABLESYMBOLFIX 2972 PEP_bSIMPLELINELEGEND 2973 PEP_bSIMPLEPOINTLEGEND 2974 PEP_bNOSMARTTABLEPLACEMENT 2976 PEP_bMODALDIALOGS 2978 PEP_bMODELESSONTOP 2979 PEP_bMODELESSAUTOCLOSE 2980 PEP_bLOGSCALEEXPLABELS 3009 PEP_bUSINGXDATAII 3016 PEP_bUSINGYDATAII 3017 PEP_bALLOWBAR 3022 PEP_bYAXISONRIGHT 3026 PEP_bINVERTEDYAXIS 3033 PEP_bINVERTEDRYAXIS 3034 PEP_bYAXISLONGTICKS 3043 PEP_bRYAXISLONGTICKS 3044 PEP_bAUTOSCALEDATA 3057 PEP_bNOHIDDENLINESINAREA 3061 PEP_bSPECIFICPLOTMODECOLOR 3062 PEP_bNOSCROLLINGSUBSETCONTROL 3065 PEP_bNULLDATAGAPS 3066 PEP_bALLOWSTEP 3067 PEP_bSCROLLINGVERTZOOM 3069 PEP_bXAXISLONGTICKS 3078 PEP_bTXAXISLONGTICKS 3079 PEP_bALLOWAXISLABELHOTSPOTS 3083 PEP_bALLOWAXISHOTSPOTS 3084 PEP_bAPPENDWITHNOUPDATE 3086 PEP_bBESTFITFIX 3087 PEP_bALLOWRIBBON 3091 PEP_bNOGRIDLINEMULTIPLES 3092 PEP_bGRIDINFRONT 3110 PEP_bDAYLIGHTSAVINGS 3112 PEP_bYAXISVERTGRIDNUMBERS 3113 PEP_bCGRIDINFRONT 3115 PEP_bTREATCOMPSASNORMAL 3120 PEP_bVGNAXISLABELLOCATION 3121 PEP_bALLOWGRIDNUMBERHOTSPOTSY 3122 PEP_bCTREATCOMPSASNORMAL 3125 PEP_bTRIANGLEANNOTATIONADJ 3126 PEP_bDATETIMESHOWSECONDS 3129 PEP_bFIXEDLINETHICKNESS 3140 PEP_bFIXEDSPMWIDTH 3141 PEP_bDISABLESORTPLOTMETHODS 3147 PEP_bFLOATINGBARS 3151 PEP_bCUSTOMGRIDNUMBERSY 3160 PEP_bCUSTOMGRIDNUMBERSRY 3161 PEP_bCUSTOMGRIDNUMBERSX 3163 PEP_bSCROLLINGSCALECONTROL 3175 PEP_bLINESHADOWS 3177 PEP_bYAXISWHOLENUMBERS 3179 PEP_bRYAXISWHOLENUMBERS 3180 PEP_bXAXISWHOLENUMBERS 3181 PEP_bTXAXISWHOLENUMBERS 3182 PEP_bTRUNCATEYAXISLABELS 3194 PEP_bTRUNCATEXAXISLABELS 3195 PEP_bCLIPAXESINMETAFILES 3198 PEP_bALLOWCOORDPROMPTING 3200 PEP_bCSHOWANNOTATIONS 3202 PEP_bALLOWGRAPHHOTSPOTS 3205 PEP_bDATETIMEMILLISECONDS 3206 PEP_bANNOTATIONSINFRONT 3208 PEP_bALLOWDATAHOTSPOTS 3210 PEP_bMARKDATAPOINTS 3215 PEP_bCMARKDATAPOINTS 3220 PEP_bSHOWGRAPHANNOTATIONS 3223 PEP_bSHOWXAXISANNOTATIONS 3224 PEP_bSHOWYAXISANNOTATIONS 3226 PEP_bSHOWHORZLINEANNOTATIONS 3227 PEP_bSHOWVERTLINEANNOTATIONS 3228 PEP_bALLOWGRAPHANNOTHOTSPOTS 3229 PEP_bALLOWXAXISANNOTHOTSPOTS 3231 PEP_bALLOWYAXISANNOTHOTSPOTS 3232 PEP_bALLOWHORZLINEANNOTHOTSPOTS 3233 PEP_bALLOWVERTLINEANNOTHOTSPOTS 3234 PEP_bALLOWAREA 3254 PEP_bVERTORIENT90DEGREES 3257 PEP_bALLOWPLOTCUSTOMIZATION 3260 PEP_bNEGATIVEFROMXAXIS 3261 PEP_bMANUALYAXISTICKNLINE 3262 PEP_bMANUALRYAXISTICKNLINE 3265 PEP_bALLOWBESTFITCURVE 3272 PEP_bALLOWSPLINE 3274 PEP_bALLOWLINE 3279 PEP_bALLOWPOINT 3280 PEP_bALLOWBESTFITLINE 3281 PEP_bZOOMMODE 3283 PEP_bFORCERIGHTYAXIS 3286 PEP_bALLOWPOINTSPLUSLINE 3287 PEP_bALLOWPOINTSPLUSSPLINE 3288 PEP_bSHOWANNOTATIONS 3290 PEP_bNOSTACKEDDATA 3305 PEP_bAUTOPADBEYONDZEROY 3311 PEP_bAUTOPADBEYONDZERORY 3312 PEP_bAUTOPADBEYONDZEROX 3313 PEP_bAUTOPADBEYONDZEROTX 3314 PEP_bCONTOURLINESCOLORED 3317 PEP_bGRAPHANNOTATIONSHADOWS 3321 PEP_bNEGATIVESTACKEDDATA 3324 PEP_bDISABLEADJUSTINGSCALES 3332 PEP_bADJOINBARS 3341 PEP_bANNOTATIONSINFRONTOFGRID 3354 PEP_bZOOMWINDOW 3356 PEP_bZOOMWINDOWLABELHOTSPOTS 3359 PEP_bCUSTOMGRIDNUMBERSZOOMAXISX 3361 PEP_bZOOMWINDOWSHOWXAXIS 3362 PEP_bZOOMWINDOWINEXPORTS 3374 PEP_bZOOMWINDOWMARKDATAPOINTS 3375 PEP_bZOOMWINDOWCUSTOMCOLORS 3376 PEP_bZOOMWINDOWDATASHADOWS 3378 PEP_bZOOMWINDOWSHOWANNOTATIONS 3379 PEP_bZOOMWINDOWSHOWING 3385 PEP_bZOOMWINDOWDATAHOTSPOTS 3392 PEP_bALLOWTABLEHOTSPOTS 3400 PEP_bALLOWHISTOGRAM 3401 PEP_bNORANDOMPOINTSTOGRAPH 3408 PEP_bALLOWBESTFITLINEII 3413 PEP_bALLOWBESTFITCURVEII 3414 PEP_bAPPENDTOEND 3415 PEP_bALLOWHORIZONTALBAR 3416 PEP_bALLOWHORZBARSTACKED 3419 PEP_bTABLECOMPARISONSUBSETS 3420 PEP_bFORMATTABLE 3421 PEP_bALLOWTABLE 3422 PEP_bFLOATINGSTACKEDBARS 3424 PEP_bALLOWSPLINEAREA 3435 PEP_bGRIDBANDS 3436 PEP_bALLOWSPLINERIBBON 3437 PEP_bBUBBLESIZEFORMULAAREA 3438 PEP_bBARGLASSEFFECT 3452 PEP_bALLOWNEGATIVESMITHDATA 3460 PEP_bGRAPHANNOTRECTHOTSPOTS 3461 PEP_bAXISBORDERS 3462 PEP_bNOBORDERBUTAXES 3462 PEP_bDISABLESTACKEDPERCENTMENUS 3466 PEP_bZOOMBOXDRAGGING 3468 PEP_bUSINGZDATAII 3471 PEP_bFLOATINGSTICKS 3473 PEP_bALLOWCONTOURCOLORSSHADOWS 3474 PEP_bOVERLAPMULTIAXESOFFSETBARS 3475 PEP_bGRIDLINESEPARATORS 3477 PEP_bPOINTLABELSIISEPARATORS 3478 PEP_bPOINTLABELSIIBOXED 3479 PEP_bNULLDATAGAPSAREA 3504 PEP_bGRAPHDATALABELS 3630 PEP_bCGRAPHDATALABELS 3635 PEP_bALLOWBUBBLE 3640 PEP_bMANUALXAXISTICKNLINE 3644 PEP_bALLOWSTICK 3648 PEP_bSCROLLINGHORZZOOM 3652 PEP_bNORANDOMPOINTSTOEXPORT 3653 PEP_bXAXISVERTNUMBERING 3654 PEP_bENGSTATIONFORMAT 3655 PEP_bASSUMESEQDATA 3657 PEP_bMANUALTXAXISTICKNLINE 3669 PEP_bFORCETOPXAXIS 3672 PEP_bXAXISONTOP 3673 PEP_bINVERTEDXAXIS 3674 PEP_bINVERTEDTXAXIS 3675 PEP_bALLOWCONTOURLINES 3680 PEP_bALLOWCONTOURCOLORS 3681 PEP_bSPECIALDATETIMEMODE 3687 PEP_bCONTOURSTYLELEGEND 3690 PEP_bALLOWGRIDNUMBERHOTSPOTSX 3692 PEP_bCUSTOMGRIDNUMBERSTX 3695 PEP_bCUSTOMGRIDNUMBERSEX 3699 PEP_bCUSTOMGRIDNUMBERSETX 3700 PEP_bSMITHCHART 3800 PEP_bSMARTGRID 3801 PEP_bZOOMINGLIMITED 3808 PEP_bSHOWPIELEGEND 3922 PEP_bDISABLE3DSHADOW 3927 PEP_bALLOWROTATION 4002 PEP_bAUTOROTATION 4003 PEP_bALLOWHORZSCROLLBAR 4006 PEP_bALLOWVERTSCROLLBAR 4007 PEP_bNOSURFACEPOLYGONBORDERS 4009 PEP_bADDSKIRTS 4012 PEP_bMANUALZAXISTICKNLINE 4019 PEP_bZAXISLONGTICKS 4021 PEP_bINVERTEDZAXIS 4023 PEP_bALLOWCONTOURCONTROL 4025 PEP_bSHOWCONTOURLEGENDS 4026 PEP_bRESETGDICACHE 4032 PEP_bSHOWZAXISLINEANNOTATIONS 4035 PEP_bANNOTATIONSONSURFACES 4041 PEP_bALLOWWIREFRAME 4042 PEP_bALLOWSURFACE 4043 PEP_bALLOWSURFACESHADING 4044 PEP_bALLOWSURFACECONTOUR 4045 PEP_bALLOWSURFACEPIXEL 4046 PEP_bDEGREEPROMPTING 4054 PEP_bCUSTOMGRIDNUMBERSZ 4055 PEP_bSHADEDPOLYGONBORDERS 4056 PEP_bALLOWGRIDNUMBERHOTSPOTSZ 4057 PEP_bZAXISWHOLENUMBERS 4061 PEP_b3DSCATTERZORDERDISABLE 4067 PEP_bGRAPHANNOTATIONNORANGECHECK 4069 PEP_bMANUALSCALECULLMINY 4071 PEP_bMANUALSCALECULLMAXY 4072 PEP_bMANUALSCALEPLATEAUMINY 4073 PEP_bMANUALSCALEPLATEAUMAXY 4074 PEP_bMANUALSCALECULLX 4075 PEP_bMANUALSCALECULLZ 4076 PEP_bXZAXISOBSTACLE 4079 PEP_bSURFACENULLDATAGAPS 4082 PEP_bAUTOPADBEYONDZEROZ 4085 PEP_bTIMERON 4086 PEP_bLEFTJUSTIFICATIONOUTSIDE 4087 PEP_bALLOWYAXISLINEANNOTHOTSPOTS 4092 PEP_bALLOWXAXISLINEANNOTHOTSPOTS 4093 PEP_bALLOWZAXISLINEANNOTHOTSPOTS 4094 PEP_bWIREFRAMECONTOURCOLORED 4095 PEP_bWIREFRAMEISOSUBSETPOINT 4096 PEP_bWIREFRAMEISOLINEBORDERS 4097 PEP_bGRIDBRIGHTEN 4101 --- PEP_f (double scalars -- PEvset/PEvget) --- PEP_fRESOURCEBMPMINX 1714 PEP_fRESOURCEBMPMAXX 1715 PEP_fRESOURCEBMPMINY 1716 PEP_fRESOURCEBMPMAXY 1717 PEP_fMANUALCONTOURMINII 1735 PEP_fMANUALCONTOURMAXII 1736 PEP_fMANUALCONTOURLINEII 1738 PEP_fAXISMINRANGEFLOAT 1759 PEP_fAXISMINRANGEDOUBLE 1760 PEP_fVIEWPORTPANFACTOR3D 1788 PEP_f3DXZOOMMIN 1791 PEP_f3DXZOOMMAX 1792 PEP_fGRAPHBMPMINX 1829 PEP_fGRAPHBMPMINY 1830 PEP_fGRAPHBMPMAXX 1831 PEP_fGRAPHBMPMAXY 1832 PEP_fFONTSIZESUBTITLECNTL 1845 PEP_fFONTSIZETRACKINGCNTL 1852 PEP_fLIGHTSTRENGTH 1865 PEP_fFONTSIZEDLCNTL 1867 PEP_fMAXZOOM 1878 PEP_fDXTUBETHICKNESSMIN 1879 PEP_fDXTUBETHICKNESSINC 1880 PEP_f3DXZOOM 1926 PEP_f3DXVIEWPORTX 1929 PEP_f3DXVIEWPORTY 1930 PEP_f3DXNEARFOV 1955 PEP_f3DXFARFOV 1956 PEP_fCURSORVALUEX 1972 PEP_fCURSORVALUEY 1973 PEP_fCURSORVALUEZ 1974 PEP_fSGRAPH_DAY_DENSITY 1981 PEP_fSGRAPH_HOUR_DENSITY 1982 PEP_fSGRAPH_MINUTE_DENSITY 1983 PEP_fSGRAPH_SECOND_DENSITY 1984 PEP_fFILTERFACTOR 2043 PEP_fFILTERFACTORAREA 2044 PEP_fFILTERFACTORBAR 2045 PEP_fFILTERFACTORPOINT 2046 PEP_fFILTERFACTORRND 2047 PEP_fFONTSIZETBCNTL 2121 PEP_fFONTSIZEGLOBALCNTL 2634 PEP_fFONTSIZETITLECNTL 2635 PEP_fFONTSIZEMSCNTL 2945 PEP_fFONTSIZEMBCNTL 2946 PEP_fFONTSIZEGNCNTL 2947 PEP_fFONTSIZECPCNTL 2948 PEP_fFONTSIZEALCNTL 2949 PEP_fUPPERBOUNDVALUE 3015 PEP_fBARWIDTH 3019 PEP_fLOWERBOUNDVALUE 3020 PEP_fFONTSIZEAXISCNTL 3041 PEP_fFONTSIZELEGENDCNTL 3042 PEP_fMANUALMINY 3055 PEP_fMANUALMAXY 3060 PEP_fZOOMMINRY 3073 PEP_fZOOMMAXRY 3074 PEP_fSTARTTIME 3098 PEP_fENDTIME 3099 PEP_fLEFTEDGESPACING 3117 PEP_fRIGHTEDGESPACING 3118 PEP_fAXISNUMBERSPACING 3119 PEP_fGRIDASPECT 3124 PEP_fDASHLINETHICKNESS 3142 PEP_fAXISTICKSPACING 3171 PEP_fXAXISNUMBERSPACING 3172 PEP_fXAXISTICKSPACING 3173 PEP_fGRAPHANNOTATIONSIZECNTL 3174 PEP_fLINEGAPTHRESHOLD 3212 PEP_fMANUALMINRY 3245 PEP_fZOOMMINX 3248 PEP_fZOOMMAXX 3249 PEP_fMANUALMAXRY 3250 PEP_fMANUALYAXISTICK 3263 PEP_fMANUALYAXISLINE 3264 PEP_fMANUALRYAXISTICK 3266 PEP_fMANUALRYAXISLINE 3267 PEP_fNULLDATAVALUE 3268 PEP_fZOOMMINY 3284 PEP_fZOOMMAXY 3285 PEP_fZOOMWINDOWFONTSIZECNTL 3363 PEP_fZOOMWINDOWHEIGHT 3364 PEP_fMANUALSTACKEDMAXY 3406 PEP_fMANUALSTACKEDMINY 3418 PEP_fPOINTPADDING 3427 PEP_fPOINTPADDINGAREA 3428 PEP_fPOINTPADDINGBAR 3429 PEP_fMOUSEWHEELZOOMFACTOR 3469 PEP_fPINCHZOOMFACTOR 3470 PEP_fMANUALMINX 3620 PEP_fMANUALMAXX 3625 PEP_fMANUALXAXISTICK 3645 PEP_fMANUALXAXISLINE 3646 PEP_fNULLDATAVALUEX 3656 PEP_fMANUALMINTX 3665 PEP_fMANUALMAXTX 3666 PEP_fMANUALTXAXISTICK 3670 PEP_fMANUALTXAXISLINE 3671 PEP_fMANUALMINZ 3682 PEP_fMANUALMAXZ 3683 PEP_fMANUALZAXISLINE 3685 PEP_fZOOMMINTX 3697 PEP_fZOOMMAXTX 3698 PEP_fPOLARTICKTHRESHOLD 3804 PEP_fPOLARLINETHRESHOLD 3805 PEP_fPOLAR30DEGTHRESHOLD 3806 PEP_fZOOMMAXFACTOR 3809 PEP_fWORKINGZOOMFACTOR 3810 PEP_fZOOMOFFSETX 3813 PEP_fZOOMOFFSETY 3814 PEP_fMANUALZAXISTICK 4020 PEP_fZDISTANCE 4022 PEP_fMANUALCONTOURLINE 4027 PEP_fMANUALCONTOURMIN 4028 PEP_fMANUALCONTOURMAX 4029 PEP_fNULLDATAVALUEZ 4050 PEP_fGRIDASPECTX 4062 PEP_fGRIDASPECTY 4063 PEP_fGRIDASPECTZ 4064 PEP_fMOUSEWHEELZOOMFACTOR3D 4077 PEP_fPINCHZOOMFACTOR3D 4078 PEP_fMANUALMINW 4090 PEP_fMANUALMAXW 4091 --- PEP_dw (DWORD scalars -- PEnset/PEnget) --- PEP_dwCHARTBORDERCOLOR 1602 PEP_dwDXISOYAXISLINECOLOR 1819 PEP_dwDXISOXZAXISLINECOLOR 1820 PEP_dwTRACKINGTOOLTIPBKCOLOR 1857 PEP_dwTRACKINGTOOLTIPTEXTCOLOR 1858 PEP_dwGRIDLINECOLOR 1905 PEP_dwTAGRADIENTCOLOR 1918 PEP_dwPOINTBORDERCOLOR 1939 PEP_dw3DHIGHLIGHTCOLOR 1971 PEP_dwCURSORCOLOR 1997 PEP_dwAXISBACKCOLOR 2162 PEP_dwAXISFORECOLOR 2163 PEP_dwMONODESKCOLOR 2250 PEP_dwMONOTEXTCOLOR 2255 PEP_dwMONOSHADOWCOLOR 2260 PEP_dwMONOGRAPHFORECOLOR 2265 PEP_dwMONOGRAPHBACKCOLOR 2270 PEP_dwMONOTABLEFORECOLOR 2275 PEP_dwMONOTABLEBACKCOLOR 2280 PEP_dwCMONODESKCOLOR 2285 PEP_dwCMONOTEXTCOLOR 2290 PEP_dwCMONOSHADOWCOLOR 2295 PEP_dwCMONOGRAPHFORECOLOR 2300 PEP_dwCMONOGRAPHBACKCOLOR 2305 PEP_dwCMONOTABLEFORECOLOR 2310 PEP_dwCMONOTABLEBACKCOLOR 2315 PEP_dwDESKCOLOR 2320 PEP_dwTEXTCOLOR 2325 PEP_dwSHADOWCOLOR 2330 PEP_dwGRAPHFORECOLOR 2335 PEP_dwGRAPHBACKCOLOR 2340 PEP_dwTABLEFORECOLOR 2345 PEP_dwTABLEBACKCOLOR 2350 PEP_dwCDESKCOLOR 2355 PEP_dwCTEXTCOLOR 2360 PEP_dwCSHADOWCOLOR 2365 PEP_dwCGRAPHFORECOLOR 2370 PEP_dwCGRAPHBACKCOLOR 2375 PEP_dwCTABLEFORECOLOR 2380 PEP_dwCTABLEBACKCOLOR 2385 PEP_dwWDESKCOLOR 2390 PEP_dwWTEXTCOLOR 2395 PEP_dwWSHADOWCOLOR 2400 PEP_dwWGRAPHFORECOLOR 2405 PEP_dwWGRAPHBACKCOLOR 2410 PEP_dwWTABLEFORECOLOR 2415 PEP_dwWTABLEBACKCOLOR 2420 PEP_dwPNGTRANSPARENTCOLOR 2684 PEP_dwDESKGRADIENTSTART 2687 PEP_dwDESKGRADIENTEND 2688 PEP_dwGRAPHGRADIENTSTART 2692 PEP_dwGRAPHGRADIENTEND 2693 PEP_dwTABLEGRADIENTSTART 2697 PEP_dwTABLEGRADIENTEND 2698 PEP_dwHATCHBACKCOLOR 2941 PEP_dwTABACKCOLOR 2963 PEP_dwTAFORECOLOR 2964 PEP_dwYAXISCOLOR 3036 PEP_dwRYAXISCOLOR 3037 PEP_dwXAXISCOLOR 3038 PEP_dwBOXPLOTCOLOR 3088 PEP_dwBARBORDERCOLOR 3116 PEP_dwTICKCOLOR 3159 PEP_dwGRAPHANNOTBACKCOLOR 3176 PEP_dwLINEANNOTBACKCOLOR 3196 PEP_dwANNOTATIONCOLOR 3203 PEP_dwCANNOTATIONCOLOR 3204 PEP_dwGRIDBANDSCOLOR 3346 PEP_dwZOOMWINDOWFORECOLOR 3366 PEP_dwZOOMWINDOWBACKCOLOR 3367 PEP_dwZOOMWINDOWGRADIENTSTART 3368 PEP_dwZOOMWINDOWGRADIENTEND 3369 PEP_dwTXAXISCOLOR 3677 PEP_dwXZBACKCOLOR 4015 PEP_dwYBACKCOLOR 4016 PEP_dwZAXISCOLOR 4017 --- PEP_sz (string scalars -- PEszset/PEszget) --- PEP_szRESOURCEBMPFILENAME 1711 PEP_szCONTOURLEGENDTITLE 1749 PEP_szCONTOURLEGENDTITLEII 1750 PEP_szTRACKINGTEXT 1855 PEP_szTRACKINGTOOLTIPTITLE 1856 PEP_szSVGXMLPARMS 1935 PEP_szSVGXMLNSPARMS 1936 PEP_szCURSORPROMPTSTRING 1998 PEP_szMAINTITLE 2105 PEP_szSUBTITLE 2110 PEP_szEXPORTFILEDEF 2111 PEP_szEXPORTUNITXDEF 2113 PEP_szEXPORTUNITYDEF 2114 PEP_szPRINTERDEVICE 2131 PEP_szPRINTERDRIVER 2132 PEP_szPRINTERPORT 2133 PEP_szMAINTITLEFONT 2445 PEP_szCMAINTITLEFONT 2465 PEP_szSUBTITLEFONT 2485 PEP_szCSUBTITLEFONT 2505 PEP_szLABELFONT 2525 PEP_szCLABELFONT 2545 PEP_szTABLEFONT 2565 PEP_szCTABLEFONT 2570 PEP_szDESKBMPFILENAME 2690 PEP_szGRAPHBMPFILENAME 2695 PEP_szTABLEBMPFILENAME 2700 PEP_szHELPFILENAME 2923 PEP_szTAFONT 2970 PEP_szSCALESYMBOLS 2986 PEP_szXAXISLABEL 3000 PEP_szYAXISLABEL 3005 PEP_szUPPERBOUNDTEXT 3025 PEP_szLOWERBOUNDTEXT 3030 PEP_szLEFTMARGIN 3052 PEP_szTOPMARGIN 3053 PEP_szRIGHTMARGIN 3054 PEP_szBOTTOMMARGIN 3056 PEP_szAXISFORMATY 3071 PEP_szAXISFORMATRY 3072 PEP_szRYAXISLABEL 3255 PEP_szZOOMWINDOWBMPFILENAME 3373 PEP_szMANUALMAXPOINTLABEL 3409 PEP_szMANUALMAXDATASTRING 3410 PEP_szTXAXISLABEL 3667 PEP_szAXISFORMATX 3678 PEP_szAXISFORMATTX 3679 PEP_szSLICELABELFORMAT 3931 PEP_szZAXISLABEL 4000 PEP_szAXISFORMATZ 4066 --- PEP_na (int arrays -- PEvsetcell/PEvgetcell) --- PEP_naDELAUNAYINDICES 1771 PEP_naJAGGEDPOINTSX 1793 PEP_naJAGGEDPOINTSY 1794 PEP_naJAGGEDPOINTSZ 1795 PEP_naJAGGEDPOINTSW 1796 PEP_naJAGGEDPOINTSPOINTCOLORS 1797 PEP_naGRAPHANNOTTEXTLOCATIONRIGHT 1884 PEP_naGRAPHANNOTTEXTLOCATIONLEFT 1885 PEP_naGRAPHANNOTTEXTLOCATIONTOP 1886 PEP_naGRAPHANNOTTEXTLOCATIONBOTTOM 1887 PEP_naSUBSETGRADIENTSTYLE 1911 PEP_naSUBSETGRADIENTBOUNDARY 1912 PEP_naGRAPHANNOTATIONGRADIENTSTYLE 1913 PEP_naGRAPHANNOTATIONBEVELSTYLE 1914 PEP_naGRAPHANNOTATIONGRADIENTBOUNDARY 1915 PEP_naGRAPHANNOTATIONBEVELLIGHTING 1916 PEP_naSUBSETFORHOTSPOTS 1986 PEP_naSUBSETFORGETHOTSPOT 1987 PEP_naSUBSETSTOSHOW 2158 PEP_naSUBSETSTOTABLE 2159 PEP_naTABOLD 2171 PEP_naTAITALIC 2172 PEP_naTAUNDERLINE 2173 PEP_naGRAPHANNOTATIONINFRONT 2189 PEP_naGRAPHANNOTTEXTLOCATION 2321 PEP_naSUBSETOBSTACLES 2323 PEP_naSUBSETSTOLEGEND 2624 PEP_naLEGENDANNOTATIONTYPE 2625 PEP_naCUSTOMMENU 2667 PEP_naCUSTOMMENUSTATE 2668 PEP_naCUSTOMMENULOCATION 2669 PEP_naSUBSETHATCH 2940 PEP_naTATYPE 2953 PEP_naTAHOTSPOT 2956 PEP_naTACOLUMNWIDTH 2959 PEP_naTAJUSTIFICATION 2969 PEP_naMULTIAXESSUBSETS 3001 PEP_naGRAPHANNOTATIONAXIS 3002 PEP_naHORZLINEANNOTATIONAXIS 3003 PEP_naYAXISANNOTATIONAXIS 3004 PEP_naLEGENDANNOTATIONAXIS 3008 PEP_naOVERLAPMULTIAXES 3059 PEP_naSUBSETDEGREE 3068 PEP_naRANDOMSUBSETSTOGRAPH 3080 PEP_naCRANDOMSUBSETSTOGRAPH 3085 PEP_naGRAPHANNOTATIONHOTSPOT 3089 PEP_naPLOTTINGMETHODS 3103 PEP_naPOINTHATCH 3114 PEP_naHORZLINEANNOTHOTSPOT 3138 PEP_naVERTLINEANNOTHOTSPOT 3139 PEP_naSUBSETFORPOINTCOLORS 3155 PEP_naPOINTTYPES 3156 PEP_naSUBSETFORPOINTTYPES 3157 PEP_naGRAPHANNOTATIONBOLD 3189 PEP_naGRAPHANNOTATIONITALIC 3190 PEP_naGRAPHANNOTATIONUNDERLINE 3191 PEP_naWORKINGAXESTOGRAPH 3199 PEP_naHORZLINEANNOTATIONINFRONT 3207 PEP_naVERTLINEANNOTATIONINFRONT 3209 PEP_naHORZLINEANNOTATIONTYPE 3216 PEP_naVERTLINEANNOTATIONTYPE 3221 PEP_naGRAPHANNOTATIONTYPE 3246 PEP_naSUBSETPOINTTYPES 3270 PEP_naSUBSETLINETYPES 3271 PEP_naAUTOSTATSUBSETS 3300 PEP_naGRAPHANNOTATIONSHADOW 3322 PEP_naRANDOMPOINTSTOGRAPH 3335 PEP_naCRANDOMPOINTSTOGRAPH 3340 PEP_naZOOMWINDOWSUBSETSTOSHOW 3357 PEP_naZOOMWINDOWPLOTTINGMETHODS 3358 PEP_naGRAPHANNOTATIONZOOM 3388 PEP_naVERTLINEANNOTATIONZOOM 3389 PEP_naHORZLINEANNOTATIONZOOM 3390 PEP_naALTFREQUENCIES 3403 PEP_naSUBSETAXES 3503 PEP_naZAXISLINEANNOTATIONTYPE 4038 --- PEP_fa (float arrays -- PEvsetcell(Ex)/PEvgetcell(Ex)) --- PEP_faAPPENDWDATA 1603 PEP_faAPPENDWDATAII 1604 PEP_faAPPENDWSUBSET 1605 PEP_faAPPENDWIISUBSET 1606 PEP_faWDATA 1730 PEP_faWDATAII 1731 PEP_faWDATAPTR 1733 PEP_faWDATAIIPTR 1734 PEP_faCONTOURCOLORPROPORTIONSII 1741 PEP_faAPPENDXSUBSET 1806 PEP_faAPPENDYSUBSET 1807 PEP_faAPPENDZSUBSET 1808 PEP_faAPPENDXIISUBSET 1809 PEP_faAPPENDYIISUBSET 1810 PEP_faAPPENDZIISUBSET 1811 PEP_faCONTOURCOLORLOCATION 1838 PEP_faCONTOURCOLORPROPORTIONS 1839 PEP_faCONTOURCOLORSATURATION 1840 PEP_faXDATAIIPTR 1896 PEP_faYDATAIIPTR 1897 PEP_faZDATAIIPTR 1898 PEP_faSUBSETPOINTSIZES 1925 PEP_faXDATA 2135 PEP_faYDATA 2140 PEP_faXDATAPTR 2176 PEP_faYDATAPTR 2177 PEP_faZDATAPTR 2178 PEP_faZDATA 2900 PEP_faMULTIAXESPROPORTIONS 3007 PEP_faXDATAII 3013 PEP_faYDATAII 3014 PEP_faAPPENDYDATAII 3024 PEP_faBESTFITCOEFFS 3058 PEP_faGRIDHOTSPOTVALUE 3123 PEP_faWORKINGAXESPROPORTIONS 3131 PEP_faGRAPHANNOTATIONFONTSIZE 3188 PEP_faYDATAIIPTR2 3192 PEP_faXDATAIIPTR2 3193 PEP_faHORZLINEANNOTATION 3213 PEP_faVERTLINEANNOTATION 3218 PEP_faAPPENDYDATA 3276 PEP_faGRAPHANNOTATIONX 3291 PEP_faGRAPHANNOTATIONY 3292 PEP_faXAXISANNOTATION 3297 PEP_faYAXISANNOTATION 3299 PEP_faZDATAII 3472 PEP_faAPPENDXDATA 3658 PEP_faAPPENDXDATAII 3659 PEP_faZAXISLINEANNOTATION 4036 PEP_faGRAPHANNOTATIONZ 4040 PEP_faAPPENDZDATA 4049 PEP_faAPPENDZDATAII 4053 PEP_faZDATAIIPTR2 4080 --- PEP_dwa (DWORD arrays -- PEvsetcell/PEvgetcell) --- PEP_dwaCONTOURCOLORSII 1740 PEP_dwaSUBSETCOLORSII 1745 PEP_dwaSUBSETSHADESII 1746 PEP_dwaCONTOURCOLORS 1837 PEP_dwaSUBSETGRADIENTSTARTCOLORS 1910 PEP_dwaGRAPHANNOTATIONGRADIENTCOLOR 1917 PEP_dwaPOINTCOLORSPTR 2179 PEP_dwaSUBSETCOLORS 2190 PEP_dwaSUBSETSHADES 2195 PEP_dwaLEGENDANNOTATIONCOLOR 2627 PEP_dwaTACOLOR 2955 PEP_dwaAPPENDPOINTCOLORS 3132 PEP_dwaHORZLINEANNOTATIONCOLOR 3217 PEP_dwaVERTLINEANNOTATIONCOLOR 3222 PEP_dwaGRAPHANNOTATIONCOLOR 3236 PEP_dwaXAXISANNOTATIONCOLOR 3237 PEP_dwaYAXISANNOTATIONCOLOR 3238 PEP_dwaPOINTCOLORS 3258 PEP_dwaZAXISLINEANNOTATIONCOLOR 4039 --- PEP_sza (string arrays -- PEvsetcell/PEvgetcell) --- PEP_szaSUBSETLABELSII 1744 PEP_szaCONTOURLABELSII 1747 PEP_szaSUBSETLABELS 2125 PEP_szaPOINTLABELS 2130 PEP_szaLEGENDANNOTATIONTEXT 2626 PEP_szaMULTISUBTITLES 2630 PEP_szaMULTIBOTTOMTITLES 2631 PEP_szaCUSTOMMENUTEXT 2670 PEP_szaTATEXT 2954 PEP_szaTAFONTS 2971 PEP_szaMULTIAXISTITLES 3150 PEP_szaGRAPHANNOTATIONFONT 3187 PEP_szaYAXISANNOTATIONTEXT 3201 PEP_szaHORZLINEANNOTATIONTEXT 3214 PEP_szaVERTLINEANNOTATIONTEXT 3219 PEP_szaAPPENDPOINTLABELDATA 3277 PEP_szaGRAPHANNOTATIONTEXT 3293 PEP_szaXAXISANNOTATIONTEXT 3298 PEP_szaPOINTLABELSII 3476 PEP_szaDATAPOINTLABELS 3643 PEP_szaCONTOURLABELS 3691 PEP_szaZAXISLINEANNOTATIONTEXT 4037 --- PEP_struct (structures -- PEvset/PEvget) --- PEP_structVIEWINGFROM 1873 PEP_structVIEWINGAT 1874 PEP_struct3DXLIGHT0 1954 PEP_structGRAPHANNOTPOLYDATA 1985 PEP_structHOTSPOTDATA 2610 PEP_structKEYDOWNDATA 2612 PEP_structGRAPHLOC 3023 PEP_structSPRINGDAYLIGHT 3127 PEP_structFALLDAYLIGHT 3128 PEP_structCUSTOMGRIDNUMBERS 3162 PEP_structEXTRAAXISX 3693 PEP_structEXTRAAXISTX 3694 PEP_structPOLYDATA 4014 PEP_structPOLYDATA4D 4088 PEP_structTRIANGLEDATAPTR 1614 PEP_structGRAPHANNOTTRIANGLEDATAPTR 1615 PEP_structTRIANGLEDATA 1612 PEP_structGRAPHANNOTTRIANGLEDATA 1613 --- PEP_h (handles) --- PEP_hRESOURCEBMPHANDLE 1718 PEP_hMEMBITMAP2 1727 PEP_hMEMDC2 1728 PEP_hDIBMEMBITMAP2 1761 PEP_hRGBMEMSECTION2 1763 PEP_hTRACKINGTOOLTIPHWND 1859 PEP_hDESKBMPHANDLE 2117 PEP_hGRAPHBMPHANDLE 2118 PEP_hTABLEBMPHANDLE 2119 PEP_hMEMBITMAP 2575 PEP_hMEMDC 2580 PEP_hwndPARENTALCONTROL 2915 PEP_hARROWCURSOR 2917 PEP_hZOOMCURSOR 2918 PEP_hHANDCURSOR 2919 PEP_hNODROPCURSOR 2920 PEP_hSIZENSCURSOR 2939 PEP_hZOOMWINDOWBMPHANDLE 3381 --- PEP_p (pointers) --- PEP_pRGBBITS2 1762 PEP_ptLASTMOUSEMOVE 2637 --- PEP_ (other) --- PEP_rectIMAGEMAPPOLYS 2124 PEP_rectIMAGEMAPELLIPS 2126 PEP_rectTA 2169 PEP_rectLOGICALLOC 2210 PEP_rectGRAPH 3049 PEP_rectAXIS 3051 PEP_rectZOOMWINDOW 3384 PEP_YAXISOBSTACLE 4081 ====================================================================== GRAPH ANNOTATION TYPES (PEGAT_) Used with PEP_naGRAPHANNOTATIONTYPE. .NET: GraphAnnotationType. Rectangle pattern: PEGAT_TOPLEFT(46) -> PEGAT_BOTTOMRIGHT(47) -> PEGAT_RECT_FILL(55) ====================================================================== PEGAT_NOSYMBOL 0 PEGAT_PLUS 1 PEGAT_CROSS 2 PEGAT_DOT 3 PEGAT_DOTSOLID 4 PEGAT_SQUARE 5 PEGAT_SQUARESOLID 6 PEGAT_DIAMOND 7 PEGAT_DIAMONDSOLID 8 PEGAT_UPTRIANGLE 9 PEGAT_UPTRIANGLESOLID 10 PEGAT_DOWNTRIANGLE 11 PEGAT_DOWNTRIANGLESOLID 12 PEGAT_SMALLPLUS 13 PEGAT_SMALLCROSS 14 PEGAT_SMALLDOT 15 PEGAT_SMALLDOTSOLID 16 PEGAT_SMALLSQUARE 17 PEGAT_SMALLSQUARESOLID 18 PEGAT_SMALLDIAMOND 19 PEGAT_SMALLDIAMONDSOLID 20 PEGAT_SMALLUPTRIANGLE 21 PEGAT_SMALLUPTRIANGLESOLID 22 PEGAT_SMALLDOWNTRIANGLE 23 PEGAT_SMALLDOWNTRIANGLESOLID 24 PEGAT_LARGEPLUS 25 PEGAT_LARGECROSS 26 PEGAT_LARGEDOT 27 PEGAT_LARGEDOTSOLID 28 PEGAT_LARGESQUARE 29 PEGAT_LARGESQUARESOLID 30 PEGAT_LARGEDIAMOND 31 PEGAT_LARGEDIAMONDSOLID 32 PEGAT_LARGEUPTRIANGLE 33 PEGAT_LARGEUPTRIANGLESOLID 34 PEGAT_LARGEDOWNTRIANGLE 35 PEGAT_LARGEDOWNTRIANGLESOLID 36 PEGAT_POINTER 37 PEGAT_THINSOLIDLINE 38 PEGAT_DASHLINE 39 PEGAT_DOTLINE 40 PEGAT_DASHDOTLINE 41 PEGAT_DASHDOTDOTLINE 42 PEGAT_MEDIUMSOLIDLINE 43 PEGAT_THICKSOLIDLINE 44 PEGAT_LINECONTINUE 45 PEGAT_TOPLEFT 46 PEGAT_BOTTOMRIGHT 47 PEGAT_RECT_THIN 48 PEGAT_RECT_DASH 49 PEGAT_RECT_DOT 50 PEGAT_RECT_DASHDOT 51 PEGAT_RECT_DASHDOTDOT 52 PEGAT_RECT_MEDIUM 53 PEGAT_RECT_THICK 54 PEGAT_RECT_FILL 55 PEGAT_ROUNDRECT_THIN 56 PEGAT_ROUNDRECT_DASH 57 PEGAT_ROUNDRECT_DOT 58 PEGAT_ROUNDRECT_DASHDOT 59 PEGAT_ROUNDRECT_DASHDOTDOT 60 PEGAT_ROUNDRECT_MEDIUM 61 PEGAT_ROUNDRECT_THICK 62 PEGAT_ROUNDRECT_FILL 63 PEGAT_ELLIPSE_THIN 64 PEGAT_ELLIPSE_DASH 65 PEGAT_ELLIPSE_DOT 66 PEGAT_ELLIPSE_DASHDOT 67 PEGAT_ELLIPSE_DASHDOTDOT 68 PEGAT_ELLIPSE_MEDIUM 69 PEGAT_ELLIPSE_THICK 70 PEGAT_ELLIPSE_FILL 71 PEGAT_DASH 72 PEGAT_PIXEL 73 PEGAT_STARTPOLY 74 PEGAT_ADDPOLYPOINT 75 PEGAT_ENDPOLYGON 76 PEGAT_ENDPOLYLINE_THIN 77 PEGAT_ENDPOLYLINE_MEDIUM 78 PEGAT_ENDPOLYLINE_THICK 79 PEGAT_ENDPOLYLINE_DASH 80 PEGAT_ENDPOLYLINE_DOT 81 PEGAT_ENDPOLYLINE_DASHDOT 82 PEGAT_ENDPOLYLINE_DASHDOTDOT 83 PEGAT_STARTTEXT 84 PEGAT_ADDTEXT 85 PEGAT_PARAGRAPH 86 PEGAT_MEDIUMTHINSOLID 87 PEGAT_MEDIUMTHICKSOLID 88 PEGAT_EXTRATHICKSOLID 89 PEGAT_EXTRATHINSOLID 90 PEGAT_EXTRAEXTRATHINSOLID 91 PEGAT_ARROW_N 92 PEGAT_ARROW_NE 93 PEGAT_ARROW_E 94 PEGAT_ARROW_SE 95 PEGAT_ARROW_S 96 PEGAT_ARROW_SW 97 PEGAT_ARROW_W 98 PEGAT_ARROW_NW 99 PEGAT_SMALL_OBSTACLE 100 PEGAT_MEDIUM_OBSTACLE 101 PEGAT_LARGE_OBSTACLE 102 PEGAT_RECT_OBSTACLE 103 PEGAT_NOSYMBOL_MOVABLE 104 PEGAT_MEDIUMTHINDASH 105 PEGAT_MEDIUMTHINDOT 106 PEGAT_MEDIUMTHINDASHDOT 107 PEGAT_MEDIUMTHINDASHDOTDOT 108 PEGAT_MEDIUMDASH 109 PEGAT_MEDIUMDOT 110 PEGAT_MEDIUMDASHDOT 111 PEGAT_MEDIUMDASHDOTDOT 112 PEGAT_MEDIUMTHICKDASH 113 PEGAT_MEDIUMTHICKDOT 114 PEGAT_MEDIUMTHICKDASHDOT 115 PEGAT_MEDIUMTHICKDASHDOTDOT 116 PEGAT_THICKDASH 117 PEGAT_THICKDOT 118 PEGAT_THICKDASHDOT 119 PEGAT_THICKDASHDOTDOT 120 PEGAT_EXTRATHICKDASH 121 PEGAT_EXTRATHICKDOT 122 PEGAT_EXTRATHICKDASHDOT 123 PEGAT_EXTRATHICKDASHDOTDOT 124 PEGAT_RECT_MEDIUMDASH 125 PEGAT_RECT_MEDIUMDOT 126 PEGAT_RECT_MEDIUMDASHDOT 127 PEGAT_RECT_MEDIUMDASHDOTDOT 128 PEGAT_RECT_THICKDASH 129 PEGAT_RECT_THICKDOT 130 PEGAT_RECT_THICKDASHDOT 131 PEGAT_RECT_THICKDASHDOTDOT 132 PEGAT_ROUNDRECT_MEDIUMDASH 133 PEGAT_ROUNDRECT_MEDIUMDOT 134 PEGAT_ROUNDRECT_MEDIUMDASHDOT 135 PEGAT_ROUNDRECT_MEDIUMDASHDOTDOT 136 PEGAT_ROUNDRECT_THICKDASH 137 PEGAT_ROUNDRECT_THICKDOT 138 PEGAT_ROUNDRECT_THICKDASHDOT 139 PEGAT_ROUNDRECT_THICKDASHDOTDOT 140 PEGAT_ELLIPSE_MEDIUMDASH 141 PEGAT_ELLIPSE_MEDIUMDOT 142 PEGAT_ELLIPSE_MEDIUMDASHDOT 143 PEGAT_ELLIPSE_MEDIUMDASHDOTDOT 144 PEGAT_ELLIPSE_THICKDASH 145 PEGAT_ELLIPSE_THICKDOT 146 PEGAT_ELLIPSE_THICKDASHDOT 147 PEGAT_ELLIPSE_THICKDASHDOTDOT 148 PEGAT_ENDPOLYLINE_MEDIUMDASH 149 PEGAT_ENDPOLYLINE_MEDIUMDOT 150 PEGAT_ENDPOLYLINE_MEDIUMDASHDOT 151 PEGAT_ENDPOLYLINE_MEDIUMDASHDOTDOT 152 PEGAT_ENDPOLYLINE_THICKDASH 153 PEGAT_ENDPOLYLINE_THICKDOT 154 PEGAT_ENDPOLYLINE_THICKDASHDOT 155 PEGAT_ENDPOLYLINE_THICKDASHDOTDOT 156 PEGAT_RECT_HATCH_HORIZONTAL 157 PEGAT_RECT_HATCH_VERTICAL 158 PEGAT_RECT_HATCH_FDIAGONAL 159 PEGAT_RECT_HATCH_BDIAGONAL 160 PEGAT_RECT_HATCH_CROSS 161 PEGAT_RECT_HATCH_DIAGCROSS 162 PEGAT_ROUNDRECT_HATCH_HORIZONTAL 163 PEGAT_ROUNDRECT_HATCH_VERTICAL 164 PEGAT_ROUNDRECT_HATCH_FDIAGONAL 165 PEGAT_ROUNDRECT_HATCH_BDIAGONAL 166 PEGAT_ROUNDRECT_HATCH_CROSS 167 PEGAT_ROUNDRECT_HATCH_DIAGCROSS 168 PEGAT_ELLIPSE_HATCH_HORIZONTAL 169 PEGAT_ELLIPSE_HATCH_VERTICAL 170 PEGAT_ELLIPSE_HATCH_FDIAGONAL 171 PEGAT_ELLIPSE_HATCH_BDIAGONAL 172 PEGAT_ELLIPSE_HATCH_CROSS 173 PEGAT_ELLIPSE_HATCH_DIAGCROSS 174 PEGAT_ENDPOLYGON_HATCH_HORIZONTAL 175 PEGAT_ENDPOLYGON_HATCH_VERTICAL 176 PEGAT_ENDPOLYGON_HATCH_FDIAGONAL 177 PEGAT_ENDPOLYGON_HATCH_BDIAGONAL 178 PEGAT_ENDPOLYGON_HATCH_CROSS 179 PEGAT_ENDPOLYGON_HATCH_DIAGCROSS 180 PEGAT_VECTOR_SMALL 181 PEGAT_VECTOR_MEDIUM 182 PEGAT_VECTOR_LARGE 183 PEGAT_ARROW_SMALL 184 PEGAT_ARROW_MEDIUM 185 PEGAT_ARROW_LARGE 186 PEGAT_POINTER_VECTOR_SMALL 187 PEGAT_POINTER_VECTOR_MEDIUM 188 PEGAT_POINTER_VECTOR_LARGE 189 PEGAT_POINTER_ARROW_SMALL 190 PEGAT_POINTER_ARROW_MEDIUM 191 PEGAT_POINTER_ARROW_LARGE 192 PEGAT_NULL_PEN 193 PEGAT_ANGLED_TEXT 194 PEGAT_ANGLED_TEXT_C 195 PEGAT_ANGLED_TEXT_T 196 PEGAT_TOP 197 PEGAT_BOTTOM 198 PEGAT_LEFT 199 PEGAT_RIGHT 200 PEGAT_POINTER_ARROWSOLID_SMALL 201 PEGAT_POINTER_ARROWSOLID_MEDIUM 202 PEGAT_POINTER_ARROWSOLID_LARGE 203 PEGAT_ARROWSOLID_SMALL 204 PEGAT_ARROWSOLID_MEDIUM 205 PEGAT_ARROWSOLID_LARGE 206 PEGAT_LTRIANGLE 207 PEGAT_LTRIANGLESOLID 208 PEGAT_RTRIANGLE 209 PEGAT_RTRIANGLESOLID 210 PEGAT_SMALLLTRIANGLE 211 PEGAT_SMALLLTRIANGLESOLID 212 PEGAT_SMALLRTRIANGLE 213 PEGAT_SMALLRTRIANGLESOLID 214 PEGAT_LARGELTRIANGLE 215 PEGAT_LARGELTRIANGLESOLID 216 PEGAT_LARGERTRIANGLE 217 PEGAT_LARGERTRIANGLESOLID 218 PEGAT_MAJORMINOR_RADII 219 PEGAT_MAJOR_DIRECTION 220 PEGAT_MINOR_DIRECTION 221 PEGAT_AXIS_DIRECTION 222 PEGAT_AXIS_ANGLES 223 PEGAT_TEXT_AT_PIXEL 228 PEGAT_MAJORMINOR_INSIDERADII 229 PEGAT_INSIDERECT_THIN 230 PEGAT_INSIDERECT_MEDIUM 231 PEGAT_INSIDERECT_THICK 232 PEGAT_INSIDERECT_FILL 233 PEGAT_CYLINDER_START 234 PEGAT_CYLINDER 235 PEGAT_BOX_START 236 PEGAT_BOX 237 PEGAT_SPHERE 238 PEGAT_SPHERE_SMALL 239 PEGAT_SPHERE_LARGE 240 PEGAT_ANGLED_TEXT_l 241 PEGAT_ANGLED_TEXT_L 242 PEGAT_ANGLED_TEXT_r 243 PEGAT_ANGLED_TEXT_R 244 PEGAT_TEXT_BOUNDING_BOX 245 PEGAT_BITMAP0 10001 PEGAT_BITMAP149 10150 ====================================================================== ENUM CONSTANTS (grouped by prefix, sorted by value) ====================================================================== PEABT_DEFAULT_BORDER=0, PEABT_DROP_SHADOW=1, PEABT_THIN_LINE=2, PEABT_NO_BORDER=3, PEABT_INSET=4 PEABT_THICK_LINE=5 PEAC_AUTO=0, PEAC_NORMAL=1, PEAC_LOG=2 PEADL_NONE=0, PEADL_DATAVALUES=1, PEADL_POINTLABELS=2, PEADL_DATAPOINTLABELS=3 PEAE_NONE=0, PEAE_ALLSUBSETS=1, PEAE_INDSUBSETS=2 PEAHS_NO_HOT_SPOT=0, PEAHS_GRAPH_ONLY=1, PEAHS_GRAPH_AND_ZOOMWINDOW=2, PEAHS_ZOOMWINDOW_ONLY=3 PEAIF_DEFAULT=0, PEAIF_BEHIND=1, PEAIF_IN_FRONT=2, PEAIF_HIDE=3 PEANF_DEFAULT=0, PEANF_EXP_NOTATION=1, PEANF_EXP_NOTATION_3X=2 PEAS_MINAP=1, PEAS_MAXAP=2, PEAS_AVGAP=3, PEAS_P1SDAP=4, PEAS_P2SDAP=5, PEAS_P3SDAP=6 PEAS_M1SDAP=7, PEAS_M2SDAP=8, PEAS_M3SDAP=9, PEAS_SUMPP=51, PEAS_MINPP=52, PEAS_MAXPP=53 PEAS_AVGPP=54, PEAS_P1SDPP=55, PEAS_P2SDPP=56, PEAS_P3SDPP=57, PEAS_M1SDPP=58, PEAS_M2SDPP=59 PEAS_M3SDPP=60, PEAS_PARETO_ASC=90, PEAS_PARETO_DEC=91 PEAUI_NONE=0, PEAUI_ALL=1, PEAUI_DISABLEKEYBOARD=2, PEAUI_DISABLEMOUSE=3 PEAXD_INCLUDE_SAT_SUN=0, PEAXD_NO_WEEKENDS=1 PEAZ_GRAPH_ONLY=0, PEAZ_NONE=0, PEAZ_GRAPH_AND_ZOOMWINDOW=1, PEAZ_HORIZONTAL=1 PEAZ_ZOOMWINDOW_ONLY=2, PEAZ_VERTICAL=2, PEAZ_HORZANDVERT=3, PEAZ_HORIZONTAL_MB=4 PEAZ_VERTICAL_MB=5, PEAZ_HORZANDVERT_MB=6 PEBFD_2ND=0, PEBFD_3RD=1, PEBFD_4TH=2 PEBG_TRANSPARENT=1 PEBGS_NONE=0, PEBGS_RADIAL=1, PEBGS_BEVELED=2 PEBS_NONE=0, PEBS_SMALL=0, PEBS_NO_BMP=0, PEBS_THICK_SMOOTH=1, PEBS_MEDIUM=1, PEBS_STRETCHBLT=1 PEBS_MEDIUM_SMOOTH=2, PEBS_LARGE=2, PEBS_TILED_BITBLT=2, PEBS_THIN_SMOOTH=3 PEBS_BITBLT_TOP_LEFT=3, PEBS_THICK_BEVEL=4, PEBS_BITBLT_TOP_CENTER=4, PEBS_MEDIUM_BEVEL=5 PEBS_BITBLT_TOP_RIGHT=5, PEBS_THIN_BEVEL=6, PEBS_BITBLT_BOTTOM_LEFT=6 PEBS_BITBLT_BOTTOM_CENTER=7, PEBS_BITBLT_BOTTOM_RIGHT=8, PEBS_BITBLT_CENTER=9 PEBS_BITBLT_ZOOMING=10 PEC2D_BOTH_LAYERS=0, PEC2D_BACKGROUND=1, PEC2D_FOREGROUND=2 PECCS_CONTOURCOLORS=1, PECCS_BLUE_GREEN_GREY=2, PECCS_BLUE_GREEN_RED=3, PECCS_GREEN_YELLOW_RED=4 PECCS_BLUE_GREEN_YELLOW_RED=5, PECCS_BLUE_GREEN_YELLOW_ORANGE_RED=6 PECCS_VIOLET_BLUE_GREEN_YELLOW_ORANGE_RED=7, PECCS_BLUE_CYAN_GREEN_LIME_TAN_BROWN_DARKBROWN=8 PECCS_BLUE_CYAN_GREEN_YELLOW_BROWN_WHITE=9 PECCSS_1=0, PECCSS_SMALL=1, PECCSS_MEDIUM=2, PECCSS_LARGE=3 PECG_COARSE=0, PECG_MEDIUM=1, PECG_FINE=2 PECM_SHOW=0, PECM_NOCURSOR=0, PECM_GRAYED=1, PECM_POINT=1, PECM_HIDE=2, PECM_DATACROSS=2 PECM_DATASQUARE=3, PECM_FLOATINGY=4, PECM_FLOATINGXY=5, PECM_FLOATINGXONLY=6 PECM_FLOATINGYONLY=7 PECML_TOP=0, PECML_ABOVE_SEPARATOR=1, PECML_BELOW_SEPARATOR=2, PECML_BOTTOM=3 PECMS_UNCHECKED=0, PECMS_CHECKED=1 PECONTROL_GRAPH=300, PECONTROL_PIE=302, PECONTROL_SGRAPH=304, PECONTROL_PGRAPH=308 PECONTROL_3D=312 PECPL_TOP_LEFT=0, PECPL_TOP_RIGHT=1, PECPL_TRACKING_TOOLTIP=2, PECPL_TRACKING_TEXT=3 PECPS_NONE=0, PECPS_XVALUE=1, PECPS_YVALUE=2, PECPS_XYVALUES=3, PECPS_XYZVALUES=4, PECPS_ZVALUE=5 PEDD_NONE=0, PEDD_POINTINCREMENT=1, PEDD_SUBSETINCREMENT=2 PEDLT_PERCENTAGE=0, PEDLT_3_CHAR=0, PEDLT_VALUE=1, PEDLT_1_CHAR=1, PEDLT_NO_DAY_PROMPT=2 PEDLT_NO_DAY_NUMBER=3 PEDO_DRIVERDEFAULT=0, PEDO_LANDSCAPE=1, PEDO_PORTRAIT=2, PEDO_nSUBSETS=2001, PEDO_nPOINTS=2002 PEDO_bSUBSETBYPOINT=2003, PEDO_bDISABLEAPPEND=2004, PEDO_faXDATA=2005, PEDO_faXDATAII=2006 PEDO_faYDATA=2007, PEDO_faYDATAII=2008, PEDO_faZDATA=2009, PEDO_faZDATAII=2010 PEDO_dwaPOINTCOLORS=2011, PEDO_szaPOINTLABELS=2012, PEDO_szaEXTRASTRINGDATA=2013 PEDO_faEXTRADOUBLEDATA=2014, PEDO_naEXTRAINTDATA=2015 PEDP_ENABLED=0, PEDP_DISABLED=1, PEDP_INSIDE_TOP=2 PEDS_NONE=0, PEDS_SHADOWS=1, PEDS_3D=2 PEDTM_NONE=0, PEDTM_VB=1, PEDTM_DELPHI=2 PEED_DATA=0, PEED_DATA_AND_LABEL=1 PEEDC_DISPLAY_DPI_ADJ=0, PEEDC_DISPLAY=1, PEEDC_PRINTER=2 PEEDD_CLIPBOARD=0, PEEDD_FILE=1, PEEDD_PRINTER=2 PEEL_HIGH_LOW_LIGHTS=0, PEEL_BRIGHT_LIGHT=1, PEEL_MEDIUM_LOW_LIGHTS=2 PEEP_CURRENT=0, PEEP_MAXIMUM=1 PEES_SUBSET_BY_POINT=0, PEES_POINT_BY_SUBSET=1 PEESD_NO_SIZE_OR_PIXEL=0, PEESD_MILLIMETERS=1, PEESD_INCHES=2, PEESD_POINTS=3 PEET_EMF_GDI=0, PEET_LIST=0, PEET_TAB_DELIMITED=0, PEET_EMF_GDIPLUS=1, PEET_TABLE=1 PEET_COMMA_DELIMITED=1, PEET_EMF_PLUSDUAL=2, PEET_EMF_PLUSONLY=3 PEETD_METAFILE=0, PEETD_BMP=1, PEETD_JPEG=2, PEETD_PNG=3, PEETD_TEXT=4, PEETD_EMF=5, PEETD_SVG=6 PEF2D_DISABLE=0, PEF2D_FASTEST=1, PEF2D_FAST=2, PEF2D_OPTIMUM=3, PEF2D_QUALITY=4, PEF2D_SLOW=5 PEF2D_SLOWEST=6 PEFGL_AUTO=0, PEFGL_SHOW=1, PEFGL_HIDE=2 PEFS_LARGE=0, PEFS_MEDIUM=1, PEFS_SMALL=2 PEFVP_AUTO=0, PEFVP_VERT=1, PEFVP_HORZ=2, PEFVP_SLANTED=3 PEGAM_NOT_MOVEABLE=0, PEGAM_POINTER=1 PEGB_DATA=0, PEGB_AXIS=1 PEGLC_BOTH=0, PEGLC_YAXIS=1, PEGLC_XAXIS=2, PEGLC_NONE=3 PEGPM_LINE=0, PEGPM_BAR=1, PEGPM_POINT=2, PEGPM_AREA=3, PEGPM_AREASTACKED=4 PEGPM_AREASTACKEDPERCENT=5, PEGPM_BARSTACKED=6, PEGPM_BARSTACKEDPERCENT=7 PEGPM_POINTSPLUSBFL=8, PEGPM_POINTSPLUSBFLGRAPHED=9, PEGPM_HISTOGRAM=10 PEGPM_SPECIFICPLOTMODE=11, PEGPM_BUBBLE=12, PEGPM_POINTSPLUSBFC=13 PEGPM_POINTSPLUSBFCGRAPHED=14, PEGPM_POINTSPLUSSPLINE=15, PEGPM_SPLINE=16 PEGPM_POINTSPLUSLINE=17, PEGPM_HORIZONTALBAR=18, PEGPM_HORZBARSTACKED=19 PEGPM_HORZBARSTACKEDPERCENT=20, PEGPM_STEP=21, PEGPM_RIBBON=22, PEGPM_CONTOURLINES=23 PEGPM_RECTHEATMAP=41, PEGPM_CONTOURCOLORS=24, PEGPM_HIGHLOWBAR=25, PEGPM_HIGHLOWLINE=26, PEGPM_HIGHLOWCLOSE=27 PEGPM_OPENHIGHLOWCLOSE=28, PEGPM_BOXPLOT=29, PEGPM_LINESTACKED=30, PEGPM_LINESTACKEDPERCENT=31 PEGPM_DEMOGRAPHICPYRAMID=32, PEGPM_HIGHLOWAREA=33, PEGPM_STICK=34, PEGPM_SPLINEAREA=35 PEGPM_SPLINERIBBON=36, PEGPM_CONTOURCOLORSSHADOWS=37, PEGPM_CONTOURDELAUNAY=39 PEGPT_GRAPH=0, PEGPT_TABLE=1, PEGPT_BOTH=2 PEGS_NO_GRADIENT=0, PEGS_THIN=0, PEGS_VERTICAL=1, PEGS_THICK=1, PEGS_HORIZONTAL=2, PEGS_DOT=2 PEGS_LINEAR_BAR_VERTICAL=3, PEGS_DASH=3, PEGS_LINEAR_BAR_HORIZONTAL=4, PEGS_ONEPIXEL=4 PEGS_LINEAR_BAR_DOWN=5, PEGS_LINEAR_BAR_UP=6, PEGS_LINEAR_DIAGONAL_DOWN=7 PEGS_LINEAR_DIAGONAL_UP=8, PEGS_RECTANGLE_CROSS=9, PEGS_RECTANGLE_PLUS=10 PEGS_RADIAL_CENTERED=11, PEGS_RADIAL_BOTTOM_RIGHT=12, PEGS_RADIAL_TOP_RIGHT=13 PEGS_RADIAL_BOTTOM_LEFT=14, PEGS_RADIAL_TOP_LEFT=15 PEHS_NONE=0, PEHS_SUBSET=1, PEHS_POINT=2, PEHS_GRAPH=3, PEHS_TABLE=4, PEHS_DATAPOINT=5 PEHS_ANNOTATION=6, PEHS_XAXISANNOTATION=7, PEHS_YAXISANNOTATION=8, PEHS_HORZLINEANNOTATION=9 PEHS_VERTLINEANNOTATION=10, PEHS_MAINTITLE=11, PEHS_SUBTITLE=12, PEHS_MULTISUBTITLE=13 PEHS_MULTIBOTTOMTITLE=14, PEHS_YAXISLABEL=15, PEHS_XAXISLABEL=16, PEHS_YAXIS=17, PEHS_XAXIS=18 PEHS_YAXISGRIDNUMBER=19, PEHS_RYAXISGRIDNUMBER=20, PEHS_XAXISGRIDNUMBER=21 PEHS_TXAXISGRIDNUMBER=22, PEHS_TABLEANNOTATION=23, PEHS_TABLEANNOTATION19=42 PEHS_ZAXISGRIDNUMBER=83, PEHS_ZAXISLINEANNOTATION=84, PEHS_ZOOMXAXISGRIDNUMBER=100 PEHS_HORIZONTAL=0 /* ----- */, PEHS_VERTICAL=1 /* ||||| */ PEHS_FDIAGONAL=2 /* \\\\\ */, PEHS_BDIAGONAL=3 /*, PEHS_CROSS=4 /* +++++ */ PEHS_DIAGCROSS=5 /* xxxxx */ PEHSS_SCROLLING_POINTLABELS=0, PEHSS_SMALL=0, PEHSS_STATIONARY_POINTLABELS=1, PEHSS_MEDIUM=1 PEHSS_LARGE=2 PELAT_GRIDTICK=7, PELAT_GRIDLINE=8, PELAT_GRIDTICKII=14, PELAT_GRIDLINEII=15 PELL_TOP=0, PELL_BOTTOM=1, PELL_LEFT=2, PELL_RIGHT=3 PELOT_ALL_LINES=0, PELOT_MEDIUM_THICK_TUBES=1, PELOT_MEDIUM_TUBES=2, PELOT_MEDIUM_THIN_TUBES=3 PELOT_ALL_TUBES=4 PELS_2_LINE=0, PELS_1_LINE=1, PELS_1_LINE_INSIDE_AXIS=2, PELS_1_LINE_TOP_OF_AXIS=3 PELS_1_LINE_INSIDE_OVERLAP=4, PELS_1_LINE_LEFT_OF_AXIS=5 PELT_THINSOLID=0, PELT_DASH=1, PELT_DOT=2, PELT_DASHDOT=3, PELT_DASHDOTDOT=4, PELT_MEDIUMSOLID=5 PELT_THICKSOLID=6, PELT_MEDIUMTHINSOLID=9, PELT_MEDIUMTHICKSOLID=10, PELT_EXTRATHICKSOLID=11 PELT_EXTRATHINSOLID=12, PELT_EXTRAEXTRATHINSOLID=13, PELT_MEDIUMTHINDASH=16 PELT_MEDIUMTHINDOT=17, PELT_MEDIUMTHINDASHDOT=18, PELT_MEDIUMTHINDASHDOTDOT=19 PELT_MEDIUMDASH=20, PELT_MEDIUMDOT=21, PELT_MEDIUMDASHDOT=22, PELT_MEDIUMDASHDOTDOT=23 PELT_MEDIUMTHICKDASH=24, PELT_MEDIUMTHICKDOT=25, PELT_MEDIUMTHICKDASHDOT=26 PELT_MEDIUMTHICKDASHDOTDOT=27, PELT_THICKDASH=28, PELT_THICKDOT=29, PELT_THICKDASHDOT=30 PELT_THICKDASHDOTDOT=31, PELT_EXTRATHICKDASH=32, PELT_EXTRATHICKDOT=33 PELT_EXTRATHICKDASHDOT=34, PELT_EXTRATHICKDASHDOTDOT=35 PEMAS_GROUP_ALL_AXES=0, PEMAS_NONE=0, PEMAS_SEPARATE_AXES=1, PEMAS_THIN=1, PEMAS_MEDIUM=2 PEMAS_THICK=3, PEMAS_THICKPLUSTICK=4 PEMC_HIDE=0, PEMC_SHOW=1, PEMC_GRAYED=2 PEMLT_3_CHAR=0, PEMLT_1_CHAR=1, PEMLT_NO_MONTH_PROMPT=2 PEMPS_NONE=0, PEMPS_SMALL=1, PEMPS_MEDIUM=2, PEMPS_LARGE=3, PEMPS_MEDIUM_SMALL=4 PEMPS_MEDIUM_LARGE=5 PEMSAA_4=0, PEMSAA_1=1, PEMSAA_8=2 PEMSC_NONE=0, PEMSC_MIN=1, PEMSC_MAX=2, PEMSC_MINMAX=3 PEMWF_VERT_SCROLL=0, PEMWF_HORZ_SCROLL=1, PEMWF_NO_SCROLL=2, PEMWF_HORZ_ZOOM=3 PEMWF_HORZPLUSVERT_ZOOM=4 PEPCP_POINTS_LINES_COLORED=0, PEPCP_POINTS_COLORED=1, PEPCP_LINES_COLORED=2 PEPGS_NONE=0, PEPGS_CURVED=0, PEPGS_VERTICAL=1, PEPGS_BEVELED_INSET=1, PEPGS_VERTICAL_ASCENT=2 PEPGS_BEVELED_HIGHLIGHT=2, PEPGS_HORIZONTAL_RIGHT=3, PEPGS_HORIZONTAL_LEFT=4 PEPGS_LINEAR_BAR_VERTICAL=5, PEPGS_LINEAR_BAR_HORIZONTAL=6, PEPGS_LINEAR_BAR_DOWN=7 PEPGS_LINEAR_BAR_UP=8, PEPGS_LINEAR_DIAGONAL_DOWN=9, PEPGS_LINEAR_DIAGONAL_UP=10 PEPGS_RECTANGLE_CROSS=11, PEPGS_RADIAL_CENTERED=12, PEPGS_RADIAL_BOTTOM_RIGHT=13 PEPGS_RADIAL_TOP_RIGHT=14, PEPGS_RADIAL_BOTTOM_LEFT=15, PEPGS_RADIAL_TOP_LEFT=16 PEPGS_VERTICAL_ASCENT_INVERSE=17 PEPLM_WIREFRAME=0, PEPLM_POINTS=0, PEPLM_SURFACE=1, PEPLM_LINES=1, PEPLM_SURFACE_W_SHADING=2 PEPLM_POINTS_AND_LINES=2, PEPLM_SURFACE_W_PIXELS=3, PEPLM_SURFACE_W_CONTOUR=4 PEPM_SURFACEPOLYGONS=1, PEPM_3DBAR=2, PEPM_POLYGONDATA=3, PEPM_SCATTER=4 PEPS_SMALL=0, PEPS_MEDIUM=1, PEPS_LARGE=2, PEPS_MICRO=3 PEPSA_NEGATIVEDATAOFFSETBY180DEGREES=0, PEPSA_NEGATIVEDATAAPPROACHESCENTER=1 PEPSC_NONE=0, PEPSC_CURRENT_STYLE=1, PEPSC_DEFAULT_MONO=2 PEPT_GDI=0, PEPT_PLUS=0, PEPT_GDIPLUS=1, PEPT_CROSS=1, PEPT_DOT=2, PEPT_DOTSOLID=3 PEPT_SQUARE=4, PEPT_SQUARESOLID=5, PEPT_DIAMOND=6, PEPT_DIAMONDSOLID=7, PEPT_UPTRIANGLE=8 PEPT_UPTRIANGLESOLID=9, PEPT_DOWNTRIANGLE=10, PEPT_DOWNTRIANGLESOLID=11, PEPT_DASH=72 PEPT_PIXEL=73, PEPT_ARROW_N=92, PEPT_ARROW_NE=93, PEPT_ARROW_E=94, PEPT_ARROW_SE=95 PEPT_ARROW_S=96, PEPT_ARROW_SW=97, PEPT_ARROW_W=98, PEPT_ARROW_NW=99 PEPTGI_FIRSTPOINTS=0, PEPTGI_LASTPOINTS=1 PEPTGV_SEQUENTIAL=0, PEPTGV_RANDOM=1 PEQS_NO_STYLE=0, PEQS_LIGHT_INSET=1, PEQS_LIGHT_SHADOW=2, PEQS_LIGHT_LINE=3 PEQS_LIGHT_NO_BORDER=4, PEQS_MEDIUM_INSET=5, PEQS_MEDIUM_SHADOW=6, PEQS_MEDIUM_LINE=7 PEQS_MEDIUM_NO_BORDER=8, PEQS_DARK_INSET=9, PEQS_DARK_SHADOW=10, PEQS_DARK_LINE=11 PEQS_DARK_NO_BORDER=12 PERBS_ACTUALSIZE_CENTERED=0, PERBS_ACTUALSIZE_N=1, PERBS_ACTUALSIZE_NW=2, PERBS_ACTUALSIZE_W=3 PERBS_ACTUALSIZE_SW=4, PERBS_ACTUALSIZE_S=5, PERBS_ACTUALSIZE_SE=6, PERBS_ACTUALSIZE_E=7 PERBS_ACTUALSIZE_NE=8, PERBS_MEDIUM_CENTERED=9, PERBS_MEDIUM_N=10, PERBS_MEDIUM_NW=11 PERBS_MEDIUM_W=12, PERBS_MEDIUM_SW=13, PERBS_MEDIUM_S=14, PERBS_MEDIUM_SE=15 PERBS_MEDIUM_E=16, PERBS_MEDIUM_NE=17, PERBS_SMALL_CENTERED=19, PERBS_SMALL_N=20 PERBS_SMALL_NW=21, PERBS_SMALL_W=22, PERBS_SMALL_SW=23, PERBS_SMALL_S=24, PERBS_SMALL_SE=25 PERBS_SMALL_E=26, PERBS_SMALL_NE=27, PERBS_LARGE_CENTERED=29, PERBS_LARGE_N=30 PERBS_LARGE_NW=31, PERBS_LARGE_W=32, PERBS_LARGE_SW=33, PERBS_LARGE_S=34, PERBS_LARGE_SE=35 PERBS_LARGE_E=36, PERBS_LARGE_NE=37, PERBS_DATASIZED=39 PERD_WIREFRAME=0, PERD_PLOTTINGMETHOD=1, PERD_FULLDETAIL=2 PERE_GDI=0, PERE_HYBRID=1, PERE_GDIPLUS=2, PERE_GDI_TURBO=3, PERE_DIRECT2D=4, PERE_DIRECT3D=5 PERI_INCBY15=0, PERI_INCBY10=1, PERI_INCBY5=2, PERI_INCBY2=3, PERI_INCBY1=4, PERI_DECBY1=5 PERI_DECBY2=6, PERI_DECBY5=7, PERI_DECBY10=8, PERI_DECBY15=9 PESA_ALL=0, PESA_AXISLABELS=1, PESA_GRIDNUMBERS=2, PESA_NONE=3, PESA_LABELONLY=4, PESA_EMPTY=5 PESB_MOUSE_WHEEL_UP=100, PESB_MOUSE_WHEEL_DOWN=101 PESBB_WHILEROTATING=0, PESBB_ALWAYS=1, PESBB_NEVER=2 PESBS_NONE=0, PESBS_THICK_SMOOTH=1, PESBS_MEDIUM_SMOOTH=2, PESBS_THIN_SMOOTH=3 PESC_POLAR=0, PESC_NONE=0, PESC_SMITH=1, PESC_TOPLINES=1, PESC_ROSE=2, PESC_BOTTOMLINES=2 PESC_ADMITTANCE=3, PESC_TOPCOLORS=3, PESC_BOTTOMCOLORS=4 PESCL_NONE=0, PESCL_SECOND_PLUS_FIRST=1, PESCL_SECOND_ONLY=2 PESD_AUTO=0, PESD_ALWAYS=1, PESD_NEVER=2 PESH_MONOCHROME=0, PESH_BOTH=1 PESM_SHOW_ANNOTATIONS=0, PESM_ALWAYS=1, PESM_NEVER=2 PESPL_PERCENTPLUSLABEL=0, PESPL_PERCENT=1, PESPL_LABEL=2, PESPL_NONE=3 PESPM_NONE=0, PESPM_HIGHLOWBAR=1, PESPM_HIGHLOWLINE=2, PESPM_HIGHLOWCLOSE=3 PESPM_OPENHIGHLOWCLOSE=4, PESPM_BOXPLOT=5, PESPM_HIGHLOWAREA=6 PESPMG_NONE=0, PESPMG_BAR=1, PESPMG_GLASS=2 PESS_NONE=0, PESS_WHITESHADING=0, PESS_FINANCIAL=1, PESS_COLORSHADING=1 PEST_CARDINAL=0, PEST_BSPLINE=1 PESTA_CENTER=0, PESTA_LEFT=1, PESTA_RIGHT=2 PESTM_TICKS_INSIDE=0, PESTM_TICKS_OUTSIDE=1, PESTM_TICKS_HIDE=2 PETAAL_TOP_FULL_WIDTH=0, PETAAL_TOP_LEFT=1, PETAAL_TOP_CENTER=2, PETAAL_TOP_RIGHT=3 PETAAL_BOTTOM_FULL_WIDTH=4, PETAAL_BOTTOM_LEFT=5, PETAAL_BOTTOM_CENTER=6 PETAAL_BOTTOM_RIGHT=7, PETAAL_TOP_TABLE_SPACED=8, PETAAL_BOTTOM_TABLE_SPACED=9 PETAAL_DATA_UNITS=10, PETAAL_NEW_ROW=100 PETAB_DROP_SHADOW=0, PETAB_SINGLE_LINE=1, PETAB_THIN_LINE=1, PETAB_NO_BORDER=2, PETAB_INSET=3 PETAB_THICK_LINE=4 PETAHO_HORZ=0, PETAHO_90=1, PETAHO_270=2 PETAJ_LEFT=0, PETAJ_CENTER=1, PETAJ_RIGHT=2 PETAL_TOP_CENTER=0, PETAL_TOP_LEFT=1, PETAL_LEFT_CENTER=2, PETAL_BOTTOM_LEFT=3 PETAL_BOTTOM_CENTER=4, PETAL_BOTTOM_RIGHT=5, PETAL_RIGHT_CENTER=6, PETAL_TOP_RIGHT=7 PETAL_INSIDE_TOP_CENTER=8, PETAL_INSIDE_TOP_LEFT=9, PETAL_INSIDE_LEFT_CENTER=10 PETAL_INSIDE_BOTTOM_LEFT=11, PETAL_INSIDE_BOTTOM_CENTER=12, PETAL_INSIDE_BOTTOM_RIGHT=13 PETAL_INSIDE_RIGHT_CENTER=14, PETAL_INSIDE_TOP_RIGHT=15, PETAL_INSIDE_PIXEL_UNITS=16 PETAL_INSIDE_AXIS=100, PETAL_INSIDE_AXIS_0=100, PETAL_INSIDE_AXIS_1=101 PETAL_INSIDE_AXIS_2=102, PETAL_INSIDE_AXIS_3=103, PETAL_INSIDE_AXIS_4=104 PETAL_INSIDE_AXIS_5=105, PETAL_OUTSIDE_AXIS=200, PETAL_OUTSIDE_AXIS_0=200 PETAL_OUTSIDE_AXIS_1=201, PETAL_OUTSIDE_AXIS_2=202, PETAL_OUTSIDE_AXIS_3=203 PETAL_OUTSIDE_AXIS_4=204, PETAL_OUTSIDE_AXIS_5=205, PETAL_INSIDE_TABLE=300 PETAL_OVERLAP_AXIS=400, PETAL_OVERLAP_AXIS_0=400, PETAL_OVERLAP_AXIS_1=401 PETAL_OVERLAP_AXIS_2=402, PETAL_OVERLAP_AXIS_3=403, PETAL_OVERLAP_AXIS_4=404 PETAL_OVERLAP_AXIS_5=405 PETAM_NONE=0, PETAM_NO_HOTSPOTS=1, PETAM_FULL=2 PETGL_NO_GRID_LINES=0, PETGL_VERT=1, PETGL_HORZ=2, PETGL_VERT_AND_HORZ=3 PETLT_12HR_AM_PM=0, PETLT_12HR_NO_AM_PM=1, PETLT_24HR=2 PETM_NONE=0, PETM_OIT=1 PETPT_MOUSEMOVE=0, PETPT_CURSORMOVE=1 PETRH_DEFAULT=0, PETRH_SINGLEBITPERPIXELGRIDFIT=1, PETRH_SINGLEBITPERPIXEL=2 PETRH_ANTIALIASGRIDFIT=3, PETRH_ANTIALIAS=4, PETRH_CLEARTYPEGRIDFIT=5 PETS_NO_TEXT=0, PETS_GRIDSTYLE=0, PETS_BOLD_TEXT=1, PETS_THICK=1, PETS_ALL_TEXT=2, PETS_DOT=2 PETS_DASH=3, PETS_1UNIT=4, PETS_THIN=5 PETW_GRAPHED=0, PETW_ALLSUBSETS=1 PEVB_NONE=0, PEVB_TOP=1, PEVB_BOTTOM=2, PEVB_TOPANDBOTTOM=3 PEVM_CENTER=0, PEVM_DATA_LOCATION=1 PEVS_COLOR=0, PEVS_MONO=1, PEVS_MONOWITHSYMBOLS=2 PEYMDS_OS_CONTROLLED=0, PEYMDS_YMD=1, PEYMDS_MDY=2, PEYMDS_LEGACY=3 PEZIO_NORMAL=0, PEZIO_RECT=1, PEZIO_LINE=2 PEZL_NONE=0, PEZL_AXIS=1, PEZL_AXIS_HORIZONTAL=2, PEZL_AXIS_VERTICAL=3, PEZL_AXIS_SHAPE=4 PEZL_AXIS_SQUARE=5 PEZPM_LINE=0, PEZPM_AREA=1, PEZPM_ORIGINAL=2 PEZS_FRAMED_RECT=0, PEZS_RO2_NOT=1 PEZWB_BORDERTYPE=0, PEZWB_THIN_LINE=1, PEZWB_NO_BORDER=2 PEappendfromURL=PEappendfromURLW PEchangeresources=PEchangeresourcesW PEcopybitmaptofile=PEcopybitmaptofileW PEcopyemftofile=PEcopyemftofileW PEcopyjpegtofile=PEcopyjpegtofileW PEcopymetatofile=PEcopymetatofileW PEcopypngtofile=PEcopypngtofileW PEcopysvgtofile=PEcopysvgtofileW PEcreatefromfile=PEcreatefromfileW PEexporttext=PEexporttextW PEgettextmetrics=PEgettextmetricsW PElaunchtextexport=PElaunchtextexportW PEloadfromURL=PEloadfromURLW PEloadfromfile=PEloadfromfileW PEsavetofile=PEsavetofileW PEserializetofile=PEserializetofileW PEszget=PEszgetW PEszset=PEszsetW PEvget=PEvgetW PEvgetcell=PEvgetcellW PEvgetcellEx=PEvgetcellExW PEvset=PEvsetW PEvsetcell=PEvsetcellW PEvsetcellEx=PEvsetcellExW SOLID_SURFACE_COLOR=32001 WIRE_FRAME_COLOR=32000 ====================================================================== NOTIFICATION MESSAGES (handle in OnNotify or message map) ====================================================================== PEWN_CURSORMOVE (WM_USER + 2929) PEWN_CLICKED (WM_USER + 2930) PEWN_DBLCLICKED (WM_USER + 2931) PEWN_SETFOCUS (WM_USER + 2932) PEWN_KILLFOCUS (WM_USER + 2933) PEWN_CHANGINGPARMS (WM_USER + 2937) PEWN_ZOOMIN (WM_USER + 2942) PEWN_ZOOMOUT (WM_USER + 2943) PEWN_RBUTTONCLK (WM_USER + 2944) PEWN_MOUSEMOVE (WM_USER + 2945) PEWN_RBUTTONDBLCLK (WM_USER + 2946) PEWN_LBUTTONUP (WM_USER + 2947) PEWN_RBUTTONUP (WM_USER + 2948) PEWN_PRECURSORMOVE (WM_USER + 2949) PEWN_CUSTOMIZEDLG (WM_USER + 2950) PEWN_POPUPMENU (WM_USER + 2951) PEWN_KEYDOWN (WM_USER + 2952) PEWN_MULTIAXESSIZE (WM_USER + 2953) PEWN_MULTIAXESSIZECHANGE (WM_USER + 2954) PEWN_CUSTOMGRIDNUMBERS (WM_USER + 2955) PEWN_CUSTOMMENU (WM_USER + 2956) PEWM_PARENTVIEW_RESIZED (WM_USER + 2934) PEWM_INVALIDATERECT (WM_USER + 2938) PEWM_FSCB_ADDSTRING (WM_USER + 2939) PEWM_DIRLISTNOTIFY (WM_USER + 2940) PEWM_ABORTDIALOGNEXTPAGE (WM_USER + 2941) PEWN_PREHSCROLL (WM_USER + 2957) PEWN_PREVSCROLL (WM_USER + 2958) PEWN_PREPRINT (WM_USER + 2959) PEWN_TAMOVED (WM_USER + 2960) PEWN_TASIZEDLEFT (WM_USER + 2961) PEWN_TASIZEDRIGHT (WM_USER + 2962) PEWN_MBUTTONCLK (WM_USER + 2963) PEWN_MBUTTONDBLCLK (WM_USER + 2964) PEWN_MBUTTONUP (WM_USER + 2965) PEWN_GRAPHANNOTATIONMOVED (WM_USER + 2966) PEWM_INVALIDATERECTUPDATE (WM_USER + 2967) PEWN_CUSTOMTRACKINGDATATEXT (WM_USER + 2968) PEWN_CUSTOMTRACKINGOTHERTEXT (WM_USER + 2969) HOTSPOT TYPES (PEnget PEP_nHOTSPOTTYPE after PEgethotspot): PEHS_NONE=0, PEHS_SUBSET=1, PEHS_POINT=2, PEHS_GRAPH=3, PEHS_TABLE=4, PEHS_DATAPOINT=5 PEHS_ANNOTATION=6, PEHS_XAXISANNOTATION=7, PEHS_YAXISANNOTATION=8, PEHS_HORZLINEANNOTATION=9 PEHS_VERTLINEANNOTATION=10, PEHS_MAINTITLE=11, PEHS_SUBTITLE=12, PEHS_MULTISUBTITLE=13 PEHS_MULTIBOTTOMTITLE=14, PEHS_YAXISLABEL=15, PEHS_XAXISLABEL=16, PEHS_YAXIS=17, PEHS_XAXIS=18 PEHS_YAXISGRIDNUMBER=19, PEHS_RYAXISGRIDNUMBER=20, PEHS_XAXISGRIDNUMBER=21 PEHS_TXAXISGRIDNUMBER=22, PEHS_TABLEANNOTATION=23, PEHS_TABLEANNOTATION19=42 PEHS_ZAXISGRIDNUMBER=83, PEHS_ZAXISLINEANNOTATION=84, PEHS_ZOOMXAXISGRIDNUMBER=100 ------------------------------------------------------------------------------ ### FILE: pe-data-handling.txt === ProEssentials Data Handling (knowledge rev 4.1) Patterns === DATA LOADING PATTERNS (choose based on data source and performance needs): PATTERN 1 -- DIRECT INDEXING (simple, small datasets) Set Subsets and Points, then assign Y[subset, point] = value in loops. For Pesgo, also assign X[subset, point]. For Pe3do, also Z. Best for: <10,000 points, static data, demos. PATTERN 2 -- FASTCOPY (medium datasets, bulk load) Build a float[,] array in your code, then call Y.FastCopyFrom(array). Avoids per-element interop overhead. Overloads exist for 1D arrays and jagged arrays. Use: pe_query.py methods "PeData.Y" to see all signatures. Best for: <250K points. PATTERN 3 -- USEDATAATLOCATION (large/real-time, zero-copy) Points your managed array directly to the native DLL -- no copy at all. Call Y.UseDataAtLocation(array, bufferSize). Data stays in your memory. CRITICAL: You must keep the array pinned/alive while chart uses it. Best for: >250K points, real-time where data changes externally, or when multiple charts share the same data array (two charts can point to one array). PATTERN 4 -- APPENDDATA (streaming/real-time) Call Y.AppendData(newValues, amountPerSubset) to push new data. Automatically shifts existing data left. Combine with CircularBuffers for better performance on large buffers. PATTERN 5 -- BINDDATA (database/DataReader) Call Y.BindData(dataReader, startSubset, startPoint) to load directly from ADO.NET DataReader or DataView. Convenient but slower than FastCopy. PATTERN 6 -- JAGGED DATA (subsets with different point counts) When subsets have different point counts, enable JaggedData mode. REQUIREMENT: JaggedData requires RenderEngine = Direct2D. Direct3D does not support JaggedData. Setup pattern: PeData.JaggedData = true; PeData.Subsets = N; PeData.Points = 1; // Recommended practice. On ReinitializeResetImage(), // Points auto-adjusts to maximum across all subsets. Setting 1 is safe // in case JaggedData gets changed or reset unexpectedly. Three methods to pass jagged data (same thresholds as Patterns 1-3): 6a -- DIRECT INDEXING (spoon-fed, <10K points per subset): PeData.X[subset, point] = value; // auto-expands per-subset storage PeData.Y[subset, point] = value; Pre-allocation options to avoid incremental reallocation: - Set last element first: PeData.X[0, 11999] = 0; forces allocation - Use SetJaggedPointsX(subset, size) / SetJaggedPointsY(subset, size) See Example 142. 6b -- COPYFROMJAGGED (block copy, <250K points per subset): PeData.X.CopyFromJagged(sourceArray, subsetIndex); -- copies full sourceArray.Length into that subset PeData.X.CopyFromJagged(sourceArray, subsetIndex, nElements); -- copies only nElements from sourceArray (use when array is oversized or being reused across subsets with different counts) Also: FastCopyFromJagged(source, subset) -- similar, sets subset size from source array length. See Example 143. 6c -- USEJAGGERDDATAATLOCATION (zero-copy pointer, >250K or shared data): PeData.Y.UseJaggedDataAtLocation(localArray, subsetIndex); Data stays in your memory -- no copy. Must keep array alive. NOTE: Different signature from non-jagged UseDataAtLocation(array, bufferSize). The second parameter is subsetIndex, NOT bufferSize. See Example 144. DUPLICATEDATA -- SHARED X/Y/Z ARRAYS ACROSS SUBSETS: When all subsets share identical X data (common in Pesgo, Pepso, Pe3do), avoid redundant data with: PeData.DuplicateDataX = DuplicateData.PointIncrement; Then provide X data for only ONE subset (subset 0). The chart reuses it for all subsets. Enum values: None (0) -- unique data per subset (default) PointIncrement (1) -- one array shared across all subsets SubsetIncrement (2) -- one array shared across all points Also applies to DuplicateDataY and DuplicateDataZ. Works with both jagged and non-jagged data modes. Supported by: Pesgo, Pepso, Pe3do (not Pego -- Pego has no X data array). DATA ORGANIZATION: SubsetByPoint (default true): Y[subset, point] -- standard layout. SubsetByPoint = false: Y[point, subset] -- transposed, sometimes easier for row-oriented data sources. NULL DATA HANDLING: See dedicated pe-nulldata knowledge file for full coverage. Key points: Default NullDataValue=0 (zeros are null by default), NullDataGaps=false by default (lines bridge over nulls), use Filter2D.Disable when data has scattered nulls. PEGO VS PESGO X-AXIS DATA: Pego: No X data array. X-axis is sequential integers. Category labels via PeString.PointLabels[i]. Date mode: set DateTimeMode + DeltaX for uniform time steps, or DeltasX[] for variable steps. Pesgo: Requires PeData.X[subset, point] with actual numeric values. Supports irregular spacing, multiple X arrays per subset, true XY scatter. REFRESHING AFTER DATA CHANGES: PeFunction.ReinitializeResetImage() -- call after data changes. For real-time, this is called in the timer tick after AppendData. For one-time load, call once after all data is set. ------------------------------------------------------------------------------ ### FILE: pe-pego-patterns.txt === ProEssentials Pego (knowledge rev 4.2) (Graph Object) Patterns === Pego is the standard Graph Object for categorical/sequential X-axis charts. Bar, line, area, OHLC, ribbon, and more. ALWAYS query pe_query.py for exact paths -- this file provides conceptual understanding only. CRITICAL -- PLOTTING METHOD ENUM: Pego uses GraphPlottingMethod (NOT SGraphPlottingMethod or others). Pego1.PePlot.Method = GraphPlottingMethod.Bar; The enum has 27 values including: Line(0), Bar(1), Point(2), Area(3), AreaStacked(4), BarStacked(6), PointsPlusSpline(12), Spline(13), Histogram(14), PointsPlusLine(16), HorizontalBar(17), Step(20), Ribbon(21), DemographicPyramid(24), SplineArea(25), SplineRibbon(26). Query: pe_query.py enum "GraphPlottingMethod" WARNING: Integer values differ from SGraphPlottingMethod. For example, Point=2 in GraphPlottingMethod but Point=1 in SGraphPlottingMethod. Using the wrong enum produces silent runtime bugs. X-AXIS DATA MODEL: Pego X-axis is categorical/sequential -- no PeData.X array needed. PeData.Points = number of categories along X-axis. PeString.PointLabels[p] = category labels (e.g., months, names). PeString.PointLabelsII[row, col] = multi-row hierarchical labels. See pe-pointlabelsII knowledge file for full details. Data goes in PeData.Y[subset, point] only. FLOATING STACKED BARS (Example 025): PeData.Z defines a floating baseline for stacked bar charts. Instead of stacking from zero, bars float above Z values. Three requirements: 1) PePlot.Method = GraphPlottingMethod.BarStacked (or HorizontalStackedBar) 2) PePlot.Option.FloatingStackedBars = true 3) PeData.Z[0, p] populated with baseline values for each point Z data only needs subset 0 -- it defines where the entire stack floats from. Works for both vertical BarStacked and HorizontalStackedBar methods. Use PePlot.Allow.HorzBarStacked = true to let users switch to horizontal via popup menu. PeGrid.InFront = true is useful with large stacked bars so grid lines remain visible on top. SUBSET VISIBILITY AND DRAW ORDER: PeData.SubsetsToShow[subsetIndex] = priority (0--9): 0 = hidden, 1--9 = visible, higher values drawn first (behind). Simpler than RandomSubsetsToGraph for basic show/hide. PeData.RandomSubsetsToGraph -- lists explicit subset indices to include. Order of indices controls draw order. Related to ScrollingSubsets. PeTable.SubsetsToTable -- independently controls table row order/visibility. PeLegend.SubsetsToLegend -- independently controls legend order/visibility. These four properties give independent control of plotting, legend, and table ordering. See Example 033 and pe-legends knowledge file. PEGO BASE (Example 000) PROVIDES: 4 subsets x 12 points, Area method, DataShadows, stacked/ribbon allowed, glass bars, gradient areas/splines, DarkNoBorder QuickStyle, BitmapGradient, Large fonts, bold text, dotted grid lines, data table below chart, one-line legend, HorzAndVert zoom, mouse dragging, Direct2D render. KEY: Always query exact paths: pe_query.py enum "GraphPlottingMethod" pe_query.py props "PointLabels,BarWidth,BarGap,FloatingStackedBars" ------------------------------------------------------------------------------ ### FILE: pe-pesgo-patterns.txt === ProEssentials Pesgo (knowledge rev 4.5) (Scientific Graph Object) Patterns === Pesgo is the Scientific Graph Object for continuous numeric X-axis charts. Scatter, line, spline, bubble, contour, and more. ALWAYS query pe_query.py for exact paths -- this file provides conceptual understanding only. CRITICAL -- PLOTTING METHOD ENUM: Pesgo uses SGraphPlottingMethod (NOT GraphPlottingMethod or others). Pesgo1.PePlot.Method = SGraphPlottingMethod.PointsPlusSpline; The enum has 26 values including: Line(0), Point(1), Stick(2), PointsPlusBestFitLine(3), PointsPlusBestFitCurve(4), PointsPlusSpline(5), Spline(6), Bubble(7), PointsPlusLine(8), Area(9), Bar(10), SpecificPlotMode(11), Step(12), Ribbon(13), ContourLines(14), ContourColors(15), AreaStacked(16), SplineArea(22), SplineRibbon(23), ContourColorsShadows(24), ContourDelaunay(25). Newer method: RectHeatmap (Rectilinear Heatmap) -- requires Direct3D + ComputeShader. .NET enum value SGraphPlottingMethod.RectHeatmap = 26 (DLL constant PEGPM_RECTHEATMAP = 41 -- DLL and .NET values differ). See ComputeShader section below. Query: pe_query.py enum "SGraphPlottingMethod" WARNING: Integer values differ from GraphPlottingMethod. For example, Point=1 in SGraphPlottingMethod but Point=2 in GraphPlottingMethod. Using the wrong enum produces silent runtime bugs. X-AXIS DATA MODEL: Pesgo X-axis is continuous numeric -- requires explicit PeData.X[s,p] values. Both PeData.X[subset, point] and PeData.Y[subset, point] must be populated. X-axis labels are auto-generated from numeric scale (not PointLabels). BUBBLE CHART (SGraphPlottingMethod.Bubble): Bubble charts add a third dimension via PeData.Z[s,p] which controls bubble radius. X positions horizontally, Y positions vertically, Z sizes. Key pattern: PePlot.Method = SGraphPlottingMethod.Bubble; PeData.Z[s, p] = sizeValue; // larger Z = larger bubble Optional bubble-specific properties (defaults are usually fine): PePlot.Option.BubbleSize -- Small/Medium/Large (controls max size) PePlot.Option.BubbleGradientStyle -- None/Radial/Beveled PePlot.Option.BubbleSizeFormulaArea -- true=area-based, false=diameter IMPORTANT -- Allow.* method restrictions for bubble/scatter charts: PePlot.Allow.Bubble = true; // enable Bubble in right-click menu Disable methods that look wrong with scatter data: PePlot.Allow.Spline = false; PePlot.Allow.PointsPlusSpline = false; PePlot.Allow.BestFitLine = false; PePlot.Allow.BestFitCurve = false; PePlot.Allow.Area = false; PePlot.Allow.SplineArea = false; HotSpot sizing: Use PeUserInterface.HotSpot.Size = HotSpotSize.Large for bubble charts -- variable bubble sizes need larger click targets. See Example 126. PROGRAMMATIC ZOOMING (common customer pattern): Customers frequently need to programmatically focus on a data region -- e.g., most recent time window, anomaly region, or smart UX that auto- navigates to interesting data. Use ZoomMode = true with ZoomMinX/ZoomMaxX. When using MultiAxesSubsets, AllowZooming MUST be Horizontal (not HorzAndVert) because ZoomMinY/ZoomMaxY can't address multiple Y scales. Enable PePlot.ZoomWindow.Show = true for an overview navigation strip. See pe-zoom knowledge file for full details and code pattern. See Example 124. LARGE DATASET HANDLING: For 10K+ points, use FastCopyFrom with flat arrays for bulk data transfer: float[] yData = new float[subsets * points]; // fill array... Pesgo1.PeData.Y.FastCopyFrom(yData, subsets * points); Same pattern for PeData.X.FastCopyFrom. CONTOUR DATA MODEL (X, Y, Z -- three arrays): Contour plotting methods (ContourLines, ContourColors, ContourColorsShadows, ContourDelaunay) use a DIFFERENT data model from standard scatter/line: PeData.X[s,p] = spatial X coordinate PeData.Y[s,p] = spatial Y coordinate PeData.Z[s,p] = contour value (elevation, temperature, etc.) Subsets = grid rows, Points = grid columns. Z holds the values being contoured. Do NOT confuse with standard Pesgo where Y holds the data values. Key contour config: PeLegend.ContourStyle = true -- continuous color legend PeLegend.ContourLegendPrecision -- decimal control PeColor.ContourColorBlends -- number of color transitions PeColor.ContourColorSet -- predefined color palette enum PeColor.SubsetShades -- controls contour line colors PeGrid.Configure.AutoMinMaxPadding = 0 -- contour extends to grid edges Contour charts should disable non-contour Allow.* plotting methods via PePlot.Allow.Line = false, Allow.Point = false, Allow.Bar = false, etc. when UI menus are enabled, since XYZ data renders poorly as line/area/etc. RenderEngine: GdiPlus, Direct2D, and Direct3D all support contour lines. DIRECT3D CONTOUR GOTCHA: When using RenderEngine.Direct3D for contour performance, Pesgo needs the same 3D rebuild flags as Pe3do: Force3dxVerticeRebuild = true and Force3dxNewColors = true before ReinitializeResetImage(). Without these, contour colors and geometry may not update after data or color changes. See Example 121 (ContourLines) and Example 120 (ContourColors). COMPUTESHADER (Direct3D GPU rendering -- expanded in v10): PeData.ComputeShader = true enables GPU-side construction when RenderEngine = Direct3D. Default false (CPU-side construction). Most beneficial for real-time / high-density data, but also improves general rendering quality across all supported modes. Supported plotting methods on Pesgo Direct3D + ComputeShader: Line (now supports dash and dot of varying thickness) Area Point (max 4 vertices, 6 indices per symbol; ResourceBitmaps fully supported) Bar (best with one bar per axis) ContourColors ContourLines Pego also supports ComputeShader (Direct3D, dash/dot lines, etc.). Less commonly used because Pego has no X data array, but valuable for large Y-only datasets (e.g., 500K+ points). SUBSETS / RIGHT-Y AXIS UNDER COMPUTESHADER (critical): For Pesgo/Pego with RenderEngine = Direct3D and ComputeShader = True, define subsets via PlottingMethods[] -- including subsets that plot against the right Y axis. Do NOT use ComparisonSubsets or RYAxisComparisonSubsets when ComputeShader = True; use PlottingMethods[] (with the OnRightAxis offset) instead. SORT PLOT METHODS (ComputeShader): For Pesgo/Pego, RenderEngine = Direct3D, ComputeShader = True, it is best to disable plot-method sorting. The .NET property is SortPlotMethods (DLL constant PEP_bDISABLESORTPLOTMETHODS) and its polarity is inverted relative to its name: setting it TRUE DISABLES sorting (draws methods in subset-index order): Pesgo1.PePlot.Option.SortPlotMethods = true; // true = disable sorting There is no separate "DisableSortPlotMethods" .NET property. DATA TYPE CONSISTENCY (Direct3D): UsingXDataii, UsingYDataii, and UsingZDataii must all be the same value (all true or all false). You cannot mix float and double under RenderEngine = Direct3D. (Note the .NET casing is lowercase "ii": PeData.UsingXDataii, etc.) HOTSPOTS / REAL-TIME TRADE-OFF: The hotspot octree is still built CPU-side on a separate thread after the GPU render (250-500ms on large charts). For maximum real-time throughput, disable the properties that trigger hotspot construction. On Pesgo (and Pego), these are: PeUserInterface.HotSpot.Data = false; PeUserInterface.Cursor.PromptTracking = false; (HighlightColor is the third trigger but applies only to Pe3do -- see pe-pe3do-patterns.) If any of these is active, ComputeShader still runs but the hotspot CPU build runs in parallel. FILTER2D3D (very large datasets): PeData.Filter2D3D -- companion property recommended for ComputeShader datasets of roughly 1M+ points. Reduces vertex load via GPU-side filtering. RECTILINEAR HEATMAP (v10.0.0.26+, Pesgo only, Direct3D + ComputeShader): A new plotting method, Rectilinear Heatmap, supported on Pesgo when RenderEngine = Direct3D and ComputeShader = True. (Allow.RectHeatmap and ComputeShader are Sg-scope; this is a Pesgo feature.) Pesgo1.PePlot.Allow.RectHeatmap = true; // shows the option in the // customization dialog and // popup menus, letting the // user switch between // ContourColors and RectHeatmap Pesgo1.PePlot.Method = SGraphPlottingMethod.RectHeatmap; // .NET value 26 Validated against the API: PePlot.Allow.RectHeatmap (bool, Sg) and SGraphPlottingMethod.RectHeatmap = 26 both exist. NOTE: the bundled Example 122 currently ships using SGraphPlottingMethod.ContourColorsShadows (Direct3D + ComputeShader) and does NOT yet set Allow.RectHeatmap; it is the natural example to extend with the RectHeatmap toggle. DLL/CPP constants: PEGPM_RECTHEATMAP 41 // plotting-method constant (DLL value) PEP_bALLOWRECTHEATMAP 1611 // allow flag (dialog + popup menu toggle) DIRECT3D LINE TYPE CONSTRAINT (Pesgo and Pego): RenderEngine.Direct3D restricts SubsetLineTypes: ComputeShader = false -- solid styles only. ComputeShader = true -- solid + Dash + Dot of varying thickness. NEVER on Direct3D -- DashDot, DashDotDot. Setting an unsupported style under Direct3D silently falls back to solid -- a common "compiles fine, looks wrong" gotcha. For DashDot patterns, use RenderEngine.Hybrid or RenderEngine.GdiPlus. See Example 115 for dash/dot lines via Direct3D + ComputeShader. LOG SCALE SUPPORT: PeGrid.Configure.XAxisScaleControl = ScaleControl.Log; PeGrid.Configure.YAxisScaleControl = ScaleControl.Log; PeGrid.Option.LogScaleExpLabels = true; // exponent notation (10^3, 10^4) Pesgo handles log-log, log-linear, and linear-log combinations. SUBSET VISIBILITY AND DRAW ORDER: PeData.SubsetsToShow[subsetIndex] = priority (0--9): 0 = hidden, 1--9 = visible, higher values drawn first (behind). Simpler than RandomSubsetsToGraph for basic show/hide. PeData.RandomSubsetsToGraph -- lists explicit subset indices to include. Order of indices controls draw order. PeLegend.SubsetsToLegend -- independently controls legend order/visibility. PeGrid.SubsetAxes[subsetIndex] = axisIndex -- overrides default sequential axis assignment from MultiAxesSubsets. See Example 013. See pe-legends knowledge file for legend ordering details. PESGO BASE (Example 100) PROVIDES: 4 subsets x 120 points, PointsPlusSpline method, sine wave data, DarkNoBorder QuickStyle (no BitmapGradient), Large fonts, bold text, dotted grid lines, SeparateAxes multi-axis, AutoMinMaxPadding=1, scrolling horz zoom, tooltip cursor with XY values, HorzAndVert zoom, mouse dragging, Direct2D render. KEY: Always query exact paths: pe_query.py enum "SGraphPlottingMethod" pe_query.py props "XAxisScaleControl,YAxisScaleControl" pe_query.py enum "ScaleControl" pe_query.py props "BubbleSize,BubbleGradientStyle,BubbleSizeFormulaArea" ------------------------------------------------------------------------------ ### FILE: pe-pe3do-patterns.txt === ProEssentials Pe3do (knowledge rev 4.1) (3D Scientific Graph) Patterns === Pe3do is the 3D Scientific Graph Object. It renders surfaces, 3D bars, scatter plots, waterfalls, and contour maps using X, Y, Z data arrays and Direct3D rendering. ALWAYS query pe_query.py for exact paths. POLYMODE + PLOTTINGMETHOD (the two-level dispatch system): Pe3do chart type is determined by TWO properties together. PolyMode selects the CHART CATEGORY. PlottingMethod selects the RENDERING VARIANT within that category. PlottingMethod meaning CHANGES depending on PolyMode. PePlot.PolyMode -- set FIRST for non-surface charts: SurfacePolygons (1) -- default, grid data --> surface mesh ThreeDBar (2) -- grid data --> one bar per cell PolygonData (3) -- raw polygon vertices --> custom 3D shapes Scatter (4) -- XYZ points --> scatter, lines, or waterfall PePlot.Method = ThreeDGraphPlottingMethod enum: WARNING: Pe3do uses ThreeDGraphPlottingMethod (NOT GraphPlottingMethod). For SurfacePolygons, ThreeDBar, PolygonData: 0 = WireFrame 1 = Surface 2 = Surface with Shading 3 = Surface with Pixels 4 = Surface with Contours (SurfacePolygons ONLY, not Bar/Polygon) For Scatter: 0 = Points 1 = Lines 2 = Points + Lines 3 = Area (waterfall slices) DATA STRUCTURE: PeData.Subsets x PeData.Points -- grid dimensions PeData.X[s,p] -- X coordinate (horizontal) PeData.Y[s,p] -- Y coordinate (vertical, the "value" axis) PeData.Z[s,p] -- Z coordinate (depth) PeString.SubsetLabels[s] -- Z-axis labels PeString.PointLabels[p] -- X-axis labels Large datasets: use PeData.X.FastCopyFrom(array, count) for performance. DUPLICATEDATA OPTIMIZATION (large uniform grids): When all subsets share the same X values (uniform grid), avoid passing full X[s,p] arrays. Instead pass a single row and set: PeData.DuplicateDataX = DuplicateData.PointIncrement; PeData.DuplicateDataZ = DuplicateData.SubsetIncrement; Then FastCopyFrom X with nPoints values, Z with nSubsets values, and Y with the full nSubsets*nPoints values. Set DuplicateData properties BEFORE calling FastCopyFrom. Saves memory and data transfer -- no change in behavior. See Example 408 (large surface with 1001x1001 grid). WATERFALL PATTERN (PolyMode=Scatter + Method=Area): A waterfall plot is Scatter mode with area rendering: PePlot.PolyMode = PolyMode.Scatter; PePlot.Method = ThreeDGraphPlottingMethod.Three; // Area Then layer waterfall-specific properties: PePlot.Option.WaterfallContours = true; -- contour-color the slices PePlot.Option.WaterfallBorders = true; -- draw borders on slices PeColor.BarBorderColor = Color...; -- border color PeColor.ContourColorSet = ContourColorSet.BlueCyanGreen...; PeColor.ContourColorBlends = 20; -- interpolation steps PeColor.ContourColorAlpha = 255; -- affects lines/points only, NOT the area fill. WaterfallContours overrides area coloring. SubsetLineTypes per subset control slice edge rendering. See Example 407. DELAUNAY TRIANGULATION (point cloud --> surface): A boolean toggle on default surface mode -- NOT a separate PolyMode: PePlot.Option.Delaunay3D = true; PePlot.Method = ThreeDGraphPlottingMethod.Four; // Surface+Contour PeData.Subsets = 1; -- always 1 subset PeData.Points = N; -- flat list of XYZ points The engine triangulates the XZ plane, uses Y as height. Combine with contour coloring (see below). See Example 414. THREE CONTOUR COLORING APPROACHES: A) SubsetColors as contour bands (most control): Manually set 60-100 SubsetColors to define gradient bands. Set PeLegend.ContourStyle = true. See Example 408. B) Predefined ContourColorSet: PeColor.ContourColorSet = ContourColorSet.BlueCyanGreenYellowBrownWhite; PeColor.ContourColorBlends = N; -- interpolation between colors See Example 407 (waterfall). C) Custom ContourColors array: PeColor.ContourColors.Clear(N); -- set array size PeColor.ContourColors[0..N] = Color...; -- define gradient stops PeColor.ContourColorSet = ContourColorSet.ContourColors; -- activate PeColor.ContourColorBlends = N; -- interpolation between stops See Example 414 (Delaunay). Manual contour range control (PE3DO ONLY -- not available on Pesgo): Pe3do1.PePlot.Option.ManualContourScaleControl = ManualScaleControl.MinMax; Pe3do1.PePlot.Option.ManualContourMin = 80.0F; Pe3do1.PePlot.Option.ManualContourMax = 102.0F; For Pesgo contour Z-range clamping, use PeGrid.Configure instead: PeGrid.Configure.ManualScaleControlZ = ManualScaleControl.MinMax; PeGrid.Configure.ManualMinZ / ManualMaxZ See pe-pesgo-patterns for Pesgo contour details. CUSTOM CONTOUR COLORING VIA SUBSETCOLORS (preferred method): For full control over 3D surface contour colors, manually define SubsetColors to set exact color bands. Same approach as Pesgo contour. Pattern: 1. Define N SubsetColors entries -- each maps to one contour band 2. Define matching SubsetShades for contour line colors 3. Colors distribute evenly across the Y-range (auto or manual) BEST PRACTICE -- Anchor-point interpolation: When you need a smooth gradient across many bands, define anchor colors at key value thresholds and linearly interpolate RGB between anchors. Produces smooth, professional color ramps with precise control at critical thresholds. After setting SubsetColors in Direct3D mode: Pe3do1.PeFunction.Force3dxNewColors = true; Pe3do1.PeFunction.Force3dxVerticeRebuild = true; POLYGON DATA (custom 3D geometry): PolyMode.PolygonData enables raw polygon rendering: PePlot.PolyMode = PolyMode.PolygonData; // PolyMode enum: PolygonData=3 Axes are typically hidden (ShowXAxis/ShowYAxis/ShowZAxis = Empty). Somewhat rare but used for custom 3D shapes (spheres, objects). GraphAnnotation also supports custom geometry for 3D shape annotations. LEGACY PATH -- PolygonData struct via PEvsetW (DLL prop PEP_structPOLYDATA): Gigasoft.ProEssentials.Structs.PolygonData[] poly = ...; PEvsetW(Pe3do1.PeSpecial.HObject, DllProperties.PolyData, poly, nPolys); PolygonData fields: Vertice0X/Y/Z, Vertice1X/Y/Z, Vertice2X/Y/Z, Vertice3X/Y/Z (4 verts), NumberOfVertices (int), PolyColor (int). PolygonData does NOT support ComputeShader; use TriangleData instead. TRIANGLEDATA (recommended) -- replaces the legacy PEP_structPOLYDATA: TriangleData is the recommended replacement for the legacy PolygonData struct/property, and it is what enables ComputeShader = True (PolygonData cannot be used with ComputeShader). Use when PolyMode = PolygonData (PEPM_POLYGONDATA). .NET usage (as in Example 406): Gigasoft.ProEssentials.Structs.TriangleData[] tri = ...; // 2 tris per quad PEvsetW(Pe3do1.PeSpecial.HObject, DllProperties.TriangleData, tri, nTris); Pe3do1.PeConfigure.RenderEngine = RenderEngine.Direct3D; // set FIRST Pe3do1.PeData.ComputeShader = true; // then enable DLL properties: PEP_structTRIANGLEDATA (copies triangles to the chart) and PEP_structTRIANGLEDATAPTR (zero-copy; pass only an IntPtr to the triangle buffer; .NET: pin the memory if the data is < 90K bytes). TriangleData struct (40 bytes per triangle): typedef struct { float X, Y, Z; } Point3D; typedef struct { Point3D Vertices[3]; DWORD PolyColor; /*ARGB*/ } TriangleData; (.NET wrapper exposes Vertice0X/Y/Z .. Vertice2X/Y/Z + PolyColor.) Example 406 builds a sphere as triangles (each quad = 2 triangles). For annotation geometry on ANY PolyMode/chart, use the GraphAnnot variants instead -- see pe-3d-graph-annotations. NOTE: the .NET DllProperties members (DllProperties.TriangleData, DllProperties.GraphAnnotTriangleData and the ...Ptr variants) are confirmed by Examples 406/415. The numeric DLL integer values quoted in change notes (1612/1613/1614/1615) are not present in the bundled DLL metadata; if you call the raw DLL layer directly, confirm those integers against your installed header. The .NET DllProperties members are the safer path. CAMERA AND VIEWING: PeUserInterface.Scrollbar.ViewingHeight -- camera elevation (0--36) PeUserInterface.Scrollbar.DegreeOfRotation -- rotation angle (0--359) PePlot.Option.DxZoom -- initial zoom level (negative = zoomed out) PePlot.Option.DxZoomMax / DxZoomMin -- zoom limits for mouse wheel PePlot.Option.DxViewportPanFactor -- shift+drag sensitivity PePlot.Option.DxViewportX/Y -- viewport translation PePlot.Option.DxFitControlShape -- auto-fit to control shape ISOMETRIC PERSPECTIVE (DxFOV): PePlot.Option.DxFOV -- default 1 (45-degree FOV, strong perspective). Set 8-10 for near-isometric view. FOV = Pi/(4*DxFOV). Setting this auto-adjusts DxZoom; use DegreePrompting to tune. See Example 404. LIGHTING: Pe3do1.PeFunction.SetLight(index, x, y, z) -- position a light source PePlot.Option.LightStrength -- light intensity (0.0--1.0, e.g., 0.65) Different chart types benefit from different light positions: Surface: SetLight(0, 1.5, -1.5, 2.0) 3D Bar: SetLight(0, 4.6, 0.8, 9.5) SMOOTH INTERACTION: PeUserInterface.Scrollbar.ScrollSmoothness -- rotation smoothness (1--6) PeUserInterface.Scrollbar.MouseWheelZoomSmoothness -- zoom smoothness PeUserInterface.Scrollbar.PinchZoomSmoothness -- touch zoom smoothness PeUserInterface.Scrollbar.MouseWheelZoomFactor -- zoom sensitivity PeUserInterface.Scrollbar.MouseDraggingX/Y = true -- enable drag rotate SURFACE-SPECIFIC PROPERTIES: PePlot.Allow.WireFrame -- enable/disable wireframe toggle PePlot.Option.ShowContour -- contour display (ShowContour enum) PeLegend.ContourStyle = true -- show contour legend PeLegend.ContourLegendPrecision -- decimal places in legend PeColor.SubsetColors[(int)SurfaceColors.WireFrame] -- wireframe color PeColor.SubsetColors[(int)SurfaceColors.SolidSurface] -- surface color Note (Example 402): when PePlot.Option.ShowWireFrame = true, Example 402 sets BOTH PeColor.BarBorderColor (wireframe color) and PeColor.SubsetColors[WireFrame]; BarBorderColor drives the wireframe color in that example, e.g. Pe3do1.PePlot.Option.ShowWireFrame = true; Pe3do1.PeColor.BarBorderColor = Color.FromArgb(85, 255, 0, 0); CONTOUR POSITIONING: 2D bottom/top contours (ShowContour.BottomLines / TopLines / BottomColors / TopColors) only position correctly when Pe3do1.PePlot.Option.DxFitControlShape = false; (Example 402 sets ShowContour.BottomLines and DxFitControlShape = false.) PeGrid.Configure.DxPsManualCullXZ = true -- enables pixel shader culling when ManualScaleControlX/Z restrict the visible range. Without this, all triangles render even when zoomed via manual axis limits. Essential when driving Pe3do zoom from an external source (e.g., 2D contour zoom). GRID ASPECT: PeGrid.Option.GridAspectX/Y/Z -- stretch factor per axis (default 1.0) Values > 1.0 stretch that axis. GridAspectY = 0.5 compresses height. SEMI-TRANSPARENT BARS: SubsetColors with alpha < 255 create see-through 3D bars. Example: Color.FromArgb(216, 0, 148, 0) -- helps see bars behind. LEGEND FOR 3D BAR CHARTS: Pe3do does NOT produce a standard subset legend in Surface, ThreeDBar, or PolygonData modes. Only Scatter mode generates a native subset legend. Two workarounds provide legend functionality for 3D Bar charts: TECHNIQUE A -- ContourLegendII (color-bar legend): Use the secondary contour legend as a standalone color-to-value legend. It is independent of the main legend system and renders regardless of PolyMode. Define SubsetColors on ContourLegendII to match your bar colors, set the numeric range, and you get a visual legend bar. PeLegend.ContourLegendII.ShowContourLegend = ShowContourLegendII.SecondOnly; PeLegend.ContourLegendII.ManualContourScaleControl = ManualScaleControl.MinMax; PeLegend.ContourLegendII.ManualContourMin = minValue; PeLegend.ContourLegendII.ManualContourMax = maxValue; PeLegend.ContourLegendII.SubsetColors[i] = matchingBarColor; PeLegend.ContourLegendII.ContourLegendTitle = "Values"; Best for: continuous value ranges where bars represent magnitude. See pe-pointcolors knowledge file for ContourLegendII details. TECHNIQUE B -- Table Annotation as custom legend: Create a table annotation positioned at a chart edge with symbol cells (LegendAnnotationType) paired with text labels. Gives full control over layout, fonts, colors, and borders. PeAnnotation.Table.Working = 0; PeAnnotation.Table.Rows = numCategories; PeAnnotation.Table.Columns = 2; // symbol + label PeAnnotation.Table.Type[row, 0] = LegendAnnotationType.SquareSolid; PeAnnotation.Table.Color[row, 0] = barColor; PeAnnotation.Table.Text[row, 1] = "Category Name"; PeAnnotation.Table.Location = GraphTALocation.TopRight; PeAnnotation.Table.Show = true; Best for: categorical legends with discrete labels per bar group. Supports Moveable = TAMoveable.Full for user-draggable positioning. See pe-table-annotations knowledge file for full table annotation details. SUBTITLE JUSTIFICATION IN Pe3do: "||" prefix = right-justified subtitle (used for mouse instructions) PeString.MultiSubTitles[0] = second subtitle line PePlot.Option.DegreePrompting = true -- shows rotation degrees on screen RENDER ENGINE (CRITICAL for Pe3do): PeConfigure.RenderEngine = RenderEngine.Direct3D -- REQUIRED for Pe3do Must set RenderEngine BEFORE QuickStyle for proper 3D initialization. COMPUTESHADER (Direct3D GPU rendering -- expanded in v10.0.0.24): PeData.ComputeShader = true enables GPU-side Direct3D construction. Default false (CPU-side construction). Most beneficial for real-time high-performance charting; also improves general rendering quality. v10.0.0.24 expanded scope to all Pe3do PolyModes that produce surface or sample geometry: PolyMode = SurfacePolygons -- Surface, Surface Wireframe, Contoured Surface PolyMode = ThreeDBar -- 3D Bar PolyMode = Scatter -- 3D Scatter Line (thin/medium/thick) 3D Scatter Point (max 8 vertices, 24 indices per symbol due to compute shader parallelism limits; simpler symbols use fewer, e.g. up-triangle) 3D Scatter Area / Waterfall PolyMode = PolygonData (legacy struct) uses CPU-side construction; ComputeShader has no effect with PolygonData. To get ComputeShader for custom geometry, use the recommended TriangleData struct instead (see POLYGON DATA section above and Example 406). HOTSPOTS / REAL-TIME TRADE-OFF: The hotspot octree is still built CPU-side on a separate thread after the GPU render (250-500ms on large charts). For maximum real-time throughput, disable the three properties that trigger hotspot construction (all three apply to Pe3do): PeUserInterface.HotSpot.Data = false; PeUserInterface.Cursor.PromptTracking = false; PeUserInterface.Cursor.HighlightColor = Color.FromArgb(0,0,0,0); // PE empty If any of these is active, ComputeShader still runs but the hotspot CPU build runs in parallel. LINE TYPE CONSTRAINT (Pe3do): under Direct3D, Pe3do supports only solid line styles (thin / medium / thick) and tubes via PePlot.LinesOrTubes, regardless of ComputeShader. No dash/dot variants on Pe3do. (This differs from Pesgo, where ComputeShader unlocks dash and dot styles.) DATA TYPE CONSISTENCY (Direct3D): UsingXDataii, UsingYDataii, and UsingZDataii must all be the same value (all true or all false). You cannot mix float and double under RenderEngine = Direct3D. (Note the .NET casing is lowercase "ii": PeData.UsingXDataii, etc.) FINALIZATION SEQUENCE (Pe3do-specific): Pe3do1.PeFunction.Force3dxVerticeRebuild = true; Pe3do1.PeFunction.Force3dxAnnotVerticeRebuild = true; // if annotations Pe3do1.PeFunction.ReinitializeResetImage(); Pe3do1.Invalidate(); Pe3do1.Refresh(); // Pe3do often needs explicit Refresh() LIGHTER ALTERNATIVE -- PeFunction.Reinitialize(): Reinitialize() rebuilds axis scales and layout WITHOUT resetting the cached image. Use when changing ManualScaleControl or manual axis limits but not data. Follow with Invalidate(). ReinitializeResetImage() is the full rebuild (data + image) and remains the standard for data changes. PeData.SkipRanging = true -- optimization: skip min/max data scan when only axis scales changed (not data). Set before Reinitialize() to avoid unnecessary ranging over large datasets. Resets automatically after use. BASE 400 (CreateSimple3D) PROVIDES: 10x10 surface data, Method=Zero, Direct3D, surface contour, wireframe, DarkNoBorder QuickStyle, BitmapGradientMode, ComputeShader, contour legend, medium fonts, mouse dragging, smooth scrolling, data hotspots, DegreePrompting, ImageAdjust padding. NOTE: Base 400 is surface-oriented. Non-surface types (Bar, Scatter) are typically standalone and set all properties from scratch. 4TH DIMENSION WDATA: PeData.W[s,p] -- optional 4th data dimension controlling contour color independently from Y (height). Setting WData activates it automatically; use PeData.W.Clear() to revert. Scale via: PeGrid.Configure.ManualScaleControlW = ManualScaleControl.MinMax; PeGrid.Configure.ManualMinW / ManualMaxW PeString.ContourLegendTitle -- title for contour legend. Note: WData 4D surfaces work with ComputeShader = True. Example 415 is a full 4D surface -- WData controls the contour color of the main surface, PeData.ComputeShader = true, RenderEngine = Direct3D, and the lower annotation surface is supplied as GraphAnnotTriangleData (a TriangleData geometry layer; see pe-3d-graph-annotations). (Wii is the double-precision equivalent of WData.) Set RenderEngine = Direct3D before enabling ComputeShader. KEY EXAMPLES: 400 -- Simple Wire Frame (surface base) 402 -- Surface with contoured surface 403 -- Surface with custom polygon colors 404 -- 3D Scatter Chart (LOG, isometric, DxFOV) 405 -- 3D Bar Chart (standalone, with 3D box annotations) 406 -- 3D Polygon Data (sphere): TriangleData via DllProperties.TriangleData, ComputeShader=True (each quad = 2 triangles). PolygonData is legacy. 407 -- 3D Waterfall Plot (Scatter+Area, contour colored slices) 408 -- Large Shaded Surface (DuplicateData, 1001x1001 grid) 410--413 -- Real-Time 3D variants 414 -- 3D Delaunay Heightmap from Point Cloud 415 -- 4D Surface with WData (full ComputeShader=True support; WData contour color + GraphAnnotTriangleData annotation surface) 416 -- 3D Scatter with complex 3D shape annotations ------------------------------------------------------------------------------ ### FILE: pe-pepso-patterns.txt === ProEssentials Pepso (knowledge rev 4.2) (Polar/Smith Object) Patterns === Pepso is the Polar/Smith Chart Object for polar coordinates, Smith charts, radar/spider plots, and rose charts. ALWAYS query pe_query.py for exact paths -- this file provides conceptual understanding only. CRITICAL -- PLOTTING METHOD ENUM: Pepso uses PSGraphPlottingMethod (NOT GraphPlottingMethod or others). Pepso1.PePlot.Method = PSGraphPlottingMethod.PointsPlusLine; The enum has only 4 values: Line (0), Point (1), PointsPlusLine (2), Area (3) Query: pe_query.py enum "PSGraphPlottingMethod" WARNING: Integer values differ from other chart object enums. Using GraphPlottingMethod or SGraphPlottingMethod with Pepso produces silent runtime bugs. Always use PSGraphPlottingMethod. CHART TYPE SELECTION: PePlot.SmithChart = SmithChart enum controls the polar chart variant: Polar (0) -- standard polar chart (default) Smith (1) -- Smith chart (RF engineering) Rose (2) -- rose/wind rose chart Admittance (3) -- admittance Smith chart DATA MODEL: PeData.X[s,p] = angle in degrees (0--360 for polar) PeData.Y[s,p] = radius/magnitude value PeData.Subsets = number of data series PeData.Points = number of data points per series ROSE CHART SPECIFICS (Example 204): Rose charts are polar histograms/frequency distributions (e.g., wind roses). DATA ANGLE MAPPING: Default 0 deg is at 3 o'clock (East). Do NOT use ZeroDegreeOffset. Convention: X data starts at 90 deg (East) and decrements counterclockwise: DataX = {90, 67.5, 45, 22.5, 0, 337.5, 315, 292.5, 270, 247.5, 225, 202.5, 180, 157.5, 135, 112.5} PointLabels map by index: [0]="E", [1]="ENE", [2]="NE", [3]="NNE", [4]="N", [5]="NNW", [6]="NW", [7]="WNW", [8]="W", [9]="WSW", [10]="SW", [11]="SSW", [12]="S", [13]="SSE", [14]="SE", [15]="ESE" DEGREE LINE CONTROL (for 16 compass directions): PeGrid.Configure.ManualXAxisTicknLine = true; PeGrid.Configure.ManualXAxisLine = 22.5; PeGrid.Configure.ManualXAxisTick = 22.5; SPECIAL ROSE LEGEND: Rose charts have a built-in special legend. Suppress normal legend: PeLegend.SubsetsToLegend[0] = -1; Setting -1 as first element disables the standard subset legend. CENTER LABEL: PeString.RoseCenterLabel = "1.25|1.1%"; Uses PIPE delimiter | for multi-line (standard PE delimiter pattern). NOT \n. Pipe delimiter also used in MainTitle for left|center|right. RADIUS LABELS: PeGrid.RadiusLabels = false; // hide radius line labels TYPICAL SETUP: 13 subsets (speed bins) x 16 points (compass directions). SubsetLabels = speed bin values, PointLabels = compass directions. MONOCHROME SUPPORT: PeColor.SubsetShades[0] = Color.Black; PeColor.SubsetShades[1] = Color.White; SubsetShades controls monochrome image colors (separate from SubsetColors). LEGEND STYLE NOTE: SimpleLegendStyle enum (TwoLine=0, OneLine=1) is distinct from LegendStyle enum (TwoLine=0, OneLine=1, plus 4 more values). Rose charts typically use: PeLegend.SimplePoint = true; PeLegend.SimpleLine = true; PeLegend.Style = SimpleLegendStyle.OneLine; SUBSET VISIBILITY AND DRAW ORDER: PeData.SubsetsToShow[subsetIndex] = priority (0--9): 0 = hidden, 1--9 = visible, higher values drawn first (behind). Simpler than RandomSubsetsToGraph for basic show/hide. PeData.RandomSubsetsToGraph -- lists explicit subset indices to include. Order of indices controls draw order. PeLegend.SubsetsToLegend -- independently controls legend order/visibility. See pe-legends knowledge file for legend ordering details. PEPSO BASE (Example 200) PROVIDES: 2 subsets x 360 points, PointsPlusLine method, sine wave data, DarkNoBorder QuickStyle, BitmapGradientMode, Large fonts, bold text, point gradient style, line shadows, HorzAndVert zoom, Direct2D render, PrepareImages, CacheBmp. KEY EXAMPLES: 200 -- Simple Polar Chart (base) 201 -- Polar Chart with legend / custom polar grid 202 -- Bi-polar grid 203 -- Smith Chart 204 -- Rose Chart (wind rose, compass labels, special legend) KEY: Always query exact paths: pe_query.py enum "PSGraphPlottingMethod" pe_query.py enum "SmithChart" pe_query.py props "SmithChart" pe_query.py props "RoseCenterLabel" pe_query.py props "RadiusLabels" pe_query.py props "SubsetsToLegend" ------------------------------------------------------------------------------ ### FILE: pe-pepco-patterns.txt === ProEssentials Pepco (knowledge rev 4.1) (Pie Chart) Patterns === Pepco is the Pie Chart Object. It has unique data conventions and properties that differ significantly from Pego/Pesgo. ALWAYS query pe_query.py for exact paths -- this file provides conceptual understanding only. CRITICAL DATA ARRAY ROLES (DIFFERENT from Pego/Pesgo): PeData.X[s,p] = slice VALUES (determines slice size) PeData.Y[s,p] = slice EXPLOSION state (1=exploded, 0=normal) This is the OPPOSITE of Pego/Pesgo where Y holds data values. Pepco does NOT use PeData.Y for data -- only for explosion control. DATA STRUCTURE: Subsets = produce types, categories, or data series (scrollable) Points = slices in the pie (states, items, segments) PeString.SubsetLabels[s] = category names (e.g., "Apples") PeString.PointLabels[p] = slice labels (e.g., "Texas") PeColor.SubsetColors[0..12] = slice colors (up to 13 for 12 slices + Other) Vertical scrollbar cycles through subsets to show different pies. SLICE EXPLOSION: Programmatic: PeData.Y[subset, point] = 1 -- explodes that slice on render Interactive: PeUserInterface.AutoExplode enum controls user double-click: AutoExplode.None (0) -- no interactive explosion AutoExplode.AllSubsets (1) -- clicking explodes for all subsets AutoExplode.IndividualSubsets (2) -- clicking explodes per-subset only Both coexist -- AutoExplode enables interaction, PeData.Y sets initial state. Visual cue: if only SOME slices are pulled out more, it's programmatic. GROUPING (small slices into "* Other"): PePlot.GroupingPercent enum controls threshold: NoGrouping (0), OnePercent (1), TwoPercent (2), ThreePercent (3), FourPercent (4), FivePercent (5) Slices at or below the threshold get pooled into "* Other" slice. The "* Other" breakdown is listed at the bottom of the chart. 3D SHADOW EFFECTS: PePlot.DataShadows enum: ThreeDimensional -- full 3D depth effect on pie Shadows -- subtler shadow, less depth None -- flat PePlot.Show3DShadow (bool) -- controls drop shadow below the 3D pie true = show drop shadow, false = hide it These two properties work together for the overall 3D appearance. PIE GRADIENT STYLES: PePlot.GradientStyle (PieGradientStyle enum): Curved (0) -- standard curved 3D shading (default) BeveledInset (1) -- inset 3D effect BeveledHighlight (2) -- bright highlight sheen on slice surfaces NoGradient (3) -- flat coloring, no gradient Visual cue: BeveledHighlight has a distinctive bright spot on each slice. PIE LABELS AND LEGEND: PePlot.ShowPieLabels (ShowPieLabels enum): Controls what text appears next to each slice (name, percent, both, etc.) ShowPieLabels.PercentOnly -- shows only percentage PeLegend.ShowPieLegend (bool) -- shows a separate legend box PeLegend.Location -- legend placement (Left, Right, Top, Bottom) SLICE HATCHING: NAMING TRAP: PePlot.SubsetHatch[i] indexes by SLICE (point) in Pepco, NOT by subset. SubsetHatch[0]=first slice, [1]=second slice, etc. (In Pego/Pesgo it indexes by subset as the name suggests.) HatchType enum (all 7 values): NoHatching (0), Horizontal (1), Vertical (2), FDiagonal (3), BDiagonal (4), Cross (5), DiagonalCross (6) PePlot.SliceHatching = SliceHatching enum: Monochrome (0) -- only monochrome slices get hatched MonochromePlusColor (1) -- both monochrome and color slices get hatched PeColor.HatchBackColor -- background color behind hatch lines (use ARGB) Example: Color.FromArgb(255, 230, 230, 230) for light gray See Example 303 for hatching implementation. QUICKSTYLE VISUAL GUIDE FOR PEPCO: DarkNoBorder (12) -- very dark background (base 300 default) MediumShadow (6) -- gray-green/olive mid-tone, shadow border LightShadow (2) -- lighter, near-white with shadow border MediumInset (5) -- medium tone with inset border PEPCO BASE (Example 300) PROVIDES: 5 subsets x 12 points, random data, state/produce labels, DemoColors, GroupingPercent.FourPercent, DataShadows.ThreeDimensional, Show3DShadow=true, AutoExplode.AllSubsets, DarkNoBorder QuickStyle, Large fonts, bold text, Direct2D render, PrepareImages, CacheBmp. KEY EXAMPLES: 300 -- Simple Pie Chart (base) 301 -- Exploded slices (PeData.Y explosion + BeveledHighlight) 302 -- Optional legend (ShowPieLegend, bitmap desk background) 303 -- Hatching (SubsetHatch, SliceHatching) KEY: Always query exact paths: pe_query.py props "GroupingPercent,AutoExplode,Show3DShadow,GradientStyle" pe_query.py enum "PieGradientStyle" pe_query.py enum "AutoExplode" pe_query.py enum "ShowPieLabels" ------------------------------------------------------------------------------ ### FILE: pe-annotations.txt === ProEssentials Annotations (knowledge rev 4.7) (Line, Axis, Table, Polar) === ProEssentials supports annotation types: line annotations (reference lines), graph annotations (text/markers at data coordinates), axis annotations (labels on axis regions), and table annotations. GRAPH ANNOTATIONS: See pe-graph-annotations knowledge file for full details on graph annotations (Pego, Pesgo, Pepso, Pe3do). Covers: text prefix codes, angled text, composite patterns, bitmaps, dodging, per-annotation formatting, TextBoundingBox, multi-axis targeting. LINE ANNOTATIONS (horizontal/vertical reference lines): Horizontal lines: PeAnnotation.Line.YAxis[i] = yValue Vertical lines: PeAnnotation.Line.XAxis[i] = xValue Per-annotation properties (all indexed arrays): YAxisType / XAxisType -- LineAnnotationType enum YAxisText / XAxisText -- text string with optional prefix codes YAxisColor / XAxisColor -- Color per annotation YAxisInFront / XAxisInFront -- AnnotationInFront enum per annotation YAxisAxis -- multi-axis targeting (horizontal only, see below) YAxisZoomWindow / XAxisZoomWindow -- AnnotationZoomWindow enum Use case: threshold lines, target values, reference markers, custom grids. LINE ANNOTATION TYPE ENUM (LineAnnotationType): ThinSolid(0), Dash(1), Dot(2), DashDot(3), DashDotDot(4), MediumSolid(5), ThickSolid(6), GridTick(7), GridLine(8), MediumThinSolid(9), MediumThickSolid(10), ExtraThickSolid(11), ExtraThinSolid(12), ExtraExtraThinSolid(13), GridTickColoredText(14), GridLineColoredText(15). Types 16+ (MediumThinDash through ExtraThickDashDotDot, values 16--35) require RenderEngine Hybrid or GdiPlus. +1000 RIGHT Y-AXIS OFFSET: Adding 1000 to any LineAnnotationType integer value makes the annotation's Y value interpreted against the RIGHT Y-axis scale instead of the left Y-axis. The line still draws at the correct visual position but uses the RY scale for its value. PeAnnotation.Line.YAxisType[i] = LineAnnotationType.ThickSolid + 1000; This works with both single-axis (RYAxisComparisonSubsets) and multi-axis layouts. See Example 101. LINE ANNOTATION TEXT JUSTIFICATION CODES: Both YAxisText and XAxisText support two-character prefix codes. First character is the pipe symbol "|". Second character controls placement. Each annotation type has a default placement when no prefix is used. HORIZONTAL LINE ANNOTATION TEXT (YAxisText) -- 13 CODES: Default (no prefix) = left inside edge. |l -- Left inside edge of graph (same as default) |L -- Left OUTSIDE edge (needs LeftMargin) |M -- Left OUTSIDE edge with opaque BackColor (needs LeftMargin) |r -- Right inside edge of graph |R -- Right OUTSIDE edge (needs RightMargin) |S -- Right OUTSIDE edge with opaque BackColor (needs RightMargin) |c -- Centered inside graph grid |t -- Top inside edge (text placed at top of graph area) |T -- Top OUTSIDE edge, vertical text orientation (needs TopMargin) |H -- Top OUTSIDE edge, horizontal text orientation |b -- Bottom inside edge (text placed at bottom of graph area) |B -- Bottom OUTSIDE edge, vertical text orientation (needs BottomMargin) |h -- Bottom OUTSIDE edge, horizontal text orientation VERTICAL LINE ANNOTATION TEXT (XAxisText) -- 10 CODES: Default (no prefix) = bottom inside edge. |b -- Bottom inside edge of graph (same as default) |B -- Bottom OUTSIDE edge, vertical text (needs BottomMargin) |h -- Bottom OUTSIDE edge, horizontal text |t -- Top inside edge of graph |T -- Top OUTSIDE edge, vertical text (needs TopMargin) |H -- Top OUTSIDE edge, horizontal text |c -- Centered inside graph grid |l -- Left inside edge (text placed at left of graph area) |L -- Left OUTSIDE edge (needs LeftMargin) |r -- Right inside edge (text placed at right of graph area) MULTILINE TEXT: Use newline character within text strings: YAxisText[i] = "|RTest" + '\n' + "String"; BackColor CODES (|M and |S): These draw an opaque background rectangle behind the text to prevent overlap with grid numbers. Color set via: PeAnnotation.Line.LineAnnotBackColor = Color.xxx; Only applies to horizontal line annotations. See Example 005. MARGIN PROPERTIES (space allocation for outside-edge text): When text is justified OUTSIDE the graph grid (|L, |R, |T, |B, |H, |h, |M, |S), you must allocate space so text is not clipped. Set the margin to the longest annotation string at that edge: PeAnnotation.Line.LeftMargin = "Longest Left Text "; PeAnnotation.Line.RightMargin = "Longest Right Text "; PeAnnotation.Line.TopMargin = "Longest Top Text "; PeAnnotation.Line.BottomMargin = "Longest Bottom Text "; SHOWMARGINS ENUM controls when margins are applied: PeAnnotation.Line.ShowMargins = ShowMargins.ShowAnnotations; (default) -- margins only applied when PeAnnotation.Show = true ShowMargins.Always -- margins always applied regardless of Show state ShowMargins.Never -- margins never applied LINE ANNOTATION MULTI-AXIS TARGETING: Horizontal line annotations can target specific axis regions: PeAnnotation.Line.YAxisAxis[i] = axisIndex; // 0--15 The Y value is interpreted in that axis's Y-scale and the line renders in that axis's vertical strip. Without setting YAxisAxis, annotations default to axis 0. Vertical line annotations have NO axis targeting -- they span ALL axes from top to bottom of the chart. There is no XAxisAxis property. See Example 101 for both single and multi-axis line annotations. LINE ANNOTATION PER-ANNOTATION Z-ORDER: Each annotation can individually control its draw order: PeAnnotation.Line.YAxisInFront[i] = AnnotationInFront.InFront; PeAnnotation.Line.XAxisInFront[i] = AnnotationInFront.Behind; AnnotationInFront enum: Default(0), Behind(1), InFront(2), Hide(3). Default follows PeAnnotation.InFront global setting. Hide suppresses the individual annotation without removing it from the array. LINE ANNOTATION VISIBILITY HIERARCHY: Three levels of visibility control: 1. PeAnnotation.Show = true -- GLOBAL master switch for ALL annotations 2. PeAnnotation.Line.YAxisShow = true -- always show horizontal lines (if false, horizontal lines only show when Show = true) PeAnnotation.Line.XAxisShow = true -- same for vertical lines 3. Per-annotation: YAxisInFront[i] = AnnotationInFront.Hide LINE ANNOTATION TEXT PROPERTIES: PeAnnotation.Line.TextSize -- int, range 20--100 (100 = largest) PeAnnotation.Line.LineAnnotBackColor -- Color for |M and |S codes LINE ANNOTATION ZOOM WINDOW: Annotations can optionally appear in the zoom overview strip: PeAnnotation.Line.YAxisZoomWindow[i] = AnnotationZoomWindow.GraphAndZoomWindow; PeAnnotation.Line.XAxisZoomWindow[i] = AnnotationZoomWindow.ZoomWindowOnly; AnnotationZoomWindow enum: GraphOnly(0), GraphAndZoomWindow(1), ZoomWindowOnly(2). Default (empty array) = annotations do not show in zoom window. CUSTOM Y-AXIS RECIPE (using line annotations to replace numeric grid): 1. PeGrid.Option.ShowYAxis = ShowAxis.Empty -- hides default numbers 2. PeGrid.Configure.ManualScaleControlY = ManualScaleControl.MinMax 3. PeGrid.Configure.ManualMinY / ManualMaxY -- set explicit range 4. Create GridLine annotations at labeled positions: PeAnnotation.Line.YAxis[i] = value; PeAnnotation.Line.YAxisType[i] = LineAnnotationType.GridLine; PeAnnotation.Line.YAxisText[i] = "|LLabel Text"; 5. Create GridTick annotations at unlabeled intermediate positions: PeAnnotation.Line.YAxisType[i] = LineAnnotationType.GridTick; PeAnnotation.Line.YAxisText[i] = ""; 6. PeAnnotation.Line.LeftMargin = "longest label "; 7. PeAnnotation.Show = true; 8. PeAnnotation.Line.TextSize = 100; 9. PeGrid.InFront = true -- draws grid over filled area data See Example 005 for complete implementation. POLAR ANNOTATIONS (Pepso): In Pepso polar mode, Y-axis line annotations render as CONCENTRIC CIRCLES instead of horizontal lines. This is the primary way to add colored reference circles to a polar chart. PeAnnotation.Line.YAxis[i] = radialValue; PeAnnotation.Line.YAxisColor[i] = Color.FromArgb(255, r, g, b); PeAnnotation.Show = true; YAxisType defaults work fine -- no need to set explicitly. REPLACING DEFAULT GRID CIRCLES WITH ANNOTATION CIRCLES: PeGrid.LineControl = GridLineControl.YAxis; This suppresses default concentric grid circles (shows only radial/degree grid lines), letting colored annotation circles serve as radial references. GridLineControl enum: Both=0, YAxis=1, XAxis=2, None=3. TIP: PeUserInterface.Menu.AnnotationControl = true enables the annotation menu when popups are active -- good practice whenever annotations are used. See Example 206 for complete implementation. HOTSPOT ENABLING: Line annotations: PeUserInterface.HotSpot.YAxisLineAnnotations[i] = AnnotationHotSpot.All PeUserInterface.HotSpot.XAxisLineAnnotations[i] = AnnotationHotSpot.All Graph annotations: see pe-graph-annotations knowledge file. Menu control: PeUserInterface.Menu.AnnotationControl = true PeUserInterface.Menu.ShowAnnotationText = MenuControl.Show Hotspot arrays are under PeUserInterface, NOT under PeAnnotation. AXIS ANNOTATIONS (colored regions along an axis): Collection under PeAnnotation.Axis. Paint colored/labeled bands on X or Y axis regions. Useful for: shift indicators, good/bad zones, time-of-day bands. TABLE ANNOTATIONS (see pe-table-annotations knowledge file for full details): Independent positioned table elements (up to 20 instances via Working 0-19). NOT the same as PeTable (built-in data table). Full location system with anchored positions, axis-aligned, table-spaced, and pixel-positioned modes. Support cell types (text/symbols), styling, stacking, interactivity, real-time update via DrawTable(), and moveable/hotspot capabilities. KEY: Always query exact paths before coding: pe_query.py search "annotation" pe_query.py enum "LineAnnotationType" ------------------------------------------------------------------------------ ### FILE: pe-graph-annotations.txt === ProEssentials Graph Annotations (knowledge rev 4.2) (Pego, Pesgo, Pepso, Pe3do) === OVERVIEW: Graph annotations place symbols, text, lines, shapes, and bitmaps at data coordinates. Collection under PeAnnotation.Graph. Stored in a single FLAT GLOBAL array -- NOT per-axis or per-subset. All share one index space. Supports: Pego, Pesgo, Pepso (2D), Pe3do (3D adds Z coordinate). INVERTEDYAXIS INTERACTION: When PeGrid.Option.InvertedYAxis = true (C++: PEP_bINVERTEDYAXIS), ALL Y coordinates must be negated. This applies to YData, ManualMinY/ManualMaxY, AND graph annotation Y values. The axis label inversion is display-only; the coordinate space stays positive-up. See Example 108 for a working InvertedYAxis + graph annotations demo. C++ CONSTANT NAMES: The rectangle annotation pattern uses: PEGAT_TOPLEFT=46, PEGAT_BOTTOMRIGHT=47, PEGAT_RECT_FILL=55 Do NOT guess C++ prefixes. See pe-cpp-api-reference for all PEGAT_ values. RUNNING COUNTER PATTERN (recommended): int aCnt = 0; PeAnnotation.Graph.X[aCnt] = ...; PeAnnotation.Graph.Y[aCnt] = ...; PeAnnotation.Graph.Type[aCnt] = ...; aCnt++; CORE PER-ANNOTATION ARRAYS: X[i], Y[i] -- data coordinates (Z[i] for Pe3do) Type[i] -- int cast from GraphAnnotationType enum Text[i] -- label text with optional prefix codes (see below) Color[i] -- Color.FromArgb(alpha, r, g, b) Axis[i] -- target axis 0--15 for multi-axis charts InFront[i] -- AnnotationInFront enum (Default/Behind/InFront/Hide) HotSpot[i] -- AnnotationHotSpot per-annotation (NoHotSpot/GraphOnly/etc.) Shadow[i] -- bool, per-annotation drop shadow GradientStyle[i] -- int cast from PlotGradientStyle enum GradientColor[i] -- gradient start color (default White) Bold[i], Italic[i], Underline[i] -- per-annotation font style booleans Font[i] -- per-annotation font face string (e.g., "Courier New") FontSize[i] -- per-annotation relative text size (float) NOTE: Using any Font/Bold/Italic/Underline/FontSize causes a performance hit -- per-annotation font objects must be allocated. Omit for best speed. GLOBAL GRAPH ANNOTATION PROPERTIES: PeAnnotation.Graph.Show -- bool, show graph annotations PeAnnotation.Graph.ShowShadows -- bool, global shadow toggle (both this AND Shadow[i] must be true for shadow to appear on annotation i) PeAnnotation.Graph.BackColor -- Color behind ALL annotation text PeAnnotation.Graph.Moveable -- bool/GraphAnnotMoveable enum (enables Pointer-type annotations to be dragged by user) PeAnnotation.Graph.GraphAnnotRectHotSpots -- bool, true = entire rect is hotspot, false = only corners are hotspots PeAnnotation.Graph.MinSymbolSize -- MinimumPointSize enum PeAnnotation.Graph.MaxSymbolSize -- MinimumPointSize enum (set both equal to lock symbol size) PeFont.GraphAnnotationTextSize -- int 25--300 (global text size) +1000 RIGHT Y-AXIS OFFSET: Adding 1000 to any GraphAnnotationType integer places the annotation Y coordinate on the RIGHT Y-axis scale instead of left: Graph.Type[i] = (int)GraphAnnotationType.SmallDotSolid + 1000; See Example 015. GRAPH ANNOTATION TEXT PREFIX CODES: Text strings support a two-character prefix: pipe + code character. Format: "|{code}{text}" e.g., "|rMy Label" or "|CBelow Center". Default (no prefix) = centered, bottom-justified (same as |c). HORIZONTAL TEXT (8 codes, normal font): |c Center, bottom-justified (text centered above point) -- DEFAULT |l Left, bottom-justified (text extends right, above point) |r Right, bottom-justified (text extends left, above point) |C Center, top-justified (text centered below point) |L Left, top-justified (text extends right, below point) |R Right, top-justified (text extends left, below point) |f Left-justified, vertically centered on point |g Right-justified, vertically centered on point PATTERN: lowercase = bottom anchor (text above), uppercase = top anchor (text below). Exception: f/g are vertically centered. VERTICAL TEXT (8 codes, 90-degree rotated font): |s Bottom, vertical text, left-side |S Top, vertical text, right-side |m Bottom, vertical text, right-side |M Top, vertical text, left-side |d Centered on left side, vertical text |D Centered on right side, vertical text |e Top, vertical text, centered |E Bottom, vertical text, centered SPECIAL TEXT CODES (3 codes): |H Manual text offset from pointer. Format: |H{x}|{y}|{text} Text drawn at data coordinates (x,y) while symbol stays at X[i],Y[i]. Used with Pointer type. See Example 031. |V Same as |H but text is vertically oriented. |a Absolute angled text. Format: |a{angle_tenths}|{text} Angle in tenths of degrees: |a450| = 45 deg, |a-850| = -85 deg. REQUIRES preceding NullPen annotation (see below). ANGLED TEXT -- TWO METHODS: METHOD A -- DATA-LINE ANGLE (Example 015): Angle computed from line between two annotation coordinates. Text follows the data-line slope if placed on a data line. Graph.X[n] = x1; Graph.Y[n] = y1; Graph.Type[n] = (int)GraphAnnotationType.NullPen; Graph.Text[n] = ""; n++; Graph.X[n] = x2; Graph.Y[n] = y2; Graph.Type[n] = (int)GraphAnnotationType.AngledTextLeftTop; Graph.Text[n] = "Label"; n++; AngledText enum variants control anchor corner: AngledText(194), AngledTextCenter(195), AngledTextTop(196), AngledTextLeftBottom(241), AngledTextLeftTop(242), AngledTextRightBottom(243), AngledTextRightTop(244). METHOD B -- ABSOLUTE ANGLE (Example 149): Angle explicitly specified. Requires NullPen + NoSymbol pair at SAME X,Y. NullPen carries justification state; NoSymbol carries the |a text. // Step 1: NullPen sets justification state Graph.X[n] = x; Graph.Y[n] = y; Graph.Type[n] = (int)GraphAnnotationType.NullPen; Graph.Text[n] = "|L"; // justification: l/L/r/R/c/C Graph.Color[n] = Color.FromArgb(0,0,0,0); n++; // Step 2: NoSymbol carries angled text Graph.X[n] = x; Graph.Y[n] = y; Graph.Type[n] = (int)GraphAnnotationType.NoSymbol; Graph.Text[n] = "|a-450|Right Top -45"; Graph.Color[n] = Color.FromArgb(255,0,255,255); n++; // Step 3: Optional visible symbol at same point Graph.X[n] = x; Graph.Y[n] = y; Graph.Type[n] = (int)GraphAnnotationType.SmallDotSolid; Graph.Text[n] = ""; n++; NoSymbol enables text to be its own hotspot. The separate symbol (SmallDotSolid) provides the visible marker with HotSpot = NoHotSpot. NullPen justification codes for angled text: l, L, r, R, c, C. TEXT BOUNDING BOX (state toggle): TextBoundingBox is a sequential toggle affecting all subsequent annotations. // Turn ON bounding box Graph.Type[n] = (int)GraphAnnotationType.TextBoundingBox; Graph.Color[n] = Color.FromArgb(255, 0, 100, 0); n++; // box color // ... annotations here get bounding boxes ... // Turn OFF bounding box Graph.Type[n] = (int)GraphAnnotationType.TextBoundingBox; Graph.Color[n] = Color.FromArgb(0, 0, 0, 0); n++; // alpha=0 turns off See Examples 015 and 149. COMPOSITE ANNOTATION PATTERNS: CONNECTED LINES: ThinSolidLine at start --> LineContinue for each segment. End with ArrowSolidSmall/Medium/Large for arrow-tipped lines. RECTANGLE/ELLIPSE: TopLeft at corner1 --> BottomRight at corner2 --> EllipseFill/RectFill/RoundRectFill with fill color + optional shadow. Hatch variants: EndPolygonHatchCross, RectHatchDiagonal, etc. POLYGON: StartPoly --> AddPolyPoint(s) --> EndPolygon (or EndPolygonHatch*). PARAGRAPH TEXT: StartText (first line) --> AddText (additional lines) --> Paragraph at final position with color and optional Font[i]. Each line includes '\n' newline. See Example 015. REGION BANDS (Top/Bottom/RectFill triple): Top with Y=1.0E+20 --> Bottom with Y=threshold --> RectFill with alpha color. Creates colored horizontal band. See Example 101. POINTER ARROW: PointerArrowSmall/Medium/Large -- draws arrow from text to annotation point. Moveable when Graph.Moveable = true. BITMAP GRAPH ANNOTATIONS: Custom images as annotation symbols. Uses the same WorkingBitmap slot system as subset point types. A bitmap registered here can be reused by table annotations and legend annotations. // 1. Set the annotation color FIRST (Mask/Tint colorize from this). Graph.Color[i] = Color.FromArgb(255, 215, 0, 215); // 2. Configure the bitmap slot. PePlot.Bitmaps.WorkingBitmap = 0; // slot 0--150 PePlot.Bitmaps.Filename = "image.png"; PePlot.Bitmaps.ColorizeMode = ResourceBitmapColorizeMode.Tint; PePlot.Bitmaps.Style = ResourceBitmapStyle.LargeCentered; // 3. Assign the type (10001 + slot index). Graph.Type[i] = (int)10001; Graph.X[i] = 3.5; Graph.Y[i] = 1390; Graph.Text[i] = "Label"; COLORIZEMODE (ResourceBitmapColorizeMode enum): None -- bitmap drawn in its native colors (Graph.Color[i] unused) Mask -- all visible pixels swapped to Graph.Color[i] (silhouette recolor) Tint -- white/gray highlights preserved, hue retinted to Graph.Color[i] For graph annotation bitmaps, the color source is Graph.Color[i] (NOT SubsetColors). Set Graph.Color[i] BEFORE assigning Graph.Type[i]. REGISTRATION SIDE-EFFECT: Assigning Graph.Type[i] = 10001+N also registers bitmap slot N for reuse by PeAnnotation.Table.Type and PeLegend.AnnotationType. If the bitmap is only needed in a table or legend, define a throwaway graph annotation at off-screen coordinates just to register the slot. LEGACY: PePlot.Bitmaps.Colorize (bool) still compiles but is deprecated; Colorize=true mapped to Mask only. New code should use ColorizeMode. ResourceBitmapStyle controls size/position: ActualSizeCentered, SmallCentered, MediumCentered, LargeCentered, DataSized, plus directional variants (SmallN, SmallNE, etc.). See pe-pointcolors for the full bitmap reference. See Examples 015, 140. TEXT DODGING SYSTEM (auto-positioning to avoid overlaps): Graph.TextLocation[i] -- array of angles (0--360 deg) defining search order. Default is internal. Setting TextLocation[0] = 270 makes "directly above" the first attempted position. Dodging iterates through all defined angles, then increases radius by 10% and retries. Graph.TextDodge -- int 0--100, number of dodging iterations (0 = no dodging). Graph.SubsetObstacles[s] -- bool per subset, true = dodge around that subset. Graph.SymbolObstacles -- bool, true = dodge around other annotation symbols. Graph.AllDodging -- bool (Pe3do), enables dodging for non-Pointer types. See Example 031. MULTI-AXIS TARGETING: Graph.Axis[i] = axisIndex (0--15) routes annotation to correct axis strip. Y coordinate interpreted in that axis's scale. Without this, all annotations render in axis 0's region. See Examples 012, 031, 149. DISPLAY AND INTERACTION: PeAnnotation.Show = true -- global master switch PeAnnotation.InFront = true/false -- global z-order default PeAnnotation.ShowAnnotationText = true -- show/hide all annotation text PeUserInterface.HotSpot.GraphAnnotation = AnnotationHotSpot.GraphOnly PeUserInterface.Menu.AnnotationControl = true PeUserInterface.Menu.ShowAnnotationText = MenuControl.Show Pe3do 3D GRAPH ANNOTATIONS: See DEDICATED file pe-3d-graph-annotations for comprehensive coverage of: 3D shapes (Cylinder, Cone, Sphere, Box, 3D EllipseFill), AxisDirection/ MajorMinorRadii state machine, wireframe vs solid mode toggle, GraphAnnotationPolyData via PEvset, OIT transparency, and 3D-specific properties (LeftJustificationOutside, AnnotationTextFixedSize, SizeCntl, SetViewingAt, AllDodging). All 2D patterns above also work in Pe3do with the addition of Graph.Z[i] for depth positioning. KEY: Always query paths before coding: pe_query.py enum GraphAnnotationType pe_query.py props "Graph.Text" pe_query.py search "annotation" ------------------------------------------------------------------------------ ### FILE: pe-3d-graph-annotations.txt === ProEssentials Pe3do (knowledge rev 4.1) 3D Graph Annotations === 3D graph annotations extend the 2D annotation system (see pe-graph-annotations) with Z coordinates and 3D geometric shapes. All 2D graph annotation features (text prefixes, Pointer, connected lines, text dodging) work in Pe3do with the addition of Graph.Z[i] for depth positioning. BASIC 3D ANNOTATIONS (same as 2D but with Z): Graph.X[i], Graph.Y[i], Graph.Z[i] -- position in 3D data coordinates. Standard patterns work: symbol + Pointer pairs, ThickSolidLine -> ArrowLarge, ThickSolidLine -> LineContinue polylines, StartPoly -> AddPolyPoint -> EndPolylineThick polylines. All render in 3D space. See Examples 404, 407. STATE MACHINE: AxisDirection and MajorMinorRadii are SEQUENTIAL STATE that persists across subsequent annotations until changed. They are NOT per- annotation -- set them once, and all following shapes use them until reset. AXISDIRECTION -- ORIENTATION VECTOR: Graph.Type[i] = (int)GraphAnnotationType.AxisDirection; Graph.X[i], Y[i], Z[i] = unit vector defining the shape's primary axis. Examples: (0,1,0) = Y-axis vertical, (1,0,0) = X-axis, (0,0,1) = Z-axis. For cylinders/cones: the axis the shape spans along. For 2D ellipses: the normal (face direction) of the flat disc. ALTERNATIVE ORIENTATION METHODS (priority order): 1. MajorDirection + MinorDirection -- direct low-level vectors (highest) 2. AxisDirection -- single vector, system computes perpendicular plane 3. AxisAngles -- X = horizontal rotation, Y = vertical rotation (lowest) If multiple are defined, higher priority wins. See Example 416. MAJORMINORRADII -- CROSS-SECTION SIZE: Graph.Type[i] = (int)GraphAnnotationType.MajorMinorRadii; Graph.X[i] = major radius, Graph.Y[i] = minor radius, Graph.Z[i] = ignored. These define the cross-section in the plane perpendicular to AxisDirection. Equal X,Y = circular cross-section. Unequal = elliptical. Units are DATA COORDINATES -- affected by GridAspectX/Y/Z and ManualScale. If GridAspectX != GridAspectZ, compensate radii for true visual circles. CYLINDER AND CONE ANNOTATIONS: Full pattern: AxisDirection -> MajorMinorRadii (start) -> CylinderStart -> [optional MajorMinorRadii (end)] -> Cylinder. - CylinderStart X,Y,Z = start location, Color = start color (use alpha). - Cylinder X,Y,Z = end location, Color = end color. - CONE: Use different MajorMinorRadii before CylinderStart vs Cylinder. Example: start radii (5,5) -> CylinderStart -> end radii (20,20) -> Cylinder creates a cone wider at the end. See Example 416. - For translucent shapes, use alpha < 255 in Color AND enable PeColor.DxTransparencyMode = TransparencyMode.OIT. Note: OIT does not support GeometricShaders, so use PePlot.LinesOrTubes = LinesOrTubes.AllLines (not tubes) with OIT. SPHERE ANNOTATIONS: Pattern: MajorMinorRadii -> Sphere (or SphereSmall / SphereLarge). MajorMinorRadii X,Y define the sphere's radii (equal = true sphere). Sphere X,Y,Z = center location in data coordinates. PePlot.Option.DxSphereComplexity = 2-20 (default 6) controls polygon count. BOX ANNOTATIONS: Pattern: AxisDirection -> MajorMinorRadii -> BoxStart -> Box. - BoxStart X,Y,Z = start corner, Box X,Y,Z = end corner. Color on Box. - MajorMinorRadii defines cross-section perpendicular to AxisDirection. - For 3D bar charts (PolyMode.ThreeDBar), position at bar centers: X = 1.5 + pointIndex, Z = 1.5 + subsetIndex, Y = data value. STACKING: Chain BoxStart+Box pairs. Second BoxStart.Y = first Box.Y. TOP CAP: RectFill at the top Y of a box stack caps it visually. See Example 405. 3D ELLIPSEFILL -- FLAT DISC IN 3D: Pattern: AxisDirection -> MajorMinorRadii -> EllipseFill. In 3D, EllipseFill draws a planar disc oriented perpendicular to the AxisDirection vector (NOT TopLeft+BottomRight like 2D). The face of the disc points in the AxisDirection. X,Y,Z = disc center location. See Example 416. WIREFRAME VS SOLID RENDERING MODE: Complex shapes (Sphere, Cylinder, Box) inherit their rendering mode from a sequential state determined by the last "simple" annotation type: - After a LINE type (ThinSolidLine, etc.) -> shapes render as WIREFRAME. - After a SOLID FILL type (SquareSolid, etc.) -> shapes render as SOLID. To explicitly set mode without drawing anything visible, place an invisible annotation at extreme out-of-view coordinates: // Force SOLID mode Graph.X[i] = 200000000; Graph.Y[i] = 200000000; Graph.Z[i] = 200000000; Graph.Type[i] = (int)GraphAnnotationType.SquareSolid; Graph.Color[i] = Color.FromArgb(0, 0, 0, 0); // invisible // Force WIREFRAME mode (use ThinSolidLine instead of SquareSolid) This works because the rendering pipeline carries forward the fill-mode from the last annotation regardless of position. The extreme coordinates ensure the mode-setting annotation is invisible. If you draw a visible arrow line before a shape, the shape will render wireframe unless you insert a SquareSolid mode-reset between them. See Example 416. GRAPHANNOTATION TRIANGLEDATA / POLYDATA (second surface workaround): Pe3do supports only one surface plotting method at a time. To overlay a second independent surface or geometry layer, use a graph-annotation geometry layer. This renders annotation-layer triangles/polygons separately from the main surface, and works on ANY PolyMode / 3D chart. RECOMMENDED: GraphAnnotTriangleData (DLL prop PEP_structGRAPHANNOTTRIANGLEDATA). Per the current docs it is the preferred replacement for the legacy GraphAnnotPolyData and is what enables ComputeShader = True. LEGACY: GraphAnnotPolyData (PEP_structGRAPHANNOTPOLYDATA) still works but does not support ComputeShader; docs explicitly steer new code to the TriangleData variant. Example 415 shows two surfaces with ComputeShader = True: the main surface colored by WData (4th dimension moisture), and an annotation surface below showing the WData as actual topology in a simpler color scheme. Example 415 supplies that annotation surface via DllProperties.GraphAnnotTriangleData (TriangleData geometry), with PeData.ComputeShader = true and RenderEngine = Direct3D. COORDINATE SYSTEM: the geometry uses a normalized -10 to 10 logical space that maps to the main surface plot's data range. GridAspect multiplies this: GridAspectX = 2.5 stretches the X range to -25 to 25. To place the annotation surface in only the bottom portion, use a Y range subset like -10 to -5 (bottom quarter of the logical space). AXIS SCALING: The chart does NOT auto-scale axes to fit annotation geometry. You must manually extend the axis to make room: PeGrid.Configure.ManualScaleControlY = ManualScaleControl.Min; PeGrid.Configure.ManualMinY = 750; // extend below main data range MECHANISM (not a normal .NET property -- requires PEvset): // RECOMMENDED (TriangleData; supports ComputeShader) -- as in Example 415: Gigasoft.ProEssentials.Structs.TriangleData[] tris = CreatePolyData(...); PEvsetW(Pe3do1.PeSpecial.HObject, DllProperties.GraphAnnotTriangleData, tris, tris.Length); PeAnnotation.Graph.GraphAnnotPolyDataPlotMethod = GraphAnnotPolyDataPlotMethod.PolygonColor; // YHeight=0, PolygonColor=1 // zero-copy variant: DllProperties.GraphAnnotTriangleDataPtr (pass an // IntPtr; .NET: pin memory if triangle data < 90K bytes). // GraphAnnot TriangleData struct (40 bytes/triangle): Point3D Vertices[4] // + DWORD PolyColor (ARGB). (Note: 4 vertices here, vs 3 for the plain // PEP_structTRIANGLEDATA used in PolyMode geometry.) // LEGACY (PolygonData; no ComputeShader): // PolygonData[] polys = CreatePolyData(...); // PEvsetW(..., DllProperties.GraphAnnotationPolyData, polys, polys.Length); Requires: Force3dxAnnotPolyDataVerticeRebuild = true (separate from Force3dxAnnotVerticeRebuild). Set RenderEngine = Direct3D before enabling ComputeShader. See Examples 406 (PolyMode geometry), 415 (dual surface). NOTE: numeric DLL constant values quoted in change notes (PEP_structGRAPHANNOTTRIANGLEDATA = 1613, ...PTR = 1615) are not present in the bundled DLL metadata; confirm against your installed header if calling the DLL layer directly. 3D-SPECIFIC ANNOTATION PROPERTIES: PeAnnotation.InFront = true/false -- controls depth priority between annotations and surface/plot data. true = annotations render in front of surface (default, good for labels). false = surface renders in front of annotations (use for highlight polygons that should appear behind/within the surface, e.g., subset highlight slices in examples 400, 407). PeAnnotation.Graph.HighLightAnnotationIndex = N -- draws a special colored highlight sphere at annotation index N. Set to -1 to clear. Useful for interactive highlighting during MouseMove or for animating a highlighted marker moving along a path of annotation coordinates (example 403). PeAnnotation.Graph.LeftJustificationOutside = true -- left-justified text always faces outside the 3D scene, preventing criss-crossing pointers. PeAnnotation.Graph.AnnotationTextFixedSize = true -- text stays same size regardless of 3D depth. False = text scales with perspective distance. PeAnnotation.Graph.SizeCntl = 1.2 -- multiplier for all annotation symbol sizes (0.8 = smaller, 1.5 = larger). PeAnnotation.Graph.AllDodging = true -- enables limited dodging for non- Pointer annotations (symbol types). AllDodgingOffset controls pixel offset. PeFunction.SetViewingAt(x, y, z) -- focus camera rotation on a specific annotation/data point in 3D space. PeColor.DxTransparencyMode = TransparencyMode.OIT -- required when using alpha < 255 on 3D shapes for correct depth-sorted transparency. FINALIZATION (always required after 3D annotation changes): Pe3do1.PeFunction.Force3dxAnnotVerticeRebuild = true; Pe3do1.PeFunction.Force3dxAnnotPolyDataVerticeRebuild = true; // if PolyData Pe3do1.PeFunction.ReinitializeResetImage(); Pe3do1.Invalidate(); Pe3do1.Refresh(); KEY EXAMPLES: 404 -- 3D Scatter: basic 3D Pointer annotations, 3D arrow lines, SetViewingAt 405 -- 3D Bar: Box annotations with stacking and top caps, 3D polyline 407 -- Waterfall: StartPoly->EndPolylineThick, SizeCntl, AnnotationTextFixedSize 415 -- 4D Surface (ComputeShader=True): WData contour color on the main surface + a lower annotation surface via DllProperties.GraphAnnotTriangleData (TriangleData geometry). GraphAnnotPolyDataPlotMethod.PolygonColor controls poly color. 416 -- Complex: Cylinder, Cone, Sphere, EllipseFill, wireframe/solid toggle, OIT transparency, AxisDirection/MajorMinorRadii comprehensive demo ------------------------------------------------------------------------------ ### FILE: pe-table-annotations.txt === ProEssentials Table (knowledge rev 4.6) Annotations === Table annotations are independent positioned table elements (up to 20 instances, Working index 0-19). They are NOT rows in the built-in PeTable. They can appear inside axis regions, at chart edges, aligned with data points, inside the PeTable area, or at arbitrary pixel coordinates. Applies to: Pego, Pesgo, Pe3do, Pepso. CORE WORKFLOW (every table annotation): 1. PeAnnotation.Table.Working = N; // select table 0-19 2. PeAnnotation.Table.Rows = R; // set dimensions FIRST 3. PeAnnotation.Table.Columns = C; 4. PeAnnotation.Table.Text[row, col] = "x"; // populate cells 5. PeAnnotation.Table.Location = GraphTALocation.xxx; 6. PeAnnotation.Table.Show = true; // per-table visibility Always set Rows and Columns BEFORE accessing Text/Color/Type arrays. VISIBILITY HIERARCHY (both must be true to see a table): PeAnnotation.Table.Show = true; // per-table, set per Working PeAnnotation.ShowAllTableAnnotations = true; // global master (default true) Optional menu: PeUserInterface.Menu.ShowTableAnnotations = MenuControl.Show; lets users toggle all table annotations via right-click menu. LOCATION SYSTEM -- GraphTALocation enum: ANCHORED POSITIONS (automatic placement, no coordinates needed): Outside chart: TopCenter(0), TopLeft(1), LeftCenter(2), BottomLeft(3), BottomCenter(4), BottomRight(5), RightCenter(6), TopRight(7) Inside chart: InsideTopCenter(8)..InsideTopRight(15) -- same 8 positions but within the graph plotting area. AXIS-ALIGNED (inside specific multi-axis regions): InsideAxis0(100)..InsideAxis5(105) -- places table inside axis N region. OutsideAxis0(200)..OutsideAxis5(205) -- outside axis N region. OverlapInsideAxis0(400)..OverlapInsideAxis5(405) -- overlapping axis N. When using InsideAxisN, set AxisLocation for sub-positioning (see below). TABLE-SPACED (columns auto-align with chart data points): Use InsideAxisN or InsideTable with AxisLocation set to TopTableSpaced(8) or BottomTableSpaced(9). Column count should match point count -- PE automatically spaces each column center to align with the corresponding X-axis data point. InsideTable(300) places the annotation within the PeTable region, used for adding custom labeled rows to the built-in data table. PIXEL-POSITIONED (free placement, optionally draggable): InsidePixelUnits(16) -- uses Table.X and Table.Y for pixel coordinates. Coordinate (0,0) is top-left of chart control. Combine with Moveable = TAMoveable.Full for user-draggable tables. Use GetRectGraph() after ReinitializeResetImage() to position relative to graph bounds (see Example 034). AXIS LOCATION -- GraphTAAxisLocation enum (sub-position within axis): TopFullWidth(0), TopLeft(1), TopCenter(2), TopRight(3), BottomFullWidth(4), BottomLeft(5), BottomCenter(6), BottomRight(7), TopTableSpaced(8), BottomTableSpaced(9), NewRow(100). STACKING TABLES (NewRow pattern -- not in main docs, only in examples): Multiple tables can stack vertically inside the same axis region by adding NewRow multiples to the AxisLocation value: Table 0: AxisLocation = GraphTAAxisLocation.TopLeft; // row 0 Table 1: AxisLocation = TopLeft + Convert.ToInt32(NewRow); // row 1 Table 2: AxisLocation = TopLeft + Convert.ToInt32(NewRow) * 2; // row 2 NewRow=100, so TopLeft(1)+100=101 for row 1, +200=201 for row 2. All stacked tables must share the same InsideAxisN Location. Use case: hierarchical column headers (Example 027 -- Category/SubCat). CELL CONTENT: Text[row, col] = "string"; // text content Color[row, col] = Color; // foreground/text color per cell Type[row, col] = LegendAnnotationType.xxx; // symbol cells instead of text Symbol types: SquareSolid, LargeSquareSolid, DotSolid, etc. Symbols render as colored shapes -- used for custom legend indicators. Bitmap symbols: cast (LegendAnnotationType)(10001 + bitmapIndex) to use a Resource Bitmap slot as the cell symbol. PREREQUISITE: the bitmap slot must already be registered, by either a graph annotation (PeAnnotation.Graph.Type) or a SubsetPointTypes / PointTypes assignment using that slot. Set table bitmap Type AFTER the registering assignment. Non-colorized (ColorizeMode.None) bitmap cells do not need Color set. See pe-pointcolors for the full bitmap reference. Justification[row, col] = TAJustification.Left/Center/Right; Fonts[row, col] = "fontname"; // per-cell font override COLUMN AND ROW STRUCTURE: ColumnWidth[col] = N; // width in character count units Default: auto-sized to content. Manual width useful for alignment. HeaderRows = N; // first N rows styled as headers HeaderColumn = true; // first column styled as header Headers are visually separated from the grid body. TextSize = 85; // font size, range ~50-200, default 100 STYLING: BackColor = Color.FromArgb(a, r, g, b); // table background ForeColor = Color.FromArgb(a, r, g, b); // default text color Border = TABorder.xxx; // DropShadow(0), SingleLine(1), NoBorder(2), Inset(3), ThickLine(4) GradientStyle = PlotGradientStyle.xxx; // background gradient GradientColor = Color.xxx; // gradient start color BevelStyle = BevelStyle.xxx; // 3D bevel effect TRANSPARENT/INHERIT COLOR: To make BackColor or ForeColor match the chart's GraphBackColor/GraphForeColor, use the full 32-bit zero value: Color.FromArgb(0, 1, 0, 0) // treated as "empty" -- inherits from chart The underlying DLL uses raw 32-bit color values (not .NET Color.Empty). TEXTMODE (paragraph tables): When TextMode=true with Rows=1 and Columns=1, the table becomes a word-wrapping paragraph block. Set Width for wrap width in pixels. Height auto-sizes to fit content. Use Char(10) for line breaks: str = "First paragraph." + ((Char)10).ToString() + "Second paragraph."; Combine with InsidePixelUnits + Moveable.Full for floating text blocks. INTERACTIVITY: Moveable = TAMoveable.None(0) / NoHotSpots(1) / Full(2); Full enables drag-to-move and resize. Position stored in Table.X/Y. HotSpot[row, col] = true; // makes cell clickable Click triggers PeTableAnnotation event. Use GetHotSpotData() to read: hsd.Type == HotSpotType.TableAnnotation0..TableAnnotation19 hsd.Data1 = row, hsd.Data2 = column of clicked cell. Events: PeTableAnnotation (click), PeTAMoved (drag), PeTASizedLeft/Right. REAL-TIME UPDATE (DrawTable): PeFunction.DrawTable(tableIndex) repaints a single table without full chart reinitialize. Use in MouseMove events for live data display: 1. Track mouse via PeUserInterface.Cursor.LastMouseMove 2. Convert pixel to data via PeFunction.ConvPixelToGraph(...) 3. Interpolate Y values from PeData.Y arrays 4. Update Table.Text cells (set Working first) 5. Call DrawTable(0), DrawTable(1), etc. See Example 028 for complete implementation. RELATED FEATURE -- SubsetsToShow: PeData.SubsetsToShow[i] = 0..9; // 0=hide, 1-9=show (weight=draw order) Newer/preferred over RandomSubsetsToGraph. Easier: set 0 to hide, any nonzero to show. Weight controls draw order (9 drawn first/behind). Combined with table HotSpots, enables interactive subset toggle UIs. KEY EXAMPLES: 026 -- Basic workflow, two tables at anchored positions, HeaderRows/Column 027 -- Stacked tables with NewRow, ColumnWidth, per-cell Color 028 -- Symbol cells (Type), real-time DrawTable, multi-axis legend tables 029 -- TableSpaced alignment, InsideTable, transparent colors, mixed methods 034 -- Pixel positioning, Moveable, TextMode paragraphs, HotSpot + events ------------------------------------------------------------------------------ ### FILE: pe-quick-annotations.txt === ProEssentials Quick (knowledge rev 4.1) (Negative) Annotations === Quick Annotations are temporary graph annotations rendered via an optimized path that avoids full image rebuilds. They are ideal for measurement overlays, drag rectangles, crosshairs, and transient tooling UI that updates on every MouseMove. See Example 110 (log-log axes with drag measurement tool). CONCEPT: Normal annotations are part of the chart's cached bitmap (CacheBmp). Changing them requires a full ResetImage rebuild -- too slow for MouseMove. Quick annotations use a separate render list drawn ON TOP of the cached bitmap (CacheBmp2), so only the quick annotation drawing commands are rebuilt each frame. This is the same concept as a display-list overlay. REQUIRED SETUP (in chart configuration): chart.PeConfigure.CacheBmp2 = true; // REQUIRED -- enables the second cache layer HOW TO MARK AN ANNOTATION AS "QUICK" (NEGATIVE TYPE): Instead of setting a positive GraphAnnotationType, negate it with this formula: Graph.Type[i] = ((int)GraphAnnotationType.SomeType + 1) * -1; Examples: // Normal annotation (permanent, part of full image): Graph.Type[0] = (int)GraphAnnotationType.TopLeft; // Quick annotation (temporary, overlay-only): Graph.Type[0] = ((int)GraphAnnotationType.TopLeft + 1) * -1; This works with ANY GraphAnnotationType value. The negative sign is the signal that this annotation belongs to the quick-draw overlay list. SHOWING AND HIDING (trigger the overlay render path): // After setting quick annotation properties, trigger display: chart.PeAnnotation.ShowingQuickAnnotations = true; chart.Invalidate(); chart.Refresh(); // To clear/hide all quick annotations (e.g., on MouseUp): chart.PeAnnotation.ShowingQuickAnnotations = false; chart.PeAnnotation.HidingQuickAnnotations = true; chart.Invalidate(); chart.Refresh(); RENDERING PIPELINE (what happens internally): 1. Normal WM_PAINT with CacheBmp2: bitblits the cached chart image. 2. When ShowingQuickAnnotations = true: after bitblit, the engine rebuilds ONLY the drawing commands for negative-type annotations and composites them on top of the cached image. The cached image itself is NOT rebuilt. 3. When HidingQuickAnnotations = true: the overlay is cleared, reverting to the clean cached image. CacheBmp2 remains valid throughout. Result: smooth real-time annotation updates with minimal CPU usage. COMPLETE EXAMPLE PATTERN (from Example 110 -- drag measurement tool): Setup (chart configuration): Pesgo1.PeConfigure.CacheBmp2 = true; Pesgo1.PeUserInterface.Allow.Zooming = AllowZooming.None; // mouse used for drag Pesgo1.PeUserInterface.Cursor.PromptStyle = CursorPromptStyle.XYValues; Class-level variables: bool bDragging = false; double dDragStartX, dDragStartY; MouseDown handler -- capture start point: bDragging = true; // ConvPixelToGraph to get dDragStartX, dDragStartY in data coordinates // Clamp to ManualMinX/MaxX/MinY/MaxY chart.PeUserInterface.Cursor.PromptStyle = CursorPromptStyle.None; // hide default tooltip MouseMove handler (while dragging) -- build measurement overlay: if (!bDragging) return; // ConvPixelToGraph to get current fX, fY // Clamp to ManualMinX/MaxX/MinY/MaxY // Determine dLeft, dRight, dTop, dBottom from start and current points // Annotation [0]: TopLeft corner of bounding rect Graph.X[0] = dLeft; Graph.Y[0] = dTop; Graph.Type[0] = ((int)GraphAnnotationType.TopLeft + 1) * -1; // Annotation [1]: BottomRight corner of bounding rect Graph.X[1] = dRight; Graph.Y[1] = dBottom; Graph.Type[1] = ((int)GraphAnnotationType.BottomRight + 1) * -1; // Annotation [2]: Filled rectangle overlay (semi-transparent) Graph.X[2] = dRight; Graph.Y[2] = dBottom; Graph.Type[2] = ((int)GraphAnnotationType.RoundRectFill + 1) * -1; Graph.Color[2] = Color.FromArgb(70, 198, 198, 198); // semi-transparent Graph.Text[2] = ""; Graph.GradientStyle[2] = (int)PlotGradientStyle.RadialBottomRight; Graph.GradientColor[2] = Color.FromArgb(170, 255, 255, 255); // Annotation [3]: Rectangle border Graph.X[3] = dRight; Graph.Y[3] = dBottom; Graph.Type[3] = ((int)GraphAnnotationType.RoundRectMedium + 1) * -1; Graph.Color[3] = Color.FromArgb(255, 255, 255, 255); Graph.Text[3] = ""; // Annotation [4]: X-delta label (centered horizontally) Graph.X[4] = centeredX; // midpoint of selection in data coordinates Graph.Y[4] = dTop; Graph.Type[4] = ((int)GraphAnnotationType.NoSymbol + 1) * -1; Graph.Color[4] = Color.FromArgb(255, 0, 255, 0); Graph.Text[4] = "|c<~ " + deltaX + " ~>"; // |c = center justified // Annotation [5]: Y-delta label (centered vertically) Graph.X[5] = dRight; Graph.Y[5] = centeredY; Graph.Type[5] = ((int)GraphAnnotationType.NoSymbol + 1) * -1; Graph.Color[5] = Color.FromArgb(255, 0, 255, 0); Graph.Text[5] = "|D<~ " + deltaY + " ~>"; // |D = perpendicular/angled text Graph.TextSize = 120; chart.PeAnnotation.Graph.Show = true; chart.PeAnnotation.Show = true; chart.PeAnnotation.ShowingQuickAnnotations = true; chart.Invalidate(); chart.Refresh(); MouseUp handler -- clear overlay: bDragging = false; chart.PeAnnotation.ShowingQuickAnnotations = false; chart.PeAnnotation.HidingQuickAnnotations = true; chart.PeUserInterface.Cursor.PromptStyle = CursorPromptStyle.XYValues; // restore tooltip chart.Invalidate(); chart.Refresh(); LOG SCALE CENTERING: When axes use log scale, the visual midpoint of a selection is the geometric mean, not arithmetic mean. Example 110 computes this: double centeredXInLog = (Math.Log10(fX) + Math.Log10(dDragStartX)) / 2.0; double centeredX = Math.Pow(10.0, centeredXInLog); NOTES: - All normal annotation properties work on quick annotations (Color, Text, GradientStyle, GradientColor, BevelStyle, TextSize, text prefixes). - Quick annotations are indexed in the same Graph.X/Y/Type/Color/Text arrays as normal annotations. The negative Type value is the ONLY difference. - You can mix normal (positive) and quick (negative) annotations in the same array. Normal ones render with the cached image; quick ones overlay. - CacheBmp2 = true is also used by DrawCursorToCache for cursor overlays. Both features use the same two-layer caching mechanism. - Quick annotations apply to 2D charts (Pego, Pesgo, Pepso, Pepco). For Pe3do, annotation updates use Force3dxAnnotVerticeRebuild instead. ------------------------------------------------------------------------------ ### FILE: pe-pointlabelsII.txt === ProEssentials PointLabelsII (knowledge rev 4.1) (Multi-Row X-Axis Labels) === Pego-only feature (v10+). Creates a 2D table of hierarchical labels below the x-axis, replacing the simple 1D PointLabels array. WHEN CUSTOMERS ASK FOR THIS: "multi-level x-axis labels", "hierarchical categories", "nested x-axis grouping" (Year/Quarter/Month), "grouped axis labels", "two rows of labels under chart", "parent-child categories on x-axis", "drill-down style axis labels", "multi-tier x-axis". CORE PROPERTY: PeString.PointLabelsII[row, column] -- 2D string array. Columns = PeData.Points count. Rows = 1--50. Row 0 is nearest the chart (finest granularity). Higher rows go further below (coarser grouping). AUTO-MERGE BEHAVIOR (critical concept): Adjacent identical strings in the same row merge into one wider box with a single centered label. Merge is SEQUENTIAL ONLY -- identical labels separated by a different label do NOT merge. Example: "A","A","A","B","B","A","A" --> box(A,3), box(B,2), box(A,2) This is how hierarchical grouping works: coarser rows repeat values across wider spans, producing wider merged boxes. REPLACES PointLabels: When PointLabelsII has data, PointLabels is completely ignored. To revert: PeString.PointLabelsII.Clear() empties the 2D array, causing PointLabels to display again. COMPANION PROPERTIES (almost always used together): PeString.PointLabelsIIBoxed = true; Draws horizontal lines between rows of the label table. PeString.PointLabelsIISeparators = true; Draws vertical lines between columns of the label table. PeString.GridLineSeparators = true; Shifts chart area vertical grid lines to midpoints between data points instead of on top of them. Aligns chart grid with the label table separators. Also useful independently for histograms, bin charts, or any chart where grid lines on data look wrong. PeGrid.Configure.AltFreqThreshold = ; ALWAYS SET THIS when using PointLabelsII. Forces all labels to display, preventing the chart from thinning labels at high point counts. Without this, merged groupings may display incorrectly. Example: if Points=48, set AltFreqThreshold=50 or higher. CODE PATTERN (Example 036 -- 4 subsets, 48 points, 3-row hierarchy): // Row 0: finest labels -- one per point, repeating pattern for (int c = 0; c < 46; c += 3) { Pego1.PeString.PointLabelsII[0, c] = "3.55"; Pego1.PeString.PointLabelsII[0, c + 1] = "3.8"; Pego1.PeString.PointLabelsII[0, c + 2] = "4"; } // Row 1: mid-level -- groups of 3 merge into wider boxes for (int c = 0; c < 37; c += 9) { Pego1.PeString.PointLabelsII[1, c] = "-20"; Pego1.PeString.PointLabelsII[1, c + 1] = "-20"; Pego1.PeString.PointLabelsII[1, c + 2] = "-20"; Pego1.PeString.PointLabelsII[1, c + 3] = "25"; // ... identical values across 3 columns each merge } // Row 2: coarsest -- groups of 9 merge into widest boxes for (int c = 0; c < 9; c++) { Pego1.PeString.PointLabelsII[2, c] = "5.15"; Pego1.PeString.PointLabelsII[2, c + 9] = "5.5"; Pego1.PeString.PointLabelsII[2, c + 18] = "5.9"; } // Required companion settings Pego1.PeGrid.Configure.AltFreqThreshold = 50; // > Points (48) Pego1.PeString.GridLineSeparators = true; Pego1.PeString.PointLabelsIISeparators = true; Pego1.PeString.PointLabelsIIBoxed = true; ZOOMWINDOW INTERACTION: ZoomWindow can render PointLabelsII on its x-axis. Setting PePlot.ZoomWindow.ShowXAxis = false hides it to avoid redundancy, though some users may prefer seeing labels in the zoom window. HOTSPOTS: PeUserInterface.HotSpot.Point = true works with PointLabelsII. Hot spot data includes the multi-row label context. METHODS on PeString.PointLabelsII: Length(), GetLength(dimension), Clear(), Clear(newSize), Copy() --> string[,], CopyFrom(string[,] source). NOT AVAILABLE ON: Pesgo, Pe3do, Pepso, Pepco -- Pego only. ------------------------------------------------------------------------------ ### FILE: pe-axis-formatting.txt === ProEssentials Axis Formatting (knowledge rev 4.1), Inversion & Grid Density === Covers: AxisFormat strings, InvertedAxis, SpecialScaling, grid density control. ALWAYS query pe_query.py for exact paths -- this file provides concepts only. --- AXIS FORMAT STRINGS --- Custom formatting of grid line numbers via pipe-delimited format string: PeGrid.Option.AxisFormatY = "{PRE}|{.}{,}{0000}|{POST}"; SYNTAX: Three sections separated by two pipe | characters (pipes required): PRE -- text prepended to each number (e.g. "$") MID -- formatting controls: . = decimal point, , = thousands commas, 0/00/000 = zero-padding / forced decimal places POST -- text appended to each number (e.g. "sec", " units", "%") EXAMPLES (value 1000): "$|,|" --> "$1,000" prefix + commas "$|,.00|" --> "$1,000.00" prefix + commas + 2 decimals "|.0|sec" --> "1000.0sec" 1 decimal + suffix "$||" --> "$1000" prefix only, no format change "||%" --> "1000%" suffix only Available for all axes (each is WorkingAxis-dependent for multi-axis): PeGrid.Option.AxisFormatY -- Y axis (Pego, Pesgo, Pe3do) PeGrid.Option.AxisFormatRY -- Right Y axis (Pego, Pesgo) PeGrid.Option.AxisFormatX -- X axis (Pesgo, Pe3do) PeGrid.Option.AxisFormatTX -- Top X axis (Pesgo only) PeGrid.Option.AxisFormatZ -- Z axis (Pe3do only) Related: PeConfigure.Decimal and PeConfigure.Thousands override OS locale symbols for decimal separator and thousands separator. CANNOT be combined with SpecialScaling on the same axis. See Example 109. --- INVERTED AXIS --- Flips label polarity so negative data values display as positive numbers. Used for "depth" charts (drilling, underwater, underground) where data increases downward but labels should show positive depth values. ALWAYS USE TOGETHER: 1. Negate the data: PeData.Y[s,p] = -1 * actualValue; 2. Enable inversion: PeGrid.Option.InvertedYAxis = true; The property ONLY changes label display -- it does NOT transform data. All front-facing UX (axis labels, tooltips, cursor prompts) shows positive values. Developer must negate data to match. Available variants (all bool, all WorkingAxis-dependent): PeGrid.Option.InvertedYAxis -- Pego, Pesgo, Pe3do PeGrid.Option.InvertedRYAxis -- Pego, Pesgo PeGrid.Option.InvertedXAxis -- Pesgo, Pe3do, Pepso PeGrid.Option.InvertedTXAxis -- Pesgo only When using InvertedYAxis, also set NullDataValue to a sentinel (e.g. -999) so legitimate zeros are not treated as null. See Example 108. --- SPECIAL SCALING (FINANCIAL FRACTIONS) --- Converts decimal Y-axis labels to fractional notation (e.g. 20 1/2). Used for financial/stock tick pricing. PeGrid.Option.SpecialScalingY = SpecialScaling.Financial; Enum SpecialScaling: None(0), Financial(1). Also: PeGrid.Option.SpecialScalingRY for right Y axis. Fraction precision adapts automatically: -- Shows halves (1/2), quarters (1/4), eighths (1/8), sixteenths (1/16), up to sixty-fourths (1/64) depending on data range and zoom level. -- Reverts to decimal display when zoomed beyond 1/64 precision. No property to manually control denominator -- it's automatic. CANNOT be combined with AxisFormat strings on the same axis. Supports WorkingAxis for multi-axis charts. See Example 111. --- GRID LINE DENSITY CONTROL --- Manually control spacing of major grid lines and minor tick marks: PeGrid.Configure.ManualYAxisTicknLine = true; // enable manual control PeGrid.Configure.ManualYAxisLine = 250; // grid line every 250 units PeGrid.Configure.ManualYAxisTick = 25; // tick mark every 25 units Best practice: ManualYAxisLine should be evenly divisible by ManualYAxisTick. Available for all axes (all WorkingAxis-dependent): ManualYAxisTicknLine / ManualYAxisLine / ManualYAxisTick -- Y axis ManualRYAxisTicknLine / ManualRYAxisLine / ManualRYAxisTick -- RY axis ManualXAxisTicknLine / ManualXAxisLine / ManualXAxisTick -- X axis ManualTXAxisTicknLine / ManualTXAxisLine / ManualTXAxisTick -- TX axis ManualZAxisTicknLine / ManualZAxisTick -- Z axis (Pe3do) Related properties: PeGrid.Option.YAxisLongTicks = true -- extends minor ticks across chart PeGrid.LineControl = GridLineControl.Both -- controls which axes show gridlines Enum GridLineControl: Both(0), YAxis(1), XAxis(2), None(3) TROUBLESHOOTING: If auto-scaling forces multiples of 2/5/10 and your desired spacing conflicts, set: PeGrid.Configure.GridLineMultiples = true; This DISABLES the 2/5/10 constraint (despite the positive name -- the DLL constant is PEP_bNOGRIDLINEMULTIPLES). Rarely needed. See Examples 113, 134. ------------------------------------------------------------------------------ ### FILE: pe-multiaxis-architecture.txt === ProEssentials Multi-Axis (knowledge rev 4.2) Architecture === Multi-axis charts display multiple Y axes on a single chart. Each axis gets its own scale, grid numbers, label, and color. Subsets are assigned to axes. *** CRITICAL RULE -- AXIS CAPACITY *** Each axis group (MultiAxesSubsets entry) supports AT MOST 1 left Y-axis and 1 right Y-axis. This is a hard constraint of the architecture. VISUAL COUNTING METHOD to determine MultiAxesSubsets: Look at each vertical region of the chart. Count the maximum number of Y-axes visible on ONE side (left or right). That count = minimum number of MultiAxesSubsets entries needed for that region. Then use OverlapMultiAxes to stack those axis groups into shared vertical space. Example: Bottom region shows 2 right-side Y-axes (Efficiency, Power). --> Need 2 separate MultiAxesSubsets entries (one subset each). --> OverlapMultiAxes groups them: OverlapMultiAxes[2] = 2. WRONG: MultiAxesSubsets = [1, 1, 2] with OverlapMultiAxes = [1, 1, 1] (puts 2 subsets in one axis group -- only 1 right Y available!) RIGHT: MultiAxesSubsets = [1, 1, 1, 1] with OverlapMultiAxes = [1, 1, 2] (each subset gets its own axis group -- 2 overlapped at bottom) SETUP STEPS: 1. Set total PeData.Subsets across all axes 2. Count Y-axes per side per region to determine axis group count 3. Set MultiAxesSubsets array -- one entry per axis group MultiAxesSubsets[0] = 1 --> first subset on axis 0 MultiAxesSubsets[1] = 1 --> next subset on axis 1 4. Set OverlapMultiAxes to group axes into shared vertical sections Number of entries = number of visual sections (NOT axis groups) Values = how many axis groups share each section 5. Set MultiAxesProportions -- SAME count as OverlapMultiAxes entries (NOT same count as MultiAxesSubsets). Must sum to 1.0. 6. Set MultiAxisStyle for layout: Query: pe_query.py enum "MultiAxisStyle" GroupAllAxes(0) = overlapping, SeparateAxes(1) = stacked with gaps 7. Configure each axis individually using WorkingAxis WORKINGAXIS MECHANISM: Set WorkingAxis = N, then set axis-dependent properties. Those property values apply ONLY to axis N. Then set WorkingAxis = N+1 and configure the next axis. This is how you set independent scales, colors, labels per axis. Example flow: chart.PeGrid.WorkingAxis = 0; chart.PeGrid.Configure.ManualScaleControlY = ManualScaleControl.MinMax; chart.PeGrid.Configure.ManualMinY = 0; chart.PeGrid.Configure.ManualMaxY = 100; chart.PeGrid.WorkingAxis = 1; chart.PeGrid.Configure.ManualScaleControlY = ManualScaleControl.MinMax; chart.PeGrid.Configure.ManualMinY = 0; chart.PeGrid.Configure.ManualMaxY = 5000; IMPORTANT: See pe-workingaxis-dependent-properties for the complete list of which properties are axis-dependent. IMPORTANT: Always reset WorkingAxis = 0 when done configuring axes. Leaving it set to a non-zero value can cause subsequent property sets to apply to the wrong axis unexpectedly. MULTI-AXIS VISUAL OPTIONS: Separators between axis sections: PeGrid.Option.MultiAxesSeparators = MultiAxesSeparators.Thin; Enum values: None, Thin, Thick (query to confirm). Draws a visible divider line between stacked axis regions. Interactive axis sizing: PeUserInterface.Allow.MultiAxesSizing = true; Lets the end user drag separators to resize axis proportions at runtime. ANNOTATIONS IN MULTI-AXIS CHARTS: Graph annotations are a flat global array but can be targeted to specific axis regions. Each annotation has: PeAnnotation.Graph.Axis[i] = axisIndex; // 0--15, matches WorkingAxis The Y coordinate is interpreted in that axis's scale and the annotation renders in that axis's vertical strip. Without setting .Axis[], all annotations default to axis 0. See pe-annotations for the complete multi-axis annotation pattern. OVERLAPPED AXES BEST PRACTICE: When using OverlapMultiAxes, synchronize PeColor.YAxis (the axis label and grid number color) with PeColor.SubsetColors[i] for each axis so the user can visually associate which Y-axis scale belongs to which data: chart.PeGrid.WorkingAxis = i; chart.PeColor.YAxis = myColors[i]; chart.PeColor.SubsetColors[i] = myColors[i]; EQUALLY SPACED GRIDLINES ACROSS AXES: When axes have different scales/heights, use ManualYAxisTicknLine per axis to control grid density so gridlines align visually across sections: chart.PeGrid.WorkingAxis = N; chart.PeGrid.Configure.ManualYAxisTicknLine = true; chart.PeGrid.Configure.ManualYAxisLine = 10.0; // grid line spacing chart.PeGrid.Configure.ManualYAxisTick = 2.0; // tick mark spacing ManualYAxisLine must be divisible by ManualYAxisTick. Same pattern for RY: ManualRYAxisTicknLine, ManualRYAxisLine, ManualRYAxisTick. RIGHT Y-AXIS (independent of multi-axis): Pego, Pesgo, AND Pepso all support a built-in Right Y-Axis via two methods: 1. RYAxisComparisonSubsets = N --> last N subsets plot against RY axis Uses MethodII for RY plotting style. See example 003. 2. PePlot.Methods[i] + OnRightAxis(1000) --> any subset on RY axis See pe-mixing-methods-xaxis for details and enum values. For simple dual-Y charts, use these directly -- no multi-axis needed. Both approaches are valid; Methods[] is often cleaner for complex charts. IMPORTANT: MultiAxesSubsets creates separate axis *sections* (stacked or overlapped) but does NOT assign subsets to the right Y-axis. To get a right Y-axis within a multi-axis layout, combine OverlapMultiAxes with RYAxisComparisonSubsets or Methods[]+1000 inside the axis group. YAXISONRIGHT: PeGrid.Option.YAxisOnRight = true flips ALL Y axes to the right side globally. When combined with RYAxisComparisonSubsets, the comparison subsets plot against the left Y instead (roles swap). LAYOUT OPTIONS: MultiAxisSeparatorSize controls the visual divider between axis sections. MultiAxisStyle controls overlapping vs. separated rendering. Use pe_query.py to look up exact enum values and property paths. BASE EXAMPLE INHERITANCE: Multi-axis examples often build upon a base "CreateSimple" example. When code says "builds upon CreateSimpleGraph '000'", refer to example 000 for all base configuration (data, labels, table, styling, etc.). Base examples by chart type: 000 (Pego), 100 (Pesgo), 200 (Pepso), 300 (Pepco), 400 (Pe3do). RECONFIGURING MULTI-AXIS LAYOUTS DYNAMICALLY: MultiAxesSubsets, OverlapMultiAxes, and MultiAxesProportions are all empty by default. If you switch between layouts at runtime, old array values persist until explicitly cleared. Always Clear() before rebuilding: chart.PeGrid.MultiAxesSubsets.Clear(); chart.PeGrid.OverlapMultiAxes.Clear(); chart.PeGrid.MultiAxesProportions.Clear(); Then re-populate only the entries the new layout requires. Do NOT zero elements individually -- .Clear() empties the array completely. KEY: Query pe_query.py for all property paths before coding. pe_query.py props "MultiAxesSubsets,MultiAxisStyle,WorkingAxis" pe_query.py search "multi axis" ------------------------------------------------------------------------------ ### FILE: pe-workingaxis-dependent-properties.txt === 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. ------------------------------------------------------------------------------ ### FILE: pe-datetime-handling.txt === ProEssentials Date/Time (knowledge rev 4) Handling === ProEssentials supports date/time X-axes through serial date values. Enable DateTimeMode on PeData, then pass dates as OLE Automation doubles. SERIAL DATE FORMAT: C#: double serialDate = myDateTime.ToOADate(); This produces a double where the integer part = days since Dec 30, 1899 and fractional part = time of day (0.5 = noon). ProEssentials renders these as formatted date/time axis labels. PESGO DATE/TIME: 1. Set PeData.DateTimeMode = true 2. Set PeData.X[s, p] = dateTime.ToOADate() for each point 3. ProEssentials auto-detects appropriate date format from data range 4. Fine-tune with YearMonthDayStyle, TimeLabelsOnDataBoundary, etc. PEGO DATE/TIME: 1. Set PeData.DateTimeMode = true 2. Set PeData.DeltaX = serial interval between points Daily: DeltaX = 1.0 Hourly: DeltaX = 1.0/24.0 Monthly: DeltaX = 30.0 (approximate) or use DeltasX[] for variable 3. Set a StartTime reference point 4. PointLabels are auto-generated from dates VARIABLE TIME STEPS (Pego): Use DeltasX[] array for non-uniform intervals. DeltasX[i] = interval between point i and point i+1 in serial days. Useful for: trading days (skip weekends), irregular sampling. CUSTOM DATE FORMATTING: For full control, disable DateTimeMode and use the PeCustomGridNumber event. In the handler, convert the numeric grid value back to DateTime and format with any .NET format string. See example 132. DATE FORMAT PROPERTIES: YearMonthDayStyle -- date component ordering DateTimeLabelType -- controls which date parts show TimeLabelsOnDataBoundary -- snap labels to data points vs. round numbers KNOWN QUIRK: The DateTimeMode property maps to DLL constant PEP_nDATETIMEMODE. The unified-docs JSON has a mapping anomaly (maps to DateTimeShowSeconds). The enriched JSON correctly shows PeData.DateTimeMode as type bool. In code, set it as a boolean: PeData.DateTimeMode = true; KEY: pe_query.py props "DateTimeMode,DeltaX,YearMonthDayStyle" ------------------------------------------------------------------------------ ### FILE: pe-mixing-methods-xaxis.txt === ProEssentials Mixing (knowledge rev 4) Plot Methods & Pego X-Axis === MIXING PLOT METHODS: ProEssentials can display different plotting methods on the same chart by assigning different methods to different subsets. Primary method: PePlot.Method = GraphPlottingMethod.Line (applies to all) Per-subset override: PePlot.Methods[subsetIndex] = GraphPlottingMethods.Bar RIGHT Y-AXIS VIA METHODS[] (key feature): Add OnRightAxis (value 1000) to any plotting method enum to place that subset on the right Y axis with its own independent scale: PePlot.Methods[0] = GraphPlottingMethods.Bar; // left Y PePlot.Methods[1] = GraphPlottingMethods.Line + (int)GraphPlottingMethods.OnRightAxis; // right Y NOTE: A (int) cast is required when adding enum values together in C#. For Pesgo: SGraphPlottingMethods adds OnRightTopAxis(2000), OnTopAxis(3000). Query: pe_query.py enum "GraphPlottingMethods" Query: pe_query.py enum "SGraphPlottingMethods" IMPORTANT -- Methods[] is NOT WorkingAxis-dependent: PePlot.Methods[] is a global per-subset array. It applies regardless of WorkingAxis. Do NOT set WorkingAxis expecting it to affect Methods[]. Contrast: PePlot.Method (singular) IS WorkingAxis-dependent and sets the method for all subsets on the current axis. Common mix: Lines for trends + Bars for volume on same chart. With multi-axis, each axis group can have its own plotting method. Methods[] enum also includes multi-subset types (HighLowArea, BoxPlot, OpenHighLowClose, etc.) -- see pe-specificplotmode knowledge file. COMPARISONSUBSETS + METHODII (splitting subsets into two plotting styles): ComparisonSubsets = N --> last N subsets render via MethodII instead of Method. RYAxisComparisonSubsets = N --> last N subsets on right Y axis via MethodII. TXAxisComparisonSubsets = N --> last N subsets on top X axis (Pesgo only). MethodII default = Line (value 0). All three are WorkingAxis-dependent. Query: pe_query.py props "Method,Methods,MethodII,ComparisonSubsets" DO NOT MIX THE TWO APPROACHES: Methods[] + OnRightAxis and ComparisonSubsets/RYAxisComparisonSubsets + MethodII are two independent mechanisms for the same goal. Mixing them on the same chart produces unpredictable results. Choose one approach and use it exclusively. When using Methods[], zero ComparisonSubsets and RYAxisComparisonSubsets on every WorkingAxis pass to ensure they never interact with Methods[]. RULES: - Not all method combinations work visually (e.g., stacked + non-stacked) - Bar methods need compatible X-axis positioning PEGO X-AXIS CONFIGURATION: Pego's X-axis is categorical/sequential. No X data array. Point labels: PeString.PointLabels[i] = "Category Name" Date/Time on Pego X-axis: Set DateTimeMode = true on PeData Set DeltaX = time interval in serial days (1.0 = daily, 1/24 = hourly) Starting date: controlled by the StartTime-related properties For variable intervals: use DeltasX[] array Point vs. Subset orientation: Default: each Subset is a series, Points are categories With SubsetByPoint = false: orientation is transposed CUSTOM AXIS SCALES (for both Pego and Pesgo): ManualScaleControl enum: None (auto), Min, Max, MinMax Set ManualScaleControlY = ManualScaleControl.MinMax Then set ManualMinY and ManualMaxY. Same pattern for X axis (Pesgo) and RY axis (Pego, Pesgo, Pepso). With multi-axis: set WorkingAxis first. Custom grid numbers: use PeCustomGridNumber event for full format control. Query: pe_query.py recipe "custom-grid" ------------------------------------------------------------------------------ ### FILE: pe-events-interaction.txt === ProEssentials Events (knowledge rev 4.1) & Interaction Patterns === ProEssentials fires .NET events for user interactions. This file documents the actual coding patterns, setup requirements, and gotchas. EVENT WIRING: chart.PeEventName += handler; Handler signature: void Handler(object sender, SpecificEventArgs e) EventArgs in Gigasoft.ProEssentials.EventArg namespace. === PATTERN A: Pixel-to-Data Coordinate Conversion === ConvPixelToGraph converts mouse pixel position to data-coordinate values. Full signature: PeFunction.ConvPixelToGraph(ref int axisIndex, ref int pixelX, ref int pixelY, ref double graphX, ref double graphY, bool rightAxis, bool topAxis, bool viceVersa) Parameters: axisIndex -- INPUT when using OverlapMultiAxes (set which axis to query). OUTPUT when using MultiAxesSubsets without overlap (returns axis hit). Initialize to 0 if not using multi-axis. pixelX/pixelY -- INPUT: mouse pixel coords. OUTPUT: nearest grid intersection. graphX/graphY -- OUTPUT: data coordinate values at that pixel location. rightAxis -- true reads Right Y axis value, false reads Left Y axis. topAxis -- true reads Top X axis value, false reads Bottom X axis. viceVersa -- true reverses: converts graph coordinates TO pixels. Standard usage idiom (in MouseMove handler): System.Drawing.Point pt = chart.PeUserInterface.Cursor.LastMouseMove; System.Drawing.Rectangle rect = chart.PeFunction.GetRectGraph(); if (rect.Contains(pt)) { int nA = 0, nX = pt.X, nY = pt.Y; double fX = 0, fY = 0; chart.PeFunction.ConvPixelToGraph(ref nA, ref nX, ref nY, ref fX, ref fY, false, false, false); // fX, fY now contain data coordinates } Note: ManualMinX/MaxX/MinY/MaxY are only valid AFTER chart has been rendered on screen at least once. Use them to clamp coordinates to chart extents. === PATTERN B: HotSpot Detection via GetHotSpot() === GetHotSpot() returns HotSpotData struct with .Type enum and .Data1/.Data2. Call anytime in MouseMove (does not require a click event). Also: SearchSubsetPointIndex(pixelX, pixelY) returns Point(subsetIndex, pointIndex) for closest data point -- works even when no hot spot is directly hit. HotSpotData struct: .Type = HotSpotType enum, .Data1 and .Data2 meanings per type: None(0) -- no hot spot Subset(1) -- Data1=subset index Point(2) -- Data1=point index Graph(3) -- graph area (no specific item) Table(4) -- Data1=row, Data2=column DataPoint(5) -- Data1=subset index, Data2=point index GraphAnnotation(6) -- Data1=annotation index XAxisAnnotation(7) -- Data1=annotation index YAxisAnnotation(8) -- Data1=annotation index HorzLineAnnotation(9) -- Data1=annotation index VertLineAnnotation(10) -- Data1=annotation index MainTitle(11) -- no extra data SubTitle(12) -- no extra data MultiSubTitle(13) -- Data1=index, Data2=justification (0=left,1=center,2=right) MultiBottomTitle(14) -- Data1=index, Data2=justification YAxisLabel(15) -- Data1=axis, Data2=0(left)/1(right) XAxisLabel(16) -- Data1=0(bottom)/1(top) YAxis(17) -- Data1=axis, Data2=0(left)/1(right) XAxis(18) -- Data1=0(bottom)/1(top) YAxisGridNumber(19) -- grid number clicked RYAxisGridNumber(20) -- right Y grid number clicked XAxisGridNumber(21) -- X grid number clicked TXAxisGridNumber(22) -- top X grid number clicked TableAnnotation0-59(23-82) -- Data1=row, Data2=column (table index = Type-23) ZAxisGridNumber(83) -- Pe3do Z axis grid number PeDataHotSpot event has named args: e.SubsetIndex, e.PointIndex. GetHotSpot() struct uses generic: ds.Data1, ds.Data2. Both access the same underlying data. Enabling hot spots (set BEFORE rendering): PeUserInterface.HotSpot.Data = true; // data points PeUserInterface.HotSpot.Subset = true; // subset legends PeUserInterface.HotSpot.Point = true; // point labels PeUserInterface.HotSpot.Title = true; // title text PeUserInterface.HotSpot.AxisLabel = true; // axis labels PeUserInterface.HotSpot.GridNumberY = true; // Y grid numbers PeUserInterface.HotSpot.GridNumberX = true; // X grid numbers PeUserInterface.HotSpot.Size = HotSpotSize.Large; // or (HotSpotSize)12 for custom === PATTERN C: Custom Tracking Tooltips === PeCustomTrackingDataText -- customize tooltip for DATA area hover/cursor. PeCustomTrackingOtherText -- customize tooltip for NON-DATA areas (titles, axes, legends). Requires matching HotSpot enables (HotSpot.Title, HotSpot.Subset, etc.) Setup requires ALL of: chart.PeUserInterface.Cursor.PromptTracking = true; chart.PeUserInterface.Cursor.PromptLocation = CursorPromptLocation.ToolTip; chart.PeUserInterface.Cursor.TrackingCustomDataText = true; // for data area chart.PeUserInterface.Cursor.TrackingCustomOtherText = true; // for non-data areas In handler, set e.TrackingText to your custom string. Use \n for multiline. Reading interpolated values (works even between data points): chart.PeUserInterface.Cursor.CursorValueX // interpolated X chart.PeUserInterface.Cursor.CursorValueY // interpolated Y chart.PeUserInterface.Cursor.CursorValueZ // interpolated Z (contour/3D) Distinguish trigger source: if (chart.PeUserInterface.Cursor.TrackingPromptTrigger == TrackingTrigger.MouseMove) // tooltip from mouse hover -- pixel between data points // use CursorValueX/Y or ConvPixelToGraph for interpolated coords else // tooltip from keyboard cursor move -- snapped to exact data point // use Cursor.Subset / Cursor.Point to read actual Y data Dynamic tooltip styling (set inside handler before setting TrackingText): chart.PeUserInterface.Cursor.TrackingTooltipTitle = "Custom Title"; chart.PeUserInterface.Cursor.TrackingTooltipBkColor = Color.FromArgb(0, R, G, B); chart.PeUserInterface.Cursor.TrackingTooltipTextColor = Color.FromArgb(0, R, G, B); Alpha is IGNORED (Windows tooltip UX has no transparency). RGB(0,0,0) = black. These properties PERSIST until changed again -- set each time in handler if values need to vary (e.g. different colors for positive vs negative data). See pe-cursor-tooltip knowledge file for full cursor/tooltip architecture. === PATTERN D: Table Annotations as Interactive UI === Table annotations become clickable buttons/controls via per-cell hot spots. Setup: PeAnnotation.Table.HotSpot[row, col] = true; // per cell Event: PeTableAnnotation fires with e.WorkingTable, e.RowIndex, e.ColumnIndex. Use GetHotSpotData() to read HotSpotType.TableAnnotation0 through 59. Table.Working = N switches which table (0-59) subsequent property calls target. Example: write to table 0, then table 1: chart.PeAnnotation.Table.Working = 0; chart.PeAnnotation.Table.Text[0, 2] = "value1"; chart.PeAnnotation.Table.Working = 1; chart.PeAnnotation.Table.Text[0, 2] = "value2"; DrawTable(tableIndex) -- efficient partial redraw of one table only. Use during MouseMove for real-time updating without full ResetImage. Example: chart.PeFunction.DrawTable(0); // redraws only table 0 === PATTERN E: Custom Grid Number Formatting === PeCustomGridNumber event fires for each grid number during rendering. Enable per-axis: PeGrid.Option.CustomGridNumbersY = true; (WorkingAxis-dependent!) Also: PeGrid.Option.CustomGridNumbersX = true; Event args: e.AxisType values: 0=Y, 1=RY, 2=X, 3=TX, 4=ExtraX, 5=ExtraTX e.AxisIndex -- which axis (0-5) when using MultiAxesSubsets or SetExtraAxisX e.NumberValue -- the raw numeric value for this grid line e.NumberString -- SET this to override the displayed string WARNING: Do not debug this event with breakpoints. Breakpoints may trigger WM_PAINT causing image rebuild loops. Use debug strings instead. This advice applies generally to all ProEssentials code during image construction. === PATTERN F: Custom Popup Menus === Setup (in chart configuration code): CustomMenuText[index] = "text" // "|" = separator line CustomMenuText[index] = "Popup|Sub1|Sub2|Sub3" // popup with subitems CustomMenuState[menuIndex, 0] = Checked/UnChecked // simple items CustomMenuState[menuIndex, subIndex] = Checked // popup subitems CustomMenu[menuIndex, subIndex] = CustomMenu.Grayed // disable item CustomMenuLocation[index] = CustomMenuLocation.Bottom PeCustomMenu event: e.MenuIndex identifies which menu, e.SubmenuIndex identifies which popup subitem (0 = main popup header, 1+ = subitems). === PATTERN G: Data Point Dragging === Three-event pattern: DataHotSpot -> MouseMove -> MouseUp. Requires: PeUserInterface.HotSpot.Data = true; HotSpot.Size = Large; // Class-level variables bool bDragging = false; int nDragIndexS, nDragIndexP; // PeDataHotSpot -- capture which point was clicked void chart_PeDataHotSpot(..., DataHotSpotEventArgs e) { bDragging = true; nDragIndexS = e.SubsetIndex; nDragIndexP = e.PointIndex; } // MouseMove -- update data at dragged point void chart_MouseMove(...) { if (!bDragging) return; // ConvPixelToGraph to get fX, fY (see Pattern A) // Clamp to ManualMin/Max extents chart.PeData.X[nDragIndexS, nDragIndexP] = (float)fX; chart.PeData.Y[nDragIndexS, nDragIndexP] = (float)fY; chart.PeFunction.PartialReinitialize(); chart.PeFunction.ResetImage(0, 0); chart.Invalidate(); chart.Refresh(); } // MouseUp -- end drag void chart_MouseUp(...) { bDragging = false; } === PATTERN H: Zoom Events === PeZoomIn fires after user completes a zoom. Read zoom extents: chart.PeGrid.Zoom.MinX / MaxX / MinY / MaxY Use to place annotations within zoomed region or react to zoom changes. === PATTERN I: 3D-Specific Event Patterns === 3D KeyPress camera targeting (examples 400, 403, 404): In KeyPress, read key 0-9 to select an annotation group. Get annotation coordinates, call Pe3do1.PeFunction.SetViewingAt(x, y, z). Set PePlot.Option.ViewingMode = ViewingMode.DataLocation (focus on point). Toggle back: ViewingMode = ViewingMode.Center (default orbit). Adjust PePlot.Option.DxZoom for zoom level at target. 3D Polygon highlight in MouseMove (examples 400, 407): On hot spot hit, build StartPoly->AddPolyPoint->EndPolygon annotations tracing the subset's data to create a highlight polygon overlay. Set PeAnnotation.InFront = false so surface renders in front of highlight. Always: PeFunction.Force3dxAnnotVerticeRebuild = true after any 3D annotation change. Set trailing annotation Text = "" to prevent VirtualLabels from showing. 3D HighLightAnnotationIndex (example 403): PeAnnotation.Graph.HighLightAnnotationIndex = N; Draws a highlighted colored sphere at annotation index N. Set to -1 to clear. Useful for mousemove or animated highlighting. KEY: Use pe_query.py to verify exact event signatures and property paths. pe_query.py search "hotspot" pe_query.py search "cursor" pe_query.py search "tracking" ------------------------------------------------------------------------------ ### FILE: pe-cursor-tooltip.txt === ProEssentials Cursor (knowledge rev 4.1), ToolTip & CacheBmp Patterns === CORE: PeConfigure.CacheBmp = true; -- ALWAYS SET for all charts. Caches rendered image in memory for flicker-free repainting. Without it, any window overlap causes flicker. No exceptions. Direct2D/Direct3D RenderEngines force it true automatically. CORE: HourGlassThreshold -- set to very large value to disable hourglass cursor during mousemove. Legacy feature from when computers were slow. Modern apps: set to effectively infinite: Cursor.HourGlassThreshold = 1000000000; // disable hourglass === TWO INDEPENDENT SYSTEMS share PeUserInterface.Cursor parent === SYSTEM 1: CursorMode -- visible crosshair/line/square OVERLAY on chart. Gives a specific data point the "focus" (subset index + point index). User navigates with arrow keys (Left/Right = points, Up/Down = subsets) or mouse click (requires MouseCursorControl = true + HotSpot.Data = true). CursorMode values: NoCursor(0) -- no visible cursor overlay (default) Point(1) -- vertical line at focused POINT INDEX (0..Points-1) DataCross(2) -- crosshair lines through focused data point DataSquare(3) -- small square on focused data point FloatingXY(5) -- crosshair follows mouse freely (no point snap) FloatingXOnly(6)-- vertical line follows mouse X position FloatingYOnly(7)-- horizontal line follows mouse Y position FloatingY(4) -- horizontal line follows mouse Y position WARNING: "Point" means point-index focus, NOT a dot/symbol. Floating modes (FloatingXY/XOnly/YOnly) follow mouse freely without snapping to data points -- useful as visual guides while custom MouseMove code reads interpolated values via ConvPixelToGraph (e.g. updating table annotations, example 028). Lazy cursor activation pattern (example 030): start with no CursorMode, then on PeDataHotSpot click set CursorMode.Point and Cursor.Point = e.PointIndex. Cursor only appears after first user interaction -- focused, intentional UX. Reading cursor focus: Cursor.Subset, Cursor.Point (zero-based indices). PeCursorMoved event fires when cursor moves to new data point. SYSTEM 2: PromptTracking -- shows data coordinates as user moves mouse. Works INDEPENDENTLY of CursorMode. You can have tooltips without a visible cursor overlay, or a cursor overlay without tooltips. Setup: Cursor.PromptTracking = true; Cursor.PromptStyle = CursorPromptStyle.XYValues; (etc.) Cursor.PromptLocation = CursorPromptLocation.ToolTip; (etc.) === PromptLocation Options === Left(0) -- text in upper-left corner of chart Right(1) -- text in upper-right corner of chart ToolTip(2) -- standard Windows API tooltip popup (most common) Text(3) -- larger text overlay following mouse on chart For Pe3do (3D), ONLY Text location is supported. Font size controls differ by location: PeFont.SizeCursorPromptCntl -- adjusts Left/Right corner text (0.25-2.0) Cursor.FontSizeTrackingCntl -- adjusts Text location only (0.5-2.0) ToolTip location: font size controlled by Windows, not adjustable. === PromptStyle (what values to show) === None(0), XValue(1), YValue(2), XYValues(3), XYZValues(4), ZValue(5) For Pe3do (3D): only YValue and XYZValues produce output. Others are silently ignored (no error). XZ permutations make no sense in 3D. === CacheBmp2 and Colored Cursors === Default cursor uses legacy SetROP2 XOR drawing -- it inverts pixels on screen, producing no actual "color" (just inverted overlay). For colored cursor lines, enable the newer Direct2D drawing pipeline: PeConfigure.CacheBmp2 = true; // secondary screen buffer Cursor.DrawCursorToCache = true; // draw cursor to cache Cursor.CursorColor = Color.Red; // actual cursor color Cursor.VertLineType = LineAnnotationType.Dash; // line style Cursor.HorzLineType = LineAnnotationType.Dash; DrawCursorToCache auto-sets ImprovedCursor = true (not reverse). Use DrawCursorToCache -- it is the modern uniform property for both WinForms and WPF. ImprovedCursor is older, was WPF-only originally. CacheBmp2 is also required for Quick Annotations (see example 110). === Custom Tracking Tooltips (Event-Driven Content) === Setup requires ALL of: Cursor.PromptTracking = true; Cursor.PromptLocation = CursorPromptLocation.ToolTip; // or Text Cursor.TrackingCustomDataText = true; // fires PeCustomTrackingDataText Cursor.TrackingCustomOtherText = true; // fires PeCustomTrackingOtherText PeCustomTrackingDataText -- fires when mouse is over DATA area. PeCustomTrackingOtherText -- fires when mouse is over NON-DATA areas (titles, axes, legends, grid numbers). Requires matching HotSpot enables: HotSpot.Title, HotSpot.Subset, HotSpot.AxisLabel, etc. In handler: set e.TrackingText = "your string"; Use \n for multiline. Reading interpolated values (work even between data points): Cursor.CursorValueX, Cursor.CursorValueY, Cursor.CursorValueZ TrackingPromptTrigger dual-path pattern: if (Cursor.TrackingPromptTrigger == TrackingTrigger.MouseMove) // Mouse hover -- use ConvPixelToGraph for interpolated coords // or CursorValueX/Y for auto-interpolated values else // TrackingTrigger.CursorMove // Keyboard arrow moved cursor -- snapped to exact data point // Use Cursor.Subset / Cursor.Point to read actual Y data === Tooltip Styling (set inside event handler) === Cursor.TrackingTooltipTitle = "Bold Title"; // first line, bold Cursor.TrackingTooltipBkColor = Color.FromArgb(0, R, G, B); Cursor.TrackingTooltipTextColor = Color.FromArgb(0, R, G, B); Cursor.TrackingTooltipMaxWidth = 250; // pixel max width IMPORTANT: Alpha channel is IGNORED. Standard Windows tooltip UX does not support transparency. RGB(0,0,0) = black, not transparent. These properties PERSIST until changed again. Set them each time inside the handler if they need to vary (e.g. different colors for positive vs negative values as shown in example 105). === MouseCursorControl options === Cursor.MouseCursorControl = true; // click data point to move cursor Requires: HotSpot.Data = true; Cursor.MouseCursorControlClosestPoint = true; // click NEAR data point No need to hit exact hot spot -- snaps to closest point. === PeCursorMoved Event === Fires after cursor moves to a new data point (arrow keys or mouse click). Read: Cursor.Subset, Cursor.Point for current focus. Common pattern: update table annotations with data at focused point: int nX = chart.PeUserInterface.Cursor.Point; float val = chart.PeData.Y[subsetIndex, nX]; chart.PeAnnotation.Table.Text[row, col] = val.ToString(); chart.PeFunction.DrawTable(0); // efficient partial redraw === Pe3do (3D) Cursor Specifics === Pe3do has NO CursorMode overlay. No crosshair/line/square on 3D. Always use RenderEngine Direct3D for 3D charts. HighlightColor -- colors polygon under mouse (3D only): Cursor.HighlightColor = Color.FromArgb(255, 255, 0, 0); PromptLocation: only Text(3) is supported (not ToolTip). PromptStyle: only YValue(2) or XYZValues(4). In PeCustomTrackingDataText for 3D: Use GetHotSpot() to check ds.Type == HotSpotType.DataPoint Read PeData.Y[ds.Data1, ds.Data2] for actual data value Or Cursor.CursorValueY for interpolated surface value. === Cursor.Hand Property === Cursor.Hand = (int)MouseCursorStyles.Arrow; // override hotspot cursor Default is a pointing hand over hot spots. Set to Arrow or other style for different UX feel. Purely cosmetic, case-by-case. === Other Cursor Properties === Cursor.ProcessingMouseMove -- read-only bool, true when PE internal logic is processing mousemove. Check to avoid conflicts with custom MouseMove handlers (see example 032). Cursor.LastMouseMove -- read-only Point, last mouse position. Standard idiom for ConvPixelToGraph and GetRectGraph().Contains(). Cursor.PromptShorten -- when true, numeric values >9 digits switch to exponential notation in prompt string. Cursor.Zoom, Cursor.NoDrop, Cursor.SizeNS -- override mouse cursor styles during zoom, no-drop, and axis sizing operations. ------------------------------------------------------------------------------ ### FILE: pe-hotspots.txt === ProEssentials HotSpot (knowledge rev 4) Configuration === HotSpots make chart regions clickable. Each hotspot type has an ENABLE property and a corresponding EVENT. Both must be configured. ENABLE/EVENT MATRIX: Type Enable Property Group Event Name Data PeUserInterface.HotSpot.Data PeDataHotSpot Subset PeUserInterface.HotSpot.Subset PeSubsetHotSpot Point PeUserInterface.HotSpot.Point PePointHotSpot TableCell PeUserInterface.HotSpot.Table PeTableHotSpot GraphAnnot PeUserInterface.HotSpot.GraphAnnotation PeAnnotationHotSpot AxisAnnot PeUserInterface.HotSpot.XAxisAnnotation PeAnnotationHotSpot PeUserInterface.HotSpot.YAxisAnnotation LINE ANNOTATION HOTSPOTS (special -- uses enum, not bool): Horizontal line annotations: PeUserInterface.HotSpot.YAxisLineAnnotations[i] Vertical line annotations: PeUserInterface.HotSpot.XAxisLineAnnotations[i] These are per-annotation arrays indexed by annotation index. Values: enum AnnotationHotSpot (None=0, All=1, TextOnly=2, LineOnly=3) Event: PeAnnotationHotSpot (check eventArgs.AnnotationType to distinguish) TABLE HOTSPOT EXTRA: PeAnnotation.Table.HotSpot = true also required for table cell clicking. HOTSPOT EVENT ARGS: All hotspot events provide indices in their EventArgs: PeDataHotSpot --> e.Subset, e.Point (which data point was clicked) PeSubsetHotSpot --> e.Subset (which series was clicked) PePointHotSpot --> e.Point (which X position was clicked) PeAnnotationHotSpot --> e.AnnotationIndex, e.AnnotationType CURSOR PROMPT INTERACTIONS: Separately from hotspots, cursor prompts show data values on hover. Controlled by CursorPromptStyle enum and related properties. Query: pe_query.py search "cursor prompt" Pe3do 3D CURSOR TRACKING (requires ALL THREE together): PeUserInterface.HotSpot.Data = true; PeUserInterface.Cursor.PromptTracking = true; PeUserInterface.Cursor.HighlightColor = Color.FromArgb(255, 255, 0, 0); Without non-zero alpha on HighlightColor, no visual feedback appears on the surface even though tracking is enabled. The highlight renders as a colored quad on the surface mesh at the mouse position. CursorPromptStyle: only YValue and XYZ are valid options for Pe3do. PERFORMANCE: Pe3do builds an OctTree data structure for hit testing. OctTree construction is CPU-intensive for large surfaces (2000x2000+) and runs on a secondary worker thread. DISABLE cursor tracking before any operation that triggers multiple image rebuilds (e.g., Z-axis exaggeration slider, panning a linked 2D contour chart). Re-enable after the operation completes. Failure to disable causes repeated OctTree rebuilds that severely degrade responsiveness. KEY: Use pe_query.py to verify exact paths: pe_query.py search "hotspot" pe_query.py event "PeDataHotSpot" ------------------------------------------------------------------------------ ### FILE: pe-zoom.txt === ProEssentials Zoom (knowledge rev 4.2) & Scroll === Zooming and scrolling differ between Pego (categorical) and Pesgo (numeric). PESGO AXIS CONTROL -- THREE INDEPENDENT LEVELS: A Pesgo axis can be controlled at three levels. Understanding this prevents confusion between "zooming" and "manual scaling": a) AUTO-SCALED (default) -- chart finds min/max from data ManualScaleControlY = ManualScaleControl.None; b) MANUALLY SCALED -- developer sets fixed range ManualScaleControlY = ManualScaleControl.MinMax; ManualMinY = 0; ManualMaxY = 100; c) ZOOM-CONTROLLED -- overlays manual scaling without changing it PeGrid.Zoom.MinY = 20; PeGrid.Zoom.MaxY = 80; PeGrid.Zoom.Mode = true; The axis now shows 20--80 while ManualMinY/MaxY stay 0/100. Zoom mode is useful when a developer wants to manually scale but also allow zooming (user-interactive or programmatic) without disturbing the manual scale values. Undo zoom restores the manual range. This is especially useful in real-time where ManualMinX/MaxX track the data window and zoom allows the user to focus on a region. PESGO ZOOM (true numeric zoom): Enable: PeUserInterface.Allow.Zooming = AllowZooming enum value Options: HorzAndVert, HorzOnly, VertOnly, HorzAndVertMb, etc. User rubber-bands a region --> chart zooms to that data range. Programmatic zoom (Pesgo): PeGrid.Zoom.MinX = startValue; PeGrid.Zoom.MaxX = endValue; PeGrid.Zoom.MinY = bottomValue; PeGrid.Zoom.MaxY = topValue; PeGrid.Zoom.Mode = true; // activates zoom PeFunction.ReinitializeResetImage(); PROGRAMMATIC ZOOM + MULTIAXESSUBSETS: When using MultiAxesSubsets, programmatic ZoomMode = true IS supported but ONLY for horizontal zooming. The constraint: - AllowZooming MUST be set to AllowZooming.Horizontal (not HorzAndVert) - ZoomMinX / ZoomMaxX work normally (X-axis is shared across all axes) - ZoomMinY / ZoomMaxY CANNOT meaningfully address multiple independent Y-axis scales, so vertical zoom extents are not usable This is a common customer pattern: automating focus to a data region (e.g., most recent window, anomaly region, specific time range). Example 124 demonstrates this pattern. Key code pattern: Pesgo1.PeUserInterface.Allow.Zooming = AllowZooming.Horizontal; Pesgo1.PeUserInterface.Scrollbar.ScrollingHorzZoom = true; Pesgo1.PeGrid.Zoom.MinX = 40000; Pesgo1.PeGrid.Zoom.MaxX = 60000; Pesgo1.PeGrid.Zoom.Mode = true; Pesgo1.PePlot.ZoomWindow.Show = true; // overview strip Pesgo1.PeFunction.ReinitializeResetImage(); Undo: PeFunction.UndoZoom() Reset: PeGrid.Zoom.Mode = false + reinitialize ZOOM WINDOW (overview strip -- do NOT confuse with zoom mode): PePlot.ZoomWindow is a VISUAL FEATURE -- a miniature overview panel at the bottom of the chart showing the full data range with a highlighted box indicating the current zoom region. This is purely a UI element. It does NOT control axis scaling. PePlot.ZoomWindow.Show = true -- shows overview when zoomed PePlot.ZoomWindow.ShowXAxis -- show X-axis labels in overview PePlot.ZoomWindow.Height -- proportion of total height (default 0.12) PePlot.ZoomWindow.SubsetsToShow -- filter which subsets appear PePlot.ZoomWindow.PlottingMethods -- override plotting style PePlot.ZoomWindow.CustomGridNumbersX -- enable custom grid numbers PEGO SCROLL (point-based scrolling): Pego doesn't zoom numerically -- it scrolls through points. PeUserInterface.Scrollbar.PointsToGraph = N (visible window size) PeUserInterface.Scrollbar.HorzScrollPos = startIndex MouseWheel: MouseWheelFunction enum controls wheel behavior (scroll, zoom, or disabled). MOUSEWHEEL ZOOM -- REQUIRED SCROLLBAR FLAGS: MouseWheelFunction controls what the wheel does, but the scrollbar infrastructure must also be armed or the wheel has nothing to act through. Always pair MouseWheelFunction with the matching Scrollbar flags: MouseWheelFunction.HorizontalVerticalZoom: ScrollingHorzZoom = true ScrollingVertZoom = true MouseWheelFunction.HorizontalZoom: ScrollingHorzZoom = true MouseWheelFunction.VerticalZoom: ScrollingVertZoom = true WITHOUT THE FLAGS: only one axis zooms, or zoom-out does not work. WHY THIS IS EASY TO MISS: The demo app's CreateSimpleSGraph sets AllowZooming = HorzAndVert which internally activates the scrollbar infrastructure. When example 110 then overrides with AllowZooming.None, the infrastructure stays armed. Standalone projects that start with AllowZooming.None never pass through HorzAndVert, so the flags must be set explicitly. This is a future engine improvement candidate -- setting MouseWheelFunction should auto-enable the matching flags. ZOOM EVENTS: PeBeforeZoom -- fires before zoom, can cancel via e.Cancel = true PeAfterZoom -- fires after zoom completed Access zoom extents in event handler to sync external UI. KEY: pe_query.py props "AllowZooming,ZoomMode" pe_query.py enum "AllowZooming" pe_query.py recipe "zoom" ------------------------------------------------------------------------------ ### FILE: pe-legends.txt === ProEssentials Legends (knowledge rev 4.2) === ProEssentials legends display subset labels with their visual identifiers (colors, line types, point symbols). Configuration is under PeLegend. LEGEND STYLE (LegendStyle enum -- Pego, Pesgo, Pe3do): PeLegend.Style = LegendStyle.xxx; TwoLine (0) -- symbol above, text below (default) OneLine (1) -- symbol and text on single line OneLineInsideAxis (2) -- inside the graph area per-axis OneLineTopOfAxis (3) -- between axis regions (SeparateAxes only) OneLineInsideOverlap (4) -- inside graph, compact overlap OneLineLeftOfAxis (5) -- to the left of axis area Pepso uses SimpleLegendStyle enum (TwoLine=0, OneLine=1 only). OneLineInsideAxis is ideal for multi-axis SeparateAxes layouts -- each axis section gets its own legend showing only its subsets. LEGEND LOCATION (LegendLocation enum -- all chart objects): PeLegend.Location = LegendLocation.xxx; Top (0), Bottom (1), Left (2), Right (3) OneLine style only works with Top and Bottom locations. Left/Right locations use TwoLine layout regardless of Style setting. LEGEND VISIBILITY: PeLegend.Show = true/false -- master show/hide LEGEND APPEARANCE: PeLegend.SimplePoint = true -- draw point symbol only (no bounding box) PeLegend.SimpleLine = true -- simpler line representation PeLegend.AllowLargerLegendWidth = 250 -- pixel threshold below which top/bottom legend uses full control width instead of grid-justified PeString.SubsetLabels[s] = "Series Name" -- text per subset PeLegend.SubsetLineTypes[s] -- LineType enum per subset in legend PeLegend.SubsetPointTypes[s] -- PointType enum per subset in legend SUBSET ORDERING AND FILTERING: SubsetsToLegend -- controls which subsets appear and their ORDER in legend: PeLegend.SubsetsToLegend[i] = subsetIndex; If empty, all subsets appear in default order. Fill with zero-based subset indices to filter and/or reorder. Example -- show only subsets 0 and 2, in that order: PeLegend.SubsetsToLegend[0] = 0; PeLegend.SubsetsToLegend[1] = 2; INDEPENDENT CONTROL -- plotting order, legend order, and table order are three independently controllable dimensions: PeData.RandomSubsetsToGraph -- controls draw order and visibility PeLegend.SubsetsToLegend -- controls legend order and visibility PeTable.SubsetsToTable -- controls table order and visibility (Pego only) Example 033 demonstrates reversing stacked bar draw order (3,2,1,0) while keeping legend and table in natural order (0,1,2,3). SubsetsToShow -- simpler visibility + draw order control: PeData.SubsetsToShow[subsetIndex] = priority; // 0--9 0 = hidden, 1--9 = visible, higher values drawn first (behind). Applies to: Pego, Pesgo, Pepso. Easier than RandomSubsetsToGraph for basic show/hide needs. RandomSubsetsToGraph -- older, more explicit visibility control: PeData.RandomSubsetsToGraph[i] = subsetIndex; Lists subset indices to include. Order controls draw order. Applies to: Pego, Pesgo, Pepso. Related to ScrollingSubsets for permanent vs. scrollable subsets. LEGEND REPLACEMENT VIA VERTICAL GRID NUMBERS (Pego, Pesgo): When using overlapped multi-axes, a traditional legend can be confusing because multiple subsets share the same visual space. Example 129 demonstrates replacing the legend entirely with colored axis labels that include embedded point symbols. REQUIRED PROPERTY CONSTELLATION: PeGrid.Option.YAxisVertGridNumbers = true; -- rotates Y-axis grid numbers to vertical orientation, freeing horizontal space normally consumed by the axis label PeGrid.Option.VgnAxisLabelLocation = true; -- moves YAxisLabel to the TOP of each axis instead of the side, where it serves as a compact per-axis legend entry PER-AXIS LABEL WITH EMBEDDED SYMBOL (pipe code): PeString.YAxisLabel = "Subset 1|4"; The |N suffix embeds the GraphAnnotationType symbol N (integer value) as a colored marker inline with the label text. Common values: |4 = DotSolid, |6 = SquareSolid, |8 = DiamondSolid, |10 = UpTriangleSolid, |12 = DownTriangleSolid The symbol inherits its color from PeColor.YAxis for that axis. COLOR MATCHING: PeGrid.WorkingAxis = i; PeColor.YAxis = PeColor.SubsetColors[i]; This makes the axis label, grid numbers, and embedded symbol all match the subset's plot color -- creating an implicit per-axis legend. COMPLEMENTARY SETTINGS: PeLegend.Show = false -- suppress the now-redundant legend PeGrid.Option.ShowYAxis = ShowAxis.GridNumbers -- numbers only PeGrid.Option.ShowRYAxis = ShowAxis.GridNumbers -- same for RY PeString.TextShadows = TextShadows.NoShadows -- cleaner vertical text PeColor.TickColor = Color.FromArgb(0,1,0,0) -- hide ticks (PE empty) PeConfigure.ImageAdjustLeft/Right = 50 -- extra margin space See Example 129 for complete implementation. NOTE: The |N pipe code on YAxisLabel only works when YAxisVertGridNumbers = true AND VgnAxisLabelLocation = true. Without both properties, the symbol will not render properly. LEGEND ANNOTATIONS (custom items added to legend area): Beyond standard subset legends, you can add arbitrary custom entries with their own symbols, text, and colors: PeLegend.AnnotationType[i] = (int)LegendAnnotationType.xxx; PeLegend.AnnotationText[i] = "Custom Label"; PeLegend.AnnotationColor[i] = Color.FromArgb(255, r, g, b); LegendAnnotationType uses same symbols as GraphAnnotationType. BITMAP LEGEND ANNOTATIONS: Resource Bitmaps can serve as legend annotation symbols by setting AnnotationType to (10001 + bitmapIndex): PeLegend.AnnotationType[i] = 10001; PeLegend.AnnotationText[i] = "Custom Label"; PREREQUISITE: the bitmap slot must already be registered, by either a graph annotation (PeAnnotation.Graph.Type) or a SubsetPointTypes / PointTypes assignment using that slot. Set legend bitmap AnnotationType AFTER the registering assignment. Non-colorized (ColorizeMode.None) bitmap legend annotations do not need AnnotationColor set. See pe-pointcolors for the full bitmap reference. REQUIREMENT: LegendAnnotations attach to the existing legend area -- they require a chart type/mode that natively produces a legend. If no legend is generated, there is nothing for them to attach to. Pe3do only produces a native subset legend in Scatter mode. Surface, ThreeDBar, and PolygonData modes do NOT generate a subset legend, so LegendAnnotations will not appear. For legends on Pe3do Bar charts, use ContourLegendII or Table Annotations instead -- see pe-pe3do-patterns knowledge file "LEGEND FOR 3D BAR CHARTS" section. Applies to: Pego, Pesgo, Pepso, and Pe3do Scatter mode only. Multi-axis targeting for legend annotations: PeLegend.AnnotationAxis[i] = axisIndex; // 0--15 Associates the annotation with a specific axis. If that axis is hidden or removed, the legend annotation also hides automatically. KEY: Always query exact paths before coding: pe_query.py enum "LegendStyle" pe_query.py enum "LegendLocation" pe_query.py props "SubsetsToLegend,SubsetsToShow,SubsetsToTable" pe_query.py props "LegendAnnotationType,LegendAnnotationText" ------------------------------------------------------------------------------ ### FILE: pe-pointcolors.txt PE-POINTCOLORS -- Per-DataPoint Color and Type Control (knowledge rev 4.3) POINTCOLORS BASICS: PePlot.PointColors[subset, point] -- 2D Color array, same dimensions as PeData.Y. Must define a color for EVERY [s,p] that should be colored. Undefined entries may render invisible or black depending on RenderEngine. When PointColors is populated, it overrides SubsetColors for data rendering. SubsetColors should still be set separately for legend color swatches. Works with: bars, points, line segments, stick, stacked bar, 3D scatter points, 3D bars, 3D surface polygons (quads). Alpha channel: Color.FromArgb(0, r, g, b) produces fully transparent/hidden content on any RenderEngine (GdiPlus, Direct2D, Direct3D). Can be used to selectively hide individual data points. Non-zero alpha values create translucent blending. SELECTIVE SUBSET GATING -- SubsetForPointColors: PePlot.SubsetForPointColors[index] -- int array listing which subset indices should use PointColors. Unlisted subsets fall back to SubsetColors. If SubsetForPointColors is NOT set (empty): ALL subsets use PointColors and colors must be defined for all [s,p] positions. If set: only the listed subset indices use PointColors. Example: SubsetForPointColors[0]=0; SubsetForPointColors[1]=1; --> subsets 0,1 use PointColors; subsets 2,3+ use SubsetColors. POINTCOLORPOINTS -- What Gets Colored: PeColor.PointColorPoints (also accessible as PePlot.PointColorPoints, same DLL constant, interchangeable). Controls whether PointColors applies to point symbols, line segments, or both when PlottingMethod is PointsPlusLine. PointsAndOrLines enum: PointsAndLinesColored (0) -- color both points and lines PointsColored (1) -- color points only (default) LinesColored (2) -- color lines only Relevant only for line+point methods. For bars/pure points, PointColors always colors the rendered element. PER-DATAPOINT POINT TYPES (parallel system): PePlot.PointTypes[subset, point] -- 2D PointType array, same pattern as PointColors. PePlot.SubsetForPointTypes[index] -- gating array, same logic as SubsetForPointColors. PePlot.SubsetPointTypes[subset] -- per-SUBSET default point types (1D array). SubsetForPointColors and SubsetForPointTypes are fully independent. Can mix: some subsets use PointColors, different subsets use PointTypes, some use both, some use neither. RESOURCE BITMAP SYMBOLS (custom image point types): Standard PointType enum provides geometric shapes (Plus, Cross, Dot, Square, Diamond, Triangle, Arrow variants). For custom image symbols (PNG files), use Resource Bitmaps. Scope: Pego, Pesgo, Pepso. Usable as SubsetPointTypes, per-point PointTypes, and graph/table/legend annotation symbols. The pattern uses WorkingBitmap like WorkingAxis -- set the slot index, configure all properties for that slot, then move on. Setup pattern (repeat for each bitmap, slot 0-150): PePlot.Bitmaps.WorkingBitmap = 0; PePlot.Bitmaps.Filename = "symbol01.png"; PePlot.Bitmaps.ColorizeMode = ResourceBitmapColorizeMode.Mask; PePlot.Bitmaps.Style = ResourceBitmapStyle.SmallCentered; Assign to a subset via magic-number cast: PePlot.SubsetPointTypes[S] = (PointType)(10001 + bitmapIndex); Standard PointType enum maxes around ~99 (ArrowNW). Values >= 10001 are interpreted as bitmap resource references. Per-point form: PePlot.PointTypes[s, p] = (PointType)10001; COLORIZEMODE (ResourceBitmapColorizeMode enum): None (0) -- bitmap drawn in its native colors. Each color variant requires a separate file. Use for 3D rendered spheres or complex colored icons where recoloring would look wrong. Examples 142, 143. Mask (1) -- all visible pixels swapped to a single new color. Source bitmap is a dark/silhouette shape on transparent background; engine recolors per subset. One file -> unlimited colors. Tint (2) -- White/gray highlights preserved, the rest tinted toward the target color. Use when source artwork has shading (gradients, glints, soft 3D look) you want to keep while recoloring the hue. Mask and Tint demonstrated in examples 015 and 140. COLOR SOURCE -- where Mask/Tint pull their color from: Subset symbol (SubsetPointTypes / PointTypes) -> SubsetColors[s] (or PointColors[s,p] when populated). Graph annotation (PeAnnotation.Graph.Type) -> PeAnnotation.Graph.Color[i]. Table/legend annotation -> inherited from whatever originally registered the bitmap (graph annotation or subset). ORDERING REQUIREMENT (critical): Setting ColorizeMode pre-loads and colorizes the resource using the current color value, AND assigning the bitmap type (SubsetPointTypes / Graph.Type / etc.) re-binds color at that moment. Safest pattern: 1. Set the color source first (SubsetColors[s] or Graph.Color[i]) 2. Configure WorkingBitmap slot (Filename, ColorizeMode, Style) 3. Assign the type (SubsetPointTypes[s] / Graph.Type[i] / etc.) Skipping step 1 leaves the bitmap colorized with whatever was current, which is a common cause of "wrong color" bugs. RENDERENGINE: Set RenderEngine = Direct3D early when configuring resource bitmap features -- you must set RenderEngine = Direct3D BEFORE setting the Resource bitmap settings (see Example 140): PeConfigure.RenderEngine = RenderEngine.Direct3D; DIRECT2D vs DIRECT3D COLORIZE TIMING (Colorize / Mask / Tint): - Direct2D pre-adjusts the bitmap color at the time you set the Resource bitmap items. Therefore, under Direct2D you must set SubsetColors BEFORE the bitmap settings (the color source must already be in place when the bitmap is colorized). - Direct3D does NOT pre-adjust the bitmap color -- the pixel shader performs the colorize at render time. This is why RenderEngine = Direct3D must be set before the Resource bitmap settings. - For Pesgo/Pego with RenderEngine = Direct3D, Direct2D still draws the legend area, so legend bitmap colorization follows the Direct2D pre-adjust behavior there. LEGACY API: PePlot.Bitmaps.Colorize (bool) still compiles but is deprecated. The old Colorize = true mapped to Mask only. New code uses ColorizeMode for access to Tint and explicit None. GRAPH ANNOTATION BITMAPS: Graph annotations can use bitmap symbols the same way subsets do. PeAnnotation.Graph.Color[i] = Color.FromArgb(...); // color FIRST PeAnnotation.Graph.Type[i] = (int)10001; // 10001 + slot index For Mask/Tint, the color source is GraphAnnotationColor[i], not SubsetColors. For None-mode bitmaps the color value is unused. TABLE AND LEGEND ANNOTATION BITMAPS: Same magic-number pattern with type-specific casts: PeAnnotation.Table.Type[r,c] = (LegendAnnotationType)10001; PeLegend.AnnotationType[i] = 10001; PeLegend.AnnotationText[i] = "Tint"; REGISTRATION PREREQUISITE: a bitmap can only be referenced from a table or legend annotation slot if the same bitmap was already "registered" earlier by either: - a graph annotation assignment (PeAnnotation.Graph.Type[i] = 10001+N), or - a SubsetPointTypes / PointTypes assignment using that bitmap. If neither is naturally in play, define a throwaway graph annotation at off-screen coordinates just to register the bitmap. Always set table and legend annotation bitmap types AFTER the graph or subset assignments that register them. Non-colorized (None-mode) table/legend annotation bitmaps do not need a color set. RESOURCEBITMAPSTYLE enum (37 values) organized as Size x Position: Sizes: ActualSize, Small, Medium, Large, DataSized Positions: Centered, N, NE, E, SE, S, SW, W, NW Examples: SmallCentered(19), MediumN(10), LargeSE(35), DataSized(39) LEGEND DISPLAY: Bitmap resource symbols appear automatically in the legend alongside subset labels, properly colorized when Mask or Tint is in use. VECTOR EXPORT LIMITATION: When bitmap resources are used, pure vector export (WMF/EMF) is not possible. Disable these options: PeUserInterface.Dialog.AllowWmfExport = false; PeUserInterface.Dialog.AllowEmfExport = false; Note: WMF is also not ideal for large datasets regardless of bitmaps. See Examples 015, 140 (Mask + Tint), 142, 143 (None / native colors). POINT SIZE CONTROL: PePlot.PointSize -- PointSize enum (Small/Medium/Large/Micro). PePlot.Option.MinimumPointSize -- MinimumPointSize enum, but accepts integer cast for exact pixel sizes: (MinimumPointSize)4 = 4 pixels minimum. PePlot.Option.MaximumPointSize -- same MinimumPointSize type, same cast trick. This extends point sizing beyond the 4 named enum values. CONTOURLEGENDII -- Secondary Color Legend for PointColors: PeLegend.ContourLegendII.* properties create a secondary gradient legend bar. NOT automatically connected to PointColors -- developer must manually sync the colors in PointColors with ContourLegendII.SubsetColors, and set the numeric range via ManualContourMin/Max. Purely a visual legend. Key properties: .ShowContourLegend = ShowContourLegendII.SecondPlusFirst | SecondOnly .ManualContourScaleControl = ManualScaleControl.MinMax .ManualContourMin / .ManualContourMax -- numeric range .ManualContourLine -- label frequency/increment .SubsetColors[i] -- color array for the legend gradient .ContourLegendTitle -- title text .ContourLegendPrecision -- decimal places FASTCOPYFROM WITH INT[] -- BGR FORMAT: When using FastCopyFrom(int[] source) to bulk-load PointColors, the native DLL expects colors in BGR order, not the standard RGB order used by System.Drawing.Color. Use the static helper to convert: Color[] myColors = { ... }; var bgr = TwoDimensionalColorArray.ColorArrayToPeColor32(myColors); Pesgo1.PeColor.PointColors.FastCopyFrom(bgr); The peColor32 type is the native DLL color format. For spoon-fed indexer assignments (PointColors[s,p] = Color.FromArgb(...)), no conversion is needed -- the .NET wrapper handles the conversion automatically. 3D SURFACE POINTCOLORS (Pe3do): PointColors[s,p] maps to individual surface grid polygons/quads. Can paint arbitrary patterns on the surface (regions, targets, zones). Color.FromArgb(0,0,0,0) creates transparent areas; combine with NullDataValue + SurfaceNullDataGaps=true for actual surface holes. After changing colors in Direct3D mode: PeFunction.Force3dxNewColors = true; PeFunction.Force3dxVerticeRebuild = true; Force3dxNewColors is for any runtime color change in Direct3D, not just initial setup (though some examples set it during init for safety). CODE PATTERNS: // Pego bar gradient ramp (example 008): Pego1.PePlot.PointColors[s, p] = Color.FromArgb(55, (byte)(15+((p+1)*20)), 0, 0); Pego1.PeColor.SubsetColors[0] = someColor; // legend still needs SubsetColors // Selective gating (example 133): Pesgo1.PePlot.SubsetForPointColors[0] = 0; // subset 0 uses PointColors Pesgo1.PePlot.SubsetForPointColors[1] = 1; // subset 1 uses PointColors // subsets 2,3 fall back to SubsetColors // Color lines not points (example 141): Pesgo1.PeColor.PointColorPoints = PointsAndOrLines.LinesColored; // 3D surface polygon coloring (example 403): Pe3do1.PePlot.PointColors[s, p] = Color.FromArgb(102, 178, 178, 0); // Mask-mode bitmap (silhouette recolored by SubsetColor) -- example 140: Pesgo1.PeColor.SubsetColors[0] = Color.Red; // color FIRST Pesgo1.PePlot.Bitmaps.WorkingBitmap = 0; Pesgo1.PePlot.Bitmaps.Filename = "symbol01.png"; Pesgo1.PePlot.Bitmaps.ColorizeMode = ResourceBitmapColorizeMode.Mask; Pesgo1.PePlot.Bitmaps.Style = ResourceBitmapStyle.SmallCentered; Pesgo1.PePlot.SubsetPointTypes[0] = (PointType)10001; // Tint-mode bitmap (shading preserved, hue retinted) -- example 140: Pesgo1.PeColor.SubsetColors[1] = Color.Green; Pesgo1.PePlot.Bitmaps.WorkingBitmap = 1; Pesgo1.PePlot.Bitmaps.Filename = "tint.png"; Pesgo1.PePlot.Bitmaps.ColorizeMode = ResourceBitmapColorizeMode.Tint; Pesgo1.PePlot.Bitmaps.Style = ResourceBitmapStyle.SmallCentered; Pesgo1.PePlot.SubsetPointTypes[1] = (PointType)10002; // None-mode bitmap (native colors, no recoloring) -- examples 142, 143: Pesgo1.PePlot.Bitmaps.WorkingBitmap = 2; Pesgo1.PePlot.Bitmaps.Filename = "symbolBlueDot.png"; Pesgo1.PePlot.Bitmaps.ColorizeMode = ResourceBitmapColorizeMode.None; Pesgo1.PePlot.Bitmaps.Style = ResourceBitmapStyle.SmallCentered; Pesgo1.PePlot.SubsetPointTypes[2] = (PointType)10003; // Graph annotation as bitmap symbol -- example 140: Pego1.PePlot.Bitmaps.WorkingBitmap = 0; Pego1.PePlot.Bitmaps.Filename = "tint.png"; Pego1.PePlot.Bitmaps.ColorizeMode = ResourceBitmapColorizeMode.Tint; Pego1.PePlot.Bitmaps.Style = ResourceBitmapStyle.LargeCentered; Pego1.PeAnnotation.Graph.Color[22] = Color.FromArgb(255, 215, 0, 215); // FIRST Pego1.PeAnnotation.Graph.Type[22] = (int)10001; Pego1.PeAnnotation.Graph.X[22] = 3.5; Pego1.PeAnnotation.Graph.Y[22] = 1390; // Table / legend annotation reusing the registered bitmap -- example 140: // (Graph annotation above already registered slot 0; now reuse.) Pego1.PeAnnotation.Table.Type[0, 1] = (LegendAnnotationType)10001; Pego1.PeLegend.AnnotationType[0] = 10001; Pego1.PeLegend.AnnotationText[0] = "Tint"; ------------------------------------------------------------------------------ ### FILE: pe-styling-appearance.txt === ProEssentials Styling (knowledge rev 4) & Appearance === ProEssentials styling is controlled through PeColor, PeFont, PeConfigure, and PePlot property groups. ALWAYS query pe_query.py for exact paths. COLOR SYSTEM (PeColor group): SubsetColors[] -- per-series colors (the primary palette) GraphForeground / GraphBackground -- graph area colors Desk -- background behind titles and labels (NOT "DeskColor") Text -- foreground for titles and labels (NOT "TextColor") Shadow -- drop shadow color (NOT "ShadowColor") YAxis / RYAxis / XAxis -- axis line colors GridLineColor -- grid line color with GridLineAlpha transparency NOTE: Color property names are often SHORT. Never guess full names. Query: pe_query.py props --category color --list QUICK STYLING: ViewingStyle enum -- broad visual themes (Color, Monochrome, etc.) QuickStyle enum -- predefined color schemes (numbered presets) BitmapGradientMode -- enable gradient backgrounds Set BitmapGradientMode BEFORE QuickStyle for gradient schemes. FONT SIZING (PeFont group): All font sizes use a proportional control system with "Cntl" suffix: SizeTitleCntl, SizeSubTitleCntl, SizeLegendCntl, SizeAxisLabelCntl, SizeGridNumberCntl, etc. Values are percentages (100 = default). Font families: MainTitle.Font, SubTitle.Font, Label.Font (string names). Bold/Italic: MainTitle.Bold, SubTitle.Italic, etc. NOTE: Font size property names use abbreviations (not "FontSizeAxisLabel" but "SizeAxisLabelCntl"). Always verify with pe_query.py. DATA VISUALIZATION: DataShadows enum -- 3D shadow effects on bars/points PointSize -- size of scatter points LineSymbolSize -- size of line markers BarWidth / BarGap -- bar chart spacing SubsetLineTypes[] -- per-series line styles (solid, dash, dot, etc.) RENDERING ENGINE: RenderEngine enum: GDI (default), Direct3D (GPU), Direct2D Direct3D enables: 3D surfaces, compute shaders, GPU-accelerated rendering. GDI is standard for 2D charts, broadest compatibility. TITLES AND LABELS (PeString group): MainTitle, SubTitle -- chart titles YAxisLabel, XAxisLabel, RYAxisLabel -- axis labels SubsetLabels[] -- legend entries per series PointLabels[] -- X-axis category labels (Pego) KEY: pe_query.py props "ViewingStyle,QuickStyle,SubsetColors" pe_query.py enum "ViewingStyle" pe_query.py search "gradient" ------------------------------------------------------------------------------ ### FILE: pe-printing.txt === ProEssentials Printing (knowledge rev 4) & Export === ProEssentials provides programmatic printing and image export through PeFunction methods and PeUserInterface.Allow/Dialog properties. SIMPLE PRINTING: PeFunction.PrintGraph(parentHandle, titleString, orientation) Shows print dialog, prints the chart. Orientation via DefOrientation enum. After printing, ALWAYS call PeFunction.ResetImage(0, 0) to restore screen. CUSTOM PRINTING (multi-chart per page): Use PrintGraphEx for precise layout control with a PrintDocument. 1. Create PrintDocument, handle PrintPage event 2. In PrintPage: get Graphics hDC from e.Graphics 3. Call PeFunction.PrintGraphEx(hDC, x, y, width, height, ...) per chart 4. After all printing: PeFunction.ResetImage(0, 0) Query: pe_query.py function "PrintGraphEx" IMAGE EXPORT: PeFunction.Image provides export to various formats: Methods on PeFunction.Image: PngToStream, JpgToStream, etc. Call with desired width/height in pixels. After export: PeFunction.ResetImage(0, 0) to restore screen rendering. DPI CONTROL: ExportImageDpi controls the resolution for export operations. PrintDpi affects printer output resolution. For high-quality print: set DPI before printing, reset after. EXPORT DIALOGS: PeUserInterface.Allow.Exporting -- let users export via right-click menu. PeUserInterface.Menu.ExportDialog -- show export dialog programmatically. EMF EXPORT: EmfType and EmfDC properties control Enhanced Metafile output. Use for vector graphics (scalable, editable in Illustrator/Visio). PRINT STYLE: PrintStyleControl -- adjust line weights and sizes for print vs. screen. Typically print needs heavier lines than screen display. CRITICAL PATTERN -- ALWAYS RESET: ANY printing or export operation temporarily modifies the chart's rendering target. You MUST call PeFunction.ResetImage(0, 0) afterward or the on-screen chart will not render correctly. Known anomaly: HObject documentation references this pattern. The HObject property (PeSpecial.HObject) provides the Win32 handle needed for advanced DLL-level printing operations. KEY: pe_query.py function "PrintGraph" pe_query.py search "export image" pe_query.py recipe "printing" ------------------------------------------------------------------------------ ### FILE: pe-nulldata.txt === ProEssentials Null Data (knowledge rev 4.1) & Missing Data Patterns === All 2D null data features apply to Direct2D/GdiPlus rendering only. CRITICAL DEFAULT: NullDataValue defaults to 0.0 for ALL chart objects. This means ZEROS ARE NOT PLOTTED by default -- they are treated as null. If your data contains legitimate zeros, you MUST change NullDataValue: Pego1.PeData.NullDataValue = -9999; // Pego: Y only Pesgo1.PeData.NullDataValue = -9999; // Pesgo: Y Pesgo1.PeData.NullDataValueX = -9999; // Pesgo: X (also Pepso, Pe3do) Pesgo1.PeData.NullDataValueZ = -9999; // Pesgo/Pe3do: Z (contour/bubble/3D) Common sentinel values: -9999, -99999, -999. Avoid >7 digits with single-precision data. CREATING NULL DATA: Set data points equal to your NullDataValue sentinel: Pego1.PeData.NullDataValue = -9999.0; Pego1.PeData.Y[0, 3] = -9999; // this point is now null NULLDATAGAPS -- LINE BEHAVIOR (PePlot.Option.NullDataGaps): false (DEFAULT): Lines BRIDGE over null data -- line extends from last valid point to next valid point, skipping nulls. No visual gap. true: Lines BREAK at null data -- line stops before null, resumes after. Most developers want true as it is the more logical rendering. Applies to: Pego, Pesgo, Pepso. NULLDATAGAPSAREA -- AREA BEHAVIOR (PePlot.Option.NullDataGapsArea): false (DEFAULT): Area plotting BRIDGES across null data regions. true: Area stops and restarts around null data, forming gaps. Isolated valid points between nulls render as vertical lines. Applies to: Pego, Pesgo. Separate from NullDataGaps because area fill behavior differs from line. ISOLATED VALID POINTS BETWEEN NULLS: When NullDataGaps=true, a valid point surrounded by nulls on both sides renders as a point symbol only (no line connects to it). The symbol used is the SubsetPointType for that subset -- MarkDataPoints does NOT need to be enabled. This catches developers off-guard when they see unexpected symbols and don't realize a valid point sits between two null values. LINEGAPTHRESHOLD -- DISTANCE-BASED GAPS (PePlot.Option.LineGapThreshold): Alternative to NullDataGaps. Instead of marking individual points null, gaps form when the distance between consecutive non-null points exceeds the threshold. For Pesgo: distance = X-axis difference. For Pego: distance = point-index difference. USE ONE OR THE OTHER -- do not combine NullDataGaps and LineGapThreshold. Only applies when PlottingMethod = Line. FILTER2D AND NULL DATA INTERACTION (PeData.Filter2D): Filter2D is a Direct2D/GdiPlus data-reduction optimization. IMPORTANT: When data contains many scattered null values, set Filter2D = Filter2D.Disable Aggressive filtering with scattered nulls can produce rendering artifacts. Filter2D has no relationship to Direct3D rendering. PE3DO (3D SURFACES) -- SURFACENULLDATAGAPS: PeData.SurfaceNullDataGaps (Pe3do only, under PeData not PePlot.Option): false (DEFAULT): Quads with null vertices are PEGGED to the bottom of the Y axis (not removed -- they render flat at Y minimum). true: Quads with a null vertex are REMOVED, forming holes in the surface. Direct3D surfaces do NOT bridge null data (unlike 2D line/area). SurfaceNullDataGaps=true is a PREREQUISITE for ManualScaleCullMaxY and related cull features to affect surface charts. PE3DO (3D SCATTER/LINE/AREA via Direct3D): Scatter points: NullDataValue Y/X/Z supported -- null points not rendered. Line topology: Null vertices cause line segments to be removed (lines have 2 vertices, so segments touching a null vertex disappear). Area/Waterfall: Null Y data causes area portions to not render, forming gaps in the area fill. Alternative for scatter: Use PointColors with alpha=0 to make individual points invisible (Color.FromArgb(0, r, g, b)). TABLE DISPLAY: Null data values appear as blank cells in data tables below the chart (visible in Example 006 -- table shows gaps where data is null). ------------------------------------------------------------------------------ ### FILE: pe-realtime-patterns.txt === ProEssentials Real-Time (knowledge rev 4.1) Patterns === Real-time charting applies to Pego, Pesgo, Pepso, and Pe3do. Each has different data models and refresh needs. Complexity compounds when using Direct3D vs Direct2D. Always query pe_query.py for paths. --- ESSENTIAL SETUP (all real-time, all objects) --- PeConfigure.PrepareImages = true; // standard for all charts PeConfigure.CacheBmp = true; // standard for all charts These are standard initialization for any chart but critical for real-time -- they cache static elements (titles, axes, legend) so only the graph area redraws each tick. PeSpecial.AutoImageReset = false; // important for real-time AutoImageReset is an internal safety feature: when true, if any property changes, the chart flags itself dirty and auto-rebuilds on the next WM_PAINT. Setting false skips that check. Safe when you always call ReinitializeResetImage or ResetImage explicitly after changing properties (which real-time code always does). Manual axis scaling is strongly recommended for real-time. Auto- scaling requires the chart to search all data for min/max each update -- CPU intensive, especially with large datasets. --- REAL-TIME UPDATE STRATEGIES --- STRATEGY 1 -- APPENDDATA (strip chart, most common) Shifts existing data and adds new at the edge. Direction controlled by PeData.AppendToEnd (true=append right, false=append left). Works with: Pego, Pesgo, Pe3do. Call: PeData.Y.AppendData(newValues, amountPerSubset) Also: PeData.X.AppendData(...) for Pesgo/Pe3do numeric X data. PeData.Z.AppendData(...) for Pesgo contour or Pe3do data. MEMORY LAYOUT for the newValues array (non-jagged data): Data is organized as all points for subset 0, then subset 1, etc. For 4 subsets with 150 new points each: array length = 4 x 150. Layout: [s0p0..s0p149, s1p0..s1p149, s2p0..s2p149, s3p0..s3p149] For X data with DuplicateDataX, only one subset's worth is needed. Pego-specific: also append point labels to keep them in sync: PeString.PointLabels.AppendData(labelString); Pre-allocate labels at setup: PeString.PointLabels[Points-1] = ""; Pre-allocate Y data at setup: PeData.Y[lastSubset, Points-1] = 0; Pego scroll control with AppendData: PeUserInterface.Scrollbar.PointsToGraph = N; // visible window PeUserInterface.Scrollbar.PointsToGraphInit = Last; // show newest Note: PointsToGraph is not real-time-specific -- it controls how many points are visible, adding a scrollbar for the rest. Pe3do with AppendData: shifts points within ALL subsets simultaneously, producing a scrolling surface effect. See Strategy 4 for waterfall. Examples: 17(Pego), 116-117(Pesgo), 145-146(Pesgo), 410,413(Pe3do), 412(Pe3do bar) STRATEGY 2 -- FASTCOPYFROM (full data replace each tick) Replace ALL data every timer tick. Best for waveform displays where entire buffer changes simultaneously (oscilloscope-style). Call: PeData.Y.FastCopyFrom(array, totalSize) Set ReuseDataX = true in timer if X data is unchanged (see below). Manual axis scaling required -- no time for auto-ranging. Example 115: 4 subsets x 100K points, 400K values replaced per tick. Pepso real-time would typically use this strategy since the full polar dataset changes each update. STRATEGY 3 -- DIRECT INDEX WRITE WITH WRAP Write data directly by index, wrap counter at end of buffer. No shifting, no appending -- just overwrite in place. PeData.Y[0, counter] = newY; PeData.X[0, counter] = newX; counter++; if (counter >= Points) counter = 0; Good for circular displays where old data is overwritten. Example 118: 100-point buffer, line annotation tracks position. STRATEGY 4 -- APPENDSUBSET (Pe3do waterfall only) Shifts all subsets and adds a new complete subset -- each tick adds a new "row" (area plot) to a waterfall visualization. Call: Pe3do1.PeData.Y.AppendSubset(newYData, amountPerPoint) Also: X.AppendSubset(...), Z.AppendSubset(...) IMPORTANT: CircularBuffers do NOT work with AppendSubset. CircularBuffers only work with AppendData. Contrast with Pe3do AppendData (Strategy 1) which shifts points within all subsets -- scrolling surface vs waterfall. Example 411. STRATEGY 5 -- USEDATAATLOCATION (zero-copy, largest datasets) App manages its own memory; chart points to it, no copy. Call: PeData.Y.UseDataAtLocation(localArray, bufferSize) Update your local array directly, then trigger chart refresh. Can combine with CircularBuffers and AppendData -- PE appends into your local memory using its circular pointer. Example 146: 4 subsets x 2M points, zero-copy, faster than 145. --- REFRESH AND REPAINT RULES --- This is the most confusing area. The correct refresh call depends on the render engine and whether axis scales need updating. WHEN AXIS SCALES MUST UPDATE (auto-range or manual extents changed): PeFunction.ReinitializeResetImage() // all objects This internally calls PEreinitialize (recomputes scale ranges -- CPU intensive for large data) then PEresetimage (rebuilds image). Follow with Invalidate() or Refresh(). WHEN ONLY DATA CHANGES (scales are manually set and fixed): Direct2D / GdiPlus: PeFunction.ReinitializeResetImage() is still used, but if scales are manually set, the ranging step is minimal. Direct3D (Pesgo and Pe3do): PeFunction.Force3dxVerticeRebuild = true; // flag vertex rebuild Then Invalidate(); // no ReinitializeResetImage needed This is dramatically faster -- skips all scale computation. Pesgo with Direct3D: if ManualMinX/ManualMaxX are adjusted in the timer, also call ReinitializeResetImage() to update 2D axis labels (Example 145 pattern: Force3dxVerticeRebuild + Reinit). Pe3do with Direct3D: axis labels are part of the 3D scene, so Force3dxVerticeRebuild + Invalidate is sufficient even when manual axis extents change (Example 413 pattern). Pe3do LEGACY FUNCTION: PeFunction.PEreconstruct3dpolygons() is functionally identical to Force3dxVerticeRebuild = true. Both set the same internal flag. Prefer the property form. Older examples use the function form. ADDITIONAL DIRECT3D FLAGS (set in timer only when needed): PeFunction.Force3dxNewColors = true; Only if color-related properties change during real-time updates. At initialization, set once during setup -- not needed in timer unless colors actually change per tick. PeFunction.Force3dxAnnotVerticeRebuild = true; // Pe3do only Only if graph annotation data changes during real-time updates. Invalidate() vs Refresh(): Invalidate() queues a WM_PAINT -- asynchronous, preferred for most real-time (especially Direct3D where GPU handles timing). Refresh() forces an immediate synchronous WM_PAINT -- use when the developer wants guaranteed immediate visual update. Both work; Invalidate is the baseline, Refresh is optional. --- PERFORMANCE FEATURES (large datasets) --- CIRCULARBUFFERS: PeData.CircularBuffers = true Applies to Pego, Pesgo, Pepso, Pe3do. Only works with AppendData (NOT AppendSubset). Uses a ring-buffer pointer instead of shifting memory. Essential for large datasets (100K+ points) with AppendData. COMPUTESHADER: PeData.ComputeShader = true Requires RenderEngine = Direct3D. Offloads chart construction to GPU (potentially 2000+ cores vs single CPU). Applies to Pesgo and Pe3do. Massive speedup for large datasets. STAGINGBUFFERS: PeData.StagingBufferX/Y/Z = true Keeps GPU-side copies of data arrays. Enables efficient CPU-->GPU transfer pipeline. Use with Direct3D real-time. Enable for each axis that is being updated. FILTER2D3D: PeData.Filter2D3D = true (Pesgo only) Two-tier ComputeShader: first pre-filters sequential 2D line data losslessly, then final shader constructs the scene. Dramatic speed for 250K+ points. Use with ComputeShader = true. REUSEDATAX/Y/Z: PeData.ReuseDataX = true (etc.) Set in the timer tick to tell PE "this axis data hasn't changed." Skips Direct3D buffer processing for that axis. Applies to Pesgo and Pe3do with Direct3D. Which axis to set depends on which data is static: Pesgo contour: X,Y are grid axes, Z is elevation -- if only Z changes, set ReuseDataX = true and ReuseDataY = true. Pe3do surface: X,Z are horizontal plane, Y is elevation -- if only Y changes, set ReuseDataX = true and ReuseDataZ = true. Rule: the "3rd dimension" is Z for Pesgo, Y for Pe3do. SKIPRANGING: PeData.SkipRanging = true (Pe3do only) Tells PE to skip min/max range determination entirely. Only safe when ALL axes are manually scaled. Avoids CPU-intensive ranging for large Pe3do datasets. Set in timer before Invalidate. COMPOSITE2D3D: PeConfigure.Composite2D3D (Pesgo, Pego with D3D) Controls Direct2D/Direct3D layer compositing. Default creates two D2D layers (background + foreground). Setting Background or Foreground forces one layer, reducing overhead. Not real-time specific -- general performance optimization for any Direct3D chart. --- ZOOM MANAGEMENT DURING REAL-TIME --- When using AppendData with manual scaling, the developer typically slides the manual axis extents in the timer: PeGrid.Configure.ManualMinX = counter - windowSize; PeGrid.Configure.ManualMaxX = counter; If the user has interactively zoomed (PeGrid.Zoom.Mode == true), also shift the zoom extents so the zoomed view scrolls with data: if (PeGrid.Zoom.Mode == true) { PeGrid.Zoom.MinX += nNewPoints; PeGrid.Zoom.MaxX += nNewPoints; } Without this, a zoomed view would see data scroll away. Alternatively, omit the zoom shift to let the user see a frozen zoomed view while new data flows at the unzoomed level (Example 146 does this). Note: Pesgo axis scaling has three independent levels: a) Auto-scaled -- chart determines range from data b) Manually scaled -- developer sets ManualMinY/ManualMaxY c) Zoom-controlled -- ZoomMinY/ZoomMaxY override when ZoomMode=true Zoom overlays manual scaling without changing the manual values. See pe-zoom knowledge file for details. --- TIMER PATTERN --- Use System.Windows.Forms.Timer (UI thread safe). In tick handler: 1. Prepare new data in pre-allocated arrays 2. Transfer data (AppendData, FastCopyFrom, or direct index) 3. Set any Reuse/Skip flags 4. Update manual axis extents if needed 5. Refresh: ReinitializeResetImage() + Invalidate/Refresh, or Force3dxVerticeRebuild + Invalidate (Direct3D fast path) Typical intervals: 10-50ms. Pre-allocate data arrays at class scope (not in timer) to avoid per-tick allocation overhead. ------------------------------------------------------------------------------ ### FILE: pe-specificplotmode.txt === ProEssentials SpecificPlotMode (knowledge rev 4) (Multi-Subset Plotting Methods) === SpecificPlotMode is for plotting methods that consume multiple subsets as a single visual unit (e.g., candlestick, OHLC, high-low bars/lines/areas). TWO WAYS TO USE MULTI-SUBSET PLOTTING METHODS: WAY 1 -- GLOBAL (via Method + SpecificPlotMode property): chart.PePlot.Method = GraphPlottingMethod.SpecificPlotMode; // Pego chart.PePlot.Method = SGraphPlottingMethod.SpecificPlotMode; // Pesgo chart.PePlot.SpecificPlotMode = SpecificPlotMode.BoxPlot; The SpecificPlotMode consumes the FIRST N subsets in the axis group. Additional subsets are drawn via MethodII (ComparisonSubsets controls count). WorkingAxis-dependent: each axis can have its own SpecificPlotMode type. WAY 2 -- PER-SUBSET (via Methods[] array): chart.PePlot.Methods[0] = GraphPlottingMethods.OpenHighLowClose; // Pego chart.PePlot.Methods[1] = GraphPlottingMethods.OpenHighLowClose; chart.PePlot.Methods[2] = GraphPlottingMethods.OpenHighLowClose; chart.PePlot.Methods[3] = GraphPlottingMethods.OpenHighLowClose; chart.PePlot.Methods[4] = GraphPlottingMethods.Line; // overlay Tag ALL subsets that belong to the multi-subset group. They MUST be consecutive and in the correct data order (see table below). Note the plural enum: GraphPlottingMethods (not GraphPlottingMethod). For Pesgo: SGraphPlottingMethods. Can combine with OnRightAxis(+1000), etc. See pe-mixing-methods-xaxis knowledge file for Methods[] details. SUBSET DATA ORDER (zero-based, line portion renders first): Mode | Subsets | [0] [1] [2] [3] HighLowBar (1) | 2 | LineStart LineEnd HighLowLine (2) | 2 | LineStart LineEnd HighLowClose (3) | 3 | LineStart LineEnd Close OpenHighLowClose(4)| 4 | LineStart LineEnd Open Close BoxPlot (5) | 4 | LineStart LineEnd BoxStart BoxEnd HighLowArea (6) | 2 | Upper Lower For financial data: LineStart=High, LineEnd=Low, Open/BoxStart=Open, Close/BoxEnd=Close. The line (wick) is always rendered first. VISUAL DIFFERENCE -- BoxPlot vs OpenHighLowClose: BoxPlot = Candlestick chart. Filled/colored box body between Open and Close. Box color reflects polarity: one color when Close > Open (bullish), another when Close < Open (bearish). Controlled by SpecificPlotModeColor. OpenHighLowClose = Traditional OHLC tick chart. Left tick = Open, right tick = Close. No filled body. COMPARISONSUBSETS WITH SPECIFICPLOTMODE (Way 1 only): When Method = SpecificPlotMode, the mode consumes the first subsets. ComparisonSubsets designates the LAST N subsets in the axis group to be drawn with MethodII instead. If MethodII is not explicitly set, it defaults to Line (value 0 in GraphPlottingMethodII / SGraphPlottingMethodII). Example (030): Axis 0 has 7 subsets, ComparisonSubsets=3, BoxPlot mode. Subsets 0-3 --> BoxPlot (OHLC data), Subsets 4-6 --> Line overlays (Bollinger, SMA). VISUAL PROPERTIES: SpecificPlotModeColor (bool): Enables multi-colored rendering. When TRUE, SubsetColors control the colors: SubsetColors[0] = line/wick color SubsetColors[2] = bearish color (Close < Open, typically red) SubsetColors[3] = bullish color (Close > Open, typically green) When FALSE, single-colored rendering. SpecificPlotModeGradient (enum): None(0), Bar(1), Glass(2). Gradient on candlestick body or high-low bar fills. SpecificPlotModeBorder (int, default 4): Pixel width threshold. If candle or high-low-bar is wider than this, a border is drawn on the body. OhlcMinWidth (int, default 16, range 1-30): Minimum width of open/close tick marks in OHLC chart. Logical units. HIGHLOWAREA SPECIFICS: Two subsets define upper and lower boundaries. Area is shaded between them. Color behavior: If subset[0] > subset[1], uses SubsetColors[0]. If subset[1] > subset[0] (inverted), uses SubsetColors[1]. Intersection points are interpolated for smooth color transitions. ComparisonSubsets adds overlay line/spline subsets on top. QUERY REFERENCE: pe_query.py enum "SpecificPlotMode" pe_query.py enum "GraphPlottingMethods" (per-subset, includes SPM types) pe_query.py enum "SGraphPlottingMethods" (Pesgo per-subset) pe_query.py props "SpecificPlotMode,SpecificPlotModeColor" pe_query.py props "ComparisonSubsets,MethodII" ------------------------------------------------------------------------------