# Transformations

# Another Perspective

This is similar to [Bezier Envelope](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/bezier-envelope)

## Draw an object and convert to path

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/DQoGK6Gt2qKSnMVn-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/DQoGK6Gt2qKSnMVn-grafik.png)

## Draw some envelope path

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/Pn8Doj1wtOs48sLq-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/Pn8Doj1wtOs48sLq-grafik.png)

## Run the extension and check result

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/vRf5vQVowOr4djfU-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/vRf5vQVowOr4djfU-grafik.png)

# Apply Transformations

An Inkscape extension which recursively applies transformations to shapes. This will remove applied Matrix values from object but will keep it's transformation. It will reset the matrix to basic values like these:

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/ybXIMz6GVukLLgVo-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/ybXIMz6GVukLLgVo-grafik.png)

It will also clean Live Path Effects

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/PaGDDL1c2JUWpi4U-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/PaGDDL1c2JUWpi4U-grafik.png)

# Barrel Distortion

## Draw some shape

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/KgvEHuncRKcNJg6k-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/KgvEHuncRKcNJg6k-grafik.png)

## Run the extension

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/CYYlQqsnUn4CLuMe-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/CYYlQqsnUn4CLuMe-grafik.png)

## Result

![](https://wiki.stadtfabrikanten.org/loading.gif)

# Bezier Envelope

This extension is similar to default Inkscape extension "Modify Path → Envelope" and is also similar to [Another Perspective](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/another-perspective).

Note: this extension does not work for svg:circle which were converted to svg:path. Those will contain a or A commands in their path. We need to convert those to paths with c or C commands!

## Draw the path you want to fit into the envelope

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/B4MGcBsFv5O0ZZRg-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/B4MGcBsFv5O0ZZRg-grafik.png)

## Draw your 4-sided envelope around

**Please note!**

- Paths with more than 4 sides will not correctly apply. Paths with less than 4 sides will fail. So just draw a square shape (angles don't have to be 90 degrees)
- Start in the upper left corner and draw clockwise. Otherwise your result may get twisted in an undesired way

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/YZnnhUlSyJ789HUk-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/YZnnhUlSyJ789HUk-grafik.png)

## Run the extension

First select the inner path. As second select the envelope. If you dismiss the order the extension will fail.

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/M7xIAbXMA0hc84TF-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/M7xIAbXMA0hc84TF-grafik.png)

# Cutting Optimizer (Nesting)

Source of documentation: [<span>https://translate.google.com/translate?hl=de&amp;sl=fr&amp;tl=en&amp;u=https%3A%2F%2Fwiki.fablab-lannion.org%2Findex.php%3Ftitle%3DCutOptim</span>](https://translate.google.com/translate?hl=de&sl=fr&tl=en&u=https%3A%2F%2Fwiki.fablab-lannion.org%2Findex.php%3Ftitle%3DCutOptim)

# <span class="notranslate">CutOptim</span>

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/vuM9aIv0VBjAtpMp-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/vuM9aIv0VBjAtpMp-grafik.png)

## <span class="notranslate"> <span class="mw-headline">Presentation</span></span>

<span class="notranslate"> All the users of the laser cutter have probably been confronted with the problem: my drawing does not fit in the wood sheet at my disposal or even in the laser cutter!</span> <span class="notranslate"> To try to remedy this problem, I started writing an optimization program for placing objects on a sheet.</span>   
<span class="notranslate"> For interested readers, this is a variant of a problem well known in the world of optimization (bin packing problem). By doing a little research on the Web, there are also many links to programs performing this task, but the free versions are often very limited, they are content to optimize the cutting of rectangles.</span> <span class="notranslate"> This can help a furniture manufacturer, but it's too limiting for a laser cutter!</span>

  
<span class="notranslate"> This program reads an input SVG file containing the objects to be placed and outputs a second SVG file containing the placed objects.</span>   
<span class="notranslate"> It can be used as is (command line, no GUI!) Or as an extension inkscape which then provides the GUI.</span>

## <span class="notranslate"> <span class="mw-headline">Environment</span></span>

<span class="notranslate"> As mentioned above, this program can be used alone or as an inkscape extension.</span>   
<span class="notranslate"> The work to be done can take a relatively long time, it is better to run it on a modern processor, but if you are in no hurry ...</span>   
<span class="notranslate"> The memory consumption is reasonable, no need to rush to buy new RAMs!</span>

