From 4d7411256b62d98637680775dccaae088dafccd6 Mon Sep 17 00:00:00 2001 From: navry Date: Mon, 4 Aug 2025 22:51:20 +0200 Subject: [PATCH] last --- Dockerfile | 26 + README.md | 0 body.xlsx:Zone.Identifier | 4 + body_advanced.xlsx | Bin 0 -> 17175 bytes body_easy.xlsx | Bin 0 -> 13855 bytes compose.debug.yaml | 12 + compose.yaml | 8 + excel_to_dxf_bez_zrcadleni.py | 52 + requirements.txt | 14 + templates/upload_form.html | 46 + test.dxf | 4684 +++++++++++++++++++++++++++++++++ test.py | 78 + 12 files changed, 4924 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 body.xlsx:Zone.Identifier create mode 100644 body_advanced.xlsx create mode 100644 body_easy.xlsx create mode 100644 compose.debug.yaml create mode 100644 compose.yaml create mode 100644 excel_to_dxf_bez_zrcadleni.py create mode 100644 requirements.txt create mode 100644 templates/upload_form.html create mode 100644 test.dxf create mode 100644 test.py diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..53bc39b --- /dev/null +++ b/Dockerfile @@ -0,0 +1,26 @@ +# For more information, please refer to https://aka.ms/vscode-docker-python +FROM python:3.8-slim-buster + + +EXPOSE 5003 + +# Keeps Python from generating .pyc files in the container +ENV PYTHONDONTWRITEBYTECODE=1 + +# Turns off buffering for easier container logging +ENV PYTHONUNBUFFERED=1 + +# Install pip requirements +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +WORKDIR /app +COPY . /app + +# Creates a non-root user with an explicit UID and adds permission to access the /app folder +# For more info, please refer to https://aka.ms/vscode-docker-python-configure-containers +RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app +USER appuser + +# During debugging, this entry point will be overridden. For more information, please refer to https://aka.ms/vscode-docker-python-debug +CMD ["python", "test.py"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/body.xlsx:Zone.Identifier b/body.xlsx:Zone.Identifier new file mode 100644 index 0000000..8b7e01e --- /dev/null +++ b/body.xlsx:Zone.Identifier @@ -0,0 +1,4 @@ +[ZoneTransfer] +ZoneId=3 +ReferrerUrl=https://brana.imtts.cz/webmail/ +HostUrl=https://brana.imtts.cz/webmail/api/download/attachment/imtts.cz/navratil/3582c3e0-1797-492e-b6b6-60c6039c7e90/6369/0-1/body.xlsx?version=38476&sid=60d37f31d4a485d454612aa752d8d91778d4e5b1ac4adddae508fdef42317af8&mode=view diff --git a/body_advanced.xlsx b/body_advanced.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8897be3e561ffdb954054d960c82c85634a0c728 GIT binary patch literal 17175 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 W8tg*{0RY&K7ukmzukrtJ_WuAwRQ68* literal 0 HcmV?d00001 diff --git a/body_easy.xlsx b/body_easy.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..61f3e022072543167d529e2de2c1328ad1daef36 GIT binary patch literal 13855 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 ir|7?v)3g4K{LcwnMF9q^g8%>$_(Kg= 3 and row[3] is not None else 0 + body.append((label, x, y, z)) + except ValueError: + continue + return body + +def exportuj_do_dxf(body, vystup): + doc = ezdxf.new() + msp = doc.modelspace() + + doc.layers.new(name="BODY", dxfattribs={"color": 7}) + doc.layers.new(name="POPISKY", dxfattribs={"color": 1}) + + for label, x, y, z in body: + msp.add_point((x, y, z), dxfattribs={"layer": "BODY"}) + msp.add_text( + label, + dxfattribs={"layer": "POPISKY"}).set_pos((x + 2, y + 2), align="LEFT") # Posun textu od bodu + + doc.saveas(vystup) + +if __name__ == "__main__": + if len(sys.argv) != 3: + print("Použití: python excel_to_dxf_hotovy.py vstup.xlsx vystup.dxf") + sys.exit(1) + + excel_soubor = sys.argv[1] + vystup_nazev = sys.argv[2] + + slozka = os.path.dirname(os.path.abspath(__file__)) + excel_cesta = os.path.join(slozka, excel_soubor) + vystup_cesta = os.path.join(slozka, vystup_nazev) + + body = nacti_data_z_excelu(excel_cesta) + exportuj_do_dxf(body, vystup_cesta) + print(f"Soubor {vystup_nazev} byl úspěšně vytvořen ve složce: {slozka}") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..0cea55a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,14 @@ +blinker==1.8.2 +click==8.1.8 +et-xmlfile==2.0.0 +ezdxf==0.17 +flask==3.0.3 +importlib-metadata==8.5.0 +itsdangerous==2.2.0 +jinja2==3.1.6 +markupsafe==2.1.5 +openpyxl==3.1.5 +pyparsing==3.1.4 +typing-extensions==4.13.2 +werkzeug==3.0.6 +zipp==3.20.2 diff --git a/templates/upload_form.html b/templates/upload_form.html new file mode 100644 index 0000000..e174582 --- /dev/null +++ b/templates/upload_form.html @@ -0,0 +1,46 @@ + + + + + + + + + + converter + + + +

XLSX to DXF Converter

+
+
+ +

+ + + + +

