Трюк, которого не было — 2

Привет, Хабр! Моя прошлая статья была встречена сообществом очень хорошо. В обсуждение зашел даже @kompas_3d чем я по-настоящему горжусь. Я решил написать небольшое продолжение.
Основной проблемой, поднимаемой в комментариях была полная бесполезность построенного мной объекта. Люди искренно пытались помочь, предлагали различные варианты. Но все тщетно. Результатом всех дискуссий стала абсолютная ясность, что пользы от этого чуть меньше чем никакой.
На этот раз я попробую реабилитироваться и построить что-то более пригодное. Хотя, если честно, здесь тоже большие сомнения. Все, кому я это показывал, сначала долго смотрели в экран, потом долго смотрели на меня, крутили пальцем у виска и отходили на безопасное расстояние.
Сейф-пряжка на ремень
Однажды я ехал в поезде, полном народу с довольно большой суммой наличных денег. Ночью хотелось поспать, но сердце было не на месте — вдруг с деньгами что-то случится. Результатом этой бессонной ночи и стала эта странная конструкция.

Это металлический объект, напоминающий по форме пряжку. Он сделан путем гнутья из не очень толстой стали. Размеры позволяют запихнуть в него кредитные карты, сложенные купюры, возможно сим-карты, и прочие мелкие, но важные вещи. К данному изделию прилагается плоская крышка. Она вставляется в пазы, попадает в выемки и защелкивается за счет естественной упругости. Когда сквозь проушины в эту конструкцию вдевается ремень, проникнуть внутрь защищаемого объема не представляется никакой возможности (разумеется, если каким-то образом не повредить и не ослабить ремень).

Конструкция скруглена по форме тела, кроме того обладает некоторой свободой — может подстраиваться для наилучшего сидения на теле и на ремне. Если предполагается проходить сквозь болота, пустыни, пыльную местность — защищаемые вещи могут быть упакованы в герметичный мешочек. На передней стороне может быть нанесена некоторая гравировка, которая может перенести статус этого изделия в разряд мужских сувениров. Возможно эта вещь может понравиться различным неформалам, байкерам, музыкантам, путешественникам.

Вот наверное и все что можно сказать по функционалу объекта, и теперь можно перейти непосредственно к геометрическим построениям.
Преимущества параметрического построения
Если объект из предыдущей статьи я вообще не представлял, как можно построить без программирования (с учетом предполагаемой анимации), то данный объект вполне мог быть построен традиционными конструкторскими инструментами. Но я, конечно, все-равно выбрал параметрическое построение в OpenScad.
- В основном, конечно, потому что мне это нравится. Как вы уже поняли я от всего этого тащусь.
- Мне еще не до конца была ясна форма и размеры — ремни бывают разной ширины, оптимальная толщина должна с одной стороны обеспечивать нужный защищаемый объем, с другой стороны изделие не должно слишком выделятся и мешать, ну и хотелось вообще подобрать благоприятные глазу форму и пропорции.
- Стало очевидно, что чертить придется две формы — объект в разогнутом виде, чтобы сделать развертку и изготовить прототип, и в полностью согнутом, чтобы проверить замыкание размеров.
- Вследствие этого возникла идея — если ввести параметр согнутость от 0 до 1, то можно практически бесплатно получить и промежуточные состояния объекта и анимацию
Дальше я примерно опишу логику построений, и в русле общего названия статей буду называть это трюками, хотя конечно это больше обычные решения, принимаемые при генерации различных геометрических форм.
Трюк 1. Базовая трапеция
Примерно оценив геометрию, я понял, что всю конструкцию можно представить в виде сочетания трапеций, поэтому практически сразу написал код генерирующий трапецию с необходимыми параметрами. Все остальное, что теперь придется делать — строить эти трапеции и нужным образом соединять. Этот шаг привел к некоторому эффекту, о котором я в последствии расскажу.

Если отойти немного в философию программирования — когда вы выделяете некоторый объект, как прародитель всех остальных объектов, будьте готовы к различным сюрпризам — как к приятным, так и не очень.
Трюк 2. Симметрия
Еще одним очевидным свойством данного объекта является симметрия, как горизонтальная, так и вертикальная. Поэтому мы смело можем строить только четверть объекта, а все остальное получить отражением. Этот вид мухлежа широко распространен в мире САПР.