## <span class="notranslate"> S<span class="mw-headline">oftware</span></span>

<span class="notranslate"> First of all as it is a program written in C ++ for a performance issue, it must be compiled on your machine.</span>   
<span class="notranslate"> I wrote this program under Linux / Ubuntu (compiled with gcc), but since there is no system dependency, it should work as it is under any other version of Linux.</span> <span class="notranslate"> For fans of Windows (there is!), I created a Visual Studio project that allows to compile on this platform.</span> <span class="notranslate"> For Mac users, sorry I do not have it, you will have to fend for yourself, but the C ++ used is really standard, it should work as soon as you have access to a compiler.</span> <span class="notranslate"> For information, I did not change the code between Linux and Windows, that's saying!</span>

### <span class="notranslate"> <span class="mw-headline">Linux installation</span></span>

<span class="notranslate"> The code is available here: [https://github.com/thierry7100/CutOptim](https://github.com/thierry7100/CutOptim) For the uninitiated, you clone (or download) the directory, it comes in the form of a .zip archive, which must be extracted.</span> <span class="notranslate"> Then you open a terminal, go to the created directory and launch the commands:</span>

1. <span class="notranslate"> make release</span>
2. <span class="notranslate"> make install: this will copy the software to the directory ~ / .local / bin which is in the list of executable directories, which will allow you to use it directly (this may be specific Ubuntu, it's up to you put the program elsewhere on another system.</span>
3. <span class="notranslate"> make install\_inkscape: this will copy the program to the inkscape extension directory (~ / .config / inkscape / extensions).</span> <span class="notranslate"> If you want to make this extension available for all accounts on your machine, copy the file cutoptim.inx + the executable into / usr / share / inkscape / extensions (you must be root).</span>

<span class="notranslate"> If you have opted for the inkscape extension, at the next start you will have a Fablab / Laser Cutting Optimizer extension</span>

```bash
cd ~
git clone https://github.com/thierry7100/CutOptim.git
cd CutOptim
make release
#make install
 
#try
~/CutOptim/bin/Release/CutOptim
```

### <span class="notranslate"> <span class="mw-headline">Windows installation</span></span>

<span class="notranslate"> The code is available here: [https://github.com/thierry7100/CutOptim](https://github.com/thierry7100/CutOptim).</span>

<span class="notranslate">For the uninitiated, you clone (or download) the directory, it comes in the form of a .zip archive, which must be extracted.</span> <span class="notranslate"> Then you launch Visual Studio, you can get a free version for special purposes, see [Visual Studio Community Edition v17](https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=Community&rel=17) (You also need to install Windows SDK-Version 10.0.16299.0 within Visual Studio Installer). </span>

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/l2GZ6d1moOjxUUNl-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/l2GZ6d1moOjxUUNl-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/IfZMCwOt0d7KZ8Uj-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/IfZMCwOt0d7KZ8Uj-grafik.png)

<span class="notranslate">Then, once Visual studio started, you have the CutOptim project, then:</span>

1. <span class="notranslate"> You ask to generate the release version of the project if it is not the one that appears in the menu bar.</span>
2. <span class="notranslate"> You choose the platform (x86 or x64) of your choice.</span> <span class="notranslate"> By default the file is configured in x64, if you have a 32bit version of Windows, change to x86.</span>
3. <span class="notranslate"> You click Generate / Generate Solution, the compilation starts and after a few seconds, your program is available.</span>
4. <span class="notranslate"> Then, under windows, better use this program as extension inkscape, the command line is hardly used?</span> <span class="notranslate"> !</span> <span class="notranslate"> To do this, copy the cutoptim.inx and CutOptm / x64 / Release / CutOptim.exe files to the inkscape extensions directory.</span> <span class="notranslate"> This can be found via the Edit / Preferences / System command, but it is usually under C: \\ USERS \\ &lt;Your user name&gt; \\ AppData \\ Roaming / inkscape / extensions.</span> <span class="notranslate"> Attention, to see this directory, you will have to validate the visualization of hidden files under the explorer of files, if it were not done.</span>

<span class="notranslate"> As in Linux, at the next start of inkscape you will have a Fablab / Laser Cutting Optimizer extension</span>

## <span class="notranslate"> <span class="mw-headline">Operation</span></span>

<span class="notranslate"> The input and output format of the files is the SVG format, available on many software programs.</span> <span class="notranslate"> If you use inkscape, it is the native format, the program has been tested in this context.</span> <span class="notranslate"> It should also work with files from other drawing software that generates SVG.</span> <span class="notranslate"> If you have a problem tell me (<thierry@fablab-lannion.org>)</span>   
  
<span class="notranslate"> Description of the process:</span>

1. <span class="notranslate"> The inkscape document (at least its size) can usually be of importance, here it sets the size of the sheet used for cutting.</span> <span class="notranslate"> You will need to set a document size compatible with your material (and the cutter, of course!).</span>
2. <span class="notranslate"> First of all, the program reads the inkscape document, it only considers paths or simple objects.</span> <span class="notranslate"> The texts not transformed in the way, the images ... are ignored.</span> <span class="notranslate"> I therefore advise to turn everything into a path before launching the program.</span> <span class="notranslate"> Inkscape Ctrl + A then Objects in Path (SHIFT + Ctrl + C). Unclosed paths are also ingnorated, the software is only able to process shapes with a closed outline.</span>
3. <span class="notranslate"> Paths can be placed anywhere, in the sheet or out, it does not matter.</span> <span class="notranslate"> To a certain extent, they can even be superimposed (see below).</span>
4. <span class="notranslate"> Then, from these paths, the program creates polygons approaching the paths (with an error of less than 0.1mm on average).</span>
5. <span class="notranslate"> Then the program "enlarges" these polygons to prevent paths from touching each other in the final result.</span> <span class="notranslate"> The size of the enlargement is configurable.</span>
6. <span class="notranslate"> The program then takes these enlarged polygons and will try to place them in a way that is not optimal but good.</span> <span class="notranslate"> Why not optimal because the problem is difficult (complete NP in mathematical terms) and requires a very long time even for simple configurations.</span> <span class="notranslate"> The basic idea here is to start from the largest polygon, then to place the sorted polygons by decreasing size such that a vertex of the polygon to be placed is positioned on a vertex of an already placed polygon.</span> <span class="notranslate"> This reduces the space of possibilities, even if it remains very large!</span>
7. <span class="notranslate"> The "best" configuration is obtained when the size of the convex hull is minimal.</span> <span class="notranslate"> Another mathematical term!</span> <span class="notranslate"> The convex hull is the smallest convex hull containing all points of all plotted polygons.</span> <span class="notranslate"> Intuitively, this maximizes the free space on the plate, which is the desired result.</span> <span class="notranslate"> Be careful, it is not necessarily the smallest rectangle, the convex envelope is not usually a rectangle!</span>
8. <span class="notranslate"> To place the paths, the software is allowed to turn the objects, unless you block this possibility.</span> <span class="notranslate"> Depending on your needs (non-homogeneous material) you may have to limit rotations to 0 and 180 ° for example, or even to block any rotation (this will be the case for example with printed fabric).</span>

### <span class="notranslate"> <span class="mw-headline">Program Options under inkscape</span></span>

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/UAxKRDEsCI6GW5JB-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/UAxKRDEsCI6GW5JB-grafik.png)

<span class="notranslate"> The program has many options detailed below:</span>

- <span class="notranslate"> Units: Always use the mm, the program is not tested for other choices.</span>
- <span class="notranslate"> Min distance between objects: This is the size of which polygons will be enlarged.</span> <span class="notranslate"> This value must be greater than 0.8mm, the approximation by polygons is not perfect.</span>
- <span class="notranslate"> Max length of single segment: as explained above the software will try to find a good configuration by positioning vertices on other vertices.</span> <span class="notranslate"> It can be interesting in some cases to "add" vertices to have more possibilities.</span> <span class="notranslate"> If an edge is larger than the specified size, it will be broken into multiple segments, with additional vertices.</span> <span class="notranslate"> Do not abuse this option, too low a value will slow down the treatment tremendously.</span> <span class="notranslate"> Do not go below 100mm in most cases, even if the value 0 is allowed to indicate that you do NOT want to use this possibility.</span>
- <span class="notranslate"> Optimizing level: as indicated above the program places the polygons in order of decreasing size (we place the largest pebbles first ...).</span> <span class="notranslate"> This sometimes leads to clearly suboptimal situations.</span> <span class="notranslate"> By increasing this parameter, the software will optimize the placement of a group of N polygons.</span> <span class="notranslate"> This gives better results, but be careful, it considerably increases the treatment time.</span> <span class="notranslate"> Do not exceed 2 or 3, if the default value of 1 does not give good results.</span> <span class="notranslate"> If you draw has 300 vertices already placed (rather low value actually) and you allow rotations in steps of 10 °, use N = 2 will multiply operations by 36 \* 300!</span> <span class="notranslate"> And for N = 3 by (36 \* 300) ²!</span>
- <span class="notranslate"> Keep original layer in output.</span> <span class="notranslate"> If you do not trust!, You can check this option, the original shapes will be kept as well as those placed, but placed in different layers.</span> <span class="notranslate"> You will be able to check the work done.</span>
- <span class="notranslate"> Select option for largest element placement.</span> <span class="notranslate"> The first item can be placed where you want on the page.</span> <span class="notranslate"> Usually at the top left, but the center also gives good results.</span>
- <span class="notranslate"> If this option is checked, the rotation angle of each object will be chosen from 4 to make the edge coincide with one of the two of the vertex on which the object is going. to be positioned.</span> <span class="notranslate"> This option is economical in processing time (at most 4 tests) but can give less good results than the fixing of the angle of rotation.</span> <span class="notranslate"> The results are worse when the segments are very short, if the input form is not a polygon for example.</span>
- <span class="notranslate"> Try rotation by (0 no rotation allowed): This option is incompatible with the previous one, it is only valid if the previous option is NOT checked.</span> <span class="notranslate"> In this case, the objects are positioned on discrete rotation steps.</span> <span class="notranslate"> 0 means that rotations are prohibited, this is useful when the material is not homogeneous.</span> <span class="notranslate"> For MDF, no restrictions, but for wood or even plywood, if you want to respect the direction of the wood, rotations are not advisable.</span> <span class="notranslate"> Choose 180 ° in this case.</span> <span class="notranslate"> Attention, low values ​​greatly increase the calculation time.</span> <span class="notranslate"> With 10 °, there are 36 times more calculations than with 0 °!</span> <span class="notranslate"> If the input shapes are rectangular, a value of 90 ° gives good results.</span>
- <span class="notranslate"> In practice, we often deal with situations or related objects.</span> <span class="notranslate"> For example, a plate with fixing holes.</span> <span class="notranslate"> If this box is checked, the software checks if the path is included in another one, and if it is, it will not process it but link it to the larger path.</span> <span class="notranslate"> Once it is placed, the same transformation (rotation / translation) will be applied to the "small" included object.</span> <span class="notranslate"> Attention the software is not able to recover the space released in holes, you have to leave a little work anyway.</span>
- <span class="notranslate"> Debug file generation: If this box is checked, a debug file (Debug\_CutOptim.txt) is created in the inkscape extension directory.</span> <span class="notranslate"> This can be used to understand what has (badly) happened.</span>

### <span class="notranslate"> <span class="mw-headline">Program options via the command line</span></span>

<span class="notranslate"> The software has pretty much the same options as via inkscape, with some additions.</span>

```bash
eridur-cutoptim.exe [OPTION...] [optional args]
 
  -f, --file SVG Input File     File (default: TestPoly1.svg)
  -o, --output SVG Output File  Output file
      --positional arg          File to be processed
  -h, --help                    Print help
  -d, --distance 1.0            Min distance between paths to be cut
  -m, --max_length 1000.0       Max length of one segment, break than longer
  -l, --optimizing_level 1      Optimizing level, process list_size elements together
      --debug_level 0           Level of debug info in specific debug file
      --debug_file              Generate debug info from inkscape (default: true)
  -k, --original                Output Original layer
  -n, --nested                  Keep nested path together (default: true)
  -y, --layer_output 0          Output internal layers : 1 Input layer, 2 Polygon, 4 Large polygon, 8 Hull layer, 16 Placed Polygon layer, OR these values to output multiple layers
  -a, --angle 90.0              Rotation step
  -r, --free_rot                allow free rotation (default: true)
  -p, --firstpos Position of largest object on the sheet
                                Position of largest object
```

## <span class="notranslate"> <span class="mw-headline">Possible developments / known limitations  
</span></span>

- <span class="notranslate"> No doubt a lot of things, to you to propose and even to realize, the code is open!</span>
- <span class="notranslate">the colors and layers of the objects do not play a role yet</span>
- <span class="notranslate">generates trashy results in a lot of situations</span>
- <span class="notranslate">there is no solution to remove duplicate edges</span>
- <span class="notranslate">there is no solution to allow zero distance between the parts</span>
- <span class="notranslate">known Bugs:</span>
    - <span class="notranslate">does not work for parts which have lines it it (groups with things like living hinge flex pattern) and ignores groups of objects</span>

<table border="1" id="bkmrk-example-input-output" style="border-collapse: collapse; width: 99.9734%;"><colgroup><col style="width: 6.98138%;"></col><col style="width: 47.7528%;"></col><col style="width: 45.2658%;"></col></colgroup><thead><tr><td>**Example**</td><td>**Input**</td><td>**Output**</td></tr></thead><tbody><tr><td>1</td><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/4Q8HZUOpW0MHCjBj-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/4Q8HZUOpW0MHCjBj-grafik.png)

