Amélioration de la génération du PDF #28

Merged
youen merged 3 commits from youen/vheliotech-guide-de-montage:main into main 1 year ago
  1. 10
      Makefile
  2. 2
      source/010_documentation.md
  3. 32
      source/040_assemblage_chassis.md
  4. 34
      source/050_montage_pieces_cycles.md
  5. 19
      source/080_installation_electricite.md
  6. 6
      source/100_sieges.md
  7. 59
      source/css/print-theme.css
  8. 24
      sphinx-tools/count_pdf_pages.py
  9. 28
      sphinx-tools/update_pdf_bookmarks.py

10
Makefile

@ -20,13 +20,19 @@ help:
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
# Default make weasyprint target has a bug so we have to call it manually on the generated index.html file
# Then we execute count_pdf_pages.py that will count the number of pages, and update print-theme.css
# Then we generate index.pdf again (with the correct number of pages in the footer)
# After that, extract table of content data from the pdf and generate a .tex file
# Then generate a toc.pdf from the .tex file
# And put them together in a .pdf file
# Finally, we generate the final PDF by adding the bookmarks (for easier navigation in the PDF)
# After all, clean up
pdf: weasyprint
weasyprint build/weasyprint/index.html build/weasyprint/index.pdf -s source/css/print-theme.css
python3 sphinx-tools/count_pdf_pages.py
weasyprint build/weasyprint/index.html build/weasyprint/index.pdf -s source/css/print-theme.css
./pdftoc-to-latex build/weasyprint/index.pdf > build/weasyprint/toc.tex
- pdflatex -interaction nonstopmode -output-directory=build/weasyprint build/weasyprint/toc.tex
pdftk A=build/weasyprint/index.pdf B=build/weasyprint/toc.pdf cat A1 B A2-end output build/weasyprint/vheliotech.pdf
rm build/weasyprint/index.pdf build/weasyprint/toc.tex build/weasyprint/toc.pdf build/weasyprint/GuidedemontageVheliotech.pdf
pdftk A=build/weasyprint/index.pdf B=build/weasyprint/toc.pdf cat A1 B A2-end output build/weasyprint/vheliotech-without-bookmarks.pdf
python3 sphinx-tools/update_pdf_bookmarks.py build/weasyprint/index.pdf build/weasyprint/vheliotech-without-bookmarks.pdf build/weasyprint/vheliotech.pdf
#rm build/weasyprint/index.pdf build/weasyprint/toc.tex build/weasyprint/toc.pdf build/weasyprint/GuidedemontageVheliotech.pdf

2
source/010_documentation.md