Если бы портной делал только четверть костюма и пытался его продать как целый — его бы конечно посадили в тюрьму на длительный срок. А у компьютерных проектировщиков это проходит на ура.
Трюк 3. Обратная логика построений
Это решение неочевидно и идет в разрез с интуицией. Логично начинать строить с центральных элементов и заканчивать краевыми. Но когда я так стал делать, пытаясь учесть сгибы — оказалось, что это все порождает очень большой объем кода — и чем дальше отходишь от центральной базы — тем хуже.

Анекдот: работника попросили нанести краской разметку на проезжую часть. За первый день он разметил 500 метров дороги, на второй день — 100 метров, на третий — всего 10. Когда начальник спросил почему падает выработка он ответил: Ну так я все дальше и дальше от банки с краской ухожу.*
Когда, поступаешь наоборот, строишь снаружи к центру — вычисления становятся более естественными. Банка с краской становится к тебе ближе.
Трюк, которого не было
Я уже завершил построения, полюбовался анимацией, поиграл различными размерами. Настала пора сделать развертку. Мне не понравилось, что на развертке некоторые линии не прорисовались. Причина этого понятна — все эти синусы, косинусы, повороты и прочие округления приводят к микронеточностям. На форму это абсолютно не влияет, но когда геометрическому ядру надо принять решение — прорисовывать линию между объектами или нет, эти неточности уже начинают сказываться. Я понял, что OpenSCADу нужно немного помочь и слегка развести края объектов на некую ничтожную величину. Без всякой задней мысли я обозначил эту микро величину как параметр. Хищно оглядел код, думая, куда бы внести нужные инъекции. Мой взгляд вдруг упал на код базовых трапеций. Всего несколько точных вставок — и цель была достигнута — все нужные прямые прорисовались. Правда прорисовались и не совсем нужные, но кашу маслом не испортишь.

Но вот какое дело — в модели появился новый параметр. Хоть он носит и технический характер, но параметром он быть не перестает. А значит им можно побаловаться. Я начал присваивать ему уже не микро, а вполне макро значения.

На моих глазах моя пряжка начала квазисимметрично и эквидистантно растворятся в воздухе. Эффект был очень красивый, и конечно при желании его можно анимировать. Вот уж точно не знаешь, где найдешь, где потеряешь.
Надеюсь мне снова удалось вас немного развлечь. Код проекта доступен на GitHub
Некоторые мысли в заключение
Мне нравится программировать, особенно когда это связано с геометрическими построениями в объеме. При взаимодействии трехмерной геометрии и программирования рождается некоторая своя красота и особое пространство смыслов. И я желаю всем конструкторам быть ближе к программированию, так как это может значительно облегчить их жизнь. Но как было сказано в комментариях к предыдущей статье — требовать от конструкторов знания программирования нелепо и антипродуктивно — у них и своих конструкторских проблем выше крыши, незачем им добавлять еще и программистские, с которыми даже программисты еще не совсем научились справляться. Разрешить это противоречие очень трудно. У меня есть некоторые мысли и я обязательно хочу об этом написать.
Эту же статью я хочу закончить на несколько другой ноте: программистам тоже есть чему поучится у конструкторов. Если бы меня спросили какой важный принцип нужно перенести из конструирования в программирование — я бы сказал открытость, понятность и законченность конструкции.
Конструирование — это игра в открытую. Все что хотел сказать конструктор — присутствует на чертеже. У чертежа нет скрытых слоев, тайных закладок, то работающих, то не работающих кэшей. Чертеж нельзя скомпилировать в какую-то непонятную ерунду, которая вроде работает, но как — ни за что не понять. На чертеж нельзя сделать DDOS-атаку. Конечно, в конструкциях есть много смыслов и хитростей — но это все присутствует в максимально явном виде. Кстати, этот принцип перенял язык Питон — первым делом в нем провозглашено — явное лучше неявного — и мы видим, что Питон сейчас один из самых успешных языков.