</td><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/PF9MlbArg57oZ3yJ-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/PF9MlbArg57oZ3yJ-grafik.png)

</td></tr><tr><td>2</td><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/Cdihjlg5jvplQ8Aa-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/Cdihjlg5jvplQ8Aa-grafik.png)

</td><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/GWdQONJ6IS6EkWqC-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/GWdQONJ6IS6EkWqC-grafik.png)

</td></tr><tr><td>3</td><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/8NlKQIDeNi7RdmFb-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/8NlKQIDeNi7RdmFb-grafik.png)

</td><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/xjurtJDfLiNMT0Vv-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/xjurtJDfLiNMT0Vv-grafik.png)

</td></tr></tbody></table>

<span class="notranslate">as soon as you have more than one open path (e.g. a line with 2 points) CutOptim **will crash**</span>

<table border="1" id="bkmrk-is-okay-%28open-contou" style="border-collapse: collapse; width: 99.9734%; height: 76.2334px;"><colgroup><col style="width: 49.9668%;"></col><col style="width: 49.9668%;"></col></colgroup><thead><tr style="height: 38.1167px;"><td style="height: 38.1167px;">**is okay (open contour will be deleted while nesting)**</td><td style="height: 38.1167px;">**will crash**</td></tr></thead><tbody><tr style="height: 38.1167px;"><td style="height: 38.1167px;">[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/Nknh3Gk3io3RFOIX-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/Nknh3Gk3io3RFOIX-grafik.png)</td><td style="height: 38.1167px;">[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/4gNDQUkqokRE54OC-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/4gNDQUkqokRE54OC-grafik.png)</td></tr></tbody></table>

