IEEE.org     |     IEEE Xplore Digital Library     |     IEEE Standards     |     IEEE Spectrum     |     More Sites

Commit 14302765 authored by Julian Stirling's avatar Julian Stirling
Browse files

Merge branch 'will-this-work' into 'master'

Brief overview of DocuBricks and Buildup, further detail on the BuildUp hierarchy

See merge request !1
parents 320c9b54 f77de17b
# Convergence of BuildUp and DocuBricks
## Structure
### DocuBricks
[Docubricks]{https://docubricks.com/} is a documentation platform, where the files are written wit an offline editor. The DocuBricks documentation is stored in a single XML file which contains 3 types of top-level elements:
* Authors - Exactly as expected
* Parts - This is a simple part that bought or made
* Bricks - These are more complex assemblies built out of parts or other bricks. They have assigned authors and step-by-step assembly instructions.
### BuildUp
BuildUp is the format used by the software [GitBuilding]{https://gitbuilding.io}. BuildUp documentation is stored in a directory. The documentation contains 3 types of files (plus any images/CAD drawings/etc):
* A Configuration file - This is a YAML file that defines things like the authors. It can also be used to customise the exported documentation
* Part libraries - These are YAML files that define simple parts that can be bought/made
* BuildUp Pages - These are pages are in "BuildUp markdown" this is a modified markdown with extra meta data. A page can contain any information that is seen as necessary. The page be used to describe a part that is hard to explain using a part library, it can describe a process, a step in the instructions, or any other information.
## Similarities and differences
While the XML data schema for DocuBricks Authors and Parts are slightly different to the YAML schema used in BuildUp this could easily be aligned. It is worth noting that authors are global for BuildUp but can be defined on a per Brick basis in DocuBricks, giving DocuBricks more fine grained authorship data.
Both formats are designed to be hierarchical with the key hierarchical elements in the hierarchy being Bricks for DocuBricks, and BuildUp pages for BuildUp
There are key differences between Bricks and BuildUp pages. Bricks have describe a assembled hardware part, it has elements such as assembly steps, or required components, these components can be bricks, this is how the hierarchy is defined. BuildUp pages are free-form and can be used to describe anything from extra information, to processes, to steps in an instruction. The hierarchy is defined by metadata in hyperlinks between pages.
## BuildUp documentation structure in detail
A BuildUp is an extension of markdown. Markdown is commonly used for writing generic static websites using site generators such as [Jekyll](https://jekyllrb.com/) or [MKDocs](https://www.mkdocs.org/). BuildUp then adds extra metadata links to allow part and tool usage to be automatically counted, and to define the page hierarchy. By never defining any BuildUp metadata in the pages, BuildUp can still be used to make a simple generic website. This freedom means that if a project has unique needs it should be able to manually document them.
### Link types
Metadata can be added to hyperlinks to:
* Define another step that must be completed - these define the hierarchy
* To define a part that needs to be counted
* An "output", something made on this page
An graphical example (some syntax is omitted for brevity) is:
![](diagrams/Steps.png)
### Automatic Bill of Materials
A key benefit of this is that you don't need explicitly define your bill of materials, you just need to indicate when a part is used. When that instruction is modified so is the bill of materials. Parts can be divided into different categories. By default the categories are "Parts" and "Tools", where parts are counted but tools are re-used (custom parts can be defined in the configuration). As shown in the following screenshot:
![](diagrams/Categories.png)
### Complex and forked hierarchies
By using the links to define which pages are a part and which is a step can allow a project to treat another piece of open hardware as a simple component, while still including the instructions to build this part. It also handles complex situations such as self-replicating hardware like the RepRap when the part being made is also a required part.
![](diagrams/Recursive.png)
The structure should handle variations on a similar design. Many of the same input pages can be used, but separate versions of these pages will be created that refer to the correct steps and outputs.
![](diagrams/Variations.png)
In practice some of the syntax described above cannot be processed until [v0.7](https://gitlab.com/groups/gitbuilding/-/milestones/3) of GitBuilding is released (hopefully in August).
### Extensible: Future direction
Adding extra link types adds complexity but provides a way to define extra metadata directly in the text. We have plans to define links for quality control/assurance procedures, so that procedures can be reused and so that assembly checklists can automatically be generated.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
sodipodi:docname="Recursive.svg"
id="svg8"
version="1.1"
viewBox="0 0 692.65515 455.64085"
height="455.64084mm"
width="692.65515mm">
<sodipodi:namedview
inkscape:document-rotation="0"
inkscape:current-layer="svg8"
inkscape:window-maximized="1"
inkscape:window-y="0"
inkscape:window-x="0"
inkscape:cy="758.0685"
inkscape:cx="1057.1918"
inkscape:zoom="0.30831309"
showgrid="false"
id="namedview137"
inkscape:window-height="827"
inkscape:window-width="1600"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff"
fit-margin-top="10"
fit-margin-left="10"
fit-margin-right="10"
fit-margin-bottom="10" />
<defs
id="defs2">
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0.0"
refX="0.0"
id="marker1336"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path1088"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#010000;stroke-width:1pt;stroke-opacity:1;fill:#010000;fill-opacity:1"
transform="scale(0.2) rotate(180) translate(6,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0.0"
refX="0.0"
id="marker2124"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path1876"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000025;stroke-width:1pt;stroke-opacity:1;fill:#000025;fill-opacity:1"
transform="scale(0.2) rotate(180) translate(6,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Sstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Sstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1694"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#ff0c80;fill-opacity:1;fill-rule:evenodd;stroke:#ff0c80;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(0.2,0,0,0.2,1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="marker1945"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path1697"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#ff0c80;fill-opacity:1;fill-rule:evenodd;stroke:#ff0c80;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-3"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-6"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-1"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-5"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-1-4"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-5-7"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-1-4-5"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-5-7-6"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-1-4-5-3"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-5-7-6-7"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-1-4-5-5"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-5-7-6-2"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-8"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-68"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-8-4"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-68-3"
inkscape:connector-curvature="0" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-8-4-4"
refX="0"
refY="0"
orient="auto">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-68-3-5" />
</marker>
<marker
inkscape:stockid="Arrow1Sstart"
orient="auto"
refY="0"
refX="0"
id="Arrow1Sstart-6"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path1694-1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#ff0c80;fill-opacity:1;fill-rule:evenodd;stroke:#ff0c80;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(0.2,0,0,0.2,1.2,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Send"
orient="auto"
refY="0"
refX="0"
id="marker1945-5"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path1697-5"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
style="fill:#ff0c80;fill-opacity:1;fill-rule:evenodd;stroke:#ff0c80;stroke-width:1.00000003pt;stroke-opacity:1"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-8-4-4-2"
refX="0"
refY="0"
orient="auto">
<path
inkscape:connector-curvature="0"
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#0000ff;fill-opacity:1;fill-rule:evenodd;stroke:#0000ff;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-68-3-5-9" />
</marker>
<marker
style="overflow:visible"
id="Arrow1Send-8-2"
refX="0"
refY="0"
orient="auto">
<path
transform="matrix(-0.2,0,0,-0.2,-1.2,0)"
style="fill:#ff0000;fill-opacity:1;fill-rule:evenodd;stroke:#ff0000;stroke-width:1.00000003pt;stroke-opacity:1"
d="M 0,0 5,-5 -12.5,0 5,5 Z"
id="path870-68-7"
inkscape:connector-curvature="0" />
</marker>
</defs>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="286.40887"
y="61.901962"
id="text855"><tspan
x="286.40887"
y="68.144478"
style="font-size:8.81943989px;stroke-width:0.26458299px"
id="tspan871" /></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect815"
width="123.85373"
height="156.48215"
x="266.75418"
y="19.266232" />
<text
id="text1158"
y="57.596748"
x="269.77783"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:0;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
id="tspan430"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.17222023px;line-height:100%;font-family:monospace;-inkscape-font-specification:monospace;stroke-width:0.26458299px"
y="59.542351"
x="269.77783"
sodipodi:role="line" /></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect815-2"
width="121.70833"
height="156.48215"
x="116.31966"
y="149.06091" />
<text
id="text1304"
y="171.96999"
x="121.61119"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.17222023px;font-family:monospace;-inkscape-font-specification:monospace;stroke-width:0.26458299px"
y="178.3253"
x="121.61119"
sodipodi:role="line"
id="tspan3893" /></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect815-37"
width="121.70833"
height="156.48215"
x="417.18869"
y="149.06091" />
<text
id="text1342"
y="171.96999"
x="422.66019"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:9.17222023px;stroke-width:0.26458299px"
id="tspan1340"
y="178.3253"
x="422.66019"
sodipodi:role="line" /></text>
<text
id="text1208"
y="29.788502"
x="395.89758"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#168500;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
id="tspan1180"
y="29.788502"
x="395.89758"
sodipodi:role="line"><tspan
id="tspan1176"
style="font-size:9.17222214px;text-align:start;text-anchor:start;fill:#168500;fill-opacity:1;stroke-width:0.26458299px"
y="29.788502"
x="395.89758"
dx="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0">Bill of materials:</tspan></tspan><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
id="tspan1184"
y="38.607952"
x="395.89758"
sodipodi:role="line" /><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
id="tspan1206"
y="48.011082"
x="395.89758"
sodipodi:role="line">1 x RepRap</tspan><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
y="57.414211"
x="395.89758"
sodipodi:role="line"
id="tspan256">200g of PLA</tspan><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
y="66.817337"
x="395.89758"
sodipodi:role="line"
id="tspan1313">Some other parts</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:3.7650001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send)"
d="M 278.44299,112.62259 205.2663,145.84954"
id="path853"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
sodipodi:nodetypes="cc"
style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:3.7650001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-3)"
d="m 370.49073,125.98891 57.03929,18.53564"
id="path853-7"
inkscape:connector-curvature="0" />
<text
id="text1254"
y="155.56596"
x="542.72644"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#168500;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:9.17222691px;stroke-width:0.26458299px"
id="tspan1252"
y="155.56596"
x="542.72644"
sodipodi:role="line">Bill of materials:</tspan><tspan
style="font-size:9.17222691px;stroke-width:0.26458299px"
y="164.38541"
x="542.72644"
sodipodi:role="line"
id="tspan3050" /><tspan
style="font-size:9.17222691px;stroke-width:0.26458299px"
y="173.78854"
x="542.72644"
sodipodi:role="line"
id="tspan3056">Lots of plastic parts</tspan><tspan
style="font-size:9.17222691px;stroke-width:0.26458299px"
y="183.19168"
x="542.72644"
sodipodi:role="line"
id="tspan1290">Some other parts</tspan></text>
<text
id="text1232"
y="155.4951"
x="27.395203"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#168500;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
id="tspan1214"
y="155.4951"
x="27.395203"
sodipodi:role="line"><tspan
id="tspan1210"
style="font-size:9.17222214px;text-align:start;text-anchor:start;fill:#168500;fill-opacity:1;stroke-width:0.26458299px"
y="155.4951"
x="27.395203"
dx="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0">Bill of materials:</tspan></tspan><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
id="tspan1218"
y="164.31454"
x="27.395203"
sodipodi:role="line" /><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
id="tspan1230"
y="173.71768"
x="27.395203"
sodipodi:role="line">1 x RepRap</tspan><tspan
style="font-size:9.17222214px;stroke-width:0.26458299px"
y="183.1208"
x="27.395203"
sodipodi:role="line"
id="tspan254">200g of PLA</tspan></text>
<rect
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect815-2-6"
width="121.70833"
height="156.48215"
x="492.40591"
y="288.15869" />
<text
id="text1376"
y="311.06836"
x="497.69745"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:9.17222023px;stroke-width:0.26458299px"
id="tspan1348"
y="311.06836"
x="497.69745"
sodipodi:role="line"><tspan
id="tspan1344"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:9.17222023px;font-family:monospace;-inkscape-font-specification:monospace;text-align:start;text-anchor:start;stroke-width:0.26458299px"
y="311.06836"
x="497.69745"># Other parts</tspan></tspan><tspan
id="tspan1352"
y="319.88782"
x="497.69745"
sodipodi:role="line" /><tspan
style="font-size:9.17222023px;stroke-width:0.26458299px"
id="tspan1374"
y="329.29092"
x="497.69745"
sodipodi:role="line">All the other things!</tspan></text>
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.7650001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-1)"
d="M 116.03589,216.20488 70.229315,288.36445"
id="path853-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.7650001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-1-4-5-3)"
d="m 511.34094,220.4156 39.40134,63.72656"
id="path853-5-6-9-4"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<g
id="g1680"
transform="translate(-13.278155,3.1442072)">
<path
inkscape:connector-curvature="0"
id="path853-8"
d="M 30,19.451918 H 72.33333"
style="fill:none;fill-rule:evenodd;stroke:#ff0000;stroke-width:3.7650001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-8)" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:7.05556011px;line-height:125%;font-family:sans-serif;-inkscape-font-specification:sans-serif;text-align:justify;letter-spacing:0px;word-spacing:0px;text-anchor:start;fill:#f80000;fill-opacity:1;stroke:none;stroke-width:0.26458299px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="83.156494"
y="13.502069"
id="text1070"><tspan
sodipodi:role="line"
x="83.156494"
y="13.502069"
id="tspan1058"
style="stroke-width:0.26458299px"><tspan
x="83.156494"
y="13.502069"
style="font-size:9.17222023px;text-align:start;text-anchor:start;fill:#f80000;fill-opacity:1;stroke-width:0.26458299px"
id="tspan1056">Step link: Full bill of </tspan></tspan><tspan
sodipodi:role="line"
x="83.156494"
y="22.871346"
id="tspan1062"
style="stroke-width:0.26458299px"><tspan
x="83.156494"
y="22.871346"
style="font-size:9.17222023px;text-align:start;text-anchor:start;fill:#f80000;fill-opacity:1;stroke-width:0.26458299px"
id="tspan1060">materials of linked page </tspan></tspan><tspan
sodipodi:role="line"
x="83.156494"
y="32.240623"
id="tspan1068"
style="stroke-width:0.26458299px"><tspan
x="83.156494"
y="32.240623"
style="font-size:9.17222023px;text-align:start;text-anchor:start;fill:#f80000;fill-opacity:1;stroke-width:0.26458299px"
id="tspan1064">is counted</tspan><tspan
dx="0"
x="130.77322"
y="32.240623"
style="font-size:9.17222023px;text-align:start;text-anchor:start;fill:#f80000;fill-opacity:1;stroke-width:0.26458299px"
id="tspan1066" /></tspan></text>
</g>
<g
id="g1658"
transform="translate(-13.278155,2.2736587)">
<path
inkscape:connector-curvature="0"
id="path853-8-1"
d="M 30,51.279787 H 72.33333"
style="fill:none;fill-rule:evenodd;stroke:#0000ff;stroke-width:3.7650001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Send-8-4)" />