<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<?xml-stylesheet href="https://www.baszerr.eu/lib/exe/css.php?s=feed" type="text/css"?>
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>BaSzErr - blog:2022:04:07</title>
        <description></description>
        <link>https://www.baszerr.eu/</link>
        <lastBuildDate>Wed, 06 May 2026 09:37:59 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <image>
            <url>https://www.baszerr.eu/lib/exe/fetch.php?media=wiki:dokuwiki.svg</url>
            <title>BaSzErr</title>
            <link>https://www.baszerr.eu/</link>
        </image>
        <item>
            <title>2022-04-07_-_importing_svg_in_openscad</title>
            <link>https://www.baszerr.eu/doku.php?id=blog:2022:04:07:2022-04-07_-_importing_svg_in_openscad</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;importing_svg_in_openscad&quot;&gt;2022-04-07 - importing SVG in OpenSCAD&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
that&amp;#039;s simple – there&amp;#039;s &lt;a href=&quot;https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/SVG_Import&quot; class=&quot;urlextern&quot; title=&quot;https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/SVG_Import&quot; rel=&quot;ugc nofollow&quot;&gt;import()&lt;/a&gt; call in &lt;a href=&quot;https://en.wikipedia.org/wiki/OpenSCAD&quot; class=&quot;interwiki iw_wp&quot; title=&quot;https://en.wikipedia.org/wiki/OpenSCAD&quot;&gt;OpenSCAD&lt;/a&gt;, that handles that, right?
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;file.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
and we&amp;#039;re done! except we sometimes don&amp;#039;t…
&lt;/p&gt;

&lt;p&gt;
i&amp;#039;ve been using &lt;code&gt;import()&lt;/code&gt; in the past w/o issues. yet recently, i stumbled across model made by some1 else, that failed to import correctly. when rendering, it thrown:
&lt;/p&gt;
&lt;pre class=&quot;code&quot;&gt;ERROR: The given mesh is not closed! Unable to convert to CGAL_Nef_Polyhedron., location unknown.&lt;/pre&gt;

&lt;p&gt;
quick &lt;a href=&quot;https://duckduckgo.com&quot; class=&quot;urlextern&quot; title=&quot;https://duckduckgo.com&quot; rel=&quot;ugc nofollow&quot;&gt;duck-ducking&lt;/a&gt; and it turned out, that some programs &lt;a href=&quot;https://forum.openscad.org/problem-with-SVG-import-td31295.html&quot; class=&quot;urlextern&quot; title=&quot;https://forum.openscad.org/problem-with-SVG-import-td31295.html&quot; rel=&quot;ugc nofollow&quot;&gt;make tiny holes where self-intersecting polygons are&lt;/a&gt; and this causes issues. manual edition was not an option, because model could be changed in the future and trial-and-error search for such spots would be a real pain in the back. more over &lt;a href=&quot;https://github.com/openscad/openscad/issues/3430&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/openscad/openscad/issues/3430&quot; rel=&quot;ugc nofollow&quot;&gt;OpenSCAD does not close open paths&lt;/a&gt; (see &lt;a href=&quot;https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/SVG_Import#Open_and_closed_shapes&quot; class=&quot;urlextern&quot; title=&quot;https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/SVG_Import#Open_and_closed_shapes&quot; rel=&quot;ugc nofollow&quot;&gt;known limitations of import() module&lt;/a&gt; for SVG files). so how do you close these?
&lt;/p&gt;

&lt;p&gt;
turned out there is a nice trick to overcome this – using &lt;a href=&quot;https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#offset&quot; class=&quot;urlextern&quot; title=&quot;https://en.wikibooks.org/wiki/OpenSCAD_User_Manual/Transformations#offset&quot; rel=&quot;ugc nofollow&quot;&gt;offset()&lt;/a&gt; module from OpenSCAD, with some small value as a parameter:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;offset&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu16&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;file.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
…and boom! the problem solved! offsetting closed micro gaps, forming a correct, closed shape. the nice thing is that one can use this technique on any model. in fact i now start to use it everywhere, to cut myself from this kind of issues in the future. :D
&lt;/p&gt;

