mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-07 06:57:28 -06:00
commit
037eb9a898
10 changed files with 262 additions and 1 deletions
Binary file not shown.
|
@ -1 +0,0 @@
|
|||
<mxfile host="www.draw.io" modified="2019-12-20T12:41:33.716Z" agent="Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:66.0) Gecko/20100101 Firefox/66.0" etag="exp7abRcULgdJsv-qAei" version="12.4.3" type="device" pages="1"><diagram id="05EojhSyumsKE0fvOSX8" name="Page-1">7ZtNb9s4EIZ/jY+70LftY+NkuwskQFrvts2pYCRaIkqLBkXXcn79Di3Ssk3ZTR195EDAB82IpIZ8ZgzxBTXyZ8vyI0er7IElmI48JylH/u3I89zA80by5yTbyjOOxpUj5SRRjWrHnLxg5XSUd00SXBw1FIxRQVbHzpjlOY7FkQ9xzjbHzRaMHj91hVJsOOYxoqb3K0lEVnkn3rj2/41Jmuknu9G0urNEurGaSZGhhG0OXP7dyJ9xxkR1tSxnmMrF0+tS9fvrzN19YBzn4jUdvnDvJQzwv+sXOp0/lfHk+3fxh1+N8hPRtZrwXSn4OsF8LlD8Q0Uutno5ig1ZUpSDdbNguZirOw7YcUZoco+2bC3DKWR3bd1kjJMXaI8o3HLBAbe5ULS9SI5GKJ0xyjg4crZ7QN2piqV6DMcFdHvU03ZPXA+oPGp4jwqhA2SUolVBnnchy45LxFOS3zAh2FI1UuuBucDl2YV29/gg7zFbYsG30ER3mCriKuXdsbI3dQK5gfJlB8nj+YFKXJW06X7smitcKLS/gTkwMP9XYG7QhTmLHRzOfuATGg2AECVpDibFC9lNLhqByvmg3IKt5GArFJM8vd+1uQ1qz2c1celi0HdBd9WRkSTBueTHBBLoeZ9fK0ZysVuY8AZ+sH4z589wFELgM7Dd2oafbM7FjOUwF0R23DBkwgbLbHgd5PP1YpJXpCGTXwc66ohzaHD+tAZKQsY4y1Cewl+phd4u9NAbGHpkQP8nF3JGlnS7pMeTgUmPz5e3Rd0qatcJBmY9MVg/IIE5gVcoC7tl2P5rX9C6gj01YH9BgNr+h7fPOhz6HU3vbA9g3+IFyYkgLLfvad2Rnwz9oua6F8lb3u1uxpyhX9c8k/dHyp61nmG1lbdrK4GWEw8g+06v2opWOK248tZ6Psf+vLrSjLqzejbVUiuvdI69QV/pGbupnlqBpRvWDQpLz6wvKKgWdruwmzSWnmmb0qkVWTrD3aCy9Izb1E+tzNIV7QadpWfapoJqdZZe0DcILT2jN/VUK7R0uDFrUFr6Be6ae3B7juWtWosfvrtzLK65A7day1UlXVXM+z3J4pqbbqu1dI598LMsrrn/tlpLN6wHP83imrtvq7V0BHv48yyuufm2WktnuAc/0eKau2+rtXRFe/gzLZc33PaFrTP0gx9q0Z+3WK2ln43Z4KdafBO4gRnnyQf58RVYMUVFQWKpg4illk1gCfj2m1x2WE9lPikKO+O2PLK22iqJOOgG1pMeEa7rTtLQfargcGJ853Wig8AE2JrH+NLUq3YC8RRfo5cdMAsbkGkfxxQJ8vM43iaO6gmPMm9H58/I6BLVQ1TzVL3qbDAG8oLjgaLpyUDVQhgDAXq0PWim6upswF50ErDvXIzLDy62h4sqgjrH9wzekPbmYa7fT/sr0lcaj/CaDPFjflgUV5RPi6Wgc+qd10LknaTK+MpaiMa/KKqWaiE4DbjfWgCz/iK1al5/1+vf/Q8=</diagram></mxfile>
|
Binary file not shown.
Before Width: | Height: | Size: 17 KiB |
21
docs/index.md
Normal file
21
docs/index.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
Cura Documentation
|
||||
====
|
||||
Welcome to the Cura documentation pages.
|
||||
|
||||
Objective
|
||||
----
|
||||
The goal of this documentation is to give an overview of the architecture of Cura's source code. The purpose of this overview is to make programmers familiar with Cura's source code so that they may contribute more easily, write plug-ins more easily or get started within the Cura team more quickly.
|
||||
|
||||
There are some caveats though. These are *not* within the scope of this documentation:
|
||||
* There is no documentation on individual functions or classes of the code here. For that, refer to the Doxygen documentation and Python Docstrings in the source code itself, or generate the documentation locally using Doxygen.
|
||||
* It's virtually impossible and indeed not worth the effort or money to keep this 100% up to date.
|
||||
* There are no example plug-ins here. There are a number of example plug-ins in the Ultimaker organisation on Github.com to draw from.
|
||||
* The slicing process is not documented here. Refer to CuraEngine for that.
|
||||
|
||||
This documentation will touch on the inner workings of Uranium as well though, due to the nature of the architecture.
|
||||
|
||||
Index
|
||||
----
|
||||
The following chapters are available in this documentation:
|
||||
* [Repositories](repositories.md): An overview of the repositories that together make up the Cura application.
|
||||
* [Profiles](profiles/profiles.md): About the setting and profile system of Cura.
|
33
docs/profiles/container_stacks.md
Normal file
33
docs/profiles/container_stacks.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
Container Stacks
|
||||
====
|
||||
When the user selects the profiles and settings to print with, he can swap out a number of profiles. The profiles that are currently in use are stored in several container stacks. These container stacks always have a definition container at the bottom, which defines all available settings and all available properties for each setting. The profiles on top of that definition can then override the `value` property of some of those settings.
|
||||
|
||||
When deriving a setting value, a container stack starts looking at the top-most profile to see if it contains an override for that setting. If it does, it returns that override. Otherwise, it looks into the second profile. If that also doesn't have an override for this setting, it looks into the third profile, and so on. The last profile is always a definition container which always contains an value for all settings. This way, the profiles at the top will always win over the profiles at the bottom. There is a clear precedence order for which profile wins over which other profile.
|
||||
|
||||
A Machine Instance
|
||||
----
|
||||
A machine instance is a printer that the user has added to his configuration. It consists of multiple container stacks: One for global settings and one for each of the available extruders. This way, different extruders can contain different materials and quality profiles, for instance. The global stack contains a different set of profiles than the extruder stacks.
|
||||
|
||||
While Uranium defines no specific roles for the entries in a container stack, Cura defines rigid roles for each slot in a container stack. These are the layouts for the container stacks of an example printer with 2 extruders.
|
||||
|
||||

