import { useState, useEffect } from "react"; import { useRouter } from "next/router"; import { Card, CardHeader, CardContent, CardTitle, CardDescription, Button, Input, Textarea, Alert } from "../ui/components"; import { ChartBarIcon, ArrowDownTrayIcon as DownloadIcon, EyeIcon } from '@heroicons/react/24/outline'; import axios from "axios"; export default function Generator() { const [profil, setProfil] = useState(); const [args, setArgs] = useState({ scale: 200, elementOne: 0, elementTwo: 0, }); const [isLoading, setIsLoading] = useState(false); const [previewVisible, setPreviewVisible] = useState(false); const { query } = useRouter(); const ElementOneOptions = [ { label: "Nic", value: "0" }, { label: "Słup", value: "1" }, { label: "Dom", value: "2" }, ]; const ElementTwoOptions = [ { label: "Nic", value: "0" }, { label: "Słup", value: "1" }, { label: "Dom", value: "2" }, ]; useEffect(() => { if (query.external == "tru") { axios .post("/api/readtext", { id: query.id, }) .then(function (response) { setProfil(response.data.data); document.getElementById("textarea-1").value = response.data.data; console.log(response.data.data); }); } }, []); const getPath = (e, path) => { let newLines = []; for (let line of path.split("\n")) { if (line[0] == "P") continue; if (line[0] == "S") continue; if (line[0] == "X") continue; newLines.push(line); } let xs = [], ys = [], zs = []; let toti = 0, al = 0; for (let line of newLines) { al += 1; let theLine = line.split(","); if (xs && parseFloat(theLine[0]) == xs[-1] && parseFloat(theLine[1]) == ys[-1]) continue; if (al > 2) { let dist = ((xs[xs.length - 1] - xs[xs.length - 2]) ** 2 + (ys[ys.length - 1] - ys[ys.length - 2]) ** 2) ** 0.5; toti += Math.round(dist); } xs.push(parseFloat(theLine[0])); ys.push(parseFloat(theLine[1])); zs.push(parseFloat(theLine[2])); } const canvas = document.getElementById("canvas"); if (!canvas.getContext) { console.log("canvas err"); return; } const ctx = canvas.getContext("2d"); ctx.clearRect(0, 0, 700, 500); ctx.strokeStyle = "#3B82F6"; ctx.lineWidth = 2; let scaleFactor = 100000 / 2000; let totalH = Math.max(...zs); let minH = Math.min(...zs); for (let line = 0; line < xs.length - 1; line++) { let x1 = line * scaleFactor; let y1 = zs[line]; let x2 = (line + 1) * scaleFactor; let y2 = zs[line + 1]; let b0 = 50, b1 = 450; let z1 = b0 + (b1 - b0) * ((y1 - totalH) / (minH - totalH)); let z2 = b0 + (b1 - b0) * ((y2 - totalH) / (minH - totalH)); let x12 = b0 + (b1 - b0) * ((x1 - 0) / (toti * scaleFactor)); let x22 = b0 + (b1 - b0) * ((x2 - 0) / (toti * scaleFactor)); ctx.beginPath(); ctx.moveTo(x12, z1); ctx.lineTo(x22, z2); ctx.stroke(); } setPreviewVisible(true); }; const py = (e, profil, args) => { e.preventDefault(); setIsLoading(true); axios .post("/api/spawn", { profil: profil, arguments: args, }) .then(function (response) { setIsLoading(false); console.log(response); if (response.data.toString().startsWith("Py Error")) { alert("Błąd: " + response.data); return; } document.getElementById("down").download = response.data.filename.toString() + ".dxf"; document.getElementById("down").click(); }) .catch(function (error) { setIsLoading(false); console.log(error); }); }; return (
Wprowadź dane aby zobaczyć podgląd profilu
Skopiuj dane z Geoportalu w formacie "Próbkowanie: 1"
Ustaw skalę i wybierz elementy dodatkowe
Kliknij "Generuj profil" aby pobrać plik DXF