&lt;/div&gt;
</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 07 Apr 2022 11:26:04 +0000</pubDate>
        </item>
        <item>
            <title>2022-04-07_-_object_frame_in_openscad</title>
            <link>https://www.baszerr.eu/doku.php?id=blog:2022:04:07:2022-04-07_-_object_frame_in_openscad</link>
            <description>
&lt;h1 class=&quot;sectionedit1&quot; id=&quot;object_frame_in_openscad&quot;&gt;2022-04-07 - object frame in OpenSCAD&lt;/h1&gt;
&lt;div class=&quot;level1&quot;&gt;

&lt;p&gt;
recently i was asked to help with creating a mode for 3d printing. as usual, i took &lt;a href=&quot;https://en.wikipedia.org/wiki/OpenSCAD&quot; class=&quot;interwiki iw_wp&quot; title=&quot;https://en.wikipedia.org/wiki/OpenSCAD&quot;&gt;OpenSCAD&lt;/a&gt; for the job. the model was a fairly straight-forward extrusion of a flat SVG file, with some minor adjustments here and there. however there was a catch – what was also needed was a “slot” for this figure, to but put in, with a nice, rounded tops. oh – and one more thing – there are indentations on sides, so that it is easier to took grab models out from the “slot”. also nice, and rounded.
&lt;/p&gt;

&lt;p&gt;
with a hand from &lt;a href=&quot;https://en.wikipedia.org/wiki/Hermann Minkowski&quot; class=&quot;interwiki iw_wp&quot; title=&quot;https://en.wikipedia.org/wiki/Hermann Minkowski&quot;&gt;Hermann Minkowski&lt;/a&gt; (namely &lt;a href=&quot;https://en.wikipedia.org/wiki/Minkowski addition&quot; class=&quot;interwiki iw_wp&quot; title=&quot;https://en.wikipedia.org/wiki/Minkowski addition&quot;&gt;Minkowski addition&lt;/a&gt;) it turned out to be fairly easy to code, yet computationally intensive to execute. let&amp;#039;s get started!
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;2022-04-07 - object frame in OpenSCAD&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;object_frame_in_openscad&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:1,&amp;quot;range&amp;quot;:&amp;quot;1-731&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit2&quot; id=&quot;input_model&quot;&gt;input model&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
the tricky part, that got me thinking in a first place, was what the shape was very complex. it was not a mechanical model i&amp;#039;m used to work with, but instead an artistic shape, that had no square angles anywhere. more over the model was also a work-in-progress, and thus a subject to change. this meant that if i try to hardcode sth like shape&amp;#039;s external border, not only i&amp;#039;d do a lot of extra work, but also i&amp;#039;d have to throw the whole thing out of the window, on a very first change to the input model.
&lt;/p&gt;