## <span class="notranslate"> <span class="mw-headline">Bibliography</span></span>

<span class="notranslate"> As indicated the subject is well known in the scientific world, I used the two following articles</span>

- <span class="notranslate"> Waste minimization in irregular stock cutting published in 2014 by Doraid Dalalah, Samir Khrais and Khaled Bataineh.</span> <span class="notranslate"> This article gives the basis of what is achieved.</span>
- <span class="notranslate"> Jostle heuristics for the 2D-irregular shapes bin packing problems with free rotation published in 2018 by Ranga P. Abeysooriya, Julia A. Bennell and Antonio Martinez-Sykora</span>

<span class="notranslate"> Good reading !</span>

# Epilog Dashboard BBox Adjust

This tool is a helper to adjust the document border including an offset value, which is added. Sending vector data to Epilog Dashboard often results in trimmed paths. This leads to wrong geometry where the laser misses to cut them. So we add a default (small) amount of to expand the document's canvas.

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/XSVqyYtpIYBXrgdn-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/XSVqyYtpIYBXrgdn-grafik.png)

## The issue in pictures

<table border="1" id="bkmrk-correct-fit-in-inksc" style="border-collapse: collapse; width: 99.9734%;"><colgroup><col style="width: 49.9668%;"></col><col style="width: 49.9668%;"></col></colgroup><thead><tr><td>**Correct fit in Inkscape**</td><td>**Import in Epilog Dashboard (ellipse lost parts of its contour)**</td></tr></thead><tbody><tr><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/s6kI7S4XjuitRhL1-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/s6kI7S4XjuitRhL1-grafik.png)</td><td>[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/k9Rruu0YaG3TGbcK-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/k9Rruu0YaG3TGbcK-grafik.png)</td></tr></tbody></table>

