@rm-graph/core 0.1.10 → 0.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -52
- package/dist/{chunk-KATRK3C3.js → chunk-4JQVY6S5.js} +2 -10
- package/dist/chunk-4JQVY6S5.js.map +1 -0
- package/dist/{chunk-Q2ZHY445.mjs → chunk-7GF5X23V.mjs} +3 -10
- package/dist/chunk-7GF5X23V.mjs.map +1 -0
- package/dist/chunk-BJTO5JO5.mjs +10 -0
- package/dist/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +12 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-PKJHVSFI.mjs +199 -0
- package/dist/chunk-PKJHVSFI.mjs.map +1 -0
- package/dist/chunk-RLQMHQEV.js +218 -0
- package/dist/chunk-RLQMHQEV.js.map +1 -0
- package/dist/index.d.mts +208 -17
- package/dist/index.d.ts +208 -17
- package/dist/index.js +135 -36
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +51 -27
- package/dist/index.mjs.map +1 -1
- package/dist/license-MTK7WNNA.mjs +4 -0
- package/dist/license-MTK7WNNA.mjs.map +1 -0
- package/dist/license-U7ZNTU6D.js +81 -0
- package/dist/license-U7ZNTU6D.js.map +1 -0
- package/dist/themes/index.js +8 -7
- package/dist/themes/index.mjs +2 -1
- package/package.json +14 -12
- package/dist/chunk-KATRK3C3.js.map +0 -1
- package/dist/chunk-Q2ZHY445.mjs.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/helpers.ts","../src/charts/BaseChart.ts","../src/charts/Surface3DChart.ts","../src/charts/Column3DChart.ts","../src/charts/PRPDChart.ts","../src/index.ts"],"names":["SciChartSurface","ThemeManager","SciChartJSLightTheme","__require","SCICHART_VERSION","SciChart3DSurface","NumericAxis3D","MouseWheelZoomModifier3D","OrbitModifier3D","CameraController","Vector3","UniformGridDataSeries3D","GradientColorPalette","SurfaceMeshRenderableSeries3D","EDrawMeshAs","sciChart3DConfigured","ensureSciChart3DConfigured","NumericLabelProvider","ResetCamera3DModifier","NumberRange","XyzDataSeries3D","ColumnRenderableSeries3D","CylinderPointMarker3D","PointLineRenderableSeries3D","TooltipModifier3D","sciChartConfigured","NumericAxis","EAutoRange","ENumericFormat","EAxisAlignment","CursorModifier","RubberBandXyZoomModifier","ZoomExtentsModifier","HeatmapColorMap","UniformHeatmapDataSeries","UniformHeatmapRenderableSeries","XyDataSeries","FastLineRenderableSeries","HeatmapLegend"],"mappings":"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","file":"index.js","sourcesContent":["import type { DataPoint, SeriesData } from \"../types\";\r\n\r\n/**\r\n * Generate a unique ID\r\n */\r\nexport function generateId(prefix: string = \"chart\"): string {\r\n return `${prefix}-${Math.random().toString(36).substring(2, 11)}`;\r\n}\r\n\r\n/**\r\n * Parse size value (handles both string and number)\r\n */\r\nexport function parseSize(value: string | number | undefined, fallback: number): number {\r\n if (value === undefined) return fallback;\r\n if (typeof value === \"number\") return value;\r\n \r\n // Handle percentage\r\n if (value.endsWith(\"%\")) {\r\n return fallback; // Return fallback for percentage, will be handled by CSS\r\n }\r\n \r\n // Handle px\r\n const parsed = parseInt(value, 10);\r\n return isNaN(parsed) ? fallback : parsed;\r\n}\r\n\r\n/**\r\n * Normalize data points to standard format\r\n */\r\nexport function normalizeDataPoints(data: DataPoint[] | number[]): DataPoint[] {\r\n if (data.length === 0) return [];\r\n \r\n // Check if it's already DataPoint format\r\n if (typeof data[0] === \"object\" && \"x\" in data[0]) {\r\n return data as DataPoint[];\r\n }\r\n \r\n // Convert number array to DataPoint array\r\n return (data as number[]).map((y, index) => ({\r\n x: index,\r\n y,\r\n }));\r\n}\r\n\r\n/**\r\n * Extract x values from data points\r\n */\r\nexport function extractXValues(data: DataPoint[]): number[] {\r\n return data.map((point) => {\r\n if (typeof point.x === \"number\") return point.x;\r\n if (point.x instanceof Date) return point.x.getTime();\r\n return 0; // For string categories, will be handled separately\r\n });\r\n}\r\n\r\n/**\r\n * Extract y values from data points\r\n */\r\nexport function extractYValues(data: DataPoint[]): number[] {\r\n return data.map((point) => point.y);\r\n}\r\n\r\n/**\r\n * Deep merge objects\r\n */\r\nexport function deepMerge<T extends Record<string, unknown>>(\r\n target: T,\r\n source: Partial<T>\r\n): T {\r\n const result = { ...target };\r\n \r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key];\r\n const targetValue = target[key];\r\n \r\n if (\r\n sourceValue !== null &&\r\n typeof sourceValue === \"object\" &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue !== null &&\r\n typeof targetValue === \"object\" &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n (result as Record<string, unknown>)[key] = deepMerge(\r\n targetValue as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n );\r\n } else if (sourceValue !== undefined) {\r\n (result as Record<string, unknown>)[key] = sourceValue;\r\n }\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Debounce function\r\n */\r\nexport function debounce<T extends (...args: unknown[]) => void>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n fn(...args);\r\n timeoutId = null;\r\n }, delay);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle function\r\n */\r\nexport function throttle<T extends (...args: unknown[]) => void>(\r\n fn: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle = false;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n fn(...args);\r\n inThrottle = true;\r\n setTimeout(() => {\r\n inThrottle = false;\r\n }, limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Calculate min and max from data series\r\n */\r\nexport function calculateDataRange(series: SeriesData[]): {\r\n xMin: number;\r\n xMax: number;\r\n yMin: number;\r\n yMax: number;\r\n} {\r\n let xMin = Infinity;\r\n let xMax = -Infinity;\r\n let yMin = Infinity;\r\n let yMax = -Infinity;\r\n \r\n for (const s of series) {\r\n const normalized = normalizeDataPoints(s.data);\r\n for (const point of normalized) {\r\n const x = typeof point.x === \"number\" ? point.x : 0;\r\n xMin = Math.min(xMin, x);\r\n xMax = Math.max(xMax, x);\r\n yMin = Math.min(yMin, point.y);\r\n yMax = Math.max(yMax, point.y);\r\n }\r\n }\r\n \r\n return {\r\n xMin: xMin === Infinity ? 0 : xMin,\r\n xMax: xMax === -Infinity ? 100 : xMax,\r\n yMin: yMin === Infinity ? 0 : yMin,\r\n yMax: yMax === -Infinity ? 100 : yMax,\r\n };\r\n}\r\n\r\n/**\r\n * Format number for display\r\n */\r\nexport function formatNumber(value: number, precision: number = 2): string {\r\n if (Math.abs(value) >= 1e9) {\r\n return (value / 1e9).toFixed(precision) + \"B\";\r\n }\r\n if (Math.abs(value) >= 1e6) {\r\n return (value / 1e6).toFixed(precision) + \"M\";\r\n }\r\n if (Math.abs(value) >= 1e3) {\r\n return (value / 1e3).toFixed(precision) + \"K\";\r\n }\r\n return value.toFixed(precision);\r\n}\r\n\r\n/**\r\n * Clamp a value between min and max\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\n/**\r\n * Linear interpolation\r\n */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * clamp(t, 0, 1);\r\n}\r\n\r\n/**\r\n * Convert hex color to rgba\r\n */\r\nexport function hexToRgba(hex: string, alpha: number = 1): string {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n if (!result) return hex;\r\n \r\n const r = parseInt(result[1], 16);\r\n const g = parseInt(result[2], 16);\r\n const b = parseInt(result[3], 16);\r\n \r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n}\r\n\r\n","import { SciChartSurface } from \"scichart\";\r\nimport type {\r\n ChartConfig,\r\n ChartInstance,\r\n ChartEventMap,\r\n SeriesData,\r\n ThemeConfig,\r\n} from \"../types\";\r\nimport { ThemeManager } from \"../themes/ThemeManager\";\r\nimport { generateId, debounce } from \"../utils/helpers\";\r\n\r\n// SciChart WASM CDN configuration\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChartConfigured = false;\r\n\r\nfunction ensureSciChartConfigured(): void {\r\n if (sciChartConfigured) return;\r\n try {\r\n SciChartSurface.useWasmFromCDN();\r\n sciChartConfigured = true;\r\n } catch {\r\n // Fallback to manual configuration\r\n try {\r\n SciChartSurface.configure({\r\n wasmUrl: `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart2d.wasm`,\r\n });\r\n sciChartConfigured = true;\r\n } catch {\r\n // Configuration may already be set\r\n }\r\n }\r\n}\r\n\r\n// Type for SciChart surface\r\ntype SciChartSurfaceType = Awaited<ReturnType<typeof SciChartSurface.create>>[\"sciChartSurface\"];\r\n\r\n/**\r\n * Abstract base class for all chart types\r\n * Handles common functionality like initialization, theming, events, and cleanup\r\n */\r\nexport abstract class BaseChart<TConfig extends ChartConfig> implements ChartInstance {\r\n public readonly id: string;\r\n protected container: HTMLElement | null = null;\r\n protected surface: SciChartSurfaceType | null = null;\r\n protected config: TConfig;\r\n protected theme: ThemeConfig;\r\n protected isInitialized: boolean = false;\r\n protected isDestroyed: boolean = false;\r\n\r\n // Event handlers\r\n private eventHandlers: Map<keyof ChartEventMap, Set<(e: unknown) => void>> = new Map();\r\n\r\n // Resize observer\r\n private resizeObserver: ResizeObserver | null = null;\r\n private debouncedResize: () => void;\r\n\r\n constructor(config: TConfig) {\r\n this.id = config.id ?? generateId(\"chart\");\r\n this.config = config;\r\n this.theme = ThemeManager.getInstance().resolveTheme(config.theme);\r\n this.debouncedResize = debounce(() => this.handleResize(), 100);\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Set container styles\r\n this.setupContainer();\r\n\r\n // Configure SciChart defaults\r\n this.configureSciChartDefaults();\r\n\r\n // Create the SciChart surface\r\n await this.createSurface();\r\n\r\n // Set up resize observer\r\n this.setupResizeObserver();\r\n\r\n this.isInitialized = true;\r\n this.emit(\"rendered\", { chartId: this.id, renderTime: performance.now() });\r\n }\r\n\r\n /**\r\n * Setup container element\r\n */\r\n private setupContainer(): void {\r\n if (!this.container) return;\r\n\r\n const { width, height } = this.config;\r\n\r\n // Set dimensions\r\n if (width) {\r\n this.container.style.width =\r\n typeof width === \"number\" ? `${width}px` : width;\r\n }\r\n if (height) {\r\n this.container.style.height =\r\n typeof height === \"number\" ? `${height}px` : height;\r\n }\r\n\r\n // Ensure container has position for absolute children\r\n const computedStyle = window.getComputedStyle(this.container);\r\n if (computedStyle.position === \"static\") {\r\n this.container.style.position = \"relative\";\r\n }\r\n }\r\n\r\n /**\r\n * Configure SciChart library defaults\r\n */\r\n private configureSciChartDefaults(): void {\r\n ensureSciChartConfigured();\r\n }\r\n\r\n /**\r\n * Create the SciChart surface - implemented by subclasses\r\n */\r\n protected abstract createSurface(): Promise<void>;\r\n\r\n /**\r\n * Update the chart with new data\r\n */\r\n public abstract setData(data: SeriesData[]): void;\r\n\r\n /**\r\n * Update chart options\r\n */\r\n public setOptions(options: Partial<TConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n \r\n // Update theme if changed\r\n if (options.theme) {\r\n this.theme = ThemeManager.getInstance().resolveTheme(options.theme);\r\n this.applyTheme();\r\n }\r\n\r\n // Trigger re-render\r\n this.update();\r\n }\r\n\r\n /**\r\n * Apply current theme to the chart\r\n */\r\n protected applyTheme(): void {\r\n if (!this.surface) return;\r\n\r\n this.surface.background = this.theme.backgroundColor ?? \"#ffffff\";\r\n\r\n // Apply SciChart theme provider when switching themes\r\n // (otherwise axes/gridlines can remain styled for the old theme).\r\n try {\r\n const themeName = (this.config.theme as any) as string | undefined;\r\n // Lazy-require to avoid bundler issues in non-browser environments\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const { SciChartJSDarkTheme, SciChartJSLightTheme } = require(\"scichart\");\r\n const nextThemeProvider =\r\n themeName === \"light\" ? new SciChartJSLightTheme() : new SciChartJSDarkTheme();\r\n (this.surface as any).applyTheme?.(nextThemeProvider);\r\n } catch {\r\n // ignore if scichart theme provider isn't available\r\n }\r\n\r\n // Update common axis styling for current theme\r\n try {\r\n const applyAxisTheme = (axis: any) => {\r\n if (!axis) return;\r\n axis.axisTitleStyle = {\r\n ...(axis.axisTitleStyle ?? {}),\r\n color: this.theme.axis?.titleColor,\r\n fontFamily: this.theme.fontFamily,\r\n };\r\n axis.labelStyle = {\r\n ...(axis.labelStyle ?? {}),\r\n color: this.theme.axis?.labelColor,\r\n fontFamily: this.theme.fontFamily,\r\n };\r\n axis.majorGridLineStyle = {\r\n ...(axis.majorGridLineStyle ?? {}),\r\n color: this.theme.axis?.gridLineColor,\r\n };\r\n axis.axisBorder = {\r\n ...(axis.axisBorder ?? {}),\r\n color: this.theme.axis?.lineColor,\r\n };\r\n };\r\n\r\n const xAxes = (this.surface as any).xAxes;\r\n const yAxes = (this.surface as any).yAxes;\r\n\r\n // SciChart uses ObservableArray; it can be iterated via .asArray() or .itemsArray\r\n const toArray = (axes: any) =>\r\n axes?.asArray?.() ?? axes?.itemsArray ?? axes?.items ?? [];\r\n\r\n for (const axis of toArray(xAxes)) applyAxisTheme(axis);\r\n for (const axis of toArray(yAxes)) applyAxisTheme(axis);\r\n } catch {\r\n // ignore axis styling issues\r\n }\r\n\r\n // Additional theme application handled by subclasses\r\n }\r\n\r\n /**\r\n * Update the chart (re-render with current config)\r\n */\r\n protected abstract update(): void;\r\n\r\n /**\r\n * Set up resize observer for responsive charts\r\n */\r\n private setupResizeObserver(): void {\r\n if (!this.container || typeof ResizeObserver === \"undefined\") return;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.debouncedResize();\r\n });\r\n\r\n this.resizeObserver.observe(this.container);\r\n }\r\n\r\n /**\r\n * Handle container resize\r\n */\r\n private handleResize(): void {\r\n if (!this.surface || !this.container) return;\r\n\r\n const { width, height } = this.container.getBoundingClientRect();\r\n if (width > 0 && height > 0) {\r\n // SciChart handles resizing automatically when container size changes\r\n // but we can force a redraw if needed\r\n }\r\n }\r\n\r\n /**\r\n * Manually resize the chart\r\n */\r\n public resize(width?: number, height?: number): void {\r\n if (!this.container) return;\r\n\r\n if (width !== undefined) {\r\n this.container.style.width = `${width}px`;\r\n }\r\n if (height !== undefined) {\r\n this.container.style.height = `${height}px`;\r\n }\r\n\r\n this.handleResize();\r\n }\r\n\r\n /**\r\n * Reset zoom to fit all data (zoom extents)\r\n * Note: not part of the ChartInstance interface, but available on concrete chart classes.\r\n */\r\n public resetZoom(): void {\r\n if (!this.surface) return;\r\n try {\r\n (this.surface as any).zoomExtents?.();\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n /**\r\n * Export chart as image\r\n */\r\n public async exportImage(format: \"png\" | \"jpeg\" | \"svg\" = \"png\"): Promise<string> {\r\n if (!this.surface) {\r\n throw new Error(\"Chart not initialized\");\r\n }\r\n\r\n // SciChart provides export functionality\r\n // This is a simplified implementation\r\n const canvas = this.container?.querySelector(\"canvas\");\r\n if (!canvas) {\r\n throw new Error(\"Canvas not found\");\r\n }\r\n\r\n const mimeType = format === \"jpeg\" ? \"image/jpeg\" : \"image/png\";\r\n return canvas.toDataURL(mimeType);\r\n }\r\n\r\n /**\r\n * Add event listener\r\n */\r\n public on<K extends keyof ChartEventMap>(\r\n event: K,\r\n handler: (e: ChartEventMap[K]) => void\r\n ): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler as (e: unknown) => void);\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n */\r\n public off<K extends keyof ChartEventMap>(\r\n event: K,\r\n handler: (e: ChartEventMap[K]) => void\r\n ): void {\r\n const handlers = this.eventHandlers.get(event);\r\n if (handlers) {\r\n handlers.delete(handler as (e: unknown) => void);\r\n }\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n protected emit<K extends keyof ChartEventMap>(event: K, data: ChartEventMap[K]): void {\r\n const handlers = this.eventHandlers.get(event);\r\n if (handlers) {\r\n handlers.forEach((handler) => handler(data));\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the chart and clean up resources\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n\r\n // Clean up resize observer\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n\r\n // Clean up event handlers\r\n this.eventHandlers.clear();\r\n\r\n // Delete the SciChart surface\r\n if (this.surface) {\r\n this.surface.delete();\r\n this.surface = null;\r\n }\r\n\r\n // Clear container\r\n if (this.container) {\r\n this.container.innerHTML = \"\";\r\n }\r\n\r\n this.isDestroyed = true;\r\n this.isInitialized = false;\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): TConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Get current theme\r\n */\r\n public getTheme(): ThemeConfig {\r\n return { ...this.theme };\r\n }\r\n\r\n /**\r\n * Check if chart is initialized\r\n */\r\n public isReady(): boolean {\r\n return this.isInitialized && !this.isDestroyed;\r\n }\r\n}\r\n\r\n","import {\r\n SciChart3DSurface,\r\n NumericAxis3D,\r\n SurfaceMeshRenderableSeries3D,\r\n UniformGridDataSeries3D,\r\n CameraController,\r\n GradientColorPalette,\r\n MouseWheelZoomModifier3D,\r\n OrbitModifier3D,\r\n Vector3,\r\n EDrawMeshAs,\r\n} from \"scichart\";\r\nimport type { Surface3DChartConfig, SeriesData } from \"../types\";\r\nimport { generateId } from \"../utils/helpers\";\r\n\r\n// SciChart 3D WASM CDN configuration\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChart3DConfigured = false;\r\n\r\nfunction ensureSciChart3DConfigured(): void {\r\n if (sciChart3DConfigured) return;\r\n try {\r\n SciChart3DSurface.useWasmFromCDN();\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Fallback to manual configuration\r\n try {\r\n SciChart3DSurface.configure({\r\n wasmUrl: `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart3d.wasm`,\r\n });\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Configuration may already be set\r\n }\r\n }\r\n}\r\n\r\n// Default color stops for 3D surface\r\nconst defaultColorStops = [\r\n { offset: 0, color: \"#1e3a8a\" }, // Dark blue\r\n { offset: 0.25, color: \"#3b82f6\" }, // Blue\r\n { offset: 0.5, color: \"#22c55e\" }, // Green\r\n { offset: 0.75, color: \"#eab308\" }, // Yellow\r\n { offset: 1, color: \"#ef4444\" }, // Red\r\n];\r\n\r\n/**\r\n * 3D Surface Chart implementation using SciChart\r\n */\r\nexport class Surface3DChart {\r\n public readonly id: string;\r\n private container: HTMLElement | null = null;\r\n private surface: SciChart3DSurface | null = null;\r\n private wasmContext: any = null;\r\n private config: Surface3DChartConfig;\r\n private dataSeries: UniformGridDataSeries3D | null = null;\r\n private meshSeries: SurfaceMeshRenderableSeries3D | null = null;\r\n private isDestroyed: boolean = false;\r\n\r\n constructor(config: Surface3DChartConfig) {\r\n this.id = config.id ?? generateId(\"chart3d\");\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Ensure container has a unique ID for SciChart\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n\r\n // Configure SciChart 3D WASM\r\n ensureSciChart3DConfigured();\r\n\r\n // Create the 3D surface\r\n await this.createSurface();\r\n }\r\n\r\n /**\r\n * Create the SciChart 3D surface\r\n */\r\n private async createSurface(): Promise<void> {\r\n // Check if already destroyed or container missing\r\n if (this.isDestroyed || !this.container) {\r\n return;\r\n }\r\n \r\n // Ensure container has an ID\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n \r\n // Check if container is still in DOM\r\n if (!document.body.contains(this.container)) {\r\n return;\r\n }\r\n\r\n let sciChart3DSurface;\r\n let wasmContext;\r\n \r\n try {\r\n const result = await SciChart3DSurface.create(\r\n this.container.id\r\n );\r\n sciChart3DSurface = result.sciChart3DSurface;\r\n wasmContext = result.wasmContext;\r\n } catch (e) {\r\n // SciChart initialization failed - container may have been removed\r\n console.warn(\"Surface3DChart: Failed to create surface\", e);\r\n return;\r\n }\r\n \r\n // Check if destroyed during async operation\r\n if (this.isDestroyed || !this.container) {\r\n try {\r\n sciChart3DSurface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n return;\r\n }\r\n\r\n this.surface = sciChart3DSurface;\r\n this.wasmContext = wasmContext;\r\n\r\n // Create axes\r\n sciChart3DSurface.xAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: \"X\",\r\n });\r\n sciChart3DSurface.yAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: \"Y\",\r\n });\r\n sciChart3DSurface.zAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: \"Z\",\r\n });\r\n\r\n // Add interactivity\r\n sciChart3DSurface.chartModifiers.add(new MouseWheelZoomModifier3D());\r\n sciChart3DSurface.chartModifiers.add(new OrbitModifier3D());\r\n\r\n // Set up camera\r\n const cameraPos = this.config.cameraPosition ?? { x: 300, y: 300, z: 300 };\r\n sciChart3DSurface.camera = new CameraController(wasmContext, {\r\n position: new Vector3(cameraPos.x, cameraPos.y, cameraPos.z),\r\n target: new Vector3(0, 0, 0),\r\n });\r\n\r\n // Add surface data\r\n this.addSurfaceData(this.config.yValues);\r\n }\r\n\r\n /**\r\n * Add surface data to the chart\r\n */\r\n private addSurfaceData(yValues: number[][]): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n const zSize = yValues.length;\r\n const xSize = yValues[0]?.length ?? 0;\r\n\r\n // Calculate min/max from data\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (let z = 0; z < zSize; z++) {\r\n for (let x = 0; x < xSize; x++) {\r\n const y = yValues[z][x];\r\n min = Math.min(min, y);\r\n max = Math.max(max, y);\r\n }\r\n }\r\n\r\n // Create data series\r\n this.dataSeries = new UniformGridDataSeries3D(wasmContext, {\r\n yValues,\r\n xStep: this.config.xStep ?? 1,\r\n zStep: this.config.zStep ?? 1,\r\n });\r\n\r\n // Get color stops\r\n const colorStops = this.config.colorStops ?? defaultColorStops;\r\n\r\n // Create color palette\r\n const colorPalette = new GradientColorPalette(wasmContext, {\r\n gradientStops: colorStops,\r\n });\r\n\r\n // Create mesh series - solid filled surface\r\n this.meshSeries = new SurfaceMeshRenderableSeries3D(wasmContext, {\r\n dataSeries: this.dataSeries,\r\n minimum: this.config.colorMin ?? min,\r\n maximum: this.config.colorMax ?? max,\r\n opacity: this.config.opacity ?? 1.0,\r\n cellHardnessFactor: 0, // Smooth interpolation between cells\r\n stroke: \"transparent\", // No wireframe stroke\r\n strokeThickness: 0,\r\n contourStroke: \"transparent\", // No contour lines\r\n contourStrokeThickness: 0,\r\n drawSkirt: true, // Draw skirt for solid appearance\r\n drawMeshAs: EDrawMeshAs.SOLID_MESH, // Solid filled surface\r\n lightingFactor: 0.8,\r\n meshColorPalette: colorPalette,\r\n shininess: 10,\r\n });\r\n\r\n this.surface!.renderableSeries.add(this.meshSeries);\r\n }\r\n\r\n /**\r\n * Set new Y values for the surface\r\n */\r\n public setYValues(yValues: number[][]): void {\r\n if (!this.surface) {\r\n this.config.yValues = yValues;\r\n return;\r\n }\r\n\r\n // Clear existing surface\r\n this.clearSurface();\r\n\r\n // Update config and add new data\r\n this.config.yValues = yValues;\r\n this.addSurfaceData(yValues);\r\n }\r\n\r\n /**\r\n * Set new data (alias for setYValues for consistency)\r\n */\r\n public setData(_data: SeriesData[]): void {\r\n console.warn(\"Surface3DChart.setData() - use setYValues() for updating surface data\");\r\n }\r\n\r\n /**\r\n * Update chart options\r\n */\r\n public setOptions(options: Partial<Surface3DChartConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n\r\n if (options.cameraPosition && this.surface && this.wasmContext) {\r\n const pos = options.cameraPosition;\r\n this.surface.camera = new CameraController(this.wasmContext, {\r\n position: new Vector3(pos.x, pos.y, pos.z),\r\n target: new Vector3(0, 0, 0),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Clear surface data\r\n */\r\n private clearSurface(): void {\r\n if (!this.surface) return;\r\n\r\n if (this.meshSeries) {\r\n this.surface.renderableSeries.remove(this.meshSeries);\r\n this.meshSeries.delete();\r\n this.meshSeries = null;\r\n }\r\n\r\n if (this.dataSeries) {\r\n this.dataSeries.delete();\r\n this.dataSeries = null;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy and clean up\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n \r\n // Mark as destroyed immediately to prevent re-entry\r\n this.isDestroyed = true;\r\n\r\n try {\r\n this.clearSurface();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n\r\n if (this.surface) {\r\n try {\r\n this.surface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors - surface may already be destroyed\r\n }\r\n this.surface = null;\r\n }\r\n \r\n this.container = null;\r\n this.wasmContext = null;\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): Surface3DChartConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Check if chart is ready (initialized and not destroyed)\r\n */\r\n public isReady(): boolean {\r\n return this.surface !== null && !this.isDestroyed;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a 3D surface chart\r\n */\r\nexport async function createSurface3DChart(\r\n container: HTMLElement | string,\r\n config: Surface3DChartConfig\r\n): Promise<Surface3DChart> {\r\n const chart = new Surface3DChart(config);\r\n await chart.init(container);\r\n return chart;\r\n}\r\n\r\n","import {\r\n SciChart3DSurface,\r\n NumericAxis3D,\r\n XyzDataSeries3D,\r\n ColumnRenderableSeries3D,\r\n PointLineRenderableSeries3D,\r\n NumberRange,\r\n CameraController,\r\n Vector3,\r\n OrbitModifier3D,\r\n MouseWheelZoomModifier3D,\r\n TooltipModifier3D,\r\n ResetCamera3DModifier,\r\n CylinderPointMarker3D,\r\n NumericLabelProvider,\r\n SciChartJSLightTheme,\r\n} from \"scichart\";\r\nimport type { ChartConfig } from \"../types\";\r\nimport { generateId } from \"../utils/helpers\";\r\n\r\n// SciChart 3D WASM CDN configuration\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChart3DConfigured = false;\r\n\r\nfunction ensureSciChart3DConfigured(): void {\r\n if (sciChart3DConfigured) return;\r\n try {\r\n SciChart3DSurface.useWasmFromCDN();\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Fallback to manual configuration\r\n try {\r\n SciChart3DSurface.configure({\r\n wasmUrl: `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart3d.wasm`,\r\n });\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Configuration may already be set\r\n }\r\n }\r\n}\r\n\r\n/** Data point for 3D column chart [x, y, z] */\r\nexport type Column3DDataPoint = [number, number, number];\r\n\r\n/** Unit of measurement options */\r\nexport type UnitOfMeasurement = \"mVp\" | \"mVrms\" | \"dBm\" | \"dB\" | number;\r\n\r\n/** Camera preset positions */\r\nexport interface CameraPreset {\r\n position: { x: number; y: number; z: number };\r\n target: { x: number; y: number; z: number };\r\n}\r\n\r\n/** Chart statistics */\r\nexport interface Column3DChartStats {\r\n pulseCount: number;\r\n peakValue: number;\r\n}\r\n\r\n/** Configuration for 3D Column Chart */\r\nexport interface Column3DChartConfig extends ChartConfig {\r\n /** Array of [x, y, z] data points */\r\n data: Column3DDataPoint[];\r\n /** X axis title */\r\n xAxisTitle?: string;\r\n /** Y axis title */\r\n yAxisTitle?: string;\r\n /** Z axis title */\r\n zAxisTitle?: string;\r\n /** X axis visible range */\r\n xRange?: { min: number; max: number };\r\n /** Y axis visible range */\r\n yRange?: { min: number; max: number };\r\n /** Z axis visible range */\r\n zRange?: { min: number; max: number };\r\n /** Bar fill color */\r\n barFill?: string;\r\n /** Bar stroke color */\r\n barStroke?: string;\r\n /** Bar opacity (0-1) */\r\n barOpacity?: number;\r\n /** Bar width in X direction */\r\n barWidthX?: number;\r\n /** Bar width in Z direction */\r\n barWidthZ?: number;\r\n /** Camera position */\r\n cameraPosition?: { x: number; y: number; z: number };\r\n /** Camera target */\r\n cameraTarget?: { x: number; y: number; z: number };\r\n /** Show sine wave reference line on back plane */\r\n showSineWave?: boolean;\r\n /** Sine wave amplitude center */\r\n sineWaveCenter?: number;\r\n /** Sine wave amplitude range */\r\n sineWaveAmplitude?: number;\r\n /** Unit of measurement */\r\n unitOfMeasurement?: UnitOfMeasurement;\r\n /** Enable camera clamping to restrict camera movement */\r\n enableCameraClamping?: boolean;\r\n /** Maximum camera radius */\r\n maxCameraRadius?: number;\r\n /** Minimum camera radius */\r\n minCameraRadius?: number;\r\n /** Minimum yaw angle in degrees (horizontal). Default -179. */\r\n minYaw?: number;\r\n /** Maximum yaw angle in degrees (horizontal). Default 179. */\r\n maxYaw?: number;\r\n /** Minimum pitch angle in degrees (vertical). Default 0. */\r\n minPitch?: number;\r\n /** Maximum pitch angle in degrees (vertical). Default 88. */\r\n maxPitch?: number;\r\n /** Camera preset positions */\r\n cameraPresets?: CameraPreset[];\r\n /** Use cylinder point markers instead of columns */\r\n useCylinderMarkers?: boolean;\r\n /** Callback when stats change */\r\n onStatsChange?: (stats: Column3DChartStats) => void;\r\n}\r\n\r\n/** Default camera presets */\r\nexport const DEFAULT_CAMERA_PRESETS: CameraPreset[] = [\r\n {\r\n // Top view\r\n position: { x: -0.01, y: 532.47, z: 0.82 },\r\n target: { x: 0.0, y: 50.0, z: 0.0 },\r\n },\r\n {\r\n // Angle view\r\n position: { x: -2.38, y: 99.55, z: 479.91 },\r\n target: { x: 0.0, y: 50.0, z: 0.0 },\r\n },\r\n];\r\n\r\n/** Unit of measurement labels */\r\nexport const UOM_LABELS: Record<number | string, string> = {\r\n 1: \"mVp\",\r\n 2: \"mVrms\",\r\n 3: \"dBm\",\r\n 4: \"dB\",\r\n \"mVp\": \"mVp\",\r\n \"mVrms\": \"mVrms\",\r\n \"dBm\": \"dBm\",\r\n \"dB\": \"dB\",\r\n};\r\n\r\n/** Convert mVrms to dBm */\r\nexport function mVrmsToDbm(mVrms: number): number {\r\n if (mVrms <= 0) return -100;\r\n return 10 * Math.log10((mVrms * mVrms) / 50) + 30;\r\n}\r\n\r\n/** Convert mVp to dB */\r\nexport function mVpToDb(mVp: number): number {\r\n if (mVp <= 0) return -100;\r\n return 20 * Math.log10(mVp);\r\n}\r\n\r\n/** Custom label provider for integer labels */\r\nclass IntegerLabelProvider extends NumericLabelProvider {\r\n override get formatLabel(): (value: number) => string {\r\n return (value: number) => `${Math.round(value)}`;\r\n }\r\n}\r\n\r\n/**\r\n * 3D Column/Bar Chart implementation using SciChart\r\n */\r\nexport class Column3DChart {\r\n public readonly id: string;\r\n private container: HTMLElement | null = null;\r\n private surface: SciChart3DSurface | null = null;\r\n private wasmContext: any = null;\r\n private config: Column3DChartConfig;\r\n private dataSeries: XyzDataSeries3D | null = null;\r\n private columnSeries: ColumnRenderableSeries3D | null = null;\r\n private sineSeries: PointLineRenderableSeries3D | null = null;\r\n private isDestroyed: boolean = false;\r\n private stats: Column3DChartStats = { pulseCount: 0, peakValue: 0 };\r\n private cameraClampingEnabled: boolean = false;\r\n private initialCameraPosition: { x: number; y: number; z: number } = { x: -250, y: 450, z: 280 };\r\n private initialCameraTarget: { x: number; y: number; z: number } = { x: 0, y: 0, z: 0 };\r\n\r\n constructor(config: Column3DChartConfig) {\r\n this.id = config.id ?? generateId(\"column3d\");\r\n this.config = config;\r\n // Camera clamping enabled by default (like original RealTime3DGraph)\r\n this.cameraClampingEnabled = config.enableCameraClamping ?? true;\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Ensure container has a unique ID for SciChart\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n\r\n // Configure SciChart 3D WASM\r\n ensureSciChart3DConfigured();\r\n\r\n // Create the 3D surface\r\n await this.createSurface();\r\n }\r\n\r\n /**\r\n * Create the SciChart 3D surface\r\n */\r\n private async createSurface(): Promise<void> {\r\n if (this.isDestroyed || !this.container) {\r\n return;\r\n }\r\n \r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n \r\n if (!document.body.contains(this.container)) {\r\n return;\r\n }\r\n\r\n let sciChart3DSurface;\r\n let wasmContext;\r\n \r\n try {\r\n // Create a customized light theme with dark black labels\r\n const customLightTheme = {\r\n ...new SciChartJSLightTheme(),\r\n // Label and title colors - make them pure black\r\n tickTextBrush: \"#000000\",\r\n axisTitleColor: \"#000000\",\r\n labelForegroundBrush: \"#000000\",\r\n labelBackgroundBrush: \"transparent\",\r\n // 3D specific properties\r\n axis3DBandsFill: \"#e5e5e5\",\r\n axisTitleTextColor: \"#000000\",\r\n majorGridLineBrush: \"#7e7e7e\",\r\n minorGridLineBrush: \"#aaaaaa\",\r\n textAnnotationForeground: \"#000000\",\r\n axisBorder: \"#000000\",\r\n // Additional label properties\r\n labelBorderBrush: \"#000000\",\r\n cursorLabelForegroundBrush: \"#000000\",\r\n };\r\n\r\n const result = await SciChart3DSurface.create(\r\n this.container.id,\r\n {\r\n theme: customLightTheme,\r\n isZYPlaneVisible: false,\r\n }\r\n );\r\n sciChart3DSurface = result.sciChart3DSurface;\r\n wasmContext = result.wasmContext;\r\n } catch (e) {\r\n console.warn(\"Column3DChart: Failed to create surface\", e);\r\n return;\r\n }\r\n \r\n if (this.isDestroyed || !this.container) {\r\n try {\r\n sciChart3DSurface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n return;\r\n }\r\n\r\n this.surface = sciChart3DSurface;\r\n this.wasmContext = wasmContext;\r\n\r\n\r\n // Set up camera (default matches original ThreeDGraph.jsx)\r\n const cameraPos = this.config.cameraPosition ?? { x: -250, y: 450, z: 280 };\r\n const cameraTarget = this.config.cameraTarget ?? { x: 0, y: 0, z: 0 };\r\n sciChart3DSurface.camera = new CameraController(wasmContext, {\r\n position: new Vector3(cameraPos.x, cameraPos.y, cameraPos.z),\r\n target: new Vector3(cameraTarget.x, cameraTarget.y, cameraTarget.z),\r\n });\r\n \r\n // Store initial camera settings for reset\r\n this.initialCameraPosition = cameraPos;\r\n this.initialCameraTarget = cameraTarget;\r\n\r\n // Add camera clamping if enabled\r\n if (this.cameraClampingEnabled) {\r\n this.setupCameraClamping();\r\n }\r\n\r\n // Add interactivity\r\n sciChart3DSurface.chartModifiers.add(\r\n new OrbitModifier3D(),\r\n new MouseWheelZoomModifier3D(),\r\n new ResetCamera3DModifier()\r\n );\r\n\r\n // Create axes\r\n this.setupAxes();\r\n\r\n // Add column data\r\n this.addColumnData(this.config.data);\r\n\r\n // Add sine wave reference if enabled\r\n if (this.config.showSineWave !== false) {\r\n this.addSineWave();\r\n }\r\n\r\n // Add tooltip\r\n this.addTooltip();\r\n }\r\n\r\n /**\r\n * Setup camera clamping to restrict camera movement.\r\n * Yaw snaps to boundaries: >100 → -180, >=0 → 0 (keeps view in -180..0 range).\r\n * Pitch clamped to [0, 89]. Radius clamped to [495, 805].\r\n */\r\n private setupCameraClamping(): void {\r\n if (!this.surface) return;\r\n\r\n let isClamping = false;\r\n\r\n this.surface.camera.propertyChanged.subscribe(() => {\r\n if (isClamping) return;\r\n isClamping = true;\r\n\r\n try {\r\n if (!this.surface) return;\r\n\r\n let yaw = this.surface.camera.orbitalYaw;\r\n let pitch = this.surface.camera.orbitalPitch;\r\n let cameraRadius = this.surface.camera.radius;\r\n const maxCameraRadius = this.config.maxCameraRadius ?? 805;\r\n const minCameraRadius = this.config.minCameraRadius ?? 495;\r\n\r\n if (Math.floor(yaw) > 100) {\r\n yaw = -180;\r\n } else if (Math.floor(yaw) >= 0) {\r\n yaw = 0;\r\n }\r\n\r\n if (pitch <= 0) {\r\n pitch = 0;\r\n } else if (pitch >= 89) {\r\n pitch = 89;\r\n }\r\n\r\n if (cameraRadius >= maxCameraRadius) {\r\n cameraRadius = maxCameraRadius;\r\n } else if (cameraRadius <= minCameraRadius) {\r\n cameraRadius = minCameraRadius;\r\n }\r\n\r\n if (yaw !== this.surface.camera.orbitalYaw) {\r\n this.surface.camera.orbitalYaw = yaw;\r\n }\r\n if (pitch !== this.surface.camera.orbitalPitch) {\r\n this.surface.camera.orbitalPitch = pitch;\r\n }\r\n if (cameraRadius !== this.surface.camera.radius) {\r\n this.surface.camera.radius = cameraRadius;\r\n }\r\n } finally {\r\n isClamping = false;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Setup axes with proper configuration\r\n */\r\n private setupAxes(): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n const xRange = this.config.xRange ?? { min: 0, max: 360 };\r\n const yRange = this.config.yRange ?? { min: 0, max: 5000 };\r\n const zRange = this.config.zRange ?? { min: 0, max: 50 };\r\n\r\n const uom = this.config.unitOfMeasurement;\r\n const yAxisTitle = this.config.yAxisTitle ?? \r\n (uom ? `Amplitude (${UOM_LABELS[uom] || uom})` : \"Amplitude (mVp)\");\r\n\r\n this.surface.xAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: this.config.xAxisTitle ?? \"Phase Angle (°)\",\r\n autoTicks: false,\r\n visibleRange: new NumberRange(xRange.min, xRange.max),\r\n majorDelta: 45,\r\n minorDelta: 15,\r\n labelProvider: new IntegerLabelProvider(),\r\n drawMinorGridLines: false,\r\n majorGridLineStyle: { color: \"#7e7e7e\" },\r\n flippedCoordinates: true,\r\n axisBandsFill: \"#d2d2d2\",\r\n planeBorderThickness: 3,\r\n axisTitleStyle: { color: \"#000000\", fontFamily: \"Arial\" },\r\n labelStyle: { color: \"#000000\", fontFamily: \"Arial\" },\r\n });\r\n\r\n this.surface.yAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: yAxisTitle,\r\n visibleRange: new NumberRange(yRange.min, yRange.max),\r\n labelProvider: new IntegerLabelProvider(),\r\n drawMinorGridLines: false,\r\n majorGridLineStyle: { color: \"#7e7e7e\" },\r\n axisBandsFill: \"#b1b1b1\",\r\n axisTitleStyle: { color: \"#000000\", fontFamily: \"Arial\" },\r\n labelStyle: { color: \"#000000\", fontFamily: \"Arial\" },\r\n });\r\n\r\n this.surface.zAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: this.config.zAxisTitle ?? \"Cycle\",\r\n majorDelta: 10,\r\n minorDelta: 5,\r\n visibleRange: new NumberRange(zRange.min, zRange.max),\r\n drawMinorGridLines: false,\r\n majorGridLineStyle: { color: \"#7e7e7e\" },\r\n axisBandsFill: \"#d0d0d0\",\r\n planeBorderThickness: 3,\r\n labelPrecision: 0,\r\n axisTitleStyle: { color: \"#000000\", fontFamily: \"Arial\" },\r\n labelStyle: { color: \"#000000\", fontFamily: \"Arial\" },\r\n });\r\n\r\n // Set Y-axis label alignment to auto-rotate (like original ThreeDGraph.jsx)\r\n if (wasmContext.eSCRTTextAlignement) {\r\n this.surface.yAxis.labelStyle.alignment = \r\n wasmContext.eSCRTTextAlignement.SCRT_TEXT_ALIGNEMENT_SCREEN_AUTOROTATED;\r\n }\r\n\r\n // Force black color and Arial Bold for axis titles and labels after creation\r\n this.surface.xAxis.axisTitleStyle.color = \"#000000\";\r\n this.surface.xAxis.labelStyle.color = \"#000000\";\r\n this.surface.yAxis.axisTitleStyle.color = \"#000000\";\r\n this.surface.yAxis.labelStyle.color = \"#000000\";\r\n this.surface.zAxis.axisTitleStyle.color = \"#000000\";\r\n this.surface.zAxis.labelStyle.color = \"#000000\";\r\n }\r\n\r\n /**\r\n * Add column data to the chart\r\n */\r\n private addColumnData(data: Column3DDataPoint[]): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n\r\n // Convert values based on unit of measurement\r\n const uom = this.config.unitOfMeasurement;\r\n const convertedData = data.map(([x, y, z]) => {\r\n let convertedY = Math.abs(y);\r\n if (uom === 3 || uom === \"dBm\") {\r\n convertedY = mVrmsToDbm(convertedY);\r\n } else if (uom === 4 || uom === \"dB\") {\r\n convertedY = mVpToDb(convertedY);\r\n }\r\n return [x, convertedY, z] as Column3DDataPoint;\r\n });\r\n\r\n // Calculate stats\r\n let pulseCount = 0;\r\n let peakValue = 0;\r\n convertedData.forEach(([, y]) => {\r\n pulseCount++;\r\n if (y > peakValue) peakValue = y;\r\n });\r\n this.stats = { pulseCount, peakValue: parseFloat(peakValue.toFixed(2)) };\r\n this.config.onStatsChange?.(this.stats);\r\n\r\n // Create XYZ data series\r\n this.dataSeries = new XyzDataSeries3D(wasmContext);\r\n \r\n convertedData.forEach(([x, y, z]) => {\r\n this.dataSeries!.append(x, y, z);\r\n });\r\n\r\n // Create column series\r\n if (this.config.useCylinderMarkers) {\r\n this.columnSeries = new ColumnRenderableSeries3D(wasmContext, {\r\n dataSeries: this.dataSeries,\r\n pointMarker: new CylinderPointMarker3D(wasmContext, { \r\n fill: this.config.barFill ?? \"#52aaf2\" \r\n }),\r\n fill: this.config.barFill ?? \"#52aaf2\",\r\n stroke: this.config.barStroke ?? \"#52aaf2\",\r\n dataPointWidthX: this.config.barWidthX ?? 4,\r\n dataPointWidthZ: this.config.barWidthZ ?? 4,\r\n });\r\n } else {\r\n this.columnSeries = new ColumnRenderableSeries3D(wasmContext, {\r\n dataSeries: this.dataSeries,\r\n fill: this.config.barFill ?? \"#52aaf2\",\r\n stroke: this.config.barStroke ?? \"#52aaf2\",\r\n opacity: this.config.barOpacity ?? 0.95,\r\n dataPointWidthX: this.config.barWidthX ?? 8,\r\n dataPointWidthZ: this.config.barWidthZ ?? 8,\r\n });\r\n }\r\n\r\n this.surface!.renderableSeries.add(this.columnSeries);\r\n }\r\n\r\n /**\r\n * Add sine wave reference line on back plane\r\n */\r\n private addSineWave(): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n const sineData = new XyzDataSeries3D(wasmContext);\r\n const backPlaneZ = 0;\r\n \r\n const uom = this.config.unitOfMeasurement;\r\n const isDbScale = uom === 3 || uom === 4 || uom === \"dBm\" || uom === \"dB\";\r\n \r\n const center = this.config.sineWaveCenter ?? (isDbScale ? 40 : 2000);\r\n const amplitude = this.config.sineWaveAmplitude ?? center;\r\n\r\n for (let deg = 0; deg <= 360; deg += 5) {\r\n const rad = (deg * Math.PI) / 180;\r\n const y = center + amplitude * Math.sin(rad);\r\n sineData.append(deg, y, backPlaneZ);\r\n }\r\n\r\n this.sineSeries = new PointLineRenderableSeries3D(wasmContext, {\r\n dataSeries: sineData,\r\n stroke: \"black\",\r\n strokeThickness: 3,\r\n opacity: 1.0,\r\n });\r\n\r\n this.surface!.renderableSeries.add(this.sineSeries);\r\n }\r\n\r\n /**\r\n * Add tooltip modifier\r\n */\r\n private addTooltip(): void {\r\n if (!this.surface) return;\r\n\r\n const xTitle = this.config.xAxisTitle ?? \"Phase Angle\";\r\n const yTitle = this.config.yAxisTitle ?? \"Amplitude\";\r\n const zTitle = this.config.zAxisTitle ?? \"Cycle\";\r\n const uom = this.config.unitOfMeasurement;\r\n const unit = uom ? (UOM_LABELS[uom] || uom) : \"mVp\";\r\n\r\n const tooltipModifier = new TooltipModifier3D({\r\n tooltipDataTemplate: (seriesInfo: any) => {\r\n const valuesWithLabels: string[] = [];\r\n if (seriesInfo && seriesInfo.isHit) {\r\n valuesWithLabels.push(`${xTitle}: ${seriesInfo.xValue}°`);\r\n valuesWithLabels.push(`${yTitle}: ${seriesInfo.yValue} ${unit}`);\r\n valuesWithLabels.push(`${zTitle}: ${seriesInfo.zValue}`);\r\n }\r\n return valuesWithLabels;\r\n },\r\n });\r\n\r\n this.surface!.chartModifiers.add(tooltipModifier);\r\n }\r\n\r\n /**\r\n * Set new data for the chart\r\n */\r\n public setData(data: Column3DDataPoint[]): void {\r\n if (!this.dataSeries || !this.surface || !this.wasmContext) {\r\n this.config.data = data;\r\n return;\r\n }\r\n\r\n // Convert values based on unit of measurement\r\n const uom = this.config.unitOfMeasurement;\r\n const convertedData = data.map(([x, y, z]) => {\r\n let convertedY = Math.abs(y);\r\n if (uom === 3 || uom === \"dBm\") {\r\n convertedY = mVrmsToDbm(convertedY);\r\n } else if (uom === 4 || uom === \"dB\") {\r\n convertedY = mVpToDb(convertedY);\r\n }\r\n return [x, convertedY, z] as Column3DDataPoint;\r\n });\r\n\r\n // Calculate stats\r\n let pulseCount = 0;\r\n let peakValue = 0;\r\n convertedData.forEach(([, y]) => {\r\n pulseCount++;\r\n if (y > peakValue) peakValue = y;\r\n });\r\n this.stats = { pulseCount, peakValue: parseFloat(peakValue.toFixed(2)) };\r\n this.config.onStatsChange?.(this.stats);\r\n\r\n // Clear and update data\r\n this.dataSeries.clear();\r\n convertedData.forEach(([x, y, z]) => {\r\n this.dataSeries!.append(x, y, z);\r\n });\r\n\r\n if (this.surface) {\r\n this.surface.invalidateElement();\r\n }\r\n }\r\n\r\n /**\r\n * Update camera position\r\n */\r\n public setCameraPosition(\r\n position: { x: number; y: number; z: number },\r\n target?: { x: number; y: number; z: number }\r\n ): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n this.surface.camera.position = new Vector3(position.x, position.y, position.z);\r\n if (target) {\r\n this.surface.camera.target = new Vector3(target.x, target.y, target.z);\r\n }\r\n this.surface.invalidateElement();\r\n }\r\n\r\n /**\r\n * Set camera to a preset position\r\n */\r\n public setCameraPreset(presetIndex: number): void {\r\n const presets = this.config.cameraPresets ?? DEFAULT_CAMERA_PRESETS;\r\n if (presetIndex >= 0 && presetIndex < presets.length) {\r\n const preset = presets[presetIndex];\r\n this.setCameraPosition(preset.position, preset.target);\r\n }\r\n }\r\n\r\n /**\r\n * Reset camera to initial position\r\n */\r\n public resetCamera(): void {\r\n this.setCameraPosition(this.initialCameraPosition, this.initialCameraTarget);\r\n }\r\n\r\n /**\r\n * Update Y axis range\r\n */\r\n public setYAxisRange(min: number, max: number): void {\r\n if (!this.surface) return;\r\n this.surface.yAxis.visibleRange = new NumberRange(min, max);\r\n }\r\n\r\n /**\r\n * Update Z axis range (cycle range)\r\n */\r\n public setZAxisRange(min: number, max: number): void {\r\n if (!this.surface) return;\r\n this.surface.zAxis.visibleRange = new NumberRange(min, max);\r\n }\r\n\r\n /**\r\n * Get current statistics\r\n */\r\n public getStats(): Column3DChartStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Update chart options\r\n */\r\n public setOptions(options: Partial<Column3DChartConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n\r\n if (options.cameraPosition && this.surface && this.wasmContext) {\r\n const pos = options.cameraPosition;\r\n const target = options.cameraTarget ?? this.config.cameraTarget ?? { x: 0, y: 50, z: 0 };\r\n this.setCameraPosition(pos, target);\r\n }\r\n\r\n if (options.barFill || options.barStroke || options.barOpacity) {\r\n if (this.columnSeries) {\r\n if (options.barFill) this.columnSeries.fill = options.barFill;\r\n if (options.barStroke) this.columnSeries.stroke = options.barStroke;\r\n if (options.barOpacity !== undefined) this.columnSeries.opacity = options.barOpacity;\r\n }\r\n }\r\n\r\n if (options.yRange && this.surface) {\r\n this.surface.yAxis.visibleRange = new NumberRange(options.yRange.min, options.yRange.max);\r\n }\r\n\r\n if (options.zRange && this.surface) {\r\n this.surface.zAxis.visibleRange = new NumberRange(options.zRange.min, options.zRange.max);\r\n }\r\n }\r\n\r\n /**\r\n * Get the SciChart surface for advanced operations\r\n */\r\n public getSurface(): SciChart3DSurface | null {\r\n return this.surface;\r\n }\r\n\r\n /**\r\n * Notify SciChart that the container has resized so the WebGL canvas\r\n * adjusts to the new dimensions. Call after maximize / minimize.\r\n */\r\n public resize(): void {\r\n if (!this.surface || this.isDestroyed) return;\r\n // SciChart3DSurface checks its parent element size on each render frame,\r\n // but we can force an immediate invalidation by briefly toggling a style\r\n // or calling the internal resize. The safest way is to use\r\n // sciChart3DSurface.changeViewportSize() or invalidateElement().\r\n try {\r\n // invalidateElement triggers a re-measure + re-render\r\n (this.surface as any).invalidateElement?.();\r\n } catch {\r\n // fallback: no-op\r\n }\r\n }\r\n\r\n /**\r\n * Destroy and clean up\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n \r\n this.isDestroyed = true;\r\n\r\n if (this.surface) {\r\n try {\r\n this.surface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.surface = null;\r\n }\r\n \r\n this.container = null;\r\n this.wasmContext = null;\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): Column3DChartConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Check if chart is ready\r\n */\r\n public isReady(): boolean {\r\n return this.surface !== null && !this.isDestroyed;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a 3D column chart\r\n */\r\nexport async function createColumn3DChart(\r\n container: HTMLElement | string,\r\n config: Column3DChartConfig\r\n): Promise<Column3DChart> {\r\n const chart = new Column3DChart(config);\r\n await chart.init(container);\r\n return chart;\r\n}\r\n","import {\r\n SciChartSurface,\r\n NumericAxis,\r\n UniformHeatmapDataSeries,\r\n UniformHeatmapRenderableSeries,\r\n HeatmapColorMap,\r\n HeatmapLegend,\r\n NumberRange,\r\n ZoomExtentsModifier,\r\n RubberBandXyZoomModifier,\r\n EAutoRange,\r\n EAxisAlignment,\r\n ENumericFormat,\r\n CursorModifier,\r\n FastLineRenderableSeries,\r\n XyDataSeries,\r\n} from \"scichart\";\r\nimport { SciChartJSLightTheme } from \"scichart/Charting/Themes/SciChartJSLightTheme\";\r\nimport type {\r\n PRPDChartConfig,\r\n PRPDDataPoint,\r\n PRPDResolutionLabel,\r\n PRPDWindowingRegion,\r\n PRPDChartStats,\r\n} from \"../types\";\r\nimport { generateId } from \"../utils/helpers\";\r\n\r\n// SciChart CDN configuration - auto-configures WASM loading from CDN\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChartConfigured = false;\r\n\r\nconst configureSciChartCDN = () => {\r\n if (sciChartConfigured) return;\r\n try {\r\n const cdnBase = `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm`;\r\n SciChartSurface.configure({\r\n wasmUrl: `${cdnBase}/scichart2d.wasm`,\r\n dataUrl: `${cdnBase}/scichart2d.data`,\r\n } as any);\r\n sciChartConfigured = true;\r\n } catch (e) {\r\n console.warn(\"Failed to configure SciChart CDN:\", e);\r\n }\r\n};\r\n\r\n// ============================================\r\n// Constants\r\n// ============================================\r\n\r\nconst HORIZONTAL_RESOLUTION = 360;\r\nconst VERTICAL_SCALE_MAX_DEFAULT = 5000;\r\nconst HORIZONTAL_RESOLUTION_MULTIPLIER = 1;\r\n\r\n// Resolution configurations\r\nconst RESOLUTION_CONFIG = {\r\n UNI: {\r\n HI: { VERTICAL_RESOLUTION: 256, VERTICAL_OFFSET: 0, MIN_PEAK_ZERO: true },\r\n LO: { VERTICAL_RESOLUTION: 100, VERTICAL_OFFSET: 0, MIN_PEAK_ZERO: true },\r\n },\r\n BI: {\r\n HI: { VERTICAL_RESOLUTION: 512, VERTICAL_OFFSET: 256, MIN_PEAK_ZERO: false },\r\n LO: { VERTICAL_RESOLUTION: 200, VERTICAL_OFFSET: 100, MIN_PEAK_ZERO: false },\r\n },\r\n};\r\n\r\n// Default PRPD color map (jet-like colormap matching reference implementation)\r\n// Uses \"Transparent\" for cells at minimum value so grid shows through empty areas\r\nconst defaultPRPDColorStops = [\r\n { offset: 0, color: 'transparent' },\r\n { offset: 0.005, color: 'transparent' },\r\n { offset: 0.009, color: 'transparent' },\r\n { offset: 0.01, color: 'CornflowerBlue' },\r\n { offset: 0.4, color: 'DarkGreen' },\r\n { offset: 0.6, color: 'Chartreuse' },\r\n { offset: 0.8, color: 'Yellow' },\r\n { offset: 1, color: 'Red' },\r\n];\r\n\r\n// PRPD Theme: grey/light-grey alternating bands (matching reference)\r\nconst createPRPDTheme = () => {\r\n const theme = new SciChartJSLightTheme();\r\n theme.sciChartBackground = \"#f9f9f9\";\r\n theme.gridBackgroundBrush = \"grey\";\r\n theme.axisBandsFill = \"#dcdcdc\";\r\n theme.majorGridLineBrush = \"#888888\";\r\n theme.minorGridLineBrush = \"transparent\";\r\n return theme;\r\n};\r\n\r\n// Legend Theme: white background for heatmap color legend\r\nconst createLegendTheme = () => {\r\n const theme = new SciChartJSLightTheme();\r\n theme.sciChartBackground = \"#ffffff\";\r\n theme.gridBackgroundBrush = \"#ffffff\";\r\n theme.axisBandsFill = \"#ffffff\";\r\n theme.majorGridLineBrush = \"transparent\";\r\n theme.minorGridLineBrush = \"transparent\";\r\n return theme;\r\n};\r\n\r\n\r\n// ============================================\r\n// Helper Functions\r\n// ============================================\r\n\r\nfunction getResolutionConfig(\r\n uniBiLabel: string,\r\n hiLoLabel: string,\r\n maxPeak: number,\r\n minPeak: number,\r\n isLowResolution: boolean\r\n) {\r\n const cfg = isLowResolution\r\n ? RESOLUTION_CONFIG.UNI.HI\r\n : (RESOLUTION_CONFIG?.[uniBiLabel as keyof typeof RESOLUTION_CONFIG]?.[\r\n hiLoLabel as keyof typeof RESOLUTION_CONFIG.UNI\r\n ] ?? RESOLUTION_CONFIG.BI.HI);\r\n\r\n const newMinPeak = cfg.MIN_PEAK_ZERO ? 0 : (minPeak ?? -5000);\r\n const newMaxPeak = maxPeak ?? 5000;\r\n\r\n return {\r\n verticalResolution: cfg.VERTICAL_RESOLUTION,\r\n verticalOffset: cfg.VERTICAL_OFFSET,\r\n newMinPeak,\r\n newMaxPeak,\r\n isUnipolar: uniBiLabel === \"UNI\" || isLowResolution,\r\n };\r\n}\r\n\r\nfunction getPhaseColumnIndex(phaseAngle: number, maxPhaseAngle: number): number {\r\n const maxPhase = maxPhaseAngle || 360;\r\n if (maxPhase <= 0) return 0;\r\n\r\n const clampedPhase = Math.min(Math.max(phaseAngle, 0), maxPhase);\r\n const ratio = clampedPhase / maxPhase;\r\n\r\n return Math.min(HORIZONTAL_RESOLUTION - 1, Math.floor(ratio * (HORIZONTAL_RESOLUTION - 1)));\r\n}\r\n\r\nfunction generateSineWaveData(\r\n startX: number,\r\n endX: number,\r\n amplitude: number,\r\n frequency: number = 1,\r\n phaseShift: number = 0,\r\n step: number = 1,\r\n offset: number = 0\r\n): Array<[number, number]> {\r\n const data: Array<[number, number]> = [];\r\n for (let x = startX; x <= endX; x += step) {\r\n const rad = ((x - phaseShift) * Math.PI * frequency) / 180;\r\n const y = offset + amplitude * Math.sin(rad);\r\n data.push([x, y]);\r\n }\r\n return data;\r\n}\r\n\r\ninterface BuildZValuesResult {\r\n zValues: number[][];\r\n multiplier: number;\r\n maxValue: number;\r\n totalCount: number;\r\n verticalResolution: number;\r\n isUnipolar: boolean;\r\n newMinPeak: number;\r\n}\r\n\r\nfunction buildZValues(\r\n data: PRPDDataPoint[],\r\n scalingFactor: number,\r\n minPeak: number,\r\n maxPhaseAngle: number,\r\n verticalScaleMax: number,\r\n uniBiLabel: string,\r\n hiLoLabel: string,\r\n windowingData: PRPDWindowingRegion[] = [],\r\n isLowResolution: boolean\r\n): BuildZValuesResult {\r\n const { verticalResolution, verticalOffset, newMinPeak, newMaxPeak, isUnipolar } =\r\n getResolutionConfig(uniBiLabel, hiLoLabel, verticalScaleMax, minPeak, isLowResolution);\r\n\r\n const zValues = Array.from({ length: verticalResolution }, () =>\r\n new Array(HORIZONTAL_RESOLUTION).fill(0)\r\n );\r\n\r\n const vResolution = newMinPeak === 0 ? verticalResolution : verticalResolution / 2;\r\n const multiplier = (newMaxPeak * scalingFactor) / vResolution;\r\n\r\n let maxValue = 0;\r\n let totalCount = 0;\r\n\r\n const isInsideWindow = (phaseDeg: number, ampVal: number): boolean => {\r\n if (!windowingData?.length) return false;\r\n\r\n return windowingData.some(\r\n (w) =>\r\n phaseDeg >= w.minPhase &&\r\n phaseDeg <= w.maxPhase &&\r\n ampVal >= w.minAmp &&\r\n ampVal <= w.maxAmp\r\n );\r\n };\r\n\r\n data?.forEach(([phase_angle, amplitude, count]) => {\r\n const colIndex = getPhaseColumnIndex(phase_angle, maxPhaseAngle);\r\n\r\n const scaledAmp = Math.floor(\r\n (isUnipolar ? Math.abs(amplitude) : amplitude) * scalingFactor\r\n );\r\n\r\n // Skip counts in windowing region\r\n if (isInsideWindow(phase_angle, scaledAmp)) {\r\n return;\r\n }\r\n\r\n let rowIndex = Math.floor(scaledAmp / multiplier + verticalOffset);\r\n rowIndex = Math.max(0, Math.min(verticalResolution - 1, rowIndex));\r\n\r\n zValues[rowIndex][colIndex] += count;\r\n\r\n if (Math.abs(scaledAmp) > Math.abs(maxValue)) maxValue = scaledAmp;\r\n totalCount += count;\r\n });\r\n\r\n return {\r\n zValues,\r\n multiplier,\r\n maxValue,\r\n totalCount,\r\n verticalResolution,\r\n isUnipolar,\r\n newMinPeak,\r\n };\r\n}\r\n\r\n// ============================================\r\n// PRPDChart Class\r\n// ============================================\r\n\r\n/**\r\n * PRPD (Phase Resolved Partial Discharge) Chart implementation using SciChart\r\n * \r\n * This chart displays partial discharge data as a heatmap with:\r\n * - X-axis: Phase angle (0-360°)\r\n * - Y-axis: Amplitude (mVp or other unit)\r\n * - Color intensity: Pulse count at each phase/amplitude bin\r\n * - Optional sine wave overlay\r\n * - Resolution modes (UNI/BI, HI/LO)\r\n * - Windowing support for filtering regions\r\n */\r\nexport class PRPDChart {\r\n public readonly id: string;\r\n private container: HTMLElement | null = null; // Root container (may contain sub-divs)\r\n private chartHost: HTMLDivElement | null = null; // Div where SciChartSurface is mounted\r\n private surface: SciChartSurface | null = null;\r\n private wasmContext: any = null;\r\n private config: PRPDChartConfig;\r\n private isDestroyed: boolean = false;\r\n\r\n // Chart components\r\n private heatmapDataSeries: UniformHeatmapDataSeries | null = null;\r\n private heatmapSeries: UniformHeatmapRenderableSeries | null = null;\r\n private heatmapColorMap: HeatmapColorMap | null = null;\r\n private heatmapLegend: HeatmapLegend | null = null;\r\n private heatmapLegendDiv: HTMLDivElement | null = null;\r\n private sineDataSeries: XyDataSeries | null = null;\r\n private sineLineSeries: FastLineRenderableSeries | null = null;\r\n private xAxis: NumericAxis | null = null;\r\n private yAxis: NumericAxis | null = null;\r\n\r\n // Statistics\r\n private stats: PRPDChartStats = { peakValue: 0, totalCount: 0 };\r\n\r\n // Callbacks\r\n private onStatsChange?: (stats: PRPDChartStats) => void;\r\n\r\n constructor(config: PRPDChartConfig) {\r\n this.id = config.id ?? generateId(\"prpd\");\r\n this.config = {\r\n scalingFactor: 1,\r\n unitOfMeasurement: \"mVp\",\r\n maxPeak: 5000,\r\n minPeak: -5000,\r\n maxPhaseAngle: 360,\r\n resolutionLabel: { UniBi: \"BI\", HiLo: \"HI\" },\r\n windowingData: [],\r\n yAxisRange: 5000,\r\n isLowResolution: false,\r\n showColorPalette: true,\r\n showSineWave: true,\r\n colorMin: 0,\r\n colorMax: 100,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container (root element)\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Ensure root container has a unique ID for SciChart\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n\r\n // Determine chart host:\r\n // - If the root contains a \".chart-graph\" div, use that (Angular layout)\r\n // - Otherwise, mount directly into the root container\r\n const chartGraph = this.container.querySelector(\".chart-graph\") as HTMLDivElement | null;\r\n this.chartHost = chartGraph ?? (this.container as HTMLDivElement);\r\n\r\n // SciChart requires the host element to have an ID for canvas naming\r\n if (!this.chartHost.id) {\r\n this.chartHost.id = `${this.id}_host`;\r\n }\r\n\r\n // Create the SciChart surface\r\n await this.createSurface();\r\n }\r\n\r\n /**\r\n * Create the SciChart surface\r\n */\r\n private async createSurface(): Promise<void> {\r\n // Check if already destroyed or container missing\r\n if (this.isDestroyed || !this.container || !this.chartHost) {\r\n return;\r\n }\r\n\r\n // Check if container is still in DOM\r\n if (!document.body.contains(this.container)) {\r\n return;\r\n }\r\n\r\n // Configure SciChart to load WASM from CDN\r\n configureSciChartCDN();\r\n\r\n const theme = createPRPDTheme();\r\n\r\n let sciChartSurface;\r\n let wasmContext;\r\n \r\n try {\r\n const result = await SciChartSurface.create(\r\n this.chartHost,\r\n { theme }\r\n );\r\n sciChartSurface = result.sciChartSurface;\r\n wasmContext = result.wasmContext;\r\n } catch (e) {\r\n // SciChart initialization failed - container may have been removed\r\n console.warn(\"PRPDChart: Failed to create surface\", e);\r\n return;\r\n }\r\n \r\n // Check if destroyed during async operation\r\n if (this.isDestroyed || !this.container) {\r\n try {\r\n sciChartSurface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n return;\r\n }\r\n\r\n this.surface = sciChartSurface;\r\n this.wasmContext = wasmContext;\r\n\r\n // Build initial data\r\n const verticalScaleMax = this.config.maxPeak || VERTICAL_SCALE_MAX_DEFAULT;\r\n const { zValues, multiplier, maxValue, totalCount, verticalResolution, isUnipolar } =\r\n buildZValues(\r\n this.config.data,\r\n this.config.scalingFactor!,\r\n this.config.minPeak!,\r\n this.config.maxPhaseAngle!,\r\n verticalScaleMax,\r\n this.config.resolutionLabel?.UniBi ?? \"BI\",\r\n this.config.resolutionLabel?.HiLo ?? \"HI\",\r\n this.config.windowingData,\r\n this.config.isLowResolution!\r\n );\r\n\r\n this.stats = { peakValue: maxValue, totalCount };\r\n\r\n const yAxisRange = this.config.yAxisRange || verticalScaleMax;\r\n\r\n // Create X Axis (Phase Angle)\r\n this.xAxis = new NumericAxis(wasmContext, {\r\n autoRange: EAutoRange.Never,\r\n labelFormat: ENumericFormat.Decimal,\r\n labelPrecision: 0,\r\n labelPostfix: \"°\",\r\n minorDelta: 2,\r\n majorDelta: 45,\r\n drawMajorBands: true,\r\n autoTicks: false,\r\n axisAlignment: EAxisAlignment.Bottom,\r\n axisTitle: \"Phase Angle (°)\",\r\n axisTitleStyle: {\r\n fontSize: 14,\r\n fontWeight: \"bold\",\r\n color: \"black\",\r\n },\r\n visibleRange: new NumberRange(0, 360),\r\n visibleRangeLimit: new NumberRange(0, 360),\r\n });\r\n\r\n // Create Y Axis (Amplitude)\r\n const yRange = isUnipolar\r\n ? new NumberRange(0, yAxisRange)\r\n : new NumberRange(-yAxisRange, yAxisRange);\r\n\r\n this.yAxis = new NumericAxis(wasmContext, {\r\n autoRange: EAutoRange.Never,\r\n labelFormat: ENumericFormat.Decimal,\r\n labelPrecision: 0,\r\n drawMajorBands: true,\r\n axisAlignment: EAxisAlignment.Right,\r\n axisTitle: `Amplitude (${this.config.unitOfMeasurement})`,\r\n axisTitleStyle: {\r\n fontSize: 14,\r\n fontWeight: \"bold\",\r\n color: \"black\",\r\n rotation: 270,\r\n },\r\n visibleRange: yRange,\r\n visibleRangeLimit: yRange,\r\n });\r\n\r\n // Check if destroyed before adding axes\r\n if (this.isDestroyed) return;\r\n \r\n sciChartSurface.xAxes.add(this.xAxis);\r\n sciChartSurface.yAxes.add(this.yAxis);\r\n\r\n // Check if destroyed before creating heatmap\r\n if (this.isDestroyed) return;\r\n \r\n // Create heatmap\r\n this.createHeatmap(zValues, multiplier, verticalResolution, isUnipolar);\r\n\r\n // Create sine wave overlay\r\n if (this.config.showSineWave && !this.isDestroyed) {\r\n this.createSineWave(yAxisRange, isUnipolar);\r\n }\r\n\r\n // Check if destroyed before adding modifiers\r\n if (this.isDestroyed) return;\r\n\r\n // Add chart modifiers\r\n try {\r\n const cursorModifier = new CursorModifier();\r\n cursorModifier.axisLabelFill = \"#FFFFFF\";\r\n cursorModifier.axisLabelStroke = \"#000000\";\r\n\r\n sciChartSurface.chartModifiers.add(\r\n cursorModifier,\r\n new RubberBandXyZoomModifier(),\r\n new ZoomExtentsModifier()\r\n );\r\n } catch (e) {\r\n // Ignore modifier attachment errors - surface may be in cleanup\r\n console.warn(\"PRPDChart: Failed to add modifiers\", e);\r\n }\r\n\r\n // Check if destroyed before creating legend\r\n if (this.isDestroyed) return;\r\n \r\n // Create legend\r\n if (this.config.showColorPalette) {\r\n await this.createHeatmapLegend();\r\n }\r\n\r\n // Notify stats\r\n if (!this.isDestroyed) {\r\n this.onStatsChange?.(this.stats);\r\n }\r\n }\r\n\r\n private createHeatmap(\r\n zValues: number[][],\r\n multiplier: number,\r\n verticalResolution: number,\r\n isUnipolar: boolean\r\n ): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const colorStops = this.config.colorStops ?? defaultPRPDColorStops;\r\n\r\n this.heatmapColorMap = new HeatmapColorMap({\r\n minimum: this.config.colorMin ?? 0,\r\n maximum: this.config.colorMax ?? 100,\r\n gradientStops: colorStops,\r\n });\r\n\r\n this.heatmapDataSeries = new UniformHeatmapDataSeries(this.wasmContext, {\r\n zValues,\r\n xStart: 0,\r\n xStep: HORIZONTAL_RESOLUTION_MULTIPLIER,\r\n yStart: isUnipolar ? 0 : (-1 * verticalResolution * multiplier) / 2,\r\n yStep: multiplier,\r\n });\r\n\r\n this.heatmapSeries = new UniformHeatmapRenderableSeries(this.wasmContext, {\r\n dataSeries: this.heatmapDataSeries,\r\n colorMap: this.heatmapColorMap,\r\n });\r\n\r\n this.surface.renderableSeries.add(this.heatmapSeries);\r\n }\r\n\r\n private createSineWave(yAxisRange: number, isUnipolar: boolean): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const sineAmplitude = isUnipolar ? yAxisRange / 2 : yAxisRange;\r\n const sineOffset = isUnipolar ? yAxisRange / 2 : 0;\r\n\r\n const sineWaveData = generateSineWaveData(0, 360, sineAmplitude, 1, 0, 1, sineOffset);\r\n\r\n this.sineDataSeries = new XyDataSeries(this.wasmContext);\r\n sineWaveData.forEach(([x, y]) => this.sineDataSeries!.append(x, y));\r\n\r\n this.sineLineSeries = new FastLineRenderableSeries(this.wasmContext, {\r\n dataSeries: this.sineDataSeries,\r\n stroke: \"Black\",\r\n strokeThickness: 3,\r\n });\r\n\r\n this.surface.renderableSeries.add(this.sineLineSeries);\r\n }\r\n\r\n private async createHeatmapLegend(): Promise<void> {\r\n if (!this.container || !this.heatmapColorMap) return;\r\n\r\n this.clearHeatmapLegend();\r\n\r\n // If a dedicated legend host exists (e.g. Angular wrapper's \".heatmap-chart\"),\r\n // use that; otherwise create a positioned div inside the root container.\r\n let div = this.container.querySelector(\".heatmap-chart\") as HTMLDivElement | null;\r\n if (!div) {\r\n div = document.createElement(\"div\");\r\n div.className = \"heatmap-chart\";\r\n div.style.position = \"absolute\";\r\n div.style.top = \"40px\";\r\n div.style.left = \"0px\";\r\n div.style.bottom = \"40px\";\r\n div.style.width = \"65px\";\r\n div.style.pointerEvents = \"none\";\r\n this.container.appendChild(div);\r\n }\r\n // SciChart HeatmapLegend requires the host element to have an ID\r\n if (!div.id) {\r\n div.id = `${this.id}_legend`;\r\n }\r\n this.heatmapLegendDiv = div;\r\n\r\n const min = this.config.colorMin ?? 0;\r\n const max = this.config.colorMax ?? 100;\r\n\r\n const { heatmapLegend } = await HeatmapLegend.create(div, {\r\n theme: createLegendTheme(),\r\n yAxisOptions: {\r\n visibleRange: new NumberRange(min, max),\r\n majorDelta: (max - min) / 5,\r\n minorDelta: (max - min) / 10,\r\n labelFormat: ENumericFormat.Decimal,\r\n labelPrecision: 0,\r\n labelPadding: 6,\r\n axisTitleGap: 8,\r\n labelStyle: { fontSize: 12, color: \"#A0A0A0\" },\r\n majorTickLineStyle: {\r\n color: \"#A0A0A0\",\r\n tickSize: 8,\r\n strokeThickness: 1,\r\n },\r\n minorTickLineStyle: {\r\n color: \"gray\",\r\n tickSize: 5,\r\n strokeThickness: 1,\r\n },\r\n axisBorder: {\r\n borderLeft: 0,\r\n borderRight: 0,\r\n borderTop: 0,\r\n borderBottom: 0,\r\n color: \"transparent\",\r\n },\r\n } as any,\r\n colorMap: this.heatmapColorMap,\r\n });\r\n\r\n this.heatmapLegend = heatmapLegend;\r\n }\r\n\r\n private clearHeatmapLegend(): void {\r\n if (this.heatmapLegend) {\r\n try {\r\n this.heatmapLegend.delete();\r\n } catch (e) {\r\n // Ignore deletion errors\r\n }\r\n this.heatmapLegend = null;\r\n }\r\n if (this.heatmapLegendDiv) {\r\n this.heatmapLegendDiv.remove();\r\n this.heatmapLegendDiv = null;\r\n }\r\n }\r\n\r\n /**\r\n * Update chart with new data\r\n */\r\n public updateData(data: PRPDDataPoint[]): void {\r\n this.config.data = data;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Update resolution label (UNI/BI, HI/LO)\r\n */\r\n public setResolutionLabel(label: PRPDResolutionLabel): void {\r\n this.config.resolutionLabel = label;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Update windowing data\r\n */\r\n public setWindowingData(windowingData: PRPDWindowingRegion[]): void {\r\n this.config.windowingData = windowingData;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Update Y-axis range\r\n */\r\n public setYAxisRange(range: number): void {\r\n this.config.yAxisRange = range;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Set stats change callback\r\n */\r\n public onStats(callback: (stats: PRPDChartStats) => void): void {\r\n this.onStatsChange = callback;\r\n }\r\n\r\n /**\r\n * Get current statistics\r\n */\r\n public getStats(): PRPDChartStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Refresh the chart with current configuration\r\n */\r\n public refresh(): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const verticalScaleMax = this.config.maxPeak || VERTICAL_SCALE_MAX_DEFAULT;\r\n const yAxisRange = this.config.yAxisRange || verticalScaleMax;\r\n\r\n const { zValues, multiplier, maxValue, totalCount, verticalResolution, isUnipolar } =\r\n buildZValues(\r\n this.config.data,\r\n this.config.scalingFactor!,\r\n this.config.minPeak!,\r\n this.config.maxPhaseAngle!,\r\n verticalScaleMax,\r\n this.config.resolutionLabel?.UniBi ?? \"BI\",\r\n this.config.resolutionLabel?.HiLo ?? \"HI\",\r\n this.config.windowingData,\r\n this.config.isLowResolution!\r\n );\r\n\r\n this.stats = { peakValue: maxValue, totalCount };\r\n\r\n // Update Y axis range\r\n if (this.yAxis) {\r\n const yRange = isUnipolar\r\n ? new NumberRange(0, yAxisRange)\r\n : new NumberRange(-yAxisRange, yAxisRange);\r\n this.yAxis.visibleRange = yRange;\r\n this.yAxis.visibleRangeLimit = yRange;\r\n }\r\n\r\n // Update heatmap data series\r\n if (this.heatmapDataSeries) {\r\n const needNewDs =\r\n this.heatmapDataSeries.arrayHeight !== verticalResolution ||\r\n this.heatmapDataSeries.arrayWidth !== HORIZONTAL_RESOLUTION;\r\n\r\n if (needNewDs) {\r\n // Need to recreate data series\r\n if (this.heatmapSeries) {\r\n this.surface.renderableSeries.remove(this.heatmapSeries);\r\n this.heatmapSeries.delete();\r\n }\r\n this.heatmapDataSeries.delete();\r\n\r\n this.heatmapDataSeries = new UniformHeatmapDataSeries(this.wasmContext, {\r\n zValues,\r\n xStart: 0,\r\n xStep: HORIZONTAL_RESOLUTION_MULTIPLIER,\r\n yStart: isUnipolar ? 0 : (-1 * verticalResolution * multiplier) / 2,\r\n yStep: multiplier,\r\n });\r\n\r\n this.heatmapSeries = new UniformHeatmapRenderableSeries(this.wasmContext, {\r\n dataSeries: this.heatmapDataSeries,\r\n colorMap: this.heatmapColorMap!,\r\n });\r\n\r\n this.surface.renderableSeries.add(this.heatmapSeries);\r\n } else {\r\n // Just update values\r\n if (typeof (this.heatmapDataSeries as any).setZValues === \"function\") {\r\n (this.heatmapDataSeries as any).setZValues(zValues);\r\n } else {\r\n (this.heatmapDataSeries as any).zValues = zValues;\r\n }\r\n this.heatmapDataSeries.yStart = isUnipolar\r\n ? 0\r\n : (-1 * verticalResolution * multiplier) / 2;\r\n this.heatmapDataSeries.yStep = multiplier;\r\n }\r\n }\r\n\r\n // Update sine wave\r\n if (this.sineDataSeries && this.config.showSineWave) {\r\n this.sineDataSeries.clear();\r\n const sineAmplitude = isUnipolar ? yAxisRange / 2 : yAxisRange;\r\n const sineOffset = isUnipolar ? yAxisRange / 2 : 0;\r\n const sineWaveData = generateSineWaveData(0, 360, sineAmplitude, 1, 0, 1, sineOffset);\r\n sineWaveData.forEach(([x, y]) => this.sineDataSeries!.append(x, y));\r\n }\r\n\r\n this.surface.invalidateElement();\r\n this.onStatsChange?.(this.stats);\r\n }\r\n\r\n /**\r\n * Set chart options\r\n */\r\n public setOptions(options: Partial<PRPDChartConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Reset zoom to full extent\r\n */\r\n public resetZoom(): void {\r\n if (!this.surface) return;\r\n this.surface.zoomExtents();\r\n }\r\n\r\n /**\r\n * Export chart as image\r\n */\r\n public async exportImage(format: \"png\" | \"jpeg\" = \"png\"): Promise<string> {\r\n if (!this.container) {\r\n throw new Error(\"Chart not initialized\");\r\n }\r\n\r\n const canvas = this.container.querySelector(\"canvas\");\r\n if (!canvas) {\r\n throw new Error(\"Canvas not found\");\r\n }\r\n\r\n const mimeType = format === \"jpeg\" ? \"image/jpeg\" : \"image/png\";\r\n return canvas.toDataURL(mimeType);\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): PRPDChartConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Check if chart is ready\r\n */\r\n public isReady(): boolean {\r\n return this.surface !== null && !this.isDestroyed;\r\n }\r\n\r\n /**\r\n * Destroy and clean up\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n \r\n // Mark as destroyed immediately to prevent re-entry\r\n this.isDestroyed = true;\r\n\r\n try {\r\n this.clearHeatmapLegend();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n\r\n try {\r\n if (this.sineLineSeries && this.surface) {\r\n this.surface.renderableSeries.remove(this.sineLineSeries);\r\n this.sineLineSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.sineLineSeries = null;\r\n\r\n try {\r\n if (this.sineDataSeries) {\r\n this.sineDataSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.sineDataSeries = null;\r\n\r\n try {\r\n if (this.heatmapSeries && this.surface) {\r\n this.surface.renderableSeries.remove(this.heatmapSeries);\r\n this.heatmapSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.heatmapSeries = null;\r\n\r\n try {\r\n if (this.heatmapDataSeries) {\r\n this.heatmapDataSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.heatmapDataSeries = null;\r\n\r\n try {\r\n if (this.surface) {\r\n // Clear modifiers first to prevent SVG cleanup errors\r\n this.surface.chartModifiers.clear();\r\n this.surface.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors - DOM elements may already be removed\r\n }\r\n this.surface = null;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a PRPD chart\r\n */\r\nexport async function createPRPDChart(\r\n container: HTMLElement | string,\r\n config: PRPDChartConfig\r\n): Promise<PRPDChart> {\r\n const chart = new PRPDChart(config);\r\n await chart.init(container);\r\n return chart;\r\n}\r\n","/**\r\n * SciChart UI - A customizable charting library built on SciChart\r\n * \r\n * @packageDocumentation\r\n */\r\n\r\n// Re-export all types\r\nexport type {\r\n // Chart configurations\r\n ChartConfig,\r\n PieChartConfig,\r\n ScatterChartConfig,\r\n Surface3DChartConfig,\r\n PRPDChartConfig,\r\n AnimationConfig,\r\n TooltipConfig,\r\n TooltipData,\r\n LegendConfig,\r\n TitleConfig,\r\n \r\n // Axis configurations\r\n AxisConfig,\r\n XAxisConfig,\r\n YAxisConfig,\r\n GridLineConfig,\r\n \r\n // Data types\r\n DataPoint,\r\n SeriesData,\r\n ChartType,\r\n PRPDDataPoint,\r\n PRPDResolutionMode,\r\n PRPDResolutionQuality,\r\n PRPDResolutionLabel,\r\n PRPDWindowingRegion,\r\n PRPDChartStats,\r\n \r\n // Theme types\r\n ThemeConfig,\r\n \r\n // Event types\r\n ChartEventMap,\r\n ChartClickEvent,\r\n ChartHoverEvent,\r\n LegendClickEvent,\r\n ZoomEvent,\r\n PanEvent,\r\n RenderedEvent,\r\n \r\n // Instance types\r\n ChartInstance,\r\n} from \"./types\";\r\n\r\n// Export charts\r\nexport {\r\n BaseChart,\r\n Surface3DChart,\r\n createSurface3DChart,\r\n Column3DChart,\r\n createColumn3DChart,\r\n PRPDChart,\r\n createPRPDChart,\r\n type Column3DChartConfig,\r\n type Column3DDataPoint,\r\n type Column3DChartStats,\r\n type CameraPreset,\r\n type UnitOfMeasurement,\r\n DEFAULT_CAMERA_PRESETS,\r\n UOM_LABELS,\r\n mVrmsToDbm,\r\n mVpToDb,\r\n} from \"./charts\";\r\n\r\n// Export themes\r\nexport {\r\n lightTheme,\r\n darkTheme,\r\n modernTheme,\r\n midnightTheme,\r\n ThemeManager,\r\n getThemeManager,\r\n} from \"./themes\";\r\n\r\n// Export utilities\r\nexport {\r\n generateId,\r\n parseSize,\r\n normalizeDataPoints,\r\n extractXValues,\r\n extractYValues,\r\n deepMerge,\r\n debounce,\r\n throttle,\r\n calculateDataRange,\r\n formatNumber,\r\n clamp,\r\n lerp,\r\n hexToRgba,\r\n} from \"./utils\";\r\n\r\n// Library version\r\nexport const VERSION = \"0.1.1\";\r\n\r\n// SciChart configuration helper\r\nexport { SciChartSurface } from \"scichart\";\r\n\r\n// SciChart version for CDN URLs\r\nconst SCICHART_VERSION = \"4.0.933\";\r\n\r\n// Default CDN URLs for SciChart WASM files\r\nconst DEFAULT_WASM_URL = `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart2d.wasm`;\r\n\r\n// Auto-configure SciChart with CDN on package import\r\nlet isConfigured = false;\r\n\r\nfunction autoConfigureSciChart(): void {\r\n if (isConfigured) return;\r\n \r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { SciChartSurface } = require(\"scichart\");\r\n SciChartSurface.configure({\r\n wasmUrl: DEFAULT_WASM_URL,\r\n });\r\n isConfigured = true;\r\n } catch {\r\n // SciChart not available, skip auto-configuration\r\n }\r\n}\r\n\r\n// Run auto-configuration on import\r\nautoConfigureSciChart();\r\n\r\n/**\r\n * Configure SciChart WebAssembly location\r\n * By default, the package auto-configures to use CDN. \r\n * Call this to override with custom paths.\r\n * \r\n * @example\r\n * ```ts\r\n * import { configureSciChart } from '@rm-graph/core';\r\n * \r\n * // Use local WASM files\r\n * configureSciChart({\r\n * wasmUrl: '/scichart2d.wasm'\r\n * });\r\n * ```\r\n */\r\nexport function configureSciChart(options: {\r\n wasmUrl?: string;\r\n}): void {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { SciChartSurface } = require(\"scichart\");\r\n SciChartSurface.configure({\r\n wasmUrl: options.wasmUrl || DEFAULT_WASM_URL,\r\n });\r\n isConfigured = true;\r\n } catch {\r\n // SciChart not available\r\n }\r\n}\r\n\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/helpers.ts","../src/charts/BaseChart.ts","../src/charts/Surface3DChart.ts","../src/charts/Column3DChart.ts","../src/charts/PRPDChart.ts","../src/index.ts"],"names":["SciChartSurface","ThemeManager","SciChartJSLightTheme","__require","SCICHART_VERSION","SciChart3DSurface","NumericAxis3D","MouseWheelZoomModifier3D","OrbitModifier3D","CameraController","Vector3","UniformGridDataSeries3D","GradientColorPalette","SurfaceMeshRenderableSeries3D","EDrawMeshAs","sciChart3DConfigured","ensureSciChart3DConfigured","NumericLabelProvider","ResetCamera3DModifier","NumberRange","XyzDataSeries3D","ColumnRenderableSeries3D","CylinderPointMarker3D","PointLineRenderableSeries3D","TooltipModifier3D","sciChartConfigured","NumericAxis","EAutoRange","ENumericFormat","EAxisAlignment","CursorModifier","RubberBandXyZoomModifier","ZoomExtentsModifier","HeatmapColorMap","UniformHeatmapDataSeries","UniformHeatmapRenderableSeries","XyDataSeries","FastLineRenderableSeries","HeatmapLegend","loadLicense"],"mappings":"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","file":"index.js","sourcesContent":["import type { DataPoint, SeriesData } from \"../types\";\r\n\r\n/**\r\n * Generate a unique ID\r\n */\r\nexport function generateId(prefix: string = \"chart\"): string {\r\n return `${prefix}-${Math.random().toString(36).substring(2, 11)}`;\r\n}\r\n\r\n/**\r\n * Parse size value (handles both string and number)\r\n */\r\nexport function parseSize(value: string | number | undefined, fallback: number): number {\r\n if (value === undefined) return fallback;\r\n if (typeof value === \"number\") return value;\r\n \r\n // Handle percentage\r\n if (value.endsWith(\"%\")) {\r\n return fallback; // Return fallback for percentage, will be handled by CSS\r\n }\r\n \r\n // Handle px\r\n const parsed = parseInt(value, 10);\r\n return isNaN(parsed) ? fallback : parsed;\r\n}\r\n\r\n/**\r\n * Normalize data points to standard format\r\n */\r\nexport function normalizeDataPoints(data: DataPoint[] | number[]): DataPoint[] {\r\n if (data.length === 0) return [];\r\n \r\n // Check if it's already DataPoint format\r\n if (typeof data[0] === \"object\" && \"x\" in data[0]) {\r\n return data as DataPoint[];\r\n }\r\n \r\n // Convert number array to DataPoint array\r\n return (data as number[]).map((y, index) => ({\r\n x: index,\r\n y,\r\n }));\r\n}\r\n\r\n/**\r\n * Extract x values from data points\r\n */\r\nexport function extractXValues(data: DataPoint[]): number[] {\r\n return data.map((point) => {\r\n if (typeof point.x === \"number\") return point.x;\r\n if (point.x instanceof Date) return point.x.getTime();\r\n return 0; // For string categories, will be handled separately\r\n });\r\n}\r\n\r\n/**\r\n * Extract y values from data points\r\n */\r\nexport function extractYValues(data: DataPoint[]): number[] {\r\n return data.map((point) => point.y);\r\n}\r\n\r\n/**\r\n * Deep merge objects\r\n */\r\nexport function deepMerge<T extends Record<string, unknown>>(\r\n target: T,\r\n source: Partial<T>\r\n): T {\r\n const result = { ...target };\r\n \r\n for (const key in source) {\r\n if (Object.prototype.hasOwnProperty.call(source, key)) {\r\n const sourceValue = source[key];\r\n const targetValue = target[key];\r\n \r\n if (\r\n sourceValue !== null &&\r\n typeof sourceValue === \"object\" &&\r\n !Array.isArray(sourceValue) &&\r\n targetValue !== null &&\r\n typeof targetValue === \"object\" &&\r\n !Array.isArray(targetValue)\r\n ) {\r\n (result as Record<string, unknown>)[key] = deepMerge(\r\n targetValue as Record<string, unknown>,\r\n sourceValue as Record<string, unknown>\r\n );\r\n } else if (sourceValue !== undefined) {\r\n (result as Record<string, unknown>)[key] = sourceValue;\r\n }\r\n }\r\n }\r\n \r\n return result;\r\n}\r\n\r\n/**\r\n * Debounce function\r\n */\r\nexport function debounce<T extends (...args: unknown[]) => void>(\r\n fn: T,\r\n delay: number\r\n): (...args: Parameters<T>) => void {\r\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n timeoutId = setTimeout(() => {\r\n fn(...args);\r\n timeoutId = null;\r\n }, delay);\r\n };\r\n}\r\n\r\n/**\r\n * Throttle function\r\n */\r\nexport function throttle<T extends (...args: unknown[]) => void>(\r\n fn: T,\r\n limit: number\r\n): (...args: Parameters<T>) => void {\r\n let inThrottle = false;\r\n \r\n return (...args: Parameters<T>) => {\r\n if (!inThrottle) {\r\n fn(...args);\r\n inThrottle = true;\r\n setTimeout(() => {\r\n inThrottle = false;\r\n }, limit);\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Calculate min and max from data series\r\n */\r\nexport function calculateDataRange(series: SeriesData[]): {\r\n xMin: number;\r\n xMax: number;\r\n yMin: number;\r\n yMax: number;\r\n} {\r\n let xMin = Infinity;\r\n let xMax = -Infinity;\r\n let yMin = Infinity;\r\n let yMax = -Infinity;\r\n \r\n for (const s of series) {\r\n const normalized = normalizeDataPoints(s.data);\r\n for (const point of normalized) {\r\n const x = typeof point.x === \"number\" ? point.x : 0;\r\n xMin = Math.min(xMin, x);\r\n xMax = Math.max(xMax, x);\r\n yMin = Math.min(yMin, point.y);\r\n yMax = Math.max(yMax, point.y);\r\n }\r\n }\r\n \r\n return {\r\n xMin: xMin === Infinity ? 0 : xMin,\r\n xMax: xMax === -Infinity ? 100 : xMax,\r\n yMin: yMin === Infinity ? 0 : yMin,\r\n yMax: yMax === -Infinity ? 100 : yMax,\r\n };\r\n}\r\n\r\n/**\r\n * Format number for display\r\n */\r\nexport function formatNumber(value: number, precision: number = 2): string {\r\n if (Math.abs(value) >= 1e9) {\r\n return (value / 1e9).toFixed(precision) + \"B\";\r\n }\r\n if (Math.abs(value) >= 1e6) {\r\n return (value / 1e6).toFixed(precision) + \"M\";\r\n }\r\n if (Math.abs(value) >= 1e3) {\r\n return (value / 1e3).toFixed(precision) + \"K\";\r\n }\r\n return value.toFixed(precision);\r\n}\r\n\r\n/**\r\n * Clamp a value between min and max\r\n */\r\nexport function clamp(value: number, min: number, max: number): number {\r\n return Math.min(Math.max(value, min), max);\r\n}\r\n\r\n/**\r\n * Linear interpolation\r\n */\r\nexport function lerp(start: number, end: number, t: number): number {\r\n return start + (end - start) * clamp(t, 0, 1);\r\n}\r\n\r\n/**\r\n * Convert hex color to rgba\r\n */\r\nexport function hexToRgba(hex: string, alpha: number = 1): string {\r\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(hex);\r\n if (!result) return hex;\r\n \r\n const r = parseInt(result[1], 16);\r\n const g = parseInt(result[2], 16);\r\n const b = parseInt(result[3], 16);\r\n \r\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\r\n}\r\n\r\n","import { SciChartSurface } from \"scichart\";\r\nimport type {\r\n ChartConfig,\r\n ChartInstance,\r\n ChartEventMap,\r\n SeriesData,\r\n ThemeConfig,\r\n} from \"../types\";\r\nimport { ThemeManager } from \"../themes/ThemeManager\";\r\nimport { generateId, debounce } from \"../utils/helpers\";\r\n\r\n// SciChart WASM CDN configuration\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChartConfigured = false;\r\n\r\nfunction ensureSciChartConfigured(): void {\r\n if (sciChartConfigured) return;\r\n try {\r\n SciChartSurface.useWasmFromCDN();\r\n sciChartConfigured = true;\r\n } catch {\r\n // Fallback to manual configuration\r\n try {\r\n SciChartSurface.configure({\r\n wasmUrl: `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart2d.wasm`,\r\n });\r\n sciChartConfigured = true;\r\n } catch {\r\n // Configuration may already be set\r\n }\r\n }\r\n}\r\n\r\n// Type for SciChart surface\r\ntype SciChartSurfaceType = Awaited<ReturnType<typeof SciChartSurface.create>>[\"sciChartSurface\"];\r\n\r\n/**\r\n * Abstract base class for all chart types\r\n * Handles common functionality like initialization, theming, events, and cleanup\r\n */\r\nexport abstract class BaseChart<TConfig extends ChartConfig> implements ChartInstance {\r\n public readonly id: string;\r\n protected container: HTMLElement | null = null;\r\n protected surface: SciChartSurfaceType | null = null;\r\n protected config: TConfig;\r\n protected theme: ThemeConfig;\r\n protected isInitialized: boolean = false;\r\n protected isDestroyed: boolean = false;\r\n\r\n // Event handlers\r\n private eventHandlers: Map<keyof ChartEventMap, Set<(e: unknown) => void>> = new Map();\r\n\r\n // Resize observer\r\n private resizeObserver: ResizeObserver | null = null;\r\n private debouncedResize: () => void;\r\n\r\n constructor(config: TConfig) {\r\n this.id = config.id ?? generateId(\"chart\");\r\n this.config = config;\r\n this.theme = ThemeManager.getInstance().resolveTheme(config.theme);\r\n this.debouncedResize = debounce(() => this.handleResize(), 100);\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Set container styles\r\n this.setupContainer();\r\n\r\n // Configure SciChart defaults\r\n this.configureSciChartDefaults();\r\n\r\n // Create the SciChart surface\r\n await this.createSurface();\r\n\r\n // Set up resize observer\r\n this.setupResizeObserver();\r\n\r\n this.isInitialized = true;\r\n this.emit(\"rendered\", { chartId: this.id, renderTime: performance.now() });\r\n }\r\n\r\n /**\r\n * Setup container element\r\n */\r\n private setupContainer(): void {\r\n if (!this.container) return;\r\n\r\n const { width, height } = this.config;\r\n\r\n // Set dimensions\r\n if (width) {\r\n this.container.style.width =\r\n typeof width === \"number\" ? `${width}px` : width;\r\n }\r\n if (height) {\r\n this.container.style.height =\r\n typeof height === \"number\" ? `${height}px` : height;\r\n }\r\n\r\n // Ensure container has position for absolute children\r\n const computedStyle = window.getComputedStyle(this.container);\r\n if (computedStyle.position === \"static\") {\r\n this.container.style.position = \"relative\";\r\n }\r\n }\r\n\r\n /**\r\n * Configure SciChart library defaults\r\n */\r\n private configureSciChartDefaults(): void {\r\n ensureSciChartConfigured();\r\n }\r\n\r\n /**\r\n * Create the SciChart surface - implemented by subclasses\r\n */\r\n protected abstract createSurface(): Promise<void>;\r\n\r\n /**\r\n * Update the chart with new data\r\n */\r\n public abstract setData(data: SeriesData[]): void;\r\n\r\n /**\r\n * Update chart options\r\n */\r\n public setOptions(options: Partial<TConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n \r\n // Update theme if changed\r\n if (options.theme) {\r\n this.theme = ThemeManager.getInstance().resolveTheme(options.theme);\r\n this.applyTheme();\r\n }\r\n\r\n // Trigger re-render\r\n this.update();\r\n }\r\n\r\n /**\r\n * Apply current theme to the chart\r\n */\r\n protected applyTheme(): void {\r\n if (!this.surface) return;\r\n\r\n this.surface.background = this.theme.backgroundColor ?? \"#ffffff\";\r\n\r\n // Apply SciChart theme provider when switching themes\r\n // (otherwise axes/gridlines can remain styled for the old theme).\r\n try {\r\n const themeName = (this.config.theme as any) as string | undefined;\r\n // Lazy-require to avoid bundler issues in non-browser environments\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n const { SciChartJSDarkTheme, SciChartJSLightTheme } = require(\"scichart\");\r\n const nextThemeProvider =\r\n themeName === \"light\" ? new SciChartJSLightTheme() : new SciChartJSDarkTheme();\r\n (this.surface as any).applyTheme?.(nextThemeProvider);\r\n } catch {\r\n // ignore if scichart theme provider isn't available\r\n }\r\n\r\n // Update common axis styling for current theme\r\n try {\r\n const applyAxisTheme = (axis: any) => {\r\n if (!axis) return;\r\n axis.axisTitleStyle = {\r\n ...(axis.axisTitleStyle ?? {}),\r\n color: this.theme.axis?.titleColor,\r\n fontFamily: this.theme.fontFamily,\r\n };\r\n axis.labelStyle = {\r\n ...(axis.labelStyle ?? {}),\r\n color: this.theme.axis?.labelColor,\r\n fontFamily: this.theme.fontFamily,\r\n };\r\n axis.majorGridLineStyle = {\r\n ...(axis.majorGridLineStyle ?? {}),\r\n color: this.theme.axis?.gridLineColor,\r\n };\r\n axis.axisBorder = {\r\n ...(axis.axisBorder ?? {}),\r\n color: this.theme.axis?.lineColor,\r\n };\r\n };\r\n\r\n const xAxes = (this.surface as any).xAxes;\r\n const yAxes = (this.surface as any).yAxes;\r\n\r\n // SciChart uses ObservableArray; it can be iterated via .asArray() or .itemsArray\r\n const toArray = (axes: any) =>\r\n axes?.asArray?.() ?? axes?.itemsArray ?? axes?.items ?? [];\r\n\r\n for (const axis of toArray(xAxes)) applyAxisTheme(axis);\r\n for (const axis of toArray(yAxes)) applyAxisTheme(axis);\r\n } catch {\r\n // ignore axis styling issues\r\n }\r\n\r\n // Additional theme application handled by subclasses\r\n }\r\n\r\n /**\r\n * Update the chart (re-render with current config)\r\n */\r\n protected abstract update(): void;\r\n\r\n /**\r\n * Set up resize observer for responsive charts\r\n */\r\n private setupResizeObserver(): void {\r\n if (!this.container || typeof ResizeObserver === \"undefined\") return;\r\n\r\n this.resizeObserver = new ResizeObserver(() => {\r\n this.debouncedResize();\r\n });\r\n\r\n this.resizeObserver.observe(this.container);\r\n }\r\n\r\n /**\r\n * Handle container resize\r\n */\r\n private handleResize(): void {\r\n if (!this.surface || !this.container) return;\r\n\r\n const { width, height } = this.container.getBoundingClientRect();\r\n if (width > 0 && height > 0) {\r\n // SciChart handles resizing automatically when container size changes\r\n // but we can force a redraw if needed\r\n }\r\n }\r\n\r\n /**\r\n * Manually resize the chart\r\n */\r\n public resize(width?: number, height?: number): void {\r\n if (!this.container) return;\r\n\r\n if (width !== undefined) {\r\n this.container.style.width = `${width}px`;\r\n }\r\n if (height !== undefined) {\r\n this.container.style.height = `${height}px`;\r\n }\r\n\r\n this.handleResize();\r\n }\r\n\r\n /**\r\n * Reset zoom to fit all data (zoom extents)\r\n * Note: not part of the ChartInstance interface, but available on concrete chart classes.\r\n */\r\n public resetZoom(): void {\r\n if (!this.surface) return;\r\n try {\r\n (this.surface as any).zoomExtents?.();\r\n } catch {\r\n // ignore\r\n }\r\n }\r\n\r\n /**\r\n * Export chart as image\r\n */\r\n public async exportImage(format: \"png\" | \"jpeg\" | \"svg\" = \"png\"): Promise<string> {\r\n if (!this.surface) {\r\n throw new Error(\"Chart not initialized\");\r\n }\r\n\r\n // SciChart provides export functionality\r\n // This is a simplified implementation\r\n const canvas = this.container?.querySelector(\"canvas\");\r\n if (!canvas) {\r\n throw new Error(\"Canvas not found\");\r\n }\r\n\r\n const mimeType = format === \"jpeg\" ? \"image/jpeg\" : \"image/png\";\r\n return canvas.toDataURL(mimeType);\r\n }\r\n\r\n /**\r\n * Add event listener\r\n */\r\n public on<K extends keyof ChartEventMap>(\r\n event: K,\r\n handler: (e: ChartEventMap[K]) => void\r\n ): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler as (e: unknown) => void);\r\n }\r\n\r\n /**\r\n * Remove event listener\r\n */\r\n public off<K extends keyof ChartEventMap>(\r\n event: K,\r\n handler: (e: ChartEventMap[K]) => void\r\n ): void {\r\n const handlers = this.eventHandlers.get(event);\r\n if (handlers) {\r\n handlers.delete(handler as (e: unknown) => void);\r\n }\r\n }\r\n\r\n /**\r\n * Emit an event\r\n */\r\n protected emit<K extends keyof ChartEventMap>(event: K, data: ChartEventMap[K]): void {\r\n const handlers = this.eventHandlers.get(event);\r\n if (handlers) {\r\n handlers.forEach((handler) => handler(data));\r\n }\r\n }\r\n\r\n /**\r\n * Destroy the chart and clean up resources\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n\r\n // Clean up resize observer\r\n if (this.resizeObserver) {\r\n this.resizeObserver.disconnect();\r\n this.resizeObserver = null;\r\n }\r\n\r\n // Clean up event handlers\r\n this.eventHandlers.clear();\r\n\r\n // Delete the SciChart surface\r\n if (this.surface) {\r\n this.surface.delete();\r\n this.surface = null;\r\n }\r\n\r\n // Clear container\r\n if (this.container) {\r\n this.container.innerHTML = \"\";\r\n }\r\n\r\n this.isDestroyed = true;\r\n this.isInitialized = false;\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): TConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Get current theme\r\n */\r\n public getTheme(): ThemeConfig {\r\n return { ...this.theme };\r\n }\r\n\r\n /**\r\n * Check if chart is initialized\r\n */\r\n public isReady(): boolean {\r\n return this.isInitialized && !this.isDestroyed;\r\n }\r\n}\r\n\r\n","import {\r\n SciChart3DSurface,\r\n NumericAxis3D,\r\n SurfaceMeshRenderableSeries3D,\r\n UniformGridDataSeries3D,\r\n CameraController,\r\n GradientColorPalette,\r\n MouseWheelZoomModifier3D,\r\n OrbitModifier3D,\r\n Vector3,\r\n EDrawMeshAs,\r\n} from \"scichart\";\r\nimport type { Surface3DChartConfig, SeriesData } from \"../types\";\r\nimport { generateId } from \"../utils/helpers\";\r\n\r\n// SciChart 3D WASM CDN configuration\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChart3DConfigured = false;\r\n\r\nfunction ensureSciChart3DConfigured(): void {\r\n if (sciChart3DConfigured) return;\r\n try {\r\n SciChart3DSurface.useWasmFromCDN();\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Fallback to manual configuration\r\n try {\r\n SciChart3DSurface.configure({\r\n wasmUrl: `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart3d.wasm`,\r\n });\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Configuration may already be set\r\n }\r\n }\r\n}\r\n\r\n// Default color stops for 3D surface\r\nconst defaultColorStops = [\r\n { offset: 0, color: \"#1e3a8a\" }, // Dark blue\r\n { offset: 0.25, color: \"#3b82f6\" }, // Blue\r\n { offset: 0.5, color: \"#22c55e\" }, // Green\r\n { offset: 0.75, color: \"#eab308\" }, // Yellow\r\n { offset: 1, color: \"#ef4444\" }, // Red\r\n];\r\n\r\n/**\r\n * 3D Surface Chart implementation using SciChart\r\n */\r\nexport class Surface3DChart {\r\n public readonly id: string;\r\n private container: HTMLElement | null = null;\r\n private surface: SciChart3DSurface | null = null;\r\n private wasmContext: any = null;\r\n private config: Surface3DChartConfig;\r\n private dataSeries: UniformGridDataSeries3D | null = null;\r\n private meshSeries: SurfaceMeshRenderableSeries3D | null = null;\r\n private isDestroyed: boolean = false;\r\n\r\n constructor(config: Surface3DChartConfig) {\r\n this.id = config.id ?? generateId(\"chart3d\");\r\n this.config = config;\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Ensure container has a unique ID for SciChart\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n\r\n // Configure SciChart 3D WASM\r\n ensureSciChart3DConfigured();\r\n\r\n // Create the 3D surface\r\n await this.createSurface();\r\n }\r\n\r\n /**\r\n * Create the SciChart 3D surface\r\n */\r\n private async createSurface(): Promise<void> {\r\n // Check if already destroyed or container missing\r\n if (this.isDestroyed || !this.container) {\r\n return;\r\n }\r\n \r\n // Ensure container has an ID\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n \r\n // Check if container is still in DOM\r\n if (!document.body.contains(this.container)) {\r\n return;\r\n }\r\n\r\n let sciChart3DSurface;\r\n let wasmContext;\r\n \r\n try {\r\n const result = await SciChart3DSurface.create(\r\n this.container.id\r\n );\r\n sciChart3DSurface = result.sciChart3DSurface;\r\n wasmContext = result.wasmContext;\r\n } catch (e) {\r\n // SciChart initialization failed - container may have been removed\r\n console.warn(\"Surface3DChart: Failed to create surface\", e);\r\n return;\r\n }\r\n \r\n // Check if destroyed during async operation\r\n if (this.isDestroyed || !this.container) {\r\n try {\r\n sciChart3DSurface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n return;\r\n }\r\n\r\n this.surface = sciChart3DSurface;\r\n this.wasmContext = wasmContext;\r\n\r\n // Create axes\r\n sciChart3DSurface.xAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: \"X\",\r\n });\r\n sciChart3DSurface.yAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: \"Y\",\r\n });\r\n sciChart3DSurface.zAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: \"Z\",\r\n });\r\n\r\n // Add interactivity\r\n sciChart3DSurface.chartModifiers.add(new MouseWheelZoomModifier3D());\r\n sciChart3DSurface.chartModifiers.add(new OrbitModifier3D());\r\n\r\n // Set up camera\r\n const cameraPos = this.config.cameraPosition ?? { x: 300, y: 300, z: 300 };\r\n sciChart3DSurface.camera = new CameraController(wasmContext, {\r\n position: new Vector3(cameraPos.x, cameraPos.y, cameraPos.z),\r\n target: new Vector3(0, 0, 0),\r\n });\r\n\r\n // Add surface data\r\n this.addSurfaceData(this.config.yValues);\r\n }\r\n\r\n /**\r\n * Add surface data to the chart\r\n */\r\n private addSurfaceData(yValues: number[][]): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n const zSize = yValues.length;\r\n const xSize = yValues[0]?.length ?? 0;\r\n\r\n // Calculate min/max from data\r\n let min = Infinity;\r\n let max = -Infinity;\r\n for (let z = 0; z < zSize; z++) {\r\n for (let x = 0; x < xSize; x++) {\r\n const y = yValues[z][x];\r\n min = Math.min(min, y);\r\n max = Math.max(max, y);\r\n }\r\n }\r\n\r\n // Create data series\r\n this.dataSeries = new UniformGridDataSeries3D(wasmContext, {\r\n yValues,\r\n xStep: this.config.xStep ?? 1,\r\n zStep: this.config.zStep ?? 1,\r\n });\r\n\r\n // Get color stops\r\n const colorStops = this.config.colorStops ?? defaultColorStops;\r\n\r\n // Create color palette\r\n const colorPalette = new GradientColorPalette(wasmContext, {\r\n gradientStops: colorStops,\r\n });\r\n\r\n // Create mesh series - solid filled surface\r\n this.meshSeries = new SurfaceMeshRenderableSeries3D(wasmContext, {\r\n dataSeries: this.dataSeries,\r\n minimum: this.config.colorMin ?? min,\r\n maximum: this.config.colorMax ?? max,\r\n opacity: this.config.opacity ?? 1.0,\r\n cellHardnessFactor: 0, // Smooth interpolation between cells\r\n stroke: \"transparent\", // No wireframe stroke\r\n strokeThickness: 0,\r\n contourStroke: \"transparent\", // No contour lines\r\n contourStrokeThickness: 0,\r\n drawSkirt: true, // Draw skirt for solid appearance\r\n drawMeshAs: EDrawMeshAs.SOLID_MESH, // Solid filled surface\r\n lightingFactor: 0.8,\r\n meshColorPalette: colorPalette,\r\n shininess: 10,\r\n });\r\n\r\n this.surface!.renderableSeries.add(this.meshSeries);\r\n }\r\n\r\n /**\r\n * Set new Y values for the surface\r\n */\r\n public setYValues(yValues: number[][]): void {\r\n if (!this.surface) {\r\n this.config.yValues = yValues;\r\n return;\r\n }\r\n\r\n // Clear existing surface\r\n this.clearSurface();\r\n\r\n // Update config and add new data\r\n this.config.yValues = yValues;\r\n this.addSurfaceData(yValues);\r\n }\r\n\r\n /**\r\n * Set new data (alias for setYValues for consistency)\r\n */\r\n public setData(_data: SeriesData[]): void {\r\n console.warn(\"Surface3DChart.setData() - use setYValues() for updating surface data\");\r\n }\r\n\r\n /**\r\n * Update chart options\r\n */\r\n public setOptions(options: Partial<Surface3DChartConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n\r\n if (options.cameraPosition && this.surface && this.wasmContext) {\r\n const pos = options.cameraPosition;\r\n this.surface.camera = new CameraController(this.wasmContext, {\r\n position: new Vector3(pos.x, pos.y, pos.z),\r\n target: new Vector3(0, 0, 0),\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Clear surface data\r\n */\r\n private clearSurface(): void {\r\n if (!this.surface) return;\r\n\r\n if (this.meshSeries) {\r\n this.surface.renderableSeries.remove(this.meshSeries);\r\n this.meshSeries.delete();\r\n this.meshSeries = null;\r\n }\r\n\r\n if (this.dataSeries) {\r\n this.dataSeries.delete();\r\n this.dataSeries = null;\r\n }\r\n }\r\n\r\n /**\r\n * Destroy and clean up\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n \r\n // Mark as destroyed immediately to prevent re-entry\r\n this.isDestroyed = true;\r\n\r\n try {\r\n this.clearSurface();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n\r\n if (this.surface) {\r\n try {\r\n this.surface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors - surface may already be destroyed\r\n }\r\n this.surface = null;\r\n }\r\n \r\n this.container = null;\r\n this.wasmContext = null;\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): Surface3DChartConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Check if chart is ready (initialized and not destroyed)\r\n */\r\n public isReady(): boolean {\r\n return this.surface !== null && !this.isDestroyed;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a 3D surface chart\r\n */\r\nexport async function createSurface3DChart(\r\n container: HTMLElement | string,\r\n config: Surface3DChartConfig\r\n): Promise<Surface3DChart> {\r\n const chart = new Surface3DChart(config);\r\n await chart.init(container);\r\n return chart;\r\n}\r\n\r\n","import {\r\n SciChart3DSurface,\r\n NumericAxis3D,\r\n XyzDataSeries3D,\r\n ColumnRenderableSeries3D,\r\n PointLineRenderableSeries3D,\r\n NumberRange,\r\n CameraController,\r\n Vector3,\r\n OrbitModifier3D,\r\n MouseWheelZoomModifier3D,\r\n TooltipModifier3D,\r\n ResetCamera3DModifier,\r\n CylinderPointMarker3D,\r\n NumericLabelProvider,\r\n SciChartJSLightTheme,\r\n} from \"scichart\";\r\nimport type { ChartConfig } from \"../types\";\r\nimport { generateId } from \"../utils/helpers\";\r\n\r\n// SciChart 3D WASM CDN configuration\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChart3DConfigured = false;\r\n\r\nfunction ensureSciChart3DConfigured(): void {\r\n if (sciChart3DConfigured) return;\r\n try {\r\n SciChart3DSurface.useWasmFromCDN();\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Fallback to manual configuration\r\n try {\r\n SciChart3DSurface.configure({\r\n wasmUrl: `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart3d.wasm`,\r\n });\r\n sciChart3DConfigured = true;\r\n } catch {\r\n // Configuration may already be set\r\n }\r\n }\r\n}\r\n\r\n/** Data point for 3D column chart [x, y, z] */\r\nexport type Column3DDataPoint = [number, number, number];\r\n\r\n/** Unit of measurement options */\r\nexport type UnitOfMeasurement = \"mVp\" | \"mVrms\" | \"dBm\" | \"dB\" | number;\r\n\r\n/** Camera preset positions */\r\nexport interface CameraPreset {\r\n position: { x: number; y: number; z: number };\r\n target: { x: number; y: number; z: number };\r\n}\r\n\r\n/** Chart statistics */\r\nexport interface Column3DChartStats {\r\n pulseCount: number;\r\n peakValue: number;\r\n}\r\n\r\n/** Configuration for 3D Column Chart */\r\nexport interface Column3DChartConfig extends ChartConfig {\r\n /** Array of [x, y, z] data points */\r\n data: Column3DDataPoint[];\r\n /** X axis title */\r\n xAxisTitle?: string;\r\n /** Y axis title */\r\n yAxisTitle?: string;\r\n /** Z axis title */\r\n zAxisTitle?: string;\r\n /** X axis visible range */\r\n xRange?: { min: number; max: number };\r\n /** Y axis visible range */\r\n yRange?: { min: number; max: number };\r\n /** Z axis visible range */\r\n zRange?: { min: number; max: number };\r\n /** Bar fill color */\r\n barFill?: string;\r\n /** Bar stroke color */\r\n barStroke?: string;\r\n /** Bar opacity (0-1) */\r\n barOpacity?: number;\r\n /** Bar width in X direction */\r\n barWidthX?: number;\r\n /** Bar width in Z direction */\r\n barWidthZ?: number;\r\n /** Camera position */\r\n cameraPosition?: { x: number; y: number; z: number };\r\n /** Camera target */\r\n cameraTarget?: { x: number; y: number; z: number };\r\n /** Show sine wave reference line on back plane */\r\n showSineWave?: boolean;\r\n /** Sine wave amplitude center */\r\n sineWaveCenter?: number;\r\n /** Sine wave amplitude range */\r\n sineWaveAmplitude?: number;\r\n /** Unit of measurement */\r\n unitOfMeasurement?: UnitOfMeasurement;\r\n /** Enable camera clamping to restrict camera movement */\r\n enableCameraClamping?: boolean;\r\n /** Maximum camera radius */\r\n maxCameraRadius?: number;\r\n /** Minimum camera radius */\r\n minCameraRadius?: number;\r\n /** Camera preset positions */\r\n cameraPresets?: CameraPreset[];\r\n /** Use cylinder point markers instead of columns */\r\n useCylinderMarkers?: boolean;\r\n /** Callback when stats change */\r\n onStatsChange?: (stats: Column3DChartStats) => void;\r\n}\r\n\r\n/** Default camera presets */\r\nexport const DEFAULT_CAMERA_PRESETS: CameraPreset[] = [\r\n {\r\n // Top view\r\n position: { x: -0.01, y: 532.47, z: 0.82 },\r\n target: { x: 0.0, y: 50.0, z: 0.0 },\r\n },\r\n {\r\n // Angle view\r\n position: { x: -2.38, y: 99.55, z: 479.91 },\r\n target: { x: 0.0, y: 50.0, z: 0.0 },\r\n },\r\n];\r\n\r\n/** Unit of measurement labels */\r\nexport const UOM_LABELS: Record<number | string, string> = {\r\n 1: \"mVp\",\r\n 2: \"mVrms\",\r\n 3: \"dBm\",\r\n 4: \"dB\",\r\n \"mVp\": \"mVp\",\r\n \"mVrms\": \"mVrms\",\r\n \"dBm\": \"dBm\",\r\n \"dB\": \"dB\",\r\n};\r\n\r\n/** Convert mVrms to dBm */\r\nexport function mVrmsToDbm(mVrms: number): number {\r\n if (mVrms <= 0) return -100;\r\n return 10 * Math.log10((mVrms * mVrms) / 50) + 30;\r\n}\r\n\r\n/** Convert mVp to dB */\r\nexport function mVpToDb(mVp: number): number {\r\n if (mVp <= 0) return -100;\r\n return 20 * Math.log10(mVp);\r\n}\r\n\r\n/** Custom label provider for integer labels */\r\nclass IntegerLabelProvider extends NumericLabelProvider {\r\n override get formatLabel(): (value: number) => string {\r\n return (value: number) => `${Math.round(value)}`;\r\n }\r\n}\r\n\r\n/**\r\n * 3D Column/Bar Chart implementation using SciChart\r\n */\r\nexport class Column3DChart {\r\n public readonly id: string;\r\n private container: HTMLElement | null = null;\r\n private surface: SciChart3DSurface | null = null;\r\n private wasmContext: any = null;\r\n private config: Column3DChartConfig;\r\n private dataSeries: XyzDataSeries3D | null = null;\r\n private columnSeries: ColumnRenderableSeries3D | null = null;\r\n private sineSeries: PointLineRenderableSeries3D | null = null;\r\n private isDestroyed: boolean = false;\r\n private stats: Column3DChartStats = { pulseCount: 0, peakValue: 0 };\r\n private cameraClampingEnabled: boolean = false;\r\n private initialCameraPosition: { x: number; y: number; z: number } = { x: -250, y: 450, z: 280 };\r\n private initialCameraTarget: { x: number; y: number; z: number } = { x: 0, y: 0, z: 0 };\r\n\r\n constructor(config: Column3DChartConfig) {\r\n this.id = config.id ?? generateId(\"column3d\");\r\n this.config = config;\r\n // Camera clamping enabled by default (like original RealTime3DGraph)\r\n this.cameraClampingEnabled = config.enableCameraClamping ?? true;\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Ensure container has a unique ID for SciChart\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n\r\n // Configure SciChart 3D WASM\r\n ensureSciChart3DConfigured();\r\n\r\n // Create the 3D surface\r\n await this.createSurface();\r\n }\r\n\r\n /**\r\n * Create the SciChart 3D surface\r\n */\r\n private async createSurface(): Promise<void> {\r\n if (this.isDestroyed || !this.container) {\r\n return;\r\n }\r\n \r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n \r\n if (!document.body.contains(this.container)) {\r\n return;\r\n }\r\n\r\n let sciChart3DSurface;\r\n let wasmContext;\r\n \r\n try {\r\n // Create a customized light theme with dark black labels\r\n const customLightTheme = {\r\n ...new SciChartJSLightTheme(),\r\n // Label and title colors - make them pure black\r\n tickTextBrush: \"#000000\",\r\n axisTitleColor: \"#000000\",\r\n labelForegroundBrush: \"#000000\",\r\n labelBackgroundBrush: \"transparent\",\r\n // 3D specific properties\r\n axis3DBandsFill: \"#e5e5e5\",\r\n axisTitleTextColor: \"#000000\",\r\n majorGridLineBrush: \"#7e7e7e\",\r\n minorGridLineBrush: \"#aaaaaa\",\r\n textAnnotationForeground: \"#000000\",\r\n axisBorder: \"#000000\",\r\n // Additional label properties\r\n labelBorderBrush: \"#000000\",\r\n cursorLabelForegroundBrush: \"#000000\",\r\n };\r\n\r\n const result = await SciChart3DSurface.create(\r\n this.container.id,\r\n {\r\n theme: customLightTheme,\r\n isZYPlaneVisible: false,\r\n }\r\n );\r\n sciChart3DSurface = result.sciChart3DSurface;\r\n wasmContext = result.wasmContext;\r\n } catch (e) {\r\n console.warn(\"Column3DChart: Failed to create surface\", e);\r\n return;\r\n }\r\n \r\n if (this.isDestroyed || !this.container) {\r\n try {\r\n sciChart3DSurface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n return;\r\n }\r\n\r\n this.surface = sciChart3DSurface;\r\n this.wasmContext = wasmContext;\r\n\r\n\r\n // Set up camera (default matches original ThreeDGraph.jsx)\r\n const cameraPos = this.config.cameraPosition ?? { x: -250, y: 450, z: 280 };\r\n const cameraTarget = this.config.cameraTarget ?? { x: 0, y: 0, z: 0 };\r\n sciChart3DSurface.camera = new CameraController(wasmContext, {\r\n position: new Vector3(cameraPos.x, cameraPos.y, cameraPos.z),\r\n target: new Vector3(cameraTarget.x, cameraTarget.y, cameraTarget.z),\r\n });\r\n \r\n // Store initial camera settings for reset\r\n this.initialCameraPosition = cameraPos;\r\n this.initialCameraTarget = cameraTarget;\r\n\r\n // Add camera clamping if enabled\r\n if (this.cameraClampingEnabled) {\r\n this.setupCameraClamping();\r\n }\r\n\r\n // Add interactivity\r\n sciChart3DSurface.chartModifiers.add(\r\n new OrbitModifier3D(),\r\n new MouseWheelZoomModifier3D(),\r\n new ResetCamera3DModifier()\r\n );\r\n\r\n // Create axes\r\n this.setupAxes();\r\n\r\n // Add column data\r\n this.addColumnData(this.config.data);\r\n\r\n // Add sine wave reference if enabled\r\n if (this.config.showSineWave !== false) {\r\n this.addSineWave();\r\n }\r\n\r\n // Add tooltip\r\n this.addTooltip();\r\n }\r\n\r\n /**\r\n * Setup camera clamping to restrict camera movement\r\n * Matches the original ThreeDGraph.jsx behavior\r\n */\r\n private setupCameraClamping(): void {\r\n if (!this.surface) return;\r\n\r\n const maxCameraRadius = this.config.maxCameraRadius ?? 805;\r\n const minCameraRadius = this.config.minCameraRadius ?? 575;\r\n \r\n // Use closure variable for clamping flag\r\n let isClamping = false;\r\n\r\n this.surface.camera.propertyChanged.subscribe(() => {\r\n if (isClamping) return;\r\n isClamping = true;\r\n\r\n try {\r\n if (!this.surface) return;\r\n \r\n let yaw = this.surface.camera.orbitalYaw;\r\n let pitch = this.surface.camera.orbitalPitch;\r\n let cameraRadius = this.surface.camera.radius;\r\n\r\n // Clamp yaw - snap to boundaries (original behavior)\r\n if (Math.floor(yaw) > 100) {\r\n yaw = -180;\r\n } else if (Math.floor(yaw) >= 0) {\r\n yaw = 0;\r\n }\r\n\r\n // Clamp pitch\r\n if (pitch <= 0) {\r\n pitch = 0;\r\n } else if (pitch >= 89) {\r\n pitch = 88;\r\n }\r\n\r\n // Clamp radius\r\n if (cameraRadius >= maxCameraRadius) {\r\n cameraRadius = maxCameraRadius;\r\n } else if (cameraRadius <= minCameraRadius) {\r\n cameraRadius = minCameraRadius;\r\n }\r\n\r\n // Apply clamped values\r\n if (yaw !== this.surface.camera.orbitalYaw) {\r\n this.surface.camera.orbitalYaw = yaw;\r\n }\r\n if (pitch !== this.surface.camera.orbitalPitch) {\r\n this.surface.camera.orbitalPitch = pitch;\r\n }\r\n if (cameraRadius !== this.surface.camera.radius) {\r\n this.surface.camera.radius = cameraRadius;\r\n }\r\n } finally {\r\n // Use setTimeout to ensure flag is reset after any synchronous events\r\n setTimeout(() => {\r\n isClamping = false;\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Setup axes with proper configuration\r\n */\r\n private setupAxes(): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n const xRange = this.config.xRange ?? { min: 0, max: 360 };\r\n const yRange = this.config.yRange ?? { min: 0, max: 5000 };\r\n const zRange = this.config.zRange ?? { min: 0, max: 50 };\r\n\r\n const uom = this.config.unitOfMeasurement;\r\n const yAxisTitle = this.config.yAxisTitle ?? \r\n (uom ? `Amplitude (${UOM_LABELS[uom] || uom})` : \"Amplitude (mVp)\");\r\n\r\n this.surface.xAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: this.config.xAxisTitle ?? \"Phase Angle (°)\",\r\n autoTicks: false,\r\n visibleRange: new NumberRange(xRange.min, xRange.max),\r\n majorDelta: 45,\r\n minorDelta: 15,\r\n labelProvider: new IntegerLabelProvider(),\r\n drawMinorGridLines: false,\r\n majorGridLineStyle: { color: \"#7e7e7e\" },\r\n flippedCoordinates: true,\r\n axisBandsFill: \"#d2d2d2\",\r\n planeBorderThickness: 3,\r\n axisTitleStyle: { color: \"#000000\" },\r\n labelStyle: { color: \"#000000\" },\r\n });\r\n\r\n this.surface.yAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: yAxisTitle,\r\n visibleRange: new NumberRange(yRange.min, yRange.max),\r\n labelProvider: new IntegerLabelProvider(),\r\n drawMinorGridLines: false,\r\n majorGridLineStyle: { color: \"#7e7e7e\" },\r\n axisBandsFill: \"#b1b1b1\",\r\n axisTitleStyle: { color: \"#000000\" },\r\n labelStyle: { color: \"#000000\" },\r\n });\r\n\r\n this.surface.zAxis = new NumericAxis3D(wasmContext, {\r\n axisTitle: this.config.zAxisTitle ?? \"Cycle\",\r\n majorDelta: 10,\r\n minorDelta: 5,\r\n visibleRange: new NumberRange(zRange.min, zRange.max),\r\n drawMinorGridLines: false,\r\n majorGridLineStyle: { color: \"#7e7e7e\" },\r\n axisBandsFill: \"#d0d0d0\",\r\n planeBorderThickness: 3,\r\n labelPrecision: 0,\r\n axisTitleStyle: { color: \"#000000\" },\r\n labelStyle: { color: \"#000000\" },\r\n });\r\n\r\n // Set Y-axis label alignment to auto-rotate (like original ThreeDGraph.jsx)\r\n if (wasmContext.eSCRTTextAlignement) {\r\n this.surface.yAxis.labelStyle.alignment = \r\n wasmContext.eSCRTTextAlignement.SCRT_TEXT_ALIGNEMENT_SCREEN_AUTOROTATED;\r\n }\r\n\r\n // Force black color for axis titles and labels after creation\r\n this.surface.xAxis.axisTitleStyle.color = \"#000000\";\r\n this.surface.xAxis.labelStyle.color = \"#000000\";\r\n this.surface.yAxis.axisTitleStyle.color = \"#000000\";\r\n this.surface.yAxis.labelStyle.color = \"#000000\";\r\n this.surface.zAxis.axisTitleStyle.color = \"#000000\";\r\n this.surface.zAxis.labelStyle.color = \"#000000\";\r\n }\r\n\r\n /**\r\n * Add column data to the chart\r\n */\r\n private addColumnData(data: Column3DDataPoint[]): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n\r\n // Convert values based on unit of measurement\r\n const uom = this.config.unitOfMeasurement;\r\n const convertedData = data.map(([x, y, z]) => {\r\n let convertedY = Math.abs(y);\r\n if (uom === 3 || uom === \"dBm\") {\r\n convertedY = mVrmsToDbm(convertedY);\r\n } else if (uom === 4 || uom === \"dB\") {\r\n convertedY = mVpToDb(convertedY);\r\n }\r\n return [x, convertedY, z] as Column3DDataPoint;\r\n });\r\n\r\n // Calculate stats\r\n let pulseCount = 0;\r\n let peakValue = 0;\r\n convertedData.forEach(([, y]) => {\r\n pulseCount++;\r\n if (y > peakValue) peakValue = y;\r\n });\r\n this.stats = { pulseCount, peakValue: parseFloat(peakValue.toFixed(2)) };\r\n this.config.onStatsChange?.(this.stats);\r\n\r\n // Create XYZ data series\r\n this.dataSeries = new XyzDataSeries3D(wasmContext);\r\n \r\n convertedData.forEach(([x, y, z]) => {\r\n this.dataSeries!.append(x, y, z);\r\n });\r\n\r\n // Create column series\r\n if (this.config.useCylinderMarkers) {\r\n this.columnSeries = new ColumnRenderableSeries3D(wasmContext, {\r\n dataSeries: this.dataSeries,\r\n pointMarker: new CylinderPointMarker3D(wasmContext, { \r\n fill: this.config.barFill ?? \"#52aaf2\" \r\n }),\r\n fill: this.config.barFill ?? \"#52aaf2\",\r\n stroke: this.config.barStroke ?? \"#52aaf2\",\r\n dataPointWidthX: this.config.barWidthX ?? 4,\r\n dataPointWidthZ: this.config.barWidthZ ?? 4,\r\n });\r\n } else {\r\n this.columnSeries = new ColumnRenderableSeries3D(wasmContext, {\r\n dataSeries: this.dataSeries,\r\n fill: this.config.barFill ?? \"#52aaf2\",\r\n stroke: this.config.barStroke ?? \"#52aaf2\",\r\n opacity: this.config.barOpacity ?? 0.95,\r\n dataPointWidthX: this.config.barWidthX ?? 8,\r\n dataPointWidthZ: this.config.barWidthZ ?? 8,\r\n });\r\n }\r\n\r\n this.surface!.renderableSeries.add(this.columnSeries);\r\n }\r\n\r\n /**\r\n * Add sine wave reference line on back plane\r\n */\r\n private addSineWave(): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const wasmContext = this.wasmContext;\r\n const sineData = new XyzDataSeries3D(wasmContext);\r\n const backPlaneZ = 0;\r\n \r\n const uom = this.config.unitOfMeasurement;\r\n const isDbScale = uom === 3 || uom === 4 || uom === \"dBm\" || uom === \"dB\";\r\n \r\n const center = this.config.sineWaveCenter ?? (isDbScale ? 40 : 2000);\r\n const amplitude = this.config.sineWaveAmplitude ?? center;\r\n\r\n for (let deg = 0; deg <= 360; deg += 5) {\r\n const rad = (deg * Math.PI) / 180;\r\n const y = center + amplitude * Math.sin(rad);\r\n sineData.append(deg, y, backPlaneZ);\r\n }\r\n\r\n this.sineSeries = new PointLineRenderableSeries3D(wasmContext, {\r\n dataSeries: sineData,\r\n stroke: \"black\",\r\n strokeThickness: 3,\r\n opacity: 1.0,\r\n });\r\n\r\n this.surface!.renderableSeries.add(this.sineSeries);\r\n }\r\n\r\n /**\r\n * Add tooltip modifier\r\n */\r\n private addTooltip(): void {\r\n if (!this.surface) return;\r\n\r\n const xTitle = this.config.xAxisTitle ?? \"Phase Angle\";\r\n const yTitle = this.config.yAxisTitle ?? \"Amplitude\";\r\n const zTitle = this.config.zAxisTitle ?? \"Cycle\";\r\n const uom = this.config.unitOfMeasurement;\r\n const unit = uom ? (UOM_LABELS[uom] || uom) : \"mVp\";\r\n\r\n const tooltipModifier = new TooltipModifier3D({\r\n tooltipDataTemplate: (seriesInfo: any) => {\r\n const valuesWithLabels: string[] = [];\r\n if (seriesInfo && seriesInfo.isHit) {\r\n valuesWithLabels.push(`${xTitle}: ${seriesInfo.xValue}°`);\r\n valuesWithLabels.push(`${yTitle}: ${seriesInfo.yValue} ${unit}`);\r\n valuesWithLabels.push(`${zTitle}: ${seriesInfo.zValue}`);\r\n }\r\n return valuesWithLabels;\r\n },\r\n });\r\n\r\n this.surface!.chartModifiers.add(tooltipModifier);\r\n }\r\n\r\n /**\r\n * Set new data for the chart\r\n */\r\n public setData(data: Column3DDataPoint[]): void {\r\n if (!this.dataSeries || !this.surface || !this.wasmContext) {\r\n this.config.data = data;\r\n return;\r\n }\r\n\r\n // Convert values based on unit of measurement\r\n const uom = this.config.unitOfMeasurement;\r\n const convertedData = data.map(([x, y, z]) => {\r\n let convertedY = Math.abs(y);\r\n if (uom === 3 || uom === \"dBm\") {\r\n convertedY = mVrmsToDbm(convertedY);\r\n } else if (uom === 4 || uom === \"dB\") {\r\n convertedY = mVpToDb(convertedY);\r\n }\r\n return [x, convertedY, z] as Column3DDataPoint;\r\n });\r\n\r\n // Calculate stats\r\n let pulseCount = 0;\r\n let peakValue = 0;\r\n convertedData.forEach(([, y]) => {\r\n pulseCount++;\r\n if (y > peakValue) peakValue = y;\r\n });\r\n this.stats = { pulseCount, peakValue: parseFloat(peakValue.toFixed(2)) };\r\n this.config.onStatsChange?.(this.stats);\r\n\r\n // Clear and update data\r\n this.dataSeries.clear();\r\n convertedData.forEach(([x, y, z]) => {\r\n this.dataSeries!.append(x, y, z);\r\n });\r\n\r\n if (this.surface) {\r\n this.surface.invalidateElement();\r\n }\r\n }\r\n\r\n /**\r\n * Update camera position\r\n */\r\n public setCameraPosition(\r\n position: { x: number; y: number; z: number },\r\n target?: { x: number; y: number; z: number }\r\n ): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n this.surface.camera.position = new Vector3(position.x, position.y, position.z);\r\n if (target) {\r\n this.surface.camera.target = new Vector3(target.x, target.y, target.z);\r\n }\r\n this.surface.invalidateElement();\r\n }\r\n\r\n /**\r\n * Set camera to a preset position\r\n */\r\n public setCameraPreset(presetIndex: number): void {\r\n const presets = this.config.cameraPresets ?? DEFAULT_CAMERA_PRESETS;\r\n if (presetIndex >= 0 && presetIndex < presets.length) {\r\n const preset = presets[presetIndex];\r\n this.setCameraPosition(preset.position, preset.target);\r\n }\r\n }\r\n\r\n /**\r\n * Reset camera to initial position\r\n */\r\n public resetCamera(): void {\r\n this.setCameraPosition(this.initialCameraPosition, this.initialCameraTarget);\r\n }\r\n\r\n /**\r\n * Update Y axis range\r\n */\r\n public setYAxisRange(min: number, max: number): void {\r\n if (!this.surface) return;\r\n this.surface.yAxis.visibleRange = new NumberRange(min, max);\r\n }\r\n\r\n /**\r\n * Update Z axis range (cycle range)\r\n */\r\n public setZAxisRange(min: number, max: number): void {\r\n if (!this.surface) return;\r\n this.surface.zAxis.visibleRange = new NumberRange(min, max);\r\n }\r\n\r\n /**\r\n * Get current statistics\r\n */\r\n public getStats(): Column3DChartStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Update chart options\r\n */\r\n public setOptions(options: Partial<Column3DChartConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n\r\n if (options.cameraPosition && this.surface && this.wasmContext) {\r\n const pos = options.cameraPosition;\r\n const target = options.cameraTarget ?? this.config.cameraTarget ?? { x: 0, y: 50, z: 0 };\r\n this.setCameraPosition(pos, target);\r\n }\r\n\r\n if (options.barFill || options.barStroke || options.barOpacity) {\r\n if (this.columnSeries) {\r\n if (options.barFill) this.columnSeries.fill = options.barFill;\r\n if (options.barStroke) this.columnSeries.stroke = options.barStroke;\r\n if (options.barOpacity !== undefined) this.columnSeries.opacity = options.barOpacity;\r\n }\r\n }\r\n\r\n if (options.yRange && this.surface) {\r\n this.surface.yAxis.visibleRange = new NumberRange(options.yRange.min, options.yRange.max);\r\n }\r\n\r\n if (options.zRange && this.surface) {\r\n this.surface.zAxis.visibleRange = new NumberRange(options.zRange.min, options.zRange.max);\r\n }\r\n }\r\n\r\n /**\r\n * Get the SciChart surface for advanced operations\r\n */\r\n public getSurface(): SciChart3DSurface | null {\r\n return this.surface;\r\n }\r\n\r\n /**\r\n * Destroy and clean up\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n \r\n this.isDestroyed = true;\r\n\r\n if (this.surface) {\r\n try {\r\n this.surface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.surface = null;\r\n }\r\n \r\n this.container = null;\r\n this.wasmContext = null;\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): Column3DChartConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Check if chart is ready\r\n */\r\n public isReady(): boolean {\r\n return this.surface !== null && !this.isDestroyed;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a 3D column chart\r\n */\r\nexport async function createColumn3DChart(\r\n container: HTMLElement | string,\r\n config: Column3DChartConfig\r\n): Promise<Column3DChart> {\r\n const chart = new Column3DChart(config);\r\n await chart.init(container);\r\n return chart;\r\n}\r\n","import {\r\n SciChartSurface,\r\n NumericAxis,\r\n UniformHeatmapDataSeries,\r\n UniformHeatmapRenderableSeries,\r\n HeatmapColorMap,\r\n HeatmapLegend,\r\n NumberRange,\r\n ZoomExtentsModifier,\r\n RubberBandXyZoomModifier,\r\n EAutoRange,\r\n EAxisAlignment,\r\n ENumericFormat,\r\n CursorModifier,\r\n FastLineRenderableSeries,\r\n XyDataSeries,\r\n} from \"scichart\";\r\nimport { SciChartJSLightTheme } from \"scichart/Charting/Themes/SciChartJSLightTheme\";\r\nimport type {\r\n PRPDChartConfig,\r\n PRPDDataPoint,\r\n PRPDResolutionLabel,\r\n PRPDWindowingRegion,\r\n PRPDChartStats,\r\n} from \"../types\";\r\nimport { generateId } from \"../utils/helpers\";\r\n\r\n// SciChart CDN configuration - auto-configures WASM loading from CDN\r\nconst SCICHART_VERSION = \"4.0.933\";\r\nlet sciChartConfigured = false;\r\n\r\nconst configureSciChartCDN = () => {\r\n if (sciChartConfigured) return;\r\n try {\r\n const cdnBase = `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm`;\r\n SciChartSurface.configure({\r\n wasmUrl: `${cdnBase}/scichart2d.wasm`,\r\n dataUrl: `${cdnBase}/scichart2d.data`,\r\n } as any);\r\n sciChartConfigured = true;\r\n } catch (e) {\r\n console.warn(\"Failed to configure SciChart CDN:\", e);\r\n }\r\n};\r\n\r\n// ============================================\r\n// Constants\r\n// ============================================\r\n\r\nconst HORIZONTAL_RESOLUTION = 360;\r\nconst VERTICAL_SCALE_MAX_DEFAULT = 5000;\r\nconst HORIZONTAL_RESOLUTION_MULTIPLIER = 1;\r\n\r\n// Resolution configurations\r\nconst RESOLUTION_CONFIG = {\r\n UNI: {\r\n HI: { VERTICAL_RESOLUTION: 256, VERTICAL_OFFSET: 0, MIN_PEAK_ZERO: true },\r\n LO: { VERTICAL_RESOLUTION: 100, VERTICAL_OFFSET: 0, MIN_PEAK_ZERO: true },\r\n },\r\n BI: {\r\n HI: { VERTICAL_RESOLUTION: 512, VERTICAL_OFFSET: 256, MIN_PEAK_ZERO: false },\r\n LO: { VERTICAL_RESOLUTION: 200, VERTICAL_OFFSET: 100, MIN_PEAK_ZERO: false },\r\n },\r\n};\r\n\r\n// Default PRPD color map (jet-like colormap matching reference implementation)\r\n// Uses \"Transparent\" for cells at minimum value so grid shows through empty areas\r\nconst defaultPRPDColorStops = [\r\n { offset: 0, color: 'transparent' },\r\n { offset: 0.005, color: 'transparent' },\r\n { offset: 0.009, color: 'transparent' },\r\n { offset: 0.01, color: 'CornflowerBlue' },\r\n { offset: 0.4, color: 'DarkGreen' },\r\n { offset: 0.6, color: 'Chartreuse' },\r\n { offset: 0.8, color: 'Yellow' },\r\n { offset: 1, color: 'Red' },\r\n];\r\n\r\n// PRPD Theme: grey/light-grey alternating bands (matching reference)\r\nconst createPRPDTheme = () => {\r\n const theme = new SciChartJSLightTheme();\r\n theme.sciChartBackground = \"#f9f9f9\";\r\n theme.gridBackgroundBrush = \"grey\";\r\n theme.axisBandsFill = \"#dcdcdc\";\r\n theme.majorGridLineBrush = \"#888888\";\r\n theme.minorGridLineBrush = \"transparent\";\r\n return theme;\r\n};\r\n\r\n// Legend Theme: white background for heatmap color legend\r\nconst createLegendTheme = () => {\r\n const theme = new SciChartJSLightTheme();\r\n theme.sciChartBackground = \"#ffffff\";\r\n theme.gridBackgroundBrush = \"#ffffff\";\r\n theme.axisBandsFill = \"#ffffff\";\r\n theme.majorGridLineBrush = \"transparent\";\r\n theme.minorGridLineBrush = \"transparent\";\r\n return theme;\r\n};\r\n\r\n\r\n// ============================================\r\n// Helper Functions\r\n// ============================================\r\n\r\nfunction getResolutionConfig(\r\n uniBiLabel: string,\r\n hiLoLabel: string,\r\n maxPeak: number,\r\n minPeak: number,\r\n isLowResolution: boolean\r\n) {\r\n const cfg = isLowResolution\r\n ? RESOLUTION_CONFIG.UNI.HI\r\n : (RESOLUTION_CONFIG?.[uniBiLabel as keyof typeof RESOLUTION_CONFIG]?.[\r\n hiLoLabel as keyof typeof RESOLUTION_CONFIG.UNI\r\n ] ?? RESOLUTION_CONFIG.BI.HI);\r\n\r\n const newMinPeak = cfg.MIN_PEAK_ZERO ? 0 : (minPeak ?? -5000);\r\n const newMaxPeak = maxPeak ?? 5000;\r\n\r\n return {\r\n verticalResolution: cfg.VERTICAL_RESOLUTION,\r\n verticalOffset: cfg.VERTICAL_OFFSET,\r\n newMinPeak,\r\n newMaxPeak,\r\n isUnipolar: uniBiLabel === \"UNI\" || isLowResolution,\r\n };\r\n}\r\n\r\nfunction getPhaseColumnIndex(phaseAngle: number, maxPhaseAngle: number): number {\r\n const maxPhase = maxPhaseAngle || 360;\r\n if (maxPhase <= 0) return 0;\r\n\r\n const clampedPhase = Math.min(Math.max(phaseAngle, 0), maxPhase);\r\n const ratio = clampedPhase / maxPhase;\r\n\r\n return Math.min(HORIZONTAL_RESOLUTION - 1, Math.floor(ratio * (HORIZONTAL_RESOLUTION - 1)));\r\n}\r\n\r\nfunction generateSineWaveData(\r\n startX: number,\r\n endX: number,\r\n amplitude: number,\r\n frequency: number = 1,\r\n phaseShift: number = 0,\r\n step: number = 1,\r\n offset: number = 0\r\n): Array<[number, number]> {\r\n const data: Array<[number, number]> = [];\r\n for (let x = startX; x <= endX; x += step) {\r\n const rad = ((x - phaseShift) * Math.PI * frequency) / 180;\r\n const y = offset + amplitude * Math.sin(rad);\r\n data.push([x, y]);\r\n }\r\n return data;\r\n}\r\n\r\ninterface BuildZValuesResult {\r\n zValues: number[][];\r\n multiplier: number;\r\n maxValue: number;\r\n totalCount: number;\r\n verticalResolution: number;\r\n isUnipolar: boolean;\r\n newMinPeak: number;\r\n}\r\n\r\nfunction buildZValues(\r\n data: PRPDDataPoint[],\r\n scalingFactor: number,\r\n minPeak: number,\r\n maxPhaseAngle: number,\r\n verticalScaleMax: number,\r\n uniBiLabel: string,\r\n hiLoLabel: string,\r\n windowingData: PRPDWindowingRegion[] = [],\r\n isLowResolution: boolean\r\n): BuildZValuesResult {\r\n const { verticalResolution, verticalOffset, newMinPeak, newMaxPeak, isUnipolar } =\r\n getResolutionConfig(uniBiLabel, hiLoLabel, verticalScaleMax, minPeak, isLowResolution);\r\n\r\n const zValues = Array.from({ length: verticalResolution }, () =>\r\n new Array(HORIZONTAL_RESOLUTION).fill(0)\r\n );\r\n\r\n const vResolution = newMinPeak === 0 ? verticalResolution : verticalResolution / 2;\r\n const multiplier = (newMaxPeak * scalingFactor) / vResolution;\r\n\r\n let maxValue = 0;\r\n let totalCount = 0;\r\n\r\n const isInsideWindow = (phaseDeg: number, ampVal: number): boolean => {\r\n if (!windowingData?.length) return false;\r\n\r\n return windowingData.some(\r\n (w) =>\r\n phaseDeg >= w.minPhase &&\r\n phaseDeg <= w.maxPhase &&\r\n ampVal >= w.minAmp &&\r\n ampVal <= w.maxAmp\r\n );\r\n };\r\n\r\n data?.forEach(([phase_angle, amplitude, count]) => {\r\n const colIndex = getPhaseColumnIndex(phase_angle, maxPhaseAngle);\r\n\r\n const scaledAmp = Math.floor(\r\n (isUnipolar ? Math.abs(amplitude) : amplitude) * scalingFactor\r\n );\r\n\r\n // Skip counts in windowing region\r\n if (isInsideWindow(phase_angle, scaledAmp)) {\r\n return;\r\n }\r\n\r\n let rowIndex = Math.floor(scaledAmp / multiplier + verticalOffset);\r\n rowIndex = Math.max(0, Math.min(verticalResolution - 1, rowIndex));\r\n\r\n zValues[rowIndex][colIndex] += count;\r\n\r\n if (Math.abs(scaledAmp) > Math.abs(maxValue)) maxValue = scaledAmp;\r\n totalCount += count;\r\n });\r\n\r\n return {\r\n zValues,\r\n multiplier,\r\n maxValue,\r\n totalCount,\r\n verticalResolution,\r\n isUnipolar,\r\n newMinPeak,\r\n };\r\n}\r\n\r\n// ============================================\r\n// PRPDChart Class\r\n// ============================================\r\n\r\n/**\r\n * PRPD (Phase Resolved Partial Discharge) Chart implementation using SciChart\r\n * \r\n * This chart displays partial discharge data as a heatmap with:\r\n * - X-axis: Phase angle (0-360°)\r\n * - Y-axis: Amplitude (mVp or other unit)\r\n * - Color intensity: Pulse count at each phase/amplitude bin\r\n * - Optional sine wave overlay\r\n * - Resolution modes (UNI/BI, HI/LO)\r\n * - Windowing support for filtering regions\r\n */\r\nexport class PRPDChart {\r\n public readonly id: string;\r\n private container: HTMLElement | null = null; // Root container (may contain sub-divs)\r\n private chartHost: HTMLDivElement | null = null; // Div where SciChartSurface is mounted\r\n private surface: SciChartSurface | null = null;\r\n private wasmContext: any = null;\r\n private config: PRPDChartConfig;\r\n private isDestroyed: boolean = false;\r\n\r\n // Chart components\r\n private heatmapDataSeries: UniformHeatmapDataSeries | null = null;\r\n private heatmapSeries: UniformHeatmapRenderableSeries | null = null;\r\n private heatmapColorMap: HeatmapColorMap | null = null;\r\n private heatmapLegend: HeatmapLegend | null = null;\r\n private heatmapLegendDiv: HTMLDivElement | null = null;\r\n private sineDataSeries: XyDataSeries | null = null;\r\n private sineLineSeries: FastLineRenderableSeries | null = null;\r\n private xAxis: NumericAxis | null = null;\r\n private yAxis: NumericAxis | null = null;\r\n\r\n // Statistics\r\n private stats: PRPDChartStats = { peakValue: 0, totalCount: 0 };\r\n\r\n // Callbacks\r\n private onStatsChange?: (stats: PRPDChartStats) => void;\r\n\r\n constructor(config: PRPDChartConfig) {\r\n this.id = config.id ?? generateId(\"prpd\");\r\n this.config = {\r\n scalingFactor: 1,\r\n unitOfMeasurement: \"mVp\",\r\n maxPeak: 5000,\r\n minPeak: -5000,\r\n maxPhaseAngle: 360,\r\n resolutionLabel: { UniBi: \"BI\", HiLo: \"HI\" },\r\n windowingData: [],\r\n yAxisRange: 5000,\r\n isLowResolution: false,\r\n showColorPalette: true,\r\n showSineWave: true,\r\n colorMin: 0,\r\n colorMax: 100,\r\n ...config,\r\n };\r\n }\r\n\r\n /**\r\n * Initialize the chart in the given container\r\n */\r\n public async init(container: HTMLElement | string): Promise<void> {\r\n if (this.isDestroyed) {\r\n throw new Error(\"Cannot initialize a destroyed chart\");\r\n }\r\n\r\n // Resolve container (root element)\r\n if (typeof container === \"string\") {\r\n const el = document.getElementById(container);\r\n if (!el) {\r\n throw new Error(`Container element \"${container}\" not found`);\r\n }\r\n this.container = el;\r\n } else {\r\n this.container = container;\r\n }\r\n\r\n // Ensure root container has a unique ID for SciChart\r\n if (!this.container.id) {\r\n this.container.id = this.id;\r\n }\r\n\r\n // Determine chart host:\r\n // - If the root contains a \".chart-graph\" div, use that (Angular layout)\r\n // - Otherwise, mount directly into the root container\r\n const chartGraph = this.container.querySelector(\".chart-graph\") as HTMLDivElement | null;\r\n this.chartHost = chartGraph ?? (this.container as HTMLDivElement);\r\n\r\n // SciChart requires the host element to have an ID for canvas naming\r\n if (!this.chartHost.id) {\r\n this.chartHost.id = `${this.id}_host`;\r\n }\r\n\r\n // Create the SciChart surface\r\n await this.createSurface();\r\n }\r\n\r\n /**\r\n * Create the SciChart surface\r\n */\r\n private async createSurface(): Promise<void> {\r\n // Check if already destroyed or container missing\r\n if (this.isDestroyed || !this.container || !this.chartHost) {\r\n return;\r\n }\r\n\r\n // Check if container is still in DOM\r\n if (!document.body.contains(this.container)) {\r\n return;\r\n }\r\n\r\n // Configure SciChart to load WASM from CDN\r\n configureSciChartCDN();\r\n\r\n const theme = createPRPDTheme();\r\n\r\n let sciChartSurface;\r\n let wasmContext;\r\n \r\n try {\r\n const result = await SciChartSurface.create(\r\n this.chartHost,\r\n { theme }\r\n );\r\n sciChartSurface = result.sciChartSurface;\r\n wasmContext = result.wasmContext;\r\n } catch (e) {\r\n // SciChart initialization failed - container may have been removed\r\n console.warn(\"PRPDChart: Failed to create surface\", e);\r\n return;\r\n }\r\n \r\n // Check if destroyed during async operation\r\n if (this.isDestroyed || !this.container) {\r\n try {\r\n sciChartSurface.delete();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n return;\r\n }\r\n\r\n this.surface = sciChartSurface;\r\n this.wasmContext = wasmContext;\r\n\r\n // Build initial data\r\n const verticalScaleMax = this.config.maxPeak || VERTICAL_SCALE_MAX_DEFAULT;\r\n const { zValues, multiplier, maxValue, totalCount, verticalResolution, isUnipolar } =\r\n buildZValues(\r\n this.config.data,\r\n this.config.scalingFactor!,\r\n this.config.minPeak!,\r\n this.config.maxPhaseAngle!,\r\n verticalScaleMax,\r\n this.config.resolutionLabel?.UniBi ?? \"BI\",\r\n this.config.resolutionLabel?.HiLo ?? \"HI\",\r\n this.config.windowingData,\r\n this.config.isLowResolution!\r\n );\r\n\r\n this.stats = { peakValue: maxValue, totalCount };\r\n\r\n const yAxisRange = this.config.yAxisRange || verticalScaleMax;\r\n\r\n // Create X Axis (Phase Angle)\r\n this.xAxis = new NumericAxis(wasmContext, {\r\n autoRange: EAutoRange.Never,\r\n labelFormat: ENumericFormat.Decimal,\r\n labelPrecision: 0,\r\n labelPostfix: \"°\",\r\n minorDelta: 2,\r\n majorDelta: 45,\r\n drawMajorBands: true,\r\n autoTicks: false,\r\n axisAlignment: EAxisAlignment.Bottom,\r\n axisTitle: \"Phase Angle (°)\",\r\n axisTitleStyle: {\r\n fontSize: 14,\r\n fontWeight: \"bold\",\r\n color: \"black\",\r\n },\r\n visibleRange: new NumberRange(0, 360),\r\n visibleRangeLimit: new NumberRange(0, 360),\r\n });\r\n\r\n // Create Y Axis (Amplitude)\r\n const yRange = isUnipolar\r\n ? new NumberRange(0, yAxisRange)\r\n : new NumberRange(-yAxisRange, yAxisRange);\r\n\r\n this.yAxis = new NumericAxis(wasmContext, {\r\n autoRange: EAutoRange.Never,\r\n labelFormat: ENumericFormat.Decimal,\r\n labelPrecision: 0,\r\n drawMajorBands: true,\r\n axisAlignment: EAxisAlignment.Right,\r\n axisTitle: `Amplitude (${this.config.unitOfMeasurement})`,\r\n axisTitleStyle: {\r\n fontSize: 14,\r\n fontWeight: \"bold\",\r\n color: \"black\",\r\n rotation: 270,\r\n },\r\n visibleRange: yRange,\r\n visibleRangeLimit: yRange,\r\n });\r\n\r\n // Check if destroyed before adding axes\r\n if (this.isDestroyed) return;\r\n \r\n sciChartSurface.xAxes.add(this.xAxis);\r\n sciChartSurface.yAxes.add(this.yAxis);\r\n\r\n // Check if destroyed before creating heatmap\r\n if (this.isDestroyed) return;\r\n \r\n // Create heatmap\r\n this.createHeatmap(zValues, multiplier, verticalResolution, isUnipolar);\r\n\r\n // Create sine wave overlay\r\n if (this.config.showSineWave && !this.isDestroyed) {\r\n this.createSineWave(yAxisRange, isUnipolar);\r\n }\r\n\r\n // Check if destroyed before adding modifiers\r\n if (this.isDestroyed) return;\r\n\r\n // Add chart modifiers\r\n try {\r\n const cursorModifier = new CursorModifier();\r\n cursorModifier.axisLabelFill = \"#FFFFFF\";\r\n cursorModifier.axisLabelStroke = \"#000000\";\r\n\r\n sciChartSurface.chartModifiers.add(\r\n cursorModifier,\r\n new RubberBandXyZoomModifier(),\r\n new ZoomExtentsModifier()\r\n );\r\n } catch (e) {\r\n // Ignore modifier attachment errors - surface may be in cleanup\r\n console.warn(\"PRPDChart: Failed to add modifiers\", e);\r\n }\r\n\r\n // Check if destroyed before creating legend\r\n if (this.isDestroyed) return;\r\n \r\n // Create legend\r\n if (this.config.showColorPalette) {\r\n await this.createHeatmapLegend();\r\n }\r\n\r\n // Notify stats\r\n if (!this.isDestroyed) {\r\n this.onStatsChange?.(this.stats);\r\n }\r\n }\r\n\r\n private createHeatmap(\r\n zValues: number[][],\r\n multiplier: number,\r\n verticalResolution: number,\r\n isUnipolar: boolean\r\n ): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const colorStops = this.config.colorStops ?? defaultPRPDColorStops;\r\n\r\n this.heatmapColorMap = new HeatmapColorMap({\r\n minimum: this.config.colorMin ?? 0,\r\n maximum: this.config.colorMax ?? 100,\r\n gradientStops: colorStops,\r\n });\r\n\r\n this.heatmapDataSeries = new UniformHeatmapDataSeries(this.wasmContext, {\r\n zValues,\r\n xStart: 0,\r\n xStep: HORIZONTAL_RESOLUTION_MULTIPLIER,\r\n yStart: isUnipolar ? 0 : (-1 * verticalResolution * multiplier) / 2,\r\n yStep: multiplier,\r\n });\r\n\r\n this.heatmapSeries = new UniformHeatmapRenderableSeries(this.wasmContext, {\r\n dataSeries: this.heatmapDataSeries,\r\n colorMap: this.heatmapColorMap,\r\n });\r\n\r\n this.surface.renderableSeries.add(this.heatmapSeries);\r\n }\r\n\r\n private createSineWave(yAxisRange: number, isUnipolar: boolean): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const sineAmplitude = isUnipolar ? yAxisRange / 2 : yAxisRange;\r\n const sineOffset = isUnipolar ? yAxisRange / 2 : 0;\r\n\r\n const sineWaveData = generateSineWaveData(0, 360, sineAmplitude, 1, 0, 1, sineOffset);\r\n\r\n this.sineDataSeries = new XyDataSeries(this.wasmContext);\r\n sineWaveData.forEach(([x, y]) => this.sineDataSeries!.append(x, y));\r\n\r\n this.sineLineSeries = new FastLineRenderableSeries(this.wasmContext, {\r\n dataSeries: this.sineDataSeries,\r\n stroke: \"Black\",\r\n strokeThickness: 3,\r\n });\r\n\r\n this.surface.renderableSeries.add(this.sineLineSeries);\r\n }\r\n\r\n private async createHeatmapLegend(): Promise<void> {\r\n if (!this.container || !this.heatmapColorMap) return;\r\n\r\n this.clearHeatmapLegend();\r\n\r\n // If a dedicated legend host exists (e.g. Angular wrapper's \".heatmap-chart\"),\r\n // use that; otherwise create a positioned div inside the root container.\r\n let div = this.container.querySelector(\".heatmap-chart\") as HTMLDivElement | null;\r\n if (!div) {\r\n div = document.createElement(\"div\");\r\n div.className = \"heatmap-chart\";\r\n div.style.position = \"absolute\";\r\n div.style.top = \"40px\";\r\n div.style.left = \"0px\";\r\n div.style.bottom = \"40px\";\r\n div.style.width = \"65px\";\r\n div.style.pointerEvents = \"none\";\r\n this.container.appendChild(div);\r\n }\r\n // SciChart HeatmapLegend requires the host element to have an ID\r\n if (!div.id) {\r\n div.id = `${this.id}_legend`;\r\n }\r\n this.heatmapLegendDiv = div;\r\n\r\n const min = this.config.colorMin ?? 0;\r\n const max = this.config.colorMax ?? 100;\r\n\r\n const { heatmapLegend } = await HeatmapLegend.create(div, {\r\n theme: createLegendTheme(),\r\n yAxisOptions: {\r\n visibleRange: new NumberRange(min, max),\r\n majorDelta: (max - min) / 5,\r\n minorDelta: (max - min) / 10,\r\n labelFormat: ENumericFormat.Decimal,\r\n labelPrecision: 0,\r\n labelPadding: 6,\r\n axisTitleGap: 8,\r\n labelStyle: { fontSize: 12, color: \"#A0A0A0\" },\r\n majorTickLineStyle: {\r\n color: \"#A0A0A0\",\r\n tickSize: 8,\r\n strokeThickness: 1,\r\n },\r\n minorTickLineStyle: {\r\n color: \"gray\",\r\n tickSize: 5,\r\n strokeThickness: 1,\r\n },\r\n axisBorder: {\r\n borderLeft: 0,\r\n borderRight: 0,\r\n borderTop: 0,\r\n borderBottom: 0,\r\n color: \"transparent\",\r\n },\r\n } as any,\r\n colorMap: this.heatmapColorMap,\r\n });\r\n\r\n this.heatmapLegend = heatmapLegend;\r\n }\r\n\r\n private clearHeatmapLegend(): void {\r\n if (this.heatmapLegend) {\r\n try {\r\n this.heatmapLegend.delete();\r\n } catch (e) {\r\n // Ignore deletion errors\r\n }\r\n this.heatmapLegend = null;\r\n }\r\n if (this.heatmapLegendDiv) {\r\n this.heatmapLegendDiv.remove();\r\n this.heatmapLegendDiv = null;\r\n }\r\n }\r\n\r\n /**\r\n * Update chart with new data\r\n */\r\n public updateData(data: PRPDDataPoint[]): void {\r\n this.config.data = data;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Update resolution label (UNI/BI, HI/LO)\r\n */\r\n public setResolutionLabel(label: PRPDResolutionLabel): void {\r\n this.config.resolutionLabel = label;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Update windowing data\r\n */\r\n public setWindowingData(windowingData: PRPDWindowingRegion[]): void {\r\n this.config.windowingData = windowingData;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Update Y-axis range\r\n */\r\n public setYAxisRange(range: number): void {\r\n this.config.yAxisRange = range;\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Set stats change callback\r\n */\r\n public onStats(callback: (stats: PRPDChartStats) => void): void {\r\n this.onStatsChange = callback;\r\n }\r\n\r\n /**\r\n * Get current statistics\r\n */\r\n public getStats(): PRPDChartStats {\r\n return { ...this.stats };\r\n }\r\n\r\n /**\r\n * Refresh the chart with current configuration\r\n */\r\n public refresh(): void {\r\n if (!this.surface || !this.wasmContext) return;\r\n\r\n const verticalScaleMax = this.config.maxPeak || VERTICAL_SCALE_MAX_DEFAULT;\r\n const yAxisRange = this.config.yAxisRange || verticalScaleMax;\r\n\r\n const { zValues, multiplier, maxValue, totalCount, verticalResolution, isUnipolar } =\r\n buildZValues(\r\n this.config.data,\r\n this.config.scalingFactor!,\r\n this.config.minPeak!,\r\n this.config.maxPhaseAngle!,\r\n verticalScaleMax,\r\n this.config.resolutionLabel?.UniBi ?? \"BI\",\r\n this.config.resolutionLabel?.HiLo ?? \"HI\",\r\n this.config.windowingData,\r\n this.config.isLowResolution!\r\n );\r\n\r\n this.stats = { peakValue: maxValue, totalCount };\r\n\r\n // Update Y axis range\r\n if (this.yAxis) {\r\n const yRange = isUnipolar\r\n ? new NumberRange(0, yAxisRange)\r\n : new NumberRange(-yAxisRange, yAxisRange);\r\n this.yAxis.visibleRange = yRange;\r\n this.yAxis.visibleRangeLimit = yRange;\r\n }\r\n\r\n // Update heatmap data series\r\n if (this.heatmapDataSeries) {\r\n const needNewDs =\r\n this.heatmapDataSeries.arrayHeight !== verticalResolution ||\r\n this.heatmapDataSeries.arrayWidth !== HORIZONTAL_RESOLUTION;\r\n\r\n if (needNewDs) {\r\n // Need to recreate data series\r\n if (this.heatmapSeries) {\r\n this.surface.renderableSeries.remove(this.heatmapSeries);\r\n this.heatmapSeries.delete();\r\n }\r\n this.heatmapDataSeries.delete();\r\n\r\n this.heatmapDataSeries = new UniformHeatmapDataSeries(this.wasmContext, {\r\n zValues,\r\n xStart: 0,\r\n xStep: HORIZONTAL_RESOLUTION_MULTIPLIER,\r\n yStart: isUnipolar ? 0 : (-1 * verticalResolution * multiplier) / 2,\r\n yStep: multiplier,\r\n });\r\n\r\n this.heatmapSeries = new UniformHeatmapRenderableSeries(this.wasmContext, {\r\n dataSeries: this.heatmapDataSeries,\r\n colorMap: this.heatmapColorMap!,\r\n });\r\n\r\n this.surface.renderableSeries.add(this.heatmapSeries);\r\n } else {\r\n // Just update values\r\n if (typeof (this.heatmapDataSeries as any).setZValues === \"function\") {\r\n (this.heatmapDataSeries as any).setZValues(zValues);\r\n } else {\r\n (this.heatmapDataSeries as any).zValues = zValues;\r\n }\r\n this.heatmapDataSeries.yStart = isUnipolar\r\n ? 0\r\n : (-1 * verticalResolution * multiplier) / 2;\r\n this.heatmapDataSeries.yStep = multiplier;\r\n }\r\n }\r\n\r\n // Update sine wave\r\n if (this.sineDataSeries && this.config.showSineWave) {\r\n this.sineDataSeries.clear();\r\n const sineAmplitude = isUnipolar ? yAxisRange / 2 : yAxisRange;\r\n const sineOffset = isUnipolar ? yAxisRange / 2 : 0;\r\n const sineWaveData = generateSineWaveData(0, 360, sineAmplitude, 1, 0, 1, sineOffset);\r\n sineWaveData.forEach(([x, y]) => this.sineDataSeries!.append(x, y));\r\n }\r\n\r\n this.surface.invalidateElement();\r\n this.onStatsChange?.(this.stats);\r\n }\r\n\r\n /**\r\n * Set chart options\r\n */\r\n public setOptions(options: Partial<PRPDChartConfig>): void {\r\n this.config = { ...this.config, ...options };\r\n this.refresh();\r\n }\r\n\r\n /**\r\n * Reset zoom to full extent\r\n */\r\n public resetZoom(): void {\r\n if (!this.surface) return;\r\n this.surface.zoomExtents();\r\n }\r\n\r\n /**\r\n * Export chart as image\r\n */\r\n public async exportImage(format: \"png\" | \"jpeg\" = \"png\"): Promise<string> {\r\n if (!this.container) {\r\n throw new Error(\"Chart not initialized\");\r\n }\r\n\r\n const canvas = this.container.querySelector(\"canvas\");\r\n if (!canvas) {\r\n throw new Error(\"Canvas not found\");\r\n }\r\n\r\n const mimeType = format === \"jpeg\" ? \"image/jpeg\" : \"image/png\";\r\n return canvas.toDataURL(mimeType);\r\n }\r\n\r\n /**\r\n * Get current configuration\r\n */\r\n public getConfig(): PRPDChartConfig {\r\n return { ...this.config };\r\n }\r\n\r\n /**\r\n * Check if chart is ready\r\n */\r\n public isReady(): boolean {\r\n return this.surface !== null && !this.isDestroyed;\r\n }\r\n\r\n /**\r\n * Destroy and clean up\r\n */\r\n public destroy(): void {\r\n if (this.isDestroyed) return;\r\n \r\n // Mark as destroyed immediately to prevent re-entry\r\n this.isDestroyed = true;\r\n\r\n try {\r\n this.clearHeatmapLegend();\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n\r\n try {\r\n if (this.sineLineSeries && this.surface) {\r\n this.surface.renderableSeries.remove(this.sineLineSeries);\r\n this.sineLineSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.sineLineSeries = null;\r\n\r\n try {\r\n if (this.sineDataSeries) {\r\n this.sineDataSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.sineDataSeries = null;\r\n\r\n try {\r\n if (this.heatmapSeries && this.surface) {\r\n this.surface.renderableSeries.remove(this.heatmapSeries);\r\n this.heatmapSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.heatmapSeries = null;\r\n\r\n try {\r\n if (this.heatmapDataSeries) {\r\n this.heatmapDataSeries.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors\r\n }\r\n this.heatmapDataSeries = null;\r\n\r\n try {\r\n if (this.surface) {\r\n // Clear modifiers first to prevent SVG cleanup errors\r\n this.surface.chartModifiers.clear();\r\n this.surface.delete();\r\n }\r\n } catch (e) {\r\n // Ignore cleanup errors - DOM elements may already be removed\r\n }\r\n this.surface = null;\r\n }\r\n}\r\n\r\n/**\r\n * Factory function to create a PRPD chart\r\n */\r\nexport async function createPRPDChart(\r\n container: HTMLElement | string,\r\n config: PRPDChartConfig\r\n): Promise<PRPDChart> {\r\n const chart = new PRPDChart(config);\r\n await chart.init(container);\r\n return chart;\r\n}\r\n","/**\r\n * SciChart UI - A customizable charting library built on SciChart\r\n * \r\n * @packageDocumentation\r\n */\r\n\r\n// Re-export all types\r\nexport type {\r\n // Chart configurations\r\n ChartConfig,\r\n PieChartConfig,\r\n ScatterChartConfig,\r\n Surface3DChartConfig,\r\n PRPDChartConfig,\r\n AnimationConfig,\r\n TooltipConfig,\r\n TooltipData,\r\n LegendConfig,\r\n TitleConfig,\r\n \r\n // Axis configurations\r\n AxisConfig,\r\n XAxisConfig,\r\n YAxisConfig,\r\n GridLineConfig,\r\n \r\n // Data types\r\n DataPoint,\r\n SeriesData,\r\n ChartType,\r\n PRPDDataPoint,\r\n PRPDResolutionMode,\r\n PRPDResolutionQuality,\r\n PRPDResolutionLabel,\r\n PRPDWindowingRegion,\r\n PRPDChartStats,\r\n \r\n // Theme types\r\n ThemeConfig,\r\n \r\n // Event types\r\n ChartEventMap,\r\n ChartClickEvent,\r\n ChartHoverEvent,\r\n LegendClickEvent,\r\n ZoomEvent,\r\n PanEvent,\r\n RenderedEvent,\r\n \r\n // Instance types\r\n ChartInstance,\r\n} from \"./types\";\r\n\r\n// Export charts\r\nexport {\r\n BaseChart,\r\n Surface3DChart,\r\n createSurface3DChart,\r\n Column3DChart,\r\n createColumn3DChart,\r\n PRPDChart,\r\n createPRPDChart,\r\n type Column3DChartConfig,\r\n type Column3DDataPoint,\r\n type Column3DChartStats,\r\n type CameraPreset,\r\n type UnitOfMeasurement,\r\n DEFAULT_CAMERA_PRESETS,\r\n UOM_LABELS,\r\n mVrmsToDbm,\r\n mVpToDb,\r\n} from \"./charts\";\r\n\r\n// Export themes\r\nexport {\r\n lightTheme,\r\n darkTheme,\r\n modernTheme,\r\n midnightTheme,\r\n ThemeManager,\r\n getThemeManager,\r\n} from \"./themes\";\r\n\r\n// Export utilities\r\nexport {\r\n generateId,\r\n parseSize,\r\n normalizeDataPoints,\r\n extractXValues,\r\n extractYValues,\r\n deepMerge,\r\n debounce,\r\n throttle,\r\n calculateDataRange,\r\n formatNumber,\r\n clamp,\r\n lerp,\r\n hexToRgba,\r\n} from \"./utils\";\r\n\r\n// Export license management utilities\r\nexport {\r\n // Configuration\r\n configureLicenseEncryption,\r\n getCurrentPassphrase,\r\n resetPassphrase,\r\n \r\n // License operations\r\n setLicense,\r\n loadLicense,\r\n hasStoredLicense,\r\n isLicenseApplied,\r\n removeLicense,\r\n applyLicenseKey,\r\n getLicenseStatus,\r\n validateLicenseFormat,\r\n \r\n // Crypto utilities (for advanced usage)\r\n encryptLicense,\r\n decryptLicense,\r\n saveEncryptedLicense,\r\n loadEncryptedLicense,\r\n hasEncryptedLicense,\r\n clearStoredLicense,\r\n getLicenseStorageKey,\r\n \r\n // Types\r\n type LicenseConfig,\r\n type LicenseStatus,\r\n} from \"./license\";\r\n\r\n/**\r\n * Setup SciChart license from multiple sources (legacy API - kept for backward compatibility)\r\n * Tries sources in order: env variable → localStorage → direct key\r\n * \r\n * @deprecated Use loadLicense() or setLicense() instead\r\n * \r\n * @example\r\n * ```ts\r\n * import { setupSciChartLicense } from '@rm-graph/core';\r\n * \r\n * setupSciChartLicense({\r\n * fromEnv: true,\r\n * fromLocalStorage: true,\r\n * licenseKey: 'fallback-key'\r\n * });\r\n * ```\r\n */\r\nexport async function setupSciChartLicense(options: {\r\n fromEnv?: boolean;\r\n fromLocalStorage?: boolean;\r\n licenseKey?: string;\r\n}): Promise<boolean> {\r\n // Import dynamically to avoid circular deps\r\n const { loadLicense } = await import(\"./license\");\r\n const { SciChartSurface } = await import(\"scichart\");\r\n \r\n let licenseKey: string | undefined;\r\n\r\n // Try environment variables first\r\n if (options.fromEnv) {\r\n // Vite environment variable\r\n if (typeof import.meta !== 'undefined' && (import.meta as any).env?.VITE_SCICHART_LICENSE_KEY) {\r\n licenseKey = (import.meta as any).env.VITE_SCICHART_LICENSE_KEY;\r\n }\r\n // Node.js environment variable\r\n else if (typeof process !== 'undefined' && process.env?.SCICHART_LICENSE_KEY) {\r\n licenseKey = process.env.SCICHART_LICENSE_KEY;\r\n }\r\n }\r\n\r\n // Try encrypted localStorage second\r\n if (!licenseKey && options.fromLocalStorage) {\r\n const loaded = await loadLicense();\r\n if (loaded) {\r\n return true;\r\n }\r\n }\r\n\r\n // Use direct key as fallback\r\n if (!licenseKey && options.licenseKey) {\r\n licenseKey = options.licenseKey;\r\n }\r\n\r\n // Apply the license key\r\n if (licenseKey) {\r\n SciChartSurface.setRuntimeLicenseKey(licenseKey);\r\n return true;\r\n }\r\n \r\n return false;\r\n}\r\n\r\n/**\r\n * Configure SciChart license key directly (legacy API)\r\n * @deprecated Use setLicense() for encrypted storage or applyLicenseKey() for direct application\r\n */\r\nexport function configureSciChartLicense(licenseKey: string): void {\r\n if (licenseKey) {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { SciChartSurface } = require(\"scichart\");\r\n SciChartSurface.setRuntimeLicenseKey(licenseKey);\r\n }\r\n}\r\n\r\n// Library version\r\nexport const VERSION = \"0.1.1\";\r\n\r\n// SciChart configuration helper\r\nexport { SciChartSurface } from \"scichart\";\r\n\r\n// SciChart version for CDN URLs\r\nconst SCICHART_VERSION = \"4.0.933\";\r\n\r\n// Default CDN URLs for SciChart WASM files\r\nconst DEFAULT_WASM_URL = `https://cdn.jsdelivr.net/npm/scichart@${SCICHART_VERSION}/_wasm/scichart2d.wasm`;\r\n\r\n// Auto-configure SciChart with CDN on package import\r\nlet isConfigured = false;\r\n\r\nfunction autoConfigureSciChart(): void {\r\n if (isConfigured) return;\r\n \r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { SciChartSurface } = require(\"scichart\");\r\n SciChartSurface.configure({\r\n wasmUrl: DEFAULT_WASM_URL,\r\n });\r\n isConfigured = true;\r\n } catch {\r\n // SciChart not available, skip auto-configuration\r\n }\r\n}\r\n\r\n// Run auto-configuration on import\r\nautoConfigureSciChart();\r\n\r\n/**\r\n * Configure SciChart WebAssembly location\r\n * By default, the package auto-configures to use CDN. \r\n * Call this to override with custom paths.\r\n * \r\n * @example\r\n * ```ts\r\n * import { configureSciChart } from '@rm-graph/core';\r\n * \r\n * // Use local WASM files\r\n * configureSciChart({\r\n * wasmUrl: '/scichart2d.wasm'\r\n * });\r\n * ```\r\n */\r\nexport function configureSciChart(options: {\r\n wasmUrl?: string;\r\n}): void {\r\n try {\r\n // eslint-disable-next-line @typescript-eslint/no-require-imports\r\n const { SciChartSurface } = require(\"scichart\");\r\n SciChartSurface.configure({\r\n wasmUrl: options.wasmUrl || DEFAULT_WASM_URL,\r\n });\r\n isConfigured = true;\r\n } catch {\r\n // SciChart not available\r\n }\r\n}\r\n"]}
|