Een cube met afgeronde hoeken doe je met minkowski()

Voorbeeld:

side_x = 150.0;
side_y = 100.0;
side_z =  10.0;
corner =   5.0;
  
x1 = side_x - corner * 2;
y1 = side_y - corner * 2;
z1 = side_z/2;

minkowski() {
  cube([ x1, y1, z1], true);
  cylinder(h = z1, r = corner, center = true);
}

minkowski kende ik niet, bedankt @marcob!

het kan (voor 1 "hoek") ook door een union van het ene been en het andere been en een kwart van een cylinderwand. Die laatste is een verschil van een buitencylinder minus een binnencylinder en daar dan nog eens 180 graden en 90 graden van afgetrokken.

Minkovski is T**** traag.


module fourcorners ()
{
  children ();
  mirror ([1,0,0]) children ();
  mirror ([0,1,0]) children ();
  rotate (180)     children ();
}
module rcube (s, r)
{
  x2 = s[0]/2-r;
  y2 = s[1]/2-r;
  z  = s[2];

  hull () {
    fourcorners () translate ([x2, y2,0]) cylinder (r=r, h=z);
  }
}
module bak (size, wt, r)
{
  difference () {
     rcube (size, r);
     s = [ size[0] - 2*wt, size[1] - 2*wt, size[2]];

     translate ([0,0,wt]) rcube (s, r-wt);
  }
}

bak ([100,50,10],2,10);

(Als ik dit voor mezelf maak, dan maak ik een extra "bottom thickness" parameter: Die hoeft niet zo dik als de wanden.)

@

Op woensdag 16 juli 2025 13:43:56 schreef Paulinha_B:
... een buitencylinder minus een binnencylinder en daar dan nog eens 180 graden 90 graden van afgetrokken.

Dit zou ik zo doen:


intersection () {
   diference () {
     cylinder (r=r+wt, h=h);
     translate ([0,0,-1]) cylinder (r=r, h=h+2);
   }
   translate ([0,0,-.1]) cube ([r+wt+1, r+wt+1, h+2]);
}

een alternatief is


rotate_extrude (angle=90) translate ([r,0]) square ([wt,h]);

Hmm. Eigenlijk nog wel de meest elegante!

[Bericht gewijzigd door rew op (30%)]

Dank daarvoor, maar is het ook mogelijk met alleen de onderste hoeken afgerond?
(of moet ik dan met meerdere cylinders / unions aanmaken?)

