diff --git a/.gitignore b/.gitignore index a8a7589..dbc0b53 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ a.py *.txt *.dxf /public/*.dxf +/public/uploads/* /pages/api/auth/* /cypress diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7f373cc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +# Build stage +FROM node:16 AS builder +WORKDIR /panel +COPY . . +RUN npm install && npm run build + +# Final stage: Node.js + Python + ezdxf +FROM node:16 + +# Install Python and pip +RUN apt-get update && apt-get install -y python3 python3-pip && \ + pip3 install --no-cache-dir ezdxf && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +# Copy Node app +WORKDIR /panel +COPY --from=builder /panel ./ +RUN npm install --omit=dev + +EXPOSE 3000 +CMD ["npm", "run", "start"] diff --git a/components/templates/generator.js b/components/templates/generator.js index 6a5ea2a..ac035a0 100644 --- a/components/templates/generator.js +++ b/components/templates/generator.js @@ -1,4 +1,5 @@ -import { useState } from "react"; +import { useState, useEffect } from "react"; +import { useRouter } from "next/router"; import { Pane, TextInputField, @@ -7,13 +8,44 @@ import { BuildIcon, toaster, Alert, + RadioGroup, } from "evergreen-ui"; import axios from "axios"; + import Footer from "./footer"; export default function Generator() { const [profil, setProfil] = useState(); - const [args, setArgs] = useState({ scale: 200 }); + const [args, setArgs] = useState({ + scale: 200, + elementOne: 0, + elementTwo: 0, + }); + const [ElementOneOptions] = useState([ + { label: "Nic", value: "0" }, + { label: "Słup", value: "1" }, + { label: "Dom", value: "2" }, + ]); + const [ElementTwoOptions] = useState([ + { label: "Nic", value: "0" }, + { label: "Słup", value: "1" }, + { label: "Dom", value: "2" }, + ]); + const { query } = useRouter(); + + 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 = []; @@ -148,6 +180,22 @@ export default function Generator() { setArgs({ ...args, scale: e.target.value }); }} /> + { + setArgs({ ...args, elementOne: event.target.value }); + }} + /> + { + setArgs({ ...args, elementTwo: event.target.value }); + }} + /> + + + {" "} + + + + ); + } + return ( +
+ + Wastpol + +
+

Nie zalogowano

+

+ +
+
+ ); +} diff --git a/pages/uziomy.js b/pages/uziomy.js new file mode 100644 index 0000000..8fbebe1 --- /dev/null +++ b/pages/uziomy.js @@ -0,0 +1,551 @@ +import Head from "next/head"; +import styles from "../styles/Home.module.css"; +import Nav from "../components/templates/nav"; +import UserTop from "../components/templates/userTop"; +import { useSession, signIn, signOut } from "next-auth/react"; +import { useState, useCallback } from "react"; +import { + Pane, + TextInputField, + TextareaField, + Button, + BuildIcon, + toaster, + Alert, + FileUploader, + FilePicker, + FileCard, + RadioGroup, + Autocomplete, +} from "evergreen-ui"; + +import PizZip from "pizzip"; +import Docxtemplater from "docxtemplater"; +import DatePicker from "react-datepicker"; +import { registerLocale, setDefaultLocale } from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import pl from "date-fns/locale/pl"; +registerLocale("pl", pl); + +export default function Rezy() { + const { data: session } = useSession(); + const [currentStep, setCurrentStep] = useState(1); + + const [ground, setGround] = useState({ + wet_coef: 0, + resistivity: 0, + resistance: 0, + measure_dist: 0, + rod_len: 0, + rod_num: 0, + rod_coef: 0, + hor_len: 0, + result_v: 0, + result_h: 0, + result: 0, + wszrg_h: 0, + wszrg_v: 0, + wanted: 0, + date: undefined, + no: 0, + pr_title: "Budowa przyłącza kablowego nN", + in_city: undefined, + commune: undefined, + all_parcels: undefined, + target_parcel: undefined, + geo_data: undefined, + object: "Przyłącz kablowy nN", + objValue1: "proj.", + objName: undefined, + }); + + // Function to go to the next step + const goToNextStep = () => { + if (currentStep < 3) { + setCurrentStep(currentStep + 1); + } + }; + + // Function to go to the previous step + const goToPreviousStep = () => { + if (currentStep > 1) { + setCurrentStep(currentStep - 1); + } + }; + + const [date, setDate] = useState(null); + const [calDate, setCalDate] = useState(null); + + const [options] = useState([ + { label: "5 Ω", value: "5" }, + { label: "10 Ω", value: "10" }, + { label: "15 Ω", value: "15" }, + { label: "30 Ω", value: "30" }, + ]); + const [neededValue, setNeededValue] = useState("5"); + + const [resHValue, setResHValue] = useState("88"); + const [resVValue, setResVValue] = useState("89"); + + const [objOptions1] = useState([ + { label: "proj.", value: "proj." }, + { label: "istn.", value: "istn." }, + ]); + const [objValue1, setObjValue1] = useState("proj."); + + function getRandomInt(min, max) { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; + } + + function parseDate(dateString) { + console.log(dateString); + const parts = dateString.split("."); + const day = parseInt(parts[0], 10); + const month = parseInt(parts[1], 10) - 1; // Months are 0-indexed in JavaScript Dates + const year = parseInt(parts[2], 10); + return new Date(year, month, day); + } + + function getGrounding(wanted, wszrg_h, wszrg_v, date) { + const dateObject = parseDate(date); + const month = dateObject.getMonth() + 1; // JavaScript months are 0-indexed + + const wet_coef = month >= 6 && month <= 9 ? 1.2 : 1.6; + const rod_len = wanted === 30 ? 2 : 3; + + const resistivity_h = wszrg_h / wet_coef; + const measure_dist_h = 1; + const resistance_h = resistivity_h / (2 * Math.PI * measure_dist_h); + + const resistivity_v = wszrg_v / wet_coef; + const measure_dist_v = 1 + rod_len; + const resistance_v = resistivity_v / (2 * Math.PI * measure_dist_v); + + const result_v = + (wszrg_v / (2 * Math.PI * rod_len)) * + (Math.log((8 * rod_len) / 0.016) - 1); + + let rod_num = 2; //minimum 2 rods + + let hor_len = 1 + (rod_num - 1) * rod_len * 2; + + let result_h = + (wszrg_h / (2 * Math.PI * hor_len)) * + Math.log((hor_len * hor_len) / (1 * 0.0191)); + + let rod_coef = + Math.pow(rod_num, 4) * 0.00002 - + Math.pow(rod_num, 3) * 0.0009 + + Math.pow(rod_num, 2) * 0.0137 - + rod_num * 0.0981 + + 1.0468; + + let result = + (result_v * result_h) / + (result_v * rod_coef + rod_num * result_h * rod_coef); + + while (result > wanted) { + rod_num += 1; + + hor_len = 1 + (rod_num - 1) * rod_len * 2; + + result_h = + (wszrg_h / (2 * Math.PI * hor_len)) * + Math.log((hor_len * hor_len) / (1 * 0.0191)); + + rod_coef = + Math.pow(rod_num, 4) * 0.00002 - + Math.pow(rod_num, 3) * 0.0009 + + Math.pow(rod_num, 2) * 0.0137 - + rod_num * 0.0981 + + 1.0468; + + result = + (result_v * result_h) / + (result_v * rod_coef + rod_num * result_h * rod_coef); + + console.log(result, rod_num); + } + + console.log(result, rod_num); + return { + wet_coef: wet_coef, + resistivity_h: resistivity_h.toFixed(2), + resistance_h: resistance_h.toFixed(2), + measure_dist_h: measure_dist_h, + resistivity_v: resistivity_v.toFixed(2), + resistance_v: resistance_v.toFixed(2), + measure_dist_v: measure_dist_v, + rod_len: rod_len, + rod_num: rod_num, + rod_coef: rod_coef.toFixed(2), + hor_len: hor_len, + result_v: result_v.toFixed(2), + result_h: result_h.toFixed(2), + result: result.toFixed(2), + wszrg_h: wszrg_h, + wszrg_v: wszrg_v, + wanted: neededValue, + }; + } + + const generateDocument = async (ground) => { + const data = { + ...ground, + resisted_object: ground.objValue1 + " " + ground.objName, + }; + + try { + const response = await fetch("/api/generateDocx", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(data), + }); + + if (!response.ok) { + throw new Error(`Error: ${response.status}`); + } + + // Convert the response to a blob and download it + const blob = await response.blob(); + const downloadUrl = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = downloadUrl; + link.download = "opis.docx"; + document.body.appendChild(link); + link.click(); + link.remove(); + } catch (error) { + console.error("Failed to generate document:", error); + } + }; + + const generateDxf = async () => { + // Data that you want to send to the backend + var dateParts = ground.date.split("."); + + // Extract day, month, and year + var day = parseInt(dateParts[0], 10); + var month = parseInt(dateParts[1], 10); + var year = parseInt(dateParts[2], 10); + + // Format the result + var formattedDate = month.toString().padStart(2, "0") + "." + year; + const inputData = { + args: [ + ground.objValue1 + ground.objName, + ground.pr_title, + ground.object, + ground.in_city + + ", " + + ground.commune + + ", dz. nr " + + ground.all_parcels, + formattedDate, + ground.hor_len, + ground.rod_len, + ], + }; + // object1 = args[0] #ZK2a-1P + // object2 = args[1] #Budowa przyłącza + // object3 = args[2] #Przyłącze kablowe + // adres = args[3] + // date = args[4] + // len_h = int(args[5]) + // len_v = int(args[6]) + + try { + const response = await fetch("/api/generateDxf", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify(inputData), + }); + + if (!response.ok) { + throw new Error("Response was not ok."); + } + + // Download the response (the output file) + const blob = await response.blob(); + const downloadUrl = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = downloadUrl; + a.download = "uziom.dxf"; + document.body.appendChild(a); + a.click(); + a.remove(); + } catch (error) { + console.error("There was an error:", error); + } + }; + + if (session) { + return ( +
+ + Wastpol + + +
+
+ +
+
+
+ 1. Data wykonania pomiaru +
+
+ + { + console.log(date); + console.log(typeof date); + const day = date.getDate().toString().padStart(2, "0"); // Add leading zero if necessary + const month = (date.getMonth() + 1) + .toString() + .padStart(2, "0"); // Month is 0-indexed, add 1 to get the correct month + const year = date.getFullYear(); + const formattedDate = `${day}.${month}.${year}`; + console.log(formattedDate); + setGround((current) => ({ + ...current, + date: formattedDate, + })); + setCalDate(date); + }} + placeholderText="Wybierz datę" + dateFormat="dd.MM.yyyy" + /> + +
+
+ { + setNeededValue(event.target.value); + }} + /> + { + setResHValue(e.target.value); + setResVValue((ground.wanted==30)? + getRandomInt( + parseInt(e.target.value) - 10, + parseInt(e.target.value) - 4 + ):getRandomInt( + parseInt(e.target.value) - 20, + parseInt(e.target.value) - 10 + ) + + ); + }} + value={resHValue} + /> + + setGround((current) => ({ ...current, no: e.target.value })) + } + value={ground.no} + />{" "} +
+
+ + setGround((current) => ({ + ...current, + pr_title: e.target.value, + })) + } + value={ground.pr_title} + /> + + setGround((current) => ({ + ...current, + object: e.target.value, + })) + } + value={ground.object} + /> + + setGround((current) => ({ + ...current, + in_city: e.target.value, + })) + } + value={ground.in_city} + /> + + setGround((current) => ({ + ...current, + commune: e.target.value, + })) + } + value={ground.commune} + /> + + setGround((current) => ({ + ...current, + all_parcels: e.target.value, + })) + } + value={ground.all_parcels} + /> + + setGround((current) => ({ + ...current, + target_parcel: e.target.value, + })) + } + value={ground.target_parcel} + /> + + setGround((current) => ({ + ...current, + geo_data: e.target.value, + })) + } + value={ground.geo_data} + />{" "} +
+
+ { + setObjValue1(event.target.value); + setGround((current) => ({ + ...current, + objValue1: event.target.value, + })); + }} + /> + + setGround((current) => ({ + ...current, + objName: e.target.value, + })) + } + value={ground.objName} + /> + + + + + +

+ Uziemienie poziome: {ground.result_h} Ω ({ground.wszrg_h}) +

+

+ Uziemienie pionowe: {ground.result_v} Ω ({ground.wszrg_v}) +

+

Uziemienie: {ground.result} Ω

+

Szpile: {ground.rod_num} szt

+

Bednarka: {ground.hor_len} m

+
+
+
+
+ ); + } + + return ( +
+ + Wastpol + +
+

Nie zalogowano

+

+ +
+
+ ); +} diff --git a/uziom.py b/uziom.py new file mode 100644 index 0000000..b70ae9f --- /dev/null +++ b/uziom.py @@ -0,0 +1,198 @@ +import ezdxf +import sys + +args = sys.argv[1:] +print(args) +object1 = args[0] #ZK2a-1P +object2 = args[1] #Budowa +object3 = args[2] #Przylacze +adres = args[3] +date = args[4] +len_h = int(args[5]) +len_v = float(args[6]) + + +a4_x = 31.5 +a4_y = 44.55 +# len_h = 25 +# len_v = 3 +rod_num = int(((len_h - 1)/(len_v*2)) + 1) + +zk_width = 0.665 +zk_depth = 0.32 +zk_height = 1.64 + +start_x = ((a4_x - len_h) / 2) + zk_width +start_y = 28 + +overedge = 0.5 +# date = "06.2023" + +start_y2 = start_y - 7.5 #drugi uziom + +doc = ezdxf.new(dxfversion="R2013", setup=False) +msp = doc.modelspace() +#doc.layers.add(name="tabele", color=0, linetype="SOLID") +#doc.layers.add(name="bednarka", color=1, linetype="SOLID") +#doc.layers.add(name="uziom", color=3, linetype="SOLID") +#doc.layers.add(name="zk", color=0, linetype="SOLID") +#doc.layers.add(name="opisy", color=0, linetype="SOLID") +#doc.layers.add(name="grunt", color=0, linetype="SOLID") + +hatch = msp.add_hatch(color=3) +hatch_ground = msp.add_hatch(color=0) +hatch_gravel = msp.add_hatch(color=254) + +doc.styles.new("Arial", dxfattribs={"font" : "Arial.ttf"}) + +#WYDURK +msp.add_line((0, 0), (0, a4_y), dxfattribs={"layer": "tabele", "color":0}) +msp.add_line((0, a4_y), (a4_x, a4_y), dxfattribs={"layer": "tabele", "color":0}) +msp.add_line((a4_x, a4_y), (a4_x, 0), dxfattribs={"layer": "tabele", "color":0}) +msp.add_line((a4_x, 0), (0, 0), dxfattribs={"layer": "tabele", "color":0}) + + +#UZIOM WIDOK Z Gory +msp.add_line((start_x, start_y), (start_x + len_h, start_y), dxfattribs={"layer": "bednarka", "color":1}) +for rod in range(0,rod_num): + #kola i kreskowanie + msp.add_circle((start_x+1+(len_v*2*rod), start_y), 0.15, dxfattribs={"layer": "uziom", "color":3}) + edge_path = hatch.paths.add_edge_path() + edge_path.add_arc((start_x+1+(len_v*2*rod), start_y), radius=0.15, start_angle=0, end_angle=360) + #wymiary + msp.add_line((start_x+1+(len_v*2*rod), start_y), (start_x+1+(len_v*2*rod), start_y+1), dxfattribs={"layer": "opisy"}) + if rod == rod_num-1: continue + dim = msp.add_linear_dim( + base=(start_x+1+(len_v*2*rod), start_y+1), # location of the dimension line + p1=(start_x+1+(len_v*2*rod), start_y), # 1st measurement point + p2=(start_x+1+(len_v*2*(rod+1)), start_y), # 2nd measurement point + dimstyle="EZ_CURVED", # default dimension style + override={ + # "dimtxsty": "Standard", + "dimtxt": 0.5, + "dimasz": 0.5, + }, + text=str(len_v*2)+" m" + ).render() +#wymiar 1. metra +dim = msp.add_linear_dim( + base=(start_x, start_y+1), # location of the dimension line + p1=(start_x, start_y), # 1st measurement point + p2=(start_x+1, start_y), # 2nd measurement point + dimstyle="EZ_CURVED", # default dimension style + override={ + # "dimtxsty": "Standard", + "dimtxt": 0.5, + "dimasz": 0.5, + }, + text="1 m" +).render() + +#ZK WIDOK Z Gory +msp.add_line((start_x-zk_width, start_y+zk_depth/2), (start_x, start_y+zk_depth/2), dxfattribs={"layer": "zk"}) +msp.add_line((start_x, start_y+zk_depth/2), (start_x, start_y-zk_depth/2), dxfattribs={"layer": "zk"}) +msp.add_line((start_x, start_y-zk_depth/2), (start_x-zk_width, start_y-zk_depth/2), dxfattribs={"layer": "zk"}) +msp.add_line((start_x-zk_width, start_y-zk_depth/2), (start_x-zk_width, start_y+zk_depth/2), dxfattribs={"layer": "zk"}) + + + +#UZIOM WIDOK Z BOKU +msp.add_line((start_x - zk_width / 2, start_y2), (start_x + len_h, start_y2), dxfattribs={"layer": "bednarka", "color":1}) +msp.add_line((start_x - zk_width / 2, start_y2), (start_x - zk_width / 2, start_y2+0.2), dxfattribs={"layer": "bednarka", "color":1}) + +for rod in range(0,rod_num): + msp.add_line((start_x+1+(rod*len_v*2), start_y2+0.02), (start_x+1+(rod*len_v*2), start_y2-len_v), dxfattribs={"layer": "uziom", "color":3}) + msp.add_line((start_x+1+(rod*len_v*2), start_y2+0.02), (start_x+1+(rod*len_v*2)+0.016, start_y2+0.02), dxfattribs={"layer": "uziom", "color":3}) + msp.add_line((start_x+1+(rod*len_v*2)+0.016, start_y2+0.02), (start_x+1+(rod*len_v*2)+0.016, start_y2-len_v), dxfattribs={"layer": "uziom", "color":3}) + msp.add_line((start_x+1+(rod*len_v*2), start_y2-len_v), (start_x+1+(rod*len_v*2)+0.016, start_y2-len_v), dxfattribs={"layer": "uziom", "color":3}) + +dim = msp.add_linear_dim( + base=(start_x+0.5, start_y2+1), # location of the dimension line + p1=(start_x+0.5, start_y2+1), # 1st measurement point + p2=(start_x+0.5, start_y2), # 2nd measurement point + dimstyle="EZ_CURVED", # default dimension style + override={ + # "dimtxsty": "Standard", + "dimtxt": 0.5, + "dimasz": 0.5, + "dimjust": 3, + }, + text="h=1 m", + angle=-90 +).render() + + +#PODZIEMIE WIDOK Z BOKU +msp.add_line((start_x, start_y2 + 1), (start_x + len_h + overedge, start_y2 + 1), dxfattribs={"layer": "grunt"}) + +hatch_ground.set_pattern_fill("EARTH2", scale=0.1) +hatch_ground.paths.add_polyline_path( + [(start_x, start_y2 + 1), (start_x + len_h + overedge, start_y2 + 1), (start_x + len_h + overedge, start_y2 + 0.5), (start_x, start_y2 + 0.5)], is_closed=True +) + +hatch_gravel.set_pattern_fill("CONCRETE2", scale=0.1) +hatch_gravel.paths.add_polyline_path( + [(start_x, start_y2 + 1), (start_x + len_h + overedge, start_y2 + 1), (start_x + len_h + overedge, start_y2 -(len_v+1)), (start_x, start_y2 -(len_v+1))], is_closed=True +) + +#ZK WIDOK Z BOKU +msp.add_line((start_x - zk_width, start_y2+(zk_height/2)+1), (start_x, start_y2+(zk_height/2)+1), dxfattribs={"layer": "zk"}) +msp.add_line((start_x, start_y2+(zk_height/2)+1), (start_x, start_y2-(zk_height/2)+1), dxfattribs={"layer": "zk"}) +msp.add_line((start_x, start_y2-(zk_height/2)+1), (start_x-zk_width, start_y2-(zk_height/2)+1), dxfattribs={"layer": "zk"}) +msp.add_line((start_x-zk_width, start_y2-(zk_height/2)+1), (start_x - zk_width, start_y2+(zk_height/2)+1), dxfattribs={"layer": "zk"}) + +msp.add_text(object1, dxfattribs={"layer": "opisy", "height": 0.55, "rotation": 0, "style": "OpenSans"}).set_pos((start_x - (zk_width/2) , start_y2+2.3), align="CENTER") + + +#OPISY +msp.add_text("SCHEMAT ROZMIESZCZENIA UZIOMÓW", dxfattribs={"layer": "opisy", "height": 0.55, "rotation": 0, "style": "OpenSans"}).set_pos((a4_x/2, a4_y-5.5), align="CENTER") + +#TABELKA +start_xt = a4_x - 1.5 - 24 +start_yt = 2 + +points = [(start_xt, start_yt), (start_xt + 24, start_yt), (start_xt + 24, start_yt+4), (start_xt, start_yt+4), (start_xt, start_yt)] +msp.add_lwpolyline(points, dxfattribs={"layer": "opisy"}) +msp.add_line((start_xt, start_yt+1), (start_xt + 16, start_yt+1), dxfattribs={"layer": "opisy"}) +msp.add_text("RYSUNEK", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+1.5, start_yt+1+0.17), align="CENTER") +msp.add_text("Konfiguracja układu uziomowego", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+0.18, start_yt+1+0.17), align="LEFT") +msp.add_line((start_xt, start_yt+1.6), (start_xt + 16, start_yt+1.6), dxfattribs={"layer": "opisy"}) +msp.add_text("TEMAT", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+1.5, start_yt+1.6+0.17), align="CENTER") +msp.add_text(object2, dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+0.18, start_yt+1.6+0.17), align="LEFT") +msp.add_line((start_xt, start_yt+2.2), (start_xt + 16, start_yt+2.2), dxfattribs={"layer": "opisy"}) +msp.add_text("ADRES", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+1.5, start_yt+2.2+0.17), align="CENTER") +msp.add_text(adres, dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+0.18, start_yt+2.2+0.17), align="LEFT") +msp.add_line((start_xt, start_yt+2.8), (start_xt + 16, start_yt+2.8), dxfattribs={"layer": "opisy"}) +msp.add_text("OBIEKT", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+1.5, start_yt+2.8+0.17), align="CENTER") +msp.add_text(object3, dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+0.18, start_yt+2.8+0.17), align="LEFT") +msp.add_line((start_xt, start_yt+3.4), (start_xt + 16, start_yt+3.4), dxfattribs={"layer": "opisy"}) +msp.add_text("INWESTOR", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+1.5, start_yt+3.4+0.17), align="CENTER") +msp.add_text("TAURON Dystrybucja S.A.", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+0.18, start_yt+3.4+0.17), align="LEFT") + +msp.add_line((start_xt+3, start_yt), (start_xt + 3, start_yt+4), dxfattribs={"layer": "opisy"}) +msp.add_line((start_xt+16, start_yt), (start_xt + 16, start_yt+4), dxfattribs={"layer": "opisy"}) + +msp.add_line((start_xt+3, start_yt+0.5), (start_xt + 16, start_yt+0.5), dxfattribs={"layer": "opisy"}) +msp.add_text("STADIUM", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+1.625, start_yt+0.5+0.15), align="CENTER") +msp.add_text("PB", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+1.625, start_yt+0.15), align="CENTER") +msp.add_line((start_xt+3+3.25, start_yt), (start_xt + 3 + 3.25, start_yt+1), dxfattribs={"layer": "opisy"}) +msp.add_text("DATA", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+3.25+1.625, start_yt+0.5+0.15), align="CENTER") +msp.add_text(date, dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+3.25+1.625, start_yt+0.15), align="CENTER") +msp.add_line((start_xt+3+6.5, start_yt), (start_xt + 3 + 6.5, start_yt+1), dxfattribs={"layer": "opisy"}) +msp.add_text("SKALA", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+6.5+1.625, start_yt+0.5+0.15), align="CENTER") +msp.add_text("1:150", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+6.5+1.625, start_yt+0.15), align="CENTER") +msp.add_line((start_xt+3+9.75, start_yt), (start_xt + 3 + 9.75, start_yt+1), dxfattribs={"layer": "opisy"}) +msp.add_text("NR RYS", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+9.75+1.625, start_yt+0.5+0.15), align="CENTER") +msp.add_text("5", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+3+9.75+1.625, start_yt+0.15), align="CENTER") + + +msp.add_text("pręt uziemiający Ø16 - dł. "+ str(len_v) +" mb - "+ str(rod_num) +" szt.", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+2.5, start_yt+4+0.7), align="LEFT") +msp.add_circle((start_xt+1.5, start_yt + 4.8), 0.15, dxfattribs={"layer": "uziom", "color":3}) +edge_path = hatch.paths.add_edge_path() +edge_path.add_arc((start_xt+1.5, start_yt + 4.8), radius=0.15, start_angle=0, end_angle=360) + +msp.add_text("płaskownik St/Zn 30x4 mm - dł. "+ str(len_h) +" mb", dxfattribs={"layer": "opisy", "height": 0.25, "rotation": 0, "style": "Arial"}).set_pos((start_xt+2.5, start_yt+4+1.4), align="LEFT") +msp.add_line((start_xt +0.8, start_yt+4+1.5), (start_xt + 2.1, start_yt+4+1.5), dxfattribs={"layer": "bednarka", "color":1}) + + +doc.saveas("public/uziom.dxf") \ No newline at end of file diff --git a/wet_input_15.docx b/wet_input_15.docx new file mode 100644 index 0000000..9543505 Binary files /dev/null and b/wet_input_15.docx differ diff --git a/wet_input_3.docx b/wet_input_3.docx new file mode 100644 index 0000000..db7b7b2 Binary files /dev/null and b/wet_input_3.docx differ