# Exponential Distort

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/U6uB5e8BIydnDIhx-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/U6uB5e8BIydnDIhx-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/ltOGR9CYDtg01lQV-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/ltOGR9CYDtg01lQV-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/poH70Ae6jBjm0jtc-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/poH70Ae6jBjm0jtc-grafik.png)

# Flip

This extension only operates on a single path (or a selection of paths, but all individually) by flipping it about the *imaginary* line that goes from the paths first node to its last node.

Source: [https://github.com/aconz2/inkscape-extension-flip](https://github.com/aconz2/inkscape-extension-flip)

## Draw some path

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/sIyRKa992PEg2tkc-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/sIyRKa992PEg2tkc-grafik.png)

## Run the extension and check result

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/IYkgSyqQJ6z1evWG-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/IYkgSyqQJ6z1evWG-grafik.png)

<div class="rwui_steps conf-macro output-block" data-hasbody="true" data-macro-name="ui-steps" id="bkmrk--2"><div class="rwui_step conf-macro output-block" data-hasbody="true" data-macro-name="ui-step"><div class="rwui_item_number">  
</div><div class="rwui_item_content">  
</div></div></div>

# Inset Alignment

This extension aligns elements into the first, last or largest selected item. The bounding box shape and some custom entered offset values are used to calculate the new position.

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/g1YIH2XntO17V8A7-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/g1YIH2XntO17V8A7-grafik.png)

