This commit is contained in:
navry 2025-08-04 22:51:20 +02:00
parent d4ecc354cf
commit 4d7411256b
12 changed files with 4924 additions and 0 deletions

26
Dockerfile Normal file
View File

@ -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"]

0
README.md Normal file
View File

View File

@ -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

BIN
body_advanced.xlsx Normal file

Binary file not shown.

BIN
body_easy.xlsx Normal file

Binary file not shown.

12
compose.debug.yaml Normal file
View File

@ -0,0 +1,12 @@
services:
test:
image: test2
build:
context: .
dockerfile: ./Dockerfile
command: ["sh", "-c", "pip install debugpy -t /tmp && python /tmp/debugpy --wait-for-client --listen 0.0.0.0:5678 -m flask run --no-debugger --no-reload --host 0.0.0.0 --port 5002"]
ports:
- 5002:5002
- 5678:5678
environment:
- FLASK_APP=test.py

8
compose.yaml Normal file
View File

@ -0,0 +1,8 @@
services:
test:
image: test2
build:
context: .
dockerfile: ./Dockerfile
ports:
- 5003:5003

View File

@ -0,0 +1,52 @@
import ezdxf
import openpyxl
import os
import sys
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, 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}")

14
requirements.txt Normal file
View File

@ -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

View File

@ -0,0 +1,46 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- apply pico css-->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
<!-- apply htmx -->
<script src="https://unpkg.com/htmx.org@1.7.0"></script>
<title>converter</title>
</head>
<body>
<header class="container"><h1>XLSX to DXF Converter</h1></header>
<main class="container">
<form action="" method="post" enctype="multipart/form-data">
<input type="file" id="file-input" name="file" accept=".xls, .csv, .xlsx" required>
<p class="grid">
<label for="range">Velikost textu
</label>
<input type="range" min="0.5" max="10" value="1" step="0.5" id="range" name="range">
<label id="font_size">1</label>
</p>
<!-- make submit possible only if file is choosen -->
<input type="submit" id="submit-button" value="Nahrát a stáhnout hotový">
</form>
</main>
</body>
<script>
document.getElementById('range').addEventListener('input', function() {
document.getElementById('font_size').innerText = this.value;
});
</script>
<style>
#font_size {
margin-left: 10px;
padding-bottom: 5px;
font-size: 24px;
text-align: center;
}
</style>
</html>

4684
test.dxf Normal file

File diff suppressed because it is too large Load Diff

78
test.py Normal file
View File

@ -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')