Implement code changes to enhance functionality and improve performance

This commit is contained in:
FelipeCN
2025-11-14 15:30:40 -03:00
parent 9a7f047a5a
commit 7b03dc7b98
2 changed files with 45145 additions and 0 deletions
@@ -0,0 +1,259 @@
// ============================================
// PORTA-UTENSÍLIOS DE BANHEIRO
// ============================================
// Formato: Copo quadrado/retangular com bordas arredondadas (Squircle)
// Textura: Linhas verticais nas laterais
// Drenagem: Grade opcional no fundo
// Divisões: Divisórias internas configuráveis
// ============================================
// PARÂMETROS CONFIGURÁVEIS
// ============================================
// Dimensões principais (mm)
largura = 80; // Largura (X)
profundidade = 80; // Profundidade (Y)
altura = 100; // Altura (Z)
espessura_parede = 2; // Espessura da parede
// Arredondamento das bordas (estilo Squircle)
raio_arredondamento = 20; // Quanto maior, mais arredondado (recomendado: 15-30)
// Grade de drenagem no fundo
com_grade_drenagem = true; // true = com grade, false = fundo sólido
largura_fenda_drenagem = 2; // Largura das fendas da grade
espacamento_fendas = 6; // Espaçamento entre fendas
// Textura lateral (linhas verticais)
com_textura = true; // true = com textura, false = liso
largura_linha = 1.5; // Largura das linhas da textura
espacamento_linhas = 4; // Espaçamento entre linhas
profundidade_textura = 0.8; // Profundidade das ranhuras
// Borda superior arredondada
com_borda_superior = true; // true = com borda, false = sem borda
raio_borda_superior = 2; // Raio do arredondamento da borda
// Divisões internas
com_divisoes = true; // true = com divisões, false = sem divisões
num_divisoes_x = 1; // Número de divisões no eixo X (0 = nenhuma)
num_divisoes_y = 0; // Número de divisões no eixo Y (0 = nenhuma)
posicao_divisao_x = 50; // Posição da divisão X em % (0-100)
posicao_divisao_y = 50; // Posição da divisão Y em % (0-100)
espessura_divisao = 1.5; // Espessura das divisões internas
// Qualidade de renderização
$fn = 100; // Aumentar para melhor qualidade (60-100)
// ============================================
// MÓDULOS PRINCIPAIS
// ============================================
// Módulo principal
module porta_utensilios() {
difference() {
union() {
// Corpo externo (Squircle)
squircle_3d(largura, profundidade, altura, raio_arredondamento);
// Borda superior arredondada
if (com_borda_superior) {
borda_superior();
}
}
// Cavidade interna
translate([0, 0, espessura_parede])
squircle_3d(
largura - 2*espessura_parede,
profundidade - 2*espessura_parede,
altura,
raio_arredondamento - espessura_parede
);
// Aplicar textura nas laterais
if (com_textura) {
textura_vertical();
}
// Grade de drenagem no fundo
if (com_grade_drenagem) {
translate([0, 0, -0.5])
grade_drenagem();
}
}
// Adicionar divisões internas
if (com_divisoes) {
divisoes_internas();
}
}
// Cria um "Squircle" 3D (quadrado/retângulo com bordas super arredondadas)
module squircle_3d(w, d, h, r) {
hull() {
// Cantos arredondados
for (x = [-1, 1]) {
for (y = [-1, 1]) {
translate([x * (w/2 - r), y * (d/2 - r), 0])
cylinder(h=h, r=r);
}
}
}
}
// Borda superior arredondada
module borda_superior() {
altura_borda = raio_borda_superior * 2;
translate([0, 0, altura - altura_borda]) {
difference() {
// Corpo da borda com topo arredondado
hull() {
// Base da borda
squircle_3d(largura, profundidade, 0.1, raio_arredondamento);
// Topo arredondado (ligeiramente menor para criar o arredondamento)
translate([0, 0, altura_borda - raio_borda_superior])
squircle_3d(
largura - raio_borda_superior,
profundidade - raio_borda_superior,
raio_borda_superior,
raio_arredondamento - raio_borda_superior/2
);
}
// Cavidade interna
translate([0, 0, -0.1])
squircle_3d(
largura - 2*espessura_parede,
profundidade - 2*espessura_parede,
altura_borda + 0.2,
raio_arredondamento - espessura_parede
);
}
}
}
// Textura vertical nas laterais (linhas alternadas)
module textura_vertical() {
altura_textura = altura - espessura_parede - (com_borda_superior ? raio_borda_superior * 2 : 0);
raio_linha = largura_linha / 2;
num_linhas_x = floor(largura / espacamento_linhas);
num_linhas_y = floor(profundidade / espacamento_linhas);
// Linhas nas laterais X (frente e trás)
for (i = [0:num_linhas_x]) {
x_pos = -largura/2 + i * espacamento_linhas;
// Frente
translate([x_pos, -profundidade/2 + profundidade_textura/2, espessura_parede])
cylinder(h=altura_textura, r=raio_linha, $fn=20);
// Trás
translate([x_pos, profundidade/2 - profundidade_textura/2, espessura_parede])
cylinder(h=altura_textura, r=raio_linha, $fn=20);
}
// Linhas nas laterais Y (esquerda e direita)
for (i = [0:num_linhas_y]) {
y_pos = -profundidade/2 + i * espacamento_linhas;
// Esquerda
translate([-largura/2 + profundidade_textura/2, y_pos, espessura_parede])
cylinder(h=altura_textura, r=raio_linha, $fn=20);
// Direita
translate([largura/2 - profundidade_textura/2, y_pos, espessura_parede])
cylinder(h=altura_textura, r=raio_linha, $fn=20);
}
// Linhas nos cantos arredondados (4 cantos)
num_linhas_canto = floor((PI * raio_arredondamento / 2) / espacamento_linhas);
for (canto_x = [-1, 1]) {
for (canto_y = [-1, 1]) {
centro_x = canto_x * (largura/2 - raio_arredondamento);
centro_y = canto_y * (profundidade/2 - raio_arredondamento);
angulo_inicio = atan2(canto_y, canto_x) - 45;
for (i = [0:num_linhas_canto]) {
angulo = angulo_inicio + (90 * i / num_linhas_canto);
raio_canto = raio_arredondamento - profundidade_textura/2;
x_pos = centro_x + raio_canto * cos(angulo);
y_pos = centro_y + raio_canto * sin(angulo);
translate([x_pos, y_pos, espessura_parede])
cylinder(h=altura_textura, r=raio_linha, $fn=20);
}
}
}
}
// Grade de drenagem no fundo
module grade_drenagem() {
// Fendas no eixo X
num_fendas_x = floor((largura - 2*espessura_parede) / espacamento_fendas);
for (i = [1:num_fendas_x-1]) {
x_pos = -largura/2 + espessura_parede + i * espacamento_fendas;
translate([x_pos - largura_fenda_drenagem/2, 0, 0])
cube([
largura_fenda_drenagem,
profundidade - 2*espessura_parede,
espessura_parede + 1
], center=true);
}
// Fendas no eixo Y
num_fendas_y = floor((profundidade - 2*espessura_parede) / espacamento_fendas);
for (i = [1:num_fendas_y-1]) {
y_pos = -profundidade/2 + espessura_parede + i * espacamento_fendas;
translate([0, y_pos - largura_fenda_drenagem/2, 0])
cube([
largura - 2*espessura_parede,
largura_fenda_drenagem,
espessura_parede + 1
], center=true);
}
}
// Divisões internas
module divisoes_internas() {
dim_interna_x = largura - 2*espessura_parede;
dim_interna_y = profundidade - 2*espessura_parede;
altura_divisao = altura - espessura_parede;
// Divisões no eixo X
if (num_divisoes_x > 0) {
for (i = [1:num_divisoes_x]) {
pos_x = -dim_interna_x/2 + (dim_interna_x * posicao_divisao_x / 100) * i / num_divisoes_x;
translate([pos_x, 0, espessura_parede])
cube([
espessura_divisao,
dim_interna_y,
altura_divisao
], center=true);
}
}
// Divisões no eixo Y
if (num_divisoes_y > 0) {
for (i = [1:num_divisoes_y]) {
pos_y = -dim_interna_y/2 + (dim_interna_y * posicao_divisao_y / 100) * i / num_divisoes_y;
translate([0, pos_y, espessura_parede])
cube([
dim_interna_x,
espessura_divisao,
altura_divisao
], center=true);
}
}
}
// ============================================
// RENDERIZAÇÃO
// ============================================
porta_utensilios();
File diff suppressed because it is too large Load Diff