Как создать 3D модель OpenCASCADE на C++ в среде QtCreator
В новом видео мы рассмотрим создание нашего первого приложения на OpenCASCADE в C++. Мы построим 3D модель тора и выведем её в файлы 2-х форматов: STEP и STL.
OpenCASCADE - это ядро геометрического моделирования в области систем автоматизированного проектирования (САПР). Например, с использованием библиотек OpenCASCADE создан свободный САПР FreeCAD.
Вывод созданной модели в файл позволит нам не делать самостоятельно визуализацию модели. Визуализируем с помощью внешних приложений. Формат STEP используется в САПР для хранения параметрических моделей. Для его просмотра будем использовать FreeCAD. Формат STL хранит полигональную модель, которую мы откроем в Blender.
✍️ Статья | 📱 YouTube | 📱 ВКонтакте
В новом видео мы рассмотрим создание нашего первого приложения на OpenCASCADE в C++. Мы построим 3D модель тора и выведем её в файлы 2-х форматов: STEP и STL.
OpenCASCADE - это ядро геометрического моделирования в области систем автоматизированного проектирования (САПР). Например, с использованием библиотек OpenCASCADE создан свободный САПР FreeCAD.
Вывод созданной модели в файл позволит нам не делать самостоятельно визуализацию модели. Визуализируем с помощью внешних приложений. Формат STEP используется в САПР для хранения параметрических моделей. Для его просмотра будем использовать FreeCAD. Формат STL хранит полигональную модель, которую мы откроем в Blender.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
#include <iostream>
double a = 2;
int main()
{
int a = 1;
std::cout << a / ::a << std::endl;
return 0;
}
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
38%
Никакой. Ошибка сборки
7%
2
45%
0.5
10%
"1 / 2"
XY-проблема
Представим себе вопрос в интернетах:
🤷♂️ Даже и не найдешься сразу, что ответить. Действительно, как держать?
Но после некоторых выяснений вопрос становится таким:
Вуаля! Теперь и дошкольник сообразит с ответом.
Это - типичная "Ошибка молотка" или XY-проблема. XY-проблема возникает, когда мы задаем неправильный вопрос по своей проблеме.
Обычно путь к XY-проблеме выглядит так:
1️⃣ Пусть нам надо решить проблему X.
2️⃣ Мы думаем, что для решения проблемы X подойдет метод Y.
3️⃣ У нас что-то не получается с методом Y.
4️⃣ ❌ Мы начинаем задавать вопрос по методу Y.
Хотя на самом деле надо задавать вопрос по проблеме X.
У меня недавно был кейс с похожей ситуацией. Нужно было ответить, как повысить производительность пагинации таблицы (постраничный просмотр). Однако в результате выяснилось, что дело не в пагинации, а в работе фильтров. То есть тормоза таблицы (проблема X) не были связаны с механизмом пагинации (метод Y), по которому был задан вопрос.
Помните об XY-проблеме всегда: и когда задаете вопрос, и когда на вопрос отвечаете.
Представим себе вопрос в интернетах:
Привет! У меня треснул микроскоп. Как его держать в следующий раз, чтобы он не треснул?
🤷♂️ Даже и не найдешься сразу, что ответить. Действительно, как держать?
Но после некоторых выяснений вопрос становится таким:
Я пытался забить гвоздь микроскопом и он треснул. Как его держать, чтобы он не треснул? Или что использовать вместо него?
Вуаля! Теперь и дошкольник сообразит с ответом.
Это - типичная "Ошибка молотка" или XY-проблема. XY-проблема возникает, когда мы задаем неправильный вопрос по своей проблеме.
Обычно путь к XY-проблеме выглядит так:
Хотя на самом деле надо задавать вопрос по проблеме X.
У меня недавно был кейс с похожей ситуацией. Нужно было ответить, как повысить производительность пагинации таблицы (постраничный просмотр). Однако в результате выяснилось, что дело не в пагинации, а в работе фильтров. То есть тормоза таблицы (проблема X) не были связаны с механизмом пагинации (метод Y), по которому был задан вопрос.
Помните об XY-проблеме всегда: и когда задаете вопрос, и когда на вопрос отвечаете.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🤔2❤1🎉1🕊1
#include <iostream>
int main()
{
int a = 1;
int& b = a;
++a;
++b;
std::cout << a << b << std::endl;
return 0;
}
Путаница в интерфейсах (часть 4)
➕ 1️⃣ в копилочку.
Все в диалоге хорошо, кроме отступа между кнопками.
Дело усугубляется тем, что это мобильный интерфейс. Легко промазать, когда палец накрывает обе кнопки сразу.
Еще и одна из кнопок красная 🔴😬
Усиливает ответственность момента)
P.S. Конкретно в этом случае я сомневаюсь, что так сделано нарочно. Скорее всего просто поплыли стили.
—
Читать "Путаница в интерфейсах (часть 3)"
Все в диалоге хорошо, кроме отступа между кнопками.
Дело усугубляется тем, что это мобильный интерфейс. Легко промазать, когда палец накрывает обе кнопки сразу.
Еще и одна из кнопок красная 🔴😬
Усиливает ответственность момента)
P.S. Конкретно в этом случае я сомневаюсь, что так сделано нарочно. Скорее всего просто поплыли стили.
—
Читать "Путаница в интерфейсах (часть 3)"
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Улучшение процессов на примере C3D Labs
👨💻 Много лет вы вели монолитную кодовую базу на SVN. Всё налажено, работает, все привыкли. Но вы понимаете, что процесс не вывозит возросшую сложность проекта. Надо развиваться, переходить на современные инструменты. Надо, но страшно. Работает же, привыкли.
Знакомо?
Если да, то посмотрите на опыт команды C3D Labs. У них в 2022 году была та же история: монолит на SVN, линейная работа в одну ветку, долгий процесс доставки... Но команда была намерена (или вынуждена 🙂) развиваться и пошла следующим путем:
1️⃣ Перешли с SVN на Git на базе GitLab, принципиально не меняя схему работы (2022 год).
2️⃣ Начали использовать фича-ветки, постепенно уходя от линейности.
3️⃣ Внедрили работу с ветками через Merge Request.
4️⃣ Освоили встроенный процесс Code Review.
5️⃣ Внедрили менеджер управления зависимостями Conan (2023 год).
6️⃣ Модернизировали систему тестирования.
Не сложно заметить, что каждый шаг получается довольно простой и самодостаточный. Сделав один пункт, можно дать себе передышку, освоиться и подготовиться к следующему.
И уже не так страшно, правда?
📍 Читайте всю статью здесь: Об изменениях в процессе доставки геометрического ядра C3D
Знакомо?
Если да, то посмотрите на опыт команды C3D Labs. У них в 2022 году была та же история: монолит на SVN, линейная работа в одну ветку, долгий процесс доставки... Но команда была намерена (или вынуждена 🙂) развиваться и пошла следующим путем:
Не сложно заметить, что каждый шаг получается довольно простой и самодостаточный. Сделав один пункт, можно дать себе передышку, освоиться и подготовиться к следующему.
И уже не так страшно, правда?
📍 Читайте всю статью здесь: Об изменениях в процессе доставки геометрического ядра C3D
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
#include <iostream>
class Data
{
char* text;
public:
void init(const Data& other)
{
std::cout << "1";
text = other.text;
}
void init(Data&& other)
{
std::cout << "2";
text = other.text;
}
};
Data createData()
{
return Data();
}
int main()
{
Data a, b, c, d;
b.init(a);
c.init(Data());
d.init(createData());
return 0;
}
Если тяжело ответить на тест, жмите подсказку ⤵️
Завандалил
Глядя на разрисованный лифт, я вспомнил случай с моими студентами.
На картинке выше фрагмент гугло-дока, куда ребята должны были самостоятельно вписать выбранные темы курсовых работ. Они это и сделали, все большие молодцы)
Но захожу я однажды в этот документ, чтобы сверить темы, и вижу...🤨 Даже не знаю как описать. Такого я никак не ожидал увидеть. Вставлять скрин этой жести в сам пост я не стал. Смотрите в комментариях.
Получилось так, что кто-то из ребят взял и размалевал гугло-док словно лифт в пятиэтажке. С той же пестротой, тональностью и безрассудством.
Почему, зачем? Да кто его знает. Потому что может. Потому что анонимно. Человек сам же там написал: "анонимочка так что по..."
🤦♂️
Анонимность и безнаказанность воистину срывают тормоза.
Глядя на разрисованный лифт, я вспомнил случай с моими студентами.
На картинке выше фрагмент гугло-дока, куда ребята должны были самостоятельно вписать выбранные темы курсовых работ. Они это и сделали, все большие молодцы)
Но захожу я однажды в этот документ, чтобы сверить темы, и вижу...
Получилось так, что кто-то из ребят взял и размалевал гугло-док словно лифт в пятиэтажке. С той же пестротой, тональностью и безрассудством.
Почему, зачем? Да кто его знает. Потому что может. Потому что анонимно. Человек сам же там написал: "анонимочка так что по..."
Анонимность и безнаказанность воистину срывают тормоза.
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2
Как создать оконное приложение на Qt в среде QtCreator
В этом видео мы рассмотрим процесс создания простого оконного приложения с помощью библиотеки Qt в среде разработки QtCreator. Мы поработаем с лэйаутами, то есть с разметкой элементов окна, добавим в окно таблицу, несколько полей ввода данных и кнопку.
Библиотека Qt - это набор классов C++ для создания кросс-платформенных приложений с графическим интерфейсом. С помощью этой библиотеки созданы, например, среда разработки QtCreator и инструмент для записи видео OBS Studio.
✍️ Статья | 📱 YouTube | 📱 ВКонтакте
В этом видео мы рассмотрим процесс создания простого оконного приложения с помощью библиотеки Qt в среде разработки QtCreator. Мы поработаем с лэйаутами, то есть с разметкой элементов окна, добавим в окно таблицу, несколько полей ввода данных и кнопку.
Библиотека Qt - это набор классов C++ для создания кросс-платформенных приложений с графическим интерфейсом. С помощью этой библиотеки созданы, например, среда разработки QtCreator и инструмент для записи видео OBS Studio.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
namespace std
{
struct A
{
int _array[256];
bool _filled;
};
}
bool is_filled(std::A obj)
{
return obj._filled;
}
int main()
{
std::A a;
return is_filled(a);
}
Выше дан код на C++. Проведите код-ревью и напишите в комментариях свои замечания. Если ваши замечания уже кто-то написал, ставьте палец 👍 комментатору)
Лично мне здесь принципиально не нравятся 4 момента 🧐
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Анонимные пространства имен в C++
Пространства имен
Например, у стандартной библиотеки STL есть свое пространство имен по названием
Но есть в C++ отдельный тип пространств имен - анонимные (unnamed). Анонимные пространства имен объявляются... 🥁 без указания имени. Вот так:
У анонимных пространств есть 2 важных свойства:
1️⃣ Они ограничивают область видимости всех сущностей внутри себя только тем файлом исходного кода, в котором они объявлены.
2️⃣ Они являются закрытыми. То есть из разных исходных файлов нельзя добавить сущности в одно и то же анонимное пространство имен.
При этом не стоит объявлять анонимные пространства имен в заголовочных файлах. Это приведет к тому, что в каждой единице компиляции, где включается этот заголовочник, будут созданы копии символов этого пространства.
А о том, почему не стоит запихивать свои символы в пространство имен std, мы вспоминали на прошлой неделе. Смотрите комментарии под постом.
Пространства имен
namespace в C++ служат для решения конфликтов имен классов, функций, переменных и прочего. Другое назначение - смысловое; чтобы повысить читаемость кода.Например, у стандартной библиотеки STL есть свое пространство имен по названием
std. Благодаря этому имена в нашем пользовательском коде никогда не пересекутся с именами стандартной библиотеки. Если конечно мы не будем везде лепить using namespace std; 🤨Но есть в C++ отдельный тип пространств имен - анонимные (unnamed). Анонимные пространства имен объявляются... 🥁 без указания имени. Вот так:
namespace
{
// Что-то внутри нейм-спейса
}
У анонимных пространств есть 2 важных свойства:
При этом не стоит объявлять анонимные пространства имен в заголовочных файлах. Это приведет к тому, что в каждой единице компиляции, где включается этот заголовочник, будут созданы копии символов этого пространства.
А о том, почему не стоит запихивать свои символы в пространство имен std, мы вспоминали на прошлой неделе. Смотрите комментарии под постом.
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔1
Выше дан код на C++. Какой вывод будет у программы?
Anonymous Quiz
47%
0
16%
0b000001
16%
0b101111
21%
1
🥴2
Моргнул свет и потух комп.
Пробую включать. Он не реагирует. Перещёлкнул блок питания - включился.
Запускаю веб-сервер Apache - не алё. Контрольная панель что-то там ругается, что апача больше нет.
Слабо верится.
Иду смотреть, может конфиги какие слетели, а там... А там реально нет апача. Ну, в смысле нет бинаря httpd. Удалился.
Уже интереснее. Восстановил бинарь. Запускаю его и узнаю, что куча библиотек-зависимостей тоже не в чате...
Получается, все бинари, которые были загружены апачем в память, теперь удалены с диска.
Вот такая фишечка
👍 👍 👍
Похоже, пятница сегодня у апача. Будьте бдительны 😁
Пробую включать. Он не реагирует. Перещёлкнул блок питания - включился.
Запускаю веб-сервер Apache - не алё. Контрольная панель что-то там ругается, что апача больше нет.
Слабо верится.
Иду смотреть, может конфиги какие слетели, а там... А там реально нет апача. Ну, в смысле нет бинаря httpd. Удалился.
Уже интереснее. Восстановил бинарь. Запускаю его и узнаю, что куча библиотек-зависимостей тоже не в чате...
Получается, все бинари, которые были загружены апачем в память, теперь удалены с диска.
Вот такая фишечка
Похоже, пятница сегодня у апача. Будьте бдительны 😁
Please open Telegram to view this post
VIEW IN TELEGRAM
😢3
Библиотека или фреймворк
🔜 Библиотека - это набор функциональности, решающий определенную задачу.
🔜 Фреймворк - это набор функциональности, определяющий структуру приложения.
То есть понятия похожие, но фреймворк рассматривается в более широком смысле, чем библиотека. Фреймворк навязывает нам определенную структуру приложения, проникая во все его части. Библиотека же предполагает более изолированное использование.
Например, minizip - это библиотека, работающая с архивами, то есть решающая конкретную задачу. А Qt - это уже фреймворк, определяющий все основные элементы приложения: интерфейс, обработка событий, ввод/вывод и др.
#Словарь
То есть понятия похожие, но фреймворк рассматривается в более широком смысле, чем библиотека. Фреймворк навязывает нам определенную структуру приложения, проникая во все его части. Библиотека же предполагает более изолированное использование.
Например, minizip - это библиотека, работающая с архивами, то есть решающая конкретную задачу. А Qt - это уже фреймворк, определяющий все основные элементы приложения: интерфейс, обработка событий, ввод/вывод и др.
#Словарь
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2