Я уже говорил, что мой отец — авиационный инженер. Несмотря на возраст, он старается идти в ногу со временем. На его столе — вполне современный компьютер, которым он вполне хорошо пользуется. Но иногда он мне задает вопросы, на которые я не могу ответить, а только краснею. Почему в каждой новой версии Windows все меняется и ничего не найти на прежних местах. Почему файлы в папках отображаются по-разному и этим совершенно невозможно управлять. Почему в папке «Мои документы» документы лучше не хранить. Почему, чтобы отправить письмо, нужно посмотреть тонну рекламы. Почему при поиске ответа на достаточно определенный вопрос Интернет выдает 300 000 сайтов с одинаковой информацией, которая одинаково бесполезна. Почему в Скайпе нет нормального списка контактов и отовсюду лезут эмодзи и странно работают статусы. И масса других вопросов, включая стандартные — почему все тормозит и глючит. Если вы читали книгу «Психбольница в руках у пациентов», то вам станет примерно понятно содержание наших разговоров.
Хотя прямых ответов у меня нет, но у меня есть некоторые соображения на этот счет.
Какое-то время я работал на заводе. И однажды спросил у отца, почему в авиационном двигателе некоторые детали делают на головном предприятии, а некоторые изготавливают в филиалах. По какому принципу делается разделение? Наверное некоторые детали особо ответственные, а некоторые не очень. Он мне ответил без пафоса, как-то буднично, без стремления донести какую-то сверх истину. Но эти слова сильно врезались мне в память. Он сказал: «Понимаешь, Миша, в авиационном двигателе неответственных деталей не бывает.»
Думаю, когда ИТ-индустрия будет также относится к тому, что она делает — все встанет на свои места.
Непоседа-сердечко