Ik snap niet wat je wilt. Dus dan kan ik het niet maken. :-( Sorry.

Als je zeg de onderkant van de bak rond wil hebben, dan kan je met een hull van een sphere op de juiste positie gaan werken. Maar die afronding is eigenlijk niet fijn om te 3D printen met een FDM printer. Dus ik doe dat meestal niet....

[Bericht gewijzigd door rew op (64%)]

Ik kon ook niet goed volgen. Misschien kan er een schetsje af? Of fotografie van een voorbeeld?

De onderste 2 hoeken van het schotje moeten een radius van 10 hebben om de contouren van het bakje te volgen, de bovenste niet.


module fourcorners ()
{
  children ();
  mirror ([1,0,0]) children ();
  mirror ([0,1,0]) children ();
  rotate (180)     children ();
}

module rcube (s, r)
{
  x2 = s[0]/2-r;
  y2 = s[1]/2-r;
  z  = s[2];

  hull () {
    fourcorners () translate ([x2, y2,0]) cylinder (r=r, h=z);
  }
}
module rscube (s, r)
{
  x2 = s[0]/2-r;
  y2 = s[1]/2-r;
  z  = s[2];

  hull () {
   translate ([ x2, -y2,0]) cylinder (r=r, h=z);
   translate ([-x2, -y2,0]) cylinder (r=r, h=z);
   translate ([ x2,  y2,0])  cube ([r,r,z]);
   translate ([-x2-r,  y2,0]) cube ([r,r,z]);
  }
}

module bak (size, wt, r)
{
  difference () {
     rscube (size, r);
     s = [ size[0] - 2*wt, size[1] - 2*wt, size[2]];

     translate ([0,0,wt]) rscube (s, r-wt);
  }
}

bak ([100,50,10],2,10);

wt = 2;
h = 10;
r = 10;
*rotate_extrude (angle=90) translate ([r,0]) square ([wt,h]);


_/-\o_

Dank,

Hoe doe je dat toch zo snel?

Op woensdag 16 juli 2025 14:04:40 schreef rew:
Minkovski is T**** traag.

Dat klopt, daarom gebruik ik veel de preview mode (F5). Via de optie if ($preview) { .... laat ik dan bijvoorbeeld de PCB zien, zodat het zichtbaar wordt hoe de modules in een behuizing zitten. Zie afbeelding:

Wat doet het commando 'childeren()' eigenlijk precies, ik kan het niet goed begrijpen zoals het in de cheatsheet staat.

Mooi werk, @arco!
En ik leer hier aan snel tempo bij,

if ($preview)

kende ik ook al niet.

Mijn eigen(wijze) manier van werken is overigens om het bestand in een venster te openen in preview-mode, en dan in een ander venster te editeren, in tekstmodus. Dat komt erg dicht bij WYSIWIG!

Info over Openscad is er wel, maar héél erg verspreid helaas.
(je bent weken bezig om alles te bekijken en tegen die tijd ben je het eerste alweer vergeten... :+ )

Veel functienamen zijn ook al niet erg 'onthoudbaar'...
Voor updaten van de preview kun je toch F5 gebruiken?

[Bericht gewijzigd door Arco op (11%)]

Klopt F5 is preview.
Via de functie if ($preview) kun je niet alleen extra objecten laten zien, maar ook extra tekst. Dat kan makkelijk zijn, als totaal overzicht.

Voor updaten van de preview kun je toch F5 gebruiken?

Dat hoeft zelfs niet. Als ik in mijn editeervenster het bestand opsla/wegschrijf, dan wordt de preview in het andere venster automagisch bijgewerkt. Echt handig!

Dat weet ik, maar dat wil ik juist niet, ik wil eerst weten of het werkt voordat ik het opsla.
Werkt de wijziging niet zoals verwacht, dan kun je met Ctrl-Z simpel 'restoren'... (en met Ctrl-Y eventueel weer 'unrestoren')

Op woensdag 16 juli 2025 17:36:11 schreef Paulinha_B:
Mooi werk, @arco!
En ik leer hier aan snel tempo bij,

if ($preview)

kende ik ook al niet.

Dat voegt een stukje code toe die alleen zichtbaar is/gerenderd wordt in de preview mode.

Dus dan ZIE je niet wat je gaat krijgen. Ik snap dat een PCB waar je omheen aan het bouwen bent, nooit in het uiteindelijke ding moet komen, maar toch.

Mijn eigen(wijze) manier van werken is overigens om het bestand in een venster te openen in preview-mode, en dan in een ander venster te editeren, in tekstmodus. Dat komt erg dicht bij WYSIWIG!

Ja, dat doe ik ook. De ingebouwde editor van dingen gebruiken, dat is irritant: Ieder programma is net wat anders, en dan moet je dus de eigenaardigheden/keystrokes van allemaal verschillende editors gaan zitten onthouden. Geen zin in. Ik zet dan "automatic preview" aan en zodra ik hem save gaat openscad de nieuwe laten zien. Geen zin/niet nodig om op F5 te duwen.

Op woensdag 16 juli 2025 18:19:17 schreef Arco:
Werkt de wijziging niet zoals verwacht, dan kun je met Ctrl-Z simpel 'restoren'... (en met Ctrl-Y eventueel weer 'unrestoren')

Dat is dan zo'n eigenaardigheid van een editor die ik zou moeten leren. Mijn gebruikelijke editor (emacs) staat gewoon toe dat ik undo doe ook al heb ik hem gesaved.

Op donderdag 17 juli 2025 08:13:17 schreef rew:
Dat is dan zo'n eigenaardigheid van een editor die ik zou moeten leren. Mijn gebruikelijke editor (emacs) staat gewoon toe dat ik undo doe ook al heb ik hem gesaved.

Kan met of zonder opslaan, maar opslaan van een niet werkend ontwerp is vrij zinloos (dan kun je beter het bestaande ontwerp bewaren)
Ctrl-X en Ctrl-Y bestaan al een halve eeuw sinds de komst van een van de oerversies van de editor: Wordstar...

Het gaat er om dat er verschillen zijn. Dat search in emacs niet "control-F" is, is een voorbeeld. Dan kan je roepen dat emacs fout is, maar control-S voor "search" is eigenlijk vrij logisch en control-F is later pas uitgevonden. Ik moet ook in "browsers" werken, dus daar moet ik aan control-F wennen.

Anyway, voor openscad werk ik met m'n bestand in emacs, en moet ik een save doen om hem in openscad opnieuw gerenderd te krijgen. Als ik een wijziging doe die ik niet vertrouw, dan houd ik over het algemeen de bestaande code als "comment". En als het eenmaal werkt doe ik het in git.

Laten we niet verzanden in de goed/fout discussie. Voor de meeste onder ons is het hobby en een ieder doet het op zijn of haar manier. Laten we elkaar tips geven en helpen.

@Rew, ik zie dat jij

children ();

gebruikt, kun je uitleggen hoe dat werkt. Ik kan er in de handleiding niet goed uitkomen.

Ohja. Dat zou ik nog doen.

Als je "translate" doet, dan doet die module "IETS" met de dingen die je er achter doet. Maar ook "difference", "scale" en "rotate" zijn voorbeelden.

een module als "cube" creert een object, maar een module kan dus ook IETS doen met submodules die er achter staan.

Waarbij je dus voor getallen die een module in gaan argumenten kan maken, kan je ook andere-objecten meegeven waar je in de module iets mee kan doen.

Dus wat ik veel gebruik is "dupn": roteer n keer rond de oorsprong en plaats het sub-object op iedere positie.


module dupn (n)
{
   for (i=[0:1:n-1]) rotate (360/n*i) children ();
}

Zo krijg je dus bijvoorbeeld 10 kubusjes in een rondje om de oorsprong.

dupn (10) translate ([50,0,0])cube (10, center=true);

Ik begrijp hem, normaal maak je een module om een object meerdere malen te gebruiken, denk aan een PCB standaard bus. Maar nu maak je eigenlijk een module die een bewerking is, die je dan kunt toepassen op een cube of cilinder, wat je maar wilt.

Een andere vraag wat jullie misschien wel weten (ik kan het niet vinden op internet)
Met difference () kun je twee objecten van elkaar delen, dat is me duidelijk. Nu maak ik gebruik van standaard modules die ik zelf heb gemaakt, neem als voorbeeld een Raspberry Pi. Nu bestaat dat uit twee modules, de ene is vier keer een PCB stand op de juiste maat. En de tweede module zijn de cut-outs voor de behuizing. Nu doe ik dat zoals hieronder, twee losse modules. Met het nadeel dat ik altijd de translate hetzelfde moet houden. Mijn vraag zou het ook in 1 module kunnen?

difference() {
  union() {
    housing();
    translate([ 10, 10, 0])
       raspberry();
  }
 translate([ 10, 10, 0])
    raspberry_cut();
}

Dus hier kan je een RPI_POS module maken:

module rpi_pos() translate ([10, 10, 0]) children (); 

Zelf zou ik in dat geval liever de housing naar -10, -10 verhuizen, maar goed, dat kan niet altijd.

Nu ben je me kwijt. Ten eerste de translate is enkel als voorbeeld.
module raspberry() zijn de vier bevestigingsstuds.
module raspberry_cut() zijn de cutouts voor in de wand.
Mijn vraag is eigenlijk, kan ik één module maken die zowel de studs als de cut-outs bevat?

Kan dit met children (); ? Hou komt het er dan uit te zien?

Op donderdag 17 juli 2025 18:32:17 schreef marcob:
Nu ben je me kwijt. Ten eerste de translate is enkel als voorbeeld.
module raspberry() zijn de vier bevestigingsstuds.
module raspberry_cut() zijn de cutouts voor in de wand.
Mijn vraag is eigenlijk, kan ik één module maken die zowel de studs als de cut-outs bevat?

Kan dit met children (); ? Hou komt het er dan uit te zien?

Nee. Niet echt.


difference() {
  union() {
    translate([ -10, -10, 0]) housing();
    raspberry();
  }
  raspberry_cut();
}

Dit bedoel ik met "1 translate".

Ik doe het wel eens zo:


module rpi(cut)
{
  if (cut)
    raspberry_cut();
  else 
    raspberry();
}

module rpi_pos () translate ([10,10,0]) children ();

[code]
difference() {
  union() {
    housing();
    rpi_pos () rpi (0);
  }
  rpi_pois () rpi (1); 
}