diff --git a/Makefile b/Makefile index 222f524..273a77e 100644 --- a/Makefile +++ b/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 \ No newline at end of file + 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 diff --git a/source/010_documentation.md b/source/010_documentation.md index e48b2b4..9dc76e9 100644 --- a/source/010_documentation.md +++ b/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. +
+ ```{image} img/codification_nomenclature.jpg :alt: Codification nomenclature :align: center diff --git a/source/040_assemblage_chassis.md b/source/040_assemblage_chassis.md index f7cd789..a40476f 100644 --- a/source/040_assemblage_chassis.md +++ b/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 + + - 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 + + :::{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. + + ### É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. + + :::{note} Les chanfreins des tubes M02 sont à placer à l'extérieur, ils servent à éviter d'abîmer le textile qui viendra dessus. ::: + + ### É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. + + ### É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. ::: + + @@ -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. ::: - - + + ### É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. + + 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. + + :::{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. ::: + + ### É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) + + :::{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 + + Certains tubes sont masqués pour une meilleure lisibilité + + ### Fixer CHO45 et T16 + + ![Etape 1 assemblage direction](img/direction/Etape002_Page.svg) ### Placer CHO44 sur son axe de rotation diff --git a/source/050_montage_pieces_cycles.md b/source/050_montage_pieces_cycles.md index c1aa58e..950c855 100644 --- a/source/050_montage_pieces_cycles.md +++ b/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. + + ```{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 + + ```{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 + + ```{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 + + :::{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. ::: + + #### Étape 1 : pose du pignon + + + 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) + ```{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 : + + ```{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 + + ```{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 + + ```{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 + + ```{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) + + @@ -332,8 +358,12 @@ La longueur totale de la chaine doit faire 378cm. ### Tendeur de chaîne + + 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. + + ![Tendeur de chaine](img/tendeur_chaine.svg) L’ensemble tendeur de chaîne est composé de : diff --git a/source/080_installation_electricite.md b/source/080_installation_electricite.md index f17c54d..5f24466 100644 --- a/source/080_installation_electricite.md +++ b/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é. + + ### Etape 2 + Installer le rail de la batterie. Il est nécessaire de la couper à une longueur de 21,5cm. + + ### 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). + + ### Etape 4 + Proteger la connectique de la batterie de l'humidité et des vibrations en ajoutant du silicone dessus. + + ### Etape 5 + Placer le support batterie sur le Vhelio avec 5 vis M6x35. - \ No newline at end of file + + + diff --git a/source/100_sieges.md b/source/100_sieges.md index fe31188..8769fc2 100644 --- a/source/100_sieges.md +++ b/source/100_sieges.md @@ -102,11 +102,15 @@ Il est plus simple de serrer d’abord les cales. Avec un tournevis plat (fin). + + :::{admonition} Attention :class: warning Attention au filetage, si ça force essayer sur un autre trou. ::: + + ![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) + ## Sécurité diff --git a/source/css/print-theme.css b/source/css/print-theme.css index a635123..8e91e72 100644 --- a/source/css/print-theme.css +++ b/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 { diff --git a/sphinx-tools/count_pdf_pages.py b/sphinx-tools/count_pdf_pages.py new file mode 100644 index 0000000..bc55c90 --- /dev/null +++ b/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) diff --git a/sphinx-tools/update_pdf_bookmarks.py b/sphinx-tools/update_pdf_bookmarks.py new file mode 100644 index 0000000..3465a3a --- /dev/null +++ b/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])