From f963743d42044ee037283a027242e3cbf8e40245 Mon Sep 17 00:00:00 2001 From: bogo Date: Sat, 14 Sep 2024 12:59:33 +0200 Subject: [PATCH] Add shootoff and ipsc el presidente drills --- app.py | 195 +++++++++++++++++++++------ static/images/ipsc.png | Bin 0 -> 32881 bytes static/images/ipsc.svg | 9 ++ static/images/ipsc_preview.png | Bin 0 -> 21363 bytes static/images/shootoff.png | Bin 0 -> 9338 bytes templates/base.html | 49 +++++++ templates/index.html | 186 ------------------------- templates/ipsc.html | 20 +++ templates/ipsc_target.html | 1 + templates/pdf_template.html | 6 +- templates/pdf_template_ipsc.html | 126 +++++++++++++++++ templates/pdf_template_shootoff.html | 172 +++++++++++++++++++++++ templates/sc.html | 79 +++++++++++ templates/setup.html | 40 ++++++ templates/shootoff.html | 22 +++ 15 files changed, 677 insertions(+), 228 deletions(-) create mode 100644 static/images/ipsc.png create mode 100644 static/images/ipsc.svg create mode 100644 static/images/ipsc_preview.png create mode 100644 static/images/shootoff.png create mode 100644 templates/base.html delete mode 100644 templates/index.html create mode 100644 templates/ipsc.html create mode 100644 templates/ipsc_target.html create mode 100644 templates/pdf_template_ipsc.html create mode 100644 templates/pdf_template_shootoff.html create mode 100644 templates/sc.html create mode 100644 templates/setup.html create mode 100644 templates/shootoff.html diff --git a/app.py b/app.py index 5a557d7..e0ba360 100644 --- a/app.py +++ b/app.py @@ -6,6 +6,14 @@ import io app = Flask(__name__) +SHOOTOFF_DISTANCE = 1200 +SHOOTOFF_GAP = 100 +IPSC_DISTANCE = 914 +IPSC_GAP = 92 +IPSC_TARGET_WIDTH = 46 +IPSC_TARGET_HEIGHT = 58 +IPSC_STAGE_WIDTH = 322 + VALUES = { "five_to_go": { "t1": {"len_a": 3100, "len_h": 9100, 'width': 250, 'height': 250, 'elevation': 0, 'stop_plate': False, @@ -109,6 +117,135 @@ VALUES = { } } +@app.route('/') +def index(): + return render_template('sc.html', current_url=request.path) + +@app.route('/shootoff') +def shootoff(): + return render_template('shootoff.html', current_url=request.path) + +@app.route('/ipsc') +def ipsc(): + return render_template('ipsc.html', current_url=request.path) + +@app.route('/generate-pdf', methods=['POST']) +def generate_pdf(): + distance = int(request.form.get('distance', 1) or 1) + distance_in_mm = distance * 10 + stage = request.form.get('stage') + size = request.form.get('size') + distance_type = request.form.get('distance_type') + if distance_type == 'wall': + distance_in_mm = calculate_distance(distance_in_mm, stage, size) + + targets = [f't{i}' for i in range(1, 6)] + target_info = [_target_info(distance_in_mm, stage, size, target) for target in targets] + wall_extra_space_for_paper = 297 if size == 'a3' else 210 + wall_length = target_info[-1]['position'] + wall_extra_space_for_paper + preview_size = 267 if size == 'a3' else 190 + preview_scale = preview_size / target_info[-1]['position'] + preview_distance = distance_in_mm * preview_scale + preview_target_info = [_target_info(preview_distance, stage, size, target) for target in targets] + box_position = int(target_info[0]['sim_a_len']) / 10 + + rendered_html = render_template( + 'pdf_template.html', + distance=distance_in_mm/10, + size=size, + stage=stage, + target_info=target_info, + preview_target_info=preview_target_info, + wall_length=wall_length, + box_position=box_position, + ) + #return rendered_html + + pdf_file = io.BytesIO() + HTML(string=rendered_html).write_pdf(pdf_file) + pdf_file.seek(0) + filename = 'Paper Challenge - ' + stage.replace('_', ' ') + ' - ' + str(distance) + 'cm-' + size + '.pdf' + + return send_file(pdf_file, download_name=filename, as_attachment=False) + + +@app.route('/generate-pdf-shootoff', methods=['POST']) +def generate_pdf_shootoff(): + distance = int(request.form.get('distance', 1) or 1) + size = request.form.get('size') + distance_type = request.form.get('distance_type') + target_count = 6 + if distance_type == 'wall': + desired_wall_length = distance + distance = calculate_distance_shootoff(desired_wall_length, size, target_count) + target_line = (target_count - 1) * SHOOTOFF_GAP + scale = distance / SHOOTOFF_DISTANCE + wall_extra_space_for_paper = 29.7 if size == 'a3' else 21.0 + wall_length = target_line * scale + wall_extra_space_for_paper + preview_size = 25.7 if size == 'a3' else 18 + preview_scale = preview_size /target_line + box_position = wall_length / 2 + + + + rendered_html = render_template( + 'pdf_template_shootoff.html', + distance=distance, + size=size, + wall_length=wall_length, + gap=SHOOTOFF_GAP*scale, + target_count=target_count, + scale=scale, + preview_scale=preview_scale, + box_position=box_position + ) + #return rendered_html + + pdf_file = io.BytesIO() + HTML(string=rendered_html).write_pdf(pdf_file) + pdf_file.seek(0) + filename = 'Paper Challenge - Shootoff - ' + str(distance) + 'cm-' + size + '.pdf' + + return send_file(pdf_file, download_name=filename, as_attachment=False) + +@app.route('/generate-pdf-ipsc', methods=['POST']) +def generate_pdf_ipsc(): + distance = int(request.form.get('distance', 1) or 1) + size = request.form.get('size') + distance_type = request.form.get('distance_type') + scale = distance / IPSC_DISTANCE + wall_extra_space_for_paper = 29.7 if size == 'a3' else 21.0 + if distance_type == 'wall': + scale = (distance - wall_extra_space_for_paper) / IPSC_STAGE_WIDTH + distance = scale * IPSC_DISTANCE + target_line = scale * IPSC_STAGE_WIDTH + wall_extra_space_for_paper + preview_size = 15 if size == 'a3' else 10 + preview_scale = preview_size /target_line + box_position = target_line / 2 + + rendered_html = render_template( + 'pdf_template_ipsc.html', + distance=distance, + size=size, + wall_length=target_line, + target_height=scale * IPSC_TARGET_HEIGHT, + target_width=scale * IPSC_TARGET_WIDTH, + gap=scale * IPSC_GAP + scale * IPSC_TARGET_WIDTH, + preview_margin=(wall_extra_space_for_paper - preview_size) / 2, + scale=scale, + preview_scale=preview_scale, + box_position=box_position + ) +# return rendered_html + + pdf_file = io.BytesIO() + HTML(string=rendered_html).write_pdf(pdf_file) + pdf_file.seek(0) + filename = 'Paper Challenge - IPSC - EL Presidente - ' + str(distance) + 'cm-' + size + '.pdf' + + return send_file(pdf_file, download_name=filename, as_attachment=False) + + def calculate_distance(desired_wall_length, stage, size): wall_extra_space_for_paper = 297 if size == 'a3' else 210 @@ -175,50 +312,30 @@ def _target_info(distance, stage, size, target): } -@app.route('/') -def index(): - return render_template('index.html') -@app.route('/generate-pdf', methods=['POST']) -def generate_pdf(): - distance = int(request.form.get('distance', 1) or 1) - distance_in_mm = distance * 10 - stage = request.form.get('stage') - size = request.form.get('size') - distance_type = request.form.get('distance_type') - if distance_type == 'wall': - distance_in_mm = calculate_distance(distance_in_mm, stage, size) - targets = [f't{i}' for i in range(1, 6)] - target_info = [_target_info(distance_in_mm, stage, size, target) for target in targets] - wall_extra_space_for_paper = 297 if size == 'a3' else 210 - wall_length = target_info[-1]['position'] + wall_extra_space_for_paper - preview_size = 267 if size == 'a3' else 190 - preview_scale = preview_size / target_info[-1]['position'] - preview_distance = distance_in_mm * preview_scale - preview_target_info = [_target_info(preview_distance, stage, size, target) for target in targets] - box_position = int(target_info[0]['sim_a_len']) / 10 +def calculate_distance_shootoff(desired_wall_length, size, target_count): + wall_extra_space_for_paper = 29.7 if size == 'a3' else 21.0 + distance = 1 + step = 100 - rendered_html = render_template( - 'pdf_template.html', - distance=distance_in_mm/10, - size=size, - stage=stage, - target_info=target_info, - preview_target_info=preview_target_info, - wall_length=wall_length, - box_position=box_position, - ) - #return rendered_html - - pdf_file = io.BytesIO() - HTML(string=rendered_html).write_pdf(pdf_file) - pdf_file.seek(0) - filename = 'Paper Challenge - ' + stage.replace('_', ' ') + ' - ' + str(distance) + 'cm-' + size + '.pdf' - - return send_file(pdf_file, download_name=filename, as_attachment=False) + while True: + target_line = (target_count - 1) * SHOOTOFF_GAP + scale = distance / SHOOTOFF_DISTANCE + wall_length = target_line * scale + wall_extra_space_for_paper + print(distance, wall_length, desired_wall_length) + if abs(wall_length - desired_wall_length) <= 0.5: + break + if wall_length > desired_wall_length: + distance -= step + step = step / 10 + continue + distance += step; + if distance > 700: + break + return distance if __name__ == '__main__': app.run(debug=True) diff --git a/static/images/ipsc.png b/static/images/ipsc.png new file mode 100644 index 0000000000000000000000000000000000000000..a6aa04b3ea97d1f21bbf0813d3a7369db9c163dc GIT binary patch literal 32881 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 literal 0 HcmV?d00001 diff --git a/static/images/ipsc.svg b/static/images/ipsc.svg new file mode 100644 index 0000000..baf564b --- /dev/null +++ b/static/images/ipsc.svg @@ -0,0 +1,9 @@ + + ipsc-svg + + + + + + \ No newline at end of file diff --git a/static/images/ipsc_preview.png b/static/images/ipsc_preview.png new file mode 100644 index 0000000000000000000000000000000000000000..f1895470b389e0d912a8b882a21a03b6e00f7a3f GIT binary patch literal 21363 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 literal 0 HcmV?d00001 diff --git a/templates/base.html b/templates/base.html new file mode 100644 index 0000000..6b98b5d --- /dev/null +++ b/templates/base.html @@ -0,0 +1,49 @@ + + + + + + Paper Challenge + + + + +
+

Paper Challenge

+

Wygeneruj tor {% block title %}{% endblock %}

+ + {% block content %}{% endblock %} +
+ + diff --git a/templates/index.html b/templates/index.html deleted file mode 100644 index 74b6668..0000000 --- a/templates/index.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - Paper Challenge - - - - -
-

Paper Challenge

- - -
-

Projekt powstał na potrzeby treningu Steel Challenge w domowym zaciszu

-

Ostrzeżenie: Od ponad 11 lat pracuję z PHP, więc mogą być widoczne naleciałości!
Ten projekt - to moje pierwsze... no może drugie kroki w Pythonie.

-

Kopiowanie, rozpowszechnianie, modyfikowanie i udostępnianie na potrzeby własne, klubowe lub dla - kolegi, stanowczo zalecane

-
-

Wygeneruj tor

-
-
-

Wybierz rodzaj kalkulacji ze względu na ograniczoną długość ściany lub ograniczoną odległość stanowiska od ściany

-
- - - - -
-
-

dystans [cm]

- -
-
-
-

Format druku

-
- - -
-
- -
-

Tor

-
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- -
- -
-
-
- - diff --git a/templates/ipsc.html b/templates/ipsc.html new file mode 100644 index 0000000..4aeac3f --- /dev/null +++ b/templates/ipsc.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} +{% block title %}IPSC - El Presidente{% endblock %} +{% block content %} +
+ {% include 'setup.html' %} +
+

IPSC - El Presidente

+ +
+ IPSC - El Presidente +
+
+
+ +
+
+{% endblock %} diff --git a/templates/ipsc_target.html b/templates/ipsc_target.html new file mode 100644 index 0000000..2a05060 --- /dev/null +++ b/templates/ipsc_target.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/pdf_template.html b/templates/pdf_template.html index 3ae5eaa..b5140d4 100644 --- a/templates/pdf_template.html +++ b/templates/pdf_template.html @@ -83,11 +83,11 @@

Wymagana długość ściany: {{ wall_length/10 }}cm

-

Odległość od ściany: {{ distance }}cm

+

Odległość od ściany: {{ distance|round(1,'ceil') }}cm

Przygotowanie toru:

  • Umieść z lewej strony ściany pierwszy cel ze znacznikiem "punkt ZERO"
  • -
  • Wyznacz pole startowe {{ box_position }}cm od punktu "zero"
  • +
  • Wyznacz pole startowe {{ box_position }}cm od punktu "zero" (wzdłuż ściany) oraz w odległości {{distance}}cm od ściany
  • Upewnij się, że pole startowe znjaduje się w dogodnym miejscu, pomieszczenia, tak aby nic nie przeszkazdało w swobodnym dobyciu i składaniu do celów na całej szerokości ściany
  • @@ -113,7 +113,7 @@ {% if target.target == 't1' %}
    punkt ZERO ({{ stage.split('_') | map('capitalize') | join(' ') }})
    {% else %} -
    {{ target.position / 10 }}cm from 0 point ({{ stage.split('_') | map('capitalize') | join(' ') }})
    +
    {{ target.position / 10 }}cm od punktu ZERO ({{ stage.split('_') | map('capitalize') | join(' ') }})
    {% endif %}
    diff --git a/templates/pdf_template_ipsc.html b/templates/pdf_template_ipsc.html new file mode 100644 index 0000000..cf444ac --- /dev/null +++ b/templates/pdf_template_ipsc.html @@ -0,0 +1,126 @@ + + + + + + + Paper Challenge - IPSC - El Presidente - {{ distance }} cm + - {{ size|capitalize }} + + + + +
    +

    Paper Challenge

    +

    IPSC - El Presidente

    + +
    + {% for i in range(3) %} +
    + + ipsc-svg + + {% include 'ipsc_target.html' %} + + + + +
    + {% endfor %} +
    + +

    Wymagana długość ściany: {{ wall_length|round(1,'ceil') }}cm

    +

    Odległość od ściany: {{ distance|round(1,'ceil') }}cm

    +

    Przygotowanie toru:

    +
      +
    • Umieść z lewej lub prawej strony ściany pierwszy cel ze znacznikiem "punkt ZERO"
    • +
    • Wyznacz pole startowe {{ box_position|round(1,'ceil') }}cm od punktu "zero" (wzdłuż ściany) oraz w odległości {{distance}}cm od ściany
    • +
    • Upewnij się, że pole startowe znjaduje się w dogodnym miejscu, pomieszczenia, tak aby nic nie + przeszkazdało + w swobodnym dobyciu i składaniu do celów na całej szerokości ściany +
    • +
    • W razie potrzeby dostosuj pierwszy cel wraz z punktem ZERO i powtórz dwa powyższe kroki
    • +
    • Umieść na ścianie pozostałe cele zgodnie z odległościami podanymi na znacznikach pozycji na dole każdego + celu. Upewnij się, że wszystkie cele są umieszczone w jednej linii równoległej do podłoża
    • +
    + +
    + {% for i in range(3) %} +
    +
    +
    + + ipsc-svg + + {% include 'ipsc_target.html' %} + + + + +
    + + {% if i==0 %} +
    punkt ZERO (El Presidente)
    + {% else %} +
    {{ i * gap|round(1,'ceil') }}cm od punktu ZERO (El Presidente)
    + {% endif %} +
    +
    +
    + {% endfor %} + + + \ No newline at end of file diff --git a/templates/pdf_template_shootoff.html b/templates/pdf_template_shootoff.html new file mode 100644 index 0000000..e343de8 --- /dev/null +++ b/templates/pdf_template_shootoff.html @@ -0,0 +1,172 @@ + + + + + + + Paper Challenge - Shootoff - {{ distance }} cm + - {{ size|capitalize }} + + + + +
    +

    Paper Challenge

    +

    Shootoff

    + +
    + {% for i in range(target_count) %} + {% if i == target_count-1 %} +
    +
    + +
    +
    + {% else %} +
    +
    + +
    +
    + {% endif %} + {% endfor %} +
    + +

    Wymagana długość ściany: {{ wall_length|round(1,'ceil') }}cm

    +

    Odległość od ściany: {{ distance|round(1,'ceil') }}cm

    +

    Przygotowanie toru:

    +
      +
    • Umieść z lewej lub prawej strony ściany pierwszy cel ze znacznikiem "punkt ZERO"
    • +
    • Wyznacz pole startowe {{ box_position|round(1,'ceil') }}cm od punktu "zero" (wzdłuż ściany) oraz w odległości {{distance}}cm od ściany
    • +
    • Upewnij się, że pole startowe znjaduje się w dogodnym miejscu, pomieszczenia, tak aby nic nie + przeszkazdało + w swobodnym dobyciu i składaniu do celów na całej szerokości ściany +
    • +
    • W razie potrzeby dostosuj pierwszy cel wraz z punktem ZERO i powtórz dwa powyższe kroki
    • +
    • Umieść na ścianie pozostałe cele zgodnie z odległościami podanymi na znacznikach pozycji na dole każdego + celu. Upewnij się, że wszystkie cele są umieszczone w jednej linii równoległej do podłoża
    • +
    + +
    + {% for i in range(target_count) %} +
    +
    + {% if i == target_count-1 %} + +
    +
    + +
    +
    + {% else %} +
    +
    + +
    +
    + + {% endif %} + {% if i==0 %} +
    punkt ZERO (Shootoff)
    + {% else %} +
    {{ i * gap|round(1,'ceil') }}cm od punktu ZERO (Shootoff)
    + {% endif %} +
    +
    +
    + {% endfor %} + + + + \ No newline at end of file diff --git a/templates/sc.html b/templates/sc.html new file mode 100644 index 0000000..8a036f7 --- /dev/null +++ b/templates/sc.html @@ -0,0 +1,79 @@ +{% extends "base.html" %} + +{% block title %}Steel Challenge{% endblock %} +{% block content %} +
    + {% include 'setup.html' %} + +
    +

    Tor

    +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    + +
    +
    +{% endblock %} diff --git a/templates/setup.html b/templates/setup.html new file mode 100644 index 0000000..f2d74eb --- /dev/null +++ b/templates/setup.html @@ -0,0 +1,40 @@ +
    +

    Wybierz rodzaj kalkulacji ze względu na ograniczoną długość ściany lub ograniczoną odległość stanowiska od ściany

    +
    + + + + +
    +
    +

    dystans [cm]

    + +
    +
    +
    +

    Format druku

    +
    + + +
    +
    \ No newline at end of file diff --git a/templates/shootoff.html b/templates/shootoff.html new file mode 100644 index 0000000..b20e06a --- /dev/null +++ b/templates/shootoff.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{% block title %}Shootoff{% endblock %} +{% block content %} +
    + {% include 'setup.html' %} + +
    +

    Shootoff

    + +
    + Shootoff +
    +
    + +
    + +
    +
    +{% endblock %}