{
  "version": 3,
  "sources": ["../src/entityToPolyline.ts"],
  "sourcesContent": ["import bSpline from './util/bSpline'\nimport createArcForLWPolyine from './util/createArcForLWPolyline'\nimport logger from './util/logger'\n\nimport type {\n  ArcEntity,\n  CircleEntity,\n  ControlPoint,\n  EllipseEntity,\n  EntityToPolylineOptions,\n  HandlerVertex,\n  LeaderEntity,\n  LineEntity,\n  RayEntity,\n  ShapeEntity,\n  SplineEntity,\n  WipeoutEntity,\n  XLineEntity,\n} from './types'\nimport type { PointTuple } from './types/common'\n\n// Re-export types for backward compatibility\nexport type { ControlPoint, EntityToPolylineOptions } from './types'\n\ntype Point = PointTuple\n\n// Local vertex type with required coordinates for runtime processing\ninterface LocalVertex extends HandlerVertex {\n  faces?: number[]\n}\n\n// Local polyline type that uses our vertex with required coordinates\ninterface LocalPolylineEntity {\n  type: string\n  vertices: LocalVertex[]\n  closed?: boolean\n  polyfaceMesh?: boolean\n  polygonMesh?: boolean\n}\n\ntype Entity =\n  | LineEntity\n  | LeaderEntity\n  | RayEntity\n  | XLineEntity\n  | ShapeEntity\n  | WipeoutEntity\n  | (LocalPolylineEntity & { type: 'LWPOLYLINE' | 'POLYLINE' })\n  | {\n      type: 'SOLID' | 'TRACE'\n      corners?: Array<{ x: number; y: number }>\n      points?: Array<{ x: number; y: number }>\n    }\n  | CircleEntity\n  | EllipseEntity\n  | ArcEntity\n  | SplineEntity\n\n/**\n * Rotate a set of points.\n *\n * @param points the points\n * @param angle the rotation angle\n */\nconst rotate = (points: Point[], angle: number): Point[] => {\n  return points.map(function (p) {\n    return [\n      p[0] * Math.cos(angle) - p[1] * Math.sin(angle),\n      p[1] * Math.cos(angle) + p[0] * Math.sin(angle),\n    ]\n  })\n}\n\n/**\n * Interpolate an ellipse\n * @param cx center X\n * @param cy center Y\n * @param rx radius X\n * @param ry radius Y\n * @param start start angle in radians\n * @param start end angle in radians\n */\nconst interpolateEllipse = (\n  cx: number,\n  cy: number,\n  rx: number,\n  ry: number,\n  start: number,\n  end: number,\n  rotationAngle?: number\n): Point[] => {\n  if (end < start) {\n    end += Math.PI * 2\n  }\n\n  // ----- Relative points -----\n\n  // Start point\n  let points: Point[] = []\n  const dTheta = (Math.PI * 2) / 72\n  const EPS = 1e-6\n  for (let theta = start; theta < end - EPS; theta += dTheta) {\n    points.push([Math.cos(theta) * rx, Math.sin(theta) * ry])\n  }\n  points.push([Math.cos(end) * rx, Math.sin(end) * ry])\n\n  // ----- Rotate -----\n  if (rotationAngle) {\n    points = rotate(points, rotationAngle)\n  }\n\n  // ----- Offset center -----\n  points = points.map(function (p): Point {\n    return [cx + p[0], cy + p[1]]\n  })\n\n  return points\n}\n\n/**\n * Interpolate a b-spline. The algorithm examins the knot vector\n * to create segments for interpolation. The parameterisation value\n * is re-normalised back to [0,1] as that is what the lib expects (\n * and t i de-normalised in the b-spline library)\n *\n * @param controlPoints the control points\n * @param degree the b-spline degree\n * @param knots the knot vector\n * @returns the polyline\n */\nexport const interpolateBSpline = (\n  controlPoints: ControlPoint[],\n  degree: number,\n  knots: number[],\n  interpolationsPerSplineSegment?: number,\n  weights?: number[]\n): Point[] => {\n  const polyline: Point[] = []\n  const controlPointsForLib = controlPoints.map(function (p): Point {\n    return [p.x, p.y]\n  })\n\n  const segmentTs = [knots[degree]]\n  const domain: Point = [knots[degree], knots[knots.length - 1 - degree]]\n\n  for (let k = degree + 1; k < knots.length - degree; ++k) {\n    if (segmentTs[segmentTs.length - 1] !== knots[k]) {\n      segmentTs.push(knots[k])\n    }\n  }\n\n  interpolationsPerSplineSegment = interpolationsPerSplineSegment || 25\n  for (let i = 1; i < segmentTs.length; ++i) {\n    const uMin = segmentTs[i - 1]\n    const uMax = segmentTs[i]\n    for (let k = 0; k <= interpolationsPerSplineSegment; ++k) {\n      const u = (k / interpolationsPerSplineSegment) * (uMax - uMin) + uMin\n      // Clamp t to 0, 1 to handle numerical precision issues\n      let t = (u - domain[0]) / (domain[1] - domain[0])\n      t = Math.max(t, 0)\n      t = Math.min(t, 1)\n      const p = bSpline(t, degree, controlPointsForLib, knots, weights)\n      polyline.push([p[0], p[1]])\n    }\n  }\n  return polyline\n}\n\nexport const polyfaceOutline = (entity: LocalPolylineEntity): Point[][] => { // NOSONAR\n  const vertices: Array<{ x: number; y: number }> = []\n  const faces: Array<{ indices: number[]; hiddens: boolean[] }> = []\n\n  for (const v of entity.vertices) {\n    if (v.faces) {\n      const face: { indices: number[]; hiddens: boolean[] } = {\n        indices: [],\n        hiddens: [],\n      }\n      for (const i of v.faces) {\n        if (i === 0) {\n          break\n        }\n        // Negative indices signify hidden edges\n        face.indices.push(i < 0 ? -i - 1 : i - 1)\n        face.hiddens.push(i < 0)\n      }\n      if ([3, 4].includes(face.indices.length)) faces.push(face)\n    } else {\n      vertices.push({ x: v.x, y: v.y })\n    }\n  }\n\n  // If a segment starts at the end of a previous line, continue it\n  const polylines: number[][] = []\n  const segment = (a: number, b: number): void => {\n    for (const prev of polylines) {\n      if (prev.slice(-1)[0] === a) {\n        prev.push(b)\n        return\n      }\n    }\n    polylines.push([a, b])\n  }\n\n  for (const face of faces) {\n    for (let beg = 0; beg < face.indices.length; beg++) {\n      if (face.hiddens[beg]) {\n        continue\n      }\n      const end = (beg + 1) % face.indices.length\n      segment(face.indices[beg], face.indices[end])\n    }\n  }\n\n  // Sometimes segments are not sequential, in that case\n  // we need to find if they can mend gaps between others\n  for (const a of polylines) {\n    for (const b of polylines) {\n      if (a !== b && a[0] === b.slice(-1)[0]) {\n        b.push(...a.slice(1))\n        a.splice(0, a.length)\n        break\n      }\n    }\n  }\n\n  return polylines\n    .filter((l) => l.length)\n    .map((l) => l.map((i) => vertices[i]).map((v) => [v.x, v.y]))\n}\n\n/**\n * Convert a parsed DXF entity to a polyline. These can be used to render the\n * the DXF in SVG, Canvas, WebGL etc., without depending on native support\n * of primitive objects (ellispe, spline etc.)\n */\nexport default function entityToPolyline( // NOSONAR\n  entity: Entity,\n  options?: EntityToPolylineOptions,\n): Point[] {\n  options = options || {}\n  let polyline: Point[] | undefined\n\n  const INFINITE_LINE_LENGTH = 1000\n\n  const normalize2 = (x: number, y: number): { x: number; y: number } | null => {\n    const len = Math.hypot(x, y)\n    if (len === 0) return null\n    return { x: x / len, y: y / len }\n  }\n\n  if (entity.type === 'LINE') {\n    polyline = [\n      [entity.start.x, entity.start.y],\n      [entity.end.x, entity.end.y],\n    ]\n  }\n\n  if (entity.type === 'LEADER') {\n    if (entity.vertices.length >= 2) {\n      polyline = entity.vertices.map((v) => [v.x, v.y])\n    } else {\n      logger.warn('LEADER entity with insufficient vertices')\n      polyline = []\n    }\n  }\n\n  if (entity.type === 'RAY') {\n    const dir = normalize2(entity.direction.x, entity.direction.y)\n    if (dir === null) {\n      logger.warn('RAY entity with zero direction vector')\n      polyline = []\n    } else {\n      polyline = [\n        [entity.start.x, entity.start.y],\n        [\n          entity.start.x + dir.x * INFINITE_LINE_LENGTH,\n          entity.start.y + dir.y * INFINITE_LINE_LENGTH,\n        ],\n      ]\n    }\n  }\n\n  if (entity.type === 'XLINE') {\n    const dir = normalize2(entity.direction.x, entity.direction.y)\n    if (dir === null) {\n      logger.warn('XLINE entity with zero direction vector')\n      polyline = []\n    } else {\n      polyline = [\n        [\n          entity.basePoint.x - dir.x * INFINITE_LINE_LENGTH,\n          entity.basePoint.y - dir.y * INFINITE_LINE_LENGTH,\n        ],\n        [\n          entity.basePoint.x + dir.x * INFINITE_LINE_LENGTH,\n          entity.basePoint.y + dir.y * INFINITE_LINE_LENGTH,\n        ],\n      ]\n    }\n  }\n\n  if (entity.type === 'SHAPE') {\n    const x = entity.insertionPoint?.x ?? 0\n    const y = entity.insertionPoint?.y ?? 0\n    const size = entity.size ?? 0\n    const scaleX = entity.relativeXScale ?? 1\n    const length = size * scaleX\n    polyline = [\n      [x, y],\n      [x + length, y],\n    ]\n  }\n\n  if (entity.type === 'WIPEOUT') {\n    const verts = entity.clipBoundaryVertices\n    if (!verts || verts.length < 2) {\n      logger.warn('WIPEOUT entity with missing clip boundary vertices')\n      polyline = []\n    } else {\n      const insX = entity.insertionPoint?.x ?? 0\n      const insY = entity.insertionPoint?.y ?? 0\n\n      const ux = entity.uVector?.x ?? 1\n      const uy = entity.uVector?.y ?? 0\n\n      const vx = entity.vVector?.x ?? 0\n      const vy = entity.vVector?.y ?? 1\n\n      polyline = verts.map((p) => [\n        insX + ux * p.x + vx * p.y,\n        insY + uy * p.x + vy * p.y,\n      ])\n\n      if (polyline.length > 0) {\n        const first = polyline[0]\n        const last = polyline[polyline.length - 1]\n        if (first[0] !== last[0] || first[1] !== last[1]) {\n          polyline.push(first)\n        }\n      }\n    }\n  }\n\n  if (entity.type === 'LWPOLYLINE' || entity.type === 'POLYLINE') {\n    polyline = []\n    if (entity.polyfaceMesh) {\n      // Only return the first polyline because we can't return many\n      polyline.push(...polyfaceOutline(entity)[0])\n    } else if (entity.polygonMesh) {\n      // Do not attempt to render polygon meshes\n    } else if (entity.vertices.length) {\n      if (entity.closed) {\n        entity.vertices = entity.vertices.concat(entity.vertices[0])\n      }\n      for (let i = 0, il = entity.vertices.length; i < il - 1; ++i) {\n        const from: Point = [entity.vertices[i].x, entity.vertices[i].y]\n        const to: Point = [entity.vertices[i + 1].x, entity.vertices[i + 1].y]\n        polyline.push(from)\n        if (entity.vertices[i].bulge) {\n          polyline = polyline.concat(\n            createArcForLWPolyine(from, to, entity.vertices[i].bulge!),\n          )\n        }\n        // The last iteration of the for loop\n        if (i === il - 2) {\n          polyline.push(to)\n        }\n      }\n    } else {\n      logger.warn('Polyline entity with no vertices')\n    }\n  }\n\n  if (entity.type === 'CIRCLE') {\n    polyline = interpolateEllipse(\n      entity.x,\n      entity.y,\n      entity.r,\n      entity.r,\n      0,\n      Math.PI * 2,\n    )\n    if (entity.extrusionZ === -1) {\n      polyline = polyline.map(function (p): Point {\n        return [-p[0], p[1]]\n      })\n    }\n  }\n\n  if (entity.type === 'ELLIPSE') {\n    const rx = Math.hypot(entity.majorX, entity.majorY)\n    const ry = entity.axisRatio * rx\n    const majorAxisRotation = -Math.atan2(-entity.majorY, entity.majorX)\n    polyline = interpolateEllipse(\n      entity.x,\n      entity.y,\n      rx,\n      ry,\n      entity.startAngle,\n      entity.endAngle,\n      majorAxisRotation,\n    )\n    if (entity.extrusionZ === -1) {\n      polyline = polyline.map(function (p): Point {\n        return [-p[0], p[1]]\n      })\n    }\n  }\n\n  if (entity.type === 'ARC') {\n    // Why on earth DXF has degree start & end angles for arc,\n    // and radian start & end angles for ellipses is a mystery\n    polyline = interpolateEllipse(\n      entity.x,\n      entity.y,\n      entity.r,\n      entity.r,\n      entity.startAngle,\n      entity.endAngle,\n    )\n\n    // I kid you not, ARCs and ELLIPSEs handle this differently,\n    // as evidenced by how AutoCAD actually renders these entities\n    if (entity.extrusionZ === -1) {\n      polyline = polyline.map(function (p): Point {\n        return [-p[0], p[1]]\n      })\n    }\n  }\n\n  if (entity.type === 'SPLINE') {\n    polyline = interpolateBSpline(\n      entity.controlPoints,\n      entity.degree,\n      entity.knots,\n      options.interpolationsPerSplineSegment,\n      entity.weights,\n    )\n  }\n\n  if (entity.type === 'SOLID' || entity.type === 'TRACE') {\n    const corners = entity.corners ?? entity.points\n    if (corners && corners.length >= 4) {\n      polyline = [\n        [corners[0].x, corners[0].y],\n        [corners[1].x, corners[1].y],\n        [corners[2].x, corners[2].y],\n        [corners[3].x, corners[3].y],\n        [corners[0].x, corners[0].y],\n      ]\n    }\n  }\n\n  if (!polyline) {\n    logger.warn('unsupported entity for converting to polyline:', entity.type)\n    return []\n  }\n  return polyline\n}\n"],
  "mappings": "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",
  "names": ["bSpline", "logger", "createArcForLWPolyine"]
}