## Draw some objects

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/dah9246ZPGYlwfo9-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/dah9246ZPGYlwfo9-grafik.png)

## Run the extension

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/JNsReTDAaISYA9Ag-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/JNsReTDAaISYA9Ag-grafik.png)

# Isometric Projection

Source of documentation: [https://github.com/jdhoek/inkscape-isometric-projection](https://github.com/jdhoek/inkscape-isometric-projection)

[http://jeroenhoek.nl/articles/svg-and-isometric-projection.html](http://jeroenhoek.nl/articles/svg-and-isometric-projection.html)

This extension has two modes (dimetric and isometric)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/xJwz9IZ5aIpoGJI4-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/xJwz9IZ5aIpoGJI4-grafik.png) [![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/riapspRzDy5djtbu-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/riapspRzDy5djtbu-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/gUPJxc8n10sK1Yua-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/gUPJxc8n10sK1Yua-grafik.png) [![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/WNdnZrPVSJn28tvZ-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/WNdnZrPVSJn28tvZ-grafik.png)

<p class="callout info">Also have a look at Live Path Effect "Extrude" for projections:</p>

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/an317r3o0RNnE9dr-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/an317r3o0RNnE9dr-grafik.png) [![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/4Y0eY8KtyX8ELSu4-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/4Y0eY8KtyX8ELSu4-grafik.png)

# Mirror

This function is a legacy one because the exact same can be done with Live Path Effects ("Mirror symmetry")

## Draw some objects and a path (line) to mirror

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/FQmhyWEZGSe5m5QU-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/FQmhyWEZGSe5m5QU-grafik.png)

## Make a copy of the objects you want to mirror (otherwise the tool will just move the selection)

Use Ctrl +D

## Run the extension

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/ffn2YyDAXjlpGsiD-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/ffn2YyDAXjlpGsiD-grafik.png)

If you forget to make a copy:

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/oPTxQRpDFNniHKVo-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/oPTxQRpDFNniHKVo-grafik.png)

# Normalize Drawing Scale

This extension will set the drawing scale to 100% and adds fitting transforms to keep the element size. You can use [Apply Transformations](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/apply-transformations) to apply those transforms afterwards. This neat toolchain helps to handle all path command coordinates easier. Especially helpful for import/export usage for programs which might not handle viewBox of svg:svg head correctly.

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/DnJHdgnfhbemkkvH-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/DnJHdgnfhbemkkvH-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/G9F3HOi7BI6sxywt-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/G9F3HOi7BI6sxywt-grafik.png)

# Parallel Translation