|
||||
|
||||
To expand on this a bit further, each extruder stack contains the following profiles:
|
||||
* A user profile, where extruder-specific setting changes are stored that are not (yet) saved to a custom profile. If the user changes a setting that can be adjusted per extruder (such as infill density) then it gets stored here. If the user adjusts a setting that is global it will immediately be stored in the user profile of the global stack.
|
||||
* A custom profile. If the user saves his setting changes to a custom profile, it gets moved from the user profile to here. Actually a "custom profile" as the user sees it consists of multiple profiles: one for each extruder and one for the global settings.
|
||||
* An intent profile. The user can select between several intents for his print, such as precision, strength, visual quality, etc. This may be empty as well, which indicates the "default" intent.
|
||||
* A quality profile. The user can select between several quality levels.
|
||||
* A material profile, where the user selects which material is loaded in this extruder.
|
||||
* A nozzle profile, where the user selects which nozzle is installed in this extruder.
|
||||
* Definition changes, which stores the changes that the user made for this extruder in the Printer Settings dialogue.
|
||||
* Extruder. The user is not able to swap this out. This is a definition that lists the extruder number for this extruder and optionally things that are fixed in the printer, such as the nozzle offset.
|
||||
|
||||
The global container stack contains the following profiles:
|
||||
* A user profile, where global setting changes are stored that are not (yet) saved to a custom profile. If the user changes for instance the layer height, the new value for the layer height gets stored here.
|
||||
* A custom profile. If the user saves his setting changes to a custom profile, the global settings that were in the global user profile get moved here.
|
||||
* An intent profile. Currently this must ALWAYS be empty. There are no global intent profiles. This is there for historical reasons.
|
||||
* A quality profile. This contains global settings that match with the quality level that the user selected. This global quality profile cannot be specific to a material or nozzle.
|
||||
* A material profile. Currently this must ALWAYS be empty. There are no global material profiles. This is there for historical reasons.
|
||||
* A variant profile. Currently this must ALWAYS be empty. There are no global variant profiles. This is there for historical reasons.
|
||||
* Definition changes, which stores the changes that the user made to the printer in the Printer Settings dialogue.
|
||||
* Printer. This specifies the currently used printer model, such as Ultimaker 3, Ultimaker S5, etc.
|
29
docs/profiles/profiles.md
Normal file
29
docs/profiles/profiles.md
Normal file
|
@ -0,0 +1,29 @@
|
|||
Profiles
|
||||
====
|
||||
Cura's profile system is very advanced and has gotten pretty complex. This chapter is an attempt to document how it is structured.
|
||||
|
||||
Index
|
||||
----
|
||||
The following pages describe the profile and setting system of Cura:
|
||||
* [Container Stacks](container_stacks.md): Which profiles can be swapped out and how they are ordered when evaluating a setting.
|
||||
* [Setting Properties](setting_properties.md): What properties can each setting have?
|
||||
|
||||
Glossary
|
||||
----
|
||||
The terminology for these profiles is not always obvious. Here is a glossary of the terms that we'll use in this chapter.
|
||||
* **Profile:** Either an *instance container* or a *definition container*.
|
||||
* **Definition container:** Profile that's stored as .def.json file, defining new settings and all of their properties. In Cura these represent printer models and extruder trains.
|
||||
* **Instance container:** Profile that's stored as .inst.cfg file or .xml.fdm_material file, which override some setting values. In Cura these represent the other profiles.
|
||||
* **[Container] stack:** A list of profiles, with one definition container at the bottom and instance containers for the rest. All settings are defined in the definition container. The rest of the profiles each specify a set of value overrides. The profiles at the top always override the profiles at the bottom.
|
||||
* **Machine instance:** An instance of a printer that the user has added. The list of all machine instances is shown in a drop-down in Cura's interface.
|
||||
* **Material:** A type of filament that's being sold by a vendor as a product.
|
||||
* **Filament spool:** A single spool of material.
|
||||
* **Quality profile:** A profile that is one of the options when the user selects which quality level they want to print with.
|
||||
* **Intent profile:** A profile that is one of the options when the user selects what his intent is.
|
||||
* **Custom profile:** A user-made profile that is stored when the user selects to "create a profile from the current settings/overrides".
|
||||
* **Quality-changes profile:** Alternative name for *custom profile*. This name is used in the code more often, but it's a bit misleading so this documentation prefers the term "custom profile".
|
||||
* **User profile:** A profile containing the settings that the user has changed, but not yet saved to a profile.
|
||||
* **Variant profile:** A profile containing some overrides that allow the user to select variants of the definition. As of this writing this is only used for the nozzles.
|
||||
* **Quality level:** A measure of quality where the user can select from, for instance "normal", "fast", "high". When selecting a quality level, Cura will select a matching quality profile for each extruder.
|
||||
* **Quality type:** Alternative name for *quality level*. This name is used in the code more often, but this documentation prefers the term "quality level".
|
||||
* **Inheritance function:** A function through which the `value` of a setting is calculated. This may depend on other settings.
|
33
docs/profiles/setting_properties.md
Normal file
33
docs/profiles/setting_properties.md
Normal file
|
@ -0,0 +1,33 @@
|
|||
Setting Properties
|
||||
====
|
||||
Each setting in Cura has a number of properties. It's not just a key and a value. This page lists the properties that a setting can define.
|
||||
|
||||
* `key` (string): The identifier by which the setting is referenced. This is not a human-readable name, but just a reference string, such as `layer_height_0`. Typically these are named with the most significant category first, in order to sort them better, such as `material_print_temperature`. This is not actually a real property but just an identifier; it can't be changed.
|
||||
* `value` (optional): The current value of the setting. This can be a function, an arbitrary Python expression that depends on the values of other settings. If it's not present, the `default_value` is used.
|
||||
* `default_value`: A default value for the setting if `value` is undefined. This property is required however. It can't be a Python expression, but it can be any JSON type. This is made separate so that CuraEngine can read it out as well for its debugging mode via the command line, without needing a complete Python interpreter.
|
||||
* `label` (string): The human-readable name for the setting. This label is translated.
|
||||
* `description` (string): A longer description of what the setting does when you change it. This description is translated as well.
|
||||
* `type` (string): The type of value that this setting contains. Allowed types are: `bool`, `str`, `float`, `int`, `enum`, `category`, `[int]`, `vec3`, `polygon` and `polygons`.
|
||||
* `unit` (optional string): A unit that is displayed at the right-hand side of the text field where the user enters the setting value.
|
||||
* `resolve` (optional string): A Python expression that resolves disagreements for global settings if multiple per-extruder profiles define different values for a setting. Typically this takes the values for the setting from all stacks and computes one final value for it that will be used for the global setting. For instance, the `resolve` function for the build plate temperature is `max(extruderValues('material_bed_temperature')`, meaning that it will use the hottest bed temperature of all materials of the extruders in use.
|
||||
* `limit_to_extruder` (optional): A Python expression that indicates which extruder a setting will be obtained from. This is used for settings that may be extruder-specific but the extruder is not necessarily the current extruder. For instance, support settings need to be evaluated for the support extruder. Infill settings need to be evaluated for the infill extruder if the infill extruder is changed.
|
||||
* `enabled` (optional string or boolean): Whether the setting can currently be made visible for the user. This can be a simple true/false, or a Python expression that depends on other settings. Typically used for settings that don't apply when another setting is disabled, such as to hide the support settings if support is disabled.
|
||||
* `minimum_value` (optional): The lowest acceptable value for this setting. If it's any lower, Cura will not allow the user to slice. By convention this is used to prevent setting values that are technically or physically impossible, such as a layer height of 0mm. This property only applies to numerical settings.
|
||||
* `maximum_value` (optional): The highest acceptable value for this setting. If it's any higher, Cura will not allow the user to slice. By convention this is used to prevent setting values that are technically or physically impossible, such as a support overhang angle of more than 90 degrees. This property only applies to numerical settings.
|
||||
* `minimum_value_warning` (optional): The threshold under which a warning is displayed to the user. By convention this is used to indicate that it will probably not print very nicely with such a low setting value. This property only applies to numerical settings.
|
||||
* `maximum_value_warning` (optional): The threshold above which a warning is displayed to the user. By convention this is used to indicate that it will probably not print very nicely with such a high setting value. This property only applies to numerical settings.
|
||||
* `settable_globally` (optional boolean): Whether the setting can be changed globally. For some mesh-type settings such as `support_mesh` this doesn't make sense, so those can't be changed globally. They are not displayed in the main settings list then.
|
||||
* `settable_per_meshgroup` (optional boolean): Whether a setting can be changed per group of meshes. Currently unused in Cura.
|
||||
* `settable_per_extruder` (optional boolean): Whether a setting can be changed per extruder. Some settings, like the build plate temperature, can't be adjusted separately for each extruder. An icon is shown in the interface to indicate this. If the user changes these settings they are stored in the global stack.
|
||||
* `settable_per_mesh` (optional boolean): Whether a setting can be changed per mesh. The settings that can be changed per mesh are shown in the list of available settings in the per-object settings tool.
|
||||
* `children` (optional list): A list of child settings. These are displayed with an indentation. If all child settings are overridden by the user, the parent setting gets greyed out to indicate that the parent setting has no effect any more. This is not strictly always the case though, because that would depend on the inheritance functions in the `value`.
|
||||
* `icon` (optional string): A path to an icon to be displayed. Only applies to setting categories.
|
||||
* `allow_empty` (optional bool): Whether the setting is allowed to be empty. If it's not, this will be treated as a setting error and Cura will not allow the user to slice. Only applies to string-type settings.
|
||||
* `warning_description` (optional string): A warning message to display when the setting has a warning value. This is currently unused by Cura.
|
||||
* `error_description` (optional string): An error message to display when the setting has an error value. This is currently unused by Cura.
|
||||
* `options` (dictionary): A list of values that the user can choose from. The keys of this dictionary are keys that CuraEngine identifies the option with. The values are human-readable strings and will be translated. Only applies to (and only required for) enum-type settings.
|
||||
* `comments` (optional string): Comments to other programmers about the setting. This is not used by Cura.
|
||||
* `is_uuid` (optional boolean): Whether or not this setting indicates a UUID-4. If it is, the setting will indicate an error if it's not in the correct format. Only applies to string-type settings.
|
||||
* `regex_blacklist_pattern` (optional string): A regular expression, where if the setting value matches with this regular expression, it gets an error state. Only applies to string-type settings.
|
||||
* `error_value` (optional): If the setting value is equal to this value, it will show a setting error. This is used to display errors for non-numerical settings such as checkboxes.
|
||||
* `warning_value` (optional): If the setting value is equal to this value, it will show a setting warning. This is used to display warnings for non-numerical settings such as checkboxes.
|
21
docs/repositories.md
Normal file
21
docs/repositories.md
Normal file
|
@ -0,0 +1,21 @@
|
|||
Repositories
|
||||
====
|
||||
Cura uses a number of repositories where parts of our source code are separated, in order to get a cleaner architecture. Those repositories are:
|
||||
* [Cura](https://github.com/Ultimaker/Cura), the main repository for the front-end of Cura. This contains all of the business logic for the front-end, including the specific types of profiles that are available, the concept of 3D printers and materials, specific tools for handling 3D printed models, pretty much all of the GUI, as well as Ultimaker services such as the Marketplace and accounts.
|
||||
* The Cura repository is built on [Uranium](https://github.com/Ultimaker/Uranium), a framework for desktop applications that handle 3D models and have a separate back-end. This provides Cura with a basic GUI framework ([Qt](https://www.qt.io/)), a 3D scene, a rendering system, a plug-in system and a system for stacked profiles that change settings.
|
||||
* In order to slice, Cura starts [CuraEngine](https://github.com/Ultimaker/CuraEngine) in the background. This does the actual process that converts 3D models into a toolpath for the printer.
|
||||
* Communication to CuraEngine goes via [libArcus](https://github.com/Ultimaker/libArcus), a small library that wraps around [Protobuf](https://developers.google.com/protocol-buffers/) in order to make it run over a local socket.
|
||||
* Cura's build scripts are in [cura-build](https://github.com/Ultimaker/cura-build) and build scripts for building dependencies are in [cura-build-environment](https://github.com/Ultimaker/cura-build-environment).
|
||||
|
||||
There are also a number of repositories under our control that are not integral parts of Cura's architecture, but more like separated side-gigs:
|
||||
* Loading and writing 3MF files is done through [libSavitar](https://github.com/Ultimaker/libSavitar).
|
||||
* Loading and writing UFP files is done through [libCharon](https://github.com/Ultimaker/libCharon).
|
||||
* To make the build system a bit simpler, some parts are pre-compiled in [cura-binary-data](https://github.com/Ultimaker/cura-binary-data). This holds things like the machine-readable translation files and the Marlin builds for firmware updates, which would require considerable tooling to build automatically.
|
||||
* There are automated GUI tests in [Cura-squish-tests](https://github.com/Ultimaker/Cura-squish-tests).
|
||||
* Material profiles are stored in [fdm_materials](https://github.com/Ultimaker/fdm_materials). This is separated out and combined in our build process, so that the firmware for Ultimaker's printers can use the same set of profiles too.
|
||||
|
||||
Interplay
|
||||
----
|
||||
At a very high level, Cura's repositories interconnect as follows:
|
||||
|
||||

|
55
docs/resources/machine_instance.svg
Normal file
55
docs/resources/machine_instance.svg
Normal file
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="700" height="1010">
|
||||
<defs>
|
||||
<path id="stack-header" d="m0,50 v-30 a20,20 0 0 1 20,-20 h260 a20,20 0 0 1 20,20 v30 z" />
|
||||
<marker id="arrow" refX="2" refY="1.5" markerWidth="3" markerHeight="3" orient="auto-start-reverse">
|
||||
<polygon points="0,0 3,1.5 0,3" />
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<g stroke="black" stroke-width="5" fill="silver"> <!-- Stack headers. -->
|
||||
<use href="#stack-header" x="200" y="555" />
|
||||
<use href="#stack-header" x="5" y="5" />
|
||||
<use href="#stack-header" x="395" y="5" />
|
||||
</g>
|
||||
<g stroke="black" stroke-width="10" fill="none"> <!-- Stack outlines. -->
|
||||
<rect x="200" y="555" width="300" height="450" rx="20" /> <!-- Global stack. -->
|
||||
<rect x="5" y="5" width="300" height="450" rx="20" /> <!-- Left extruder. -->
|
||||
<rect x="395" y="5" width="300" height="450" rx="20" /> <!-- Right extruder. -->
|
||||
</g>
|
||||
<g font-family="sans-serif" font-size="25" dominant-baseline="middle" text-anchor="middle">
|
||||
<text x="350" y="582.5">Global stack</text> <!-- Slightly lowered since the top line is thicker than the bottom. -->
|
||||
<text x="350" y="630">User</text>
|
||||
<text x="350" y="680">Custom</text>
|
||||
<text x="350" y="730">Intent</text>
|
||||
<text x="350" y="780">Quality</text>
|
||||
<text x="350" y="830">Material</text>
|
||||
<text x="350" y="880">Variant</text>
|
||||
<text x="350" y="930">Definition changes</text>
|
||||
<text x="350" y="980">Printer</text>
|
||||
|
||||
<text x="155" y="32.5">Left extruder</text> <!-- Slightly lowered again. -->
|
||||
<text x="155" y="80">User</text>
|
||||
<text x="155" y="130">Custom</text>
|
||||
<text x="155" y="180">Intent</text>
|
||||
<text x="155" y="230">Quality</text>
|
||||
<text x="155" y="280">Material</text>
|
||||
<text x="155" y="330">Nozzle</text>
|
||||
<text x="155" y="380">Definition changes</text>
|
||||
<text x="155" y="430">Extruder</text>
|
||||
|
||||
<text x="545" y="32.5">Right extruder</text> <!-- Slightly lowered again. -->
|
||||
<text x="545" y="80">User</text>
|
||||
<text x="545" y="130">Custom</text>
|
||||
<text x="545" y="180">Intent</text>
|
||||
<text x="545" y="230">Quality</text>
|
||||
<text x="545" y="280">Material</text>
|
||||
<text x="545" y="330">Nozzle</text>
|
||||
<text x="545" y="380">Definition changes</text>
|
||||
<text x="545" y="430">Extruder</text>
|
||||
</g>
|
||||
<g stroke="black" stroke-width="5" marker-end="url(#arrow)"> <!-- Arrows. -->
|
||||
<line x1="155" y1="455" x2="345" y2="545" />
|
||||
<line x1="545" y1="455" x2="355" y2="545" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
70
docs/resources/repositories.svg
Normal file
70
docs/resources/repositories.svg
Normal file
|
@ -0,0 +1,70 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="1000">
|
||||
<defs>
|
||||
<marker id="arrow" refX="2" refY="1.5" markerWidth="3" markerHeight="3" orient="auto-start-reverse">
|
||||
<polygon points="0,0 3,1.5 0,3" />
|
||||
</marker>
|
||||
</defs>
|
||||
|
||||
<g marker-end="url(#arrow)" stroke="black" stroke-width="5"> <!-- Arrows. -->
|
||||
<!-- Towards CuraEngine and back. -->
|
||||
<line x1="475" y1="400" x2="475" y2="307.5" />
|
||||
<line x1="475" y1="250" x2="475" y2="210" />
|
||||
<line x1="525" y1="200" x2="525" y2="242.5" />
|
||||
<line x1="525" y1="300" x2="525" y2="390" />
|
||||
|
||||
<!-- From libSavitar. -->
|
||||
<line x1="100" y1="425" x2="142.5" y2="425" />
|
||||
<line x1="300" y1="425" x2="390" y2="425" />
|
||||
|
||||
<!-- From fdm_materials. -->
|
||||
<line x1="350" y1="575" x2="390" y2="575" />
|
||||
|
||||
<!-- To libCharon. -->
|
||||
<line x1="600" y1="500" x2="692.5" y2="500" />
|
||||
<line x1="900" y1="500" x2="945" y2="500" />
|
||||
|
||||
<!-- To Uranium. -->
|
||||
<line x1="500" y1="600" x2="500" y2="690" />
|
||||
</g>
|
||||
|
||||
<g stroke="black" fill="none"> <!-- Boxes representing repositories. -->
|
||||
<g stroke-width="10"> <!-- Major repositories. -->
|
||||
<rect x="400" y="400" width="200" height="200" rx="20" /> <!-- Cura. -->
|
||||
<rect x="350" y="700" width="300" height="200" rx="20" /> <!-- Uranium. -->
|
||||
<rect x="300" y="5" width="400" height="195" rx="20" /> <!-- CuraEngine. -->
|
||||
</g>
|
||||
<g stroke-width="5"> <!-- Minor repositories. -->
|
||||
<rect x="150" y="350" width="150" height="100" rx="20" /> <!-- libSavitar. -->
|
||||
<rect x="100" y="550" width="250" height="100" rx="20" /> <!-- fdm_materials. -->
|
||||
<rect x="430" y="250" width="140" height="50" rx="20" /> <!-- libArcus. -->
|
||||
<rect x="700" y="450" width="200" height="100" rx="20" /> <!-- libCharon. -->
|
||||
</g>
|
||||
</g>
|
||||
|
||||
<g font-family="sans-serif" text-anchor="middle" dominant-baseline="middle"> <!-- Labels. -->
|
||||
<g font-size="50"> <!-- Major repositories. -->
|
||||
<text x="500" y="500">Cura</text>
|
||||
<text x="500" y="800">Uranium</text>
|
||||
<text x="500" y="102.5">CuraEngine</text>
|
||||
</g>
|
||||
<g font-size="25"> <!-- Minor repositories and arrows. -->
|
||||
<text x="225" y="400">libSavitar</text>
|
||||
<text x="225" y="600">fdm_materials</text>
|
||||
<text x="500" y="275">libArcus</text>
|
||||
<text x="800" y="500">libCharon</text>
|
||||
|
||||
<g text-anchor="start">
|
||||
<text x="645" y="490" transform="rotate(-90, 645, 490)">G-code</text>
|
||||
<text x="950" y="500">UFP</text>
|
||||
<text x="535" y="345">G-code</text>
|
||||
<text x="345" y="415" transform="rotate(-90, 345, 415)">Model</text>
|
||||
<text x="510" y="645">Built upon</text>
|
||||
</g>
|
||||
<g text-anchor="end">
|
||||
<text x="465" y="345">Scene</text>
|
||||
<text x="90" y="425">3MF</text>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3 KiB |
Loading…
Add table
Add a link
Reference in a new issue