« OpenSCAD : LOL-SCAD » : différence entre les versions
Aucun résumé des modifications |
Aucun résumé des modifications |
||
Ligne 12 : | Ligne 12 : | ||
Si vous réalisez un '''echo''' de la variable '''moncarre''', la console affichera : [[-1.5,-2],[-1.5,2],[1.5,2],[-1.5,2]]. Le fait d'avoir votre forme sous forme de variable vous permet par la suite de réaliser des opérations directement sur les vecteurs composants votre forme. | Si vous réalisez un '''echo''' de la variable '''moncarre''', la console affichera : [[-1.5,-2],[-1.5,2],[1.5,2],[-1.5,2]]. Le fait d'avoir votre forme sous forme de variable vous permet par la suite de réaliser des opérations directement sur les vecteurs composants votre forme. | ||
---- | ---- | ||
== Variables == | |||
Plusieurs variables de base ont été ajoutées : <syntaxhighlight lang="openscad"> | |||
phi = (1+sqrt(5))/2/1; | |||
aphi = phi-1; | |||
biphi = phi+1; | |||
angledor = 360/biphi; | |||
py = sqrt(0.5); | |||
bipy = sqrt(2); | |||
pi = 3.141592654/1; | |||
tau = pi*2; | |||
</syntaxhighlight>ainsi que plusieurs couleurs :<syntaxhighlight lang="openscad">blue = [0,0,1,1]; | |||
red = [1,0,0,1]; | |||
green = [0,1,0,1]; | |||
violet = [0.5,0,0.5,1]; | |||
yellow = [1,1,0,1]; | |||
cyan = [0,1,1,1]; | |||
black = [0,0,0,1]; | |||
white = [1,1,1,1]; | |||
oak = RVB(200,50,90,255); | |||
orange = [1,0.5,0,1]; | |||
olive = [0.5,0.5,0,1]; | |||
sarcelle = [0,0.5,0.5,1]; | |||
marine = [0,0,0.5,1]; | |||
fuschia = [1,0,1,1]; | |||
glass = [1,0,1,0.2]; | |||
bleu = [0,0,1,1]; | |||
rouge = [1,0,0,1]; | |||
vert = [0,1,0,1]; | |||
jaune = [1,1,0,1]; | |||
noir = [0,0,0,1]; | |||
blanc = [1,1,1,1]; | |||
gris = [0.5,0.5,0.5,1]; | |||
gray = [0.5,0.5,0.5,1]; | |||
pink = RVB(255,107,219,255);</syntaxhighlight>Et des formes pour la librairie : <syntaxhighlight lang="openscad"> | |||
LogoFB= [[4.46567, 4.99666], [3.06433, 4.99666], [3.06433, 0], [0.987666, 0], [0.987666, 4.99666], [0, 4.99666], [0, 6.76134], [0.987666, 6.76134], [0.987666, 7.90467], [1.00769, 8.22956], [1.07504, 8.57716], [1.20063, 8.92712], [1.39537, 9.25909], [1.6702, 9.55271], [2.03602, 9.78764], [2.50376, 9.94352], [3.08433, 10], [4.62167, 9.99402], [4.62167, 8.28068], [3.505, 8.28068], [3.35933, 8.26038], [3.21662, 8.18648], [3.10811, 8.0397], [3.065, 7.80073], [3.065, 6.76073], [4.64833, 6.76073]]; | |||
LetterL=[[0,0],[0,70],[22,73],[19,21],[50,25],[48,-1],[0,0]]; | |||
LetterO=[[0,35],[6.25,61.25],[25,70],[25,70],[43.75,61.25],[50,35],[43.75,8.75],[25,0],[6.25,8.75],[0,35]]; | |||
</syntaxhighlight> | |||
== Fonctions sur nombres == | == Fonctions sur nombres == |
Dernière version du 1 octobre 2025 à 19:36
Le but de LOLScad est de permettre l'utilisation de formes en tant que variable afin de permettre de nouvelles formes et transformations.
Cela change en profondeur la manière d'utiliser OpenSCAD. Par exemple, pour faire un carré :
Avant
square([3,4],center=true);
Après
moncarre = square([3,4],center=true);
2D(moncarre);
La différence ?
Si vous réalisez un echo de la variable moncarre, la console affichera : [[-1.5,-2],[-1.5,2],[1.5,2],[-1.5,2]]. Le fait d'avoir votre forme sous forme de variable vous permet par la suite de réaliser des opérations directement sur les vecteurs composants votre forme.
Variables
Plusieurs variables de base ont été ajoutées :
phi = (1+sqrt(5))/2/1;
aphi = phi-1;
biphi = phi+1;
angledor = 360/biphi;
py = sqrt(0.5);
bipy = sqrt(2);
pi = 3.141592654/1;
tau = pi*2;
ainsi que plusieurs couleurs :
blue = [0,0,1,1];
red = [1,0,0,1];
green = [0,1,0,1];
violet = [0.5,0,0.5,1];
yellow = [1,1,0,1];
cyan = [0,1,1,1];
black = [0,0,0,1];
white = [1,1,1,1];
oak = RVB(200,50,90,255);
orange = [1,0.5,0,1];
olive = [0.5,0.5,0,1];
sarcelle = [0,0.5,0.5,1];
marine = [0,0,0.5,1];
fuschia = [1,0,1,1];
glass = [1,0,1,0.2];
bleu = [0,0,1,1];
rouge = [1,0,0,1];
vert = [0,1,0,1];
jaune = [1,1,0,1];
noir = [0,0,0,1];
blanc = [1,1,1,1];
gris = [0.5,0.5,0.5,1];
gray = [0.5,0.5,0.5,1];
pink = RVB(255,107,219,255);
Et des formes pour la librairie :
LogoFB= [[4.46567, 4.99666], [3.06433, 4.99666], [3.06433, 0], [0.987666, 0], [0.987666, 4.99666], [0, 4.99666], [0, 6.76134], [0.987666, 6.76134], [0.987666, 7.90467], [1.00769, 8.22956], [1.07504, 8.57716], [1.20063, 8.92712], [1.39537, 9.25909], [1.6702, 9.55271], [2.03602, 9.78764], [2.50376, 9.94352], [3.08433, 10], [4.62167, 9.99402], [4.62167, 8.28068], [3.505, 8.28068], [3.35933, 8.26038], [3.21662, 8.18648], [3.10811, 8.0397], [3.065, 7.80073], [3.065, 6.76073], [4.64833, 6.76073]];
LetterL=[[0,0],[0,70],[22,73],[19,21],[50,25],[48,-1],[0,0]];
LetterO=[[0,35],[6.25,61.25],[25,70],[25,70],[43.75,61.25],[50,35],[43.75,8.75],[25,0],[6.25,8.75],[0,35]];
Fonctions sur nombres
Random
Paramètres
- n : nombre entre 0 et ce nombre.
- s : "seed", il faut changer ce nombre pour avoir un aléatoire différent (OpenSCAD ne gère pas directement un aléa basé sur une variable externe telle que l'heure, etc.)
- pos : indique si le nombre peut être négatif, auquel cas l'aléa ira de -n à n.
Code de la fonction
function random (n,s,pos) = rands(pos==undef?0:pos==true?0:-n,n,1,s==undef?n:s)[0];
Exemple
echo(random(n=10,s=1,pos=true)," - ",random(n=10,s=1,pos=false));
echo(random(n=10,s=2,pos=true)," - ",random(n=10,s=2,pos=false));
echo(random(n=10,s=3,pos=true)," - ",random(n=10,s=3,pos=false));
echo(random(n=10,s=4,pos=true)," - ",random(n=10,s=4,pos=false));
echo(random(n=10,s=5,pos=true)," - ",random(n=10,s=5,pos=false));
echo(random(n=10,s=6,pos=true)," - ",random(n=10,s=6,pos=false));
echo(random(n=10,s=7,pos=true)," - ",random(n=10,s=7,pos=false));
echo(random(n=10,s=8,pos=true)," - ",random(n=10,s=8,pos=false));
echo(random(n=10,s=9,pos=true)," - ",random(n=10,s=9,pos=false));
echo(random(n=10,s=10,pos=true)," - ",random(n=10,s=10,pos=false));
Résultat console
ECHO: 9.97185, " - ", 9.9437
ECHO: 1.85082, " - ", -6.29836
ECHO: 0.707249, " - ", -8.5855
ECHO: 9.00621, " - ", 8.01243
ECHO: 0.551801, " - ", -8.8964
ECHO: 9.47476, " - ", 8.94952
ECHO: 2.27339, " - ", -5.45322
ECHO: 0.111144, " - ", -9.77771
ECHO: 3.64461, " - ", -2.71078
ECHO: 2.98761, " - ", -4.02478
Objets 2D
Tous les objets (y compris ceux d'origine d'OpenSCAD) peuvent être utilisés à la fois en tant que variable qu'en tant qu'objet classique.

Ngon
Paramètres
- d : diamètre
- fn : nombre de faces
- inside : inscrit ou non dans le diamètre
Code de la fonction
function ngon(d,fn,inside) = let (
d=d==undef?10:inside==undef?d:inside==true?d:d*((d/2)/(cos(360/fn/2)*d/2)),
fn=fn==undef?4:fn,
aa=[for(i=[0:fn])[sin(360/fn*i)*d/2,cos(360/fn*i)*d/2]]
)
aa;
Exemple
difference(){
ngon(d=5,fn=5,inside=false);
circle(d=5,$fn=64);
}
ng= ngon(d=5,fn=5,inside=true);
translate([7.5,0]) difference(){
circle(d=5,$fn=64);
2D(ng);
}

Roundsquare
Paramètres
- s : taille de l'objet sous forme [x,y]
- d : diamètres des coins sous forme [d1,d2,d3,d4]
- fn : qualité des arrondis
Code de la fonction
function roundsquare(s,d,fn) = let (
fn = fn == undef ? 8:fn,
s = s == undef ? [15,20] : s,
d = d == undef ? [3,6,3,6] : len(d) == 1 ? [d[0]/2,d[0]/2,d[0]/2,d[0]/2]:len(d)==2?[d[0]/2,d[1]/2,d[1]/2,d[1]/2]:len(d)==3?[d[0]/2,d[1]/2,d[2]/2,d[2]/2]:d[0]==undef?[d/2,d/2,d/2,d/2]:d/2,
p1 = [0,0],
p2 = [0,d[0]],
p3 = [0,s[1]-d[1]],
p4 = [0,s[1]],
p5 = [d[1],s[1]],
p6 = [s[0]-d[2],s[1]],
p7 = [s[0],s[1]],
p8 = [s[0],s[1]-d[2]],
p9= [s[0],d[3]],
p10= [s[0],0],
p11= [s[0]-d[3],0],
p12= [d[0],0],
c1=curve([p3,p4,p5],fn=fn),
c2=curve([p6,p7,p8],fn=fn),
c3=curve([p9,p10,p11],fn=fn),
c4=curve([p12,p1,p2],fn=fn),
aa=clean(join2([c1,c2,c3,c4,[p3]]))
)
aa;
Exemple
roundsquare(s=[10,5],d=[5,4,5,1],fn=8);
translate([11,0]) roundsquare(s=[10,5],d=[9,1,9,1],fn=8);
rs= roundsquare(s=[10,5],d=[5,5,5,5],fn=8);
translate([0,-6]) 2D(rs);
rs2= roundsquare(s=[10,5],d=[1,9,0,0],fn=8);
translate([11,-6]) 2D(rs2);

Star
Paramètres
- d1 : diamètre extérieur
- d2 : diamètre intérieur
- fn : nombre de branches
Code de la fonction
function star(d1,d2,fn) = let (
d1=d1==undef?10:d1/2,
d2=d2==undef?5:d2/2,
fn=fn==undef?7:fn,
aa=[for(i=[0:2*(fn)])[sin(360/(2*fn)*i)*(pair(i)==true?d1:d2),cos(360/(2*fn)*i)*(pair(i)==true?d1:d2)]]
)
aa;
Exemple
star(d1=5,d2=2,fn=5);
etoile= star(d1=5,d2=3,fn=8);
translate([5,0]) 2D(etoile);

Teardrop
Paramètres
- d : diamètre
- a : angle
- fn : qualité. Attention, le nombre total sera de ce nombre + 2 car la qualité ne correspond qu'à la partie courbe, non au cône formant la goutte, formé de deux vecteurs. (cf. exemple tear2)
Code de la fonction
function teardrop(d,a,fn)=let (
d=d==undef?10:d,
a=a==undef?30:a,
h=d*tan(90-a),
fn=fn==undef?16:fn,
courbe= [for(i=[0:fn]) [sin(90-a+(360-(90-a)*2)/fn*i)*d/2,cos(90-a+(360-(90-a)*2)/fn*i)*d/2]],
aa=concat(courbe,[[0,(cos(90-a)*d/2)+h*sin(90-a)/2]],[[sin(90-a)*d/2,cos(90-a)*d/2]])
)
aa;
Exemple
teardrop(d=5,a=45,fn=32);
tear= teardrop(d=3,a=20,fn=32);
tear2= teardrop(d=3,a=10,fn=3);
translate([5,0,0]) 2D(tear);
translate([9,0,0]) 2D(tear2);
echo(tear);
Résultat console
[[1.40954, 0.51303], [1.46082, 0.340614], [1.49108, 0.1633], [1.49991, -0.0163621], [1.48717, -0.195789], [1.45304, -0.372401], [1.39801, -0.543657], [1.32288, -0.707095], [1.22873, -0.860365], [1.1169, -1.00126], [0.989019, -1.12776], [0.84691, -1.23804], [0.692623, -1.33052], [0.528375, -1.40386], [0.356529, -1.45701], [0.179555, -1.48921], [0, -1.5], [-0.179555, -1.48921], [-0.356529, -1.45701], [-0.528375, -1.40386], [-0.692623, -1.33052], [-0.84691, -1.23804], [-0.989019, -1.12776], [-1.1169, -1.00126], [-1.22873, -0.860365], [-1.32288, -0.707095], [-1.39801, -0.543657], [-1.45304, -0.372401], [-1.48717, -0.195789], [-1.49991, -0.0163621], [-1.49108, 0.1633], [-1.46082, 0.340614], [-1.40954, 0.51303], [0, 4.38571], [1.40954, 0.51303]]