Source: [https://github.com/chris0371/parallel-translation\_extension](https://github.com/chris0371/parallel-translation_extension)

Allows parallel translations and alignment operations of selected straight lines.  
These lines can be simple path objects (with only start- and end-node) or line segments of larger path objects.

## Purpose

This extension has been written to help making a strange kind of paper cube with angles different to 90 degrees. It helps to align the faces together (probably in different arrangements, as indicated in the right side of the screenshot below) and to add complex folding flaps with lines in different colors to the edges. There are options to resize the length of the flaps so that they match the length of the edges.

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/3ag9GSZsbxFHFBaU-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/3ag9GSZsbxFHFBaU-grafik.png)

## More detailed description

The functionality of the extension is spread across different tabs of the UI. The currently selected tab determines what functionality is performed by the extension. At first glance, the individual tabs seem to have completely different functionality, but if you look closer, it all comes back to the same basic concept.

You have to tell the extension what object(s) of your drawing to use/modify by selecting them before hitting the apply-button.

### Object types to select

Within all the objects selected by you, the extension always looks for a ***line segment***, calculates its orientation angle and length, and performs some tasks based on that calculation. This line segment could be

1. a simple path object with just the start- and end-node. In such a case, you just have to select the whole path object. Or it could be
2. a line between two nodes of a larger path object. In that case, you have to select the two nodes of the path.

For the "Group-Alignment" functionality, the extension also looks for an ***alignment group***. This is a group of an arbitrary number of other objects, which is aligned to the line segment we've talked about earlier. 'Aligned' means that the group is rotated, moved, and it's width is modified to match the position, orientation and length of the line segment.

The extension assumes two things about an alignment group:

1. The group shall be in its horizontal default orientation. That means that if this group is to be aligned to a horizontal line segment drawn from left to right, it does not need to be rotated.
2. The group shall contain exactly one special object which center marks the rotation center of the whole group. It is recommended to use a circle or square or simple path for this. The extension identifies this special object by its fill-color. The color to look for can be set in the UI (at the "Group-Alignment"-tab) and defaults to neon green (#0x00FF00)

### Information Tab

This first tab contains version information and a brief explanation of extensions functionality. Hitting the 'Apply'-button in here will just show some basic information about the drawing, what objects are selected, and some basic calculations done on those objects (like length and orientation angle for the selected line segment(s).

### Translation Tab

This tab performs parallel translation of the selected line segment. That is, the extension calculates the orientation angle of the selected line segment, and moves the object by the given distance in the direction of a right angle to the lines direction.

There are options to apply the movement to just the original object, to the original object and leaving a copy at the original position, or to a copy of the object leaving the original one untouched.

There are also options to revert the movement direction and to use a fixed translation angle instead of calculating it from the original line orientation.

### Group-Alignment Tab

This tab aligns the selected group to the selected line-segment. 'Aligned' means that the group is rotated, moved, and it's width is modified to match the position, orientation and length of the line segment.

There are options to apply the alignment to just the original group, to the original group and leaving a copy at the original position, or to a copy of the group leaving the original one untouched. Further, there are different options to adjust the width of the aligned group.

There are also options to apply an additional rotation of 180 degrees to the group and to auto-remove the group rotation center object from the aligned group.

For the strange-paper-cube example, this functionality can be used to place the folding flaps at the straight but odd-angeled edges of the faces.

### Object-to-Group Tab

This tab is used to turn an ordinary object into an alignment group. This is done by rotating the object so that the selected line-segment is in horizontal orientation, adding a group rotation center object at the middle of the selected line-segment, and then group the objects together.

For the strange-paper-cube example, this functionality can be used to align the faces of the cube together. Moving and rotating face A to align one of its edges with the corresponding edge of a fixed face B would be a 2-step-process like this:

1. Select the line-segment to be aligned from face A and turn the object that makes up the face into an alignment group using the Object-to-Group tab.
2. Select this group and the line-segment to be aligned with from face B. Then align just this group (no copies) using the Group-Alignment tab with no group width adjustment.

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/ORt9dqQ4NSrfFaOE-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/ORt9dqQ4NSrfFaOE-grafik.png) [![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/jcSSQ9E6hSlHjVrf-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/jcSSQ9E6hSlHjVrf-grafik.png) [![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/B3wKxEMLvXMuWURz-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/B3wKxEMLvXMuWURz-grafik.png) [![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/1O9OJrFqrtbiW6xg-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/1O9OJrFqrtbiW6xg-grafik.png)

# Raster Perspective

Source: [https://github.com/s1291/InkRasterPerspective](https://github.com/s1291/InkRasterPerspective)

Apply a perspective transformation to bitmap image using the selected path as envelope, without the need to use an external software to transform the image. Select the raster image and the quadrangle path (envelope).

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/DYerz46jgl86280z-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/DYerz46jgl86280z-grafik.png)

# Rotations - Minimum Bounding Box Area / Minimum Width / Find All Optimal

There are three extension from [https://github.com/hobzcalvin/LaserPrep](https://github.com/hobzcalvin/LaserPrep) which allow optimal rotation according to width or bounding box.

## Rotate for Minimum Width

Helpful when trying to nest objects, this extension rotates all selected objects to minimize their width.

## Rotate for Minimum Bounding Box Area

Similarly, this rotates all selected objects to minimize the area of their bounding boxes.

## Find All Optimal Rotations

This rotates the selected objects to minimize the width and area of their bounding boxes. If these are optimized at different angles, the objects are duplicated and rotated accordingly.

## Having some rotated object(s)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/qDhA4b4YC3mKXQ5d-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/qDhA4b4YC3mKXQ5d-grafik.png)

## Run the extension

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/16K5rqjA3uIusD6p-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/16K5rqjA3uIusD6p-grafik.png)

# Scale To Path Length

This effect makes the length of all the destination paths the same as that of the source path, while maintaining their shapes. The source is the topmost path in the selection.

Please note if the size seems incorrect after running this extension, please check if you have left some transformations. They can be removed by [Apply Transformations](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/apply-transformations).

## Draw some paths

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/GSj4zIJUSSe8ZoaS-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/GSj4zIJUSSe8ZoaS-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/vCuWIJDZ1KaRJhCH-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/vCuWIJDZ1KaRJhCH-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/d4w5eBIijsXucguY-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/d4w5eBIijsXucguY-grafik.png)

## Measure to check

Visualize Path → Measure Path

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/GjIc6uieSpClw4Lw-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/GjIc6uieSpClw4Lw-grafik.png)

See also

- [Scale To Size (Replaced by default transform scale)](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/scale-to-size-replaced-by-default-transform-scale)
- [Scale To Real](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/scale-to-real)

# Scale To Real

Good description for this plugin can be found at the source → [https://gitlab.com/Moini/inkscape-realscale-extension](https://gitlab.com/Moini/inkscape-realscale-extension)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/fqAnQNHGRXY2NuGD-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/fqAnQNHGRXY2NuGD-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/Y7iZlyiLuGegNj8f-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/Y7iZlyiLuGegNj8f-grafik.png)

See also

- [Scale To Size (Replaced by default transform scale)](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/scale-to-size-replaced-by-default-transform-scale)
- [Scale To Path Length](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/scale-to-path-length)

# Scale To Size (Replaced by default transform scale)

## Draw some objects / paths

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/5pOqOwf9u2jtc4MU-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/5pOqOwf9u2jtc4MU-grafik.png)

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/D02PdEQr95Podxjz-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/D02PdEQr95Podxjz-grafik.png)

## Get the result

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/mPrIJ2EcHIuq3coc-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/mPrIJ2EcHIuq3coc-grafik.png)

<p class="callout info">This extension is obsolete because we can do the same with default transformation menu:</p>

[![grafik.png](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/scaled-1680-/x9shFjpQAMxzBzqB-grafik.png)](https://wiki.stadtfabrikanten.org/uploads/images/gallery/2025-05/x9shFjpQAMxzBzqB-grafik.png)

See also

- [Scale To Path Length](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/scale-to-path-length)
- [Scale To Real](https://wiki.stadtfabrikanten.org/books/fablab-chemnitz/page/scale-to-real)

# Set View Box (Replaced by CTRL + SHIFT + R)

<div class="page view" id="bkmrk-this-plugins-allows-"><article>This plugins allows to adjust the view box (canvas) size according to a drawn rectangle. <s>You can do this using CTRL +D too but it might be quicker sometimes using "Set View Box".</s> Use the built-in default key combination to quickly resize the view to the selected object (CTRL + SHIFT + R).

<div class="wiki-content" id="bkmrk-"></div></article></div>