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