&lt;p&gt;
the original model is both copyrighted and not public, so for the sake of discussion, let&amp;#039;s use following, random hand drawing of mine, as an input:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.baszerr.eu/lib/exe/detail.php?id=blog%3A2022%3A04%3A07%3A2022-04-07_-_object_frame_in_openscad&amp;amp;media=blog:2022:04:07:random_shape.png&quot; class=&quot;media&quot; title=&quot;blog:2022:04:07:random_shape.png&quot;&gt;&lt;img src=&quot;https://www.baszerr.eu/lib/exe/fetch.php?w=400&amp;amp;tok=6bab52&amp;amp;media=blog:2022:04:07:random_shape.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; title=&quot;random input shape&quot; alt=&quot;random input shape&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;input model&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;input_model&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:2,&amp;quot;range&amp;quot;:&amp;quot;732-1475&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit3&quot; id=&quot;importing_model&quot;&gt;importing model&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
that one was simple. well… almost. as i wrote before &lt;a href=&quot;https://www.baszerr.eu/doku.php?id=blog:2022:04:07:2022-04-07_-_importing_svg_in_openscad&quot; class=&quot;wikilink1&quot; title=&quot;blog:2022:04:07:2022-04-07_-_importing_svg_in_openscad&quot; data-wiki-id=&quot;blog:2022:04:07:2022-04-07_-_importing_svg_in_openscad&quot;&gt;OpenSCAD have issues with some SVGs during importing&lt;/a&gt;. so the final code is:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;eps &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu16&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
module model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  offset&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;eps&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;random_shape.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
so we now have contour of the input shape ready.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.baszerr.eu/lib/exe/detail.php?id=blog%3A2022%3A04%3A07%3A2022-04-07_-_object_frame_in_openscad&amp;amp;media=blog:2022:04:07:step_1_top.png&quot; class=&quot;media&quot; title=&quot;blog:2022:04:07:step_1_top.png&quot;&gt;&lt;img src=&quot;https://www.baszerr.eu/lib/exe/fetch.php?w=400&amp;amp;tok=c9ff65&amp;amp;media=blog:2022:04:07:step_1_top.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; title=&quot;top view of the imported shape&quot; alt=&quot;top view of the imported shape&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;importing model&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;importing_model&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:0,&amp;quot;secid&amp;quot;:3,&amp;quot;range&amp;quot;:&amp;quot;1476-1929&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit4&quot; id=&quot;extending&quot;&gt;extending&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
as a next step we need to increase perimeters of the model, by wall thickness + some spacing.
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;eps &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu16&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
wall &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
wall_h &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
spacing &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
module model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  offset&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;eps&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
module model_slot_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  module extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    minkowski&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      circle&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  module frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    difference&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;spacing &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; wall&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nu16&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;co2&quot;&gt;#extended_base(spacing + wall/2);&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
model_slot_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;random_shape.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
the idea is to have &lt;a href=&quot;https://en.wikipedia.org/wiki/Minkowski addition&quot; class=&quot;interwiki iw_wp&quot; title=&quot;https://en.wikipedia.org/wiki/Minkowski addition&quot;&gt;Minkowski addition&lt;/a&gt; of the input shape (SVG import) and a circle. this (effectively) extend side walls. by marking internal model in red we can see external base marked in yellow… and this is the only part that actually stays. for the sake of visibility i&amp;#039;ve increased spacing in above code from &lt;code&gt;0.5&lt;/code&gt; to &lt;code&gt;4&lt;/code&gt;.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.baszerr.eu/lib/exe/detail.php?id=blog%3A2022%3A04%3A07%3A2022-04-07_-_object_frame_in_openscad&amp;amp;media=blog:2022:04:07:step_2_top_small.png&quot; class=&quot;media&quot; title=&quot;blog:2022:04:07:step_2_top_small.png&quot;&gt;&lt;img src=&quot;https://www.baszerr.eu/lib/exe/fetch.php?w=400&amp;amp;tok=5208ab&amp;amp;media=blog:2022:04:07:step_2_top_small.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; title=&quot;internal part&quot; alt=&quot;internal part&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://www.baszerr.eu/lib/exe/detail.php?id=blog%3A2022%3A04%3A07%3A2022-04-07_-_object_frame_in_openscad&amp;amp;media=blog:2022:04:07:step_2_top_thick.png&quot; class=&quot;media&quot; title=&quot;blog:2022:04:07:step_2_top_thick.png&quot;&gt;&lt;img src=&quot;https://www.baszerr.eu/lib/exe/fetch.php?w=400&amp;amp;tok=815dc8&amp;amp;media=blog:2022:04:07:step_2_top_thick.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; title=&quot;external part (yellow) with subtraction of internal one (red)&quot; alt=&quot;external part (yellow) with subtraction of internal one (red)&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;extending&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;extending&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:1,&amp;quot;secid&amp;quot;:4,&amp;quot;range&amp;quot;:&amp;quot;1930-3025&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit5&quot; id=&quot;cut-ins_for_fingers&quot;&gt;cut-ins for fingers&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
as a next step we had to remove some part of the wall, to make space to allow grabbing the model with ones&amp;#039; fingers.
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;eps &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu16&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
wall &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
wall_h &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
spacing &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
module model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  offset&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;eps&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
module shape_placeholder&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  linear_extrude&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;random_shape.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
module model_slot_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  module extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    minkowski&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      circle&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  module frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    difference&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;spacing &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; wall&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nu16&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;spacing &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; wall&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  module cut_in_frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    difference&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span class=&quot;co1&quot;&gt;// model&lt;/span&gt;
      frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;co1&quot;&gt;// side wall cuts&lt;/span&gt;
      children&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  cut_in_frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    children&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