@ -20,6 +20,8 @@ Nous avons utilisé [la version "link branch" de FreeCAD](https://github.com/rea
La nomenclature rassemble des informations sur toutes les pièces du vhéliotech : le code de la pièce, son nom, des liens vers des fournisseurs, etc. Les codes indiqués dans le présent guide de montage font référence à la nomenclature.
<div class="avoid-break"></div>
```{image} img/codification_nomenclature.jpg
:alt: Codification nomenclature
:align: center

32
source/040_assemblage_chassis.md

@ -53,6 +53,8 @@ Pour simplifier l’assemblage, des standards d’assemblage ont été définis
## Assemblage de 3 tubes
<div class="avoid-break-next-block"></div>
- Vis M6 90 mm (QIN90)
- Rondelle M6 (QIN12) pour la tête de vis et l'écrou M6 lorsqu'ils sont contre un tube aluminium.
@ -67,6 +69,8 @@ Pour simplifier l’assemblage, des standards d’assemblage ont été définis
<img class="resized" src="img/assemblage/dessins_assemblage_tubes-Etape001.svg" alt="Vue de l'étape 1">
<div class="avoid-break"></div>
:::{note}
L00 est un tube non symétrique. Deux perçages sont désaxés : ces deux perçages sont sur la moitié supérieure.
:::
@ -79,6 +83,8 @@ L00 est un tube non symétrique. Deux perçages sont désaxés : ces deux perça
À partir de cette étape, vous pouvez surélever le châssis en le posant sur des caisses, pour travailler plus confortablement.
<div class="avoid-break"></div>
<img src="img/assemblage/dessins_assemblage_tubes-Etape003.svg" alt="Vue de l'étape 3">
### Étape 4
@ -86,16 +92,22 @@ L00 est un tube non symétrique. Deux perçages sont désaxés : ces deux perça
L'équerre CHO17 est plaqué contre les tubes M02, il y a deux rondelles CHO51 entre CHO17 et L00 et L01.
Vous pouvez scotcher (scotch papier) les rondelles sur CHO17 pour plus de faciliter de montage.
<div class="avoid-break"></div>
:::{note}
Les chanfreins des tubes M02 sont à placer à l'extérieur, ils servent à éviter d'abîmer le textile qui viendra dessus.
:::
<div class="avoid-break"></div>
<img src="img/assemblage/dessins_assemblage_tubes-Etape004.svg" alt="Vue de l'étape 4">
### Étape 5
Les chanfreins des tubes M03 et M04 sont à placer à l'extérieur, ils servent à éviter d'abîmer le textile qui viendra dessus.
<div class="avoid-break"></div>
<img class="resized" src="img/assemblage/dessins_assemblage_tubes-Etape005.svg" alt="Vue de l'étape 5">
### Étape 6
@ -136,6 +148,8 @@ Les chanfreins des tubes M03 et M04 sont à placer à l'extérieur, ils servent
Il sera nécessaire de démonter les quatres boulons horizontaux M6x40 au moment de la fixation des gardes boues avant.
:::
<div class="avoid-break"></div>
<img class="resized" src="img/assemblage/dessins_assemblage_tubes-Etape014.svg" alt="Vue de l'étape 14">
@ -149,21 +163,27 @@ Il sera nécessaire de démonter les quatres boulons horizontaux M6x40 au moment
Il sera nécessaire de démonter les quatres boulons M6x60 (fixé sur L09) au moment de la fixation des gardes boues avant.
:::
<img class="resized" src="img/assemblage/dessins_assemblage_tubes-Etape016.svg" alt="Vue de l'étape 16">
<div class="avoid-break"></div>
<img class="resized" src="img/assemblage/dessins_assemblage_tubes-Etape016.svg" alt="Vue de l'étape 16">
### Étape 17
Si vous aviez surélevé le châssis, vous pouvez maintenant le redescendre au niveau du sol pour faciliter l’installation du toit.
<div class="avoid-break"></div>
L'équerre CHO5x a un côté arrondi et un côté droit.
Le côté arrondi suit le cintrage de CHO35. Le côté droit est en bas, contre L09.
<div class="avoid-break"></div>
:::{important}
Les arceaux CHO35 sont actuellement livrés non découpés et non percés. Il vous faudra alors les découper à la scie à méteaux (ou mieux scie à onglet) et percer les trous pour les équerres et les platines (configuration "intégrale" uniquement) vous même.
:::
<div class="avoid-break"></div>
<img src="img/assemblage/dessins_assemblage_tubes-Etape017.svg" alt="Vue de l'étape 17">
### Étape 18
@ -186,6 +206,8 @@ Les arceaux CHO35 sont actuellement livrés non découpés et non percés. Il vo
![Vue de l'étape 22](img/assemblage/dessins_assemblage_tubes-Etape022.svg)
<div class="avoid-break"></div>
:::{note}
L07 est un tube non symétrique. Des perçages sont désaxés : il faut les placer vers l'intérieur.
:::
@ -196,10 +218,16 @@ L07 est un tube non symétrique. Des perçages sont désaxés : il faut les plac
## Montage de la direction
<div class="avoid-break"></div>
Certains tubes sont masqués pour une meilleure lisibilité
<div class="avoid-break"></div>
### Fixer CHO45 et T16
<div class="avoid-break"></div>
![Etape 1 assemblage direction](img/direction/Etape002_Page.svg)
### Placer CHO44 sur son axe de rotation

34
source/050_montage_pieces_cycles.md

@ -42,12 +42,16 @@ Initialement nous avons retenu et testé deux options différentes, mais finalem
Remarque : Lors de la manipulation du disque et des plaquettes, assurez-vous de ne pas les salir avec de la matière grasse (graisse, huile, mains sales, etc.).
#### Étape 1
Prépositionnez le disque de frein sur l’adaptateur et sur la roue en veillant au sens de rotation indiqué sur le disque.
#### Étape 2
Monter le disque (FRN03) sur l’adaptateur centerlock (ROU17) avec les vis fournies avec l’adaptateur centerlock (têtes plates) (voir [tutoriel d'installation d'un disque 6 vis classique](https://www.youtube.com/watch?v=sYLZjIjCx28))
Serrer les vis dans l’ordre suivant : la 1re vis, puis la vis opposée (pas celles à côté) ; procéder en étoile et pas en cercle.
<div class="avoid-break"></div>
```{image} img/vis_disque.jpg
:alt: Photo de la vis pour le disque de frein
:width: 200px
@ -57,6 +61,8 @@ Serrer les vis dans l’ordre suivant : la 1re vis, puis la vis opposée (pas ce
Poser la rondelle fournie avec l’adaptateur centerlock
<div class="avoid-break"></div>
```{image} img/center_lock_disque.jpg
:alt: Photo de l'adaptateur center lock mis sur le disque
:width: 200px
@ -66,6 +72,8 @@ Poser la rondelle fournie avec l’adaptateur centerlock
Emboiter l’ensemble (adaptateur/disque) sur le moyeu
<div class="avoid-break"></div>
```{image} img/center_lock_moyeu.jpg
:alt: Photo de l'adaptateur center lock monté sur le moyeu
:width: 200px
@ -92,23 +100,33 @@ Veillez à ce que le disque ne rentre pas en contact avec le mur lorsque vous en
### Montage du pignon
<div class="avoid-break"></div>
:::{note}
Un très [bon tutoriel fait par lecycle.com](https://www.youtube.com/watch?v=Kl7ar8FWoYU) montre de manière détaillée l'assemblage d'un Nexus 8 sur un vélo classique. Il peut être complémentaire au présent guide, mais ne le remplace pas. Le vhélio comportant des particularités non traitées dans la vidéo.
:::
<div class="avoid-break"></div>
#### Étape 1 : pose du pignon
<div class="avoid-break"></div>
Poser le pignon fourni avec la roue, qui est bombé d'un côté, de telle sorte que les dents soient plus proche des rayons de la roue (éloignant ainsi la chaine de la patte pour l’arrivée du câble de vitesse)
<div class="avoid-break"></div>
```{image} img/pignon_nexus_8.jpg
:alt: Pignon sur le moyeu Nexus 8
:width: 200px
```
#### Étape 2 : pose du clip
Poser le clip en 3 étapes :
<div class="avoid-break"></div>
```{image} img/clip_nexus_8.jpg
:alt: Clip Nexus 8
:width: 200px
@ -134,12 +152,14 @@ Finir de faire levier avec le petit tournevis plat pour emmener le reste du clip
:width: 200px
```
:::{note}
Il est impossible d’engager les deux extrémités du clip en même temps.
:::
#### Étape 3 : rondelle de cache
<div class="avoid-break"></div>
```{image} img/rondelle_cache_nexus_8.jpg
:alt: Rondelle cache Nexus 8
:width: 200px
@ -149,6 +169,8 @@ Il est impossible d’engager les deux extrémités du clip en même temps.
Mettre l’ensemble rondelle + patte pour le câble de changement de vitesse en alignant les 3 points rouges
<div class="avoid-break"></div>
```{image} img/pose_pate_nexus_8.jpg
:alt: Pose pate Nexus 8
:width: 200px
@ -158,6 +180,8 @@ Mettre l’ensemble rondelle + patte pour le câble de changement de vitesse en
Mettre la bague en alignant les deux points jaunes et tourner la bague dans le sens des aiguilles d’une montre
<div class="avoid-break"></div>
```{image} img/pose_bague_nexus_8.jpg
:alt: Pose bague Nexus 8
:width: 200px
@ -167,6 +191,8 @@ Mettre la bague en alignant les deux points jaunes et tourner la bague dans le s
Mettre les rondelles avec téton (noir et grise) et les deux écrous borgnes (pour ne pas les perdre)
<div class="avoid-break"></div>
<img src="img/pignon_nexus_8_monte_face.jpg" alt="Pignon Nexus 8 monté vue de face" width="200px">
<img src="img/pignon_nexus_8_monte_haut.jpg" alt="Pignon Nexus 8 monté vue de haut" width="200px">
@ -332,8 +358,12 @@ La longueur totale de la chaine doit faire 378cm.
### Tendeur de chaîne
<div class="avoid-break"></div>
Le tendeur de chaîne permet d’ajuster la tension de la chaîne, et d’éviter ainsi de dérailler ou d’abîmer la transmission.
<div class="avoid-break"></div>
![Tendeur de chaine](img/tendeur_chaine.svg)
L’ensemble tendeur de chaîne est composé de :

19
source/080_installation_electricite.md

@ -77,30 +77,45 @@ Les prises USB s’alimentent en 12V ; elles sont équipées à l’intérieur
Le support batterie CHO24 est prévu pour recevoir deux batteries 36V 14,5 Ah (ELE04) avec un boitier "silverfish". D'autres types de boitier de batterie peuvent convenir cependant les fixations ne seront peut-être pas adaptés.
### Etape 1
### Etape 1
Installer le connecteur de la batterie avec 4 vis M4 tête fraisé.
<div class="avoid-break"></div>
<img src="img/installation_electrique/Ordre_fix_prise_bat.jpg" alt="ordre de fixation des connecteurs" width="200px">
<img src="img/installation_electrique/connecteur_batterie_2.jpg" alt="Connecteur fixé sur CHO24" width="200px">
### Etape 2
Installer le rail de la batterie. Il est nécessaire de la couper à une longueur de 21,5cm.
<div class="avoid-break"></div>
<img src="img/installation_electrique/rail_batterie.jpg" alt="Rail batterie" width="200px">
### Etape 3
Installer un écrou M6x8 qui servira d'antivol.
La tête de l'écrou servira de buté empêchant la batterie de sortir du rail lorsque la clef sera en position LOCK (off et on).
<div class="avoid-break"></div>
<img src="img/installation_electrique/antivol_batterie_2.jpg" alt="antivol batterie sur le rail" width="200px">
<img src="img/installation_electrique/antivol_batterie.jpg" alt="antivol batterie" width="200px">
### Etape 4
Proteger la connectique de la batterie de l'humidité et des vibrations en ajoutant du silicone dessus.
<div class="avoid-break"></div>
<img src="img/installation_electrique/silicone_fiche_batterie.jpg" alt="silicone sur fiche batterie" width="200px">
### Etape 5
Placer le support batterie sur le Vhelio avec 5 vis M6x35.
<img src="img/installation_electrique/Batterie_sur_support.jpg" alt="Support Batterie installer sur le vhelio." width="400px">
<div class="avoid-break"></div>
<img src="img/installation_electrique/Batterie_sur_support.jpg" alt="Support Batterie installer sur le vhelio." width="400px">

6
source/100_sieges.md

@ -102,11 +102,15 @@ Il est plus simple de serrer d’abord les cales.
Avec un tournevis plat (fin).
<div class="avoid-break"></div>
:::{admonition} Attention
:class: warning
Attention au filetage, si ça force essayer sur un autre trou.
:::
<div class="avoid-break"></div>
![Photo des galets vissés sur l'embase](img/galets_siege.jpg)
### Réglage des glissières
@ -136,7 +140,7 @@ Attention à la subtilité en haut du dossier (évite que la toile de dossier gl
Les patrons de chaque toile sont fournis dans le dossier « Plans par article – Pour fabrication/Plans par article - Textiles ». La réalisation des toiles est d’une technicité simple concernant la couture. Seule particularité : les œillets doivent être bien posés (une machine professionnelle est préférable) pour êtres résistants.
![Photo d'un siège démonté de dos](img/photo_siege_dos.jpg)
<img src="img/photo_siege_dos.jpg" alt="Photo d'un siège démonté de dos" width="300px">
## Sécurité

59
source/css/print-theme.css

@ -14,7 +14,7 @@
font-family: Lato, proxima-nova, Helvetica Neue, Arial, sans-serif;
}
@bottom-right {
content: counter(page) "/81";
content: counter(page) "/82"; /* total number of pages is automatically updated by count_pdf_pages.py */
font-size: 9px;
font-family: Lato, proxima-nova, Helvetica Neue, Arial, sans-serif;
}
@ -39,60 +39,17 @@ h2 {
break-before: always;
}
#montage-de-la-direction {
break-before: always;
}
#assemblage-de-la-structure-en-tubes {
break-before: always;
}
#etape-3 {
break-before: always;
}
#etape-4 {
break-before: always;
}
#etape-5 {
break-before: always;
}
#etape-7 {
break-before: always;
}
#etape-9 {
break-before: always;
}
#etape-11 {
break-before: always;
}
#etape-13 {
break-before: always;
}
#etape-15 {
break-before: always;
.avoid-break {
break-before: avoid;
break-after: avoid;
}
#etape-17 {
break-before: always;
}
#etape-18 {
break-before: always;
.avoid-break-next-block + ul {
break-inside: avoid;
}
#etape-20 {
break-before: always;
}
a[href^="#montage-de-la-direction"] {
break-before: always;
.admonition {
break-inside: avoid;
}
.resized {

24
sphinx-tools/count_pdf_pages.py

@ -0,0 +1,24 @@
import subprocess
import re
pdf_filename = 'build/weasyprint/index.pdf'
css_filename = 'source/css/print-theme.css'
additional_pages = 2
# count pages in index.pdf
pdfinfo = subprocess.run(['pdfinfo', pdf_filename], stdout=subprocess.PIPE)
pages_match = re.search('\\nPages:\s+([0-9]+)\\n', pdfinfo.stdout.decode())
num_pages = int(pages_match.group(1))
print('index.pdf: ' + str(num_pages) + ' pages')
num_pages = num_pages + additional_pages # account for table of content that will be added later
# update the CSS file with the correct number of pages
with open(css_filename) as css_file:
css = css_file.read()
css = re.sub('content: counter\(page\) "/[0-9]+";', 'content: counter(page) "/'+str(num_pages)+'";', css)
with open(css_filename, 'w') as css_file:
css_file.write(css)

28
sphinx-tools/update_pdf_bookmarks.py

@ -0,0 +1,28 @@
import sys
import subprocess
import re
extract_bookmarks_from = sys.argv[1]
source_pdf_filename = sys.argv[2]
output_filename = sys.argv[3]
bookmarks_filename = extract_bookmarks_from.replace('.pdf', '.txt')
assert(bookmarks_filename != extract_bookmarks_from)
# extract PDF metadata into a text file
subprocess.run(['pdftk', extract_bookmarks_from, 'dump_data', 'output', bookmarks_filename])
with open(bookmarks_filename) as bookmarks_file:
metadata = bookmarks_file.read()
# Offset page numbers
def replaceBookmarkPageNumber(match):
initial_page = int(match.group(1))
return 'BookmarkPageNumber: ' + str(initial_page + 2)
metadata = re.sub('BookmarkPageNumber:\s+([0-9]+)', replaceBookmarkPageNumber, metadata)
with open(bookmarks_filename, 'w') as bookmarks_file:
bookmarks_file.write(metadata)
# generate the output PDF
subprocess.run(['pdftk', source_pdf_filename, 'update_info', bookmarks_filename, 'output', output_filename])
Loading…
Cancel
Save