Вот описанный в параллельной теме подход.
.
LLM - Gemini (бесплатный режим ИИ в Гугле).
Запрос "сделать модель 5-ти этажного 3-х подъездного дома Хрущёвка. детализированное разделение плит - межплитные швы. плиты стандартные. Широкие для широкого окна или балкона. Узкие для обычного окна. оконные и балконные рамы.
3 типа рам. Кухонные. Гостинной. Балконные. Сделать тонкие ажурные балконные ограждения"
// Параметрическая модель 5-этажной "Хрущевки" с правильной раскладкой ЖБИ-панелей,
// межплитными швами, рамами и реалистичными ажурными балконными ограждениями.
/* [Основная геометрия дома] */
floors = 5; // Количество этажей
sections = 3; // Количество подъездов
floor_height = 12; // Высота одного этажа
section_width = 30; // Ширина одного подъездного сектора
house_depth = 24; // Глубина дома (ширина торца)
/* [Стандартизация面板ей (ЖБИ)] */
panel_wide_w = 8;
panel_narrow_w = 7;
/* [Параметры элементов фасада] */
window_w = 4; // Ширина стандартного окна
window_h = 5; // Высота окна
window_depth = 1.5; // Глубина утапливания окон/дверей
balcony_w = 6; // Ширина балкона
balcony_h = 3.5; // Высота балконного ограждения
balcony_d = 2.5; // Вынос балкона вперед
/* [Параметры межплитных швов] */
seam_w = 0.3;
seam_d = 0.4;
/* [Параметры рам и ограждений] */
frame_thick = 0.25;
glass_thick = 0.1;
rail_thick = 0.15; // Толщина прутьев металлической решетки балкона
shield_thick = 0.15; // Толщина защитного экрана (шифера/панели)
$fn = 20;
house_length = sections * section_width;
house_height = floors * floor_height;
// --- МОДУЛЬ АЖУРНОГО БАЛКОНА ---
module balcony_structure(w, d, h) {
slab_h = 0.6; // Толщина бетонной плиты основания
// 1. Бетонное основание (плита)
color("LightGrey")
cube([w, d, slab_h]);
// Сдвиг вверх для построения перил над плитой
translate([0, 0, slab_h]) {
// 2. Металлический каркас (поручни по периметру)
color("White") {
// Главный верхний поручень (передний)
translate([0, d - rail_thick, h - rail_thick]) cube([w, rail_thick, rail_thick]);
// Боковые верхние поручни
translate([0, 0, h - rail_thick]) cube([rail_thick, d, rail_thick]);
translate([w - rail_thick, 0, h - rail_thick]) cube([rail_thick, d, rail_thick]);
// Вертикальные угловые стойки решетки
translate([0, d - rail_thick, 0]) cube([rail_thick, rail_thick, h]);
translate([w - rail_thick, d - rail_thick, 0]) cube([rail_thick, rail_thick, h]);
translate([0, 0, 0]) cube([rail_thick, rail_thick, h]);
translate([w - rail_thick, 0, 0]) cube([rail_thick, rail_thick, h]);
// Промежуточные вертикальные стойки для ажурности
for (x = [w/4, w/2, (w/4)*3]) {
translate([x - rail_thick/2, d - rail_thick, 0]) cube([rail_thick, rail_thick, h]);
}
}
// 3. Тонкий защитный экран (шиферная панель, подвешенная на каркас)
color("PaleTurquoise") { // Характерный советский цвет покраски шифера
shield_h = h * 0.75;
shield_z = h * 0.08;
// Передний защитный экран
translate([rail_thick, d - rail_thick/2 - shield_thick, shield_z])
cube([w - rail_thick*2, shield_thick, shield_h]);
// Боковые экраны
translate([rail_thick/2, rail_thick, shield_z])
cube([shield_thick, d - rail_thick*2, shield_h]);
translate([w - rail_thick/2 - shield_thick, rail_thick, shield_z])
cube([shield_thick, d - rail_thick*2, shield_h]);
}
}
}
// --- МОДУЛИ ОКОННЫХ И БАЛКОННЫХ РАМ ---
module living_frame(w, h) {
color("White") {
difference() {
cube([w, frame_thick, h]);
translate([frame_thick, -0.1, frame_thick]) cube([w - frame_thick*2, frame_thick + 0.2, h - frame_thick*2]);
}
translate([w/3 - frame_thick/2, 0, 0]) cube([frame_thick, frame_thick, h]);
translate([(w/3)*2 - frame_thick/2, 0, 0]) cube([frame_thick, frame_thick, h]);
translate([0, 0, (h/3)*2]) cube([w/3, frame_thick, frame_thick]);
}
color("LightCyan", 0.5)
translate([frame_thick, frame_thick/2 - glass_thick/2, frame_thick])
cube([w - frame_thick*2, glass_thick, h - frame_thick*2]);
}
module kitchen_frame(w, h, is_staircase=false) {
color("White") {
difference() {
cube([w, frame_thick, h]);
translate([frame_thick, -0.1, frame_thick]) cube([w - frame_thick*2, frame_thick + 0.2, h - frame_thick*2]);
}
translate([w*0.35 - frame_thick/2, 0, 0]) cube([frame_thick, frame_thick, h]);
if (!is_staircase) {
translate([0, 0, h*0.65]) cube([w*0.35, frame_thick, frame_thick]);
}
}
color("LightCyan", 0.5)
translate([frame_thick, frame_thick/2 - glass_thick/2, frame_thick])
cube([w - frame_thick*2, glass_thick, h - frame_thick*2]);
}
module balcony_door_frame(w, h) {
door_w = w * 0.35;
window_part_w = w - door_w;
color("White") {
difference() {
cube([w, frame_thick, h]);
translate([frame_thick, -0.1, frame_thick]) cube([w - frame_thick*2, frame_thick + 0.2, h - frame_thick*2]);
}
translate([door_w - frame_thick/2, 0, 0]) cube([frame_thick, frame_thick, h]);
translate([0, 0, h*0.35]) cube([door_w, frame_thick, frame_thick]);
translate([door_w + window_part_w/2 - frame_thick/2, 0, 0]) cube([frame_thick, frame_thick, h]);
translate([door_w, 0, (h/3)*2]) cube([window_part_w/2, frame_thick, frame_thick]);
}
color("LightCyan", 0.5) {
translate([frame_thick, frame_thick/2 - glass_thick/2, h*0.35 + frame_thick])
cube([door_w - frame_thick*2, glass_thick, h*0.65 - frame_thick*2]);
translate([door_w + frame_thick, frame_thick/2 - glass_thick/2, frame_thick])
cube([window_part_w - frame_thick*2, glass_thick, h - frame_thick*2]);
}
}
// --- СБОРКА ЗДАНИЯ ---
module hrushevka() {
difference() {
union() {
color("LightGrey") cube([house_length, house_depth, house_height]);
color("SlateGray") translate([0, 0, house_height]) roof(house_length, house_depth, 3);
// Добавление новых детализированных балконов
add_standard_balconies();
}
cut_standard_windows_and_doors(only_holes=true);
cut_standard_panel_seams();
}
cut_standard_windows_and_doors(only_holes=false);
}
module roof(l, w, h) {
rotate([90, 0, 90])
linear_extrude(height = l)
polygon(points=[[0,0], [w,0], [w/2, h]]);
}
function get_panel_centers() = [4, 8 + 3.5, 8 + 7 + 3.5, 8 + 7 + 7 + 4];
module add_standard_balconies() {
centers = get_panel_centers();
for (sec = [0 : sections-1]) {
for (fl = [1 : floors-1]) {
step_x = sec * section_width;
z_pos = fl * floor_height;
// Левый балкон (Панель 1)
translate([step_x + centers[0] - balcony_w/2, house_depth, z_pos])
balcony_structure(balcony_w, balcony_d, balcony_h);
// Правый балкон (Панель 4)
translate([step_x + centers[3] - balcony_w/2, house_depth, z_pos])
balcony_structure(balcony_w, balcony_d, balcony_h);
}
}
}
module cut_standard_windows_and_doors(only_holes=true) {
centers = get_panel_centers();
for (sec = [0 : sections-1]) {
step_x = sec * section_width;
// 1. ГЛАВНЫЙ ФАСАД (Передний)
for (fl = [0 : floors-1]) {
z_pos = fl * floor_height + (floor_height - window_h) / 2;
// Панель 1
if (fl == 0) {
if (only_holes) {
translate([step_x + centers[0] - window_w/2, house_depth - window_depth, z_pos]) cube([window_w, window_depth + 1, window_h]);
} else {
translate([step_x + centers[0] - window_w/2, house_depth - window_depth/2, z_pos]) living_frame(window_w, window_h);
}
} else {
if (only_holes) {
translate([step_x + centers[0] - window_w/2, house_depth - window_depth, z_pos]) cube([window_w, window_depth + 1, window_h]);
} else {
translate([step_x + centers[0] - window_w/2, house_depth - window_depth/2, z_pos]) balcony_door_frame(window_w, window_h);
}
}
// Панель 4
if (fl == 0) {
if (only_holes) {
translate([step_x + centers[3] - window_w/2, house_depth - window_depth, z_pos]) cube([window_w, window_depth + 1, window_h]);
} else {
translate([step_x + centers[3] - window_w/2, house_depth - window_depth/2, z_pos]) living_frame(window_w, window_h);
}
} else {
if (only_holes) {
translate([step_x + centers[3] - window_w/2, house_depth - window_depth, z_pos]) cube([window_w, window_depth + 1, window_h]);
} else {
translate([step_x + centers[3] - window_w/2, house_depth - window_depth/2, z_pos]) balcony_door_frame(window_w, window_h);
}
}
// Панель 2 (Кухня)
k_w = window_w * 0.8;
if (only_holes) {
translate([step_x + centers[1] - k_w/2, house_depth - window_depth, z_pos]) cube([k_w, window_depth + 1, window_h]);
} else {
translate([step_x + centers[1] - k_w/2, house_depth - window_depth/2, z_pos]) kitchen_frame(k_w, window_h);
}
// Панель 3 (Лестничная клетка / Подъездная дверь)
if (fl > 0) {
s_w = window_w * 0.6;
if (only_holes) {
translate([step_x + centers[2] - s_w/2, house_depth - window_depth, z_pos + 1.5]) cube([s_w, window_depth + 1, window_h - 1]);
} else {
translate([step_x + centers[2] - s_w/2, house_depth - window_depth/2, z_pos + 1.5]) kitchen_frame(s_w, window_h - 1, is_staircase=true);
}
}
}
if (only_holes) {
translate([step_x + centers[2] - 2.5, house_depth - window_depth, 0]) cube([5, window_depth + 1, 7.5]);
} else {
color("SaddleBrown") translate([step_x + centers[2] - 2.5, house_depth - window_depth/2, 0]) cube([5, frame_thick, 7.5]);
color("DarkGrey") translate([step_x + centers[2] - 3.5, house_depth, 7.7]) cube([7, 4, 0.5]);
}
}
// 2. ЗАДНИЙ ФАСАД
for (sec = [0 : sections-1]) {
step_x = sec * section_width;
for (fl = [0 : floors-1]) {
z_pos = fl * floor_height + (floor_height - window_h) / 2;
// Панели 1 и 4
if (only_holes) {
translate([step_x + centers[0] - window_w/2, -1, z_pos]) cube([window_w, window_depth + 1, window_h]);
translate([step_x + centers[3] - window_w/2, -1, z_pos]) cube([window_w, window_depth + 1, window_h]);
} else {
translate([step_x + centers[0] - window_w/2, window_depth/2, z_pos]) rotate([0,0,180]) translate([-window_w, 0, 0]) living_frame(window_w, window_h);
translate([step_x + centers[3] - window_w/2, window_depth/2, z_pos]) rotate([0,0,180]) translate([-window_w, 0, 0]) living_frame(window_w, window_h);
}
// Панели 2 и 3
k_w = window_w * 0.8;
if (only_holes) {
translate([step_x + centers[1] - k_w/2, -1, z_pos]) cube([k_w, window_depth + 1, window_h]);
translate([step_x + centers[2] - k_w/2, -1, z_pos]) cube([k_w, window_depth + 1, window_h]);
} else {
translate([step_x + centers[1] - k_w/2, window_depth/2, z_pos]) rotate([0,0,180]) translate([-k_w, 0, 0]) kitchen_frame(k_w, window_h);
translate([step_x + centers[2] - k_w/2, window_depth/2, z_pos]) rotate([0,0,180]) translate([-k_w, 0, 0]) kitchen_frame(k_w, window_h);
}
}
}
// 3. ТОРЦЕВЫЕ ОКНА
torzo_centers = [6 + 3, 6 + 6 + 3];
for (fl = [0 : floors-1]) {
z_pos = fl * floor_height + (floor_height - window_h) / 2;
for (tc = torzo_centers) {
if (only_holes) {
translate([-1, tc - window_w/2, z_pos]) cube([window_depth + 1, window_w, window_h]);
translate([house_length - window_depth, tc - window_w/2, z_pos]) cube([window_depth + 1, window_w, window_h]);
} else {
translate([window_depth/2, tc - window_w/2, z_pos]) rotate([0,0,90]) translate([0, -window_depth/2, 0]) living_frame(window_w, window_h);
translate([house_length - window_depth/2, tc + window_w/2, z_pos]) rotate([0,0,-90]) living_frame(window_w, window_h);
}
}
}
}
// Нарезка межплитных швов
module cut_standard_panel_seams() {
color("DimGray") {
for (fl = [0 : floors]) {
z_pos = fl * floor_height;
translate([-1, -seam_d, z_pos - seam_w/2]) cube([house_length + 2, house_depth + seam_d*2, seam_w]);
translate([-seam_d, -1, z_pos - seam_w/2]) cube([house_length + seam_d*2, house_depth + 2, seam_w]);
}
for (sec = [0 : sections-1]) {
step_x = sec * section_width;
panel_edges = [0, 8, 15, 22, 30];
for (edge = panel_edges) {
x_pos = step_x + edge;
if (x_pos <= house_length) {
translate([x_pos - seam_w/2, house_depth - seam_d, -1]) cube([seam_w, seam_d + 0.1, house_height + 2]);
translate([x_pos - seam_w/2, -0.1, -1]) cube([seam_w, seam_d + 0.1, house_height + 2]);
}
}
}
for (edge_y = [6, 12, 18]) {
translate([-0.1, edge_y - seam_w/2, -1]) cube([seam_d + 0.1, seam_w, house_height + 2]);
translate([house_length - seam_d, edge_y - seam_w/2, -1]) cube([seam_d + 0.1, seam_w, house_height + 2]);
}
}
}
// Запуск рендеринга
hrushevka();
Вот так в просмотрщике STL выглядит STL (сам STL прилагаю но переименовал в ZIP).