![Олег Кирьянов](/upload/image_resize_cache/iblock/217/xs6021cyihohf2ftl295lohycyrx880j-1536-1131-5.webp)
Сегодня в связи с уходом Autodesk с российского рынка многие проектные организации рассматривают Платформу nanoCAD для замены AutoCAD.
Меня зовут Олег Кирьянов, я руковожу отделом внедрения и инженерной поддержки САПР в компании «Системный софт», которая является премьер- и фокус-партнером «Нанософт» по направлениям «Конструкции» и «Машиностроение». Мы получаем от пользователей множество вопросов к технической поддержке, и один из самых частых: «Как в nanoCAD создавать сложные динамические объекты и “дружит” ли эта платформа с автокадовскими динамическими блоками?». Постараюсь дать развернутый ответ и на примерах описать все нюансы.
Платформа nanoCAD – многоцелевой инструмент черчения, разработанный компанией «Нанософт». Она изначально поддерживает файлы *.dwg, предлагает знакомый пользователям AutoCAD макет и набор инструментов. Программное обеспечение включает инструменты редактирования таблиц в стиле Excel, ускоряя работу с документацией, позволяя встраивать макросы и формулы в каждую ячейку. Платформа nanoCAD также располагает открытыми наборами API для создания приложений, автоматизирующих выполнение задач и экономящих время пользователя.
Динамические блоки – это двумерные параметрические объекты с настраиваемым набором свойств. Они предоставляют возможность сохранить в одном блоке (наборе простейших геометрических форм, с которыми может работать система) несколько геометрических реализаций, отличающихся друг от друга размером, взаимным расположением частей блока, видимостью отдельных элементов и т. п. С помощью динамических блоков можно сократить библиотеки стандартных элементов (один динамический блок заменяет несколько обычных). Также активное использование динамических блоков в ряде случаев позволяет значительно ускорить выпуск рабочей документации.
Динамические блоки в AutoCAD – это нечто вроде обычных блоков, но на стероидах. В обычном блоке AutoCAD вы можете использовать одну базовую точку, чтобы повернуть ее или масштабировать, и это будет почти вся гибкость, которую он способен предложить. А в динамическом блоке вы можете растянуть его, изменить его форму, полностью изменить на другой тип и многое другое.
Например, используя единый динамический блок, можно создать металлический профиль с выбором различных типов сечений и размеров этих сечений, а также с указанием необходимого представления (сбоку, сверху и т.п.), на котором можно будет динамически изменять длину профиля и т.д.
Платформа nanoCAD поддерживает динамические блоки, созданные в AutoCAD. Но не всё так просто. С довольно сложными в исполнении автокадовскими динамическими блоками возникают проблемы. Затруднительно спрогнозировать, будет ли «сломан» конкретный автокадовский динамический блок в nanoCAD или нет, но, как показывает практика, чем больше в динамическом блоке параметров, связанных с управлением геометрией объекта, тем выше риск, что в nanoCAD он будет работать некорректно.
Несколько примеров для наглядности. Представленные на иллюстрациях динамические блоки созданы в AutoCAD. Откроем *.dwg файл с этими блоками в nanoCAD и рассмотрим, как они будут отрабатывать при внесении изменений.
Первый пример: линейный обрыв. Здесь представлены один линейный параметр, один параметр поворота, две линейных «ручки» и одна «ручка» поворота (рис. 1).
![Рис. 1.](/upload/image_resize_cache/sprint.editor/277/bshs2jsov2e8i7l81ro7qmhur08mhwiq-688-537-5.webp)
В nanoCAD объект работает без проблем: геометрия корректно изменяется при перемещении «ручек» (рис. 2).
![Рис. 2.](/upload/image_resize_cache/sprint.editor/2c7/h3jktydb0blkstwpy8rpi2dmilocku06-688-537-5.webp)
Второй пример: неравнополочный уголок (рис. 3). Здесь на геометрию наложено большое количество зависимостей и параметров. В AutoCAD этот динамический блок работает согласно примененным зависимостям.
![Рис. 3.](/upload/image_resize_cache/sprint.editor/caf/2hci2suq0hyod1v7fxqak0retj9bh06t-688-537-5.webp)
В nanoCAD же он «ломается»: при внесении изменений в представление «Сбоку» некорректно изменяется длина (рис. 4), а при попытке выбора другого типа уголка геометрия сечения никак не изменяется.
![Рис. 4.](/upload/image_resize_cache/sprint.editor/fb8/mwe9cqp6fl778nj8nt3ch87n54ntiwwk-688-537-5.webp)
Еще один пример некорректной работы автокадовского динамического блока в nanoCAD: текст не следует за перемещением выноски, а «ручка», которая отвечает за изменение диаметра круга, лежит за пределами круга (рис. 5).
![Рис. 5.](/upload/image_resize_cache/sprint.editor/145/f91zveff980gcvfmpi1da8l04ybvyu0v-688-537-5.webp)
Проблему усугубляет тот факт, что при попытке, применяя Редактор блоков, открыть и отредактировать в nanoCAD сложные в исполнении динамические блоки, пользователь увидит сообщение, показанное на рис. 6.
![Рис. 6.](/upload/image_resize_cache/sprint.editor/ef7/0p3dhj3opnec9k48ctjckebf8w26hmqi-688-537-5.webp)
Открыть и отредактировать более простые автокадовские динамические блоки через Редактор блоков nanoCAD можно, но особого смысла в этом нет. Например, в случае уже рассмотренного нами линейного обрыва мы увидим результат, представленный на рис. 7.
![Рис. 7.](/upload/image_resize_cache/sprint.editor/35a/3m7yss9ul3nta8vknp79h499ag9vsk6w-688-537-5.webp)
То есть будет видна только геометрия объекта, но не «ручки» и не те параметры, которые представлены в Редакторе блоков AutoCAD. Редактор блоков nanoCAD не содержит инструментария для создания геометрических параметров, поэтому мы не сможем добавить здесь новые геометрические параметры, а также отредактировать существующие.
Очевидно, что существует вопрос совместимости динамических блоков при переносе из AutoCAD в nanoCAD. И универсального решения этой головоломки на сегодня нет.
Рабочий вариант – тестировать и проверять, как работает тот или иной динамический блок в nanoCAD. Если он отрабатывает корректно и результаты устраивают, его можно использовать в рабочих чертежах, создаваемых в nanoCAD.
Если же динамический блок «ломается», значит нужно создавать новый, с нуля, учитывая возможности инструментов nanoCAD. Об этом дальше.
Как уже сказано, Редактор блоков nanoCAD не содержит инструментария для создания геометрических параметров. Но управлять геометрией блоков в nanoCAD можно с помощью состояний видимости (рис. 8). Принцип создания таких блоков очень прост: можно создавать в Редакторе блоков различные примитивы, после чего присваивать им соответствующее представление. А уже в самом проекте переключать созданные представления, показывая или скрывая те или иные примитивы в блоке.
![Рис. 8.](/upload/image_resize_cache/sprint.editor/946/1888xw4shc3pmx8fn1vubnx79zgs1mpl-688-537-5.webp)
Допустим, нам нужно создать условное обозначение дверного проема с линией открывания двери. При этом мы хотим, чтобы ширина проема (и, соответственно, длина полотна двери) изменялась в зависимости от выбранного типа двери.
![Рис. 9.](/upload/image_resize_cache/sprint.editor/aaa/u8he5oo4zhb9rxrrqxr86j5eezigs8b1-688-537-5.webp)
Создаем геометрию, как показано на рис. 9, и вызываем команду БЛОК, затем указываем имя будущего блока и объекты, которые будут в этот блок входить (красные линии и зеленую дугу) – (рис. 10).
![Рис. 10.](/upload/image_resize_cache/sprint.editor/854/qh5g53gfrnar3miw51to0wctab2sbarr-688-537-5.webp)
Далее через команду БЛОКРЕД открываем созданный блок в Редакторе блоков (рис. 11). В группе Видимость нажимаем кнопку Состояния видимости. Нажимаем ОК. После этого графически указываем любое удобное положение «ручки» видимости и название параметра (назовем его ТипДвери_План).
![Рис. 11.](/upload/image_resize_cache/sprint.editor/f40/03wist6hodfekr8uddach7a6x4izooql-688-537-5.webp)
В следующем диалоговом окне для параметра ТипДвери_План создаем необходимый набор состояний видимости. По умолчанию одно состояние видимости, с наименованием Состояние видимости0, уже создано (рис. 12). Переименуем его в Д21-9.
![Рис. 12.](/upload/image_resize_cache/sprint.editor/8a3/4cq5zvdoocqz3zsx00xrw4t3u4mhkn7x-688-537-5.webp)
При создании новых состояний видимости (будем называть их Д21-10 и Д21-11) заранее ставим переключатель в положение Скрыть все существующие объекты (рис. 13).
![Рис. 13.](/upload/image_resize_cache/sprint.editor/778/52y0i0jtv05yaai87qtlr04rumcd4beh-688-537-5.webp)
После подтверждения в группе Видимость станет доступен выпадающий список состояний видимости. В Д21-9 у нас уже есть геометрия. Поэтапно переключимся с помощью этого списка на следующие состояния видимости и добавим в каждом примитивы с соответствующей геометрией (в Д21-10 ширина проема будет равна 1000, а в Д21-11 – 1100). Также в группе Видимость можно включить опцию Режим видимости (рис. 14), которая позволит видеть все примитивы в блоке независимо от включенного состояния видимости.
![Рис. 14.](/upload/image_resize_cache/sprint.editor/d3b/3l13o18mmm2irtt8dvn19z10sn3r91xk-688-537-5.webp)
В результате у нас получился объект, геометрией которого мы управляем с помощью «ручки» видимости (рис. 15).
![Рис. 15.](/upload/image_resize_cache/sprint.editor/19c/97ikond07fcen3muzf83pj1uf3rx51v7-688-537-5.webp)
Но что же делать, если нужно создать сложные блоки с возможностью параметризации их геометрии? Здесь на помощь приходит модуль «СПДС» и его инструмент, который называется Мастер объектов.
Мастер объектов – параметрический инструмент создания типовых объектов, позволяющий формировать правила их поведения в контексте сборки или заимствовать свойства существующих объектов из базы данных. Все объекты, созданные в Мастере, можно хранить в единой БД (рис. 16), обеспечивая тем самым централизованный доступ специалистов к этой базе данных.
![Рис. 16.](/upload/image_resize_cache/sprint.editor/01c/si4zieewuj8roh3876gn74gxeywlwh0o-688-537-5.webp)
В этом инструменте представлены встроенный механизм распознавания пользовательской графики с возможностью указания табличных параметров (рис. 17), редактор скриптов (рис. 18), редактор форм (форма (рис. 19-20) – это диалоговое окно с параметрами и представлениями, которое открывается при вставке или редактировании объекта).
![Рис. 17.](/upload/image_resize_cache/sprint.editor/aa0/hi4ti2jkn1gtf8842kc4a99ss5pymsff-688-537-5.webp)
![Рис. 18.](/upload/image_resize_cache/sprint.editor/d99/rqju82uawt1srxp3g152uz2lfpkrbc31-688-537-5.webp)
![](/upload/image_resize_cache/sprint.editor/054/n69de90nfurm0mbxbixolh67bg2f0g4u-688-537-5.webp)
![Рис. 19.](/upload/image_resize_cache/sprint.editor/5cd/9m2y9nsi9vu6xp92zegy0rndf1ym0c1c-688-537-5.webp)
Вернемся к нашему условному обозначению дверного проема с линией открывания двери и создадим его с помощью Мастера объектов. Для начала создаем геометрию объекта посредством примитивов и образмериваем ее так, как показано на рис. 20.
![Рис. 20.](/upload/image_resize_cache/sprint.editor/e95/4ria02qsi4728eznuiyhol5spyzgr6uf-688-537-5.webp)
Горизонтальная зеленая линия нужна здесь для простановки углового размера, в дальнейшем ее скрываем.
Далее переходим на вкладку СПДС – группа Мастер объектов. Нажимаем кнопку Точка вставки для указания точки вставки будущего объекта. Затем нажимаем кнопку Установить параметр и поочередно выбираем проставленные размеры, чтобы назначить параметры, которые будут управлять размерами объекта (параметр для размера 200 назовем t, параметр для размера 900 – A, параметр для углового размера – v) – (рис. 21).
![Рис. 21.](/upload/image_resize_cache/sprint.editor/034/rsk0k6zripbjvr8j8w2b7o7lqsm9tblk-688-537-5.webp)
Снова нажимаем Установить параметр и выбираем горизонтальную зеленую линию. В поле Отображать диалогового окна Свойства объекта указываем 0 (рис. 22) – это означает, что после создания объекта и его последующей вставки в чертеж данная линия не будет выводиться на экран.
![Рис. 22.](/upload/image_resize_cache/sprint.editor/10a/9586zhk2z731cnei0x64m952vmkka783-688-537-5.webp)
Аналогично установим параметр на дуговую линию открывания двери. В поле Отображать напишем будущее название параметра, который будет управлять отображением дуги, – dol, а в поле Тип линии укажем 2 – чтобы данная дуга всегда создавалась тонкой линией (рис. 23).
![Рис. 23.](/upload/image_resize_cache/sprint.editor/cb7/bip3k5qe19c7wpy1vcvudualfldyix1u-688-537-5.webp)
Все необходимые манипуляции над эскизом нашего объекта мы выполнили. Теперь вызываем Мастер объектов. Для создания нового объекта в диалоговом окне выбираем Объект – Новый, указываем папку, в которую будет сохранен объект, а также прописываем название объекта (рис. 24).
![Рис. 24.](/upload/image_resize_cache/sprint.editor/e4a/hl84iublnq5ia0lantpb6qtchlh0m7wu-688-537-5.webp)
После этого находим в дереве Мастера объектов раздел Исполнение и правой кнопкой мыши вызываем контекстное меню, где выбираем Добавить исполнение (рис. 25).
![Рис. 25.](/upload/image_resize_cache/sprint.editor/3cc/0h4a0rqy9j0qagy9qze5wspacqfm5ohj-688-537-5.webp)
В правой части диалогового окна щелкаем правой кнопкой мыши на появившемся исполнении и выбираем Параметрическое распознавание вида (рис. 26), после чего указываем все необходимые объекты в пространстве модели, включая размеры.
![Рис. 26.](/upload/image_resize_cache/sprint.editor/122/umk04vjqk5ku4fiz9akya63p3xhsx3d3-688-537-5.webp)
После успешного распознавания появится сообщение, показанное на рис. 27.
![Рис. 27.](/upload/image_resize_cache/sprint.editor/31f/w2zpzzwqixw69mfb3urp93zfknprm965-688-537-5.webp)
Теперь можно приступить к созданию скрипта. Начинающим пользователям предлагается Мастер скриптов – механизм самостоятельного пошагового составления алгоритмов, управляющих поведением объекта в момент его вставки и редактирования. Данный механизм позволяет в большинстве случаев не прибегать к ручному написанию скрипта. Вызывается он в разделе Мастер – Мастер скриптов.
На шаге «Основные свойства» заполняются основные данные скрипта. Здесь необходимо заполнить значения основных параметров: Описание объекта (описывает общее название объекта), Имя объекта (указанное значение будет отображаться в шапке диалогового окна выбора параметров объекта), Тип объекта (служит для идентификации объекта как принадлежащего к какой-либо группе. Эту информацию желательно внести латинскими буквами) и Подтип объекта (определяет подтип конкретного ГОСТа. Здесь также желательно заполнение латинскими буквами). Без указания значений перечисленных параметров Мастер скриптов не позволит перейти к следующему шагу.
Изменение параметров сразу же отображается в окне обзора скрипта (рис. 28).
![Рис. 28.](/upload/image_resize_cache/sprint.editor/39e/lexayg3uuufqo3db3797ub218rn0s31h-688-537-5.webp)
На шаге «Свойства параметров» устанавливаются свойства и начальные значения выбранных параметров всех распознанных видов (рис. 29). Установим здесь следующие значения:
- параметр А: зеленая галочка Доступен для редактирования, описание параметра: Ширина проема, значение по умолчанию – 900;
- параметр t: зеленая галочка Доступен для редактирования, описание параметра: Толщина стены, значение по умолчанию – 200;
- параметр v: красная галочка Используется, описание параметра: Угол, значение по умолчанию – 30.
![Рис. 29.](/upload/image_resize_cache/sprint.editor/0a9/u5un45arrmjoatz07qsfo9fy5r5llzmk-688-537-5.webp)
Также на этом шаге добавим параметр, управляющий отображением дуги (dol) – (рис. 30). Для этого необходимо щелкнуть на любом параметре, ввести в поле ввода/редактирования названия параметра значение dol и нажать кнопку Добавить параметр (направленная вверх зеленая стрелка).
![Рис. 30.](/upload/image_resize_cache/sprint.editor/8f8/ifoz2vceqd263g0bkr86e1c5jz92xxwf-688-537-5.webp)
Установим для него следующие значения (рис. 31): красная галочка Используется, описание параметра: Линия открывания двери, значение по умолчанию – 1.
![Рис. 31.](/upload/image_resize_cache/sprint.editor/bb9/o38cr5nne06g0lxik6kito31cv18663f-688-537-5.webp)
На следующем шаге, «Вычисление параметров», устанавливается способ выбора значений параметров, используемых в скрипте. Оставляем для всех параметров стандартное значение Отображать диалог и нажимаем кнопку Вперед (рис. 32).
![Рис. 32.](/upload/image_resize_cache/sprint.editor/38e/ib84vltgfqfsdxraaweqefbs09z01ncs-688-537-5.webp)
Шаг «Условия отрисовки». Здесь определяются условия отображения некоторых компонентов диалога редактирования объекта, в зависимости от параметров.
Введем название переключателя: «Линия открывания двери». Добавим переключатель «Линия открывания двери» в список переключателей, нажав на направленную вверх зеленую стрелку. В поле Включен пропишем dol=1, в поле Выключен – dol=0. Поставим галочку Включен по умолчанию (рис. 33). Таким образом можно отдельно управлять отображением дуговой линии открывания двери.
![Рис. 33.](/upload/image_resize_cache/sprint.editor/0ea/306kymgoa482dvx5y1ih26ej8nz5fsds-688-537-5.webp)
Добавим еще два переключателя: «Угол 30» и «Угол 90», которые будут сгруппированы (рис. 34).
Для «Угол 30» в поле Включен пропишем v=30, в поле Выключен – v!=30 (и поставим галочку Включен по умолчанию).
Для «Угол 90» в поле Включен пропишем v=90, в поле Выключен – v!=90 (галочку Включен по умолчанию здесь не ставим).
Теперь мы можем управлять углом открывания двери с помощью выпадающего списка с фиксированными значениями в 30 и 90 градусов.
![Рис. 34.](/upload/image_resize_cache/sprint.editor/03e/zqo8uc85yxex1tmnq93r9j8gmrrv7gh3-688-537-5.webp)
Шаг «Рабочие плоскости» пропускаем (в нашем случае здесь никаких операций производить не надо) и переходим к шагу «Скрыть/показать параметры». На этом шаге мы указываем, какие параметры будут отображаться в диалоге вставки и редактирования объекта. Убираем галочки параметров v и dol (рис. 35) – значения данных параметров будем определять с помощью переключателей, поэтому их отображение в диалоге вставки и редактирования излишне.
![Рис. 35.](/upload/image_resize_cache/sprint.editor/8f0/sbaj80q9sr3tgsyqic4irdon9zxsr7lm-688-537-5.webp)
Шаг «Условия отображения» пропускаем, а на шаге «Переключатели управления» дополнительно ставим галочку Отрисовывать объект во время вставки (рис. 36), чтобы при выборе точки вставки и вектора направления объект отрисовывался на экране.
![Рис. 36.](/upload/image_resize_cache/sprint.editor/865/h1tvw3q3x6nio15i0zx1mnh69zudxogg-688-537-5.webp)
На шаге «Текущий скрипт» можно проверить скрипт и сохранить его. Созданный объект отобразится в базе элементов (рис. 37).
![Рис. 37.](/upload/image_resize_cache/sprint.editor/008/uljpxa1nctkgc3j8nqyqmyix5a9zjsuh-688-537-5.webp)
При вставке будет отображаться диалоговое окно, в котором можно задавать значения параметров: указывать размеры, включать или отключать отображение линии открывания двери и выбирать нужный угол открывания (рис. 38).
![](/upload/image_resize_cache/sprint.editor/438/j4cj8tguty24qdi3zg50lr6e0lwqj0k4-688-537-5.webp)
![](/upload/image_resize_cache/sprint.editor/15e/lqdtj8zwe4d9u0xpho51s17fv1acq6mr-688-537-5.webp)
![Рис. 38.](/upload/image_resize_cache/sprint.editor/32e/bwl00j0akje7ouozd6bati24o7do168m-688-537-5.webp)
Кроме того, поскольку на шаге «Свойства параметров» мы ставили для параметров A и t зеленую галочку Доступна для редактирования, значения данных параметров можно вводить и через панель Свойства (рис. 39).
![Рис. 39.](/upload/image_resize_cache/sprint.editor/e1d/eupcpjnp05r3oi2mxc8ht4dj4excunwd-688-537-5.webp)
При необходимости данный объект можно усложнить. Например, ввести табличные параметры, чтобы использовать фиксированные значения параметров (рис. 40).
![Рис. 40.](/upload/image_resize_cache/sprint.editor/e54/u9063eo7l1oyiigcpcr8n83c0llz0cdm-688-537-5.webp)
После обновления скрипта при вставке нашего объекта можно будет выбирать заданные значения в диалоге редактирования объекта (раздел Табличные параметры) – (рис. 41).
![Рис. 41.](/upload/image_resize_cache/sprint.editor/2cc/xouueosg33dddp0m0ecdoslw1sjp0mf5-688-537-5.webp)
Если на объекте требуется добавить «ручку», с помощью которой можно будет графически управлять параметром t, понадобится дополнить скрипт уже вручную. В нашем случае выбираем в Мастере объектов раздел Методы – Обработчики событий – SetGripPoint и прописываем следующий текст (он выделен на рис. 42):
function SetGripPoint {
NGrip = 2;
pntGrip0 = pntOrigin;
pntGrip1 = pntOrigin-t*vecPlane;
};
![Рис. 42.](/upload/image_resize_cache/sprint.editor/38d/0v6ipbpumcq3w73evcs5mi1cxv8btsta-688-537-5.webp)
Далее выбираем раздел Методы – Обработчики событий – OnMoveGripPoint и добавляем следующий текст (выделен на рис. 43):
function OMoveGripPoint {
if (NMovingGrip == 0) {
pntOrigin = pntGrip0;
};
//ручка толщины стены
if (NMovingGrip == 1) {
t = max ((vecLen(pntGrip0 - pntGrip1)/rScl),1);
vecPlane = pntGrip1 + pntGrip0;
};
};
![Рис. 43.](/upload/image_resize_cache/sprint.editor/1c4/85l3hx3smq9wt93te2fmhg57m6iurg25-688-537-5.webp)
После сохранения скрипта на объекте появится дополнительная «ручка» (рис. 44), посредством которой можно изменять длины отрезков, связанных с параметром t.
![Рис. 44.](/upload/image_resize_cache/sprint.editor/a95/0e7vj6l44g63ofns53i1qc5p7g2nhall-688-537-5.webp)
Функционал Мастера объектов довольно обширен (рис. 45), здесь мы коснулись лишь нескольких примеров его использования. Для самостоятельного изучения есть необходимая документация. Можно в разделе «Помощь» открыть подробную справку по работе с Мастером объектов или сразу перейти в раздел «Синтаксис языка скриптов». В справке собраны различные примеры с пошаговым описанием создания объекта – они позволят потренироваться и понять логику работы Мастера.
![Рис. 45.](/upload/image_resize_cache/sprint.editor/78f/chdo0aoziob01wud5s5mpoqbmk4sfx8w-688-537-5.webp)
При этом в базу элементов модуля «СПДС» уже включен обширный набор наиболее часто используемых условных обозначений, металлических профилей, сборных железобетонных изделий, деталей креплений и др.
Каждый объект имеет параметры, соответствующие стандарту, ГОСТу, серии. Поэтому в предоставленной библиотеке пользователь с большей долей вероятности сможет найти для себя все нужные объекты.
Надеюсь, что статья помогла вам лучше понять нюансы работы с динамическими блоками в Платформе nanoCAD.
![nanoCAD GeoniCS 25.0 – обновление на Платформе nanoCAD 25](/upload/image_resize_cache/iblock/5dd/mepqff9ncme5p9wpv5dv16q0tjh5szul-400-240-5.webp)
![На AIRVent 2025 компания «Нанософт» представила BIM-технологии инженерных систем на Платформе nanoCAD 25](/upload/image_resize_cache/iblock/258/725zx6v0ooodcevaarkuuiu974f7yp5r-400-240-5.webp)
![Компания «Нанософт» и СПбГАСУ повышают квалификацию преподавателей: реализована программа обучения работе в nanoCAD](/upload/image_resize_cache/iblock/8c3/dlckojie4gdo3obxuxfeo1kg8n3dl33r-400-240-5.webp)