module model_slot&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  intersection&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    model_slot_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
      &lt;span class=&quot;co2&quot;&gt;#children();&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;// cut-off for the bottom roundings&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;// we&#039;re only interested in the top of the model&lt;/span&gt;
    translate&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
      cube&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;sy0&quot;&gt;%&lt;/span&gt;shape_placeholder&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
model_slot&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;random_shape.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// some location(s) that shall be removed from the overall shape:&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// bottom&lt;/span&gt;
  translate&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    square&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// top&lt;/span&gt;
  translate&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;110&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    square&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
that&amp;#039;s the bottom most part, where two squares are removed from the perimeters created in a step before. again, for readability these are marked in red.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.baszerr.eu/lib/exe/detail.php?id=blog%3A2022%3A04%3A07%3A2022-04-07_-_object_frame_in_openscad&amp;amp;media=blog:2022:04:07:step_3_top.png&quot; class=&quot;media&quot; title=&quot;blog:2022:04:07:step_3_top.png&quot;&gt;&lt;img src=&quot;https://www.baszerr.eu/lib/exe/fetch.php?w=400&amp;amp;tok=ff57da&amp;amp;media=blog:2022:04:07:step_3_top.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; title=&quot;removed parts for fingers&quot; alt=&quot;removed parts for fingers&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;cut-ins for fingers&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;cut-ins_for_fingers&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:2,&amp;quot;secid&amp;quot;:5,&amp;quot;range&amp;quot;:&amp;quot;3026-4564&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit6&quot; id=&quot;walls_and_roundings&quot;&gt;walls and roundings&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
so how to create walls out from it? that&amp;#039;s simple now – we need to &lt;code&gt;linear_extrude()&lt;/code&gt; the 2D shape we&amp;#039;ve created so far and then again use Minkowski addition of the shape, with the sphere. last but not least, we remove bottom part with &lt;code&gt;intersection()&lt;/code&gt; of the shape and &lt;code&gt;cube()&lt;/code&gt;. so we get:
&lt;/p&gt;
&lt;pre class=&quot;code c&quot;&gt;eps &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu16&quot;&gt;0.01&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
wall &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
wall_h &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
spacing &lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
module model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  offset&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;eps&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;file&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
module shape_placeholder&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  linear_extrude&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;random_shape.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
module model_slot_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  module extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    minkowski&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      model_import&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      circle&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  module frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    difference&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;spacing &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; wall&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nu16&quot;&gt;0.5&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      extended_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;spacing &lt;span class=&quot;sy0&quot;&gt;+&lt;/span&gt; wall&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  module cut_in_frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    difference&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span class=&quot;co1&quot;&gt;// model&lt;/span&gt;
      frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;wall&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;co1&quot;&gt;// side wall cuts&lt;/span&gt;
      children&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  cut_in_frame&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    children&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
module model_slot&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  intersection&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
    minkowski&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
      linear_extrude&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;wall_h&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
        model_slot_base&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;name&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
          children&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
      sphere&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;r&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;wall&lt;span class=&quot;sy0&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; $fn&lt;span class=&quot;sy0&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;co1&quot;&gt;// $fn here determines compilation times!&lt;/span&gt;
    &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;// cut-off for the bottom roundings&lt;/span&gt;
    &lt;span class=&quot;co1&quot;&gt;// we&#039;re only interested in the top of the model&lt;/span&gt;
    translate&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
      cube&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;300&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span class=&quot;sy0&quot;&gt;%&lt;/span&gt;shape_placeholder&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
model_slot&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;st0&quot;&gt;&amp;quot;random_shape.svg&amp;quot;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// some location(s) that shall be removed from the overall shape:&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// bottom&lt;/span&gt;
  translate&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;sy0&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    square&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;co1&quot;&gt;// top&lt;/span&gt;
  translate&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;110&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;
    square&lt;span class=&quot;br0&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span class=&quot;nu0&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nu0&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span class=&quot;br0&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span class=&quot;sy0&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;br0&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;p&gt;