Вам нравятся Cults и вы хотите помочь нам продолжить наш путь самостоятельно? Обратите внимание, что мы — маленькая команда из 3 человек, поэтому поддержать нас в поддержании деятельности и создании будущих разработок очень просто. Вот 4 решения, доступные для всех:
- РЕКЛАМА: Отключайте блокировщик баннеров AdBlock и кликайте на наши рекламные баннеры.
- АФФИЛИАЦИЯ: Совершайте покупки онлайн, переходя по нашим партнерским ссылкам здесь Amazon.
- ДОНАТЫ: Если хотите, то можно сделать пожертвование через Ko-Fi здесь .
- ПРИГЛАШЕНИЕ ДРУЗЕЙ: Приглашайте своих друзей, откройте для себя платформу и великолепные 3D-файлы, которыми делится сообщество!
Обмен и загрузка на Cults3D гарантирует, что дизайны остаются в руках сообщества создателей! А не в руках гигантов 3D-печати или программного обеспечения, которые владеют конкурирующими платформами и используют дизайны в своих собственных коммерческих интересах.
Cults3D — это независимый и самофинансируемый сайт, который не подчиняется ни одному инвестору или бренду. Почти все доходы сайта возвращаются создателям платформы. Контент, публикуемый на сайте, служит **только интересам его авторов, а не брендов 3D-принтеров, которые также хотят контролировать рынок 3D-моделирования.
Как сделать сердечко в опенскад
Что значит нормальный держатель для azsmz?
Ну вот так. Нету грамотно сделанных. Есть только www.thingiverse.com/thing:913842, но там отверстия под рельсу криво стоят, пол цеплять будет если без ножек.
вот 2 варианта для LCD
При этом первый (белый) на направляющие не закрепить, а у второго нет ручки в комплекте. Второй у меня уже распечатан, перекантоваться.
3 пункт програмится за 30 минут.
Welcome. У меня пока распечатан этот www.thingiverse.com/thing:1000217, там из косяков:
- требуются длинные винты, и расстояния не под коссель (надо бы настраиваемые)
- нельзя поставить блок на защелках (только ушастый, на винтах)
- нет задней крышки с отверстием под провода
Ну вот так. Нету грамотно сделанных. Есть только www.thingiverse.com/thing:913842, но там отверстия под рельсу криво стоят, пол цеплять будет если без ножек.
Ну мне интересно что значит “грамотно сделанный”? условия так сказать.
При этом первый (белый) на направляющие не закрепить, а у второго нет ручки в комплекте. Второй у меня уже распечатан, перекантоваться.
Первый я сам рисовал, написал же, могу дать исходники, не жалко.
- требуются длинные винты, и расстояния не под коссель (надо бы настраиваемые)
- нельзя поставить блок на защелках (только ушастый, на винтах)
- нет задней крышки с отверстием под провода
- Используйте переменные
- а если уши по бокам сделать? либо углубление под шляпку до самого низу?
- зачем крышка если сзади профиль?
сделать то недолго, но я не понимаю что делать.
P.S: Так сказать выкатите ТЗ. Либо я, либо кто-нибудь да сделает. Хотя я уже на солид перешел. там гораздо удобнее.
Ну мне интересно что значит “грамотно сделанный”? условия так сказать.
У меня нет четкого ТЗ. Есть только список того, что не нравится сейчас. Прописывать что конструкция не должна цеплять пол — это по-моему за гранью добра и зла уже.
Единственные разумные условия — чтобы крепилось на профиль 2020, и не требовало килограммов пластика. Какие могут еще нюансы вылезти — не знаю, я не конструктор.
- а если уши по бокам сделать? либо углубление под шляпку до самого низу?
Именно про них и речь. Только желательно чтобы тут еще эстетично было, а не просто квадратная коробка. Возможно, лучше левый и правый бок сделать под наклоном, и там уже углубление под шляпку до низу (если это потом реально напечатать). Ну и скруглить лицевые ребра.
- зачем крышка если сзади профиль?
Сзади 2 планки профиля, а между ними здоровая щель. Оставлять такое при 220в внутри — не очень хорошо. Полноценной крышки не надо, хватит накладки, которая к профилю прижмется.
Так сказать выкатите ТЗ. Либо я, либо кто-нибудь да сделает.
Давайте немного иначе — если есть желающие поковыряться, пусть кинут мне контакты и обсудим голосом. Не хотелось бы, чтобы тема превратилась в работу строго по ТЗ. Хотя бы потому что я не конструктор, и могу многого не знать, чтобы грамотно такое тз составить.
Хотя я уже на солид перешел. там гораздо удобнее.
На thingverse для кастомайзера нужен openscad, поэтому тут без вариантов.
Все равно не понимаю зачем такие вещи делать для кастомайзера.
Профиль он для все один.
Расстояния между профилями разное (между крепежными отверстиями). Блок с выключателем разный (с ушами и без). Для головы — диаметры магнитов разные. И т.п.
А еще это нравится лично мне и я готов на это выделить какую-то денежку. Чтобы получился качественный “продукт”. То что есть сейчас, называется “на халяву и уксус сладок”. Я предпочитаю более основательный подход (на гитхабе можно посмотреть).
Ну и разобраться с openscad и кастомайзером тоже интересно.
А у меня грусть печаль… поставил внешнюю видяху чтобы солид лучше работал, теперь опенскад после F6 вылетает нафик.
То есть рисовать могу, а сохранять stl нет.
(прошу простить за частичный оффтоп)
- Проверить openGL драйвера: это одно из первых, что опенскаду может не понравиться;
- Воткнуть опенскад на другую машину или на виртуальную машину.
- Ещё есть openjscad.org
Да пофик на него. Я на солид перешел, опенскад для изменения старых проектов разве что. А вот за веб спасибо.
15 дней спустя
Окей, возможно я хочу слишком многого . Побьем задачу на части. Пусть будет нарисовано в чем угодно, а в OpenSCAD перегоню сам.
Нужен просто грамотный конструктор с опытом промдизайна. В смысле, которой сам знает что такое эргономика, что узлы 220 вольт желательно закрывать целиком, и про специфику 3d-печати.
ИМХО нормальные модели под обозначеные задачи может сделать лишь тот, кто для себя такие же задачи решает и реально собирает такой-же принтер. Даже у опытных моделлеров бывают косяки и требуется доработка после пары испорченых прототипов.
Модели, нарисованые абстрактно — почти наверняка получатся сырыми: тому, что решит реально напечатать и пустить в дело придётся дебажить это самому, выкинув в мусорку несколько косячных билдов.
Когда появится грамотный конструктор, все нюансы я обсужу с ним лично. Рассуждать просто так — не вижу смысла.
22 дня спустя
Фотачки бокса под выключатель:


