summaryrefslogtreecommitdiff
path: root/content/posts/2025-08-05-lets-code-3d/index.md
blob: 6924c41578af51502881591196cf103f12d45e3b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
---
cover: 4.jpg
date: "2025-08-05T20:00:00+03:00"
tags:
    - 3D печать
    - гиковское
title: Давай запрограммируем деталь?
---

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

Штош. Я решил восполнить этот недостаток с интересом для себя и решил этот
колпачок самостоятельно спроектировать и напечатать на 3D принтере, который есть
у меня на хозяйстве.

<!--more-->

{{< img src="1.jpg" alt="Бокорез и родной колпачок" >}} Бокорезы и
колпачок

## Проектирование

Обычно, детали для печати проектируются в CAD программах твердотельного
моделирования. Но я в них совершенно не умею, хотя и сын
инженеров-конструкторов. Но зато, к счастью, я программист. И вроде, не самый
худший! Посему, я решил воспользоваться свободной программой для твердотельного
моделирования [OpenSCAD](https://openscad.org/). К счастью, в репозитории
любимого дистрибутива (как, в прочем, и в большинстве других репозиториев) он
присутствовал. Что же в нём необычного? А необычное в нём то, что деталь в нём
не _рисуется_, а именно что _программируется_. Для понимания, приведу простой
пример:

```openscad
cube([25,35,55]); / Нарисовать куб размерами 25мм х 25мм х 55мм
```

Просто? Очень! А учитывая что язык полноценный, с циклами и условиями
«напрограммировать» в нём можно многое.

## Первая версия

Вот и я не стал долго думать, открыл [мануал с
оффсайта](https://openscad.org/documentation.html), обмерил штангенциркулем
оригинальный колпачок и пошёл <del>проектировать</del> программировать. На всё
про всё у меня ушло где-то с полчаса. И у меня получилась первая версия
колпачка. Максимально простая и дубовая. Первая куцая версия:

{{< img src="2.jpg" alt="Колпачок v1" >}}

## Вторая версия

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

{{< img src="3.png" alt="Колпачок v2 код" >}}

И результат «в железе», то есть в пластике :)

{{< img src="4.jpg" alt="Колпачок v2 результат" >}}

А сам код, думаю, он достаточно понятен ([исходники](source.scad) и
[STL модель](result.stl) я прикладываю к этому посту):

```openscad
/ Толщина стенки
wall = 2;

/ Высота внешняя
height = 12;

/ Длина основной части (внутренняя)
l1 = 15;

/ Длина носика (внутренняя)
l2 = 20;

/ Ширина у основания (внутренняя)
w = 15;

/ Толщина метала бокорезов
toolWidth = 2.1;

/ Нижняя крышка
cover(0);

/ Верхняя крышка
cover(height - wall);

/ Корпус
difference() {
    linear_extrude(height)
    polygon(
        [ / Полигон идёт против часовой стрелки
            [0, 0],
            [wall, 0],
            [wall, l1],
            [w / 2 + wall, l1 + l2], / Внутренний кончик носика
            [w + wall, l1],
            [w + wall, 0],
            [w + wall * 2, 0],
            [w + wall * 2, l1],
            [w / 2 + wall / 2 + wall, l1 + l2 + wall], / Внешний кончик носика
            [w / 2 - wall / 2 + wall, l1 + l2 + wall],
            [0, l1],
        ]
    );

    / Вырезы
    translate([w + wall, 0, height / 2 - toolWidth]) / Правый вырез чуть ниже середины
    cube([wall, l1 / 2, toolWidth]);
    translate([0, 0, height / 2]) / Левый вырез чуть выше середины
    cube([wall, l1 / 2, toolWidth]);
}


/ Крышка
module cover(z) {
    translate([0, 0, z])
    linear_extrude(wall)
    polygon(
        [ / Полигон идёт против часовой стрелки
            [0, 0],
            [w + wall * 2, 0],
            [w + wall * 2, l1],
            [w / 2 + wall / 2 + wall, l1 + l2 + wall],
            [w / 2 - wall / 2 + wall, l1 + l2 + wall],
            [0, l1],
        ]
    );
}
```

Надеюсь, я кому-то показал что даже без специального конструкторского
образования, но умея программировать - можно получать не только эфимерные
программки, но и вполне себе физические предметы, которые пригождаются в быту.
И если интересно, подбиваю экономику: напечатано 2 колпачка (1 и 2 версия),
каждый весом по 4 грамма, то есть примерно по 4₽ за штуку. Печатал пластиком
PLA, как моим самым любимым.

## Ссылки

- Сайт OpenSCAD - https://openscad.org/
- Документация - https://openscad.org/documentation.html
- Шпаргала по функциям - https://openscad.org/cheatsheet/index.html
- Библиотеки - https://openscad.org/libraries.html