При расчете стоимости новой кухни цена оказалась такой большой, что я решил сделать её сам так как это обойдется в два раза дешевле. Для тренировки решил сделать для себя рабочий стол. Достаточно быстро пришло понимание: чтобы сделать хорошую вещь нужно сделать 3D модель. Это позволит на этапе проектирования посмотреть как будет выглядеть мебель и продумать как в дальнейшем будет происходить сборка. Так как 3D моделированием я не занимаюсь, то начал искать программу попроще. И самая простая что нашел SketchUp. При создании модели постоянно приходилось править модель из-за постоянно изменявшихся размеров. И после третьего изменения появилась идея — сделать параметризированную модель, чтобы она сама генерировалась с нужными размерами. SketchUp поддерживает скрипты на языке Ruby и эта статья о том что у меня получилось.
Решение достаточно простое — создаю некоторый API, который позволяет создавать 3D объекты листов ЛДСП с нужными параметрами. Из этих объектов компонуется готовая модель а также в отдельный файл выгружаются размеры листов для передачи их в центр распила. В результате эксплуатации добавил ещё возможность указывать кромки для листов. Данный плагин был использован для проектирования более десятка различных изделий из ЛДСП. С каждым новым проектом плагин дорабатывался и модифицировался, улучшалось удобство и совершенствовалось API. В качестве примера последний проект — стол-тумба. На картинке модель + готовое изделие (птица и собака для привлечения внимания :))
Красные — это 2 мм кромки, фиолетовый — кромки 0.4 мм. Нижние полки не до конца, так как там батарея отопления у стены. Столешница отстает от стены на 4 см чтобы тепло от батарее отопления поднималось вверх и обогревало стену (вообще делать мебель самому очень удобно — можно сделать под свои размеры).
# Толщина фанеры
$weght = 16.0
# Зазор между ящиком и задней стенкой
$zazor = 5.0
# Отступ от краев для ящика
$dWidth = 26.0
#
$width = 770
$offsetStena = 40
$dStoledhnica = 20
$height = 2500 - 150 - 900
$depthLeft = 600
$depthRight = $depthLeft - 175
$jshikHeight = 200
$heightPlanka = 300
$heightJshik = 190
$heightJshikOffset = 10
# Функция точки входа
def object3D_main()
# Загрузить библиотеки
Shasoft::Object3D::loadLibrary()
# Установить толщину ЛДСП
Shasoft::Object3D::LDSP::setWeght($weght)
# Создать модель
stenaLeft = Shasoft::Object3D::LDSP::create($height-$weght,$depthLeft,"2 0 0 1").name("Левая стена").rotateY(-90)
stenaRight = Shasoft::Object3D::LDSP::create($height-$weght,$depthLeft,"2 0 0 1").name("Правая стена").rotateY(-90).moveX($width-$weght)
stoleshnica = Shasoft::Object3D::LDSP::create($width,$depthLeft+$dStoledhnica-$offsetStena,"2 2 1 2").name("Столешница").move(-$weght,-$dStoledhnica,$height-$weght)
polka1 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthRight,"2 0 0 0").name("Полка 1").moveZ(400)
polka2 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthRight-$weght,"2 0 0 0").name("Полка 2").moveZ(600)
polka3 = Shasoft::Object3D::LDSP::create($width-$weght*2,$depthLeft-$offsetStena,"2 0 0 0").name("Полка 3").moveZ(800+$heightJshik+$heightJshikOffset+10-$weght-5)
pereborka1 = Shasoft::Object3D::LDSP::create($width-$weght*2,$heightPlanka).name("Переборка").rotateX(90).moveY($depthRight).moveZ(400+$weght)
# Верхний ящик
jshik1box = Shasoft::Object3D::LDSP::create_box($width-$weght*2-$dWidth,$depthLeft-$zazor-$offsetStena,$heightJshik,"Верхний ящик",1).moveX($dWidth/2).moveZ($height-$heightJshik-$heightJshikOffset-$weght)
jshik1Fasad = Shasoft::Object3D::LDSP::create($width,200,"2 2 2 2").rotateX(90).moveX(-$weght).moveZ($height-$heightJshik-$heightJshikOffset-$weght-5).name("Фасад ящика 1")
jshik1 = Shasoft::Object3D::create(jshik1box,jshik1Fasad)
# Нижний ящик
jshik2box = Shasoft::Object3D::LDSP::create_box($width-$weght*2-$dWidth,$depthLeft-$zazor-$offsetStena,$heightJshik-$weght-5,"Нижний ящик",1).moveX($dWidth/2).moveZ($height-$heightJshik-$heightJshikOffset-$weght)
jshik2Fasad = Shasoft::Object3D::LDSP::create($width,200,"2 2 2 2").rotateX(90).moveX(-$weght).moveZ($height-$heightJshik-$heightJshikOffset-$weght-5).name("Фасад ящика 2")
jshik2 = Shasoft::Object3D::create(jshik2box,jshik2Fasad).moveZ(-$height+800+$heightJshik+$heightJshikOffset+$weght+10)
# Двери
widthDver = $width/2-5
dver1 = Shasoft::Object3D::LDSP::create(widthDver,800-5-10,"2 2 2 2").rotateX(90).moveZ(5).moveX(-$weght).name("Дверь 1")
dver2 = dver1.copy.moveX($width-widthDver).name("Дверь 2")
#
for i in 0..5
Shasoft::Object3D::LDSP::create(467,247,"0 2 0 0").name("Полка в шкаф").moveX(-600).moveZ(i*50)
end
for i in 0..2
Shasoft::Object3D::LDSP::create(467,640,"0 2 0 0").name("Полка в шкаф 2").moveX(-600-600).moveZ(i*50)
end
#
Shasoft::Object3D::LDSP::write_csv( File.dirname(__FILE__)+"/main.csv" )
#Shasoft::Object3D::LDSP::write_csv_cut( File.dirname(__FILE__)+"/cut.csv" )
#Shasoft::Object3D::show()
end
Установка
Скачиваем файл Object3D.rbz
Запускаем SketchUp
Открываем Диспечер расширений (Окно/Диспечер расширений)
Жмем кнопку "Установить расширение" и выбираем скаченный файл Object3D.rbz
После этого плагин запрашивает директорию где будут храниться проекты. Т.е. выводится окно "Укажите директорию с проектами" и требуется указать папку где вы будете хранить ваши проекты.
В результате у нас появляется наше расширение
Использование
Переходим в папку которую мы указали для хранения проектов. Эту папку можно изменить в меню плагина
Создаем в папке директорию с названием нашего проекта. В моем случае это "Шкафчик в зал". Затем заходим в созданную директорию и создаем файл main.rb в котором создаем функцию точки входа
# Функция точки входа
def object3D_main()
... # код для генерации модели
end
Перезапускаем SketchUp и в меню плагина у вас появится пункт с названием созданной вами папки. Теперь вы выборе этого пункта будет происходить следующее:
- очистка консоли Ruby
- удаление всех элементов в текущем проекте
- загрузка файла main.rb из указанной директории
- вызов функции object3D_main
В функции object3D_main нужно сделать генерацию вашей модели. Можно скопировать в файл main.rb код который я приводил выше и тогда у вас сгенерируется мой шкафчик.
API
Файл "core.rb"
Каждая функция возвращает объект Shasoft::Object3D::Object3D который содержит методы для перемещения объекта и его поворота
Функция name() — установка имени объекта. Не стоит им пренебрегать. При сборке может сильно помочь :)
Функции объекта moveX, moveY, moveZ позволяют перемещать объект по соответствующим осям.
Функция move(x,y,z) позволяет переместить объект сразу по трем осям
Функции объекта rotateX, rotateY, rotateZ позволяют вращать объект вокруг соответствующих осей.
Есть функции псевдонимы moveRed, moveGreen, moveBlue, rotateRed, rotateGreen, rotateBlue где оси X(red), Y(green), Z(blue) названы по их цвету в SketchUp. Может кому-то так будет удобнее.
Каждая функция возвращает указатель на сам обхект. Это позволяет делать цепочку вызовов
# Повернем объект на 90 градусов вокруг оси X и переместим по оси Y на 100 мм obj.rotateX(90).moveY(100)
Функция объекта set(dict,key,value) позволяет установить значение атрибута. dict — имя словаря, key — имя атрибута, value — значение
Функция объекта get(dict,key,value=nil) позволяет получить значение атрибута. dict — имя словаря, key — имя атрибута, value — значение
Метод copy позволяет получить копию объекта (хотя работает не очень стабильно :))
Метод group позволяет получить стандартный объект SketchUp::Group
Определен метод для создания объекта. В качестве параметров можно передавать список объектов Shasoft::Object3D::Object3D или SketchUp::Group. Если список параметров пустой, то будет создана новая группа
# Создать объект со списком дочерних объектов
Shasoft::Object3D::create(*args)
Также есть функция которая позволяет получить список объектов (Skechup::Group). Можно задать имя словаря и будут возвращены только объекты, у которых такой словарь присутствует. В частности именно так я отделяю объекты лист ЛДСП от других. При создании я устанавливаю словарь LDSP по которому потом и фильтрую все объекты сцены.
# Получить список объектов
# dict - имя словаря
Shasoft::Object3D::get(dict=nil)
Файл "2D_weght"
# Создать 3D объект выдавливания
# pts - список точек в координатной плоскости x,y
# weght - толщина(высота)
Shasoft::Object3D::create_pushpull(pts,weght)
# Создать плоскую поверхность с заданной толщиной
# lX - размер по X
# lY - размер по Y
# weght - толщина
Shasoft::Object3D::create_plane(lX,lY,weght)
Файл "ldsp.rb"
# Получить текущую толщину
Shasoft::Object3D::LDSP::weght
# Установить толщину
Shasoft::Object3D::LDSP::setWeght(weght)
# Получить текущий материал ЛДСП
Shasoft::Object3D::LDSP::material
# Установить материал ЛДСП
Shasoft::Object3D::LDSP::setMaterial(material)
# Создать лист ЛДСП
# width - ширина (по X)
# depth - глубина (по Y)
# kromka - кромка [X ближний, Y левый, X дальний, Y правый], 0 - нет кромки, 1 - кромка 0.4 мм, 2 - кромка 2 мм
Shasoft::Object3D::LDSP::create(width,depth,kromka="0 0 0 0")
Вспомогательная функция для создания выдвижных ящиков
# Создать ящик
# width - ширина
# depth - глубина
# height - высота
# name - имя
# is_kromka - 1/0 кромить верх 2 мм кромкой
Shasoft::Object3D::LDSP::create_box(width,depth,height,name,is_kromka)
результат работы
# Записать размеры в файл CSV
Shasoft::Object3D::LDSP::write_csv(filepath)
в результате будет сгенерирован следующий csv файл со следующими колонками
- A — Ширина
- B — Глубина
- C Количество деталей
- D — кромки в формате Д-длинная сторона, К-короткая сторона. Именно в таком их записывают в той конторе в которой я заказываю распил деталей. Возможно это стандарт.
- E — кромки в том формате в котором вы их задавили при генерации
- F — Название всех деталей. Это полезно при сборке
В заключении
Проектирование и сборка мебели самому — это экономия денег где-то в 2 раза. А также возможность втиснуть ваше индивидуальное мебельное изделие в любую нестандартную дырку в квартире. Я обычно собираю мебель на конфирматах 7x50 из ЛДСП 16 мм
При наличии сверла для конфирматов
(и небольшого навыка) сборка занимает не так много времени.
Единственный минус — в это можно втянуться. После рабочего стола я уже собрал: кухню, несколько клеток (для одной и той же птицы она на фото), полки (навесные и напольные), тумбы и столы. В общем "захламил" в квартире все неиспользуемые места.
Ссылка для скачивания расширения
Ссылка на страницу плагина
Zagrebelion
Какая версия скетчапа нужна? Современный скетчап или жутко дорогой, или онлайн.
shasoft Автор
У меня работает на SketchUp 2017 (SketchUp make) и SketchUp 2019
И да, с удивлением обнаружил что бесплатность данной программы подошла к концу и новые версии только на пробный период в 30 дней :(
Похоже придется переходить на что-то другое. тут вот советуют Autodesk Fusion 360. Ну и для программистов ещё есть OpenSCAD. Хотя там нельзя линейкой померить сгенерированную модель (или я не нашел)
Учитывая что для нового проекта мне нужно генерировать DXF файлы (для резки деталей из оргстекла), посмотрю Autodesk Fusion 360. Главное чтобы чтобы её бесплатность не пропала.
webkumo
А почему не посмотрели в сторону того же Blender?
shasoft Автор
Насколько помню смотрел, но показался сложным в освоении. По крайней мере при беглом просмотре. В SketchUp Я как-то быстро разобрался, поэтому его выбрал.
webkumo
Я просто почему про него сказал — достаточно многие пользователи 3д-принтеров пользуются для моделированием именно им… в принципе он не такой уж и сложный, но возможно для мебели действительно оверхед.
rgs350
Там с размерами все очень плохо ибо он скорее для рисования а не для черчения/моделирования. Хотя при прочтении нескольких мануалов позволяет увидеть почти реалистичное изображение (или даже видео) вашего изделия.
webkumo
А что там плохого с размерами? В худшем случае — создаём куб 1(мм/см/м)^2 и масштабируем в нужный параллелепипед. А можно и сразу с нужными размерами. Фигуру с более сложной поверхностью, но "ровную" — тоже проблем нет. Проблемы будут только если уж действительно рисованием увлечься с совсем уж сложной поверхностью.
rgs350
Например то, что вам желательно показать свое творение другим людям, в виде, который им более или менее знаком.
webkumo
Можете пример привести? Не очень понимаю ваш кейс.
Am0ralist
Проще простого. Вы можете для себя хоть блокчейн использовать, если придумаете как. Но если вам нужно продемонстрировать результат другому, чтоб он потом это сделал — то нужно ориентироваться на то, как это воспринимать будет другой.
А другому возможно банально проще понять чертеж от руки с проставленными нужными размерами.
По сути, для изготовления мебели не нужен внешний вид и форма того же шкафа.
webkumo
Так-так-так, секундочку, так мы о моделировании объекта или о нарезке готового на куски? Ваш "на крайний случай" столь же удобный для нарезки листа ЛДСП, сколь и блендер. А вот вывести списком объекты из блендера с размерами… я такой задачей не задавался, но как минимум теоретически такое возможно. Вот удобство — да, под вопросом.
А вот вывести в предложенном вами втором варианте — напрямую не удастся… впрочем подозрение у меня, что та же cura после доработки напильником сможет модельку расписать так, как вы хотите.
Am0ralist
Хм, понимаете, что смоделировать можно что угодно, вот только это что угодно потом не получится собрать? Ну или получится, но не так? Самые простые ошибки — когда ящик в шкафу не открывается из-за дверей-купе (стоевая по центру шкафа, а двери купе чуть шире половины всегда делаются — это просто классика, на которую почти все наступают хоть раз в жизни).
И получается, что абстрактными инструментами можно сделать то всё, но если там нет спец.инструментов для этого — то вам придется много делать неудобно и ещё немного шаманить.Мой «на крайний случай» позволит мебельщикам самим прикинуть, как правильно сделать то или иное, потом так же быстро ручками создать правильный список деталей (в случае, если вы готовые размеры представите с указанием где кромка — то и отвечать за результат полностью вам). И вот тут размеры — основное.
Вот есть тот же солид, однако в одной крупной конторе кроме затрат на сам солид ещё гигансткие затраты на отдел разработчиков, которые пишут плаигны к оному, чтоб удобнее было работать (что по мне дешевле было бы скупить каких-нибудь местных разрабов мебельной программы). Потому что это универсальный инструмент, да. А выигрывает — заточенный в нужном направлении. Причём на производстве самих «корпусов» у них стоял, по-моему тот же базис… Зато классное 3D на этапе утверждения заказа, а потом часто после проверки конструктором — изменения невозможных или неправильных элементов, рожденных воображением дизайнера без опоры на реальный мир)
Am0ralist
Хм, я б тогда подумал в сторону какого-нибудь базиса онлайн для мебели, если нужно периодически что-то делать.
Скрипты там тоже есть на JS (причем, раньше их вроде как можно было и в демке писать, сейчас — не знаю). А так же можно фрагменты делать параметрические. В общем натренироваться на демке заранее, а за час можно не один шкаф нарисовать при умении). Плюс в том, что потом на производстве часто из готовой модели вам быстренько напилят, сконвертив в задания на ЧПУ-шки.
shasoft Автор
«базиса онлайн для мебели» — это какой-то сервис готовый?
Am0ralist
Базис-мебельщик — весьма популярная российская программа (контора сидит в Коломне) для автоматизации рабочих мест на мебельных предприятиях (есть модули построения модели, а так же для раскроя и для создания заданий на ЧПУ). Сам по себе стоит достаточно дорого что бы дома юзать, хотя из-за заточенности под конкретно корпусную мебель — для производства затраты не значительные.
И вот несколько лет назад они запустили возможность работать не покупая полноценную лицензию, а подключаясь к ключу с нужным модулем онлайн (Мебельщик, Смета, ЧПУ, Раскрой, только модуль Шкафа нафиг не нужен), покупая в часах время работы. С учетом, что минимально покупается час (учет поминутный вроде), а стоит это 60-100 рублей, то это вполне себе по мне интересный вариант.
Раньше у меня собственный ключ мебельщика и сметы был, но на халтурки времени мне так и не хватало и я его продал.
kriomant
Тем, кому не хочется возиться с программированием, я бы порекомендовал Autodesk Fusion 360, для хобби-проектов он бесплатен.
rgs350
Для хобби-проектов все программы бесплатны.
Barabashkad
ненахожу такого…
evilruff
ходил я таким путем… он однозначно имеет право на существование, по сути это некий способ превратить скетчап в параметрический сапр… но честно говоря сначала для корпусной мебели пришел к базису, большинство раскройщиков его принимают… а последнее время вообще все рисую в солиде, правда больше стал с массивом работать…
Nokse
Вот тоже хотел сказать, что скетчап — он немного для других целей рассчитывался, хотя никто не запрещает его так использовать) Есть же для параметрического моделирования куча сапров: автодеск, солидворкс, инвентор. Я солид не пробовал, но вот инвентор мне очень понравился — очень удобный и интуитивный (как мне кажется) сапр)
Офф-топик: клетка для птицы из пвх-труб — это гениально) правда, там щели весьма большие, ну да и птица немаленькая (а что за птица, кстати?), с волнистыми попугаями такой номер бы не прокатил.
shasoft Автор
В данном случае выбрал именно Sketh потому что бесплатный и я его легко освоил.
Что из вами перечисленного можно использовать бесплатно?
p.s. Птица грач. Такая клетка легко моется. Хотя вот как раз новый проект — это новая клетка будет.
Nokse
В рамках пробной 30-дневной версии — всё из перечисленного (но это не подходит для постоянного использования). Есть вариант бесплатной лицензии на 3 года для студентов/учащихся. Пользоваться данными программами нечестным путем — я так понимаю, не вариант.
Как вариант, можно попробовать FreeCAD, или что-то другое из списка по ссылке
stilet69
Плюсую за FreeCAD. Я в нем каркасный дом спроектировал. Сначала (после СкетчАп) было жутко неудобно, но потом когда врубился в концепцию, то СкетчАп и рядом не стоял по удобству.
Yan169
Оставлю в копилку.
Не совсем для мебели, но для похожей задачи параметрического 3D-моделирования при ремонте, использовал OpenScad. Кроссплатформенный, бесплатный. Язык правда очень ограниченный, но задачу решить позволяет.
shasoft Автор
Ещё есть OpenJSCad, тоже штука вроде удобная. Хотя там не очень понятно как выводить таблицу для распиловки, потому что там только Функции создания моделей.
Yan169
Я выводил необходимые данные в лог, который парсил внешним скриптом.
Mogwaika
Ну допустим распилить я ровно смогу, а кромки как заделывать, чтобы через полгода не отслаивались?
Как вот икея делает кромки? Там как будто вплавлена пластмасса, а не говно на термосоплях.
shasoft Автор
Так распиливают и кромят на станке. Именно вплавляют и держится годами.
Собственно поэтому и заморачивался с выводом кромок в том формате, что нужно указывать в конторе где заказываю. Потому что когда заказ делаешь, нужно указывать какие стороны как кромить.
UksusoFF
Теперь можно на GitHub каталог проектов организовывать.
ЗЫ: Спасибо за читалку для старых телефонов. Кучу книг с помощью нее перечитал :)
shasoft Автор
Из-за того что SketchUp стал платным, не очень это перспективно, организовывать список проектов. :)
Да и суть именно в том чтобы сделать свой индивидуальный проект под свои нужды. К примеру даже в данном изделии есть особенности, которые маловероятно что пригодятся кому. К примеру средняя полка между ящиками, гораздо рациональнее сделать её сверху, а ящики снизу. Потому что к верхнему ящику доступ получается не очень хороший из-за высоты. Но сделал так, чтобы при открытии ручка от балконной двери попадала аккуратно в эту нишу.
p.s.за слова про читалку спасибо, приятно, что кто-то кроме меня пользовался
soga_genzo
Пробовал сам заказывать распил и присадку в Московских конторах. Если просто ЛДСП нарезать и сделать кромку, то такой вариант подходит. А вот если требуется расписать присадку (расположение и параметры отверстий), то модели в SketchUp, AutoCad и т.п. заворачивают. Принимают только проект в Базис-мебельщике, т.к. он автоматом формирует всю необходимую документацию.
shasoft Автор
У нас вообще такого нет. Только распил и кромки. Возможно не пользуется спросом. В основном заказы делают мебельщики, которые делают мебель для других. А с их навыком дешевле самому разметить и все сделать.
Am0ralist
Когда переходят на ЧПУ-станки и раскроечные центры мигом начинают понимать в чем профит от заточенного под оные вещи инструмента. Собственно как раз и занимался в своё время тем, что участвовал в бОльшей автоматизации мебельной конторы, который совпал с переходом на новую версию Базиса и закупкой более продвинутых станков. До этого на бумаге раскрой в цехе сами делали под каретку, ага. Так что не в спросе дело, а в том, что прогресс до регионов докатывается медленнее (в нашем как крупняки были с кучей чпу, вкалывающих в три смены — но к которым с своей моделью и не попадешь, так и куча мелких полуручных)
mgremlin
Еще есть придворная программа от Blum — Dynalog.
Тож бесплатная, заточена под мебель и фурнитуру от блюма.
Когда я себе строил кухню (10 лет назад, ужас), позволяла вывести все предельно детально, со всеми присадочными отверстиями, раскроем и тп.
Увы, только винда.
Dr_Faksov
Две напоминалки…
Хотел напомнить про такую науку как эргономика, ваша программа с ней дружит?
Это офисный шкафчик, просто к примеру, но тем не менее, цифры тут не с потолка взяты. Эргономика много чего учитывает.
И еще хотел напомнить про то что предельные размеры мебели/бытовой техники, да и вообще любой фигни для дома, жёстко завязаны на размеры дверей\багажников\салонов транспорта и, главное, на размеры коридоров, дверей, лестничных площадок, лифтов… Вплоть до мест и высоты установки розеток и выключателей на стенах, чтобы мебель, поставленная в угол, к примеру, их не закрывала. Об этом мало кто задумывается из конструкторов-любителей жилья и мебели. А потом ох и ах, не проходит, буквально сантимера не хватает!
Mogwaika
А когда розетки ставят, то прямо в госты всегда смотрят…
shasoft Автор
Уже писал, что данный шкаф учитывает специфику помещения. По-хорошему для удобства лучше сделать снизу ящики, а сверху полку. Но полка сделана между ящиками чтобы как при открытии балкона ручка от него попадала в этот проем. В этом случае балконная дверь открывается шире.
Ну а программа, она вообще никакую специфику не учитывает. Это просто вспомогательный набор функций для генерации проекта. При этом можно и в 3D модель посмотреть и тут же получить готовые размеры для распиловки и кромления. Сам проект продумывает от, кто пишет скрипты для генерации модели
Nokse
Если бы всё делалось согласно стандартам… у меня (панельный дом 9-этажный) дверь открывается в комнату, и выключатель архитекторы вывели в угол, который закрывается открытой в комнату дверью! То-есть, чтобы включить свет, надо зайти в темную комнату, закрыть дверь, зайти в угол и включить свет. Ну просто мега-эргономично!). В хрущевке видел — выключатель выведен штатно посреди стены в комнате, чтоб до него дойти — надо пол комнаты пройти в темноте и нащупать его там.
Tomasina
Почему ПРО100 не упомянута? Прога простейшая, заточена именно под каркасную мебель.
kostin
Это дома каркасные, а мебель — корпусная :-)
Plague
Наверное, потому что там самая простая лицензия у ПРО100 — 55к, а тут человек решил сэкономить.