{"version":3,"file":"obliczeniowo-elementary-drawing.mjs","sources":["../../../../projects/components/drawing/drawing-context-interface.ts","../../../../projects/components/drawing/drawing-canvas-interface.ts","../../../../projects/components/drawing/drawing-svg-interface.ts","../../../../projects/components/drawing/drawing-openscad-interface.ts","../../../../projects/components/drawing/drawing-zwcad-command-interface.ts","../../../../projects/components/drawing/rect.ts","../../../../projects/components/drawing/obliczeniowo-elementary-drawing.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\nimport { ColorType, Point2D } from '@obliczeniowo/elementary/classes';\r\nimport { Size } from '@obliczeniowo/elementary/resize-window';\r\n\r\nexport enum TextAlign {\r\n  LEFT = 'left',\r\n  CENTER = 'center',\r\n  RIGHT = 'right',\r\n  JUSTIFY = 'justify',\r\n}\r\n\r\nexport enum TextBaseline {\r\n  ALPHABETIC = 'alphabetic',\r\n  IDEOGRAPHIC = 'ideographic',\r\n  BOTTOM = 'bottom',\r\n  TOP = 'top',\r\n  MIDDLE = 'middle',\r\n  HANGING = 'hanging',\r\n}\r\n\r\nexport enum LinePattern {\r\n  NONE,\r\n  DOTTED,\r\n  DASHED,\r\n  DASH_DOT,\r\n  DISABLED,\r\n}\r\n\r\nexport interface LinePatternDef {\r\n  strokeMiterlimit: number;\r\n  strokeDasharray: number[];\r\n  strokeDashoffset: number;\r\n}\r\n\r\nexport interface Drawable {\r\n  draw: (ctx: DrawingContextInterface) => void;\r\n}\r\n\r\n/**\r\n * Abstract class to easy cooperate and switch drawing context logic\r\n */\r\nexport abstract class DrawingContextInterface {\r\n  protected lastPoint: Point2D = new Point2D();\r\n  protected arrowScale = 1;\r\n\r\n  /** optional data that can be set after call draw method */\r\n  lastSettings: { text?: Size } = {};\r\n\r\n  /**\r\n   * Some object required clear option before redraw (DrawingSvgInterface for example)\r\n   */\r\n  abstract clear(): void;\r\n\r\n  abstract getTextDimension(text: string): { width: number; height: number };\r\n\r\n  /**\r\n   * Draw line\r\n   * @param startPoint start point\r\n   * @param endPoint end point\r\n   * @param stroke stroke width\r\n   * @param color stroke color as string in format #ffffff or Color object\r\n   * @param options specific for object under the hood object\r\n   */\r\n  abstract drawLine(\r\n    startPoint: Point2D,\r\n    endPoint: Point2D,\r\n    stroke: number,\r\n    color: ColorType,\r\n    options?: any\r\n  ): DrawingContextInterface;\r\n\r\n  /**\r\n   * Draw text\r\n   * @param text text to draw\r\n   * @param handlePosition handle position\r\n   * @param color color as string in format #ffffff or Color object\r\n   * @param angle rotate angle in radians\r\n   * @param options specific options for object under the hood\r\n   */\r\n  abstract drawText(\r\n    text: string,\r\n    handlePosition: Point2D,\r\n    color: ColorType,\r\n    angle: number,\r\n    options?: any\r\n  ): DrawingContextInterface;\r\n\r\n  /**\r\n   * Draw polyline using table of points\r\n   * @param points table of points\r\n   * @param stroke stroke width\r\n   * @param color stroke color as string in format #ffffff or Color object\r\n   * @param options specific for object under hood\r\n   */\r\n  abstract drawPolyline(\r\n    points: Point2D[],\r\n    stroke: number,\r\n    color: ColorType,\r\n    options?: { close?: boolean; [key: string]: any }\r\n  ): DrawingContextInterface;\r\n\r\n  abstract drawPolygon(\r\n    points: Point2D[],\r\n    stroke: number,\r\n    color: ColorType,\r\n    fill: ColorType,\r\n    options?: any\r\n  ): DrawingContextInterface;\r\n\r\n  /**\r\n   * Draw circle\r\n   * @param point center point\r\n   * @param ray ray\r\n   * @param stroke stroke width\r\n   * @param strokeColor stroke color as string in format #ffffff or Color object\r\n   * @param fillColor fill color as string in format #ffffff or Color object\r\n   * @param options options specific for object under the hood\r\n   */\r\n  abstract drawCircle(\r\n    point: Point2D,\r\n    ray: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): DrawingContextInterface;\r\n\r\n  /**\r\n   * Draw pie\r\n   * @param center center\r\n   * @param rx rx\r\n   * @param ry ry (some object could not draw this correctly when rx !== ry)\r\n   * @param start start angle in radians\r\n   * @param end end angle in radians\r\n   * @param stroke stroke width\r\n   * @param strokeColor stroke color as string in format #ffffff or Color object\r\n   * @param fillColor fill color as string in format #ffffff or Color object\r\n   * @param options options specific for object under the hood\r\n   */\r\n  abstract drawPie(\r\n    center: Point2D,\r\n    rx: number,\r\n    ry: number,\r\n    start: number,\r\n    end: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): DrawingContextInterface;\r\n\r\n  /**\r\n   * Draw ellipse\r\n   * @param point center\r\n   * @param xRay x ray\r\n   * @param yRay y ray\r\n   * @param stroke stroke width\r\n   * @param strokeColor stroke color as string in format #ffffff or as Color object\r\n   * @param fillColor fill color as string in format #ffffff or as Color object\r\n   * @param options external options specific for different object under the hood\r\n   */\r\n  abstract drawEllipse(\r\n    point: Point2D,\r\n    xRay: number,\r\n    yRay: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): DrawingContextInterface;\r\n\r\n  /**\r\n   * Draw rectangle\r\n   * @param x coordinate\r\n   * @param y coordinate\r\n   * @param width rect width\r\n   * @param height rect height\r\n   * @param stroke stroke width\r\n   * @param strokeColor stroke color\r\n   * @param fillColor fill color\r\n   * @param options extra options (specific for object under the hood)\r\n   */\r\n  abstract drawRect(\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): DrawingContextInterface;\r\n\r\n  abstract lineTo(\r\n    point: Point2D,\r\n    stroke: number,\r\n    color: ColorType\r\n  ): DrawingContextInterface;\r\n\r\n  /**\r\n   * Set font size\r\n   * @param fontSize font size\r\n   */\r\n  abstract setFontSize(fontSize: number): DrawingContextInterface;\r\n\r\n  /** */\r\n  abstract getFontSize(): number;\r\n\r\n  /**\r\n   * Set text align flag\r\n   * @param align text align enum\r\n   */\r\n  abstract setTextAlign(align: TextAlign): DrawingContextInterface;\r\n\r\n  /**\r\n   * Set text baseline\r\n   * @param textBaseline text baseline enum\r\n   */\r\n  abstract setTextBaseline(textBaseline: TextBaseline): DrawingContextInterface;\r\n\r\n  /**\r\n   * Return text width of given text\r\n   */\r\n  abstract getTextWidth(text: string): number;\r\n\r\n  group(options?: any): this {\r\n    return this;\r\n  }\r\n\r\n  endGroup(): this {\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Set line pattern\r\n   * @param linePattern LinePattern enum or string or undefined to set default patterns\r\n   * @param linePatternDef to set own pattern definition\r\n   */\r\n  abstract setLinePattern(\r\n    linePattern: LinePattern | string | undefined,\r\n    linePatternDef?: LinePatternDef\r\n  ): DrawingContextInterface;\r\n\r\n  moveTo(point: Point2D): this {\r\n    this.lastPoint = point;\r\n    return this;\r\n  }\r\n\r\n  drawArrow(\r\n    startPoint: Point2D,\r\n    endPoint: Point2D,\r\n    stroke: number,\r\n    color: ColorType,\r\n    drawArrow: boolean = true,\r\n    options?: any\r\n  ): this {\r\n    this.group({ name: 'arrow' });\r\n\r\n    this.drawLine(startPoint, endPoint, stroke, color, options);\r\n\r\n    if (drawArrow) {\r\n      let arrowVector = startPoint.subtract(endPoint);\r\n\r\n      arrowVector = arrowVector.multiply(\r\n        10 / arrowVector.length() * this.arrowScale\r\n      );\r\n\r\n      const firstArrowPoint = arrowVector\r\n        .rotate(15 * Math.PI / 180)\r\n        .add(endPoint);\r\n\r\n      const secondArrowPoint = arrowVector\r\n        .rotate(-15 * Math.PI / 180)\r\n        .add(endPoint);\r\n\r\n      this.drawPolyline(\r\n        [firstArrowPoint, endPoint, secondArrowPoint],\r\n        stroke,\r\n        color,\r\n        options\r\n      );\r\n    }\r\n\r\n    this.endGroup();\r\n\r\n    return this;\r\n  }\r\n\r\n  abstract getLineStrokeSize(size?: number): number;\r\n\r\n  abstract save(fileName: string): void;\r\n\r\n  /**\r\n   * Draw all kind of object that implements Drawable interface\r\n   * @param drawable table of object that implements Drawable interface\r\n   */\r\n  draw(drawable: Drawable[]): this {\r\n    drawable.forEach((drawable) => drawable.draw(this));\r\n    return this;\r\n  }\r\n}\r\n","import { Point2D, ColorType } from '@obliczeniowo/elementary/classes';\r\nimport {\r\n  DrawingContextInterface,\r\n  LinePattern,\r\n  LinePatternDef,\r\n  TextAlign,\r\n  TextBaseline,\r\n} from './drawing-context-interface';\r\n\r\nexport class DrawingCanvasInterface extends DrawingContextInterface {\r\n  ctx!: CanvasRenderingContext2D;\r\n\r\n  protected _stroke = 0;\r\n\r\n  public get stroke(): number {\r\n    return this._stroke;\r\n  }\r\n\r\n  public set stroke(value: number) {\r\n    this.ctx.lineWidth = value;\r\n    this._stroke = value;\r\n  }\r\n\r\n  constructor(ctx: CanvasRenderingContext2D) {\r\n    super();\r\n\r\n    this.ctx = ctx;\r\n  }\r\n\r\n  getTextDimension(text: string): { width: number; height: number } {\r\n    const textMetrics = this.ctx.measureText(text);\r\n    return {\r\n      width: textMetrics.width,\r\n      height:\r\n        Math.abs(textMetrics.fontBoundingBoxAscent) +\r\n        Math.abs(textMetrics.fontBoundingBoxDescent),\r\n    };\r\n  }\r\n\r\n  clear(): void {\r\n    const rect = this.ctx.canvas.getBoundingClientRect();\r\n    const pt = this.transform(new Point2D());\r\n    this.ctx.clearRect(pt.x, pt.y, rect.width, rect.height);\r\n  }\r\n\r\n  drawLine(\r\n    startPoint: Point2D,\r\n    endPoint: Point2D,\r\n    stroke: number,\r\n    color: ColorType,\r\n    options?: any\r\n  ): this {\r\n    this.stroke = stroke;\r\n    this.ctx.strokeStyle = color.toString();\r\n    this.ctx.beginPath();\r\n    this.ctx.moveTo(startPoint.x, startPoint.y);\r\n    this.ctx.lineTo(endPoint.x, endPoint.y);\r\n    this.ctx.stroke();\r\n\r\n    return this;\r\n  }\r\n\r\n  drawText(\r\n    text: string,\r\n    handlePosition: Point2D,\r\n    color: ColorType,\r\n    angle: number,\r\n    options?: any\r\n  ): this {\r\n    this.ctx.fillStyle = color.toString();\r\n    this.ctx.save();\r\n    this.ctx.rotate(angle);\r\n    this.ctx.translate(handlePosition.x, handlePosition.y);\r\n    this.ctx.fillText(text, 0, 0);\r\n    this.ctx.restore();\r\n\r\n    return this;\r\n  }\r\n\r\n  drawPolyline(\r\n    points: Point2D[],\r\n    stroke: number,\r\n    color: ColorType,\r\n    options?: { close?: boolean; [key: string]: any }\r\n  ): this {\r\n    this.stroke = stroke;\r\n    this.ctx.strokeStyle = color.toString();\r\n    this.ctx.beginPath();\r\n    if (points.length > 1) {\r\n      this.ctx.moveTo(points[0].x, points[0].y);\r\n      let point;\r\n      for (let i = 1; i < points.length; i++) {\r\n        point = points[i];\r\n        this.ctx.lineTo(point.x, point.y);\r\n      }\r\n      if (options?.close) {\r\n        this.ctx.lineTo(points[0].x, points[0].y);\r\n      }\r\n    }\r\n    this.ctx.stroke();\r\n\r\n    return this;\r\n  }\r\n\r\n  drawPolygon(\r\n    points: Point2D[],\r\n    stroke: number,\r\n    color: ColorType | 'none',\r\n    fill: ColorType | 'none',\r\n    options?: { close?: boolean; [key: string]: any }\r\n  ): this {\r\n    this.stroke = stroke;\r\n    this.ctx.strokeStyle = color.toString();\r\n    this.ctx.beginPath();\r\n    if (points.length > 1) {\r\n      this.ctx.moveTo(points[0].x, points[0].y);\r\n      let point;\r\n      for (let i = 1; i < points.length; i++) {\r\n        point = points[i];\r\n        this.ctx.lineTo(point.x, point.y);\r\n      }\r\n      if (options?.close) {\r\n        this.ctx.lineTo(points[0].x, points[0].y);\r\n      }\r\n    }\r\n    this.ctx.closePath();\r\n    if (color !== 'none') {\r\n      this.ctx.stroke();\r\n    }\r\n    if (fill !== 'none') {\r\n      this.ctx.fill();\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  drawCircle(\r\n    point: Point2D,\r\n    ray: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): this {\r\n    this.ctx.strokeStyle = strokeColor.toString();\r\n    this.stroke = stroke;\r\n    this.ctx.fillStyle = fillColor.toString();\r\n\r\n    const draw = () =>\r\n      this.ctx.ellipse(point.x, point.y, ray, ray, 0, 0, Math.PI * 2);\r\n\r\n    this.path(draw);\r\n    this.path(draw, true);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawPie(\r\n    center: Point2D,\r\n    rx: number,\r\n    ry: number,\r\n    start: number,\r\n    end: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): this {\r\n    if (rx !== ry) {\r\n      console.warn(`Drawing pie with ${rx} !== ${ry} is imposable right now`);\r\n    }\r\n\r\n    this.stroke = stroke;\r\n    this.ctx.strokeStyle = strokeColor.toString();\r\n    this.ctx.fillStyle = fillColor.toString();\r\n    const draw = () => {\r\n      this.ctx.arc(center.x, center.y, rx, start, end);\r\n      this.ctx.lineTo(center.x, center.y);\r\n    };\r\n\r\n    this.path(draw);\r\n    this.path(draw, true);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawEllipse(\r\n    point: Point2D,\r\n    xRay: number,\r\n    yRay: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): this {\r\n    this.ctx.strokeStyle = strokeColor.toString();\r\n    this.stroke = stroke;\r\n    this.ctx.fillStyle = fillColor.toString();\r\n\r\n    const draw = () =>\r\n      this.ctx.ellipse(point.x, point.y, xRay, yRay, 0, 0, Math.PI * 2);\r\n\r\n    this.path(draw);\r\n    this.path(draw, true);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawRect(\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: any\r\n  ): this {\r\n    this.ctx.strokeStyle = strokeColor.toString();\r\n    this.stroke = stroke;\r\n    this.ctx.fillStyle = fillColor.toString();\r\n\r\n    this.ctx.fillRect(x, y, x + width, y + height);\r\n\r\n    return this;\r\n  }\r\n\r\n  lineTo(point: Point2D, stroke: number, color: ColorType): this {\r\n    this.ctx.lineTo(point.x, point.y);\r\n\r\n    return this;\r\n  }\r\n\r\n  setFontSize(fontSize: number): this {\r\n    this.ctx.font = fontSize + 'px';\r\n\r\n    return this;\r\n  }\r\n\r\n  getFontSize(): number {\r\n    const metrics = this.ctx.measureText('Ty');\r\n    return metrics.fontBoundingBoxAscent + metrics.fontBoundingBoxDescent;\r\n  }\r\n\r\n  setTextAlign(align: TextAlign): this {\r\n    this.ctx.textAlign = align as CanvasTextAlign;\r\n\r\n    return this;\r\n  }\r\n\r\n  setTextBaseline(textBaseline: TextBaseline): this {\r\n    this.ctx.textBaseline = textBaseline as CanvasTextBaseline;\r\n\r\n    return this;\r\n  }\r\n\r\n  getTextWidth(text: string): number {\r\n    return this.ctx.measureText(text).width;\r\n  }\r\n\r\n  setLinePattern(\r\n    linePattern: string | LinePattern | undefined,\r\n    linePatternDef?: LinePatternDef\r\n  ): this {\r\n    switch (linePattern) {\r\n      case LinePattern.DASHED:\r\n        this.ctx.setLineDash([4, 2]);\r\n        break;\r\n      case LinePattern.DOTTED:\r\n        this.ctx.setLineDash([2, 1]);\r\n        break;\r\n      case LinePattern.DASH_DOT:\r\n        this.ctx.setLineDash([10, 2, 1, 2]);\r\n        break;\r\n      default:\r\n        if (linePatternDef) {\r\n          this.ctx.setLineDash(linePatternDef.strokeDasharray);\r\n        }\r\n    }\r\n    return this;\r\n  }\r\n\r\n  getLineStrokeSize(size?: number): number {\r\n    if (size) {\r\n      this.stroke = size;\r\n    }\r\n    return this._stroke;\r\n  }\r\n\r\n  transform(point: Point2D): Point2D {\r\n    const m = DOMMatrix.fromMatrix(this.ctx.getTransform());\r\n    m.invertSelf();\r\n\r\n    return new Point2D(\r\n      m.a * point.x + m.b * point.y + m.e,\r\n      m.c * point.x + m.d * point.y + m.f\r\n    );\r\n  }\r\n\r\n  save(fileName: string) {\r\n    const downloadLink = document.createElement('a');\r\n    downloadLink.setAttribute('download', `${fileName}.png`);\r\n    const canvas = this.ctx.canvas;\r\n    const dataURL = canvas.toDataURL('image/png');\r\n    const url = dataURL.replace(/^data:image\\/png/, 'data:application/octet-stream');\r\n    downloadLink.setAttribute('href', url);\r\n    downloadLink.click();\r\n  }\r\n\r\n  protected path(cb: () => void, fillOrStroke?: boolean): void {\r\n    this.ctx.beginPath();\r\n    cb();\r\n    if (fillOrStroke) {\r\n      this.ctx.fill();\r\n    } else {\r\n      this.ctx.stroke();\r\n    }\r\n  }\r\n}\r\n","/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\r\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\nimport { Point2D, ColorType } from '@obliczeniowo/elementary/classes';\r\nimport { ns } from '@obliczeniowo/elementary/svg';\r\nimport { keys } from '@obliczeniowo/elementary/objects';\r\nimport { Size } from '@obliczeniowo/elementary/resize-window';\r\nimport { TextSizePipe } from '@obliczeniowo/elementary/text-pipes';\r\n\r\nimport {\r\n  DrawingContextInterface,\r\n  LinePattern,\r\n  LinePatternDef,\r\n  TextAlign,\r\n  TextBaseline,\r\n} from './drawing-context-interface';\r\nimport { Renderer2 } from '@angular/core';\r\n\r\ninterface SvgOnly {\r\n  classes?: string[];\r\n  events?: { [name: string]: (event: any) => void };\r\n  attributes?: { [name: string]: any };\r\n}\r\n\r\ninterface SvgOptions {\r\n  svgOnly?: SvgOnly;\r\n  [key: string]: any;\r\n}\r\n\r\ninterface SvgPolylineOptions extends SvgOptions {\r\n  close?: boolean;\r\n}\r\n\r\nexport class DrawingSvgInterface extends DrawingContextInterface {\r\n  getTextDimension(text: string): Size {\r\n    return new TextSizePipe().transform(text, this.fontSize) as any;\r\n  }\r\n\r\n  static archPath(\r\n    center: Point2D,\r\n    rx: number,\r\n    ry: number,\r\n    start: number,\r\n    end: number,\r\n    reverse: boolean = false\r\n  ): string | undefined {\r\n    if (Math.abs(start - end) < Math.PI * 2) {\r\n      let flag = start > end ? 1 : 0;\r\n      if (\r\n        Math.abs(start - end) -\r\n          Math.floor(Math.abs(start - end) / (Math.PI * 2)) >\r\n        Math.PI\r\n      ) {\r\n        flag = start > end ? 0 : 1;\r\n      }\r\n\r\n      const fP = new Point2D(\r\n        center.x + rx * Math.cos(start),\r\n        center.y + ry * Math.sin(start)\r\n      );\r\n      const lP = new Point2D(\r\n        center.x + rx * Math.cos(end),\r\n        center.y + ry * Math.sin(end)\r\n      );\r\n\r\n      return (\r\n        'M ' +\r\n        ((reverse ? -lP.x : fP.x) +\r\n          ',' +\r\n          (reverse ? lP.y : fP.y) +\r\n          ' A ' +\r\n          rx +\r\n          ',' +\r\n          ry +\r\n          ' 0 ' +\r\n          flag +\r\n          ' 1 ' +\r\n          (reverse ? -fP.x : lP.x) +\r\n          ',' +\r\n          (reverse ? fP.y : lP.y))\r\n      );\r\n    }\r\n\r\n    return undefined;\r\n  }\r\n\r\n  private readonly svg: SVGSVGElement;\r\n\r\n  private readonly root?: SVGGElement;\r\n\r\n  private xMinimum: number | null = null;\r\n  private xMaximum: number | null = null;\r\n  private yMinimum: number | null = null;\r\n  private yMaximum: number | null = null;\r\n\r\n  private textAnchor: 'start' | 'middle' | 'end' = 'start';\r\n  private linePatternName: string | LinePattern = LinePattern.NONE;\r\n\r\n  private defs!: SVGDefsElement;\r\n\r\n  private readonly linesDefs: Map<string | LinePattern, LinePatternDef> =\r\n    new Map<string | LinePattern, LinePatternDef>();\r\n\r\n  private readonly groups: SVGElement[] = [];\r\n\r\n  private readonly renderer!: Renderer2;\r\n\r\n  fontSize = 10;\r\n\r\n  constructor(svg: SVGSVGElement, renderer: Renderer2) {\r\n    super();\r\n\r\n    this.renderer = renderer;\r\n\r\n    this.svg = svg;\r\n\r\n    const root = svg.querySelector('g.root') as SVGGElement;\r\n\r\n    this.root = root || this.renderer.createElement('g', ns);\r\n\r\n    if (!root) {\r\n      this.svg.appendChild(this.root);\r\n    }\r\n  }\r\n\r\n  private setXMin(value: number): void {\r\n    if (this.xMinimum !== null) {\r\n      if (this.xMinimum >= value) {\r\n        this.xMinimum = value;\r\n      }\r\n    } else {\r\n      this.xMinimum = value;\r\n    }\r\n  }\r\n\r\n  private setYMin(value: number): void {\r\n    if (this.yMinimum !== null) {\r\n      if (this.yMinimum >= value) {\r\n        this.yMinimum = value;\r\n      }\r\n    } else {\r\n      this.yMinimum = value;\r\n    }\r\n  }\r\n\r\n  private setXMax(value: number): void {\r\n    if (this.xMaximum !== null) {\r\n      if (this.xMaximum <= value) {\r\n        this.xMaximum = value;\r\n      }\r\n    } else {\r\n      this.xMaximum = value;\r\n    }\r\n  }\r\n\r\n  private setYMax(value: number): void {\r\n    if (this.yMaximum !== null) {\r\n      if (this.yMaximum <= value) {\r\n        this.yMaximum = value;\r\n      }\r\n    } else {\r\n      this.yMaximum = value;\r\n    }\r\n  }\r\n\r\n  private setMinMax(point: Point2D): void {\r\n    this.setXMin(point.x);\r\n    this.setXMax(point.x);\r\n\r\n    this.setYMin(point.y);\r\n    this.setYMax(point.y);\r\n  }\r\n\r\n  protected setSvgOptions(element: SVGElement, options?: any): void {\r\n    if (options) {\r\n      const { opacity, style } = options;\r\n      const { attributes } = options?.svgOnly || {};\r\n\r\n      if (opacity) {\r\n        element.setAttribute('opacity', options.opacity.toString() || 1);\r\n      }\r\n\r\n      if (attributes) {\r\n        keys(attributes).forEach((name) => {\r\n          element.setAttribute(name, attributes[name]);\r\n        });\r\n      }\r\n\r\n      if (style) {\r\n        keys(options.style).forEach(\r\n          (key: any) => (element.style[key] = options.style?.[key])\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  protected createSvgPoint(point2d: Point2D): DOMPoint {\r\n    const point = this.svg.createSVGPoint();\r\n\r\n    point.x = point2d.x;\r\n    point.y = point2d.y;\r\n\r\n    return point;\r\n  }\r\n\r\n  protected setSvgElementLinePattern(element: SVGElement): void {\r\n    const pattern: LinePatternDef | undefined = this.linesDefs.get(\r\n      this.linePatternName\r\n    );\r\n\r\n    if (pattern) {\r\n      element.style.strokeMiterlimit = pattern.strokeMiterlimit.toString();\r\n      element.style.strokeDasharray = pattern.strokeDasharray.join(', ');\r\n      element.style.strokeDashoffset = pattern.strokeDashoffset.toString();\r\n    }\r\n  }\r\n\r\n  lineTo(point: Point2D, stroke: number, color: ColorType): this {\r\n    this.drawLine(this.lastPoint, point, stroke, color);\r\n\r\n    this.lastPoint = point;\r\n\r\n    return this;\r\n  }\r\n\r\n  setFontSize(fontSize: number): this {\r\n    this.fontSize = fontSize;\r\n\r\n    return this;\r\n  }\r\n\r\n  getFontSize() {\r\n    return this.fontSize;\r\n  }\r\n\r\n  setTextAlign(align: TextAlign): this {\r\n    switch (align) {\r\n      case TextAlign.LEFT:\r\n        this.textAnchor = 'start';\r\n        break;\r\n      case TextAlign.CENTER:\r\n        this.textAnchor = 'middle';\r\n        break;\r\n      case TextAlign.RIGHT:\r\n        this.textAnchor = 'end';\r\n        break;\r\n      default:\r\n        this.textAnchor = 'start';\r\n        break;\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  setTextBaseline(textBaseline: TextBaseline): this {\r\n    return this;\r\n  }\r\n\r\n  getTextWidth(text: string): number {\r\n    const lDiv: HTMLDivElement = this.renderer.createElement('div');\r\n\r\n    document.body.appendChild(lDiv);\r\n\r\n    lDiv.style.fontSize = this.fontSize + 'px';\r\n    lDiv.style.position = 'absolute';\r\n\r\n    lDiv.innerHTML = text;\r\n\r\n    const lResult = {\r\n      width: lDiv.clientWidth,\r\n      height: lDiv.clientHeight,\r\n    };\r\n\r\n    document.body.removeChild(lDiv);\r\n\r\n    return lResult.width;\r\n  }\r\n\r\n  clear(): this {\r\n    const container = this.svgContainer;\r\n    if (this.defs) {\r\n      while (this.defs.hasChildNodes()) {\r\n        this.defs.removeChild(this.defs.firstChild as ChildNode);\r\n      }\r\n    }\r\n    while (container.hasChildNodes()) {\r\n      container.removeChild(container.firstChild as ChildNode);\r\n    }\r\n    return this;\r\n  }\r\n\r\n  setLinePattern(\r\n    linePattern: string | LinePattern | undefined,\r\n    linePatternDef?: LinePatternDef\r\n  ): this {\r\n    if (linePattern && !this.linesDefs.has(linePattern)) {\r\n      switch (linePattern) {\r\n        case LinePattern.DASHED:\r\n          this.linesDefs.set(linePattern, {\r\n            strokeMiterlimit: 4,\r\n            strokeDasharray: [4, 2],\r\n            strokeDashoffset: 0,\r\n          });\r\n          break;\r\n        case LinePattern.DOTTED:\r\n          this.linesDefs.set(linePattern, {\r\n            strokeMiterlimit: 4,\r\n            strokeDasharray: [2, 1],\r\n            strokeDashoffset: 0,\r\n          });\r\n          break;\r\n        case LinePattern.DASH_DOT:\r\n          this.linesDefs.set(linePattern, {\r\n            strokeMiterlimit: 0,\r\n            strokeDasharray: [10, 2, 1, 2],\r\n            strokeDashoffset: 0,\r\n          });\r\n          break;\r\n        default:\r\n          if (linePatternDef) {\r\n            this.linesDefs.set(linePattern, linePatternDef);\r\n          }\r\n      }\r\n    }\r\n\r\n    this.linePatternName = linePattern || LinePattern.NONE;\r\n\r\n    return this;\r\n  }\r\n\r\n  drawLine(\r\n    startPoint: Point2D,\r\n    endPoint: Point2D,\r\n    stroke: number = 1,\r\n    color: ColorType = '#000000',\r\n    options?: SvgOptions\r\n  ): this {\r\n    this.setMinMax(startPoint);\r\n    this.setMinMax(endPoint);\r\n\r\n    const svgPolyline: SVGPolylineElement = this.renderer.createElement(\r\n      'polyline',\r\n      ns\r\n    );\r\n\r\n    if (!this.setClasses(svgPolyline, options)) {\r\n      this.setSvgElementLinePattern(svgPolyline);\r\n      svgPolyline.style.strokeWidth = stroke.toString();\r\n      svgPolyline.style.stroke = this.color(color);\r\n    }\r\n\r\n    svgPolyline.points.appendItem(this.createSvgPoint(startPoint));\r\n\r\n    svgPolyline.points.appendItem(this.createSvgPoint(endPoint));\r\n\r\n    this.setSvgOptions(svgPolyline, options);\r\n\r\n    this.svgContainer.append(svgPolyline);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawCircle(\r\n    point: Point2D,\r\n    ray: number,\r\n    stroke: number = 1,\r\n    strokeColor: ColorType = '#000000',\r\n    fillColor: ColorType = 'none',\r\n    options?: SvgOptions\r\n  ): this {\r\n    const svgCircle: SVGCircleElement = this.renderer.createElement('circle', ns);\r\n\r\n    svgCircle.setAttribute('cx', point.x.toString());\r\n    svgCircle.setAttribute('cy', point.y.toString());\r\n    svgCircle.setAttribute('r', ray.toString());\r\n\r\n    if (!this.setClasses(svgCircle, options)) {\r\n      this.setSvgElementLinePattern(svgCircle);\r\n      svgCircle.style.strokeWidth = stroke.toString();\r\n      svgCircle.style.stroke = this.color(strokeColor);\r\n      svgCircle.style.fill = this.color(fillColor);\r\n    }\r\n\r\n    this.setSvgOptions(svgCircle, options);\r\n\r\n    this.svgContainer.append(svgCircle);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawPie(\r\n    center: Point2D,\r\n    rx: number,\r\n    ry: number,\r\n    start: number,\r\n    end: number,\r\n    stroke: number,\r\n    strokeColor: ColorType = '#000000',\r\n    fillColor: ColorType = 'none',\r\n    options?: SvgOptions\r\n  ): this {\r\n    let element;\r\n    if (Math.abs(start - end) < Math.PI * 2) {\r\n      let flag = 0;\r\n      if (\r\n        Math.abs(start - end) -\r\n          Math.floor(Math.abs(start - end) / (Math.PI * 2)) >\r\n        Math.PI\r\n      ) {\r\n        flag = 1;\r\n      }\r\n\r\n      element = this.renderer.createElement('path', ns);\r\n\r\n      element.setAttribute(\r\n        'd',\r\n        'M ' +\r\n          (center.x +\r\n            rx * Math.cos(start) +\r\n            ',' +\r\n            (center.y + ry * Math.sin(start)) +\r\n            ' A ' +\r\n            rx +\r\n            ',' +\r\n            ry +\r\n            ' 0 ' +\r\n            flag +\r\n            ' 1 ' +\r\n            (center.x + rx * Math.cos(end)) +\r\n            ',' +\r\n            (center.y + ry * Math.sin(end)) +\r\n            ' L ' +\r\n            center.x +\r\n            ',' +\r\n            center.y +\r\n            'z')\r\n      );\r\n    } else {\r\n      element = this.renderer.createElement('ellipse', ns);\r\n      element.setAttribute('cx', center.x.toString());\r\n      element.setAttribute('cy', center.y.toString());\r\n      element.setAttribute('rx', rx.toString());\r\n      element.setAttribute('ry', ry.toString());\r\n    }\r\n\r\n    this.setSvgElementLinePattern(element);\r\n\r\n    if (!this.setClasses(element, options)) {\r\n      element.style.strokeWidth = stroke.toString();\r\n      element.style.stroke = this.color(strokeColor);\r\n      element.style.fill = this.color(fillColor);\r\n    }\r\n\r\n    this.svgContainer.append(element);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawArch(\r\n    center: Point2D,\r\n    rx: number,\r\n    ry: number,\r\n    start: number,\r\n    end: number,\r\n    stroke: number,\r\n    strokeColor: ColorType = '#000000',\r\n    options?: SvgOptions\r\n  ): this {\r\n    let element;\r\n    const path = DrawingSvgInterface.archPath(center, rx, ry, start, end);\r\n    if (path) {\r\n      element = this.renderer.createElement('path', ns);\r\n\r\n      element.setAttribute('d', path);\r\n    } else {\r\n      element = this.renderer.createElement('ellipse', ns);\r\n      element.setAttribute('cx', center.x.toString());\r\n      element.setAttribute('cy', center.y.toString());\r\n      element.setAttribute('rx', rx.toString());\r\n      element.setAttribute('ry', ry.toString());\r\n    }\r\n\r\n    if (!this.setClasses(element, options)) {\r\n      this.setSvgElementLinePattern(element);\r\n\r\n      element.style.strokeWidth = stroke.toString();\r\n      element.style.stroke = this.color(strokeColor);\r\n      element.style.fill = 'none';\r\n    }\r\n\r\n    this.svgContainer.append(element);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawEllipse(\r\n    point: Point2D,\r\n    xRay: number,\r\n    yRay: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: SvgOptions\r\n  ): this {\r\n    const svgEllipse: SVGEllipseElement = this.renderer.createElement(\r\n      'ellipse',\r\n      ns\r\n    );\r\n\r\n    svgEllipse.setAttribute('cx', point.x.toString());\r\n    svgEllipse.setAttribute('cy', point.y.toString());\r\n    svgEllipse.setAttribute('rx', xRay.toString());\r\n    svgEllipse.setAttribute('ry', yRay.toString());\r\n\r\n    if (!this.setClasses(svgEllipse, options)) {\r\n      this.setSvgElementLinePattern(svgEllipse);\r\n\r\n      svgEllipse.style.strokeWidth = stroke.toString();\r\n      svgEllipse.style.stroke = this.color(strokeColor);\r\n      svgEllipse.style.fill = this.color(fillColor);\r\n    }\r\n\r\n    this.setSvgOptions(svgEllipse, options);\r\n\r\n    this.svgContainer.append(svgEllipse);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawRect(\r\n    x: number,\r\n    y: number,\r\n    width: number,\r\n    height: number,\r\n    stroke: number,\r\n    strokeColor: ColorType,\r\n    fillColor: ColorType,\r\n    options?: SvgOptions\r\n  ): this {\r\n    const svgRect: SVGRectElement = this.renderer.createElement('rect', ns);\r\n\r\n    svgRect.setAttribute('x', x.toString());\r\n    svgRect.setAttribute('y', y.toString());\r\n    svgRect.setAttribute('width', width.toString());\r\n    svgRect.setAttribute('height', height.toString());\r\n\r\n    if (!this.setClasses(svgRect, options)) {\r\n      this.setSvgElementLinePattern(svgRect);\r\n\r\n      svgRect.style.strokeWidth = stroke.toString();\r\n      svgRect.style.stroke = this.color(strokeColor);\r\n      svgRect.style.fill = this.color(fillColor);\r\n    }\r\n\r\n    this.setSvgOptions(svgRect, options);\r\n\r\n    this.svgContainer.append(svgRect);\r\n\r\n    return this;\r\n  }\r\n\r\n  get svgContainer(): SVGGElement {\r\n    return ((this.groups.length && this.groups[this.groups.length - 1]) ||\r\n      this.root) as SVGGElement;\r\n  }\r\n\r\n  drawText(\r\n    text: string,\r\n    handlePosition: Point2D,\r\n    color: ColorType = '#000000',\r\n    angle: number = 0,\r\n    options?: SvgOptions\r\n  ): this {\r\n    text = text.replace(/&nbsp;/g, ' ');\r\n    this.setMinMax(handlePosition);\r\n    const svgText: SVGTextElement = this.renderer.createElement('text', ns);\r\n\r\n    svgText.innerHTML = text;\r\n\r\n    svgText.setAttribute('x', handlePosition.x.toString());\r\n    svgText.setAttribute('y', handlePosition.y.toString());\r\n    svgText.setAttribute('text-anchor', this.textAnchor);\r\n\r\n    svgText.style.fontSize = `${this.fontSize}px`;\r\n\r\n    if (angle) {\r\n      svgText.style.transform = `translate(${handlePosition.x}px, ${\r\n        handlePosition.y\r\n      }px) rotate(${-angle}deg) translate(${-handlePosition.x}px, ${-handlePosition.y}px)`;\r\n    }\r\n\r\n    if (!this.setClasses(svgText, options)) {\r\n      svgText.style.fill = this.color(color);\r\n    }\r\n\r\n    this.setSvgOptions(svgText, options);\r\n\r\n    this.svgContainer.append(svgText);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawPolyline(\r\n    points: Point2D[],\r\n    stroke: number = 1,\r\n    color: ColorType = '#000000',\r\n    options?: SvgPolylineOptions\r\n  ): this {\r\n    const svgPolyline: SVGPolylineElement = this.renderer.createElement(\r\n      'polyline',\r\n      ns\r\n    );\r\n\r\n    if (!this.setClasses(svgPolyline, options as any)) {\r\n      svgPolyline.style.strokeWidth = stroke.toString();\r\n      svgPolyline.style.stroke = this.color(color);\r\n      svgPolyline.style.fill = 'none';\r\n\r\n      this.setSvgElementLinePattern(svgPolyline);\r\n    }\r\n\r\n    points.forEach((point) => {\r\n      svgPolyline.points.appendItem(this.createSvgPoint(point));\r\n      this.setMinMax(point);\r\n    });\r\n\r\n    if (points.length && options?.close) {\r\n      svgPolyline.points.appendItem(this.createSvgPoint(points[0]));\r\n    }\r\n\r\n    this.setSvgOptions(svgPolyline, options);\r\n\r\n    this.svgContainer.append(svgPolyline);\r\n\r\n    return this;\r\n  }\r\n\r\n  drawPolygon(\r\n    points: Point2D[],\r\n    stroke: number,\r\n    color: ColorType | 'none',\r\n    fill: ColorType | 'none',\r\n    options?: any\r\n  ): this {\r\n    const polygon: SVGPolygonElement = this.renderer.createElement('polygon', ns);\r\n\r\n    if (!this.setClasses(polygon, options as any)) {\r\n      polygon.style.strokeWidth = stroke.toString();\r\n      polygon.style.stroke = this.color(color);\r\n      polygon.style.fill = fill.toString();\r\n\r\n      this.setSvgElementLinePattern(polygon);\r\n    }\r\n\r\n    points.forEach((point) => {\r\n      polygon.points.appendItem(this.createSvgPoint(point));\r\n      this.setMinMax(point);\r\n    });\r\n\r\n    this.setSvgOptions(polygon, options);\r\n\r\n    this.svgContainer.append(polygon);\r\n\r\n    return this;\r\n  }\r\n\r\n  get width(): number {\r\n    if (this.xMaximum !== null && this.xMinimum !== null) {\r\n      return this.xMaximum - this.xMinimum;\r\n    }\r\n    return 1000;\r\n  }\r\n\r\n  get height(): number {\r\n    if (this.yMaximum !== null && this.yMinimum !== null) {\r\n      return this.yMaximum - this.yMinimum;\r\n    }\r\n    return 1000;\r\n  }\r\n\r\n  getSvg(): string {\r\n    return this.svg.innerHTML;\r\n  }\r\n\r\n  group(options?: {\r\n    name?: string,\r\n    data?: { [key: string]: string },\r\n    clipRect?: {\r\n      pos: Point2D,\r\n      width: number,\r\n      height: number\r\n    },\r\n    svgOnly?: SvgOnly,\r\n    onMouseOver?: (g: SVGElement) => void,\r\n    onMouseOut?: () => void\r\n  }): this {\r\n    const g = this.renderer.createElement('g', ns);\r\n    const { svgOnly } = options || {};\r\n\r\n    if (svgOnly) {\r\n      const { events } = svgOnly;\r\n      if (events) {\r\n        keys(events).forEach((event) => {\r\n          (g as any)[`on${event}`] = events[event];\r\n        });\r\n      }\r\n    }\r\n\r\n    if (g) {\r\n      g.onmouseover = () => options?.onMouseOver && options?.onMouseOver(g);\r\n      g.onmouseleave = () => options?.onMouseOut && options?.onMouseOut();\r\n    }\r\n\r\n    if (options?.data) {\r\n      keys(options.data).forEach(\r\n        (key) => (g.dataset[key] = options?.data?.[key] || '')\r\n      );\r\n    }\r\n\r\n    if (options?.clipRect) {\r\n      if (!this.defs) {\r\n        this.defs = this.renderer.createElement('defs', ns);\r\n        if (this.svgContainer.firstChild) {\r\n          this.svgContainer.insertBefore(\r\n            this.defs,\r\n            this.svgContainer.firstChild\r\n          );\r\n        } else {\r\n          this.svgContainer.appendChild(this.defs);\r\n        }\r\n      } else if (!this.svgContainer.querySelector('defs')) {\r\n        this.svgContainer.appendChild(this.defs);\r\n      }\r\n\r\n      const clipPath = this.renderer.createElement('clipPath', ns);\r\n\r\n      const rect = this.renderer.createElement('rect', ns);\r\n\r\n      rect.setAttribute('x', options.clipRect.pos.x.toString());\r\n      rect.setAttribute('y', options.clipRect.pos.y.toString());\r\n      rect.setAttribute('width', options.clipRect.width.toString());\r\n      rect.setAttribute('height', options.clipRect.height.toString());\r\n\r\n      const id = 'ClipRect' + Math.floor(Math.random() * 10000000) + '-' + Math.floor(Math.random() * 10000000) + '-' + Math.floor(Math.random() * 10000000);\r\n\r\n      clipPath.setAttribute('id', id);\r\n\r\n      clipPath.appendChild(rect);\r\n\r\n      this.defs.appendChild(clipPath);\r\n\r\n      g.style.clipPath = 'url(#' + id + ')';\r\n    }\r\n\r\n    if (options?.name) {\r\n      g.classList.add(options.name);\r\n    }\r\n\r\n    this.setSvgOptions(g, options);\r\n\r\n    this.groups.push(g);\r\n\r\n    return this;\r\n  }\r\n\r\n  endGroup(): this {\r\n    if (this.groups.length) {\r\n      const gr = this.groups.pop();\r\n      if (gr) {\r\n        this.svgContainer.appendChild(gr);\r\n      }\r\n    }\r\n\r\n    return this;\r\n  }\r\n\r\n  getLineStrokeSize(size?: number): number {\r\n    return size || 1;\r\n  }\r\n\r\n  save(fileName: string) {\r\n    const file = new window.Blob([this.getSvg()], { type: 'image/svg+xml' });\r\n\r\n    const downloadAnchor = document.createElement('a');\r\n    const fileURL = URL.createObjectURL(file);\r\n\r\n    downloadAnchor.href = fileURL;\r\n    downloadAnchor.download = fileName + '.svg';\r\n    downloadAnchor.click();\r\n  }\r\n\r\n  protected setClasses(element: SVGElement, options?: SvgOptions): boolean {\r\n    const { svgOnly } = options || {};\r\n    if (svgOnly) {\r\n      const { events } = svgOnly;\r\n      if (events) {\r\n        keys(events).forEach((key) => {\r\n          (element as any)['on' + key] = events[key];\r\n        });\r\n      }\r\n\r\n      if (svgOnly?.classes?.length) {\r\n        svgOnly.classes.forEach((cls) => element.classList.add(cls));\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  protected color(color: ColorType): string {\r\n    return typeof color === 'string' ? color : color.html;\r\n  }\r\n}\r\n","import { Point2D, ColorType, ColorRGB } from '@obliczeniowo/elementary/classes';\r\nimport { DrawingContextInterface, LinePattern, LinePatternDef, TextAlign, TextBaseline } from './drawing-context-interface';\r\nimport { keys } from '@obliczeniowo/elementary/objects';\r\nimport { ElementaryMath } from '@obliczeniowo/elementary/math';\r\n\r\ninterface ModuleDef {\r\n  value: string;\r\n  added: boolean;\r\n}\r\n\r\nexport class DrawingOpenScadInterface extends DrawingContextInterface {\r\n  protected openScad: string = '';\r\n\r\n  protected textAlign: TextAlign = TextAlign.LEFT;\r\n\r\n  protected textBaseline: TextBaseline = TextBaseline.ALPHABETIC;\r\n\r\n  protected fontSize: number = 10;\r\n\r\n  protected groups: boolean[] = [];\r\n\r\n  protected modules: { [module: string]: ModuleDef } = {\r\n    line: {\r\n      value: `module line(start, end, thickness = 1) {\r\nhull() {\r\n    translate(start) circle(thickness);\r\n    translate(end) circle(thickness);\r\n  }\r\n}\\n\\n`,\r\n    added: false\r\n  },\r\n    pie: {\r\n      value: `module pieSlice(r=1.0, a=20) {\r\n  polygon(points=[\r\n    [0, 0],\r\n    for(theta=0; theta<a; theta=theta+$fa)\r\n      [r*cos(theta), r*sin(theta)],\r\n    [r*cos(a), r*sin(a)]\r\n  ]);\r\n}\\n\\n`,\r\n      added: false\r\n    }\r\n  }\r\n\r\n  clear(): void {\r\n    this.openScad = '';\r\n    keys(this.modules).forEach((key: string) => this.modules[key].added = false);\r\n  }\r\n\r\n  getTextDimension(text: string): { width: number; height: number } {\r\n    return { width: this.getTextWidth(text), height: this.getFontSize() };\r\n  }\r\n\r\n  drawLine(startPoint: Point2D, endPoint: Point2D, stroke: number, color: ColorType, options?: any): DrawingContextInterface {\r\n    if (!this.modules.line.added) {\r\n      this.openScad += this.modules.line.value;\r\n      this.modules.line.added = true;\r\n    }\r\n    this.setColor(color);\r\n    this.openScad += `\\nline([${startPoint.x}, ${startPoint.y}], [${endPoint.x}, ${endPoint.y}], thickness=${stroke});\\n`;\r\n    return this;\r\n  }\r\n\r\n  setColor(color: ColorType): DrawingContextInterface {\r\n    const converted = ColorRGB.fromHex(typeof color === 'string' ? color : color.hex);\r\n    this.openScad += `color([${converted.red / 255}, ${converted.green / 255}, ${converted.blue / 255}])\\n`;\r\n    return this;\r\n  }\r\n\r\n  drawText(text: string, handlePosition: Point2D, color: ColorType, angle: number, options?: any): DrawingContextInterface {\r\n    const mapping = {\r\n      [TextAlign.CENTER]: 'center',\r\n      [TextAlign.JUSTIFY]: 'left',\r\n      [TextAlign.LEFT]: 'left',\r\n      [TextAlign.RIGHT]: 'right'\r\n    }\r\n    this.setColor(color);\r\n    this.openScad += `\r\ntranslate([${handlePosition.x}, ${handlePosition.y}])\r\nscale([-1, 1, 1])\r\nrotate(${angle + 180})\r\ntext(\"${text}\", size=${this.getFontSize()}, halign=\"${mapping[this.textAlign]}\");\r\n\\n`;\r\n    return this;\r\n  }\r\n\r\n  drawPolyline(points: Point2D[], stroke: number, color: ColorType, options?: { close?: boolean;[key: string]: any }): DrawingContextInterface {\r\n    this.setColor(color);\r\n    this.openScad += '{\\n';\r\n    points.forEach((point, index) => index > 0 ? this.drawLine(point, points[index - 1], stroke, color) : '');\r\n    this.openScad += '\\n}';\r\n    return this;\r\n  }\r\n\r\n  drawPolygon(points: Point2D[], stroke: number, color: ColorType, fill: ColorType, options?: any): DrawingContextInterface {\r\n    this.setColor(fill);\r\n    this.openScad += `polygon(points=${points.map(point => `[${point.x}, ${point.y}}]`).join(',')};\\n`;\r\n    return this;\r\n  }\r\n\r\n  drawCircle(point: Point2D, ray: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    this.setColor(fillColor);\r\n    this.openScad += `translate([${point.x}, ${point.y})\\n`;\r\n    this.openScad += `circle(r=${ray});\\n`;\r\n\r\n    return this;\r\n  }\r\n\r\n  drawPie(center: Point2D, rx: number, ry: number, start: number, end: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    if (!this.modules.pie.added) {\r\n      this.openScad += this.modules.pie.value;\r\n      this.modules.pie.added = true;\r\n    }\r\n    this.setColor(fillColor);\r\n    this.openScad += `translate([${center.x}, ${center.y}]) \\n`;\r\n    this.openScad += `scale([1, ${ry / rx}, 0])\\n`;\r\n    this.openScad += `rotate([0, 0, ${ElementaryMath.radiansToDegrees(start)}]) \\n`;\r\n    this.openScad += `pieSlice(r=${rx}, a=${ElementaryMath.radiansToDegrees(end - start)});\\n`;\r\n\r\n    return this;\r\n  }\r\n\r\n  drawEllipse(point: Point2D, xRay: number, yRay: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    this.setColor(fillColor);\r\n    this.openScad += `scale([1, ${yRay / xRay}, 0])\\n`;\r\n    this.openScad += `translate([${point.x}, ${point.y}]) \\n`;\r\n    this.openScad += `circle(r=${xRay});\\n`;\r\n\r\n    return this;\r\n  }\r\n\r\n  drawRect(x: number, y: number, width: number, height: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    this.setColor(fillColor);\r\n    this.openScad += `translate([${x}, ${y}]) \\n`;\r\n    this.openScad += `square([${width}, ${height}]);\\n`;\r\n\r\n    return this;\r\n  }\r\n\r\n  lineTo(point: Point2D, stroke: number, color: ColorType): DrawingContextInterface {\r\n    this.drawLine(this.lastPoint, point, stroke, color);\r\n    this.moveTo(point);\r\n    return this;\r\n  }\r\n\r\n  setFontSize(fontSize: number): DrawingContextInterface {\r\n    this.fontSize = fontSize;\r\n    return this;\r\n  }\r\n\r\n  getFontSize(): number {\r\n    return this.fontSize;\r\n  }\r\n\r\n  setTextAlign(align: TextAlign): DrawingContextInterface {\r\n    this.textAlign = align;\r\n    return this;\r\n  }\r\n\r\n  setTextBaseline(textBaseline: TextBaseline): DrawingContextInterface {\r\n    this.textBaseline = textBaseline;\r\n    return this;\r\n  }\r\n\r\n  getTextWidth(text: string): number {\r\n    return text.length * this.fontSize * 0.8;\r\n  }\r\n\r\n  setLinePattern(linePattern: LinePattern | string | undefined, linePatternDef?: LinePatternDef): DrawingContextInterface {\r\n    console.log('WARING: this method can not be implemented for OpenScad format')\r\n    return this;\r\n  }\r\n\r\n  getLineStrokeSize(size?: number): number {\r\n    return 0;\r\n  }\r\n\r\n  save(fileName: string): this {\r\n    const file = new window.Blob([this.openScad], { type: 'text/plain' });\r\n\r\n    const downloadAnchor = document.createElement('a');\r\n    const fileURL = URL.createObjectURL(file);\r\n\r\n    downloadAnchor.href = fileURL;\r\n    downloadAnchor.download = fileName + '.scad';\r\n    downloadAnchor.click();\r\n\r\n    return this;\r\n  }\r\n}\r\n","import { Point2D, ColorType } from '@obliczeniowo/elementary/classes';\r\nimport { DrawingContextInterface, LinePattern, LinePatternDef, TextAlign, TextBaseline } from './drawing-context-interface';\r\nimport { ElementaryMath } from '@obliczeniowo/elementary/math';\r\n\r\nexport class DrawingZwCadCommandInterface extends DrawingContextInterface {\r\n  protected data: string = '';\r\n\r\n  protected textAlign: TextAlign = TextAlign.LEFT;\r\n\r\n  protected fontSize: number = 10;\r\n\r\n  clear(): void {\r\n      this.data = '';\r\n  }\r\n\r\n  getTextDimension(text: string): { width: number; height: number } {\r\n    return { width: this.getTextWidth(text), height: this.getFontSize() };\r\n  }\r\n\r\n  drawLine(startPoint: Point2D, endPoint: Point2D, stroke: number, color: ColorType, options?: any): DrawingContextInterface {\r\n    this.data += '_line\\r\\n' +\r\n      `${startPoint.x},${startPoint.y}\\r\\n` +\r\n      `${endPoint.x},${endPoint.y}\\r\\n\\r\\n`;\r\n    return this;\r\n  }\r\n\r\n  drawText(text: string, handlePosition: Point2D, color: ColorType, angle: number, options?: any): DrawingContextInterface {\r\n    console.warn('cant implement ZwCad command for adding text');\r\n    return this;\r\n  }\r\n\r\n  drawPolyline(points: Point2D[], stroke: number, color: ColorType, options?: { close?: boolean;[key: string]: any }): DrawingContextInterface {\r\n    this.data += 'polyline\\r\\n' +\r\n      `${points.map(point => `${point.x},${point.y}`).join('\\r\\n')}\\r\\n\\r\\n`;\r\n    return this;\r\n  }\r\n\r\n  drawPolygon(points: Point2D[], stroke: number, color: ColorType, fill: ColorType, options?: any): DrawingContextInterface {\r\n    if (points.length) {\r\n      this.data += 'polyline' +\r\n        points.map(point => `${point.x},${point.y}`).join('\\r\\n') +\r\n        `${points[0].x},${points[0].y}\\r\\n\\r\\n`;\r\n    }\r\n    return this;\r\n  }\r\n\r\n  drawCircle(point: Point2D, ray: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    this.data += '_circle\\r\\n' +\r\n      `${point.x},${point.y}\\r\\n` +\r\n      `${ray}\\r\\n`;\r\n    return this;\r\n  }\r\n\r\n  drawPie(center: Point2D, rx: number, ry: number, start: number, end: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    const startCos = Math.cos(start);\r\n    const startSin = Math.sin(start);\r\n    const endCos = Math.cos(end);\r\n    const endSin = Math.sin(end);\r\n\r\n    const ellipseRay = (cos: number, sin: number) => {\r\n      return Math.sqrt(rx * rx * ry * ry / (rx * rx * cos * cos + ry * ry * sin * sin));\r\n    }\r\n\r\n    const startRay = ellipseRay(startCos, startSin);\r\n    const endRay = ellipseRay(endCos, endSin);\r\n\r\n    this.data += '_ellipse\\r\\n' +\r\n      '_a\\r\\n' +\r\n      '_c\\r\\n' +\r\n      `${center.x},${center.y}\\r\\n` +\r\n      `${center.x + rx},${center.y}\\r\\n` +\r\n      `${center.x},${center.y + ry}\\r\\n` +\r\n      `${ElementaryMath.radiansToDegrees(start)}\\r\\n` +\r\n      `${ElementaryMath.radiansToDegrees(end)}\\r\\n`;\r\n    this.drawPolyline([\r\n      new Point2D(center.x + startRay * startCos, center.y + startRay * startSin),\r\n      center,\r\n      new Point2D(center.x + endRay * endCos, center.y + endRay * endSin),\r\n    ], stroke, strokeColor)\r\n    return this;\r\n  }\r\n\r\n  drawEllipse(point: Point2D, xRay: number, yRay: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    this.data += '_ellipse\\r\\n' +\r\n      '_c\\r\\n' +\r\n      `${point.x},${point.y}\\r\\n` +\r\n      `${point.x + xRay},${point.y}\\r\\n` +\r\n      `${point.x},${point.y + yRay}\\r\\n`;\r\n    return this;\r\n  }\r\n\r\n  drawRect(x: number, y: number, width: number, height: number, stroke: number, strokeColor: ColorType, fillColor: ColorType, options?: any): DrawingContextInterface {\r\n    this.data += '_rectangle\\r\\n' +\r\n      `${x}${y}\\r\\n` +\r\n      `${x + width}${y + height}\\r\\n\\r\\n`\r\n    return this;\r\n  }\r\n\r\n  lineTo(point: Point2D, stroke: number, color: ColorType): DrawingContextInterface {\r\n    this.drawLine(this.lastPoint, point, stroke, color);\r\n    this.lastPoint = point.copy();\r\n    return this;\r\n  }\r\n\r\n  setFontSize(fontSize: number): DrawingContextInterface {\r\n    this.fontSize = fontSize;\r\n    return this;\r\n  }\r\n\r\n  getFontSize(): number {\r\n    return this.fontSize;\r\n  }\r\n\r\n  setTextAlign(align: TextAlign): DrawingContextInterface {\r\n    this.textAlign = align;\r\n    return this;\r\n  }\r\n\r\n  setTextBaseline(textBaseline: TextBaseline): DrawingContextInterface {\r\n    return this;\r\n  }\r\n\r\n  getTextWidth(text: string): number {\r\n    return text.length * this.fontSize * 0.8;\r\n  }\r\n\r\n  setLinePattern(linePattern: LinePattern | string | undefined, linePatternDef?: LinePatternDef): DrawingContextInterface {\r\n    console.log('WARING: this method can not be implemented for ZwCad command format')\r\n    return this;\r\n  }\r\n\r\n  getLineStrokeSize(size?: number): number {\r\n    return 0;\r\n  }\r\n\r\n  save(fileName: string): this {\r\n    const file = new window.Blob([this.data], { type: 'text/plain' });\r\n\r\n    const downloadAnchor = document.createElement('a');\r\n    const fileURL = URL.createObjectURL(file);\r\n\r\n    downloadAnchor.href = fileURL;\r\n    downloadAnchor.download = fileName + '.txt';\r\n    downloadAnchor.click();\r\n\r\n    return this;\r\n  }\r\n}\r\n","import { Point2D } from '@obliczeniowo/elementary/classes';\r\n\r\nexport class Rect {\r\n  x: number;\r\n  y: number;\r\n  width: number;\r\n  height: number;\r\n\r\n  constructor(\r\n    firstPoint: Point2D,\r\n    secondPoint: Point2D,\r\n    dx: number = 0,\r\n    dy: number = 0\r\n  ) {\r\n    this.x = Math.min(firstPoint.x, secondPoint.x) - dx;\r\n    this.y = Math.min(firstPoint.y, secondPoint.y) - dy;\r\n\r\n    this.width = Math.abs(firstPoint.x - secondPoint.x) + dx * 2;\r\n    this.height = Math.abs(firstPoint.y - secondPoint.y) + dy * 2;\r\n  }\r\n\r\n  isPtInRect(point: Point2D): boolean {\r\n    return this.x <= point.x && this.x + this.width >= point.x && this.y <= point.y && this.y + this.height >= point.y;\r\n  }\r\n\r\n  add(rect: Rect): Rect {\r\n    return new Rect(\r\n      new Point2D(\r\n        Math.min(this.x, rect.x),\r\n        Math.min(this.y, rect.y)\r\n      ),\r\n      new Point2D(\r\n        Math.max(this.x + this.width, rect.x + rect.width),\r\n        Math.max(this.y + this.height, rect.y + rect.height)\r\n      )\r\n    );\r\n  }\r\n\r\n  addOffset(left: number, right: number, top: number, bottom: number): void {\r\n    this.x -= left;\r\n    this.y -= top;\r\n    this.width += left + right;\r\n    this.height += top + bottom;\r\n  }\r\n\r\n  fillRect(ctx: CanvasRenderingContext2D): void {\r\n    ctx.fillRect(\r\n      this.x,\r\n      this.y,\r\n      this.width,\r\n      this.height\r\n    );\r\n  }\r\n\r\n  strokeRect(ctx: CanvasRenderingContext2D): void {\r\n    ctx.strokeRect(\r\n      this.x,\r\n      this.y,\r\n      this.width,\r\n      this.height\r\n    );\r\n  }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}