- На морде 6 (!) винтов. Грёбаный стыд…
- Крепление винтами 35мм. Экзотика и целиться неудобно.
- Контакты сетевого гнезда подходят подозрительно близко к направляющим. Автор наверное бессмертный. Паять такое сцыкотно, а если делать изолированные клеммы как на фотке — провода между направляющих выступают.
- Ну и общий внешний вид как у табуретки.
Предложение порисовать в чем угодно — в силе.
Вот вам не спится спокойно.
Вот накидал по быстрому на переменных. могут быть ошибки. усложнять условиями не стал.
$fn=50; mount_distance=15; connector_x=48; connector_y=28; connector_z=30; connector_screw=6; connector_space_x=5; connector_space_y=5; curve=5; mount_row=10; //смещение от центра для винтов крепления под профиль 2040 module top() < difference()< hull()< translate([-connector_x/2-connector_space_x-mount_distance,mount_row,0]) cylinder(d=12, h=4); translate([connector_x/2+connector_space_x+mount_distance,mount_row,0]) cylinder(d=12, h=4); translate([-connector_x/2-connector_space_x-mount_distance,-mount_row,0]) cylinder(d=12, h=4); translate([connector_x/2+connector_space_x+mount_distance,-mount_row,0]) cylinder(d=12, h=4); translate([connector_x/2+connector_space_x,-connector_y/2-connector_screw-connector_space_y,0]) cylinder(d=curve, h=1); translate([connector_x/2+connector_space_x,connector_y/2+connector_screw+connector_space_y,0]) cylinder(d=curve, h=1); translate([-connector_x/2-connector_space_x,-connector_y/2-connector_screw-connector_space_y,0]) cylinder(d=curve, h=1); translate([-connector_x/2-connector_space_x,connector_y/2+connector_screw+connector_space_y,0]) cylinder(d=curve, h=1); translate([connector_x/2+connector_space_x,-connector_y/2-connector_screw-connector_space_y,connector_z]) sphere(d=curve); translate([connector_x/2+connector_space_x,connector_y/2+connector_screw+connector_space_y,connector_z]) sphere(d=curve); translate([-connector_x/2-connector_space_x,-connector_y/2-connector_screw-connector_space_y,connector_z]) sphere(d=curve); translate([-connector_x/2-connector_space_x,connector_y/2+connector_screw+connector_space_y,connector_z]) sphere(d=curve); >translate([-connector_x/2-connector_space_x-mount_distance,mount_row,-1]) cylinder(d=3, h=connector_z+curve); translate([connector_x/2+connector_space_x+mount_distance,mount_row,-1]) cylinder(d=3, h=connector_z+curve); translate([-connector_x/2-connector_space_x-mount_distance,-mount_row,-1]) cylinder(d=3, h=connector_z+curve); translate([connector_x/2+connector_space_x+mount_distance,-mount_row,-1]) cylinder(d=3, h=connector_z+curve); translate([-connector_x/2-connector_space_x-mount_distance,mount_row,3]) cylinder(d=7, h=connector_z+curve); translate([connector_x/2+connector_space_x+mount_distance,mount_row,3]) cylinder(d=7, h=connector_z+curve); translate([-connector_x/2-connector_space_x-mount_distance,-mount_row,3]) cylinder(d=7, h=connector_z+curve); translate([connector_x/2+connector_space_x+mount_distance,-mount_row,3]) cylinder(d=7, h=connector_z+curve); translate([-connector_x/2,-connector_y/2,-1]) cube([connector_x,connector_y,connector_z+curve]); translate([-connector_x/2-connector_space_x,-connector_y/2-connector_screw-connector_space_y,-1]) cube([connector_x+connector_space_x*2,connector_y+connector_screw*2+connector_space_y*2,connector_z]); if (connector_screw>0) < translate([0,-connector_y/2-connector_screw,-1]) cylinder(d=3, h=connector_z+curve); translate([0,connector_y/2+connector_screw,-1]) cylinder(d=3, h=connector_z+curve); >> > module bottom() < difference()< hull()< translate([-connector_x/2-connector_space_x-mount_distance,mount_row,0]) cylinder(d=12, h=2); translate([connector_x/2+connector_space_x+mount_distance,mount_row,0]) cylinder(d=12, h=2); translate([-connector_x/2-connector_space_x-mount_distance,-mount_row,0]) cylinder(d=12, h=2); translate([connector_x/2+connector_space_x+mount_distance,-mount_row,0]) cylinder(d=12, h=2); translate([connector_x/2+connector_space_x,-connector_y/2-connector_screw-connector_space_y,0]) cylinder(d=curve, h=2); translate([connector_x/2+connector_space_x,connector_y/2+connector_screw+connector_space_y,0]) cylinder(d=curve, h=2); translate([-connector_x/2-connector_space_x,-connector_y/2-connector_screw-connector_space_y,0]) cylinder(d=curve, h=2); translate([-connector_x/2-connector_space_x,connector_y/2+connector_screw+connector_space_y,0]) cylinder(d=curve, h=2); >translate([-connector_x/2-connector_space_x/2-mount_distance,mount_row,-1]) cylinder(d=3, h=connector_z+curve); translate([connector_x/2+connector_space_x/2+mount_distance,mount_row,-1]) cylinder(d=3, h=connector_z+curve); translate([-connector_x/2-connector_space_x/2-mount_distance,-mount_row,-1]) cylinder(d=3, h=connector_z+curve); translate([connector_x/2+connector_space_x/2+mount_distance,-mount_row,-1]) cylinder(d=3, h=connector_z+curve); > > top(); translate([0,(connector_y+connector_space_x)*2,0]) bottom();
Отверстие под кабель сами добавьте где вам нравится, по высоте разъем с проводами не мерил, измените как нужно.
Вот накидал по быстрому на переменных. могут быть ошибки. усложнять условиями не стал.
Спасибо! А можете подкрутить несколько вещей когда будет время?
- Расстояние между отверстиями крепления — нужно в 2 раза больше (сейчас похоже на рейку 2040, а надо на 2060, 40мм)
- На морде (где выключатель), можно чуть сильнее закруглить левый и правый край?
- В задней крышке от верха до середины нужен паз для проводов. Лучше если контуром с перемычками, чтобы юзер сам выламывал.
- IMHO cаму заднюю крышку лучше не винтами выставлять, а сделать для нее углубление по контуру (когда коробка прижмется, крышка ни куда не денется).
Насчет ушей крепления — я понимаю, что этот вариант рассчитан на печать без поддержек. Но внешний вид под вопросом, и у морды без пост-обработки фиговый вид (т.к. лежит на столе). IMHO лучше не выделываться с поддержками и сделать более классический вид — вертикальные боковушки, со скругленными переходами к ушам.
Кроме центровки задней крышки и проводов все параметрами регулируется.
Морду не надо переворачивать. печатайте как есть… а внутри поддержки…
внутри все равно не видно, так наплевать на следы от поддержек.
Центровка задней крышки выступами избыточна, так как при переливе она не закроется и придется дорабатывать напильником, а при большом зазоре будет опять же болтаться… винтами самое простое и эффективное. Это не первый мой корпус.
Ок. Эксперименты с углублением крышки сделаю сам. Это только в пословицах умные учатся на чужих ошибках — свои доходят намного лучше .
Вот еще вопросы:
- Можно поменять косые боковушки на просто открытые уши под прямым углом как тут (но со скруглением)?
- Сейчас радиус скругления общий для всего. Можно сделать больший (отдельный) радиус для левого-правого края морды? (и такой же для перехода на уши)
Лехко… Только не совсем понял что нужно… про уши понял, но тогда теряется прочность конструкции(может в этом месте расслоиться и отвалится например если заденете чемто) и выглядеть будет похуже на мой взгляд…
итак… про уши что значит скругление и радиус перехода на уши?
Между ушами и боковыми стенками угол 90 градусов. Место стыка хотелось бы сгладить окружностью. Радиус сглаживания — такой же как у левого и правого края морды (там где я просил радиус увеличить). Должно нормально получиться.
А. не. круглый вырез это геморойно. надо рисовать потом вырезать, либо внешние библиотеки использовать.
Нужна помощь с OpenSCAD
Задался сделать брелок в OpenSCAD с текстом с двух сторон , вроде бы задумка почти получилась , но не как не могу сделать снизу вырезанный (вдавленный) текст на определенную глубину в объекте.
ГУРУ OpenSCAD и те кто разбирается в нем , подскажите как сделать .
. прошу за код сильно не пинайте, я только учусь.
font = ‘Bernard MT Condensed’;
translate([1, 2, -0.1])
text(text = str(text), font = font, size = 9.2);
translate([3.5, -11.5, -4])
text(text = str(text1), font = font, size = 8.2);
translate([49.3, 1.1, -0.1])
text(text = str(text2), font = font, size = 4.7);