blue-chestnut-solar-expert 0.0.20 → 0.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.undo-icon.entry.cjs.js.map +1 -1
- package/dist/cjs/eraser-icon_16.cjs.entry.js +92 -55
- package/dist/cjs/eraser-icon_16.cjs.entry.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/loading-widget.cjs.entry.js +1 -1
- package/dist/cjs/stencil-library.cjs.js +1 -1
- package/dist/collection/components/map-draw/polygon-buttons.js +2 -3
- package/dist/collection/components/map-draw/polygon-buttons.js.map +1 -1
- package/dist/collection/components/solar-expert/solar-expert.js +3 -16
- package/dist/collection/components/solar-expert/solar-expert.js.map +1 -1
- package/dist/collection/components/solar-system-form/solar-system-form.js +85 -37
- package/dist/collection/components/solar-system-form/solar-system-form.js.map +1 -1
- package/dist/collection/components/widgets/loading-widget.js +1 -1
- package/dist/collection/store.js +1 -0
- package/dist/collection/store.js.map +1 -1
- package/dist/collection/types/lang.js.map +1 -1
- package/dist/collection/utils/geometry/fitting.js +0 -228
- package/dist/collection/utils/geometry/fitting.js.map +1 -1
- package/dist/collection/utils/lang/english.js +1 -0
- package/dist/collection/utils/lang/english.js.map +1 -1
- package/dist/collection/utils/lang/german.js +1 -0
- package/dist/collection/utils/lang/german.js.map +1 -1
- package/dist/collection/utils/lang/spanish.js +1 -0
- package/dist/collection/utils/lang/spanish.js.map +1 -1
- package/dist/components/loading-widget.js +1 -1
- package/dist/components/map-draw.js +1 -1
- package/dist/components/map-selector.js +1 -1
- package/dist/components/{p-CmFUQbz_.js → p-CTYaeZhp.js} +88 -40
- package/dist/components/p-CTYaeZhp.js.map +1 -0
- package/dist/components/{p-CPLDlLfb.js → p-CaedRXrz.js} +8 -8
- package/dist/components/p-CaedRXrz.js.map +1 -0
- package/dist/components/{p-DPfpDV5e.js → p-CvYS8YPD.js} +3 -3
- package/dist/components/{p-DPfpDV5e.js.map → p-CvYS8YPD.js.map} +1 -1
- package/dist/components/{p-CwVUc6Hq.js → p-DlAht76f.js} +6 -2
- package/dist/components/p-DlAht76f.js.map +1 -0
- package/dist/components/{p-CRnyqUKc.js → p-DufgH4Gd.js} +5 -6
- package/dist/components/p-DufgH4Gd.js.map +1 -0
- package/dist/components/{p-BxEeUA4s.js → p-G74Ln5vx.js} +3 -3
- package/dist/components/{p-BxEeUA4s.js.map → p-G74Ln5vx.js.map} +1 -1
- package/dist/components/{p-C-_6TJs5.js → p-bu76_2XI.js} +3 -3
- package/dist/components/{p-C-_6TJs5.js.map → p-bu76_2XI.js.map} +1 -1
- package/dist/components/{p-Bq1PVegq.js → p-oY2qkchz.js} +3 -3
- package/dist/components/{p-Bq1PVegq.js.map → p-oY2qkchz.js.map} +1 -1
- package/dist/components/polygon-buttons.js +1 -1
- package/dist/components/polygon-information.js +1 -1
- package/dist/components/settings-modal.js +1 -1
- package/dist/components/solar-expert.js +11 -24
- package/dist/components/solar-expert.js.map +1 -1
- package/dist/components/solar-system-form.js +1 -1
- package/dist/components/tool-box.js +1 -1
- package/dist/esm/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.undo-icon.entry.js.map +1 -1
- package/dist/esm/eraser-icon_16.entry.js +92 -55
- package/dist/esm/eraser-icon_16.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/loading-widget.entry.js +1 -1
- package/dist/esm/stencil-library.js +1 -1
- package/dist/stencil-library/api-E7GpMOpJ.js.map +1 -0
- package/dist/stencil-library/app-globals-DQuL1Twl.js.map +1 -0
- package/dist/stencil-library/config-BV_PiZGS.js.map +1 -0
- package/dist/stencil-library/decoder-DSavpK4g.js.map +1 -0
- package/dist/stencil-library/deflate-BNIZ2wXt.js.map +1 -0
- package/dist/stencil-library/eraser-icon.house-icon.icon-selector.map-draw.map-selector.move-icon.octagon-minus-icon.polygon-buttons.polygon-information.search-icon.settings-icon.settings-modal.solar-expert.solar-system-form.tool-box.undo-icon.entry.esm.js.map +1 -1
- package/dist/stencil-library/index-DZjEuBrX.js.map +1 -0
- package/dist/stencil-library/index-DimvNaNS.js.map +1 -0
- package/dist/stencil-library/index.esm.js.map +1 -1
- package/dist/stencil-library/jpeg-B79KZkPY.js.map +1 -0
- package/dist/stencil-library/lerc-B-ZLzzvM.js.map +1 -0
- package/dist/stencil-library/lzw-1xg7uPVo.js.map +1 -0
- package/dist/stencil-library/p-62debd50.entry.js +2 -0
- package/dist/stencil-library/p-62debd50.entry.js.map +1 -0
- package/dist/stencil-library/{p-56f8bd65.entry.js → p-c4c3bbee.entry.js} +2 -2
- package/dist/stencil-library/packbits-0MTMkUGE.js.map +1 -0
- package/dist/stencil-library/pako.esm-BdkEMvj8.js.map +1 -0
- package/dist/stencil-library/raw-W8mxtLfl.js.map +1 -0
- package/dist/stencil-library/solar-expert.entry.esm.js.map +1 -0
- package/dist/stencil-library/solar-expert.entry.js +92 -0
- package/dist/{components/p-CRnyqUKc.js.map → stencil-library/solar-expert.entry.js.map} +1 -1
- package/dist/stencil-library/stencil-library.esm.js +1 -1
- package/dist/stencil-library/stencil-library.esm.js.map +1 -1
- package/dist/stencil-library/store-DUpvKmRV.js.map +1 -0
- package/dist/stencil-library/tools-DU7Muwzb.js.map +1 -0
- package/dist/stencil-library/utils-CTW6J-87.js.map +1 -0
- package/dist/stencil-library/webimage-CLeW6JHT.js.map +1 -0
- package/dist/types/components/solar-expert/solar-expert.d.ts +0 -1
- package/dist/types/components/solar-system-form/solar-system-form.d.ts +2 -0
- package/dist/types/store.d.ts +1 -0
- package/dist/types/types/lang.d.ts +1 -0
- package/dist/types/utils/geometry/fitting.d.ts +0 -23
- package/package.json +1 -1
- package/dist/components/p-CPLDlLfb.js.map +0 -1
- package/dist/components/p-CmFUQbz_.js.map +0 -1
- package/dist/components/p-CwVUc6Hq.js.map +0 -1
- package/dist/stencil-library/p-1e2ddc82.entry.js +0 -2
- package/dist/stencil-library/p-1e2ddc82.entry.js.map +0 -1
- /package/dist/stencil-library/{p-56f8bd65.entry.js.map → p-c4c3bbee.entry.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fitting.js","sourceRoot":"","sources":["../../../src/utils/geometry/fitting.ts"],"names":[],"mappings":"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","sourcesContent":["import { LineSegment, Polygon, SegmentMatch } from \"../../types/shapes\";\r\nimport { Bounds, LatLng, RoofSegmentSizeAndSunshineStats, SolarPanelType } from \"../solar\";\r\nimport { latLngToPixel } from \"../utils\";\r\nimport { Point } from \"../../types/shapes\";\r\nimport { isPointInPolygon, isPointOnBorder, Line } from \"../render/polygon\";\r\n\r\n\r\nexport interface SolarPanelSystemPart {\r\n positionedPanels: PositionedSolarPanel[];\r\n sunniness: number;\r\n}\r\n\r\nexport interface PositionedSolarPanel {\r\n panel: SolarPanelType;\r\n pixelPosition: {\r\n x: number;\r\n y: number;\r\n };\r\n horizontal: boolean;\r\n}\r\n\r\n/**\r\n * Get the intersections of a line parallel to the x-axis of the projected coordinate system with a polygon.\r\n * @param projectedPoint the point to draw the line from\r\n * @param projectedPolygon the polygon to get the intersections with\r\n * @returns the intersections of the line with the polygon\r\n */\r\nexport function getIntersections(projectedPoint: Point, projectedPolygon: Polygon): Point[] {\r\n const intersections: Point[] = [];\r\n\r\n if (projectedPolygon.points.length === 0) {\r\n return intersections;\r\n }\r\n \r\n // For each edge of the polygon\r\n for (let i = 0; i < projectedPolygon.points.length; i++) {\r\n const p1 = projectedPolygon.points[i];\r\n const p2 = projectedPolygon.points[(i + 1) % projectedPolygon.points.length];\r\n \r\n // Calculate intersection point\r\n const t = (projectedPoint.y - p1.y) / (p2.y - p1.y);\r\n const x = p1.x + t * (p2.x - p1.x);\r\n \r\n if (t > 0 && t <= 1) {\r\n intersections.push({ x, y: projectedPoint.y });\r\n }\r\n if (t === 0) {\r\n intersections.push({ x: p1.x, y: projectedPoint.y });\r\n }\r\n }\r\n \r\n // Sort intersections by y-coordinate\r\n return intersections.sort((a, b) => a.x - b.x);\r\n}\r\n\r\nexport function projectPoint(point: Point, azimuth: number): Point {\r\n const angle = azimuth * (Math.PI / 180);\r\n const x = point.x * Math.cos(angle) - point.y * Math.sin(angle);\r\n const y = point.x * Math.sin(angle) + point.y * Math.cos(angle);\r\n return { x, y };\r\n}\r\n\r\nexport function projectPolygon(polygon: Polygon, azimuth: number): Polygon {\r\n return {\r\n points: polygon.points.map((point) => projectPoint(point, azimuth)),\r\n type: polygon.type,\r\n closed: polygon.closed,\r\n _id: polygon._id,\r\n details: polygon.details,\r\n };\r\n}\r\n\r\nexport function offsetPolygon(polygon: Polygon, offset?: {x: number, y: number}): {polygon: Polygon, offset: {x: number, y: number}} {\r\n if (polygon.points.length === 0) {\r\n return { polygon: polygon, offset: {x: 0, y: 0} };\r\n }\r\n\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (!offset) {\r\n const minX = Math.min(...polygon.points.map((point) => point.x));\r\n const minY = Math.min(...polygon.points.map((point) => point.y));\r\n const maxX = Math.max(...polygon.points.map((point) => point.x));\r\n const maxY = Math.max(...polygon.points.map((point) => point.y));\r\n\r\n offsetX = minX + (maxX - minX) / 2;\r\n offsetY = minY + (maxY - minY) / 2;\r\n }\r\n else {\r\n offsetX = offset.x;\r\n offsetY = offset.y;\r\n }\r\n\r\n const newPoints = polygon.points.map((point) => ({\r\n x: point.x - offsetX,\r\n y: point.y - offsetY,\r\n }));\r\n\r\n return { polygon: { ...polygon, points: newPoints }, offset: {x: offsetX, y: offsetY} };\r\n}\r\n\r\nfunction equalsPoints(point1: Point, point2: Point): boolean {\r\n return point1.x === point2.x && point1.y === point2.y;\r\n}\r\n\r\n/**\r\n * Checks if two lines intersect.\r\n * if the lines intersect in a start or end point they are not considered as intersecting\r\n * @param line1 The first line.\r\n * @param line2 The second line.\r\n * @returns True if the lines intersect, false otherwise.\r\n */\r\nexport function intersects(line1: Line, line2: Line): boolean {\r\n // Get the points of each line\r\n const p1 = line1.start;\r\n const p2 = line1.end;\r\n const p3 = line2.start;\r\n const p4 = line2.end;\r\n\r\n if (equalsPoints(p1, p3) || equalsPoints(p1, p4) || equalsPoints(p2, p3) || equalsPoints(p2, p4)) {\r\n return false;\r\n }\r\n\r\n // Calculate the cross products\r\n const d1 = (p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x);\r\n const d2 = (p4.x - p3.x) * (p2.y - p3.y) - (p4.y - p3.y) * (p2.x - p3.x);\r\n const d3 = (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);\r\n const d4 = (p2.x - p1.x) * (p4.y - p1.y) - (p2.y - p1.y) * (p4.x - p1.x);\r\n\r\n // Check if the lines intersect\r\n return (d1 * d2 < 0) && (d3 * d4 < 0);\r\n}\r\n\r\nexport function undoOffsetPolygon(polygon: Polygon, offset: {x: number, y: number}): Polygon {\r\n return {\r\n ...polygon,\r\n points: polygon.points.map((point) => ({\r\n x: point.x + offset.x,\r\n y: point.y + offset.y,\r\n })),\r\n };\r\n}\r\n\r\nexport function segmentPolygon(polygon: Polygon) {\r\n const segments: LineSegment[] = [];\r\n const segmentsMap: Record<string, boolean> = {};\r\n\r\n for (const point of polygon.points) {\r\n const intersections = getIntersections(point, polygon);\r\n for (const [index, intersection] of intersections.slice(0, -1).entries()) {\r\n const nextIntersection = intersections[index + 1];\r\n \r\n const halfPoint = {\r\n x: (intersection.x + nextIntersection.x) / 2,\r\n y: (intersection.y + nextIntersection.y) / 2,\r\n };\r\n\r\n const isInner = isPointInPolygon(halfPoint, polygon);\r\n const isOnBorder = isPointOnBorder(halfPoint, polygon);\r\n const key = `${intersection.x}-${intersection.y}-${nextIntersection.x}-${nextIntersection.y}`;\r\n \r\n if (segmentsMap[key]) {\r\n continue;\r\n }\r\n segments.push({ start: intersection, end: nextIntersection, type: isOnBorder ? \"border\" : (isInner ? \"inner\" : \"outer\") });\r\n segmentsMap[key] = true;\r\n }\r\n }\r\n return segments;\r\n}\r\n\r\n/**\r\n * for each segment this method will find all the following segments that are connected to it\r\n * \r\n * first the method subdivides the segments into y levels (all segments that have the same y coordinate are in the same level)\r\n * then it will check for each segment in each level if there is a following segment that is connected to it by checking it the \r\n * start point of the top segment to the end point of the bottom segment does not intersect with any of the polygon borders and the center point of the connection is in the polygon\r\n * \r\n * @param segments \r\n * @param roof \r\n * @returns \r\n */\r\nexport function matchSegments(segments: LineSegment[], roof: Polygon): {matches: SegmentMatch[], map: Record<string, LineSegment>} {\r\n const matches: SegmentMatch[] = [];\r\n const map: Record<string, LineSegment> = {};\r\n\r\n for (const segment of segments) {\r\n map[`${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`] = segment;\r\n }\r\n \r\n // Group segments by y-coordinate (level)\r\n const levels: Record<number, LineSegment[]> = {};\r\n segments.forEach(segment => {\r\n const y = segment.start.y;\r\n if (!levels[y]) {\r\n levels[y] = [];\r\n }\r\n levels[y].push(segment);\r\n });\r\n\r\n // Sort levels by y-coordinate\r\n const sortedLevels = Object.keys(levels).map(Number).sort((a, b) => a - b);\r\n\r\n // For each level except the last one\r\n for (let i = 0; i < sortedLevels.length - 1; i++) {\r\n const currentLevel = levels[sortedLevels[i]];\r\n const nextLevel = levels[sortedLevels[i + 1]];\r\n\r\n // For each segment in current level\r\n for (const currentSegment of currentLevel) {\r\n if (currentSegment.type === \"outer\") {\r\n continue;\r\n }\r\n const matchedSegments: LineSegment[] = [];\r\n \r\n // For each segment in next level\r\n for (const nextSegment of nextLevel) {\r\n // Check if segments can be connected\r\n const connectionStart = currentSegment.start;\r\n const connectionEnd = nextSegment.end;\r\n\r\n let intersected = false;\r\n for (let i = 0; i < roof.points.length; i++) {\r\n const line = {\r\n start: roof.points[i],\r\n end: roof.points[(i + 1) % roof.points.length]\r\n };\r\n if (intersects(line, {start: connectionStart, end: connectionEnd})) {\r\n intersected = true;\r\n break;\r\n }\r\n }\r\n\r\n if (intersected) {\r\n continue;\r\n }\r\n\r\n // Check if center point of connection is inside polygon\r\n const centerPoint = {\r\n x: (connectionStart.x + connectionEnd.x) / 2,\r\n y: (connectionStart.y + connectionEnd.y) / 2\r\n };\r\n\r\n if (isPointInPolygon(centerPoint, roof)) {\r\n matchedSegments.push(nextSegment);\r\n }\r\n }\r\n\r\n if (matchedSegments.length > 0) {\r\n matches.push({\r\n segment: `${currentSegment.start.x}-${currentSegment.start.y}-${currentSegment.end.x}-${currentSegment.end.y}`,\r\n matchedSegments: matchedSegments.map(segment => `${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`)\r\n });\r\n }\r\n }\r\n }\r\n\r\n return {matches, map};\r\n}\r\n\r\n/**\r\n * Fits panels to a roof polygon.\r\n * \r\n * Starts with positioning a solar panel row (a rectangle with the height of the solar panel and the width in the direction of the perpendicular of\r\n * the azimuth of the roof) at each corner of the roof.\r\n * For each corner there are four possible cases (the width is the width of the whole roof in the direction of the perpendicular of the azimuth):\r\n * 1. The row has height of the solar panel height and sits below the point in the direction of the azimuth of the roof.\r\n * 2. The row has height of the solar panel height and sits above the point in the direction of the azimuth of the roof.\r\n * 3. The row has the height of the solar panel width (solar panels are rotated) and sits below the point in the direction of the azimuth of the roof.\r\n * 4. The row has the height of the solar panel width (solar panels are rotated) and sits above the point in the direction of the azimuth of the roof.\r\n * \r\n * For each of these cases the function then places the solar panel rows directly above and below the current row.\r\n * \r\n * after the function has positioned all the rows it places the solar panels in the spaces between the rows.\r\n * For each of the four scenarios of each corner the number of panels are counted and the optimal placement is chosen.\r\n * \r\n * @param roof - The roof polygon.\r\n * @param panelType - The type of panel to fit.\r\n * @param borderOffset - The offset of the panel from the border of the roof. If negative, the panel can be partially overhanging the roof.\r\n * @param azimuth - The azimuth of the roof.\r\n * @returns The positioned panels.\r\n */\r\nexport function fitPanelsToRoof(roof: Polygon, panelType: SolarPanelType, borderOffset: number = 0, azimuth: number = 0): PositionedSolarPanel[] {\r\n if (!roof || !panelType || !roof.points || !roof.details) {\r\n return [];\r\n }\r\n console.log(borderOffset, azimuth)\r\n return [];\r\n \r\n // const minX = Math.min(...roof.points.map(p => p.x));\r\n // const maxX = Math.max(...roof.points.map(p => p.x));\r\n // const minY = Math.min(...roof.points.map(p => p.y));\r\n // const maxY = Math.max(...roof.points.map(p => p.y));\r\n\r\n // const projectedRoof = projectPolygon(roof, azimuth);\r\n // const projectedOffsetRoof = offsetPolygon(projectedRoof);\r\n\r\n // const segments = segmentPolygon(projectedOffsetRoof.polygon);\r\n // const {matches, map} = matchSegments(segments, projectedOffsetRoof.polygon);\r\n // const matchesMap: Record<string, LineSegment[]> = {};\r\n // for (const match of matches) {\r\n // matchesMap[match.segment] = match.matchedSegments.map(segment => map[segment]);\r\n // }\r\n\r\n // let panels: PositionedSolarPanel[] = [];\r\n // let undidPanels: PositionedSolarPanel[] = [];\r\n\r\n // for (const segment of segments) {\r\n // if (segment.type === \"outer\") {\r\n // continue;\r\n // }\r\n\r\n // const matches = matchesMap[`${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`];\r\n // if (!matches || matches.length === 0) {\r\n // continue;\r\n // }\r\n\r\n // // Combine segments until we reach panel height\r\n // let combinedSegments: Array<Array<LineSegment>> = [[segment]];\r\n // let currentHeight = 0;\r\n // let currentMatches = matches;\r\n\r\n // // while (currentHeight < panelType.heightMeters && currentMatches.length > 0) {\r\n // // const nextSegment = currentMatches[0];\r\n // // combinedSegments.push(nextSegment);\r\n // // currentHeight += Math.abs(nextSegment.start.y - segment.start.y);\r\n // // currentMatches = matchesMap[`${nextSegment.start.x}-${nextSegment.start.y}-${nextSegment.end.x}-${nextSegment.end.y}`] || [];\r\n // // }\r\n\r\n // if (currentHeight < panelType.heightMeters) {\r\n // continue;\r\n // }\r\n\r\n // // Calculate minimum width\r\n // // let minEnd = Math.max(...combinedSegments.map(s => s.end.x));\r\n // // let maxStart = Math.min(...combinedSegments.map(s => s.start.x));\r\n // // let width = minEnd - maxStart;\r\n\r\n // // if (width >= panelType.widthMeters) {\r\n // // // Find highest segment for starting position\r\n // // const highestSegment = combinedSegments.reduce((prev, curr) => \r\n // // curr.start.y < prev.start.y ? curr : prev\r\n // // );\r\n\r\n // // // Place panels in a grid\r\n // // const panelSpacing = panelType.widthMeters + borderOffset;\r\n // // const rowSpacing = panelType.heightMeters + borderOffset;\r\n // // let currentX = maxStart;\r\n // // let currentY = highestSegment.start.y;\r\n\r\n // // while (currentX + panelType.widthMeters <= minEnd) {\r\n // // while (currentY + panelType.heightMeters <= highestSegment.start.y + currentHeight) {\r\n // // const panelCenter = {\r\n // // x: currentX + panelType.widthMeters / 2,\r\n // // y: currentY + panelType.heightMeters / 2\r\n // // };\r\n\r\n // // if (isPointInPolygon(panelCenter, projectedOffsetRoof.polygon)) {\r\n // // panels.push({\r\n // // panel: panelType,\r\n // // pixelPosition: panelCenter\r\n // // });\r\n // // }\r\n\r\n // // currentY += rowSpacing;\r\n // // }\r\n // // currentX += panelSpacing;\r\n // // currentY = highestSegment.start.y;\r\n // // }\r\n // // }\r\n // }\r\n\r\n // for (const panel of panels) {\r\n // const undoOffset = {\r\n // x: panel.pixelPosition.x + projectedOffsetRoof.offset.x,\r\n // y: panel.pixelPosition.y + projectedOffsetRoof.offset.y,\r\n // };\r\n // const projectedPanel = projectPoint(undoOffset, azimuth);\r\n // undidPanels.push({\r\n // panel: panel.panel,\r\n // pixelPosition: projectedPanel,\r\n // });\r\n // }\r\n\r\n // return panels;\r\n\r\n // project the polygon points such that the azimuth is 0 degrees\r\n // this means that the solar panel are aligned perfectly with the coordinate system\r\n //\r\n // 1. below point and height is height\r\n // for each point do the following\r\n // draw a line along the y-axis of the projected coordinate system (this is the perpendicular of the azimuth)\r\n // find all the intersection of that line with the roof polygon\r\n // get all points that are within the height of the solar panel in the direction of the azimuth\r\n // \r\n\r\n // for each point generate a line along the y-axis of the projected coordinate system (this is the perpendicular of the azimuth)\r\n // find all points on that line that intersect with the roof polygon bounds\r\n // if the number of points is even \r\n\r\n // \r\n\r\n // const positionedPanels: PositionedSolarPanel[] = [];\r\n // let bestPanelCount = 0;\r\n // let bestPanelArrangement: PositionedSolarPanel[] = [];\r\n\r\n // // Get roof details\r\n // const { azimuth } = roof.details;\r\n // const perpendicularAzimuth = (azimuth + 90) % 360;\r\n\r\n // for (const point of roof.points) {\r\n // const row = createPanelRow(point, false, false);\r\n // positionedPanels.push(...row);\r\n // }\r\n\r\n // Helper function to create a panel row\r\n // const createPanelRow = (startPoint: Point, isRotated: boolean, isAbove: boolean): PositionedSolarPanel[] => {\r\n // const rowPanels: PositionedSolarPanel[] = [];\r\n // const panelWidth = isRotated ? panelType.heightMeters : panelType.widthMeters;\r\n // const panelHeight = isRotated ? panelType.widthMeters : panelType.heightMeters;\r\n\r\n // // Calculate row direction based on azimuth\r\n // const rowAngle = perpendicularAzimuth * (Math.PI / 180);\r\n // const rowDirX = Math.cos(rowAngle);\r\n // const rowDirY = Math.sin(rowAngle);\r\n\r\n // // Calculate panel spacing direction based on azimuth\r\n // const panelAngle = azimuth * (Math.PI / 180);\r\n // const panelDirX = Math.cos(panelAngle);\r\n // const panelDirY = Math.sin(panelAngle);\r\n\r\n // // Calculate row width (distance from start to end of roof in perpendicular direction)\r\n // let maxRowWidth = 0;\r\n // for (const point of roof.points) {\r\n // const dx = point.x - startPoint.x;\r\n // const dy = point.y - startPoint.y;\r\n // const width = Math.abs(dx * rowDirX + dy * rowDirY);\r\n // maxRowWidth = Math.max(maxRowWidth, width);\r\n // }\r\n\r\n // // Place panels along the row\r\n // const numPanels = Math.floor(maxRowWidth / panelWidth);\r\n // for (let i = 0; i < numPanels; i++) {\r\n // const panelX = startPoint.x + i * panelWidth * rowDirX;\r\n // const panelY = startPoint.y + i * panelWidth * rowDirY;\r\n\r\n // // Check if panel center is within roof polygon\r\n // const panelCenter = {\r\n // x: panelX + (panelWidth / 2) * rowDirX + (panelHeight / 2) * panelDirX,\r\n // y: panelY + (panelWidth / 2) * rowDirY + (panelHeight / 2) * panelDirY\r\n // };\r\n\r\n // if (isPointInPolygon(panelCenter, roof)) {\r\n // rowPanels.push({\r\n // panel: panelType,\r\n // pixelPosition: {\r\n // x: panelCenter.x,\r\n // y: panelCenter.y\r\n // }\r\n // });\r\n // }\r\n // }\r\n\r\n // return rowPanels;\r\n // };\r\n\r\n // // Try each corner and arrangement\r\n // for (const corner of roof.points) {\r\n // // Try all four arrangements for this corner\r\n // const arrangements = [\r\n // { isRotated: false, isAbove: false },\r\n // { isRotated: false, isAbove: true },\r\n // { isRotated: true, isAbove: false },\r\n // { isRotated: true, isAbove: true }\r\n // ];\r\n\r\n // for (const arrangement of arrangements) {\r\n // const currentPanels: PositionedSolarPanel[] = [];\r\n // const { isRotated, isAbove } = arrangement;\r\n\r\n // // Create initial row\r\n // const initialRow = createPanelRow(corner, isRotated, isAbove);\r\n // currentPanels.push(...initialRow);\r\n\r\n // // Add rows above and below\r\n // const panelHeight = isRotated ? panelType.widthMeters : panelType.heightMeters;\r\n // const rowSpacing = panelHeight + borderOffset;\r\n\r\n // // Calculate direction for adding rows\r\n // const rowAngle = azimuth * (Math.PI / 180);\r\n // const rowDirX = Math.cos(rowAngle);\r\n // const rowDirY = Math.sin(rowAngle);\r\n\r\n // // Add rows in both directions\r\n // let rowOffset = rowSpacing;\r\n // while (true) {\r\n // const newRowPoint = {\r\n // x: corner.x + rowOffset * rowDirX,\r\n // y: corner.y + rowOffset * rowDirY\r\n // };\r\n // const newRow = createPanelRow(newRowPoint, isRotated, isAbove);\r\n // if (newRow.length === 0) break;\r\n // currentPanels.push(...newRow);\r\n // rowOffset += rowSpacing;\r\n // }\r\n\r\n // rowOffset = -rowSpacing;\r\n // while (true) {\r\n // const newRowPoint = {\r\n // x: corner.x + rowOffset * rowDirX,\r\n // y: corner.y + rowOffset * rowDirY\r\n // };\r\n // const newRow = createPanelRow(newRowPoint, isRotated, isAbove);\r\n // if (newRow.length === 0) break;\r\n // currentPanels.push(...newRow);\r\n // rowOffset -= rowSpacing;\r\n // }\r\n\r\n // // Update best arrangement if this one has more panels\r\n // if (currentPanels.length > bestPanelCount) {\r\n // bestPanelCount = currentPanels.length;\r\n // bestPanelArrangement = currentPanels;\r\n // }\r\n // }\r\n // }\r\n\r\n // return bestPanelArrangement;\r\n}\r\n\r\n/**\r\n * Uses the bounding box of the roof and the roof segment bounding boxes to find the best fitting roof segment.\r\n * @param roof the roof shape\r\n * @param roofSegmentStats the stats of the roof segments\r\n * @returns the best fitting roof segment\r\n */\r\nexport function getBestFittingRoofSegment(roof: Polygon, roofSegmentStats: RoofSegmentSizeAndSunshineStats[], bounds: Bounds, canvas: HTMLCanvasElement): RoofSegmentSizeAndSunshineStats {\r\n const polygonBounds = {\r\n minX: Math.min(...roof.points.map((p) => p.x)),\r\n maxX: Math.max(...roof.points.map((p) => p.x)),\r\n minY: Math.min(...roof.points.map((p) => p.y)),\r\n maxY: Math.max(...roof.points.map((p) => p.y)),\r\n };\r\n\r\n let bestSegment = null;\r\n let bestIoU = 0;\r\n\r\n for (const segment of roofSegmentStats) {\r\n const sw = latLngToPixel(bounds, canvas, {\r\n latitude: segment.boundingBox.sw.latitude,\r\n longitude: segment.boundingBox.sw.longitude,\r\n } as LatLng);\r\n const ne = latLngToPixel(bounds, canvas, {\r\n latitude: segment.boundingBox.ne.latitude,\r\n longitude: segment.boundingBox.ne.longitude,\r\n } as LatLng);\r\n const segmentBounds = {\r\n minX: sw.x,\r\n maxX: ne.x,\r\n minY: ne.y,\r\n maxY: sw.y,\r\n };\r\n\r\n // Calculate intersection\r\n const interLeft = Math.max(polygonBounds.minX, segmentBounds.minX);\r\n const interRight = Math.min(polygonBounds.maxX, segmentBounds.maxX);\r\n const interTop = Math.max(polygonBounds.minY, segmentBounds.minY);\r\n const interBottom = Math.min(polygonBounds.maxY, segmentBounds.maxY);\r\n\r\n const interWidth = interRight - interLeft;\r\n const interHeight = interBottom - interTop;\r\n let intersectionArea = 0;\r\n if (interWidth > 0 && interHeight > 0) {\r\n intersectionArea = interWidth * interHeight;\r\n }\r\n\r\n const polygonArea = (polygonBounds.maxX - polygonBounds.minX) * (polygonBounds.maxY - polygonBounds.minY);\r\n const segmentArea = (segmentBounds.maxX - segmentBounds.minX) * (segmentBounds.maxY - segmentBounds.minY);\r\n const unionArea = polygonArea + segmentArea - intersectionArea;\r\n const iou = unionArea > 0 ? intersectionArea / unionArea : 0;\r\n\r\n if (iou > bestIoU) {\r\n bestIoU = iou;\r\n bestSegment = segment;\r\n }\r\n }\r\n\r\n return bestSegment;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"fitting.js","sourceRoot":"","sources":["../../../src/utils/geometry/fitting.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAQ,MAAM,mBAAmB,CAAC;AAiB5E;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,cAAqB,EAAE,gBAAyB;IAC7E,MAAM,aAAa,GAAY,EAAE,CAAC;IAElC,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,+BAA+B;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE7E,+BAA+B;QAC/B,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAEnC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACV,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;QACzD,CAAC;IACL,CAAC;IAED,qCAAqC;IACrC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,OAAe;IACtD,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACxC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,OAAe;IAC5D,OAAO;QACH,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACnE,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;KAC3B,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,MAA+B;IAC3E,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,EAAE,CAAC;IACtD,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;SACI,CAAC;QACF,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;QACnB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO;QACpB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,OAAO;KACvB,CAAC,CAAC,CAAC;IAEJ,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,EAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAC,EAAE,CAAC;AAC5F,CAAC;AAED,SAAS,YAAY,CAAC,MAAa,EAAE,MAAa;IAC9C,OAAO,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,KAAW,EAAE,KAAW;IAC/C,8BAA8B;IAC9B,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC;IACrB,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC;IACvB,MAAM,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC;IAErB,IAAI,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;QAC/F,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,+BAA+B;IAC/B,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAEzE,+BAA+B;IAC/B,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,MAA8B;IAC9E,OAAO;QACH,GAAG,OAAO;QACV,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACnC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YACrB,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;SACxB,CAAC,CAAC;KACN,CAAC;AACN,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC3C,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,WAAW,GAA4B,EAAE,CAAC;IAEhD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACvE,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAElD,MAAM,SAAS,GAAG;gBACd,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC5C,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;aAC/C,CAAC;YAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC;YAE9F,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,SAAS;YACb,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,gBAAgB,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC3H,WAAW,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAAC,QAAuB,EAAE,IAAa;IAChE,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAgC,EAAE,CAAC;IAE5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;IAC7F,CAAC;IAED,yCAAyC;IACzC,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACvB,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAE3E,qCAAqC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAE9C,oCAAoC;QACpC,KAAK,MAAM,cAAc,IAAI,YAAY,EAAE,CAAC;YACxC,IAAI,cAAc,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAClC,SAAS;YACb,CAAC;YACD,MAAM,eAAe,GAAkB,EAAE,CAAC;YAE1C,iCAAiC;YACjC,KAAK,MAAM,WAAW,IAAI,SAAS,EAAE,CAAC;gBAClC,qCAAqC;gBACrC,MAAM,eAAe,GAAG,cAAc,CAAC,KAAK,CAAC;gBAC7C,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC;gBAEtC,IAAI,WAAW,GAAG,KAAK,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,IAAI,GAAG;wBACT,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;wBACrB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;qBACjD,CAAC;oBACF,IAAI,UAAU,CAAC,IAAI,EAAE,EAAC,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,aAAa,EAAC,CAAC,EAAE,CAAC;wBACjE,WAAW,GAAG,IAAI,CAAC;wBACnB,MAAM;oBACV,CAAC;gBACL,CAAC;gBAED,IAAI,WAAW,EAAE,CAAC;oBACd,SAAS;gBACb,CAAC;gBAED,wDAAwD;gBACxD,MAAM,WAAW,GAAG;oBAChB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC5C,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;iBAC/C,CAAC;gBAEF,IAAI,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC;oBACtC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACtC,CAAC;YACL,CAAC;YAED,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,IAAI,CAAC;oBACT,OAAO,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE;oBAC9G,eAAe,EAAE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;iBAC7H,CAAC,CAAC;YACP,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,EAAC,OAAO,EAAE,GAAG,EAAC,CAAC;AAC1B,CAAC;AAGD;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAa,EAAE,gBAAmD,EAAE,MAAc,EAAE,MAAyB;IACnJ,MAAM,aAAa,GAAG;QAClB,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACjD,CAAC;IAEF,IAAI,WAAW,GAAG,IAAI,CAAC;IACvB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE;YACrC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ;YACzC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS;SACpC,CAAC,CAAC;QACb,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE;YACrC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ;YACzC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,SAAS;SACpC,CAAC,CAAC;QACb,MAAM,aAAa,GAAG;YAClB,IAAI,EAAE,EAAE,CAAC,CAAC;YACV,IAAI,EAAE,EAAE,CAAC,CAAC;YACV,IAAI,EAAE,EAAE,CAAC,CAAC;YACV,IAAI,EAAE,EAAE,CAAC,CAAC;SACb,CAAC;QAEF,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC;QAErE,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;QAC1C,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;QAC3C,IAAI,gBAAgB,GAAG,CAAC,CAAC;QACzB,IAAI,UAAU,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpC,gBAAgB,GAAG,UAAU,GAAG,WAAW,CAAC;QAChD,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1G,MAAM,WAAW,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC1G,MAAM,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,gBAAgB,CAAC;QAC/D,MAAM,GAAG,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7D,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;YAChB,OAAO,GAAG,GAAG,CAAC;YACd,WAAW,GAAG,OAAO,CAAC;QAC1B,CAAC;IACL,CAAC;IAED,OAAO,WAAW,CAAC;AACvB,CAAC","sourcesContent":["import { LineSegment, Polygon, SegmentMatch } from \"../../types/shapes\";\r\nimport { Bounds, LatLng, RoofSegmentSizeAndSunshineStats, SolarPanelType } from \"../solar\";\r\nimport { latLngToPixel } from \"../utils\";\r\nimport { Point } from \"../../types/shapes\";\r\nimport { isPointInPolygon, isPointOnBorder, Line } from \"../render/polygon\";\r\n\r\n\r\nexport interface SolarPanelSystemPart {\r\n positionedPanels: PositionedSolarPanel[];\r\n sunniness: number;\r\n}\r\n\r\nexport interface PositionedSolarPanel {\r\n panel: SolarPanelType;\r\n pixelPosition: {\r\n x: number;\r\n y: number;\r\n };\r\n horizontal: boolean;\r\n}\r\n\r\n/**\r\n * Get the intersections of a line parallel to the x-axis of the projected coordinate system with a polygon.\r\n * @param projectedPoint the point to draw the line from\r\n * @param projectedPolygon the polygon to get the intersections with\r\n * @returns the intersections of the line with the polygon\r\n */\r\nexport function getIntersections(projectedPoint: Point, projectedPolygon: Polygon): Point[] {\r\n const intersections: Point[] = [];\r\n\r\n if (projectedPolygon.points.length === 0) {\r\n return intersections;\r\n }\r\n \r\n // For each edge of the polygon\r\n for (let i = 0; i < projectedPolygon.points.length; i++) {\r\n const p1 = projectedPolygon.points[i];\r\n const p2 = projectedPolygon.points[(i + 1) % projectedPolygon.points.length];\r\n \r\n // Calculate intersection point\r\n const t = (projectedPoint.y - p1.y) / (p2.y - p1.y);\r\n const x = p1.x + t * (p2.x - p1.x);\r\n \r\n if (t > 0 && t <= 1) {\r\n intersections.push({ x, y: projectedPoint.y });\r\n }\r\n if (t === 0) {\r\n intersections.push({ x: p1.x, y: projectedPoint.y });\r\n }\r\n }\r\n \r\n // Sort intersections by y-coordinate\r\n return intersections.sort((a, b) => a.x - b.x);\r\n}\r\n\r\nexport function projectPoint(point: Point, azimuth: number): Point {\r\n const angle = azimuth * (Math.PI / 180);\r\n const x = point.x * Math.cos(angle) - point.y * Math.sin(angle);\r\n const y = point.x * Math.sin(angle) + point.y * Math.cos(angle);\r\n return { x, y };\r\n}\r\n\r\nexport function projectPolygon(polygon: Polygon, azimuth: number): Polygon {\r\n return {\r\n points: polygon.points.map((point) => projectPoint(point, azimuth)),\r\n type: polygon.type,\r\n closed: polygon.closed,\r\n _id: polygon._id,\r\n details: polygon.details,\r\n };\r\n}\r\n\r\nexport function offsetPolygon(polygon: Polygon, offset?: {x: number, y: number}): {polygon: Polygon, offset: {x: number, y: number}} {\r\n if (polygon.points.length === 0) {\r\n return { polygon: polygon, offset: {x: 0, y: 0} };\r\n }\r\n\r\n let offsetX = 0;\r\n let offsetY = 0;\r\n if (!offset) {\r\n const minX = Math.min(...polygon.points.map((point) => point.x));\r\n const minY = Math.min(...polygon.points.map((point) => point.y));\r\n const maxX = Math.max(...polygon.points.map((point) => point.x));\r\n const maxY = Math.max(...polygon.points.map((point) => point.y));\r\n\r\n offsetX = minX + (maxX - minX) / 2;\r\n offsetY = minY + (maxY - minY) / 2;\r\n }\r\n else {\r\n offsetX = offset.x;\r\n offsetY = offset.y;\r\n }\r\n\r\n const newPoints = polygon.points.map((point) => ({\r\n x: point.x - offsetX,\r\n y: point.y - offsetY,\r\n }));\r\n\r\n return { polygon: { ...polygon, points: newPoints }, offset: {x: offsetX, y: offsetY} };\r\n}\r\n\r\nfunction equalsPoints(point1: Point, point2: Point): boolean {\r\n return point1.x === point2.x && point1.y === point2.y;\r\n}\r\n\r\n/**\r\n * Checks if two lines intersect.\r\n * if the lines intersect in a start or end point they are not considered as intersecting\r\n * @param line1 The first line.\r\n * @param line2 The second line.\r\n * @returns True if the lines intersect, false otherwise.\r\n */\r\nexport function intersects(line1: Line, line2: Line): boolean {\r\n // Get the points of each line\r\n const p1 = line1.start;\r\n const p2 = line1.end;\r\n const p3 = line2.start;\r\n const p4 = line2.end;\r\n\r\n if (equalsPoints(p1, p3) || equalsPoints(p1, p4) || equalsPoints(p2, p3) || equalsPoints(p2, p4)) {\r\n return false;\r\n }\r\n\r\n // Calculate the cross products\r\n const d1 = (p4.x - p3.x) * (p1.y - p3.y) - (p4.y - p3.y) * (p1.x - p3.x);\r\n const d2 = (p4.x - p3.x) * (p2.y - p3.y) - (p4.y - p3.y) * (p2.x - p3.x);\r\n const d3 = (p2.x - p1.x) * (p3.y - p1.y) - (p2.y - p1.y) * (p3.x - p1.x);\r\n const d4 = (p2.x - p1.x) * (p4.y - p1.y) - (p2.y - p1.y) * (p4.x - p1.x);\r\n\r\n // Check if the lines intersect\r\n return (d1 * d2 < 0) && (d3 * d4 < 0);\r\n}\r\n\r\nexport function undoOffsetPolygon(polygon: Polygon, offset: {x: number, y: number}): Polygon {\r\n return {\r\n ...polygon,\r\n points: polygon.points.map((point) => ({\r\n x: point.x + offset.x,\r\n y: point.y + offset.y,\r\n })),\r\n };\r\n}\r\n\r\nexport function segmentPolygon(polygon: Polygon) {\r\n const segments: LineSegment[] = [];\r\n const segmentsMap: Record<string, boolean> = {};\r\n\r\n for (const point of polygon.points) {\r\n const intersections = getIntersections(point, polygon);\r\n for (const [index, intersection] of intersections.slice(0, -1).entries()) {\r\n const nextIntersection = intersections[index + 1];\r\n \r\n const halfPoint = {\r\n x: (intersection.x + nextIntersection.x) / 2,\r\n y: (intersection.y + nextIntersection.y) / 2,\r\n };\r\n\r\n const isInner = isPointInPolygon(halfPoint, polygon);\r\n const isOnBorder = isPointOnBorder(halfPoint, polygon);\r\n const key = `${intersection.x}-${intersection.y}-${nextIntersection.x}-${nextIntersection.y}`;\r\n \r\n if (segmentsMap[key]) {\r\n continue;\r\n }\r\n segments.push({ start: intersection, end: nextIntersection, type: isOnBorder ? \"border\" : (isInner ? \"inner\" : \"outer\") });\r\n segmentsMap[key] = true;\r\n }\r\n }\r\n return segments;\r\n}\r\n\r\n/**\r\n * for each segment this method will find all the following segments that are connected to it\r\n * \r\n * first the method subdivides the segments into y levels (all segments that have the same y coordinate are in the same level)\r\n * then it will check for each segment in each level if there is a following segment that is connected to it by checking it the \r\n * start point of the top segment to the end point of the bottom segment does not intersect with any of the polygon borders and the center point of the connection is in the polygon\r\n * \r\n * @param segments \r\n * @param roof \r\n * @returns \r\n */\r\nexport function matchSegments(segments: LineSegment[], roof: Polygon): {matches: SegmentMatch[], map: Record<string, LineSegment>} {\r\n const matches: SegmentMatch[] = [];\r\n const map: Record<string, LineSegment> = {};\r\n\r\n for (const segment of segments) {\r\n map[`${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`] = segment;\r\n }\r\n \r\n // Group segments by y-coordinate (level)\r\n const levels: Record<number, LineSegment[]> = {};\r\n segments.forEach(segment => {\r\n const y = segment.start.y;\r\n if (!levels[y]) {\r\n levels[y] = [];\r\n }\r\n levels[y].push(segment);\r\n });\r\n\r\n // Sort levels by y-coordinate\r\n const sortedLevels = Object.keys(levels).map(Number).sort((a, b) => a - b);\r\n\r\n // For each level except the last one\r\n for (let i = 0; i < sortedLevels.length - 1; i++) {\r\n const currentLevel = levels[sortedLevels[i]];\r\n const nextLevel = levels[sortedLevels[i + 1]];\r\n\r\n // For each segment in current level\r\n for (const currentSegment of currentLevel) {\r\n if (currentSegment.type === \"outer\") {\r\n continue;\r\n }\r\n const matchedSegments: LineSegment[] = [];\r\n \r\n // For each segment in next level\r\n for (const nextSegment of nextLevel) {\r\n // Check if segments can be connected\r\n const connectionStart = currentSegment.start;\r\n const connectionEnd = nextSegment.end;\r\n\r\n let intersected = false;\r\n for (let i = 0; i < roof.points.length; i++) {\r\n const line = {\r\n start: roof.points[i],\r\n end: roof.points[(i + 1) % roof.points.length]\r\n };\r\n if (intersects(line, {start: connectionStart, end: connectionEnd})) {\r\n intersected = true;\r\n break;\r\n }\r\n }\r\n\r\n if (intersected) {\r\n continue;\r\n }\r\n\r\n // Check if center point of connection is inside polygon\r\n const centerPoint = {\r\n x: (connectionStart.x + connectionEnd.x) / 2,\r\n y: (connectionStart.y + connectionEnd.y) / 2\r\n };\r\n\r\n if (isPointInPolygon(centerPoint, roof)) {\r\n matchedSegments.push(nextSegment);\r\n }\r\n }\r\n\r\n if (matchedSegments.length > 0) {\r\n matches.push({\r\n segment: `${currentSegment.start.x}-${currentSegment.start.y}-${currentSegment.end.x}-${currentSegment.end.y}`,\r\n matchedSegments: matchedSegments.map(segment => `${segment.start.x}-${segment.start.y}-${segment.end.x}-${segment.end.y}`)\r\n });\r\n }\r\n }\r\n }\r\n\r\n return {matches, map};\r\n}\r\n\r\n\r\n/**\r\n * Uses the bounding box of the roof and the roof segment bounding boxes to find the best fitting roof segment.\r\n * @param roof the roof shape\r\n * @param roofSegmentStats the stats of the roof segments\r\n * @returns the best fitting roof segment\r\n */\r\nexport function getBestFittingRoofSegment(roof: Polygon, roofSegmentStats: RoofSegmentSizeAndSunshineStats[], bounds: Bounds, canvas: HTMLCanvasElement): RoofSegmentSizeAndSunshineStats {\r\n const polygonBounds = {\r\n minX: Math.min(...roof.points.map((p) => p.x)),\r\n maxX: Math.max(...roof.points.map((p) => p.x)),\r\n minY: Math.min(...roof.points.map((p) => p.y)),\r\n maxY: Math.max(...roof.points.map((p) => p.y)),\r\n };\r\n\r\n let bestSegment = null;\r\n let bestIoU = 0;\r\n\r\n for (const segment of roofSegmentStats) {\r\n const sw = latLngToPixel(bounds, canvas, {\r\n latitude: segment.boundingBox.sw.latitude,\r\n longitude: segment.boundingBox.sw.longitude,\r\n } as LatLng);\r\n const ne = latLngToPixel(bounds, canvas, {\r\n latitude: segment.boundingBox.ne.latitude,\r\n longitude: segment.boundingBox.ne.longitude,\r\n } as LatLng);\r\n const segmentBounds = {\r\n minX: sw.x,\r\n maxX: ne.x,\r\n minY: ne.y,\r\n maxY: sw.y,\r\n };\r\n\r\n // Calculate intersection\r\n const interLeft = Math.max(polygonBounds.minX, segmentBounds.minX);\r\n const interRight = Math.min(polygonBounds.maxX, segmentBounds.maxX);\r\n const interTop = Math.max(polygonBounds.minY, segmentBounds.minY);\r\n const interBottom = Math.min(polygonBounds.maxY, segmentBounds.maxY);\r\n\r\n const interWidth = interRight - interLeft;\r\n const interHeight = interBottom - interTop;\r\n let intersectionArea = 0;\r\n if (interWidth > 0 && interHeight > 0) {\r\n intersectionArea = interWidth * interHeight;\r\n }\r\n\r\n const polygonArea = (polygonBounds.maxX - polygonBounds.minX) * (polygonBounds.maxY - polygonBounds.minY);\r\n const segmentArea = (segmentBounds.maxX - segmentBounds.minX) * (segmentBounds.maxY - segmentBounds.minY);\r\n const unionArea = polygonArea + segmentArea - intersectionArea;\r\n const iou = unionArea > 0 ? intersectionArea / unionArea : 0;\r\n\r\n if (iou > bestIoU) {\r\n bestIoU = iou;\r\n bestSegment = segment;\r\n }\r\n }\r\n\r\n return bestSegment;\r\n}\r\n"]}
|
|
@@ -58,6 +58,7 @@ export const en = {
|
|
|
58
58
|
chargingTime: "Charging Time",
|
|
59
59
|
chargingTimeDay: "Day (06:00 - 18:00)",
|
|
60
60
|
chargingTimeNight: "Night (18:00 - 06:00)",
|
|
61
|
+
kilometersPerYear: "Kilometers per Year",
|
|
61
62
|
},
|
|
62
63
|
annualPriceIncrease: "Annual Price Increase (%)",
|
|
63
64
|
costSavings25Years: "25-Year Savings",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"english.js","sourceRoot":"","sources":["../../../src/utils/lang/english.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAoB;IAC/B,QAAQ,EAAE;QACN,QAAQ,EAAE,UAAU;QACpB,UAAU,EAAE,aAAa;QACzB,aAAa,EAAE,gBAAgB;QAC/B,WAAW,EAAE,cAAc;KAC9B;IACD,WAAW,EAAE;QACT,WAAW,EAAE,gGAAgG;QAC7G,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,eAAe;KAC/B;IACD,WAAW,EAAE;QACT,iBAAiB,EAAE,yBAAyB;KAC/C;IACD,eAAe,EAAE;QACb,KAAK,EAAE,4BAA4B;QACnC,iBAAiB,EAAE,oBAAoB;QACvC,cAAc,EAAE,wBAAwB;QACxC,cAAc,EAAE,uBAAuB;QACvC,oBAAoB,EAAE,8BAA8B;QACpD,gBAAgB,EAAE,2BAA2B;QAC7C,gBAAgB,EAAE,2BAA2B;QAC7C,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,uBAAuB;QACpC,yBAAyB,EAAE,mCAAmC;QAC9D,uBAAuB,EAAE,qBAAqB;QAC9C,qBAAqB,EAAE,mBAAmB;QAC1C,qBAAqB,EAAE,mBAAmB;QAC1C,YAAY,EAAE,SAAS;QACvB,iBAAiB,EAAE,8EAA8E;QACjG,iBAAiB,EAAE,0BAA0B;QAC7C,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,wBAAwB;QACnC,UAAU,EAAE,oCAAoC;QAChD,mBAAmB,EAAE;YACjB,YAAY,EAAE,gBAAgB;YAC9B,UAAU,EAAE,aAAa;SAC5B;QACD,KAAK,EAAE;YACH,WAAW,EAAE,aAAa;YAC1B,UAAU,EAAE,YAAY;YACxB,kBAAkB,EAAE,qBAAqB;YACzC,mBAAmB,EAAE,sBAAsB;YAC3C,SAAS,EAAE,aAAa;SAC3B;QACD,eAAe,EAAE,oCAAoC;QACrD,YAAY,EAAE,eAAe;QAC7B,kBAAkB,EAAE,eAAe;QACnC,IAAI,EAAE,MAAM;QACZ,oBAAoB,EAAE;YAClB,KAAK,EAAE,uBAAuB;YAC9B,QAAQ,EAAE,WAAW;YACrB,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,eAAe;YAC7B,eAAe,EAAE,qBAAqB;YACtC,iBAAiB,EAAE,uBAAuB;
|
|
1
|
+
{"version":3,"file":"english.js","sourceRoot":"","sources":["../../../src/utils/lang/english.ts"],"names":[],"mappings":"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","sourcesContent":["import { LanguageStrings } from \"../../types/lang\";\r\n\r\nexport const en: LanguageStrings = {\r\n settings: {\r\n language: \"Language\",\r\n rowSpacing: \"Row Spacing\",\r\n columnSpacing: \"Column Spacing\",\r\n borderInset: \"Border Inset\",\r\n },\r\n mapSelector: {\r\n explanation: \"Select your house on the map and adjust the radius of the circle to fully encompase your roof.\",\r\n radius: \"Radius (meters)\",\r\n accept: \"Accept\",\r\n chooseOnMap: \"Choose on Map\",\r\n },\r\n solarExpert: {\r\n searchPlaceholder: \"Search for your address\"\r\n },\r\n solarSystemForm: {\r\n title: \"Solar System Configuration\",\r\n systemInformation: \"System Information\",\r\n numberOfPanels: \"Number of Solar Panels\",\r\n panelPeakPower: \"Panel Peak Power (kW)\",\r\n totalSystemPeakPower: \"Total System Peak Power (kW)\",\r\n electricityPrice: \"Electricity Price (€/kWh)\",\r\n compensationRate: \"Compensation Rate (€/kWh)\",\r\n autonomy: \"Autonomy\",\r\n costSavings: \"Cost Savings (€/year)\",\r\n householdConsumptionTitle: \"Household Electricity Consumption\",\r\n consumptionProfileTitle: \"Consumption Profile\",\r\n electricityCostsTitle: \"Electricity Costs\",\r\n compensationRateTitle: \"Compensation Rate\",\r\n resultsTitle: \"Results\",\r\n savingsDisclaimer: \"Disclaimer: The savings are based on the average electricity price in Spain.\",\r\n annualConsumption: \"Annual Consumption (kWh)\",\r\n name: \"Name\",\r\n email: \"Email\",\r\n nameError: \"Please enter your name\",\r\n emailError: \"Please enter a valid email address\",\r\n consumptionProfiles: {\r\n mostlyAtHome: \"Mostly at home\",\r\n mostlyAway: \"Mostly away\",\r\n },\r\n chart: {\r\n consumption: \"Consumption\",\r\n production: \"Production\",\r\n consumptionProfile: \"Consumption Profile\",\r\n relativeConsumption: \"Relative Consumption\",\r\n hourOfDay: \"Hour of Day\",\r\n },\r\n validEmailError: \"Please enter a valid email address\",\r\n requestOffer: \"Request Offer\",\r\n requestOfferButton: \"Request Offer\",\r\n year: \"year\",\r\n additionalComponents: {\r\n title: \"Additional Components\",\r\n heatPump: \"Heat Pump\",\r\n electricCar: \"Electric Car\",\r\n battery: \"Battery\",\r\n chargingTime: \"Charging Time\",\r\n chargingTimeDay: \"Day (06:00 - 18:00)\",\r\n chargingTimeNight: \"Night (18:00 - 06:00)\",\r\n kilometersPerYear: \"Kilometers per Year\",\r\n },\r\n annualPriceIncrease: \"Annual Price Increase (%)\",\r\n costSavings25Years: \"25-Year Savings\",\r\n },\r\n mapDraw: {\r\n instructions: {\r\n show: \"Show Instructions\",\r\n hide: \"Hide Instructions\",\r\n parts: {\r\n roof: \"After you have searched and selected your address. Highlight the part of your roof that you want to add solar panels to. Mark each surface with a polygon with the roof tool\",\r\n obstruction: \". If you have skylights or other obstructions where you don't want to add solar panels, mark those as well with the obstruction tool\",\r\n delete: \". You can delete polygons with the delete tool\",\r\n move: \". If you want to change the corners of a polygon, select the move tool\",\r\n end: \", select the polygon you want to change and drag and drop the corners.\",\r\n }\r\n },\r\n noPolygonSelected: \"No polygon selected\",\r\n noAddressSelected: \"Please select an address\",\r\n information: \"Information\",\r\n calculateSolarPanels: \"Calculate Solar Panels\",\r\n markRoofEdge: \"Mark lower roof edge\",\r\n panels: \"Panels\",\r\n area: \"Area\",\r\n azimuth: \"Azimuth\",\r\n pitch: \"Pitch\",\r\n tools: {\r\n roof: {\r\n name: \"Roof\",\r\n explanation: \"Draw the roof of the building\",\r\n ariaLabel: \"Roof\",\r\n },\r\n obstruction: {\r\n name: \"Obstruction\",\r\n explanation: \"Draw the obstruction of the building\",\r\n ariaLabel: \"Obstruction\",\r\n },\r\n delete: {\r\n name: \"Delete\",\r\n explanation: \"Delete the selected polygon\",\r\n ariaLabel: \"Delete\",\r\n },\r\n move: {\r\n name: \"Move\",\r\n explanation: \"Move the selected polygon\",\r\n ariaLabel: \"Move\",\r\n },\r\n undo: {\r\n name: \"Undo\",\r\n explanation: \"Undo the last action\",\r\n ariaLabel: \"Undo\",\r\n }\r\n },\r\n }\r\n}"]}
|
|
@@ -58,6 +58,7 @@ export const de = {
|
|
|
58
58
|
chargingTime: "Zeitpunkt der Ladung",
|
|
59
59
|
chargingTimeDay: "Tag (06:00 - 18:00)",
|
|
60
60
|
chargingTimeNight: "Nacht (18:00 - 06:00)",
|
|
61
|
+
kilometersPerYear: "Kilometer pro Jahr",
|
|
61
62
|
},
|
|
62
63
|
annualPriceIncrease: "Jährliche Preissteigerung (%) ",
|
|
63
64
|
costSavings25Years: "25-Jährige Einsparungen",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"german.js","sourceRoot":"","sources":["../../../src/utils/lang/german.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAoB;IAC/B,QAAQ,EAAE;QACN,QAAQ,EAAE,SAAS;QACnB,UAAU,EAAE,eAAe;QAC3B,aAAa,EAAE,gBAAgB;QAC/B,WAAW,EAAE,aAAa;KAC7B;IACD,WAAW,EAAE;QACT,WAAW,EAAE,sHAAsH;QACnI,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,aAAa;QACrB,WAAW,EAAE,yBAAyB;KACzC;IACD,WAAW,EAAE;QACT,iBAAiB,EAAE,cAAc;KACpC;IACD,eAAe,EAAE;QACb,KAAK,EAAE,2BAA2B;QAClC,iBAAiB,EAAE,oBAAoB;QACvC,cAAc,EAAE,uBAAuB;QACvC,cAAc,EAAE,oBAAoB;QACpC,oBAAoB,EAAE,oBAAoB;QAC1C,gBAAgB,EAAE,oBAAoB;QACtC,gBAAgB,EAAE,4BAA4B;QAC9C,QAAQ,EAAE,UAAU;QACpB,WAAW,EAAE,uBAAuB;QACpC,yBAAyB,EAAE,oBAAoB;QAC/C,uBAAuB,EAAE,iBAAiB;QAC1C,qBAAqB,EAAE,aAAa;QACpC,qBAAqB,EAAE,oBAAoB;QAC3C,YAAY,EAAE,YAAY;QAC1B,iBAAiB,EAAE,6FAA6F;QAChH,iBAAiB,EAAE,4BAA4B;QAC/C,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,iCAAiC;QAC5C,UAAU,EAAE,iDAAiD;QAC7D,mBAAmB,EAAE;YACjB,YAAY,EAAE,wBAAwB;YACtC,UAAU,EAAE,cAAc;SAC7B;QACD,KAAK,EAAE;YACH,WAAW,EAAE,WAAW;YACxB,UAAU,EAAE,YAAY;YACxB,kBAAkB,EAAE,iBAAiB;YACrC,mBAAmB,EAAE,WAAW;YAChC,SAAS,EAAE,kBAAkB;SAChC;QACD,eAAe,EAAE,iDAAiD;QAClE,YAAY,EAAE,mBAAmB;QACjC,kBAAkB,EAAE,mBAAmB;QACvC,IAAI,EAAE,MAAM;QACZ,oBAAoB,EAAE;YAClB,KAAK,EAAE,cAAc;YACrB,QAAQ,EAAE,YAAY;YACtB,WAAW,EAAE,aAAa;YAC1B,OAAO,EAAE,UAAU;YACnB,YAAY,EAAE,sBAAsB;YACpC,eAAe,EAAE,qBAAqB;YACtC,iBAAiB,EAAE,uBAAuB;
|
|
1
|
+
{"version":3,"file":"german.js","sourceRoot":"","sources":["../../../src/utils/lang/german.ts"],"names":[],"mappings":"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","sourcesContent":["import { LanguageStrings } from \"../../types/lang\";\r\n\r\nexport const de: LanguageStrings = {\r\n settings: {\r\n language: \"Sprache\",\r\n rowSpacing: \"Zeilenabstand\",\r\n columnSpacing: \"Spaltenabstand\",\r\n borderInset: \"Randabstand\",\r\n },\r\n mapSelector: {\r\n explanation: \"Wählen Sie Ihre Adresse auf der Karte und passen Sie den Radius des Kreises an, um Ihr Dach vollständig zu erfassen.\",\r\n radius: \"Radius (Meter)\",\r\n accept: \"Akzeptieren\",\r\n chooseOnMap: \"Auf der Karte auswählen\",\r\n },\r\n solarExpert: {\r\n searchPlaceholder: \"Ihre Adresse\"\r\n },\r\n solarSystemForm: {\r\n title: \"Solarsystem Konfiguration\",\r\n systemInformation: \"System Information\",\r\n numberOfPanels: \"Anzahl der Solarpanel\",\r\n panelPeakPower: \"Panelleistung (kW)\",\r\n totalSystemPeakPower: \"Anlagengröße (kWp)\",\r\n electricityPrice: \"Strompreis (€/kWh)\",\r\n compensationRate: \"Einspeisevergütung (€/kWh)\",\r\n autonomy: \"Autarkie\",\r\n costSavings: \"Einsparungen (€/Jahr)\",\r\n householdConsumptionTitle: \"Haushaltsverbrauch\",\r\n consumptionProfileTitle: \"Verbrauchprofil\",\r\n electricityCostsTitle: \"Stromkosten\",\r\n compensationRateTitle: \"Einspeisevergütung\",\r\n resultsTitle: \"Ergebnisse\",\r\n savingsDisclaimer: \"Disclaimer: Die Einsparungen basieren auf dem durchschnittlichen Strompreis in Deutschland.\",\r\n annualConsumption: \"Jährlicher Verbrauch (kWh)\",\r\n name: \"Name\",\r\n email: \"Email\",\r\n nameError: \"Bitte geben Sie Ihren Namen ein\",\r\n emailError: \"Bitte geben Sie eine gültige E-Mail-Adresse ein\",\r\n consumptionProfiles: {\r\n mostlyAtHome: \"Hauptsächlich zu Hause\",\r\n mostlyAway: \"Erwerbstätig\",\r\n },\r\n chart: {\r\n consumption: \"Verbrauch\",\r\n production: \"Produktion\",\r\n consumptionProfile: \"Verbrauchprofil\",\r\n relativeConsumption: \"Verbrauch\",\r\n hourOfDay: \"Stunde des Tages\",\r\n },\r\n validEmailError: \"Bitte geben Sie eine gültige E-Mail-Adresse ein\",\r\n requestOffer: \"Angebot anfordern\",\r\n requestOfferButton: \"Angebot anfordern\",\r\n year: \"Jahr\",\r\n additionalComponents: {\r\n title: \"Zusätzliches\",\r\n heatPump: \"Wärmepumpe\",\r\n electricCar: \"Elektroauto\",\r\n battery: \"Batterie\",\r\n chargingTime: \"Zeitpunkt der Ladung\",\r\n chargingTimeDay: \"Tag (06:00 - 18:00)\",\r\n chargingTimeNight: \"Nacht (18:00 - 06:00)\",\r\n kilometersPerYear: \"Kilometer pro Jahr\",\r\n },\r\n annualPriceIncrease: \"Jährliche Preissteigerung (%)\t\",\r\n costSavings25Years: \"25-Jährige Einsparungen\",\r\n },\r\n mapDraw: {\r\n instructions: {\r\n show: \"Anleitung anzeigen\",\r\n hide: \"Anleitung ausblenden\",\r\n parts: {\r\n roof: \"Nachdem Sie Ihre Adresse gesucht und ausgewählt haben. Markieren Sie die Teile Ihres Daches, auf denen Sie Solarpanelleisten hinzufügen möchten. Markieren Sie jede Oberfläche mit einem Polygon mit dem Dachwerkzeug\",\r\n obstruction: \". Wenn Sie Dachfenster oder andere Hindernisse haben, auf denen Sie keine Solarpanele hinzufügen können, markieren Sie diese mit dem Hinderniswerkzeug\",\r\n delete: \". Sie können Polygone mit dem Löschwerkzeug löschen\",\r\n move: \". Wenn Sie die Ecken eines Polygons ändern möchten, wählen Sie das Verschiebewerkzeug\",\r\n end: \", wählen Sie das Polygon, das Sie ändern möchten, und verschieben Sie die Ecken.\",\r\n }\r\n },\r\n markRoofEdge: \"untere Dachkante markieren\",\r\n noPolygonSelected: \"Kein Polygon ausgewählt\",\r\n noAddressSelected: \"Bitte wählen Sie eine Adresse\",\r\n information: \"Information\",\r\n calculateSolarPanels: \"Berechnen Sie die Solarpanele\",\r\n panels: \"Panele\",\r\n area: \"Fläche\",\r\n azimuth: \"Ausrichtung\",\r\n pitch: \"Neigung\",\r\n tools: {\r\n roof: {\r\n name: \"Dach\",\r\n explanation: \"Zeichnen Sie das Dach des Gebäudes\",\r\n ariaLabel: \"Dach\",\r\n },\r\n obstruction: {\r\n name: \"Hindernis\",\r\n explanation: \"Zeichnen Sie das Hindernis des Gebäudes\",\r\n ariaLabel: \"Hindernis\",\r\n },\r\n delete: {\r\n name: \"Löschen\",\r\n explanation: \"Löschen Sie das ausgewählte Polygon\",\r\n ariaLabel: \"Löschen\",\r\n },\r\n move: {\r\n name: \"Verschieben\",\r\n explanation: \"Verschieben Sie Punkte des ausgewählten Polygons\",\r\n ariaLabel: \"Verschieben\",\r\n },\r\n undo: {\r\n name: \"Rückgängig\",\r\n explanation: \"Sie die letzte Aktion rückgängig\",\r\n ariaLabel: \"Rückgängig\",\r\n }\r\n },\r\n }\r\n}"]}
|
|
@@ -58,6 +58,7 @@ export const es = {
|
|
|
58
58
|
chargingTime: "Hora de carga",
|
|
59
59
|
chargingTimeDay: "Día (06:00 - 18:00)",
|
|
60
60
|
chargingTimeNight: "Noche (18:00 - 06:00)",
|
|
61
|
+
kilometersPerYear: "Kilómetros por año",
|
|
61
62
|
},
|
|
62
63
|
annualPriceIncrease: "Aumento anual del precio (%)",
|
|
63
64
|
costSavings25Years: "Ahorro en 25 años",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spanish.js","sourceRoot":"","sources":["../../../src/utils/lang/spanish.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,EAAE,GAAoB;IAC/B,QAAQ,EAAE;QACN,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,oBAAoB;QAChC,aAAa,EAAE,uBAAuB;QACtC,WAAW,EAAE,qBAAqB;KACrC;IACD,WAAW,EAAE;QACT,WAAW,EAAE,kGAAkG;QAC/G,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,SAAS;QACjB,WAAW,EAAE,wBAAwB;KACxC;IACD,WAAW,EAAE;QACT,iBAAiB,EAAE,qBAAqB;KAC3C;IACD,eAAe,EAAE;QACb,KAAK,EAAE,iCAAiC;QACxC,iBAAiB,EAAE,yBAAyB;QAC5C,cAAc,EAAE,2BAA2B;QAC3C,cAAc,EAAE,8BAA8B;QAC9C,oBAAoB,EAAE,sCAAsC;QAC5D,gBAAgB,EAAE,mCAAmC;QACrD,gBAAgB,EAAE,8BAA8B;QAChD,QAAQ,EAAE,WAAW;QACrB,WAAW,EAAE,gBAAgB;QAC7B,yBAAyB,EAAE,oBAAoB;QAC/C,uBAAuB,EAAE,mBAAmB;QAC5C,qBAAqB,EAAE,2BAA2B;QAClD,qBAAqB,EAAE,sBAAsB;QAC7C,YAAY,EAAE,YAAY;QAC1B,iBAAiB,EAAE,gFAAgF;QACnG,iBAAiB,EAAE,qBAAqB;QACxC,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,8BAA8B;QACzC,UAAU,EAAE,+DAA+D;QAC3E,mBAAmB,EAAE;YACjB,YAAY,EAAE,wBAAwB;YACtC,UAAU,EAAE,QAAQ;SACvB;QACD,KAAK,EAAE;YACH,WAAW,EAAE,SAAS;YACtB,UAAU,EAAE,YAAY;YACxB,kBAAkB,EAAE,mBAAmB;YACvC,mBAAmB,EAAE,SAAS;YAC9B,SAAS,EAAE,cAAc;SAC5B;QACD,eAAe,EAAE,+DAA+D;QAChF,YAAY,EAAE,sBAAsB;QACpC,kBAAkB,EAAE,kBAAkB;QACtC,IAAI,EAAE,KAAK;QACX,oBAAoB,EAAE;YAClB,KAAK,EAAE,yBAAyB;YAChC,QAAQ,EAAE,SAAS;YACnB,WAAW,EAAE,iBAAiB;YAC9B,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,eAAe;YAC7B,eAAe,EAAE,qBAAqB;YACtC,iBAAiB,EAAE,uBAAuB;
|
|
1
|
+
{"version":3,"file":"spanish.js","sourceRoot":"","sources":["../../../src/utils/lang/spanish.ts"],"names":[],"mappings":"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","sourcesContent":["import { LanguageStrings } from \"../../types/lang\";\r\n\r\nexport const es: LanguageStrings = {\r\n settings: {\r\n language: \"Idioma\",\r\n rowSpacing: \"Espaciado de filas\",\r\n columnSpacing: \"Espaciado de columnas\",\r\n borderInset: \"Espaciado de bordes\",\r\n },\r\n mapSelector: {\r\n explanation: \"Selecciona tu casa en el mapa y ajusta el radio del círculo para cubrir completamente tu tejado.\",\r\n radius: \"Radio (metros)\",\r\n accept: \"Aceptar\",\r\n chooseOnMap: \"Seleccionar en el mapa\",\r\n },\r\n solarExpert: {\r\n searchPlaceholder: \"Buscar tu dirección\"\r\n },\r\n solarSystemForm: {\r\n title: \"Configuración del sistema solar\",\r\n systemInformation: \"Información del sistema\",\r\n numberOfPanels: \"Número de paneles solares\",\r\n panelPeakPower: \"Potencia pico del panel (kW)\",\r\n totalSystemPeakPower: \"Potencia pico total del sistema (kW)\",\r\n electricityPrice: \"Precio de la electricidad (€/kWh)\",\r\n compensationRate: \"Tasa de compensación (€/kWh)\",\r\n autonomy: \"Autonomía\",\r\n costSavings: \"Ahorro (€/año)\",\r\n householdConsumptionTitle: \"Consumo de la casa\",\r\n consumptionProfileTitle: \"Perfil de consumo\",\r\n electricityCostsTitle: \"Costes de la electricidad\",\r\n compensationRateTitle: \"Tasa de compensación\",\r\n resultsTitle: \"Resultados\",\r\n savingsDisclaimer: \"Nota: Los ahorros se basan en el precio promedio de la electricidad en España.\",\r\n annualConsumption: \"Consumo anual (kWh)\",\r\n name: \"Nombre\",\r\n email: \"Email\",\r\n nameError: \"Por favor, ingrese su nombre\",\r\n emailError: \"Por favor, ingrese una dirección de correo electrónico válida\",\r\n consumptionProfiles: {\r\n mostlyAtHome: \"Principalmente en casa\",\r\n mostlyAway: \"Empleo\",\r\n },\r\n chart: {\r\n consumption: \"Consumo\",\r\n production: \"Producción\",\r\n consumptionProfile: \"Perfil de consumo\",\r\n relativeConsumption: \"Consumo\",\r\n hourOfDay: \"Hora del día\",\r\n },\r\n validEmailError: \"Por favor, ingrese una dirección de correo electrónico válida\",\r\n requestOffer: \"Solicitar una oferta\",\r\n requestOfferButton: \"Solicitar oferta\",\r\n year: \"Año\",\r\n additionalComponents: {\r\n title: \"Componentes adicionales\",\r\n heatPump: \"Caldera\",\r\n electricCar: \"Coche eléctrico\",\r\n battery: \"Batería\",\r\n chargingTime: \"Hora de carga\",\r\n chargingTimeDay: \"Día (06:00 - 18:00)\",\r\n chargingTimeNight: \"Noche (18:00 - 06:00)\",\r\n kilometersPerYear: \"Kilómetros por año\",\r\n },\r\n annualPriceIncrease: \"Aumento anual del precio (%)\",\r\n costSavings25Years: \"Ahorro en 25 años\",\r\n },\r\n mapDraw: {\r\n instructions: {\r\n show: \"Mostrar instrucciones\",\r\n hide: \"Ocultar instrucciones\",\r\n parts: {\r\n roof: \"Después de buscar y seleccionar su dirección, resalte la parte del tejado donde desea añadir paneles solares. Marque cada superficie con un polígono con la herramienta de tejado\",\r\n obstruction: \". Si tiene claraboyas u otras obstrucciones donde no desea añadir paneles solares, márquelas también con la herramienta de obstrucción\",\r\n delete: \". Puede eliminar polígonos con la herramienta de eliminación\",\r\n move: \". Si desea cambiar las esquinas de un polígono, seleccione la herramienta de movimiento\",\r\n end: \", seleccione el polígono que desea modificar y arrastre y suelte los bordes.\",\r\n }\r\n },\r\n markRoofEdge: \"Marcar borde inferior del tejado\",\r\n noPolygonSelected: \"No se ha seleccionado un polígono\",\r\n noAddressSelected: \"Por favor, seleccione una dirección\",\r\n information: \"Información\",\r\n calculateSolarPanels: \"Calcular paneles solares\",\r\n panels: \"Paneles\",\r\n area: \"Área\",\r\n azimuth: \"Azimut\",\r\n pitch: \"Inclinación\",\r\n tools: {\r\n roof: {\r\n name: \"Tejado\",\r\n explanation: \"Dibuje el tejado del edificio\",\r\n ariaLabel: \"Tejado\",\r\n },\r\n obstruction: {\r\n name: \"Obstrucción\",\r\n explanation: \"Dibuje la obstrucción del edificio\",\r\n ariaLabel: \"Obstrucción\",\r\n },\r\n delete: {\r\n name: \"Eliminar\",\r\n explanation: \"Elimine el polígono seleccionado\",\r\n ariaLabel: \"Eliminar\",\r\n },\r\n move: {\r\n name: \"Mover\",\r\n explanation: \"Mueva los puntos del polígono seleccionado\",\r\n ariaLabel: \"Mover\",\r\n },\r\n undo: {\r\n name: \"Deshacer\",\r\n explanation: \"Deshaga la última acción\",\r\n ariaLabel: \"Deshacer\",\r\n }\r\n },\r\n }\r\n}"]}
|
|
@@ -8,7 +8,7 @@ const LoadingWidget$1 = /*@__PURE__*/ proxyCustomElement(class LoadingWidget ext
|
|
|
8
8
|
this.__registerHost();
|
|
9
9
|
}
|
|
10
10
|
render() {
|
|
11
|
-
return (h("div", { key: '
|
|
11
|
+
return (h("div", { key: '90187981b5843b365c5f8bf66c575f31d4fa5cca', class: "absolute flex items-center justify-center bg-white bg-opacity-75 z-20 pt-7 rounded-4xl" }, h("div", { key: 'c98e2aa7f46344897cbeeb85cabb8d962fb0f138', class: "animate-spin rounded-full h-16 w-16 border-t-2 border-b-2 border-[#271200]" })));
|
|
12
12
|
}
|
|
13
13
|
static get style() { return outputCss; }
|
|
14
14
|
}, [0, "loading-widget"]);
|