so we finally got this:
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.baszerr.eu/lib/exe/detail.php?id=blog%3A2022%3A04%3A07%3A2022-04-07_-_object_frame_in_openscad&amp;amp;media=blog:2022:04:07:complete.png&quot; class=&quot;media&quot; title=&quot;blog:2022:04:07:complete.png&quot;&gt;&lt;img src=&quot;https://www.baszerr.eu/lib/exe/fetch.php?w=600&amp;amp;tok=a7147d&amp;amp;media=blog:2022:04:07:complete.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; title=&quot;complete shape&quot; alt=&quot;complete shape&quot; width=&quot;600&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
and here&amp;#039;s top view, with original shape mocked, to show proper spacing.
&lt;/p&gt;

&lt;p&gt;
&lt;a href=&quot;https://www.baszerr.eu/lib/exe/detail.php?id=blog%3A2022%3A04%3A07%3A2022-04-07_-_object_frame_in_openscad&amp;amp;media=blog:2022:04:07:final_shape_with_element_mock.png&quot; class=&quot;media&quot; title=&quot;blog:2022:04:07:final_shape_with_element_mock.png&quot;&gt;&lt;img src=&quot;https://www.baszerr.eu/lib/exe/fetch.php?w=400&amp;amp;tok=75463a&amp;amp;media=blog:2022:04:07:final_shape_with_element_mock.png&quot; class=&quot;media&quot; loading=&quot;lazy&quot; title=&quot;top view with element mock&quot; alt=&quot;top view with element mock&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
you can download &lt;a href=&quot;https://www.baszerr.eu/lib/exe/fetch.php?media=blog:2022:04:07:frame.stl.gz&quot; class=&quot;media mediafile mf_gz&quot; title=&quot;blog:2022:04:07:frame.stl.gz (570.9 KB)&quot;&gt; STL file of a generated model&lt;/a&gt; as well.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;walls and roundings&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;walls_and_roundings&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:3,&amp;quot;secid&amp;quot;:6,&amp;quot;range&amp;quot;:&amp;quot;4565-6533&amp;quot;} --&gt;
&lt;h2 class=&quot;sectionedit7&quot; id=&quot;final_notes&quot;&gt;final notes&lt;/h2&gt;
&lt;div class=&quot;level2&quot;&gt;

&lt;p&gt;
here&amp;#039;s a github project &lt;a href=&quot;https://github.com/el-bart/soft_playground/tree/master/openscad_svg_frame&quot; class=&quot;urlextern&quot; title=&quot;https://github.com/el-bart/soft_playground/tree/master/openscad_svg_frame&quot; rel=&quot;ugc nofollow&quot;&gt;containing both the input model and final OpenSCAD code&lt;/a&gt; if you&amp;#039;d like to play around.
&lt;/p&gt;

&lt;p&gt;
Minkowski addition is an excellent tool to work with difficult shapes, creating roundings, etc… it does however come with at a price. for any non-trivial shape this is not only computationally expensive but also OpenSCAD is not able to utilize multiple threads to compute it. for the above example, when sphere&amp;#039;s &lt;code&gt;$fn&lt;/code&gt; (&lt;abbr title=&quot;Too long; didn&amp;#039;t read&quot;&gt;TL;DR&lt;/abbr&gt; – parameter controlling number of facets of round objects) was left default (around &lt;code&gt;10&lt;/code&gt; for sphere of this size) it computed for almost 8 minutes. when i increased it to &lt;code&gt;20&lt;/code&gt;, to smooth the edges, i&amp;#039;ve ended up with 37 minutes of compilation!
&lt;/p&gt;

&lt;p&gt;
so what do i think about the transformation? i love it, but i&amp;#039;d strongly suggest to use with care. if possible to solve the issue otherwise, i&amp;#039;d suggest to try that one first.
&lt;/p&gt;

&lt;/div&gt;
&lt;!-- EDIT{&amp;quot;target&amp;quot;:&amp;quot;section&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;final notes&amp;quot;,&amp;quot;hid&amp;quot;:&amp;quot;final_notes&amp;quot;,&amp;quot;codeblockOffset&amp;quot;:4,&amp;quot;secid&amp;quot;:7,&amp;quot;range&amp;quot;:&amp;quot;6534-&amp;quot;} --&gt;</description>
            <author>anonymous@undisclosed.example.com (Anonymous)</author>
            <pubDate>Thu, 07 Apr 2022 11:59:49 +0000</pubDate>
        </item>
    </channel>
</rss>
