UNPKG

@obliczeniowo/elementary

Version:
1 lines 105 kB
{"version":3,"file":"obliczeniowo-elementary-linear-diagram.mjs","sources":["../../../../projects/components/linear-diagram/components/diagram-point-hover/diagram-point-hover.component.ts","../../../../projects/components/linear-diagram/components/diagram-point-hover/diagram-point-hover.component.html","../../../../projects/components/linear-diagram/class/linear-diagram-2-d/elements/y-axis-i.ts","../../../../projects/components/linear-diagram/class/linear-diagram-2-d/linear-diagram-2-d.ts","../../../../projects/components/linear-diagram/components/diagram2d/linear-diagram-2d.component.ts","../../../../projects/components/linear-diagram/components/diagram2d/linear-diagram-2d.component.html","../../../../projects/components/linear-diagram/components/diagram-data-filter/diagram-data-filter.component.ts","../../../../projects/components/linear-diagram/components/diagram-data-filter/diagram-data-filter.component.html","../../../../projects/components/linear-diagram/linear-diagram.module.ts","../../../../projects/components/linear-diagram/obliczeniowo-elementary-linear-diagram.ts"],"sourcesContent":["import { Subject, Subscription } from 'rxjs';\nimport { Component, ContentChild, HostBinding, OnDestroy, TemplateRef } from '@angular/core';\n\n/**\n * Create hover over element on obl-linear-diagram-2d element by ng-content\n *\n * example with own template\n *\n * <obl-linear-diagram-2d [points]=\"points\">\n *   <ng-template #xyTemplate let-x=\"x\" let-y=\"y\">\n *    <div class=\"xy-template\">\n *      <div>x = {{ x | number: '0.5-5' }}</div>\n *      <div>y = {{ y | number: '0.5-5' }}</div>\n *    </div>\n *  </ng-template>\n * </obl-linear-diagram-2d>\n */\n@Component({\n    selector: 'obl-diagram-point-hover',\n    templateUrl: './diagram-point-hover.component.html',\n    styleUrls: ['./diagram-point-hover.component.scss'],\n    standalone: false\n})\nexport class DiagramPointHoverComponent implements OnDestroy {\n  x!: number;\n  y!: number;\n\n  private pOnMouseOver?: Subscription;\n  set onMouseOver(value: Subject<SVGGElement> | undefined) {\n    if (this.pOnMouseOver && !this.pOnMouseOver.closed) {\n      this.pOnMouseOver.unsubscribe();\n    }\n    if (value) {\n      this.pOnMouseOver = value.subscribe(\n        (element) => {\n          const point = JSON.parse(element.dataset.point as string);\n          const pointSvg = JSON.parse(element.dataset.pointSvg as string);\n          this.x = point.x;\n          this.y = point.y;\n          const rect = element.getBoundingClientRect();\n          const svgHeight = element.ownerSVGElement?.clientHeight as number;\n          const svgWidth = element.ownerSVGElement?.clientWidth as number;\n          const viewBox = (element.ownerSVGElement?.getAttribute('viewBox') as string).split(' ').slice(2).map(v => parseFloat(v));\n          this.left = pointSvg.x / viewBox[0] * svgWidth + rect.width / 2;\n          this.top = pointSvg.y / viewBox[1] * svgHeight + rect.height / 2;\n          this.over = '';\n        }\n      );\n    }\n  }\n\n  private pOnMouseOut?: Subscription;\n  public set onMouseOut(value: Subject<void> | undefined) {\n    if (this.pOnMouseOut && !this.pOnMouseOut.closed) {\n      this.pOnMouseOut.unsubscribe();\n    }\n    if (value) {\n      this.pOnMouseOut = value.subscribe(() => {\n        this.over = 'none';\n      });\n    }\n  }\n\n  @HostBinding('style.display') over: '' | 'none' = 'none';\n  @HostBinding('style.top.px') top = 0;\n  @HostBinding('style.left.px') left = 0;\n\n  @ContentChild('xyTemplate') xyTemplate!: TemplateRef<any>;\n\n  ngOnDestroy(): void {\n    this.onMouseOut = undefined;\n    this.onMouseOver = undefined;\n    if (this.pOnMouseOut && !this.pOnMouseOut.closed) {\n      this.pOnMouseOut.unsubscribe();\n    }\n  }\n}\n","@if (!xyTemplate) {\n  <div>\n    <p>x: {{ x }}</p>\n    <p>y: {{ y }}</p>\n  </div>\n}\n\n<ng-container *ngTemplateOutlet=\"xyTemplate; context: { x: x, y: y }\"></ng-container>\n\n<ng-content></ng-content>","import { DecimalPipe } from '@angular/common';\nimport { Point2D } from '@obliczeniowo/elementary/classes';\nimport { DrawingContextInterface, Rect, TextAlign } from '@obliczeniowo/elementary/drawing';\nimport { AxisOptions, YAxisOptions } from '../linear-diagram-2-d';\nimport { MinMax } from '@obliczeniowo/elementary/math';\n\nexport abstract class YAxisI {\n  protected textAlign: TextAlign = TextAlign.RIGHT;\n\n  /** pipe used for formatting x/y axis text */\n  decimalPipe = new DecimalPipe('en-US');\n\n  /**\n   * Function that give you control over format of y axis values\n   * this function can be overrided let programmer use whatever he want\n   * @param y value on scale to draw\n   * @param yK y * pow(10, yK) - power of 10 that provide  number into n.xxxx format\n   * @returns formatted string value of y scale\n   */\n  yFormatter: (y: number, yK: number) => string = (y: number, yK: number) => this.decimalPipe.transform(y * Math.pow(10, yK), '0.3-3') || 'NaN';\n\n  abstract draw(\n    dc: DrawingContextInterface,\n    startPoint: Point2D,\n    startScale: Point2D,\n    dY: number,\n    minMax: MinMax,\n    yScale: number,\n    yK: number,\n    diagramArea: Rect,\n    yLabel: string,\n    yOptions?: AxisOptions\n  ): number;\n}\n\nexport class YAxis extends YAxisI {\n  draw(\n    dc: DrawingContextInterface,\n    startPoint: Point2D,\n    startScale: Point2D,\n    dY: number,\n    minMax: MinMax,\n    yScale: number,\n    yK: number,\n    diagramArea: Rect,\n    yLabel: string,\n    yOptions: YAxisOptions\n  ): number {\n    dc.group({ name: 'yAxis' });\n\n    const color = yOptions?.color;\n\n    this.textAlign = yOptions?.textAlign || this.textAlign;\n\n    if (this.textAlign !== TextAlign.RIGHT) {\n      const m = new Point2D(diagramArea.width, 0);\n      startPoint = startPoint.add(m);\n      startScale = startScale.add(m);\n    }\n\n    let posy: Point2D = new Point2D(startPoint.x, startScale.y);\n\n    const eP = startPoint.add(\n      new Point2D(\n        0,\n        -diagramArea.height\n      )\n    );\n\n    dc.drawArrow(\n      startPoint,\n      eP,\n      yOptions?.stroke || 1,\n      color || '#000000',\n      !!yOptions?.arrow\n    );\n\n    dc.setTextAlign(this.textAlign);\n\n    let lengthYLabel = 0;\n    let yText = '';\n\n    dc.group({ name: 'values' });\n\n    const dm = new Point2D(\n      this.textAlign === TextAlign.RIGHT ? -2 : 4,\n      1.5\n    );\n    const dsc = new Point2D(\n      0,\n      -dY * yScale\n    );\n\n    if (minMax.min !== minMax.max) {\n      for (let y = Math.ceil(minMax.min / dY) * dY; y <= minMax.max; y += dY) {\n        yText = this.yFormatter(y, yK);\n\n        const tw = dc.getTextWidth(yText);\n\n        lengthYLabel = tw > lengthYLabel ? tw : lengthYLabel;\n\n        dc.drawText(yText, posy.add(dm), color || '#000000', 0);\n\n        posy = posy.add(dsc);\n\n        if (posy.y < eP.y) {\n          break;\n        }\n      }\n    }\n\n    dc.setTextAlign(TextAlign.LEFT);\n\n    dc.endGroup();\n\n    dc.endGroup();\n\n    if (yLabel) {\n      const textWidth = dc.getTextWidth(yLabel);\n\n      const offset = this.textAlign === TextAlign.RIGHT\n        ? new Point2D(diagramArea.x, diagramArea.y + diagramArea.height * 0.5).add(\n          new Point2D(\n            -lengthYLabel - 10,\n            textWidth / 2\n          ))\n        : new Point2D(diagramArea.x + diagramArea.width, diagramArea.y + diagramArea.height * 0.5).add(\n          new Point2D(\n            lengthYLabel + 20,\n            textWidth / 2\n          ));\n\n      dc.drawText(\n        yLabel,\n        offset,\n        color || '#009900',\n        90\n      );\n    }\n\n    if (yK) {\n      const offset = this.textAlign === TextAlign.RIGHT\n        ? new Point2D(\n          diagramArea.x,\n          diagramArea.y\n        ).add(new Point2D(-lengthYLabel - 10, 0))\n        : new Point2D(\n          diagramArea.x + diagramArea.width,\n          diagramArea.y\n        ).add(new Point2D(lengthYLabel + 20, 0));\n\n      dc.setTextAlign(TextAlign.RIGHT);\n      dc.drawText(\n        `×e${-yK}`,\n        offset,\n        color || '#009900',\n        90\n      );\n    }\n\n    return lengthYLabel;\n  }\n}\n","import { ElementaryMath, MinMax } from '@obliczeniowo/elementary/math';\nimport { YAxis, YAxisI } from './elements/y-axis-i';\nimport {\n  DrawingContextInterface,\n  LinePattern,\n  TextAlign,\n  TextBaseline,\n  Rect,\n} from '@obliczeniowo/elementary/drawing';\nimport { DecimalPipe } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport {\n  Point2D,\n  ColorType,\n  LinearFunction2D,\n} from '@obliczeniowo/elementary/classes';\nimport { ns } from '@obliczeniowo/elementary/svg';\n\nexport enum PointType {\n  NONE = 'none',\n  CIRCLE = 'circle',\n  X = 'x',\n  STAR = 'star',\n}\n\nexport interface BaseDrawingOptions {\n  /** color in format #rrggbb */\n  color?: ColorType;\n  stroke?: number;\n  linePattern?: LinePattern | string;\n  drawPoint?: PointType | string;\n}\n\nexport interface AxisOptions extends BaseDrawingOptions {\n  arrow?: boolean;\n  dp?: number;\n  autoIncreaseDecrease?: boolean;\n  precision?: number;\n  display?: boolean;\n}\n\nexport interface YAxisOptions extends AxisOptions {\n  textAlign?: TextAlign;\n}\n\n// tslint:disable-next-line: no-empty-interface\nexport interface GridOptions extends BaseDrawingOptions {\n  display?: boolean;\n}\n\nexport interface LinearDiagram2DOptions {\n  displayCursor?: boolean;\n  xAxis?: AxisOptions;\n  yAxis?: YAxisOptions;\n  greed?: GridOptions;\n  set?: BaseDrawingOptions[];\n  xMinMax?: MinMax;\n  yMinMax?: MinMax;\n}\n\nexport type DrawingPointFu = (\n  point: Point2D,\n  dc: DrawingContextInterface,\n  stroke: number,\n  color: ColorType,\n  index: number,\n  value: number\n) => void;\n\nexport class LinearDiagram2D {\n  protected static drawingPoints: Map<string, DrawingPointFu> = new Map<\n    string,\n    DrawingPointFu\n  >();\n\n  protected options!: LinearDiagram2DOptions;\n\n  /** min max for x */\n  protected xMinMax!: MinMax;\n  /** min max for y */\n  protected yMinMax!: MinMax;\n  /** */\n  protected yAxis: YAxisI = new YAxis();\n  /** */\n  protected xScale!: number;\n  /** */\n  protected yScale!: number;\n\n  protected xCursorLine!: SVGPolylineElement;\n  protected yCursorLine!: SVGPolylineElement;\n  protected xyCursor!: SVGTextElement;\n\n  selectionRange?: MinMax;\n\n  /** diagram area rect (area where diagram data will be drawn) */\n  diagramArea: Rect;\n\n  pPoints: Point2D[][] = [[]];\n\n  /** diagram title text */\n  title = '';\n\n  /** x label description */\n  xLabel = '';\n  /** y label description */\n  yLabel = '';\n\n  /** legend description table */\n  legend: string[] = [];\n\n  /** pipe used for formatting x/y axis text */\n  decimalPipe = new DecimalPipe('en-US');\n\n  /**  */\n  xK = 0;\n  /** */\n  yK = 0;\n\n  redraw: Subject<void> = new Subject<void>();\n  onPointMouseOver: Subject<SVGGElement> = new Subject<SVGGElement>();\n  onPointMouseOut: Subject<void> = new Subject<void>();\n\n  static registerDrawingPointFu(name: string, fu: DrawingPointFu): boolean {\n    if (LinearDiagram2D.drawingPoints.has(name)) {\n      return false;\n    }\n\n    LinearDiagram2D.drawingPoints.set(name, fu);\n    return true;\n  }\n\n  /**\n   * Function that give you control over format of x axis values\n   * this function can be overridden let programmer use whatever he want\n   * @param x value on scale to draw\n   * @param xK x * pow(10, xK) - power of 10 that provide  number into n.xxxx format\n   * @returns formatted string value of x scale\n   */\n  xFormatter: (x: number, xK: number) => string = (x: number, xK: number) =>\n    this.decimalPipe.transform(x * Math.pow(10, xK), '0.2-2') || 'NaN';\n\n  set yFormatter(fu: (y: number, yK: number) => string) {\n    this.yAxis.yFormatter = fu;\n  }\n\n  /**\n   * set points vector and recalculate xMinMax & yMinMax values for diagram\n   */\n  set points(points: Point2D[][]) {\n    this.pPoints = points;\n\n    this.xMinMax = this.getXMinMax();\n\n    this.xK = -Math.floor(\n      Math.log10(\n        Math.max(Math.abs(this.xMinMax.max), Math.abs(this.xMinMax.min))\n      )\n    );\n\n    this.yMinMax = this.getYMinMax();\n\n    this.yK = -Math.floor(\n      Math.log10(\n        Math.max(Math.abs(this.yMinMax.max), Math.abs(this.yMinMax.min))\n      )\n    );\n  }\n\n  /**\n   * @param area diagram area\n   * @param points points vectors as table of Point2D\n   * @param options options settings for diagram (most of them override default one)\n   */\n  constructor(\n    area: Rect,\n    points: Point2D[][],\n    options?: LinearDiagram2DOptions\n  ) {\n    if (!LinearDiagram2D.drawingPoints.has(PointType.CIRCLE)) {\n      LinearDiagram2D.drawingPoints.set(\n        PointType.CIRCLE,\n        (\n          point: Point2D,\n          dc: DrawingContextInterface,\n          stroke: number,\n          color: ColorType\n        ) => dc.drawCircle(point, 2, stroke, color, 'none')\n      );\n      LinearDiagram2D.drawingPoints.set(\n        PointType.STAR,\n        (\n          point: Point2D,\n          dc: DrawingContextInterface,\n          stroke: number,\n          color: ColorType\n        ) =>\n          [0, 1, 2, 3, 4, 5].forEach((i) =>\n            dc.drawLine(\n              point,\n              new Point2D(0, 5)\n                .rotate(ElementaryMath.degreesToRadians(60) * i)\n                .add(point),\n              stroke,\n              color\n            )\n          )\n      );\n      LinearDiagram2D.drawingPoints.set(\n        PointType.X,\n        (\n          point: Point2D,\n          dc: DrawingContextInterface,\n          stroke: number,\n          color: ColorType\n        ) =>\n          [0, 1, 2, 3].forEach((i) =>\n            dc.drawLine(\n              point,\n              new Point2D(0, 5)\n                .rotate((Math.PI / 2) * i + Math.PI / 4)\n                .add(point),\n              stroke,\n              color\n            )\n          )\n      );\n    }\n\n    this.diagramArea = area;\n\n    this.options = {\n      xAxis: {\n        display: true,\n        arrow: true,\n        color: '#ff0000',\n        stroke: 1,\n      },\n      yAxis: {\n        display: true,\n        arrow: true,\n        color: '#009900',\n        stroke: 1,\n      },\n      greed: {\n        display: true,\n        color: {\n          hex: '#777777',\n          html: 'var(--obl-linear-diagram-greed-color)',\n        },\n        stroke: 0.25,\n        linePattern: LinePattern.DASHED,\n      },\n    };\n\n    this.setOptions(options);\n\n    this.points = points;\n  }\n\n  protected normalizeMinMax(min: number, max: number): MinMax {\n    if (min === max) {\n      if (min && max) {\n        if (min > 0) {\n          min = 0;\n        } else {\n          max = 0;\n        }\n      } else {\n        max = 1;\n      }\n    }\n\n    return {\n      min,\n      max,\n    };\n  }\n\n  protected filterByRange(): Point2D[][] {\n    const { selectionRange } = this;\n    const { min, max } = selectionRange || { min: 0, max: 1 };\n    const check = (p?: Point2D) => p && p.x >= min && p.x <= max;\n\n    const between = (p1?: Point2D, p2?: Point2D) =>\n      p1 && p1.x < min && p2 && p2.x > max;\n\n    return selectionRange\n      ? this.pPoints.map((points) =>\n          points.filter(\n            (p, index) =>\n              check(p) ||\n              check(points[index - 1]) ||\n              check(points[index + 1]) ||\n              between(p, points[index + 1]) ||\n              between(points[index + 1], p) ||\n              between(p, points[index - 1]) ||\n              between(points[index - 1], p)\n          )\n        )\n      : this.pPoints;\n  }\n\n  /**\n   * Get min and max of x axis\n   * @returns return min & max for x axis\n   */\n  public getXMinMax(): MinMax {\n    let min!: number;\n    let max!: number;\n\n    const filtered = this.filterByRange();\n\n    filtered.forEach((points) => {\n      points.forEach((point, index) => {\n        if (min === undefined || min > point.x) {\n          min = point.x;\n        }\n        if (max === undefined || max < point.x) {\n          max = point.x;\n        }\n      });\n    });\n\n    if (!this.selectionRange) {\n      if (\n        min === undefined ||\n        (this.options?.xMinMax?.min !== undefined &&\n          min > this.options?.xMinMax?.min)\n      ) {\n        min = this.options?.xMinMax?.min || 0;\n      }\n\n      if (\n        max === undefined ||\n        (this.options?.xMinMax?.max !== undefined &&\n          max < this.options?.xMinMax?.max)\n      ) {\n        max = this.options?.xMinMax?.max || min + 1;\n      }\n    } else {\n      return this.normalizeMinMax(\n        this.selectionRange.min,\n        this.selectionRange.max\n      );\n    }\n\n    return this.normalizeMinMax(min, max);\n  }\n\n  /**\n   * Find minimum & maximum for y axis\n   * @returns MinMax interface of displayed values\n   */\n  protected getYMinMax(): MinMax {\n    let min!: number;\n    let max!: number;\n\n    const filtered = this.filterByRange();\n    const { selectionRange } = this;\n\n    filtered.forEach((points) => {\n      if (selectionRange && points.length > 1) {\n        let fu = LinearFunction2D.fromTwoPoints(points[0], points[1]);\n\n        if (fu) {\n          const calculated = Math.max(Math.min(points[0].x, points[1].x), selectionRange.min);\n          if (min !== undefined) {\n            min = Math.min(fu.yPoint(calculated), min);\n            max = Math.max(min, max);\n          } else {\n            min = fu.yPoint(calculated);\n            max = min;\n          }\n        }\n\n        const fp = points[points.length - 2];\n        const lp = points[points.length - 1];\n\n        fu = LinearFunction2D.fromTwoPoints(\n          fp,\n          lp\n        );\n\n        if (fu) {\n          const calculated = Math.min(Math.max(lp.x, fp.x), selectionRange.max);\n          if (min !== undefined) {\n            min = Math.min(fu.yPoint(calculated), min);\n            max = Math.max(fu.yPoint(calculated), max);\n          } else {\n            min = fu.yPoint(calculated);\n            max = min;\n          }\n        }\n      }\n\n      points.forEach((point, index) => {\n        if ((index === 0 || index === points.length - 1) && selectionRange) {\n          return;\n        }\n\n        if (min === undefined || min > point.y) {\n          min = point.y;\n        }\n        if (max === undefined || max < point.y) {\n          max = point.y;\n        }\n      });\n    });\n\n    if (\n      min === undefined ||\n      (this.options?.yMinMax?.min !== undefined &&\n        min > this.options?.yMinMax?.min)\n    ) {\n      min = this.options?.yMinMax?.min || 0;\n    }\n\n    if (\n      max === undefined ||\n      (this.options?.yMinMax?.max !== undefined &&\n        max < this.options?.yMinMax?.max)\n    ) {\n      max = this.options?.yMinMax?.max || min + 1;\n    }\n\n    return this.normalizeMinMax(min, max);\n  }\n\n  /**\n   * Convert point diagram pos to SVG pos\n   * @param point point to transform\n   * @param startPoint diagram start point\n   * @param xScale x scale\n   * @param yScale y scale\n   * @returns Point2D instance\n   */\n  protected diagramPosToSVG(point: Point2D, startPoint: Point2D): Point2D {\n    return new Point2D(\n      (point.x - this.xMinMax.min) * this.xScale + startPoint.x,\n      -(point.y - this.yMinMax.min) * this.yScale + startPoint.y\n    );\n  }\n\n  protected svgPosToDiagram(\n    point: Point2D,\n    startPoint: Point2D,\n    xScale: number,\n    yScale: number\n  ): Point2D {\n    return new Point2D(\n      (point.x - startPoint.x) / xScale + this.xMinMax.min,\n      (startPoint.y - point.y) / yScale + this.yMinMax.min\n    );\n  }\n\n  protected getDAxis(\n    range: number,\n    autoIncreaseDecrease: boolean,\n    dp: number\n  ): number {\n    if (!dp) {\n      dp = range;\n    }\n    if (autoIncreaseDecrease) {\n      while (range / dp > 10) {\n        dp *= 2;\n      }\n\n      while (range / dp < 5) {\n        dp /= 2;\n      }\n    }\n\n    return dp;\n  }\n\n  protected getDx(): number {\n    const range = this.xMinMax.max - this.xMinMax.min;\n\n    return this.getDAxis(\n      this.xMinMax.max - this.xMinMax.min,\n      !this.options?.xAxis?.autoIncreaseDecrease,\n      (this.options.xAxis?.dp && this.options.xAxis.dp) ||\n        this.recalcDScale(\n          range,\n          this.options.xAxis?.precision !== undefined &&\n            this.options.xAxis?.precision >= 0\n            ? this.options.xAxis.precision\n            : 2\n        )\n    );\n  }\n\n  protected getDy(): number {\n    const range = this.yMinMax.max - this.yMinMax.min;\n\n    return this.getDAxis(\n      range,\n      !this.options?.yAxis?.autoIncreaseDecrease,\n      (this.options.yAxis?.dp && this.options.yAxis.dp) ||\n        this.recalcDScale(\n          range,\n          this.options.yAxis?.precision && this.options.yAxis?.precision >= 0\n            ? this.options.yAxis.precision\n            : 2\n        )\n    );\n  }\n\n  protected drawGreed(dc: DrawingContextInterface, startPoint: Point2D): void {\n    if (!this.options.greed?.display) {\n      return;\n    }\n\n    dc.group({ name: 'greed' }).setLinePattern(this.options.greed?.linePattern);\n\n    const dx = this.getDx();\n    const dy = this.getDy();\n\n    const startScale: Point2D = this.diagramPosToSVG(\n      new Point2D(\n        Math.ceil(this.xMinMax.min / dx) * dx,\n        Math.ceil(this.yMinMax.min / dy) * dy\n      ),\n      startPoint\n    );\n\n    const dxy: Point2D = new Point2D(dx * this.xScale, dy * this.yScale);\n\n    let posX: Point2D = new Point2D(startScale.x, startPoint.y);\n\n    let posY: Point2D = new Point2D(startPoint.x, startScale.y);\n\n    while (\n      posX.x <=\n      posY.x + (this.xMinMax.max - this.xMinMax.min) * this.xScale\n    ) {\n      dc.drawLine(\n        posX,\n        new Point2D(\n          posX.x,\n          posX.y - (this.yMinMax.max - this.yMinMax.min) * this.yScale\n        ),\n        this.options?.greed?.stroke || 0,\n        this.options?.greed?.color || '#000000'\n      );\n\n      posX = posX.add(new Point2D(dxy.x, 0));\n    }\n\n    while (\n      posY.y >=\n      posX.y - (this.yMinMax.max - this.yMinMax.min) * this.yScale\n    ) {\n      dc.drawLine(\n        posY,\n        new Point2D(\n          posY.x + (this.xMinMax.max - this.xMinMax.min) * this.xScale,\n          posY.y\n        ),\n        this.options.greed?.stroke || 0,\n        this.options.greed?.color || '#000000'\n      );\n\n      posY = posY.add(new Point2D(0, -dxy.y));\n    }\n\n    dc.setLinePattern(LinePattern.NONE).endGroup();\n  }\n\n  /**\n   * Calc scale elementary increase value with given precision\n   * @param value (max - min)\n   * @param precision integer number should be >= 0\n   * @returns scale elementary increase value\n   */\n  protected recalcDScale(value: number, precision: number = 2): number {\n    const power = Math.floor(Math.log10(value));\n    return +(\n      Math.ceil((Math.pow(10, -power + precision) * value) / 10) *\n      Math.pow(10, power - precision)\n    ).toFixed(precision);\n  }\n\n  protected drawXAxis(\n    dc: DrawingContextInterface,\n    startPoint: Point2D\n  ): number {\n    if (!this.options.xAxis?.display) {\n      return 0;\n    }\n\n    dc.group({ name: 'xAxis' });\n\n    const dx = this.getDx();\n\n    const startScale: Point2D = this.diagramPosToSVG(\n      new Point2D(Math.ceil(this.xMinMax.min / dx) * dx, 0),\n      startPoint\n    );\n\n    let posX: Point2D = new Point2D(startScale.x, startPoint.y);\n\n    const bP = this.diagramPosToSVG(\n      new Point2D(this.xMinMax.min, this.yMinMax.min),\n      startPoint\n    );\n\n    const eP = this.diagramPosToSVG(\n      new Point2D(this.xMinMax.max, this.yMinMax.min),\n      startPoint\n    );\n\n    dc.drawArrow(\n      bP,\n      eP,\n      this.options.xAxis?.stroke || 0,\n      this.options.xAxis?.color || '#000000',\n      !!this.options?.xAxis?.arrow\n    );\n\n    let xText = '';\n\n    let textWidth = 0;\n\n    dc.group({ name: 'values' });\n\n    for (\n      let x = Math.ceil(this.xMinMax.min / dx) * dx;\n      x <= this.xMinMax.max;\n      x += dx\n    ) {\n      xText = this.xFormatter(x, this.xK);\n\n      textWidth = dc.getTextWidth(xText) + 5;\n      dc.drawText(\n        xText,\n        posX.add(new Point2D(1.5, textWidth)),\n        this.options.xAxis?.color || '#000000',\n        90\n      );\n\n      posX = posX.add(new Point2D(dx * this.xScale, 0));\n\n      if (posX.x > eP.x) {\n        break;\n      }\n    }\n\n    dc.endGroup().endGroup();\n\n    return textWidth;\n  }\n\n  protected drawYAxis(\n    dc: DrawingContextInterface,\n    startPoint: Point2D\n  ): number {\n    if (!this.options.yAxis?.display) {\n      return 0;\n    }\n    const dy = this.getDy();\n\n    const startScale: Point2D = this.diagramPosToSVG(\n      new Point2D(0, Math.ceil(this.yMinMax.min / dy) * dy),\n      startPoint\n    );\n\n    return this.yAxis.draw(\n      dc,\n      startPoint,\n      startScale,\n      dy,\n      this.yMinMax,\n      this.yScale,\n      this.yK,\n      this.diagramArea,\n      this.yLabel,\n      this.options.yAxis\n    );\n  }\n\n  protected drawLegend(dc: DrawingContextInterface): void {\n    if (\n      this.legend?.length &&\n      this.pPoints &&\n      this.legend.length <= this.pPoints.length &&\n      this.options?.set?.length\n    ) {\n      dc.setFontSize(8);\n      const maxTextWidth: number = this.legend\n        .map((text) => dc.getTextWidth(text))\n        .reduce(\n          (prev, current) => ((prev = prev < current ? current : prev), prev),\n          0\n        );\n\n      const padding = 5;\n      const keyHeight = 10;\n      const keyWidth = 15;\n\n      const totalWidth = keyWidth + padding * 3 + maxTextWidth;\n      const totalHeight = padding + (keyHeight + padding) * this.legend.length;\n\n      const pc = new Point2D(\n        this.diagramArea.x + this.diagramArea.width - padding - totalWidth,\n        this.diagramArea.y + padding\n      );\n\n      dc.group({ name: 'legend' }).drawRect(\n        pc.x,\n        pc.y,\n        totalWidth,\n        totalHeight,\n        1,\n        '#aaaaaa',\n        '#ffffff',\n        { opacity: 0.6 }\n      );\n\n      this.legend.forEach((text, index) => {\n        const pt = new Point2D(\n          padding,\n          padding + index * (keyHeight + padding) + keyHeight / 2\n        ).add(pc);\n\n        const styles = this.options.set\n          ? this.options.set[index % this.options.set.length]\n          : {};\n\n        dc.group({ name: `key-${index + 1}` }).setLinePattern(\n          styles.linePattern\n        );\n        if (styles.linePattern !== LinePattern.DISABLED) {\n          dc.drawLine(\n            pt,\n            pt.add(new Point2D(keyWidth, 0)),\n            styles.stroke || 1,\n            styles.color || '#000000'\n          );\n        }\n\n        dc.setLinePattern(undefined);\n        this.getDrawPointFu(styles.drawPoint || PointType.NONE)(\n          pt.add(new Point2D(keyWidth / 2, 0)),\n          dc,\n          styles.stroke || 1,\n          styles.color || '#000000',\n          0,\n          0\n        );\n\n        dc.endGroup()\n          .setFontSize(8)\n          .setTextAlign(TextAlign.LEFT)\n          .drawText(\n            text,\n            pc.add(\n              new Point2D(\n                padding * 2 + keyWidth,\n                padding + index * (keyHeight + padding) + keyHeight * 0.75\n              )\n            ),\n            '#000000',\n            0\n          );\n      });\n\n      dc.endGroup();\n    }\n  }\n\n  protected drawVectors(\n    dc: DrawingContextInterface,\n    startPoint: Point2D\n  ): void {\n    const pos = new Point2D(this.diagramArea.x, this.diagramArea.y - 2);\n    const width = this.diagramArea.width;\n    const height = this.diagramArea.height + 2;\n    dc.group({\n      name: 'vectors-tables',\n      clipRect: {\n        pos,\n        width,\n        height,\n      },\n    });\n\n    this.pPoints.forEach((points, index) => {\n      const setIndex =\n        (this.options.set && index % this.options.set.length) || 0;\n      const stroke = this.options?.set?.[setIndex].stroke || 2;\n      const color = this.options?.set?.[setIndex].color || '#000000';\n      const linePattern = this.options?.set?.[setIndex].linePattern;\n\n      dc.setLinePattern(this.options?.set?.[setIndex].linePattern).group({\n        name: `vectors-${index + 1}`,\n      });\n\n      points = points.map((point) => this.diagramPosToSVG(point, startPoint));\n      points = points.map((point, i) => {\n          const prev = points[i - 1];\n          const next = points[i + 1];\n          if (\n            point.isPtInRect(pos.x, pos.y, width, height) || // current in rect\n            prev?.isPtInRect(pos.x, pos.y, width, height) || // prev in rect\n            next?.isPtInRect(pos.x, pos.y, width, height) || // next in rect\n            (prev && prev.x <= pos.x && point.x >= pos.x + width) || // prev outside left and current outside of right\n            (next && point.x <= pos.x && next.x >= pos.x + width) // current outside left and next outside of right\n          ) {\n            return point;\n          }\n          return undefined;\n        })\n        .filter(pt => pt) as Point2D[];\n\n      if (linePattern !== LinePattern.DISABLED) {\n        dc.drawPolyline(\n          points,\n          stroke,\n          color\n        );\n      }\n\n      if (this.options.set) {\n        if (\n          this.options.set[setIndex].drawPoint &&\n          this.options.set[setIndex].drawPoint !== PointType.NONE\n        ) {\n          const pointType =\n            this.options.set[setIndex].drawPoint || PointType.NONE;\n\n          if (pointType !== PointType.NONE) {\n            const drawPointFu: DrawingPointFu = this.getDrawPointFu(pointType);\n\n            dc.group({ name: 'points-marks' });\n\n            points.forEach((point, pIndex) => {\n              dc.group({\n                data: {\n                  point: JSON.stringify(point),\n                  pointSvg: JSON.stringify(\n                    point\n                  ),\n                },\n                onMouseOver: (g: SVGGElement) => this.onPointMouseOver.next(g),\n                onMouseOut: () => this.onPointMouseOut.next(),\n              });\n\n              drawPointFu(\n                point,\n                dc,\n                stroke,\n                color,\n                pIndex,\n                point.y\n              );\n\n              dc.endGroup();\n            });\n\n            dc.endGroup();\n          }\n        }\n      }\n\n      dc.endGroup();\n    });\n\n    dc.endGroup();\n  }\n\n  draw(dc: DrawingContextInterface): void {\n    dc.clear();\n\n    this.xCursorLine = undefined as any;\n    this.yCursorLine = undefined as any;\n    this.xyCursor = undefined as any;\n\n    this.xScale =\n      this.diagramArea.width / (this.xMinMax.max - this.xMinMax.min);\n    this.yScale =\n      this.diagramArea.height / (this.yMinMax.max - this.yMinMax.min);\n\n    const startPoint: Point2D = new Point2D(\n      this.diagramArea.x,\n      this.diagramArea.y + this.diagramArea.height\n    );\n\n    dc.setFontSize(10);\n\n    this.drawGreed(dc, startPoint);\n\n    this.drawVectors(dc, startPoint);\n\n    dc.setLinePattern(LinePattern.NONE);\n\n    dc.setTextAlign(TextAlign.CENTER);\n\n    dc.setTextBaseline(TextBaseline.ALPHABETIC);\n\n    if (this.title) {\n      dc.setFontSize(30);\n      dc.drawText(\n        this.title,\n        this.diagramPosToSVG(\n          new Point2D(\n            (this.xMinMax.max + this.xMinMax.min) * 0.5,\n            this.yMinMax.max\n          ),\n          startPoint\n        ).add(new Point2D(0, -20)),\n        '#ff0000',\n        0\n      );\n      dc.setFontSize(15);\n    }\n\n    dc.setTextBaseline(TextBaseline.ALPHABETIC)\n      .setTextAlign(TextAlign.LEFT)\n      .setFontSize(10);\n\n    const lengthXLabel = this.drawXAxis(dc, startPoint);\n\n    this.drawYAxis(dc, startPoint);\n\n    dc.setTextAlign(TextAlign.CENTER);\n\n    if (this.options.xAxis?.display) {\n      if (this.xLabel) {\n        dc.drawText(\n          this.xLabel,\n          this.diagramPosToSVG(\n            new Point2D(\n              (this.xMinMax.max + this.xMinMax.min) * 0.5,\n              this.yMinMax.min\n            ),\n            startPoint\n          ).add(new Point2D(0, lengthXLabel + 20)),\n          this.options.xAxis?.color || '#000000',\n          0\n        );\n      }\n\n      if (this.xK) {\n        dc.setTextAlign(TextAlign.RIGHT).drawText(\n          `×e${-this.xK}`,\n          this.diagramPosToSVG(\n            new Point2D(this.xMinMax.max, this.yMinMax.min),\n            startPoint\n          ).add(new Point2D(0, lengthXLabel + 20)),\n          this.options.xAxis?.color || '#000000',\n          0\n        );\n      }\n    }\n\n    dc.setTextAlign(TextAlign.LEFT).setTextBaseline(TextBaseline.ALPHABETIC);\n\n    this.drawLegend(dc);\n\n    this.redraw.next();\n  }\n\n  setOptions(options: LinearDiagram2DOptions | undefined): void {\n    if (!options) {\n      options = {};\n    }\n\n    this.options = {\n      displayCursor: options.displayCursor,\n      xAxis: {\n        ...this.options.xAxis,\n        ...options?.xAxis,\n      },\n      yAxis: {\n        ...this.options.yAxis,\n        ...options?.yAxis,\n      },\n      xMinMax: {\n        ...this.options.xMinMax,\n        ...(options?.xMinMax as any),\n      },\n      yMinMax: {\n        ...this.options.xMinMax,\n        ...(options?.yMinMax as any),\n      },\n      greed: {\n        ...this.options.greed,\n        ...options?.greed,\n      },\n      set: options?.set ||\n        this.options.set || [\n          {\n            color: '#37abc8',\n            stroke: 2,\n            linePattern: LinePattern.NONE,\n            drawPoint: PointType.NONE,\n          },\n          {\n            color: '#ab37c8',\n            stroke: 2,\n            linePattern: LinePattern.NONE,\n            drawPoint: PointType.NONE,\n          },\n          {\n            color: '#ffc837',\n            stroke: 2,\n            linePattern: LinePattern.NONE,\n            drawPoint: PointType.NONE,\n          },\n        ],\n    };\n  }\n\n  drawCursor(mousePos: Point2D, svg: SVGGElement): void {\n    if (\n      !this.options?.displayCursor ||\n      !mousePos ||\n      this.xScale === undefined ||\n      this.yScale === undefined\n    ) {\n      return;\n    }\n    const legend = svg.querySelector('.legend');\n    const vectors = svg.querySelector('.vectors-tables');\n    const append = (element: SVGElement, before: Element | null) => {\n      if (before) {\n        svg.insertBefore(element, before);\n      } else {\n        svg.appendChild(element);\n      }\n    };\n    if (!this.xCursorLine) {\n      this.xCursorLine = document.createElementNS(ns, 'polyline');\n      append(this.xCursorLine, vectors || legend);\n      this.xCursorLine.style.stroke = '#ff0000';\n      this.xCursorLine.style.strokeWidth = '.2';\n    }\n    if (!this.yCursorLine) {\n      this.yCursorLine = document.createElementNS(ns, 'polyline');\n      append(this.yCursorLine, vectors || legend);\n      this.yCursorLine.style.stroke = '#ff0000';\n      this.yCursorLine.style.strokeWidth = '.2';\n    }\n    if (!this.xyCursor) {\n      this.xyCursor = document.createElementNS(ns, 'text');\n      append(this.xyCursor, legend);\n      this.xyCursor.style.fill = '#ff0000';\n      this.xyCursor.style.textAnchor = 'left';\n      this.xyCursor.style.fontSize = '8px';\n    }\n\n    if (!this.diagramArea.isPtInRect(mousePos)) {\n      this.yCursorLine.style.display = 'none';\n      this.xCursorLine.style.display = 'none';\n      this.xyCursor.style.display = 'none';\n    } else {\n      this.yCursorLine.style.display = '';\n      this.xCursorLine.style.display = '';\n      this.xyCursor.style.display = '';\n    }\n\n    const startPoint: Point2D = new Point2D(\n      this.diagramArea.x,\n      this.diagramArea.y + this.diagramArea.height\n    );\n\n    const diagramPos = this.svgPosToDiagram(\n      mousePos,\n      startPoint,\n      this.xScale,\n      this.yScale\n    );\n\n    this.xyCursor.textContent = `${this.decimalPipe.transform(\n      diagramPos.x,\n      '0.3-3'\n    )}; ${this.decimalPipe.transform(diagramPos.y, '0.3-3')}`;\n    this.xyCursor.setAttribute('x', (mousePos.x + 2).toString());\n    this.xyCursor.setAttribute('y', (mousePos.y - 2).toString());\n\n    this.xCursorLine.setAttribute(\n      'points',\n      `${this.diagramArea.x},${mousePos.y} ${\n        this.diagramArea.x + this.diagramArea.width\n      },${mousePos.y}`\n    );\n\n    this.yCursorLine.setAttribute(\n      'points',\n      `${mousePos.x},${this.diagramArea.y} ${mousePos.x},${\n        this.diagramArea.y + this.diagramArea.height\n      }`\n    );\n  }\n\n  svgToDiagram(point: Point2D) {\n    const startPoint: Point2D = new Point2D(\n      this.diagramArea.x,\n      this.diagramArea.y + this.diagramArea.height\n    );\n\n    return this.svgPosToDiagram(point, startPoint, this.xScale, this.yScale);\n  }\n\n  protected getDrawPointFu(pointType: PointType | string): DrawingPointFu {\n    const fu = LinearDiagram2D.drawingPoints.get(pointType);\n\n    // eslint-disable-next-line no-unneeded-ternary\n    return fu\n      ? fu\n      : (\n          point: Point2D,\n          dc: DrawingContextInterface,\n          stroke: number,\n          color: ColorType\n        ) => {};\n  }\n}\n","import { DiagramPointHoverComponent } from './../diagram-point-hover/diagram-point-hover.component';\nimport {\n  AfterContentInit,\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  ContentChild,\n  effect,\n  ElementRef,\n  input,\n  Input,\n  OnDestroy,\n  Renderer2,\n  ViewChild,\n} from '@angular/core';\nimport {\n  LinearDiagram2D,\n  LinearDiagram2DOptions,\n} from '../../class/linear-diagram-2-d/linear-diagram-2-d';\nimport {\n  DrawingContextInterface,\n  DrawingSvgInterface,\n  Rect,\n} from '@obliczeniowo/elementary/drawing';\nimport { DrawingPdfInterface } from '@obliczeniowo/elementary/drawing-pdf';\nimport { Subscription } from 'rxjs';\nimport { Point2D } from '@obliczeniowo/elementary/classes';\n\n@Component({\n    selector: 'obl-linear-diagram-2d',\n    templateUrl: './linear-diagram-2d.component.html',\n    styleUrls: ['./linear-diagram-2d.component.scss'],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    standalone: false\n})\nexport class LinearDiagram2DComponent\n  implements OnDestroy, AfterViewInit, AfterContentInit\n{\n  protected dc!: DrawingSvgInterface;\n  protected diagram2d?: LinearDiagram2D;\n  protected mousePos: Point2D = new Point2D();\n\n  protected selectArea?: Rect;\n\n  readonly width = 800;\n  readonly height = 528;\n\n  @ViewChild('diagram') diagram!: ElementRef<SVGSVGElement>;\n\n  legend = input<string[]>([]);\n  points = input<Point2D[][]>([]);\n\n  xFormatter = input<(x: number) => string>();\n  yFormatter = input<(x: number) => string>();\n\n  private pOptions!: LinearDiagram2DOptions;\n\n  public get options(): LinearDiagram2DOptions {\n    return this.pOptions;\n  }\n\n  @Input() public set options(value: LinearDiagram2DOptions) {\n    this.pOptions = value;\n\n    if (this.diagram2d && this.dc) {\n      this.diagram2d.setOptions(value);\n      this.diagram2d.draw(this.dc);\n    }\n  }\n\n  protected pLabels: {\n    x: string,\n    y: string,\n    title: string\n  } = {\n    x: '',\n    y: '',\n    title: '',\n  };\n\n  @Input() set labels(labels: { x: string; y: string; title: string }) {\n    this.pLabels = labels;\n\n    if (this.diagram2d) {\n      this.diagram2d.draw(this.dc);\n    }\n  }\n\n  @ContentChild(DiagramPointHoverComponent)\n  diagramPointHover!: DiagramPointHoverComponent;\n\n  protected subscriptions: Subscription[] = [];\n\n  constructor(protected renderer: Renderer2) {\n    effect(() => {\n      this.points();\n      this.legend();\n      this.draw()\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.subscriptions.forEach((subscription) => {\n      if (!subscription.closed) {\n        subscription.unsubscribe();\n      }\n    });\n  }\n\n  ngAfterContentInit(): void {\n    if (this.diagramPointHover && this.diagram2d) {\n      this.diagramPointHover.onMouseOut = this.diagram2d.onPointMouseOut;\n      this.diagramPointHover.onMouseOver = this.diagram2d.onPointMouseOver;\n    }\n  }\n\n  ngAfterViewInit(): void {\n    this.draw();\n  }\n\n  pdf(): void {\n    const dc: DrawingPdfInterface = new DrawingPdfInterface(\n      new Rect(new Point2D(0, 0), new Point2D(800, 600), 20, 20)\n    );\n\n    this.draw(dc);\n\n    dc.save(\n      this.diagram2d?.title.length ? this.diagram2d.title : 'Diagram 2D'\n    );\n  }\n\n  draw(dc: DrawingContextInterface = this.dc): void {\n    if (!dc) {\n      if (!this.diagram) {\n        return;\n      }\n      this.dc = new DrawingSvgInterface(this.diagram.nativeElement, this.renderer);\n      dc = this.dc;\n    }\n\n    if (!this.diagram2d) {\n      this.diagram2d = new LinearDiagram2D(\n        new Rect(new Point2D(120, 50), new Point2D(700, 400)),\n        this.points(),\n        this.options\n      );\n      if (this.diagramPointHover) {\n        this.diagramPointHover.onMouseOut = this.diagram2d.onPointMouseOut;\n        this.diagramPointHover.onMouseOver = this.diagram2d.onPointMouseOver;\n      }\n    } else {\n      this.diagram2d.points = this.points();\n    }\n\n    this.diagram2d.legend = this.legend();\n\n    this.diagram2d.xLabel = this.pLabels.x;\n    this.diagram2d.yLabel = this.pLabels.y;\n    this.diagram2d.title = this.pLabels.title;\n\n    const xFormatter = this.xFormatter();\n    if (xFormatter) {\n      this.diagram2d.xFormatter = xFormatter;\n    }\n\n    const yFormatter = this.yFormatter();\n    if (yFormatter) {\n      this.diagram2d.yFormatter = yFormatter;\n    }\n\n    this.diagram2d.draw(dc);\n    if (dc instanceof DrawingSvgInterface) {\n      this.diagram2d.drawCursor(\n        this.mousePos,\n        (dc as DrawingSvgInterface).svgContainer\n      );\n    }\n  }\n\n  move(event: MouseEvent): void {\n    const rect = this.diagram.nativeElement.getBoundingClientRect();\n    this.mousePos = new Point2D(\n      ((event.clientX - rect.left) / rect.width) * this.width,\n      ((event.clientY - rect.top) / rect.height) * this.height\n    );\n\n    if (!this.diagram2d) {\n      return;\n    }\n\n    this.diagram2d.drawCursor(this.mousePos, this.diagram.nativeElement);\n\n    const area = this.diagram2d.diagramArea;\n\n    if (\n      event.buttons === 1 &&\n      this.mousePos.isPtInRect(area.x, area.y, area.width, area.height)\n    ) {\n      if (this.selectArea) {\n        this.selectArea.width = this.mousePos.x - this.selectArea.x;\n      } else {\n        const startPoint = new Point2D(\n          this.mousePos.x,\n          this.diagram2d.diagramArea.y\n        );\n        const endPoint = new Point2D(\n          Math.min(\n            this.mousePos.x,\n            this.diagram2d.diagramArea.x + this.diagram2d.diagramArea.width\n          ),\n          this.diagram2d.diagramArea.y + this.diagram2d.diagramArea.height\n        );\n        this.selectArea = new Rect(startPoint, endPoint);\n      }\n    }\n  }\n\n  keyup(event: MouseEvent) {\n    if (!this.diagram2d) {\n      return;\n    }\n    const { selectArea } = this;\n    if (selectArea) {\n      const xMin = selectArea.x < selectArea.x + selectArea.width ? selectArea.x : selectArea.x + selectArea.width;\n      const xMax = selectArea.x < selectArea.x + selectArea.width ? selectArea.x + selectArea.width : selectArea.x;\n      this.diagram2d.selectionRange = {\n        min: this.diagram2d.svgToDiagram(\n          new Point2D(xMin, selectArea.y)\n        ).x,\n        max: this.diagram2d.svgToDiagram(\n          new Point2D(\n            xMax,\n            selectArea.y\n          )\n        ).x,\n      };\n      this.selectArea = undefined;\n      this.draw();\n    }\n  }\n\n  left() {\n    if (!this.diagram2d) {\n      return;\n    }\n    const { selectionRange } = this.diagram2d;\n    if (selectionRange) {\n      this.diagram2d.selectionRange = undefined;\n      const range = selectionRange.max - selectionRange.min;\n      const minMax = this.diagram2d.getXMinMax();\n\n      selectionRange.min = Math.max(selectionRange.min - range, minMax.min);\n      selectionRange.max = selectionRange.min + range;\n\n      this.diagram2d.selectionRange = selectionRange;\n      this.draw();\n    }\n  }\n\n  right() {\n    if (!this.diagram2d) {\n      return;\n    }\n    const { selectionRange } = this.diagram2d;\n    if (selectionRange) {\n      this.diagram2d.selectionRange = undefined;\n      const range = selectionRange.max - selectionRange.min;\n      const minMax = this.diagram2d.getXMinMax();\n\n      selectionRange.max = Math.min(selectionRange.max + range, minMax.max);\n      selectionRange.min = selectionRange.max - range;\n\n      this.diagram2d.selectionRange = selectionRange;\n      this.draw();\n    }\n  }\n}\n","<div class=\"svgContainer\">\n  <svg\n    #diagram\n    [attr.viewBox]=\"'0 0 ' + width + ' ' + height\"\n    (mousemove)=\"move($event)\"\n    (mouseup)=\"keyup($event)\"\n  >\n    @if (selectArea) {\n      <rect\n        [attr.x]=\"[selectArea.x, selectArea.x + selectArea.width] | oblMin\"\n        [attr.y]=\"selectArea.y\"\n        [attr.width]=\"([selectArea.width] | oblAbs)[0]\"\n        [attr.height]=\"([selectArea.height] | oblAbs)[0]\"\n      ></rect>\n    }\n    <g class=\"root\"></g>\n  </svg>\n  <div class=\"buttons\">\n    <button class=\"pdf-button\" oblButton icon=\"file\" (click)=\"pdf()\"></button>\n    @if (diagram2d?.selectionRange) {\n      <button\n        oblButton\n        icon=\"cancel\"\n        (click)=\"diagram2d && diagram2d.selectionRange = undefined; this.draw()\"\n      ></button>\n      <button oblButton icon=\"left\" (click)=\"left()\"></button>\n      <button oblButton icon=\"right\" (click)=\"right()\"></button>\n    }\n  </div>\n  <ng-content></ng-content>\n</div>\n","/* eslint-disable @typescript-eslint/no-dynamic-delete */\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { Point2D } from '@obliczeniowo/elementary/classes';\nimport { OblFileService } from '@obliczeniowo/elementary/files';\nimport { ElementaryMath } from '@obliczeniowo/elementary/math';\nimport { keysValues } from '@obliczeniowo/elementary/objects';\nimport { TranslationPipe } from '@obliczeniowo/elementary/text-pipes';\n\nexport interface ArrayFilterOption {\n  value: number;\n  min?: number;\n  max?: number;\n  step?: number;\n}\n\nexport type ArrayFiltersOptions = { [option: string]: ArrayFilterOption };\n\nexport interface ArrayFilterModel {\n  filter: (data: Point2D[], options: { [option: string]: any }) => Point2D[];\n  options: ArrayFiltersOptions;\n}\n\nexport interface ValueDesc {\n  value: number;\n  min?: number;\n  max?: number;\n  steep?: number;\n}\n\nexport type FiltersOptions = { [filter: string]: ArrayFiltersOptions };\n\n@Component({\n    selector: 'obl-diagram-data-filter',\n    templateUrl: './diagram-data-filter.component.html',\n    styleUrl: './diagram-data-filter.component.scss',\n    standalone: false\n})\nexport class DiagramDataFilterComponent {\n  protected models: { [name: string]: ArrayFilterModel } = {\n    smooth: {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: any }\n      ): Point2D[] => {\n        const tolerance = options?.tolerance.value ?? 0.5;\n        const sampleSize: number = options?.sampleSize.value ?? 10;\n        data.forEach((r, index: number) => {\n          const sample = data.slice(index, index + sampleSize).map((d) => d.y);\n          const max = Math.max(...sample);\n          const min = Math.min(...sample);\n          if (max - min < tolerance && sample.length) {\n            r.y = ElementaryMath.average(sample);\n          }\n        });\n        return data;\n      },\n      options: {\n        tolerance: { value: 0.5, min: 0, max: 5, step: 0.1 },\n        sampleSize: { value: 10, min: 2, max: 25, step: 1 },\n      },\n    },\n    'index-range': {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: ValueDesc }\n      ): Point2D[] => {\n        const start = ElementaryMath.minmax(\n          options?.start?.value ?? 0,\n          0,\n          data.length - 1\n        );\n        const end = ElementaryMath.minmax(\n          options?.end?.value ?? data.length,\n          0,\n          data.length - 1\n        );\n        return data.slice(start, end);\n      },\n      options: {\n        start: { value: 0 },\n        end: { value: 20 },\n      },\n    },\n    'x-range': {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: ValueDesc }\n      ): Point2D[] => {\n        const start = options?.start?.value || 0;\n        const end = options?.end?.value || data.length;\n        return data.filter((v) => v.x >= start && v.x <= end);\n      },\n      options: {\n        start: { value: 0 },\n        end: { value: 20 },\n      },\n    },\n    'y-range': {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: ValueDesc }\n      ): Point2D[] => {\n        const y = data.map(p => p.y);\n        const start = options?.start?.value ?? Math.min(...y);\n        const end = options?.end?.value ?? Math.max(...y);\n        return data.filter((v) => v.y >= start && v.y <= end);\n      },\n      options: {\n        start: { value: 0 },\n        end: { value: 20, step: 0.1 },\n      },\n    },\n    diff: {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: ValueDesc }\n      ): Point2D[] => {\n        const points: Point2D[] = [];\n        data.forEach((p, index) => {\n          if (index < data.length - 1) {\n            const pt = data[index + 1].copy();\n            pt.y = (pt.y - p.y) / (pt.x - p.x);\n            points.push(pt);\n          }\n        });\n        return points;\n      },\n      options: {},\n    },\n    'nth-filter': {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: ValueDesc }\n      ): Point2D[] => {\n        const nth = options?.nth?.value ?? 1;\n        return data.filter((_, index) => index % nth === 0);\n      },\n      options: {\n        nth: { value: 1, min: 1, max: 100, step: 1 },\n      },\n    },\n    multiply: {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: ValueDesc }\n      ): Point2D[] => {\n        const k = options?.k?.value ?? 1;\n        return data.map((v) => new Point2D(v.x, v.y * k));\n      },\n      options: {\n        k: { value: 1, step: 0 },\n      },\n    },\n    add: {\n      filter: (\n        data: Point2D[],\n        options: { [option: string]: ValueDesc }\n      ): Point2D[] => {\n        const add = options?.adding?.value ?? 1;\n        return data.map((v) => new Point2D(v.x, v.y + add));\n      },\n      options: {\n        adding: { value: 1, step: 0 },\n      },\n    },\n  };\n\n  protected _filters: FiltersOptions = {};\n\n  protected selected?: string;\n\n  protected lastData?: Point2D[];\n\n  @Input() set filters(filters: FiltersOptions) {\n    this._filters = filters;\n    keysValues(filters).forEach(\n      ([name, value]) => (this.models[name].options = value)\n    );\n  }\n\n  get filters(): FiltersOptions {\n    return this._filters;\n  }\n\n  @Input() translations: { [en: string]: string } = {};\n\n  @Input() allow?: string[];\n\n  @Output() filtersChanged = new EventEmitter<FiltersOptions>();\n\n  constructor(\n    protected file: OblFileService\n  ) {}\n\n  filtering(data: Point2D[]) {\n    this.lastData = data;\n    let copy = data.map((d) => d.copy());\n    const filters = this.models;\n    keysValues(this._filters).forEach(([name, value]) => {\n      filters[name] = { ...value, ...filters[name] };\n      const filter = filters[name];\n      copy = filter.filter(copy, filter);\n    });\n\n    return copy;\n  }\n\n  protected remove(name: string) {\n    delete this._filters[name];\n    this.selected = undefined;\n    this.changed();\n  }\n\n  protected changed() {\n    const filters = keysValues(this.models)\n      .filter(([name]) => this._filters[name])\n      .map(([name, value]) => {\n        return { [name]: { ...value.options } };\n      })\n      .reduce((p, c) => ({ ...p, ...c }), {});\n\n    this.filtersChanged.emit(filters);\n  }\n\n  protected compare = (f: any, s: any) => {\n    return 0;\n  };\n\n  protected download() {\n    const translationPipe = new TranslationPipe();\n    if (this.lastData) {\n      return this.file.saveTextFile(\n        JSON.stringify(this.filtering(this.lastData)),\n        translationPipe.transform('filtered data', this.translations),\n        'application/json'\n      );\n    }\n  }\n}\n","@if ((filters | keyvalue).length) {\n  <fieldset class=\"filters\">\n    <legend>{{ 'Chosen' | oblTranslation : translations }}</legend>\n    <div class=\"items\">\n      @for (filter of filters | keyvalue : compare; track filter.key) {\n        <div\n          class=\"filter\"\n          (click)=\"selected = filter.key\"\n        >\n          <span>{{ filter.key | oblTranslation : translations }}</span>\n          <button oblButton icon=\"cancel\" (click)=\"remove(filter.key); $event.stopPropagation()\"></button>\n        </div>\n      }\n    </div>\n    <div class=\"buttons\">\n      <button oblButton icon=\"save\" (click)=\"download()\"></button>\n      <ng-content></ng-content>\n    </div>\n  </fieldset>\n}\n\n@if ((filters | keyvalue).length !== (allow?.length || (models | keyvalue).length)) {\n  <fieldset class=\"filters\">\n    <legend>{{ 'Others' | oblTranslation : translations }}</legend>\n    <div class=\"items\">\n      @for (filter of models | keyvalue : compare; track filter.key) {\n        @if (!filters[filter.key] && (!allow || allow.includes(filter.key))) {\n          <div\n            class=\"filter\"\n            (click)=\"filters[filter.key] = filter.value.options; changed()\"\n          >\n            <span>{{ filter.key | oblTranslation : translations }}</span>\n          </div>\n        }\n      }\n    </div>\n  </fieldset>\n}\n\n@if (selected && (models[selected].options | keyvalue).length) {\n  <div>\n    <div class=\"head\">\n      {{ 'Edit filter option of name:' | oblTranslation : translations }}\n      {{ selected | oblTranslation : translations }}\n    </div>\n    @for(filter of models[selected].options | keyvalue : compare; track filter.key) {\n      <div class=\"filter-option-control\">\n        <obl-input-wrapper [label]=\"filter.key | oblTranslation : translations\">\n          <input\n            oblInput\n            type=\"number\"\n            [value]=\"filter.value.value\"\n            (change)=\"\n              models[selected].options[filter.key].value = input.valueAsNumber;\n              changed()\n            \"\n            [step]=\"filter.value.step\"\n            [min]=\"filter.value.min\"\n            [max]=\"filter.value.max\"\n            #input\n          />\n        </obl-input-wrapper>\n      </div>\n    }\n  </div>\n}","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { ButtonsModule } from '@obliczeniowo/elementary/buttons';\nimport { TextPipesModule } from '@obliczeniowo/elementary/text-pipes';\nimport { InputModule } from '@obliczeniowo/elementary/input';\nimport { AbsPipe, MinPipe } from '@obliczeniowo/elementary/numeric-pipes';\n\nimport { LinearDiagram2DComponent } from './components/diagram2d/linear-diagram-2d.component';\nimport { DiagramPointHoverComponent } from './components/diagram-point-hover/diagram-point-hover.component';\nimport { DiagramDataFilterComponent } from './components/diagram-data-filter/diagram-data-filter.component';\n\n@NgModule({\n  declarations: [\n    LinearDiagram2DComponent,\n    DiagramPointHoverComponent,\n    DiagramDataFilterComponent,\n  ],\n  imports: [CommonModule, ButtonsModule, TextPipesModule, InputModule, AbsPipe, MinPipe],\n  exports: [\n    LinearDiagram2DComponent,\n    DiagramPointHoverComponent,\n    DiagramDataFilterComponent,\n  ],\n})\nexport class LinearDiagramModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i4"],"mappings":"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"}