+ + + +
+
+ + + + + + diff --git a/test.dxf b/test.dxf new file mode 100644 index 0000000..afe6598 --- /dev/null +++ b/test.dxf @@ -0,0 +1,4684 @@ + 0 +SECTION + 2 +HEADER + 9 +$ACADVER + 1 +AC1027 + 9 +$ACADMAINTVER + 70 +105 + 9 +$DWGCODEPAGE + 3 +ANSI_1252 + 9 +$LASTSAVEDBY + 1 +ezdxf + 9 +$REQUIREDVERSIONS +160 +0 + 9 +$INSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$EXTMIN + 10 +1e+20 + 20 +1e+20 + 30 +1e+20 + 9 +$EXTMAX + 10 +-1e+20 + 20 +-1e+20 + 30 +-1e+20 + 9 +$LIMMIN + 10 +0.0 + 20 +0.0 + 9 +$LIMMAX + 10 +420.0 + 20 +297.0 + 9 +$ORTHOMODE + 70 +0 + 9 +$REGENMODE + 70 +1 + 9 +$FILLMODE + 70 +1 + 9 +$QTEXTMODE + 70 +0 + 9 +$MIRRTEXT + 70 +1 + 9 +$LTSCALE + 40 +1.0 + 9 +$ATTMODE + 70 +1 + 9 +$TEXTSIZE + 40 +2.5 + 9 +$TRACEWID + 40 +1.0 + 9 +$TEXTSTYLE + 7 +Standard + 9 +$CLAYER + 8 +0 + 9 +$CELTYPE + 6 +ByLayer + 9 +$CECOLOR + 62 +256 + 9 +$CELTSCALE + 40 +1.0 + 9 +$DISPSILH + 70 +0 + 9 +$DIMSCALE + 40 +1.0 + 9 +$DIMASZ + 40 +2.5 + 9 +$DIMEXO + 40 +0.625 + 9 +$DIMDLI + 40 +3.75 + 9 +$DIMRND + 40 +0.0 + 9 +$DIMDLE + 40 +0.0 + 9 +$DIMEXE + 40 +1.25 + 9 +$DIMTP + 40 +0.0 + 9 +$DIMTM + 40 +0.0 + 9 +$DIMTXT + 40 +2.5 + 9 +$DIMCEN + 40 +2.5 + 9 +$DIMTSZ + 40 +0.0 + 9 +$DIMTOL + 70 +0 + 9 +$DIMLIM + 70 +0 + 9 +$DIMTIH + 70 +0 + 9 +$DIMTOH + 70 +0 + 9 +$DIMSE1 + 70 +0 + 9 +$DIMSE2 + 70 +0 + 9 +$DIMTAD + 70 +1 + 9 +$DIMZIN + 70 +8 + 9 +$DIMBLK + 1 + + 9 +$DIMASO + 70 +1 + 9 +$DIMSHO + 70 +1 + 9 +$DIMPOST + 1 + + 9 +$DIMAPOST + 1 + + 9 +$DIMALT + 70 +0 + 9 +$DIMALTD + 70 +3 + 9 +$DIMALTF + 40 +0.03937007874 + 9 +$DIMLFAC + 40 +1.0 + 9 +$DIMTOFL + 70 +1 + 9 +$DIMTVP + 40 +0.0 + 9 +$DIMTIX + 70 +0 + 9 +$DIMSOXD + 70 +0 + 9 +$DIMSAH + 70 +0 + 9 +$DIMBLK1 + 1 + + 9 +$DIMBLK2 + 1 + + 9 +$DIMSTYLE + 2 +ISO-25 + 9 +$DIMCLRD + 70 +0 + 9 +$DIMCLRE + 70 +0 + 9 +$DIMCLRT + 70 +0 + 9 +$DIMTFAC + 40 +1.0 + 9 +$DIMGAP + 40 +0.625 + 9 +$DIMJUST + 70 +0 + 9 +$DIMSD1 + 70 +0 + 9 +$DIMSD2 + 70 +0 + 9 +$DIMTOLJ + 70 +0 + 9 +$DIMTZIN + 70 +8 + 9 +$DIMALTZ + 70 +0 + 9 +$DIMALTTZ + 70 +0 + 9 +$DIMUPT + 70 +0 + 9 +$DIMDEC + 70 +2 + 9 +$DIMTDEC + 70 +2 + 9 +$DIMALTU + 70 +2 + 9 +$DIMALTTD + 70 +3 + 9 +$DIMTXSTY + 7 +Standard + 9 +$DIMAUNIT + 70 +0 + 9 +$DIMADEC + 70 +0 + 9 +$DIMALTRND + 40 +0.0 + 9 +$DIMAZIN + 70 +0 + 9 +$DIMDSEP + 70 +44 + 9 +$DIMATFIT + 70 +3 + 9 +$DIMFRAC + 70 +0 + 9 +$DIMLDRBLK + 1 + + 9 +$DIMLUNIT + 70 +2 + 9 +$DIMLWD + 70 +-2 + 9 +$DIMLWE + 70 +-2 + 9 +$DIMTMOVE + 70 +0 + 9 +$DIMFXL + 40 +1.0 + 9 +$DIMFXLON + 70 +0 + 9 +$DIMJOGANG + 40 +0.785398163397 + 9 +$DIMTFILL + 70 +0 + 9 +$DIMTFILLCLR + 70 +0 + 9 +$DIMARCSYM + 70 +0 + 9 +$DIMLTYPE + 6 + + 9 +$DIMLTEX1 + 6 + + 9 +$DIMLTEX2 + 6 + + 9 +$DIMTXTDIRECTION + 70 +0 + 9 +$LUNITS + 70 +2 + 9 +$LUPREC + 70 +4 + 9 +$SKETCHINC + 40 +1.0 + 9 +$FILLETRAD + 40 +10.0 + 9 +$AUNITS + 70 +0 + 9 +$AUPREC + 70 +2 + 9 +$MENU + 1 +. + 9 +$ELEVATION + 40 +0.0 + 9 +$PELEVATION + 40 +0.0 + 9 +$THICKNESS + 40 +0.0 + 9 +$LIMCHECK + 70 +0 + 9 +$CHAMFERA + 40 +0.0 + 9 +$CHAMFERB + 40 +0.0 + 9 +$CHAMFERC + 40 +0.0 + 9 +$CHAMFERD + 40 +0.0 + 9 +$SKPOLY + 70 +0 + 9 +$TDCREATE + 40 +2460882.440787037 + 9 +$TDUCREATE + 40 +2458532.153996898 + 9 +$TDUPDATE + 40 +2460882.440787037 + 9 +$TDUUPDATE + 40 +2458532.1544311 + 9 +$TDINDWG + 40 +0.0 + 9 +$TDUSRTIMER + 40 +0.0 + 9 +$USRTIMER + 70 +1 + 9 +$ANGBASE + 50 +0.0 + 9 +$ANGDIR + 70 +0 + 9 +$PDMODE + 70 +0 + 9 +$PDSIZE + 40 +0.0 + 9 +$PLINEWID + 40 +0.0 + 9 +$SPLFRAME + 70 +0 + 9 +$SPLINETYPE + 70 +6 + 9 +$SPLINESEGS + 70 +8 + 9 +$HANDSEED + 5 +76 + 9 +$SURFTAB1 + 70 +6 + 9 +$SURFTAB2 + 70 +6 + 9 +$SURFTYPE + 70 +6 + 9 +$SURFU + 70 +6 + 9 +$SURFV + 70 +6 + 9 +$UCSBASE + 2 + + 9 +$UCSNAME + 2 + + 9 +$UCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$UCSORTHOREF + 2 + + 9 +$UCSORTHOVIEW + 70 +0 + 9 +$UCSORGTOP + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGBOTTOM + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGLEFT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGRIGHT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGFRONT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$UCSORGBACK + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSBASE + 2 + + 9 +$PUCSNAME + 2 + + 9 +$PUCSORG + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSXDIR + 10 +1.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSYDIR + 10 +0.0 + 20 +1.0 + 30 +0.0 + 9 +$PUCSORTHOREF + 2 + + 9 +$PUCSORTHOVIEW + 70 +0 + 9 +$PUCSORGTOP + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGBOTTOM + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGLEFT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGRIGHT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGFRONT + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PUCSORGBACK + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$USERI1 + 70 +0 + 9 +$USERI2 + 70 +0 + 9 +$USERI3 + 70 +0 + 9 +$USERI4 + 70 +0 + 9 +$USERI5 + 70 +0 + 9 +$USERR1 + 40 +0.0 + 9 +$USERR2 + 40 +0.0 + 9 +$USERR3 + 40 +0.0 + 9 +$USERR4 + 40 +0.0 + 9 +$USERR5 + 40 +0.0 + 9 +$WORLDVIEW + 70 +1 + 9 +$SHADEDGE + 70 +3 + 9 +$SHADEDIF + 70 +70 + 9 +$TILEMODE + 70 +1 + 9 +$MAXACTVP + 70 +64 + 9 +$PINSBASE + 10 +0.0 + 20 +0.0 + 30 +0.0 + 9 +$PLIMCHECK + 70 +0 + 9 +$PEXTMIN + 10 +1e+20 + 20 +1e+20 + 30 +1e+20 + 9 +$PEXTMAX + 10 +-1e+20 + 20 +-1e+20 + 30 +-1e+20 + 9 +$PLIMMIN + 10 +0.0 + 20 +0.0 + 9 +$PLIMMAX + 10 +420.0 + 20 +297.0 + 9 +$UNITMODE + 70 +0 + 9 +$VISRETAIN + 70 +1 + 9 +$PLINEGEN + 70 +0 + 9 +$PSLTSCALE + 70 +1 + 9 +$TREEDEPTH + 70 +3020 + 9 +$CMLSTYLE + 2 +Standard + 9 +$CMLJUST + 70 +0 + 9 +$CMLSCALE + 40 +20.0 + 9 +$PROXYGRAPHICS + 70 +1 + 9 +$MEASUREMENT + 70 +1 + 9 +$CELWEIGHT +370 +-1 + 9 +$ENDCAPS +280 +0 + 9 +$JOINSTYLE +280 +0 + 9 +$LWDISPLAY +290 +0 + 9 +$INSUNITS + 70 +6 + 9 +$HYPERLINKBASE + 1 + + 9 +$STYLESHEET + 1 + + 9 +$XEDIT +290 +1 + 9 +$CEPSNTYPE +380 +0 + 9 +$PSTYLEMODE +290 +1 + 9 +$FINGERPRINTGUID + 2 +{D7D6EFDA-684F-49DE-B7CE-25E9CC3ABC9D} + 9 +$VERSIONGUID + 2 +{68A46382-6260-4FC7-B2CC-2903141065E9} + 9 +$EXTNAMES +290 +1 + 9 +$PSVPSCALE + 40 +0.0 + 9 +$OLESTARTUP +290 +0 + 9 +$SORTENTS +280 +127 + 9 +$INDEXCTL +280 +0 + 9 +$HIDETEXT +280 +1 + 9 +$XCLIPFRAME +280 +0 + 9 +$HALOGAP +280 +0 + 9 +$OBSCOLOR + 70 +257 + 9 +$OBSLTYPE +280 +0 + 9 +$INTERSECTIONDISPLAY +280 +0 + 9 +$INTERSECTIONCOLOR + 70 +257 + 9 +$DIMASSOC +280 +2 + 9 +$PROJECTNAME + 1 + + 9 +$CAMERADISPLAY +290 +0 + 9 +$LENSLENGTH + 40 +50.0 + 9 +$CAMERAHEIGHT + 40 +0.0 + 9 +$STEPSPERSEC + 40 +24.0 + 9 +$STEPSIZE + 40 +100.0 + 9 +$3DDWFPREC + 40 +2.0 + 9 +$PSOLWIDTH + 40 +0.005 + 9 +$PSOLHEIGHT + 40 +0.08 + 9 +$LOFTANG1 + 40 +1.570796326795 + 9 +$LOFTANG2 + 40 +1.570796326795 + 9 +$LOFTMAG1 + 40 +0.0 + 9 +$LOFTMAG2 + 40 +0.0 + 9 +$LOFTPARAM + 70 +7 + 9 +$LOFTNORMALS +280 +1 + 9 +$LATITUDE + 40 +37.795 + 9 +$LONGITUDE + 40 +-122.394 + 9 +$NORTHDIRECTION + 40 +0.0 + 9 +$TIMEZONE + 70 +-8000 + 9 +$LIGHTGLYPHDISPLAY +280 +1 + 9 +$TILEMODELIGHTSYNCH +280 +1 + 9 +$CMATERIAL +347 +20 + 9 +$SOLIDHIST +280 +0 + 9 +$SHOWHIST +280 +1 + 9 +$DWFFRAME +280 +2 + 9 +$DGNFRAME +280 +2 + 9 +$REALWORLDSCALE +290 +1 + 9 +$INTERFERECOLOR + 62 +256 + 9 +$CSHADOW +280 +0 + 9 +$SHADOWPLANELOCATION + 40 +0.0 + 0 +ENDSEC + 0 +SECTION + 2 +CLASSES + 0 +CLASS + 1 +ACDBDICTIONARYWDFLT + 2 +AcDbDictionaryWithDefault + 3 +ObjectDBX Classes + 90 +0 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +SUN + 2 +AcDbSun + 3 +SCENEOE + 90 +1153 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +VISUALSTYLE + 2 +AcDbVisualStyle + 3 +ObjectDBX Classes + 90 +4095 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +MATERIAL + 2 +AcDbMaterial + 3 +ObjectDBX Classes + 90 +1153 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +SCALE + 2 +AcDbScale + 3 +ObjectDBX Classes + 90 +1153 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +TABLESTYLE + 2 +AcDbTableStyle + 3 +ObjectDBX Classes + 90 +4095 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +MLEADERSTYLE + 2 +AcDbMLeaderStyle + 3 +ACDB_MLEADERSTYLE_CLASS + 90 +4095 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +DICTIONARYVAR + 2 +AcDbDictionaryVar + 3 +ObjectDBX Classes + 90 +0 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +CELLSTYLEMAP + 2 +AcDbCellStyleMap + 3 +ObjectDBX Classes + 90 +1152 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +MENTALRAYRENDERSETTINGS + 2 +AcDbMentalRayRenderSettings + 3 +SCENEOE + 90 +1024 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +ACDBDETAILVIEWSTYLE + 2 +AcDbDetailViewStyle + 3 +ObjectDBX Classes + 90 +1025 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +ACDBSECTIONVIEWSTYLE + 2 +AcDbSectionViewStyle + 3 +ObjectDBX Classes + 90 +1025 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +RASTERVARIABLES + 2 +AcDbRasterVariables + 3 +ISM + 90 +0 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +ACDBPLACEHOLDER + 2 +AcDbPlaceHolder + 3 +ObjectDBX Classes + 90 +0 + 91 +0 +280 +0 +281 +0 + 0 +CLASS + 1 +LAYOUT + 2 +AcDbLayout + 3 +ObjectDBX Classes + 90 +0 + 91 +0 +280 +0 +281 +0 + 0 +ENDSEC + 0 +SECTION + 2 +TABLES + 0 +TABLE + 2 +VPORT + 5 +8 +330 +0 +100 +AcDbSymbolTable + 70 +1 + 0 +VPORT + 5 +23 +330 +8 +100 +AcDbSymbolTableRecord +100 +AcDbViewportTableRecord + 2 +*Active + 70 +0 + 10 +0.0 + 20 +0.0 + 11 +1.0 + 21 +1.0 + 12 +344.2 + 22 +148.5 + 13 +0.0 + 23 +0.0 + 14 +0.5 + 24 +0.5 + 15 +0.5 + 25 +0.5 + 16 +0.0 + 26 +0.0 + 36 +1.0 + 17 +0.0 + 27 +0.0 + 37 +0.0 + 40 +297.0 + 41 +1.34 + 42 +50.0 + 43 +0.0 + 44 +0.0 + 50 +0.0 + 51 +0.0 + 71 +0 + 72 +1000 + 73 +1 + 74 +3 + 75 +0 + 76 +0 + 77 +0 + 78 +0 +281 +0 + 65 +0 +146 +0.0 + 0 +ENDTAB + 0 +TABLE + 2 +LTYPE + 5 +2 +330 +0 +100 +AcDbSymbolTable + 70 +3 + 0 +LTYPE + 5 +24 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByBlock + 70 +0 + 3 + + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +25 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +ByLayer + 70 +0 + 3 + + 72 +65 + 73 +0 + 40 +0.0 + 0 +LTYPE + 5 +26 +330 +2 +100 +AcDbSymbolTableRecord +100 +AcDbLinetypeTableRecord + 2 +Continuous + 70 +0 + 3 + + 72 +65 + 73 +0 + 40 +0.0 + 0 +ENDTAB + 0 +TABLE + 2 +LAYER + 5 +1 +330 +0 +100 +AcDbSymbolTable + 70 +4 + 0 +LAYER + 5 +27 +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +0 + 70 +0 + 62 +7 + 6 +Continuous +370 +-3 +390 +13 +347 +21 + 0 +LAYER + 5 +28 +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +Defpoints + 70 +0 + 62 +7 + 6 +Continuous +290 +0 +370 +-3 +390 +13 +347 +21 + 0 +LAYER + 5 +2F +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +BODY + 70 +0 + 62 +7 + 6 +Continuous +370 +-3 +390 +13 +347 +21 + 0 +LAYER + 5 +30 +330 +1 +100 +AcDbSymbolTableRecord +100 +AcDbLayerTableRecord + 2 +POPISKY + 70 +0 + 62 +1 + 6 +Continuous +370 +-3 +390 +13 +347 +21 + 0 +ENDTAB + 0 +TABLE + 2 +STYLE + 5 +5 +330 +0 +100 +AcDbSymbolTable + 70 +1 + 0 +STYLE + 5 +29 +330 +5 +100 +AcDbSymbolTableRecord +100 +AcDbTextStyleTableRecord + 2 +Standard + 70 +0 + 40 +0.0 + 41 +1.0 + 50 +0.0 + 71 +0 + 42 +2.5 + 3 +txt + 4 + + 0 +ENDTAB + 0 +TABLE + 2 +VIEW + 5 +7 +330 +0 +100 +AcDbSymbolTable + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +UCS + 5 +6 +330 +0 +100 +AcDbSymbolTable + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +APPID + 5 +3 +330 +0 +100 +AcDbSymbolTable + 70 +3 + 0 +APPID + 5 +2A +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +ACAD + 70 +0 + 0 +APPID + 5 +73 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +HATCHBACKGROUNDCOLOR + 70 +0 + 0 +APPID + 5 +74 +330 +3 +100 +AcDbSymbolTableRecord +100 +AcDbRegAppTableRecord + 2 +EZDXF + 70 +0 + 0 +ENDTAB + 0 +TABLE + 2 +DIMSTYLE + 5 +4 +330 +0 +100 +AcDbSymbolTable + 70 +1 +100 +AcDbDimStyleTable + 0 +DIMSTYLE +105 +2B +330 +4 +100 +AcDbSymbolTableRecord +100 +AcDbDimStyleTableRecord + 2 +Standard + 70 +0 + 40 +1.0 + 41 +2.5 + 42 +0.625 + 43 +3.75 + 44 +1.25 + 45 +0.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +2.5 +140 +2.5 +141 +2.5 +142 +0.0 +143 +0.03937007874 +144 +1.0 +145 +0.0 +146 +1.0 +147 +0.625 +148 +0.0 + 69 +0 + 70 +0 + 71 +0 + 72 +0 + 73 +0 + 74 +0 + 75 +0 + 76 +0 + 77 +1 + 78 +8 + 79 +0 +170 +0 +171 +3 +172 +1 +173 +0 +174 +0 +175 +0 +176 +0 +177 +0 +178 +0 +179 +0 +271 +0 +272 +2 +273 +2 +274 +3 +275 +0 +276 +0 +277 +2 +278 +44 +279 +0 +280 +0 +281 +0 +282 +0 +283 +0 +284 +8 +285 +0 +286 +0 +288 +0 +289 +3 +290 +0 +371 +-2 +372 +-2 + 0 +ENDTAB + 0 +TABLE + 2 +BLOCK_RECORD + 5 +9 +330 +0 +100 +AcDbSymbolTable + 70 +2 + 0 +BLOCK_RECORD + 5 +17 +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Model_Space +340 +1A + 70 +0 +280 +1 +281 +0 + 0 +BLOCK_RECORD + 5 +1B +330 +9 +100 +AcDbSymbolTableRecord +100 +AcDbBlockTableRecord + 2 +*Paper_Space +340 +1E + 70 +0 +280 +1 +281 +0 + 0 +ENDTAB + 0 +ENDSEC + 0 +SECTION + 2 +BLOCKS + 0 +BLOCK + 5 +18 +330 +17 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Model_Space + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Model_Space + 1 + + 0 +ENDBLK + 5 +19 +330 +17 +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +BLOCK + 5 +1C +330 +1B +100 +AcDbEntity + 8 +0 +100 +AcDbBlockBegin + 2 +*Paper_Space + 70 +0 + 10 +0.0 + 20 +0.0 + 30 +0.0 + 3 +*Paper_Space + 1 + + 0 +ENDBLK + 5 +1D +330 +1B +100 +AcDbEntity + 8 +0 +100 +AcDbBlockEnd + 0 +ENDSEC + 0 +SECTION + 2 +ENTITIES + 0 +POINT + 5 +31 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +0.0 + 20 +0.0 + 30 +0.0 + 0 +TEXT + 5 +32 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +2.0 + 20 +2.0 + 30 +0.0 + 40 +2.5 + 1 +POCATEK + 11 +2.0 + 21 +2.0 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +33 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +164.7 + 30 +0.0 + 0 +TEXT + 5 +34 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +166.7 + 30 +0.0 + 40 +2.5 + 1 +X62101 + 11 +176.0 + 21 +166.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +35 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +108.2 + 30 +0.0 + 0 +TEXT + 5 +36 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +110.2 + 30 +0.0 + 40 +2.5 + 1 +X62201 + 11 +176.0 + 21 +110.2 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +37 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +51.7 + 30 +0.0 + 0 +TEXT + 5 +38 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +53.7 + 30 +0.0 + 40 +2.5 + 1 +X62301 + 11 +176.0 + 21 +53.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +39 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +200.7 + 30 +0.0 + 0 +TEXT + 5 +3A +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +202.7 + 30 +0.0 + 40 +2.5 + 1 +X62001 + 11 +176.0 + 21 +202.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +3B +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +15.95 + 30 +0.0 + 0 +TEXT + 5 +3C +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +17.95 + 30 +0.0 + 40 +2.5 + 1 +X71001 + 11 +-11.345 + 21 +17.95 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +3D +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +42.0 + 30 +0.0 + 0 +TEXT + 5 +3E +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +44.0 + 30 +0.0 + 40 +2.5 + 1 +X71000 + 11 +-11.128 + 21 +44.0 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +3F +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +233.45 + 30 +0.0 + 0 +TEXT + 5 +40 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +235.45 + 30 +0.0 + 40 +2.5 + 1 +X72001 + 11 +-11.345 + 21 +235.45 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +41 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +207.65 + 30 +0.0 + 0 +TEXT + 5 +42 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +209.65 + 30 +0.0 + 40 +2.5 + 1 +X72000 + 11 +-11.128 + 21 +209.65 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +43 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +164.7 + 30 +0.0 + 0 +TEXT + 5 +44 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +166.7 + 30 +0.0 + 40 +2.5 + 1 +X62101 + 11 +176.0 + 21 +166.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +45 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +108.2 + 30 +0.0 + 0 +TEXT + 5 +46 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +110.2 + 30 +0.0 + 40 +2.5 + 1 +X62201 + 11 +176.0 + 21 +110.2 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +47 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +51.7 + 30 +0.0 + 0 +TEXT + 5 +48 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +53.7 + 30 +0.0 + 40 +2.5 + 1 +X62301 + 11 +176.0 + 21 +53.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +49 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +200.7 + 30 +0.0 + 0 +TEXT + 5 +4A +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +202.7 + 30 +0.0 + 40 +2.5 + 1 +X62001 + 11 +176.0 + 21 +202.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +4B +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +15.95 + 30 +0.0 + 0 +TEXT + 5 +4C +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +17.95 + 30 +0.0 + 40 +2.5 + 1 +X71001 + 11 +-11.345 + 21 +17.95 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +4D +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +42.0 + 30 +0.0 + 0 +TEXT + 5 +4E +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +44.0 + 30 +0.0 + 40 +2.5 + 1 +X71000 + 11 +-11.128 + 21 +44.0 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +4F +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +233.45 + 30 +0.0 + 0 +TEXT + 5 +50 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +235.45 + 30 +0.0 + 40 +2.5 + 1 +X72001 + 11 +-11.345 + 21 +235.45 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +51 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +207.65 + 30 +0.0 + 0 +TEXT + 5 +52 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +209.65 + 30 +0.0 + 40 +2.5 + 1 +X72000 + 11 +-11.128 + 21 +209.65 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +53 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +15.95 + 30 +0.0 + 0 +TEXT + 5 +54 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +17.95 + 30 +0.0 + 40 +2.5 + 1 +X71001 + 11 +-11.345 + 21 +17.95 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +55 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +42.0 + 30 +0.0 + 0 +TEXT + 5 +56 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +44.0 + 30 +0.0 + 40 +2.5 + 1 +X71000 + 11 +-11.128 + 21 +44.0 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +57 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +233.45 + 30 +0.0 + 0 +TEXT + 5 +58 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +235.45 + 30 +0.0 + 40 +2.5 + 1 +X72001 + 11 +-11.345 + 21 +235.45 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +59 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +207.65 + 30 +0.0 + 0 +TEXT + 5 +5A +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +209.65 + 30 +0.0 + 40 +2.5 + 1 +X72000 + 11 +-11.128 + 21 +209.65 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +5B +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +164.7 + 30 +0.0 + 0 +TEXT + 5 +5C +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +166.7 + 30 +0.0 + 40 +2.5 + 1 +X62101 + 11 +176.0 + 21 +166.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +5D +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +108.2 + 30 +0.0 + 0 +TEXT + 5 +5E +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +110.2 + 30 +0.0 + 40 +2.5 + 1 +X62201 + 11 +176.0 + 21 +110.2 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +5F +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +51.7 + 30 +0.0 + 0 +TEXT + 5 +60 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +53.7 + 30 +0.0 + 40 +2.5 + 1 +X62301 + 11 +176.0 + 21 +53.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +61 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +174.0 + 20 +200.7 + 30 +0.0 + 0 +TEXT + 5 +62 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +176.0 + 20 +202.7 + 30 +0.0 + 40 +2.5 + 1 +X62001 + 11 +176.0 + 21 +202.7 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +63 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +15.95 + 30 +0.0 + 0 +TEXT + 5 +64 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +17.95 + 30 +0.0 + 40 +2.5 + 1 +X71001 + 11 +-11.345 + 21 +17.95 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +65 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +42.0 + 30 +0.0 + 0 +TEXT + 5 +66 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +44.0 + 30 +0.0 + 40 +2.5 + 1 +X71000 + 11 +-11.128 + 21 +44.0 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +67 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +233.45 + 30 +0.0 + 0 +TEXT + 5 +68 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +235.45 + 30 +0.0 + 40 +2.5 + 1 +X72001 + 11 +-11.345 + 21 +235.45 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +69 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +207.65 + 30 +0.0 + 0 +TEXT + 5 +6A +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +209.65 + 30 +0.0 + 40 +2.5 + 1 +X72000 + 11 +-11.128 + 21 +209.65 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +6B +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +15.95 + 30 +0.0 + 0 +TEXT + 5 +6C +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +17.95 + 30 +0.0 + 40 +2.5 + 1 +X71001 + 11 +-11.345 + 21 +17.95 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +6D +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +42.0 + 30 +0.0 + 0 +TEXT + 5 +6E +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +44.0 + 30 +0.0 + 40 +2.5 + 1 +X71000 + 11 +-11.128 + 21 +44.0 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +6F +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.345 + 20 +233.45 + 30 +0.0 + 0 +TEXT + 5 +70 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.345 + 20 +235.45 + 30 +0.0 + 40 +2.5 + 1 +X72001 + 11 +-11.345 + 21 +235.45 + 31 +0.0 +100 +AcDbText + 0 +POINT + 5 +71 +330 +17 +100 +AcDbEntity + 8 +BODY +100 +AcDbPoint + 10 +-13.128 + 20 +207.65 + 30 +0.0 + 0 +TEXT + 5 +72 +330 +17 +100 +AcDbEntity + 8 +POPISKY +100 +AcDbText + 10 +-11.128 + 20 +209.65 + 30 +0.0 + 40 +2.5 + 1 +X72000 + 11 +-11.128 + 21 +209.65 + 31 +0.0 +100 +AcDbText + 0 +ENDSEC + 0 +SECTION + 2 +OBJECTS + 0 +DICTIONARY + 5 +A +330 +0 +100 +AcDbDictionary +281 +1 + 3 +ACAD_COLOR +350 +B + 3 +ACAD_GROUP +350 +C + 3 +ACAD_LAYOUT +350 +D + 3 +ACAD_MATERIAL +350 +E + 3 +ACAD_MLEADERSTYLE +350 +F + 3 +ACAD_MLINESTYLE +350 +10 + 3 +ACAD_PLOTSETTINGS +350 +11 + 3 +ACAD_PLOTSTYLENAME +350 +12 + 3 +ACAD_SCALELIST +350 +14 + 3 +ACAD_TABLESTYLE +350 +15 + 3 +ACAD_VISUALSTYLE +350 +16 + 3 +EZDXF_META +350 +2D + 0 +DICTIONARY + 5 +B +330 +A +100 +AcDbDictionary +281 +1 + 0 +DICTIONARY + 5 +C +330 +A +100 +AcDbDictionary +281 +1 + 0 +DICTIONARY + 5 +D +330 +A +100 +AcDbDictionary +281 +1 + 3 +Model +350 +1A + 3 +Layout1 +350 +1E + 0 +DICTIONARY + 5 +E +330 +A +100 +AcDbDictionary +281 +1 + 3 +ByBlock +350 +1F + 3 +ByLayer +350 +20 + 3 +Global +350 +21 + 0 +DICTIONARY + 5 +F +330 +A +100 +AcDbDictionary +281 +1 + 3 +Standard +350 +2C + 0 +DICTIONARY + 5 +10 +330 +A +100 +AcDbDictionary +281 +1 + 3 +Standard +350 +22 + 0 +DICTIONARY + 5 +11 +330 +A +100 +AcDbDictionary +281 +1 + 0 +ACDBDICTIONARYWDFLT + 5 +12 +330 +A +100 +AcDbDictionary +281 +1 + 3 +Normal +350 +13 +100 +AcDbDictionaryWithDefault +340 +13 + 0 +ACDBPLACEHOLDER + 5 +13 +330 +12 + 0 +DICTIONARY + 5 +14 +330 +A +100 +AcDbDictionary +281 +1 + 0 +DICTIONARY + 5 +15 +330 +A +100 +AcDbDictionary +281 +1 + 0 +DICTIONARY + 5 +16 +330 +A +100 +AcDbDictionary +281 +1 + 0 +LAYOUT + 5 +1A +330 +D +100 +AcDbPlotSettings + 1 + + 2 +Adobe PDF + 4 +A3 + 6 + + 40 +7.5 + 41 +20.0 + 42 +7.5 + 43 +20.0 + 44 +420.0 + 45 +297.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +1024 + 72 +1 + 73 +1 + 74 +5 + 7 + + 75 +16 + 76 +0 + 77 +2 + 78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Model + 70 +1 + 71 +0 + 10 +0.0 + 20 +0.0 + 11 +420.0 + 21 +297.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +1e+20 + 24 +1e+20 + 34 +1e+20 + 15 +-1e+20 + 25 +-1e+20 + 35 +-1e+20 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +1 +330 +17 + 0 +LAYOUT + 5 +1E +330 +D +100 +AcDbPlotSettings + 1 + + 2 +Adobe PDF + 4 +A3 + 6 + + 40 +7.5 + 41 +20.0 + 42 +7.5 + 43 +20.0 + 44 +420.0 + 45 +297.0 + 46 +0.0 + 47 +0.0 + 48 +0.0 + 49 +0.0 +140 +0.0 +141 +0.0 +142 +1.0 +143 +1.0 + 70 +0 + 72 +1 + 73 +1 + 74 +5 + 7 + + 75 +16 + 76 +0 + 77 +2 + 78 +300 +147 +1.0 +148 +0.0 +149 +0.0 +100 +AcDbLayout + 1 +Layout1 + 70 +1 + 71 +1 + 10 +0.0 + 20 +0.0 + 11 +420.0 + 21 +297.0 + 12 +0.0 + 22 +0.0 + 32 +0.0 + 14 +1e+20 + 24 +1e+20 + 34 +1e+20 + 15 +-1e+20 + 25 +-1e+20 + 35 +-1e+20 +146 +0.0 + 13 +0.0 + 23 +0.0 + 33 +0.0 + 16 +1.0 + 26 +0.0 + 36 +0.0 + 17 +0.0 + 27 +1.0 + 37 +0.0 + 76 +1 +330 +1B + 0 +MATERIAL + 5 +1F +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E +100 +AcDbMaterial + 1 +ByBlock + 2 + + 70 +0 + 40 +1.0 + 71 +1 + 41 +1.0 + 91 +-1023410177 + 42 +1.0 + 72 +1 + 3 + + 73 +1 + 74 +1 + 75 +1 + 44 +0.5 + 73 +0 + 45 +1.0 + 46 +1.0 + 77 +1 + 4 + + 78 +1 + 79 +1 +170 +1 + 48 +1.0 +171 +1 + 6 + +172 +1 +173 +1 +174 +1 +140 +1.0 +141 +1.0 +175 +1 + 7 + +176 +1 +177 +1 +178 +1 +143 +1.0 +179 +1 + 8 + +270 +1 +271 +1 +272 +1 +145 +1.0 +146 +1.0 +273 +1 + 9 + +274 +1 +275 +1 +276 +1 + 42 +1.0 + 72 +1 + 3 + + 73 +1 + 74 +1 + 75 +1 + 94 +63 + 0 +MATERIAL + 5 +20 +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E +100 +AcDbMaterial + 1 +ByLayer + 2 + + 70 +0 + 40 +1.0 + 71 +1 + 41 +1.0 + 91 +-1023410177 + 42 +1.0 + 72 +1 + 3 + + 73 +1 + 74 +1 + 75 +1 + 44 +0.5 + 73 +0 + 45 +1.0 + 46 +1.0 + 77 +1 + 4 + + 78 +1 + 79 +1 +170 +1 + 48 +1.0 +171 +1 + 6 + +172 +1 +173 +1 +174 +1 +140 +1.0 +141 +1.0 +175 +1 + 7 + +176 +1 +177 +1 +178 +1 +143 +1.0 +179 +1 + 8 + +270 +1 +271 +1 +272 +1 +145 +1.0 +146 +1.0 +273 +1 + 9 + +274 +1 +275 +1 +276 +1 + 42 +1.0 + 72 +1 + 3 + + 73 +1 + 74 +1 + 75 +1 + 94 +63 + 0 +MATERIAL + 5 +21 +102 +{ACAD_REACTORS +330 +E +102 +} +330 +E +100 +AcDbMaterial + 1 +Global + 2 + + 70 +0 + 40 +1.0 + 71 +1 + 41 +1.0 + 91 +-1023410177 + 42 +1.0 + 72 +1 + 3 + + 73 +1 + 74 +1 + 75 +1 + 44 +0.5 + 73 +0 + 45 +1.0 + 46 +1.0 + 77 +1 + 4 + + 78 +1 + 79 +1 +170 +1 + 48 +1.0 +171 +1 + 6 + +172 +1 +173 +1 +174 +1 +140 +1.0 +141 +1.0 +175 +1 + 7 + +176 +1 +177 +1 +178 +1 +143 +1.0 +179 +1 + 8 + +270 +1 +271 +1 +272 +1 +145 +1.0 +146 +1.0 +273 +1 + 9 + +274 +1 +275 +1 +276 +1 + 42 +1.0 + 72 +1 + 3 + + 73 +1 + 74 +1 + 75 +1 + 94 +63 + 0 +MLINESTYLE + 5 +22 +102 +{ACAD_REACTORS +330 +10 +102 +} +330 +10 +100 +AcDbMlineStyle + 2 +Standard + 70 +0 + 3 + + 62 +256 + 51 +90.0 + 52 +90.0 + 71 +2 + 49 +0.5 + 62 +256 + 6 +BYLAYER + 49 +-0.5 + 62 +256 + 6 +BYLAYER + 0 +MLEADERSTYLE + 5 +2C +102 +{ACAD_REACTORS +330 +F +102 +} +330 +F +100 +AcDbMLeaderStyle +179 +2 +170 +2 +171 +1 +172 +0 + 90 +2 + 40 +0.0 + 41 +0.0 +173 +1 + 91 +-1056964608 + 92 +-2 +290 +1 + 42 +2.0 +291 +1 + 43 +8.0 + 3 +Standard + 44 +4.0 +300 + +342 +29 +174 +1 +175 +1 +176 +0 +178 +1 + 93 +-1056964608 + 45 +4.0 +292 +0 +297 +0 + 46 +4.0 + 94 +-1056964608 + 47 +1.0 + 49 +1.0 +140 +1.0 +294 +1 +141 +0.0 +177 +0 +142 +1.0 +295 +0 +296 +0 +143 +3.75 +271 +0 +272 +9 +273 +9 + 0 +DICTIONARY + 5 +2D +330 +A +100 +AcDbDictionary +280 +1 +281 +1 + 3 +CREATED_BY_EZDXF +350 +2E + 3 +WRITTEN_BY_EZDXF +350 +75 + 0 +DICTIONARYVAR + 5 +2E +330 +2D +100 +DictionaryVariables +280 +0 + 1 +0.17 @ 2025-07-25T08:34:44.830355+00:00 + 0 +DICTIONARYVAR + 5 +75 +330 +2D +100 +DictionaryVariables +280 +0 + 1 +0.17 @ 2025-07-25T08:34:44.831226+00:00 + 0 +ENDSEC + 0 +EOF diff --git a/test.py b/test.py new file mode 100644 index 0000000..69245cd --- /dev/null +++ b/test.py @@ -0,0 +1,78 @@ +from flask import Flask, request, render_template, send_file +from io import BytesIO, StringIO +import ezdxf +import openpyxl +import os +import sys + +app = Flask(__name__) + +@app.route('/', methods=['GET', 'POST']) +def upload_file(): + if request.method == 'POST': + file = request.files['file'] + if file.filename.endswith('.xls') or file.filename.endswith('.csv') or file.filename.endswith('.xlsx'): + # Create a text file with the uploaded file name + + velikost = request.form['range'] + print(velikost) + + body = nacti_data_z_excelu(file) + #print(body) + + dxf_file = exportuj_do_dxf(body, velikost) + dxf_file.seek(0) + return send_file( + path_or_file=dxf_file, + as_attachment=True, + download_name='hotovy.dxf', + mimetype='application/octet-stream' + ) + else: + return render_template('upload_form.html', no_file=True) + return render_template('upload_form.html') + +def nacti_data_z_excelu(soubor, listname="List1"): + wb = openpyxl.load_workbook(soubor, data_only=True) + sheet = wb[listname] + body = [] + + for row in sheet.iter_rows(min_row=2, values_only=True): + if row[0] and row[1] is not None and row[2] is not None: + label = str(row[0]) + try: + x = float(row[1]) + y = float(row[2]) + z = float(row[3]) if len(row) > 3 and row[3] is not None else 0 + body.append((label, x, y, z)) + except ValueError: + continue + return body + +def exportuj_do_dxf(body, velikost) -> BytesIO: + doc = ezdxf.new() + msp = doc.modelspace() + + doc.layers.new(name="BODY", dxfattribs={"color": 7}) + doc.layers.new(name="POPISKY", dxfattribs={"color": 1}) + + for label, x, y, z in body: + msp.add_point((x, y, z), dxfattribs={"layer": "BODY"}) + msp.add_text( + label + "*"*(body.count((label, x, y, z))-1), + + dxfattribs={"layer": "POPISKY", "height": float(velikost)}).set_pos((x + 2, y + 2), align="LEFT") # Posun textu od bodu + + my_file = StringIO() + out_file = BytesIO() + doc.write(my_file, fmt="asc") + print(my_file) + out_file.write(my_file.getvalue().encode('utf-8')) + + return out_file + + + + +if __name__ == '__main__': + app.run(debug=False, port=5003, host='0.0.0.0') \ No newline at end of file