From 4f650ef3fbf2cd5136376f196592d2df4e55fc45 Mon Sep 17 00:00:00 2001 From: David Andrs Date: Fri, 31 Mar 2023 07:37:29 -0600 Subject: [PATCH 01/92] Adding application icon on macOS --- images/appicon.icns | Bin 0 -> 8950 bytes mayo.pro | 1 + 2 files changed, 1 insertion(+) create mode 100644 images/appicon.icns diff --git a/images/appicon.icns b/images/appicon.icns new file mode 100644 index 0000000000000000000000000000000000000000..9a74015582507fddd120543c2627e06e97749d5b GIT binary patch literal 8950 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 Date: Fri, 14 Apr 2023 13:29:44 +0200 Subject: [PATCH 02/92] More documentation in source code[skip ci] --- src/base/tkernel_utils.h | 1 + src/gui/gui_application.h | 13 +++++++++++++ src/io_image/io_image.h | 4 ++++ 3 files changed, 18 insertions(+) diff --git a/src/base/tkernel_utils.h b/src/base/tkernel_utils.h index 84720b4d..3dd45009 100644 --- a/src/base/tkernel_utils.h +++ b/src/base/tkernel_utils.h @@ -25,6 +25,7 @@ class Message_ProgressIndicator; namespace Mayo { +// Provides helper functions for OpenCascade TKernel library class TKernelUtils { public: template diff --git a/src/gui/gui_application.h b/src/gui/gui_application.h index 6478f334..fbf90072 100644 --- a/src/gui/gui_application.h +++ b/src/gui/gui_application.h @@ -18,6 +18,19 @@ namespace Mayo { class GuiDocument; +// Provides management of GuiDocument objects +// +// GuiApplication is connected to a "base" Application object: +// - when a Base::Document is created, a corresponding GuiDocument object is automatically created +// - when a Base::Document is closed, the mapped GuiDocument is automatically destroyed +// +// Typically application code should not create/destroy GuiDocument(s), this is the +// responsability of a central GuiApplication object. In some corner-case scenarios though, this +// behavior can be switched off with GuiApplication::setAutomaticDocumentMapping(false) +// +// GuiApplication acts also as a container of GraphicsObjectDriver objects. +// Those drivers are used by GuiDocument to automatically create 3D graphics representing the +// entities owned by the Base::Document class GuiApplication { public: GuiApplication(const ApplicationPtr& app); diff --git a/src/io_image/io_image.h b/src/io_image/io_image.h index 80770999..66b70076 100644 --- a/src/io_image/io_image.h +++ b/src/io_image/io_image.h @@ -29,6 +29,10 @@ class GuiDocument; namespace Mayo { namespace IO { +// Provides a writer for image creation +// Formats are those supported by OpenCascade with Image_AlienPixMap, see: +// https://dev.opencascade.org/doc/refman/html/class_image___alien_pix_map.html#details +// The image format is specified with the extension for the target file path(eg .png, .jpeg, ...) class ImageWriter : public Writer { public: ImageWriter(GuiApplication* guiApp); From a52281d194eb2b75ff146b1fab6e65b8269be59b Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 17 Apr 2023 17:39:37 +0200 Subject: [PATCH 03/92] Base: apply pimpl pattern to TaskManager --- src/base/task.h | 2 + src/base/task_common.h | 3 ++ src/base/task_manager.cpp | 103 ++++++++++++++++++++++++++------------ src/base/task_manager.h | 32 +++--------- src/base/task_progress.h | 1 + 5 files changed, 83 insertions(+), 58 deletions(-) diff --git a/src/base/task.h b/src/base/task.h index 141ece57..0c506974 100644 --- a/src/base/task.h +++ b/src/base/task.h @@ -15,8 +15,10 @@ namespace Mayo { class TaskManager; class TaskProgress; +// Piece of code that has to be executed as a task(ie with TaskManager::run/exec()) using TaskJob = std::function; +// Provides a task(job) to be executed by the owning task manager class Task { public: TaskId id() const { return m_id; } diff --git a/src/base/task_common.h b/src/base/task_common.h index 10c1514c..ebb9a935 100644 --- a/src/base/task_common.h +++ b/src/base/task_common.h @@ -10,7 +10,10 @@ namespace Mayo { +// Task identifier type using TaskId = uint64_t; + +// Syntactic sugar for task auto-deletion flag(see TaskManager::run/exec()) enum class TaskAutoDestroy { On, Off }; } // namespace Mayo diff --git a/src/base/task_manager.cpp b/src/base/task_manager.cpp index c09b3e9c..4bfa2e9d 100644 --- a/src/base/task_manager.cpp +++ b/src/base/task_manager.cpp @@ -6,18 +6,48 @@ #include "task_manager.h" -#include "application.h" #include "cpp_utils.h" #include "math_utils.h" +#include #include +#include +#include +#include namespace Mayo { +struct TaskManager::Entity { + Task task; + TaskProgress taskProgress; + std::string title; + std::future control; + std::atomic isFinished = false; + TaskAutoDestroy autoDestroy = TaskAutoDestroy::On; +}; + +struct TaskManager::Private { + Private(TaskManager* mgr) : taskMgr(mgr) {} + + TaskManager::Entity* findEntity(TaskId id); + const TaskManager::Entity* findEntity(TaskId id) const; + void execEntity(TaskManager::Entity* entity); + void cleanGarbage(); + + TaskManager* taskMgr = nullptr; + std::atomic taskIdSeq = {}; + std::unordered_map> mapEntity; +}; + +TaskManager::TaskManager() + : d(new Private(this)) +{ +} + TaskManager::~TaskManager() { // Make sure all tasks are really finished - for (const auto& mapPair : m_mapEntity) { + for (const auto& mapPair : d->mapEntity) { const std::unique_ptr& ptrEntity = mapPair.second; if (ptrEntity->control.valid()) ptrEntity->control.wait(); @@ -25,49 +55,51 @@ TaskManager::~TaskManager() // Erase the task from its container before destruction, this will allow TaskProgress destructor // to behave correctly(it calls TaskProgress::setValue()) - for (auto it = m_mapEntity.begin(); it != m_mapEntity.end(); ) - it = m_mapEntity.erase(it); + for (auto it = d->mapEntity.begin(); it != d->mapEntity.end(); ) + it = d->mapEntity.erase(it); + + delete d; } TaskId TaskManager::newTask(TaskJob fn) { - const TaskId taskId = m_taskIdSeq.fetch_add(1); + const TaskId taskId = d->taskIdSeq.fetch_add(1); std::unique_ptr ptrEntity(new Entity); ptrEntity->task.m_id = taskId; ptrEntity->task.m_fn = std::move(fn); ptrEntity->task.m_manager = this; ptrEntity->taskProgress.setTask(&ptrEntity->task); - m_mapEntity.insert({ taskId, std::move(ptrEntity) }); + d->mapEntity.insert({ taskId, std::move(ptrEntity) }); return taskId; } void TaskManager::run(TaskId id, TaskAutoDestroy policy) { - this->cleanGarbage(); - Entity* entity = this->findEntity(id); + d->cleanGarbage(); + Entity* entity = d->findEntity(id); if (!entity) return; entity->isFinished = false; entity->autoDestroy = policy; - entity->control = std::async([=]{ this->execEntity(entity); }); + entity->control = std::async([=]{ d->execEntity(entity); }); } void TaskManager::exec(TaskId id, TaskAutoDestroy policy) { - this->cleanGarbage(); - Entity* entity = this->findEntity(id); + d->cleanGarbage(); + Entity* entity = d->findEntity(id); if (!entity) return; entity->isFinished = false; entity->autoDestroy = policy; - this->execEntity(entity); + d->execEntity(entity); } bool TaskManager::waitForDone(TaskId id, int msecs) { - Entity* entity = this->findEntity(id); + Entity* entity = d->findEntity(id); if (!entity) return true; @@ -84,82 +116,87 @@ bool TaskManager::waitForDone(TaskId id, int msecs) void TaskManager::requestAbort(TaskId id) { - Entity* entity = this->findEntity(id); + Entity* entity = d->findEntity(id); if (entity) { this->signalAbortRequested.send(id); entity->taskProgress.requestAbort(); } } +void TaskManager::foreachTask(const std::function& fn) +{ + for (const auto& mapPair : d->mapEntity) + fn(mapPair.first); +} + int TaskManager::progress(TaskId id) const { - const Entity* entity = this->findEntity(id); + const Entity* entity = d->findEntity(id); return entity ? entity->taskProgress.value() : 0; } int TaskManager::globalProgress() const { int taskAccumPct = 0; - for (const auto& mapPair : m_mapEntity) { + for (const auto& mapPair : d->mapEntity) { const std::unique_ptr& ptrEntity = mapPair.second; if (ptrEntity->taskProgress.value() > 0) taskAccumPct += ptrEntity->taskProgress.value(); } - return MathUtils::toPercent(taskAccumPct, 0, m_mapEntity.size() * 100); - //qDebug() << "taskCount=" << taskCount << " taskAccumPct=" << taskAccumPct << " newGlobalPct=" << newGlobalPct; + return MathUtils::toPercent(taskAccumPct, 0, d->mapEntity.size() * 100); } const std::string& TaskManager::title(TaskId id) const { - const Entity* entity = this->findEntity(id); + const Entity* entity = d->findEntity(id); return entity ? entity->title : CppUtils::nullString(); } void TaskManager::setTitle(TaskId id, std::string_view title) { - Entity* entity = this->findEntity(id); + Entity* entity = d->findEntity(id); if (entity) entity->title = title; } -TaskManager::Entity* TaskManager::findEntity(TaskId id) +TaskManager::Entity* TaskManager::Private::findEntity(TaskId id) { - auto it = m_mapEntity.find(id); - return it != m_mapEntity.end() ? it->second.get() : nullptr; + auto it = this->mapEntity.find(id); + return it != this->mapEntity.end() ? it->second.get() : nullptr; } -const TaskManager::Entity* TaskManager::findEntity(TaskId id) const +const TaskManager::Entity* TaskManager::Private::findEntity(TaskId id) const { - auto it = m_mapEntity.find(id); - return it != m_mapEntity.cend() ? it->second.get() : nullptr; + auto it = this->mapEntity.find(id); + return it != this->mapEntity.cend() ? it->second.get() : nullptr; } -void TaskManager::execEntity(Entity* entity) +void TaskManager::Private::execEntity(Entity* entity) { if (!entity) return; - this->signalStarted.send(entity->task.id()); + this->taskMgr->signalStarted.send(entity->task.id()); const TaskJob& fn = entity->task.job(); fn(&entity->taskProgress); if (!entity->taskProgress.isAbortRequested()) entity->taskProgress.setValue(100); - this->signalEnded.send(entity->task.id()); + this->taskMgr->signalEnded.send(entity->task.id()); entity->isFinished = true; } -void TaskManager::cleanGarbage() +void TaskManager::Private::cleanGarbage() { - auto it = m_mapEntity.begin(); - while (it != m_mapEntity.end()) { + auto it = this->mapEntity.begin(); + while (it != this->mapEntity.end()) { Entity* entity = it->second.get(); if (entity->isFinished && entity->autoDestroy == TaskAutoDestroy::On) { if (entity->control.valid()) entity->control.wait(); - it = m_mapEntity.erase(it); + it = this->mapEntity.erase(it); } else { ++it; diff --git a/src/base/task_manager.h b/src/base/task_manager.h index 27d30c9b..f2ec2f8b 100644 --- a/src/base/task_manager.h +++ b/src/base/task_manager.h @@ -10,17 +10,16 @@ #include "task.h" #include "task_progress.h" -#include -#include -#include +#include #include #include -#include namespace Mayo { +// Central class providing management of Task objects class TaskManager { public: + TaskManager(); ~TaskManager(); TaskId newTask(TaskJob fn); @@ -36,11 +35,7 @@ class TaskManager { bool waitForDone(TaskId id, int msecs = -1); void requestAbort(TaskId id); - template - void foreachTask(Function fn) { - for (const auto& mapPair : m_mapEntity) - fn(mapPair.first); - } + void foreachTask(const std::function& fn); // Signals Signal signalStarted; @@ -50,22 +45,9 @@ class TaskManager { Signal signalEnded; private: - struct Entity { - Task task; - TaskProgress taskProgress; - std::string title; - std::future control; - std::atomic isFinished = false; - TaskAutoDestroy autoDestroy = TaskAutoDestroy::On; - }; - - Entity* findEntity(TaskId id); - const Entity* findEntity(TaskId id) const; - void execEntity(Entity* entity); - void cleanGarbage(); - - std::atomic m_taskIdSeq = {}; - std::unordered_map> m_mapEntity; + struct Entity; + struct Private; + Private* const d = nullptr; }; } // namespace Mayo diff --git a/src/base/task_progress.h b/src/base/task_progress.h index 7d7d458d..6ad0512c 100644 --- a/src/base/task_progress.h +++ b/src/base/task_progress.h @@ -16,6 +16,7 @@ namespace Mayo { class Task; class TaskManager; +// Provides feedback on the progress of a running/executing task class TaskProgress { public: TaskProgress(); From efdf5bc32fe8adf0301b28bc112ec512b85e6da4 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 17 Apr 2023 21:30:44 +0200 Subject: [PATCH 04/92] App: fix CI macOS build --- src/app/mainwindow.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/mainwindow.h b/src/app/mainwindow.h index 608aa5c7..f7a596ad 100644 --- a/src/app/mainwindow.h +++ b/src/app/mainwindow.h @@ -13,6 +13,7 @@ #include "../base/text_id.h" #include #include +#include class QFileInfo; namespace Mayo { From f2843755c18949f631370a26ec51fa763eadd873 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 18 Apr 2023 16:02:05 +0200 Subject: [PATCH 05/92] Base: more documentation for TaskManager class --- src/base/task_manager.cpp | 8 ++++++++ src/base/task_manager.h | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/base/task_manager.cpp b/src/base/task_manager.cpp index 4bfa2e9d..6790e275 100644 --- a/src/base/task_manager.cpp +++ b/src/base/task_manager.cpp @@ -17,6 +17,7 @@ namespace Mayo { +// Helper struct providing all required data to manage a Task object struct TaskManager::Entity { Task task; TaskProgress taskProgress; @@ -26,12 +27,19 @@ struct TaskManager::Entity { TaskAutoDestroy autoDestroy = TaskAutoDestroy::On; }; +// Pimpl struct providing private(hidden) interface of TaskManager class struct TaskManager::Private { + // Ctor Private(TaskManager* mgr) : taskMgr(mgr) {} + // Const/mutable functions to find an Entity from a task identifier. Returns null if not found TaskManager::Entity* findEntity(TaskId id); const TaskManager::Entity* findEntity(TaskId id) const; + + // Execute(synchronous) task entity, sending started/ended signals accordingly void execEntity(TaskManager::Entity* entity); + + // Destroy finished task entities whose policy was set to TaskAutoDestroy::On void cleanGarbage(); TaskManager* taskMgr = nullptr; diff --git a/src/base/task_manager.h b/src/base/task_manager.h index f2ec2f8b..8ac6a9bf 100644 --- a/src/base/task_manager.h +++ b/src/base/task_manager.h @@ -19,29 +19,62 @@ namespace Mayo { // Central class providing management of Task objects class TaskManager { public: + // Ctor & dtor TaskManager(); ~TaskManager(); + // Allocates a new task entity in manager + // Returns the task identifier(unique in the scope of the owning TaskManager) TaskId newTask(TaskJob fn); + + // Asynchronous execution of job associated with task identifier 'id' + // By default destroy policy is set to 'On' meaning the task will be deleted at some point + // after its completion + // This function is based on std::async() so depending on the C++ stdlib implementation this is + // probably using a thread pool + // NOTE The task must have been allocated previously with newTask() void run(TaskId id, TaskAutoDestroy policy = TaskAutoDestroy::On); - void exec(TaskId id, TaskAutoDestroy policy = TaskAutoDestroy::On); // Synchronous + // Same as run() but execution of the task job is synchronous(it runs in the current thread + // just like a regular function call) + void exec(TaskId id, TaskAutoDestroy policy = TaskAutoDestroy::On); + + // Current progress of running task identified by 'id' + // NOTE The task must have been allocated previously with newTask() int progress(TaskId id) const; + + // Current progress of all tasks int globalProgress() const; + // Title(description) of a task identified by 'id' const std::string& title(TaskId id) const; void setTitle(TaskId id, std::string_view title); + // Blocks the current thread until task of identifier 'id' has finished bool waitForDone(TaskId id, int msecs = -1); + + // Instructs the task of identifier 'id' to abort as soon as possible + // Task interruption relies on the task job for this: it has to check regularly the + // TaskProgress::isAbortRequested() flag and interrupt consequently void requestAbort(TaskId id); + // Applies function 'fn' to each task void foreachTask(const std::function& fn); - // Signals + // Signal emitted when some task execution has just started Signal signalStarted; + + // Signal emitted when the current step description of some task has changed Signal signalProgressStep; + + // Signal emitted when the current progress of some task has changed Signal signalProgressChanged; + + // Signal emitted when requestAbort() was called on some task Signal signalAbortRequested; + + // Signal emitted when some task execution has just ended(whatever stop condition: finished + // or aborted) Signal signalEnded; private: From 8c4dad9e775e76fbc8c2ab151fa1630ff0c5e618 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 18 Apr 2023 17:14:58 +0200 Subject: [PATCH 06/92] Base: remove needless task.h,cpp files --- src/base/messenger_client.h | 2 +- src/base/task.cpp | 11 ----------- src/base/task.h | 35 ---------------------------------- src/base/task_common.h | 3 +++ src/base/task_manager.cpp | 17 +++++++++-------- src/base/task_manager.h | 8 +++++--- src/base/task_progress.cpp | 38 +++++++++---------------------------- src/base/task_progress.h | 13 +++++++------ 8 files changed, 34 insertions(+), 93 deletions(-) delete mode 100644 src/base/task.cpp delete mode 100644 src/base/task.h diff --git a/src/base/messenger_client.h b/src/base/messenger_client.h index 843a5750..81bb28ab 100644 --- a/src/base/messenger_client.h +++ b/src/base/messenger_client.h @@ -10,7 +10,7 @@ namespace Mayo { class Messenger; -// Provides a link to a messenger object +// Provides a link to a Messenger object // The object returned by MessengerClient::messenger() is guaranteed to be non-nullptr class MessengerClient { public: diff --git a/src/base/task.cpp b/src/base/task.cpp deleted file mode 100644 index 5ae68143..00000000 --- a/src/base/task.cpp +++ /dev/null @@ -1,11 +0,0 @@ -/**************************************************************************** -** Copyright (c) 2021, Fougue Ltd. -** All rights reserved. -** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt -****************************************************************************/ - -#include "task.h" - -namespace Mayo { - -} // namespace Mayo diff --git a/src/base/task.h b/src/base/task.h deleted file mode 100644 index 0c506974..00000000 --- a/src/base/task.h +++ /dev/null @@ -1,35 +0,0 @@ -/**************************************************************************** -** Copyright (c) 2021, Fougue Ltd. -** All rights reserved. -** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt -****************************************************************************/ - -#pragma once - -#include "task_common.h" - -#include - -namespace Mayo { - -class TaskManager; -class TaskProgress; - -// Piece of code that has to be executed as a task(ie with TaskManager::run/exec()) -using TaskJob = std::function; - -// Provides a task(job) to be executed by the owning task manager -class Task { -public: - TaskId id() const { return m_id; } - const TaskJob& job() const { return m_fn; } - TaskManager* manager() const { return m_manager; } - -private: - friend class TaskManager; - TaskId m_id = 0; - TaskJob m_fn; - TaskManager* m_manager = nullptr; -}; - -} // namespace Mayo diff --git a/src/base/task_common.h b/src/base/task_common.h index ebb9a935..73dc2249 100644 --- a/src/base/task_common.h +++ b/src/base/task_common.h @@ -13,6 +13,9 @@ namespace Mayo { // Task identifier type using TaskId = uint64_t; +// Reserved value for null tasks +constexpr TaskId TaskId_null = UINT64_MAX; + // Syntactic sugar for task auto-deletion flag(see TaskManager::run/exec()) enum class TaskAutoDestroy { On, Off }; diff --git a/src/base/task_manager.cpp b/src/base/task_manager.cpp index 6790e275..c31a9d38 100644 --- a/src/base/task_manager.cpp +++ b/src/base/task_manager.cpp @@ -19,7 +19,8 @@ namespace Mayo { // Helper struct providing all required data to manage a Task object struct TaskManager::Entity { - Task task; + TaskId taskId; + TaskJob taskJob; TaskProgress taskProgress; std::string title; std::future control; @@ -73,10 +74,10 @@ TaskId TaskManager::newTask(TaskJob fn) { const TaskId taskId = d->taskIdSeq.fetch_add(1); std::unique_ptr ptrEntity(new Entity); - ptrEntity->task.m_id = taskId; - ptrEntity->task.m_fn = std::move(fn); - ptrEntity->task.m_manager = this; - ptrEntity->taskProgress.setTask(&ptrEntity->task); + ptrEntity->taskId = taskId; + ptrEntity->taskJob = std::move(fn); + ptrEntity->taskProgress.setTaskId(taskId); + ptrEntity->taskProgress.setTaskManager(this); d->mapEntity.insert({ taskId, std::move(ptrEntity) }); return taskId; } @@ -185,13 +186,13 @@ void TaskManager::Private::execEntity(Entity* entity) if (!entity) return; - this->taskMgr->signalStarted.send(entity->task.id()); - const TaskJob& fn = entity->task.job(); + this->taskMgr->signalStarted.send(entity->taskId); + const TaskJob& fn = entity->taskJob; fn(&entity->taskProgress); if (!entity->taskProgress.isAbortRequested()) entity->taskProgress.setValue(100); - this->taskMgr->signalEnded.send(entity->task.id()); + this->taskMgr->signalEnded.send(entity->taskId); entity->isFinished = true; } diff --git a/src/base/task_manager.h b/src/base/task_manager.h index 8ac6a9bf..f5e17f7e 100644 --- a/src/base/task_manager.h +++ b/src/base/task_manager.h @@ -7,7 +7,6 @@ #pragma once #include "signal.h" -#include "task.h" #include "task_progress.h" #include @@ -16,7 +15,10 @@ namespace Mayo { -// Central class providing management of Task objects +// Piece of code to be executed as a task(ie with TaskManager::run/exec()) +using TaskJob = std::function; + +// Central class providing creation/execution/deletion of Task objects class TaskManager { public: // Ctor & dtor @@ -39,7 +41,7 @@ class TaskManager { // just like a regular function call) void exec(TaskId id, TaskAutoDestroy policy = TaskAutoDestroy::On); - // Current progress of running task identified by 'id' + // Current progress of task identified by 'id' // NOTE The task must have been allocated previously with newTask() int progress(TaskId id) const; diff --git a/src/base/task_progress.cpp b/src/base/task_progress.cpp index f2d47c53..5f25f709 100644 --- a/src/base/task_progress.cpp +++ b/src/base/task_progress.cpp @@ -5,7 +5,6 @@ ****************************************************************************/ #include "task_progress.h" -#include "task.h" #include "task_manager.h" #include @@ -14,13 +13,10 @@ namespace Mayo { -TaskProgress::TaskProgress() -{ -} - TaskProgress::TaskProgress(TaskProgress* parent, double portionSize, std::string_view step) : m_parent(parent), - m_task(parent ? parent->m_task : nullptr), + m_taskMgr(parent ? parent->m_taskMgr : nullptr), + m_taskId(parent ? parent->m_taskId : TaskId_null), m_portionSize(std::clamp(portionSize, 0., 100.)) { if (!step.empty()) @@ -41,22 +37,12 @@ TaskProgress& TaskProgress::null() bool TaskProgress::isNull() const { - return m_task == nullptr; -} - -TaskId TaskProgress::taskId() const -{ - return m_task ? m_task->id() : std::numeric_limits::max(); -} - -TaskManager* TaskProgress::taskManager() const -{ - return m_task ? m_task->manager() : nullptr; + return m_taskId == TaskId_null; } void TaskProgress::setValue(int pct) { - if (this->isNull()) + if (m_taskId == TaskId_null) return; if (m_isAbortRequested) @@ -72,21 +58,15 @@ void TaskProgress::setValue(int pct) m_parent->setValue(m_parent->value() + valueDeltaInParent); } else { - m_task->manager()->signalProgressChanged.send(m_task->id(), m_value); + m_taskMgr->signalProgressChanged.send(m_taskId, m_value); } } void TaskProgress::setStep(std::string_view title) { - if (!this->isNull()) { - m_step = title; - m_task->manager()->signalProgressStep.send(m_task->id(), m_step); - } -} - -void TaskProgress::setTask(const Task* task) -{ - m_task = task; + m_step = title; + if (m_taskMgr && m_taskId != TaskId_null) + m_taskMgr->signalProgressStep.send(m_taskId, m_step); } bool TaskProgress::isAbortRequested(const TaskProgress* progress) @@ -96,7 +76,7 @@ bool TaskProgress::isAbortRequested(const TaskProgress* progress) void TaskProgress::requestAbort() { - if (!this->isNull()) + if (m_taskId != TaskId_null) m_isAbortRequested = true; } diff --git a/src/base/task_progress.h b/src/base/task_progress.h index 6ad0512c..bdd40263 100644 --- a/src/base/task_progress.h +++ b/src/base/task_progress.h @@ -13,21 +13,20 @@ namespace Mayo { -class Task; class TaskManager; // Provides feedback on the progress of a running/executing task class TaskProgress { public: - TaskProgress(); + TaskProgress() = default; TaskProgress(TaskProgress* parent, double portionSize, std::string_view step = {}); ~TaskProgress(); static TaskProgress& null(); bool isNull() const; - TaskId taskId() const; - TaskManager* taskManager() const; + TaskId taskId() const { return m_taskId; } + TaskManager* taskManager() const { return m_taskMgr; } // Value in [0,100] int value() const { return m_value; } @@ -50,13 +49,15 @@ class TaskProgress { TaskProgress& operator=(TaskProgress&&) = delete; private: - void setTask(const Task* task); + void setTaskId(TaskId id) { m_taskId = id; } + void setTaskManager(TaskManager* mgr) { m_taskMgr = mgr; } void requestAbort(); friend class TaskManager; TaskProgress* m_parent = nullptr; - const Task* m_task = nullptr; + TaskManager* m_taskMgr = nullptr; + TaskId m_taskId = TaskId_null; double m_portionSize = -1; std::atomic m_value = 0; std::string m_step; From af6c1193e82966773b294e34d5d192da85620d41 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 18 Apr 2023 17:46:28 +0200 Subject: [PATCH 07/92] Base: more documentation --- src/base/application_item.h | 1 + src/base/application_item_selection_model.h | 1 + src/base/document.h | 3 +++ src/base/document_tree_node.h | 1 + src/base/mesh_utils.h | 1 + src/base/messenger.h | 11 +++++++++-- src/base/occ_progress_indicator.h | 1 + src/base/property.h | 1 + src/base/text_id.h | 8 ++++++++ 9 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/base/application_item.h b/src/base/application_item.h index 0cfec2a3..d5376d44 100644 --- a/src/base/application_item.h +++ b/src/base/application_item.h @@ -11,6 +11,7 @@ namespace Mayo { +// Provides a common item that could be either a Document or some model tree node within a Document class ApplicationItem { public: ApplicationItem() = default; diff --git a/src/base/application_item_selection_model.h b/src/base/application_item_selection_model.h index bfd7863b..b2f48c3e 100644 --- a/src/base/application_item_selection_model.h +++ b/src/base/application_item_selection_model.h @@ -12,6 +12,7 @@ namespace Mayo { +// Keeps track of the items selected in an Application object class ApplicationItemSelectionModel { public: Span selectedItems() const; diff --git a/src/base/document.h b/src/base/document.h index 8869af6c..fe3b9efe 100644 --- a/src/base/document.h +++ b/src/base/document.h @@ -19,6 +19,9 @@ namespace Mayo { +// Provides a data container, composed of labels and attributes +// It extends TDocStd_Document to provide an actualized model tree of its contents +// Entities are actually "root" data items class Document : public TDocStd_Document { public: using Identifier = int; // TODO alias TypedScalar diff --git a/src/base/document_tree_node.h b/src/base/document_tree_node.h index 3f6de7fe..7255a259 100644 --- a/src/base/document_tree_node.h +++ b/src/base/document_tree_node.h @@ -11,6 +11,7 @@ namespace Mayo { +// Provides a convenient item for model tree nodes within a Document object class DocumentTreeNode { public: DocumentTreeNode() = default; diff --git a/src/base/mesh_utils.h b/src/base/mesh_utils.h index 4175c25c..6630db9f 100644 --- a/src/base/mesh_utils.h +++ b/src/base/mesh_utils.h @@ -12,6 +12,7 @@ class gp_XYZ; namespace Mayo { +// Provides helper functions for mesh and triangle objects struct MeshUtils { static double triangleSignedVolume(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3); static double triangleArea(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3); diff --git a/src/base/messenger.h b/src/base/messenger.h index d221021d..f365b7f0 100644 --- a/src/base/messenger.h +++ b/src/base/messenger.h @@ -11,6 +11,10 @@ namespace Mayo { +// Provides a general-purpose interface to issue text messages without knowledge of how these +// messages will be further processed +// TODO Support stream-like syntax, eg: +// messenger->info() << "Something happened, value: " << valueInt; class Messenger { public: enum class MessageType { @@ -18,13 +22,16 @@ class Messenger { Info, Warning, Error - }; + }; + // Dispatch the message 'text' to all observers + virtual void emitMessage(MessageType msgType, std::string_view text) = 0; + + // Convenience functions around emitMessage() void emitTrace(std::string_view text); void emitInfo(std::string_view text); void emitWarning(std::string_view text); void emitError(std::string_view text); - virtual void emitMessage(MessageType msgType, std::string_view text) = 0; static Messenger& null(); }; diff --git a/src/base/occ_progress_indicator.h b/src/base/occ_progress_indicator.h index b135eb03..39d83167 100644 --- a/src/base/occ_progress_indicator.h +++ b/src/base/occ_progress_indicator.h @@ -13,6 +13,7 @@ namespace Mayo { class TaskProgress; +// Provides implementation of OpenCascade-based progress indicator around Mayo::TaskProgress class OccProgressIndicator : public Message_ProgressIndicator { public: OccProgressIndicator(TaskProgress* progress); diff --git a/src/base/property.h b/src/base/property.h index df1a7116..e5a134a8 100644 --- a/src/base/property.h +++ b/src/base/property.h @@ -75,6 +75,7 @@ struct PropertyChangedBlocker { #define Mayo_PropertyChangedBlocker(group) \ [[maybe_unused]] Mayo::PropertyChangedBlocker __Mayo_PropertyChangedBlocker(group); +// Provides an abstract storage of a value with associated meta-data(name, description, ...) class Property { public: Property(PropertyGroup* group, const TextId& name); diff --git a/src/base/text_id.h b/src/base/text_id.h index e236c548..7e19effd 100644 --- a/src/base/text_id.h +++ b/src/base/text_id.h @@ -23,11 +23,19 @@ public: \ namespace Mayo { +// Provides translatable text(message) identifier struct TextId { + // Context used to find the text(key) to translate, typically a class name std::string_view trContext; + + // Source text std::string_view key; + // Returns the translation text of 'key' by querying registered Application::Translator objects + // 'n' is used to support plural forms std::string_view tr(int n = -1) const; + + // Whether source text(key) is empty or not bool isEmpty() const; }; From 940d73155e4eb86834323408843ef47dc14264df Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 19 Apr 2023 11:10:34 +0200 Subject: [PATCH 08/92] Base: more generic CppUtils::findValue() --- src/base/cpp_utils.h | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/base/cpp_utils.h b/src/base/cpp_utils.h index e0ba1d0b..4dc71850 100644 --- a/src/base/cpp_utils.h +++ b/src/base/cpp_utils.h @@ -9,7 +9,6 @@ #include #include #include -#include #include #ifndef __cpp_lib_integer_comparison_functions # include @@ -26,12 +25,20 @@ inline const std::string& nullString() return str; } -template -ValueType findValue(const KeyType& key, const std::unordered_map& hashmap) +template +typename AssociativeContainer::mapped_type findValue( + const typename AssociativeContainer::key_type& key, + const AssociativeContainer& container + ) { - auto it = hashmap.find(key); - const ValueType defaultValue = {}; - return it != hashmap.cend() ? it->second : defaultValue; + auto it = container.find(key); + if (it != container.cend()) { + return it->second; + } + else { + const typename AssociativeContainer::mapped_type defaultValue = {}; + return defaultValue; + } } inline void toggle(bool& value) @@ -140,4 +147,7 @@ template constexpr R safeStaticCast(T t) } } // namespace CppUtils + +namespace Cpp = CppUtils; + } // namespace Mayo From 9b01f43db5a85f5e3aab63f92a14be4e265a180d Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 24 Apr 2023 00:54:20 +0200 Subject: [PATCH 09/92] App: support grid in 3D view Relates to GitHub #189 --- images/themes/classic/grid.svg | 1 + images/themes/dark/grid.svg | 1 + mayo.qrc | 2 + src/app/commands_display.cpp | 2 +- src/app/qtwidgets_utils.cpp | 5 + src/app/qtwidgets_utils.h | 2 + src/app/theme.cpp | 1 + src/app/theme.h | 1 + src/app/widget_clip_planes.cpp | 2 +- src/app/widget_grid.cpp | 336 ++++++++++++++ src/app/widget_grid.h | 41 ++ src/app/widget_grid.ui | 721 +++++++++++++++++++++++++++++++ src/app/widget_gui_document.cpp | 40 +- src/app/widget_gui_document.h | 4 + src/graphics/graphics_utils.cpp | 40 +- src/graphics/graphics_utils.h | 27 +- src/graphics/graphics_view_ptr.h | 2 + 17 files changed, 1213 insertions(+), 15 deletions(-) create mode 100644 images/themes/classic/grid.svg create mode 100644 images/themes/dark/grid.svg create mode 100644 src/app/widget_grid.cpp create mode 100644 src/app/widget_grid.h create mode 100644 src/app/widget_grid.ui diff --git a/images/themes/classic/grid.svg b/images/themes/classic/grid.svg new file mode 100644 index 00000000..c09b16a4 --- /dev/null +++ b/images/themes/classic/grid.svg @@ -0,0 +1 @@ +frame-grid \ No newline at end of file diff --git a/images/themes/dark/grid.svg b/images/themes/dark/grid.svg new file mode 100644 index 00000000..c09b16a4 --- /dev/null +++ b/images/themes/dark/grid.svg @@ -0,0 +1 @@ +frame-grid \ No newline at end of file diff --git a/mayo.qrc b/mayo.qrc index aecced61..b446ce4f 100644 --- a/mayo.qrc +++ b/mayo.qrc @@ -82,5 +82,7 @@ images/themes/classic/turn-cw.svg images/themes/dark/turn-ccw.svg images/themes/dark/turn-cw.svg + images/themes/classic/grid.svg + images/themes/dark/grid.svg diff --git a/src/app/commands_display.cpp b/src/app/commands_display.cpp index 1b021a6b..7a7b8fd5 100644 --- a/src/app/commands_display.cpp +++ b/src/app/commands_display.cpp @@ -218,7 +218,7 @@ void CommandTogglePerformanceStats::execute() { GuiDocument* guiDoc = this->currentGuiDocument(); if (guiDoc) { - CppUtils::toggle(guiDoc->v3dView()->ChangeRenderingParams().ToShowStats); + CppUtils::toggle(guiDoc->graphicsView()->ChangeRenderingParams().ToShowStats); guiDoc->graphicsView().redraw(); } } diff --git a/src/app/qtwidgets_utils.cpp b/src/app/qtwidgets_utils.cpp index b5bb2469..69227a44 100644 --- a/src/app/qtwidgets_utils.cpp +++ b/src/app/qtwidgets_utils.cpp @@ -112,4 +112,9 @@ void QtWidgetsUtils::moveWidgetLeftTo(QWidget* widget, const QWidget* nextTo, in widget->move(nextTo->mapToParent(QPoint(-frameGeom.width() - margin, 0))); } +void QtWidgetsUtils::collapseWidget(QWidget *widget, bool on) +{ + widget->setMaximumHeight(on ? 0 : 16777215/*Qt_defaultMaximumWidth*/); +} + } // namespace Mayo diff --git a/src/app/qtwidgets_utils.h b/src/app/qtwidgets_utils.h index 5296f502..0760943f 100644 --- a/src/app/qtwidgets_utils.h +++ b/src/app/qtwidgets_utils.h @@ -57,6 +57,8 @@ class QtWidgetsUtils { static void moveWidgetRightTo(QWidget* widget, const QWidget* nextTo, int margin); // Move position of 'widget' so it's displayed stuck to the left of 'nextTo' static void moveWidgetLeftTo(QWidget* widget, const QWidget* nextTo, int margin = 0); + + static void collapseWidget(QWidget* widget, bool on); }; #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) diff --git a/src/app/theme.cpp b/src/app/theme.cpp index 59e27789..aab70de8 100644 --- a/src/app/theme.cpp +++ b/src/app/theme.cpp @@ -78,6 +78,7 @@ static QString iconFileName(Theme::Icon icn) case Theme::Icon::Export: return "export.svg"; case Theme::Icon::Expand: return "expand.svg"; case Theme::Icon::Cross: return "cross.svg"; + case Theme::Icon::Grid: return "grid.svg"; case Theme::Icon::Link: return "link.svg"; case Theme::Icon::Back: return "back.svg"; case Theme::Icon::Next: return "next.svg"; diff --git a/src/app/theme.h b/src/app/theme.h index fe1fd569..229f1b75 100644 --- a/src/app/theme.h +++ b/src/app/theme.h @@ -45,6 +45,7 @@ class Theme { Export, Expand, Cross, + Grid, Link, Back, Next, diff --git a/src/app/widget_clip_planes.cpp b/src/app/widget_clip_planes.cpp index 563e0e68..be168ac1 100644 --- a/src/app/widget_clip_planes.cpp +++ b/src/app/widget_clip_planes.cpp @@ -205,7 +205,7 @@ void WidgetClipPlanes::setPlaneOn(const Handle_Graphic3d_ClipPlane& plane, bool { plane->SetOn(on); if (!GraphicsUtils::V3dView_hasClipPlane(m_view.v3dView(), plane)) - m_view.v3dView()->AddClipPlane(plane); + m_view->AddClipPlane(plane); } void WidgetClipPlanes::setPlaneRange(ClipPlaneData* data, const Range& range) diff --git a/src/app/widget_grid.cpp b/src/app/widget_grid.cpp new file mode 100644 index 00000000..8fe1651d --- /dev/null +++ b/src/app/widget_grid.cpp @@ -0,0 +1,336 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#include "widget_grid.h" +#include "ui_widget_grid.h" +#include "property_editor_factory.h" +#include "qtgui_utils.h" +#include "qtwidgets_utils.h" +#include "../base/unit_system.h" +#include "../graphics/graphics_utils.h" + +#include +#include +#include +#include +#include + +namespace Mayo { + +WidgetGrid::WidgetGrid(GraphicsViewPtr viewPtr, QWidget* parent) + : QWidget(parent), + m_ui(new Ui_WidgetGrid), + m_viewPtr(viewPtr) +{ + const Handle_V3d_Viewer& viewer = viewPtr->Viewer(); + + // Intial configuration + m_ui->setupUi(this); + + constexpr double maxFloat64 = std::numeric_limits::max(); + const double valueEditorMaxWidth = m_ui->edit_RectSizeX->fontMetrics().averageCharWidth() * 15; + for (auto editor : this->findChildren()) { + editor->setRange(-maxFloat64, maxFloat64); + editor->setMaximumWidth(valueEditorMaxWidth); + } + + m_ui->edit_RectRotation->setRange(-180, 180); + m_ui->edit_CircRotation->setRange(-180, 180); + m_ui->edit_RectStepX->setMinimum(0.); + m_ui->edit_RectStepY->setMinimum(0.); + m_ui->edit_RectSizeX->setMinimum(0.); + m_ui->edit_RectSizeY->setMinimum(0.); + m_ui->edit_CircRadiusStep->setMinimum(0.); + m_ui->edit_CircRadius->setMinimum(0.); + + QtWidgetsUtils::collapseWidget(m_ui->widget_Config, true); + QtWidgetsUtils::collapseWidget(m_ui->widget_Graphics, true); + + // Install grid visibility + m_ui->check_ShowGrid->setChecked(GraphicsUtils::V3dViewer_isGridActive(viewer)); + + // Install grid type + switch (viewer->GridType()) { + case Aspect_GT_Rectangular: + m_ui->combo_Type->setCurrentIndex(0); + m_ui->stack_Config->setCurrentWidget(m_ui->page_Rectangular); + break; + case Aspect_GT_Circular: + m_ui->combo_Type->setCurrentIndex(1); + m_ui->stack_Config->setCurrentWidget(m_ui->page_Circular); + break; + } // endswitch + + // Install rectangular grid params + { + double xOrigin, yOrigin; + double xStep, yStep; + double rotAngle; + viewer->RectangularGridValues(xOrigin, yOrigin, xStep, yStep, rotAngle); + m_ui->edit_RectOriginX->setValue(xOrigin); + m_ui->edit_RectOriginY->setValue(yOrigin); + m_ui->edit_RectStepX->setValue(xStep); + m_ui->edit_RectStepY->setValue(yStep); + m_ui->edit_RectRotation->setValue(UnitSystem::degrees(rotAngle * Quantity_Radian)); + + double xSize, ySize; + double offset; + viewer->RectangularGridGraphicValues(xSize, ySize, offset); + m_ui->edit_RectSizeX->setValue(xSize); + m_ui->edit_RectSizeY->setValue(ySize); + m_ui->edit_RectOffset->setValue(offset); + } + + // Install circular grid params + { + double xOrigin, yOrigin; + double radiusStep; + int divisionCount; + double rotAngle; + viewer->CircularGridValues(xOrigin, yOrigin, radiusStep, divisionCount, rotAngle); + m_ui->edit_CircOriginX->setValue(xOrigin); + m_ui->edit_CircOriginY->setValue(yOrigin); + m_ui->edit_CircRadiusStep->setValue(radiusStep); + m_ui->edit_CircDivision->setValue(divisionCount); + m_ui->edit_CircRotation->setValue(UnitSystem::degrees(rotAngle * Quantity_Radian)); + + double radius; + double offset; + viewer->CircularGridGraphicValues(radius, offset); + m_ui->edit_CircRadius->setValue(radius); + m_ui->edit_CircOffset->setValue(offset); + } + + // Install grid privileged plane + const gp_Ax2 plane = viewer->PrivilegedPlane().Ax2(); + if (plane.IsCoplanar(gp::XOY(), Precision::Confusion(), Precision::Angular())) + m_ui->combo_Plane->setCurrentIndex(0); + else if (plane.IsCoplanar(gp::ZOX(), Precision::Confusion(), Precision::Angular())) + m_ui->combo_Plane->setCurrentIndex(1); + else if (plane.IsCoplanar(gp::YOZ(), Precision::Confusion(), Precision::Angular())) + m_ui->combo_Plane->setCurrentIndex(2); + else + m_ui->combo_Plane->setCurrentIndex(3); + + // Install grid draw mode + Handle_Aspect_Grid gridAspect = GraphicsUtils::V3dViewer_grid(viewer); + if (gridAspect) { + if (gridAspect->DrawMode() == Aspect_GDM_Lines) + m_ui->combo_DrawMode->setCurrentIndex(0); + else if (gridAspect->DrawMode() == Aspect_GDM_Points) + m_ui->combo_DrawMode->setCurrentIndex(1); + } + + // Install grid draw colors + if (gridAspect) { + Quantity_Color color, colorTenth; + gridAspect->Colors(color, colorTenth); + m_ui->btn_Color->setIcon(IPropertyEditorFactory::colorSquarePixmap(QtGuiUtils::toQColor(color))); + m_ui->btn_ColorTenth->setIcon(IPropertyEditorFactory::colorSquarePixmap(QtGuiUtils::toQColor(colorTenth))); + } + + // Install widgets enable status + m_ui->combo_Plane->setEnabled(GraphicsUtils::V3dViewer_isGridActive(viewer)); + m_ui->widget_Main->setEnabled(GraphicsUtils::V3dViewer_isGridActive(viewer)); + auto planeComboModel = static_cast(m_ui->combo_Plane->model()); + if (planeComboModel) + planeComboModel->item(3)->setFlags(Qt::NoItemFlags); // Custom plane + else + qWarning() << Q_FUNC_INFO << "QComboBox model isn't of type QStandardItemModel"; + + // Signal/slot connections + auto sigComboBoxActivated_int = qOverload(&QComboBox::activated); + QObject::connect( + m_ui->check_ShowGrid, &QCheckBox::clicked, this, &WidgetGrid::activateGrid + ); + QObject::connect(m_ui->combo_Type, sigComboBoxActivated_int, this, [=](int typeIndex) { + m_ui->stack_Config->setCurrentIndex(typeIndex); + viewer->ActivateGrid( + toGridType(m_ui->combo_Type->currentIndex()), + toGridDrawMode(m_ui->combo_DrawMode->currentIndex()) + ); + m_viewPtr.redraw(); + }); + QObject::connect(m_ui->combo_Plane, sigComboBoxActivated_int, this, [=](int planeIndex) { + viewer->SetPrivilegedPlane(toPlaneAxis(planeIndex)); + m_viewPtr.redraw(); + }); + QObject::connect(m_ui->combo_DrawMode, sigComboBoxActivated_int, this, [=](int modeIndex) { + GraphicsUtils::V3dViewer_grid(viewer)->SetDrawMode(toGridDrawMode(modeIndex)); + m_viewPtr.redraw(); + }); + QObject::connect(m_ui->btn_Config, &QToolButton::clicked, this, [=](bool on) { + QtWidgetsUtils::collapseWidget(m_ui->widget_Config, !on); + if (on) + m_ui->label_Type->setMinimumWidth(m_ui->label_RectOrigin->width()); + + m_ui->btn_Config->setArrowType(on ? Qt::DownArrow : Qt::RightArrow); + emit this->sizeAdjustmentRequested(); + }); + QObject::connect(m_ui->btn_Graphics, &QToolButton::clicked, this, [=](bool on) { + QtWidgetsUtils::collapseWidget(m_ui->widget_Graphics, !on); + m_ui->btn_Graphics->setArrowType(on ? Qt::DownArrow : Qt::RightArrow); + emit this->sizeAdjustmentRequested(); + }); + QObject::connect( + m_ui->btn_Color, &QToolButton::clicked, this, [=]{ this->chooseGridColor(GridColorType::Base); } + ); + QObject::connect( + m_ui->btn_ColorTenth, &QToolButton::clicked, this, [=]{ this->chooseGridColor(GridColorType::Tenth); } + ); + + auto sigGridParamChanged_double = qOverload(&QDoubleSpinBox::valueChanged); + auto sigGridParamChanged_int = qOverload(&QSpinBox::valueChanged); + QObject::connect(m_ui->edit_RectOriginX, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_RectOriginY, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_RectStepX, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_RectStepY, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_RectRotation, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_RectSizeX, sigGridParamChanged_double, this, &WidgetGrid::applyGridGraphicsParams); + QObject::connect(m_ui->edit_RectSizeY, sigGridParamChanged_double, this, &WidgetGrid::applyGridGraphicsParams); + QObject::connect(m_ui->edit_RectOffset, sigGridParamChanged_double, this, &WidgetGrid::applyGridGraphicsParams); + + QObject::connect(m_ui->edit_CircOriginX, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_CircOriginY, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_CircRadiusStep, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_CircDivision, sigGridParamChanged_int, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_CircRotation, sigGridParamChanged_double, this, &WidgetGrid::applyGridParams); + QObject::connect(m_ui->edit_CircRadius, sigGridParamChanged_double, this, &WidgetGrid::applyGridGraphicsParams); + QObject::connect(m_ui->edit_CircOffset, sigGridParamChanged_double, this, &WidgetGrid::applyGridGraphicsParams); +} + +WidgetGrid::~WidgetGrid() +{ + delete m_ui; +} + +Aspect_GridType WidgetGrid::toGridType(int comboBoxItemIndex) +{ + return comboBoxItemIndex == 0 ? Aspect_GT_Rectangular : Aspect_GT_Circular; +} + +Aspect_GridDrawMode WidgetGrid::toGridDrawMode(int comboBoxItemIndex) +{ + switch (comboBoxItemIndex) { + case 0: return Aspect_GDM_Lines; + case 1: return Aspect_GDM_Points; + default: return Aspect_GDM_None; + } +} + +const gp_Ax2& WidgetGrid::toPlaneAxis(int comboBoxItemIndex) +{ + switch (comboBoxItemIndex) { + case 0: return gp::XOY(); + case 1: return gp::ZOX(); + case 2: return gp::YOZ(); + default: return gp::XOY(); + } +} + +void WidgetGrid::activateGrid(bool on) +{ + const Handle_V3d_Viewer& viewer = m_viewPtr->Viewer(); + if (on) { + viewer->ActivateGrid( + toGridType(m_ui->combo_Type->currentIndex()), + toGridDrawMode(m_ui->combo_DrawMode->currentIndex()) + ); + } + else { + viewer->DeactivateGrid(); + } + + m_viewPtr.redraw(); + m_ui->combo_Plane->setEnabled(on); + m_ui->widget_Main->setEnabled(on); +} + +void WidgetGrid::applyGridParams() +{ + auto fnCorrectedGridStep = [](double gridStep) { + return !qFuzzyIsNull(gridStep) ? gridStep : 0.01; + }; + const Handle_V3d_Viewer& viewer = m_viewPtr->Viewer(); + auto gridType = toGridType(m_ui->combo_Type->currentIndex()); + if (gridType == Aspect_GT_Rectangular) { + viewer->SetRectangularGridValues( + m_ui->edit_RectOriginX->value(), + m_ui->edit_RectOriginY->value(), + fnCorrectedGridStep(m_ui->edit_RectStepX->value()), + fnCorrectedGridStep(m_ui->edit_RectStepY->value()), + UnitSystem::radians(m_ui->edit_RectRotation->value() * Quantity_Degree) + ); + } + else if (gridType == Aspect_GT_Circular) { + viewer->SetCircularGridValues( + m_ui->edit_CircOriginX->value(), + m_ui->edit_CircOriginY->value(), + fnCorrectedGridStep(m_ui->edit_CircRadiusStep->value()), + m_ui->edit_CircDivision->value(), + UnitSystem::radians(m_ui->edit_CircRotation->value() * Quantity_Degree) + ); + } + + m_viewPtr.redraw(); +} + +void WidgetGrid::applyGridGraphicsParams() +{ + const Handle_V3d_Viewer& viewer = m_viewPtr->Viewer(); + auto gridType = toGridType(m_ui->combo_Type->currentIndex()); + if (gridType == Aspect_GT_Rectangular) { + viewer->SetRectangularGridGraphicValues( + m_ui->edit_RectSizeX->value(), + m_ui->edit_RectSizeY->value(), + m_ui->edit_RectOffset->value() + ); + } + else if (gridType == Aspect_GT_Circular) { + viewer->SetCircularGridGraphicValues( + m_ui->edit_CircRadius->value(), + m_ui->edit_RectOffset->value() + ); + } + + m_viewPtr.redraw(); +} + +void WidgetGrid::chooseGridColor(GridColorType colorType) +{ + const Handle_V3d_Viewer& viewer = m_viewPtr->Viewer(); + auto gridColors = GraphicsUtils::V3dViewer_gridColors(viewer); + // Helper function to apply some base/tenth grid color + auto fnApplyGridColor = [=](const Quantity_Color& color) { + if (colorType == GridColorType::Base) + GraphicsUtils::V3dViewer_grid(viewer)->SetColors(color, gridColors.tenth); + else + GraphicsUtils::V3dViewer_grid(viewer)->SetColors(gridColors.base, color); + m_viewPtr.redraw(); + }; + + // Setup dialog to select a color + auto dlg = new QColorDialog(this); + auto onEntryGridColor = colorType == GridColorType::Base ? gridColors.base : gridColors.tenth; + dlg->setCurrentColor(QtGuiUtils::toQColor(onEntryGridColor)); + + QObject::connect(dlg, &QColorDialog::currentColorChanged, this, [=](const QColor& color) { + fnApplyGridColor(QtGuiUtils::toPreferredColorSpace(color)); + }); + QObject::connect(dlg, &QDialog::accepted, this, [=]{ + auto btn = colorType == GridColorType::Base ? m_ui->btn_Color : m_ui->btn_ColorTenth; + btn->setIcon(IPropertyEditorFactory::colorSquarePixmap(dlg->selectedColor())); + }); + QObject::connect(dlg, &QDialog::rejected, this, [=]{ + auto btn = colorType == GridColorType::Base ? m_ui->btn_Color : m_ui->btn_ColorTenth; + btn->setIcon(IPropertyEditorFactory::colorSquarePixmap(QtGuiUtils::toQColor(onEntryGridColor))); + fnApplyGridColor(onEntryGridColor); + }); + + QtWidgetsUtils::asyncDialogExec(dlg); +} + +} // namespace Mayo diff --git a/src/app/widget_grid.h b/src/app/widget_grid.h new file mode 100644 index 00000000..5ab111bb --- /dev/null +++ b/src/app/widget_grid.h @@ -0,0 +1,41 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#pragma once + +#include "../graphics/graphics_view_ptr.h" + +#include +class gp_Ax2; + +namespace Mayo { + +class WidgetGrid : public QWidget { + Q_OBJECT +public: + WidgetGrid(GraphicsViewPtr viewPtr, QWidget* parent = nullptr); + ~WidgetGrid(); + +signals: + void sizeAdjustmentRequested(); + +private: + enum class GridColorType { Base, Tenth }; + + static Aspect_GridType toGridType(int comboBoxItemIndex); + static Aspect_GridDrawMode toGridDrawMode(int comboBoxItemIndex); + static const gp_Ax2& toPlaneAxis(int comboBoxItemIndex); + + void activateGrid(bool on); + void applyGridParams(); + void applyGridGraphicsParams(); + void chooseGridColor(GridColorType colorType); + + class Ui_WidgetGrid* m_ui = nullptr; + GraphicsViewPtr m_viewPtr; +}; + +} // namespace Mayo diff --git a/src/app/widget_grid.ui b/src/app/widget_grid.ui new file mode 100644 index 00000000..48bf7620 --- /dev/null +++ b/src/app/widget_grid.ui @@ -0,0 +1,721 @@ + + + Mayo::WidgetGrid + + + + 0 + 0 + 196 + 336 + + + + Form + + + + 4 + + + 4 + + + 4 + + + 4 + + + + + + + Show Grid + + + + + + + + 1 + 0 + + + + + Plane: XOY + + + + + Plane: ZOX + + + + + Plane: YOZ + + + + + Plane: Custom + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 2 + + + + + + + Configuration + + + true + + + Qt::ToolButtonTextBesideIcon + + + true + + + Qt::RightArrow + + + + + + + Qt::Horizontal + + + + 100 + 20 + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 2 + + + + + Type + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + + Rectangular + + + + + Circular + + + + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 2 + + + + + + 1 + 0 + + + + Y + + + + + + + Step + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + X + + + 0.010000000000000 + + + + + + + + 1 + 0 + + + + Y + + + 0.010000000000000 + + + + + + + Size + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + X + + + + + + + + 1 + 0 + + + + Y + + + + + + + Rotation + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + ° + + + -180.000000000000000 + + + 180.000000000000000 + + + 5.000000000000000 + + + + + + + + 0 + 0 + + + + + + + + Offset + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + + + + + + + + + 1 + 0 + + + + X + + + + + + + Origin + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 2 + + + + + Origin + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + X + + + + + + + + 1 + 0 + + + + Y + + + + + + + Radius + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + + + + + + 1 + 0 + + + + + + + + Radius Step + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + + + + + Division + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + + + + + Rotation + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + ° + + + -180.000000000000000 + + + 180.000000000000000 + + + 5.000000000000000 + + + + + + + Offset + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + + + + + + + + + + + + + + + + + 2 + + + + + + + Graphics + + + true + + + Qt::ToolButtonTextBesideIcon + + + true + + + Qt::RightArrow + + + + + + + Qt::Horizontal + + + + 100 + 20 + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 2 + + + + + Color + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + Lines + + + + + Points + + + + + + + + Mode + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 1 + 0 + + + + + + + + ... + + + + + + + Tenth Color + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + ... + + + + + + + + + + + + + + + check_ShowGrid + edit_RectOriginX + edit_RectOriginY + edit_RectStepX + edit_RectStepY + edit_RectSizeX + edit_RectSizeY + edit_RectRotation + edit_RectOffset + edit_CircOriginX + edit_CircOriginY + edit_CircRadius + edit_CircRadiusStep + edit_CircDivision + edit_CircRotation + edit_CircOffset + + + + diff --git a/src/app/widget_gui_document.cpp b/src/app/widget_gui_document.cpp index 949bb4d4..66bc1c5e 100644 --- a/src/app/widget_gui_document.cpp +++ b/src/app/widget_gui_document.cpp @@ -15,6 +15,7 @@ #include "theme.h" #include "widget_clip_planes.h" #include "widget_explode_assembly.h" +#include "widget_grid.h" #include "widget_measure.h" #include "widget_occ_view.h" #include "widget_occ_view_controller.h" @@ -145,16 +146,24 @@ WidgetGuiDocument::WidgetGuiDocument(GuiDocument* guiDoc, QWidget* parent) auto layoutBtns = new QHBoxLayout(widgetBtnsContents); layoutBtns->setSpacing(Internal_widgetMargin + 2); layoutBtns->setContentsMargins(2, 2, 2, 2); + m_btnFitAll = this->createViewBtn(widgetBtnsContents, Theme::Icon::Expand, tr("Fit All")); + + m_btnGrid = this->createViewBtn(widgetBtnsContents, Theme::Icon::Grid, tr("Edit Grid")); + m_btnGrid->setCheckable(true); + m_btnEditClipping = this->createViewBtn(widgetBtnsContents, Theme::Icon::ClipPlane, tr("Edit clip planes")); m_btnEditClipping->setCheckable(true); + m_btnExplode = this->createViewBtn(widgetBtnsContents, Theme::Icon::Multiple, tr("Explode assemblies")); m_btnExplode->setCheckable(true); + m_btnMeasure = this->createViewBtn(widgetBtnsContents, Theme::Icon::Measure, tr("Measure shapes")); m_btnMeasure->setCheckable(true); layoutBtns->addWidget(m_btnFitAll); this->recreateMenuViewProjections(widgetBtnsContents); + layoutBtns->addWidget(m_btnGrid); layoutBtns->addWidget(m_btnEditClipping); layoutBtns->addWidget(m_btnExplode); layoutBtns->addWidget(m_btnMeasure); @@ -168,6 +177,10 @@ WidgetGuiDocument::WidgetGuiDocument(GuiDocument* guiDoc, QWidget* parent) QObject::connect(m_btnFitAll, &ButtonFlat::clicked, this, [=]{ m_guiDoc->runViewCameraAnimation(&GraphicsUtils::V3dView_fitAll); }); + QObject::connect( + m_btnGrid, &ButtonFlat::checked, + this, &WidgetGuiDocument::toggleWidgetGrid + ); QObject::connect( m_btnEditClipping, &ButtonFlat::checked, this, &WidgetGuiDocument::toggleWidgetClipPlanes @@ -218,6 +231,7 @@ void WidgetGuiDocument::resizeEvent(QResizeEvent* event) { QWidget::resizeEvent(event); this->layoutViewControls(); + this->layoutWidgetPanel(m_widgetGrid); this->layoutWidgetPanel(m_widgetClipPlanes); this->layoutWidgetPanel(m_widgetExplodeAsm); this->layoutWidgetPanel(m_widgetMeasure); @@ -241,6 +255,28 @@ void WidgetGuiDocument::updageWidgetPanelControls(QWidget* panelWidget, ButtonFl } } +void adjustWidgetSize(QWidget* widget) +{ + widget->updateGeometry(); + if (static_cast(widget->parentWidget())) + widget->parentWidget()->adjustSize(); +} + +void WidgetGuiDocument::toggleWidgetGrid(bool on) +{ + if (!m_widgetGrid && on) { + m_widgetGrid = new WidgetGrid(m_guiDoc->graphicsView()); + auto container = this->createWidgetPanelContainer(m_widgetGrid); + QObject::connect( + m_widgetGrid, &WidgetGrid::sizeAdjustmentRequested, + container, [=]{ adjustWidgetSize(m_widgetGrid); }, + Qt::QueuedConnection + ); + } + + this->updageWidgetPanelControls(m_widgetGrid, m_btnGrid); +} + void WidgetGuiDocument::toggleWidgetClipPlanes(bool on) { if (m_widgetClipPlanes) { @@ -273,7 +309,7 @@ void WidgetGuiDocument::toggleWidgetMeasure(bool on) auto container = this->createWidgetPanelContainer(m_widgetMeasure); QObject::connect( m_widgetMeasure, &WidgetMeasure::sizeAdjustmentRequested, - container, &QWidget::adjustSize, + container, [=]{ adjustWidgetSize(m_widgetMeasure); }, Qt::QueuedConnection ); } @@ -289,7 +325,7 @@ void WidgetGuiDocument::exclusiveButtonCheck(ButtonFlat* btnCheck) if (!btnCheck || !btnCheck->isChecked()) return; - ButtonFlat* arrayToggleBtn[] = { m_btnEditClipping, m_btnExplode, m_btnMeasure }; + ButtonFlat* arrayToggleBtn[] = { m_btnGrid, m_btnEditClipping, m_btnExplode, m_btnMeasure }; for (ButtonFlat* btn : arrayToggleBtn) { assert(btn->isCheckable()); if (btn != btnCheck) diff --git a/src/app/widget_gui_document.h b/src/app/widget_gui_document.h index bdc4abf2..c26456ec 100644 --- a/src/app/widget_gui_document.h +++ b/src/app/widget_gui_document.h @@ -20,6 +20,7 @@ class ButtonFlat; class GuiDocument; class WidgetClipPlanes; class WidgetExplodeAssembly; +class WidgetGrid; class WidgetMeasure; class IWidgetOccView; @@ -43,6 +44,7 @@ class WidgetGuiDocument : public QWidget { QWidget* createWidgetPanelContainer(QWidget* widgetContents); void updageWidgetPanelControls(QWidget* panelWidget, ButtonFlat* btnPanel); + void toggleWidgetGrid(bool on); void toggleWidgetClipPlanes(bool on); void toggleWidgetExplode(bool on); void toggleWidgetMeasure(bool on); @@ -61,10 +63,12 @@ class WidgetGuiDocument : public QWidget { WidgetOccViewController* m_controller = nullptr; WidgetClipPlanes* m_widgetClipPlanes = nullptr; WidgetExplodeAssembly* m_widgetExplodeAsm = nullptr; + WidgetGrid* m_widgetGrid = nullptr; WidgetMeasure* m_widgetMeasure = nullptr; QRect m_rectControls; ButtonFlat* m_btnFitAll = nullptr; + ButtonFlat* m_btnGrid = nullptr; ButtonFlat* m_btnEditClipping = nullptr; ButtonFlat* m_btnExplode = nullptr; ButtonFlat* m_btnMeasure = nullptr; diff --git a/src/graphics/graphics_utils.cpp b/src/graphics/graphics_utils.cpp index 58eb565d..bc421c85 100644 --- a/src/graphics/graphics_utils.cpp +++ b/src/graphics/graphics_utils.cpp @@ -28,9 +28,9 @@ static void AisContext_setObjectVisible( { if (ptrContext && object) { if (on) - ptrContext->Display(object, false); + ptrContext->Display(object, false/*dontUpdateViewer*/); else - ptrContext->Erase(object, false); + ptrContext->Erase(object, false/*dontUpdateViewer*/); } } @@ -39,7 +39,7 @@ static void AisContext_setObjectVisible( void GraphicsUtils::V3dView_fitAll(const Handle_V3d_View& view) { view->ZFitAll(); - view->FitAll(0.01, false); + view->FitAll(0.01, false/*dontUpdateView*/); } bool GraphicsUtils::V3dView_hasClipPlane( @@ -80,14 +80,42 @@ gp_Pnt GraphicsUtils::V3dView_to3dPosition(const Handle_V3d_View& view, double x return ElSLib::Value(pntConvertedOnPlane.X(), pntConvertedOnPlane.Y(), planeView); } +bool GraphicsUtils::V3dViewer_isGridActive(const Handle_V3d_Viewer& viewer) +{ +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 6, 0) + return viewer->IsGridActive(); +#else + return viewer->IsActive(); +#endif +} + +Handle_Aspect_Grid GraphicsUtils::V3dViewer_grid(const Handle_V3d_Viewer& viewer) +{ +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 6, 0) + return viewer->Grid(false/*dontCreate*/); +#else + return viewer->Grid(); +#endif +} + +GraphicsUtils::AspectGridColors GraphicsUtils::V3dViewer_gridColors(const Handle_V3d_Viewer& viewer) +{ + AspectGridColors colors; + Handle_Aspect_Grid gridAspect = V3dViewer_grid(viewer); + if (gridAspect) + gridAspect->Colors(colors.base, colors.tenth); + + return colors; +} + void GraphicsUtils::AisContext_eraseObject( const Handle_AIS_InteractiveContext& context, const Handle_AIS_InteractiveObject& object) { if (!object.IsNull() && !context.IsNull()) { - context->Erase(object, false); - context->Remove(object, false); - context->ClearPrs(object, 0, false); + context->Erase(object, false/*dontUpdateViewer*/); + context->Remove(object, false/*dontUpdateViewer*/); + context->ClearPrs(object, 0, false/*dontUpdateViewer*/); context->SelectionManager()->Remove(object); } } diff --git a/src/graphics/graphics_utils.h b/src/graphics/graphics_utils.h index b89ee67a..909d2935 100644 --- a/src/graphics/graphics_utils.h +++ b/src/graphics/graphics_utils.h @@ -9,24 +9,38 @@ #include "graphics_object_ptr.h" #include #include +#include #include #include +#include class Image_PixMap; namespace Mayo { struct GraphicsUtils { + + struct AspectGridColors { + Quantity_Color base; + Quantity_Color tenth; + }; + static void V3dView_fitAll(const Handle_V3d_View& view); static bool V3dView_hasClipPlane(const Handle_V3d_View& view, const Handle_Graphic3d_ClipPlane& plane); static gp_Pnt V3dView_to3dPosition(const Handle_V3d_View& view, double x, double y); + static bool V3dViewer_isGridActive(const Handle_V3d_Viewer& viewer); + static Handle_Aspect_Grid V3dViewer_grid(const Handle_V3d_Viewer& viewer); + static AspectGridColors V3dViewer_gridColors(const Handle_V3d_Viewer& viewer); + static void AisContext_eraseObject( const Handle_AIS_InteractiveContext& context, - const Handle_AIS_InteractiveObject& object); + const Handle_AIS_InteractiveObject& object + ); static void AisContext_setObjectVisible( const Handle_AIS_InteractiveContext& context, const Handle_AIS_InteractiveObject& object, - bool on); + bool on + ); static AIS_InteractiveContext* AisObject_contextPtr(const GraphicsObjectPtr& object); static bool AisObject_isVisible(const GraphicsObjectPtr& object); @@ -37,11 +51,14 @@ struct GraphicsUtils { static int AspectWindow_height(const Handle_Aspect_Window& wnd); static void Gfx3dClipPlane_setCappingHatch( - const Handle_Graphic3d_ClipPlane& plane, Aspect_HatchStyle hatch); + const Handle_Graphic3d_ClipPlane& plane, Aspect_HatchStyle hatch + ); static void Gfx3dClipPlane_setNormal( - const Handle_Graphic3d_ClipPlane& plane, const gp_Dir& n); + const Handle_Graphic3d_ClipPlane& plane, const gp_Dir& n + ); static void Gfx3dClipPlane_setPosition( - const Handle_Graphic3d_ClipPlane& plane, double pos); + const Handle_Graphic3d_ClipPlane& plane, double pos + ); static bool ImagePixmap_flipY(Image_PixMap& pixmap); }; diff --git a/src/graphics/graphics_view_ptr.h b/src/graphics/graphics_view_ptr.h index 7f15fe2d..c0400dd2 100644 --- a/src/graphics/graphics_view_ptr.h +++ b/src/graphics/graphics_view_ptr.h @@ -34,6 +34,8 @@ class GraphicsViewPtr { m_scene->redraw(m_view); } + const Handle_V3d_View& operator->() const { return m_view; } + private: GraphicsScene* m_scene = nullptr; Handle_V3d_View m_view; From 8cff1eeea5ff40f3f4888f091c4f62ab3b491c0a Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 27 Apr 2023 18:39:12 +0200 Subject: [PATCH 10/92] App: fix tab order in widget_grid.ui --- src/app/widget_grid.ui | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/app/widget_grid.ui b/src/app/widget_grid.ui index 48bf7620..d5dc5c2a 100644 --- a/src/app/widget_grid.ui +++ b/src/app/widget_grid.ui @@ -174,7 +174,7 @@ - 0 + 1 @@ -700,6 +700,9 @@ check_ShowGrid + combo_Plane + btn_Config + combo_Type edit_RectOriginX edit_RectOriginY edit_RectStepX @@ -708,6 +711,10 @@ edit_RectSizeY edit_RectRotation edit_RectOffset + btn_Graphics + combo_DrawMode + btn_Color + btn_ColorTenth edit_CircOriginX edit_CircOriginY edit_CircRadius From f536fe0bb4b5bc775c0fea53a772ba8d9cce3753 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 5 May 2023 18:12:49 +0200 Subject: [PATCH 11/92] Measure: display length/area values in the 3D view Relates to GitHub #190 --- src/app/widget_measure.cpp | 3 +- src/measure/measure_display.cpp | 50 ++++++++++----- src/measure/measure_display.h | 19 +++--- src/measure/measure_tool.h | 26 ++++++-- src/measure/measure_tool_brep.cpp | 101 ++++++++++++++++++++++++++---- src/measure/measure_tool_brep.h | 7 ++- tests/test_measure.cpp | 4 +- 7 files changed, 165 insertions(+), 45 deletions(-) diff --git a/src/app/widget_measure.cpp b/src/app/widget_measure.cpp index def467db..be7b2c6f 100644 --- a/src/app/widget_measure.cpp +++ b/src/app/widget_measure.cpp @@ -329,8 +329,9 @@ void WidgetMeasure::onGraphicsSelectionChanged() } // Display new measure graphics objects + auto measureDisplayConfig = this->currentMeasureDisplayConfig(); for (IMeasureDisplayPtr& measure : vecNewMeasureDisplay) { - measure->update(this->currentMeasureDisplayConfig()); + measure->update(measureDisplayConfig); measure->adaptGraphics(gfxScene->v3dViewer()->Driver()); foreachGraphicsObject(measure, [=](const GraphicsObjectPtr& gfxObject) { gfxObject->SetZLayer(Graphic3d_ZLayerId_Topmost); diff --git a/src/measure/measure_display.cpp b/src/measure/measure_display.cpp index ade95d89..dc5fefab 100644 --- a/src/measure/measure_display.cpp +++ b/src/measure/measure_display.cpp @@ -38,11 +38,11 @@ std::unique_ptr BaseMeasureDisplay::createFrom(MeasureType type case MeasureType::MinDistance: return std::make_unique(std::get(value)); case MeasureType::Length: - return std::make_unique(std::get(value)); + return std::make_unique(std::get(value)); case MeasureType::Angle: return std::make_unique(std::get(value)); case MeasureType::Area: - return std::make_unique(std::get(value)); + return std::make_unique(std::get(value)); default: return {}; } @@ -52,9 +52,9 @@ std::unique_ptr BaseMeasureDisplay::createEmptySumFrom(MeasureT { switch (type) { case MeasureType::Length: - return std::make_unique(Mayo::QuantityLength{0}); + return std::make_unique(Mayo::MeasureLength{}); case MeasureType::Area: - return std::make_unique(Mayo::QuantityArea{0}); + return std::make_unique(Mayo::MeasureArea{}); default: return {}; } @@ -358,26 +358,37 @@ GraphicsObjectPtr MeasureDisplayAngle::graphicsObjectAt(int i) const // -- Length // -- -MeasureDisplayLength::MeasureDisplayLength(QuantityLength length) - : m_length(length) +MeasureDisplayLength::MeasureDisplayLength(const MeasureLength& length) + : m_length(length), + m_gfxLenText(new AIS_TextLabel) { + m_gfxLenText->SetPosition(length.middlePnt); + BaseMeasureDisplay::applyGraphicsDefaults(this); } void MeasureDisplayLength::update(const MeasureDisplayConfig& config) { - const auto trLength = UnitSystem::translateLength(m_length, config.lengthUnit); + const auto trLength = UnitSystem::translateLength(m_length.value, config.lengthUnit); + const auto strLength = BaseMeasureDisplay::text(trLength, config); this->setText(fmt::format( MeasureDisplayI18N::textIdTr("{0}: {1}{2}"), BaseMeasureDisplay::sumTextOr(MeasureDisplayI18N::textIdTr("Length")), - BaseMeasureDisplay::text(trLength, config), + strLength, trLength.strUnit )); + m_gfxLenText->SetText(to_OccExtString(" " + strLength)); + BaseMeasureDisplay::adaptScale(m_gfxLenText, config); +} + +GraphicsObjectPtr MeasureDisplayLength::graphicsObjectAt(int i) const +{ + return i == 0 ? m_gfxLenText : GraphicsObjectPtr{}; } void MeasureDisplayLength::sumAdd(const IMeasureDisplay& other) { const auto& otherLen = dynamic_cast(other); - m_length += otherLen.m_length; + m_length.value += otherLen.m_length.value; BaseMeasureDisplay::sumAdd(other); } @@ -385,26 +396,37 @@ void MeasureDisplayLength::sumAdd(const IMeasureDisplay& other) // -- Area // -- -MeasureDisplayArea::MeasureDisplayArea(QuantityArea area) - : m_area(area) +MeasureDisplayArea::MeasureDisplayArea(const MeasureArea& area) + : m_area(area), + m_gfxAreaText(new AIS_TextLabel) { + m_gfxAreaText->SetPosition(area.middlePnt); + BaseMeasureDisplay::applyGraphicsDefaults(this); } void MeasureDisplayArea::update(const MeasureDisplayConfig& config) { - const auto trArea = UnitSystem::translateArea(m_area, config.areaUnit); + const auto trArea = UnitSystem::translateArea(m_area.value, config.areaUnit); + const auto strArea = BaseMeasureDisplay::text(trArea, config); this->setText(fmt::format( MeasureDisplayI18N::textIdTr("{0}: {1}{2}"), BaseMeasureDisplay::sumTextOr(MeasureDisplayI18N::textIdTr("Area")), - BaseMeasureDisplay::text(trArea, config), + strArea, trArea.strUnit )); + m_gfxAreaText->SetText(to_OccExtString(" " + strArea)); + BaseMeasureDisplay::adaptScale(m_gfxAreaText, config); +} + +GraphicsObjectPtr MeasureDisplayArea::graphicsObjectAt(int i) const +{ + return i == 0 ? m_gfxAreaText : GraphicsObjectPtr{}; } void MeasureDisplayArea::sumAdd(const IMeasureDisplay& other) { const auto& otherArea = dynamic_cast(other); - m_area += otherArea.m_area; + m_area.value += otherArea.m_area.value; BaseMeasureDisplay::sumAdd(other); } diff --git a/src/measure/measure_display.h b/src/measure/measure_display.h index b5573c5c..7a644158 100644 --- a/src/measure/measure_display.h +++ b/src/measure/measure_display.h @@ -24,6 +24,7 @@ namespace Mayo { +// Provides parameters to configure IMeasureDisplay objects struct MeasureDisplayConfig { LengthUnit lengthUnit = LengthUnit::Millimeter; AngleUnit angleUnit = AngleUnit::Degree; @@ -195,16 +196,17 @@ class MeasureDisplayAngle : public BaseMeasureDisplay { class MeasureDisplayLength : public BaseMeasureDisplay { public: - MeasureDisplayLength(QuantityLength length); + MeasureDisplayLength(const MeasureLength& length); void update(const MeasureDisplayConfig& config) override; - int graphicsObjectsCount() const override { return 0; } - GraphicsObjectPtr graphicsObjectAt(int /*i*/) const override { return {}; } + int graphicsObjectsCount() const override { return 1; } + GraphicsObjectPtr graphicsObjectAt(int i) const override; bool isSumSupported() const override { return true; } void sumAdd(const IMeasureDisplay& other) override; private: - QuantityLength m_length; + MeasureLength m_length; + Handle_AIS_TextLabel m_gfxLenText; }; // -- @@ -213,16 +215,17 @@ class MeasureDisplayLength : public BaseMeasureDisplay { class MeasureDisplayArea : public BaseMeasureDisplay { public: - MeasureDisplayArea(QuantityArea area); + MeasureDisplayArea(const MeasureArea& area); void update(const MeasureDisplayConfig& config) override; - int graphicsObjectsCount() const override { return 0; } - GraphicsObjectPtr graphicsObjectAt(int /*i*/) const override { return {}; } + int graphicsObjectsCount() const override { return 1; } + GraphicsObjectPtr graphicsObjectAt(int i) const override; bool isSumSupported() const override { return true; } void sumAdd(const IMeasureDisplay& other) override; private: - QuantityArea m_area; + MeasureArea m_area; + Handle_AIS_TextLabel m_gfxAreaText; }; } // namespace Mayo diff --git a/src/measure/measure_tool.h b/src/measure/measure_tool.h index 428d8e38..a85c8277 100644 --- a/src/measure/measure_tool.h +++ b/src/measure/measure_tool.h @@ -56,6 +56,24 @@ struct MeasureAngle { QuantityAngle value; }; +// Measure of the length of an entity +struct MeasureLength { + // Point being at the middle of the entity + gp_Pnt middlePnt; + // Value of the length + QuantityLength value; +}; + +// Measure of the area of an entity +struct MeasureArea { + // Point being at the middle of the entity + gp_Pnt middlePnt; + // Value of the area + QuantityArea value; +}; + + + // Provides an interface to various measurement services // Input data of a measure service is one or many graphics entities pointed to by GraphicsOwner objects class IMeasureTool { @@ -70,8 +88,8 @@ class IMeasureTool { virtual MeasureCircle circle(const GraphicsOwnerPtr& owner) const = 0; virtual MeasureMinDistance minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const = 0; virtual MeasureAngle angle(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const = 0; - virtual QuantityLength length(const GraphicsOwnerPtr& owner) const = 0; - virtual QuantityArea area(const GraphicsOwnerPtr& owner) const = 0; + virtual MeasureLength length(const GraphicsOwnerPtr& owner) const = 0; + virtual MeasureArea area(const GraphicsOwnerPtr& owner) const = 0; }; // Base interface for errors reported by measurement services of IMeasureTool @@ -87,8 +105,8 @@ using MeasureValue = std::variant< MeasureCircle, MeasureMinDistance, MeasureAngle, - QuantityLength, - QuantityArea + MeasureLength, + MeasureArea >; bool MeasureValue_isValid(const MeasureValue& res); diff --git a/src/measure/measure_tool_brep.cpp b/src/measure/measure_tool_brep.cpp index 608649f1..22edd4cf 100644 --- a/src/measure/measure_tool_brep.cpp +++ b/src/measure/measure_tool_brep.cpp @@ -8,6 +8,7 @@ #include "../base/geom_utils.h" #include "../base/math_utils.h" +#include "../base/mesh_utils.h" #include "../base/text_id.h" #include "../graphics/graphics_shape_object_driver.h" @@ -15,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -48,6 +50,7 @@ enum class ErrorCode { NotCircularEdge, NotBRepShape, NotGeometricOrPolygonEdge, + NotGeometricOrTriangulationFace, MinDistanceFailure, NotAllEdges, NotLinearEdge, @@ -70,6 +73,8 @@ class BRepMeasureError : public IMeasureError { return textIdTr("Entity must be a shape(BREP)"); case ErrorCode::NotGeometricOrPolygonEdge: return textIdTr("Entity must be a geometric or polygon edge"); + case ErrorCode::NotGeometricOrTriangulationFace: + return textIdTr("Entity must be a geometric or triangulation face"); case ErrorCode::MinDistanceFailure: return textIdTr("Computation of minimum distance failed"); case ErrorCode::NotAllEdges: @@ -96,7 +101,20 @@ const TopoDS_Shape getShape(const GraphicsOwnerPtr& owner) { static const TopoDS_Shape nullShape; auto brepOwner = Handle_StdSelect_BRepOwner::DownCast(owner); - return brepOwner ? brepOwner->Shape().Moved(owner->Location()) : nullShape; + TopLoc_Location ownerLoc = owner->Location(); +#if OCC_VERSION_HEX >= 0x070600 + // Force scale factor to 1 + // If scale factor <> 1 then it will cause a crash(exception) in TopoDS_Shape::Move() starting + // from OpenCascade >= 7.6 + const double absScale = std::abs(ownerLoc.Transformation().ScaleFactor()); + const double scalePrec = TopLoc_Location::ScalePrec(); + if (absScale < (1. - scalePrec) || absScale > (1. + scalePrec)) { + gp_Trsf trsf = ownerLoc.Transformation(); + trsf.SetScaleFactor(1.); + ownerLoc = trsf; + } +#endif + return brepOwner ? brepOwner->Shape().Moved(ownerLoc) : nullShape; } } // namespace @@ -164,19 +182,14 @@ MeasureAngle MeasureToolBRep::angle(const GraphicsOwnerPtr& owner1, const Graphi return brepAngle(getShape(owner1), getShape(owner2)); } -QuantityLength MeasureToolBRep::length(const GraphicsOwnerPtr& owner) const +MeasureLength MeasureToolBRep::length(const GraphicsOwnerPtr& owner) const { return brepLength(getShape(owner)); } -QuantityArea MeasureToolBRep::area(const GraphicsOwnerPtr& owner) const +MeasureArea MeasureToolBRep::area(const GraphicsOwnerPtr& owner) const { - const TopoDS_Shape shape = getShape(owner); - throwErrorIf(shape.IsNull() || shape.ShapeType() != TopAbs_FACE); - GProp_GProps gprops; - BRepGProp::SurfaceProperties(TopoDS::Face(shape), gprops); - const double area = gprops.Mass(); - return area * Quantity_SquareMillimeter; + return brepArea(getShape(owner)); } gp_Pnt MeasureToolBRep::brepVertexPosition(const TopoDS_Shape& shape) @@ -296,6 +309,7 @@ MeasureAngle MeasureToolBRep::brepAngle(const TopoDS_Shape& shape1, const TopoDS TopoDS_Edge edge1 = TopoDS::Edge(shape1); TopoDS_Edge edge2 = TopoDS::Edge(shape2); + // TODO What if edge1 and edge2 are not geometric? const BRepAdaptor_Curve curve1(edge1); const BRepAdaptor_Curve curve2(edge2); @@ -351,28 +365,89 @@ MeasureAngle MeasureToolBRep::brepAngle(const TopoDS_Shape& shape1, const TopoDS return angleResult; } -QuantityLength MeasureToolBRep::brepLength(const TopoDS_Shape& shape) +MeasureLength MeasureToolBRep::brepLength(const TopoDS_Shape& shape) { + MeasureLength lenResult; + throwErrorIf(shape.IsNull() || shape.ShapeType() != TopAbs_EDGE); const TopoDS_Edge& edge = TopoDS::Edge(shape); if (BRep_Tool::IsGeometric(edge)) { - const BRepAdaptor_Curve curve(TopoDS::Edge(shape)); + const BRepAdaptor_Curve curve(edge); const double len = GCPnts_AbscissaPoint::Length(curve, 1e-6); - return len * Quantity_Millimeter; + lenResult.value = len * Quantity_Millimeter; + const GCPnts_QuasiUniformAbscissa pnts(curve, 3); + if (pnts.IsDone() && pnts.NbPoints() == 3) { + lenResult.middlePnt = GeomUtils::d0(curve, pnts.Parameter(2)); + } + else { + const double midParam = (curve.FirstParameter() + curve.LastParameter()) / 2.; + lenResult.middlePnt = GeomUtils::d0(curve, midParam); + } } else { TopLoc_Location loc; const Handle(Poly_Polygon3D)& polyline = BRep_Tool::Polygon3D(edge, loc); throwErrorIf(polyline.IsNull()); double len = 0.; + // Compute length of the polygon for (int i = 2; i <= polyline->NbNodes(); ++i) { const gp_Pnt& pnt1 = polyline->Nodes().Value(i - 1); const gp_Pnt& pnt2 = polyline->Nodes().Value(i); len += pnt1.Distance(pnt2); } - return len * Quantity_Millimeter; + lenResult.value = len * Quantity_Millimeter; + + // Compute middle point of the polygon + double accumLen = 0.; + for (int i = 2; i <= polyline->NbNodes() && accumLen < (len / 2.); ++i) { + const gp_Pnt& pnt1 = polyline->Nodes().Value(i - 1); + const gp_Pnt& pnt2 = polyline->Nodes().Value(i); + accumLen += pnt1.Distance(pnt2); + if (accumLen > (len / 2.)) { + const gp_Pnt pntLoc1 = pnt1.Transformed(loc); + const gp_Pnt pntLoc2 = pnt2.Transformed(loc); + lenResult.middlePnt = pntLoc1.Translated(gp_Vec{pntLoc1, pntLoc2} / 2.); + } + } + } + + return lenResult; +} + +MeasureArea MeasureToolBRep::brepArea(const TopoDS_Shape& shape) +{ + MeasureArea areaResult; + throwErrorIf(shape.IsNull() || shape.ShapeType() != TopAbs_FACE); + const TopoDS_Face& face = TopoDS::Face(shape); + + if (BRep_Tool::IsGeometric(face)) { + GProp_GProps gprops; + BRepGProp::SurfaceProperties(face, gprops); + const double area = gprops.Mass(); + areaResult.value = area * Quantity_SquareMillimeter; + + const BRepAdaptor_Surface surface(face); + areaResult.middlePnt = surface.Value( + (surface.FirstUParameter() + surface.LastUParameter()) / 2., + (surface.FirstVParameter() + surface.LastVParameter()) / 2. + ); + } + else { + TopLoc_Location loc; + const Handle_Poly_Triangulation& triangulation = BRep_Tool::Triangulation(face, loc); + throwErrorIf(triangulation.IsNull()); + areaResult.value = MeshUtils::triangulationArea(triangulation) * Quantity_SquareMillimeter; + + for (int i = 1; i <= triangulation->NbNodes(); ++i) { + const gp_Pnt node = triangulation->Node(i).Transformed(loc); + areaResult.middlePnt.Translate(node.XYZ()); + } + + areaResult.middlePnt.ChangeCoord().Divide(triangulation->NbNodes()); } + + return areaResult; } } // namespace Mayo diff --git a/src/measure/measure_tool_brep.h b/src/measure/measure_tool_brep.h index dec02fdd..46c9fb27 100644 --- a/src/measure/measure_tool_brep.h +++ b/src/measure/measure_tool_brep.h @@ -24,14 +24,15 @@ class MeasureToolBRep : public IMeasureTool { MeasureCircle circle(const GraphicsOwnerPtr& owner) const override; MeasureMinDistance minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const override; MeasureAngle angle(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const override; - QuantityLength length(const GraphicsOwnerPtr& owner) const override; - QuantityArea area(const GraphicsOwnerPtr& owner) const override; + MeasureLength length(const GraphicsOwnerPtr& owner) const override; + MeasureArea area(const GraphicsOwnerPtr& owner) const override; static gp_Pnt brepVertexPosition(const TopoDS_Shape& shape); static MeasureCircle brepCircle(const TopoDS_Shape& shape); static MeasureMinDistance brepMinDistance(const TopoDS_Shape& shape1, const TopoDS_Shape& shape2); static MeasureAngle brepAngle(const TopoDS_Shape& shape1, const TopoDS_Shape& shape2); - static QuantityLength brepLength(const TopoDS_Shape& shape); + static MeasureLength brepLength(const TopoDS_Shape& shape); + static MeasureArea brepArea(const TopoDS_Shape& shape); private: static MeasureCircle brepCircleFromGeometricEdge(const TopoDS_Edge& edge); diff --git a/tests/test_measure.cpp b/tests/test_measure.cpp index ce835070..e4c6c182 100644 --- a/tests/test_measure.cpp +++ b/tests/test_measure.cpp @@ -167,8 +167,8 @@ void TestMeasure::BRepLength_PolygonEdge_test() points.ChangeValue(4) = gp_Pnt{7, 10, 5}; points.ChangeValue(5) = gp_Pnt{7, 12, 5}; const TopoDS_Edge edge = makePolygonEdge(points); - const QuantityLength len = MeasureToolBRep::brepLength(edge); - QCOMPARE(UnitSystem::millimeters(len).value, 24.); + const MeasureLength len = MeasureToolBRep::brepLength(edge); + QCOMPARE(UnitSystem::millimeters(len.value).value, 24.); } } // namespace Mayo From e73d564affc235da5229ad58976e3f111ead953d Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Sat, 6 May 2023 11:05:12 +0200 Subject: [PATCH 12/92] Base: add BRepUtils::isGeometric() for edge --- src/base/brep_utils.cpp | 5 +++++ src/base/brep_utils.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/src/base/brep_utils.cpp b/src/base/brep_utils.cpp index 66e54493..47ea423c 100644 --- a/src/base/brep_utils.cpp +++ b/src/base/brep_utils.cpp @@ -65,6 +65,11 @@ TopoDS_Shape BRepUtils::shapeFromString(const std::string& str) return shape; } +bool Mayo::BRepUtils::isGeometric(const TopoDS_Edge &edge) +{ + return BRep_Tool::IsGeometric(edge); +} + bool BRepUtils::isGeometric(const TopoDS_Face& face) { #if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 5, 0) diff --git a/src/base/brep_utils.h b/src/base/brep_utils.h index 3a9d6eef..727b7308 100644 --- a/src/base/brep_utils.h +++ b/src/base/brep_utils.h @@ -53,6 +53,9 @@ struct BRepUtils { // Deserializes string 'str' obtained from 'shapeToToString()' into a shape object static TopoDS_Shape shapeFromString(const std::string& str); + // Does 'edge' rely on 3D curve of curve on surface? + static bool isGeometric(const TopoDS_Edge& edge); + // Does 'face' rely on a geometric surface? static bool isGeometric(const TopoDS_Face& face); From 47ff5a3082d35e5f5a7024805550d8dbd55294af Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Sat, 6 May 2023 11:06:16 +0200 Subject: [PATCH 13/92] Measure: add unit test for MeasureToolBRep::brepArea() Relates to GitHub #190 --- src/base/task_progress.cpp | 5 +++-- src/base/unit_system.cpp | 5 +++++ src/base/unit_system.h | 1 + src/measure/measure_tool_brep.cpp | 7 ++++--- tests/inputs/face_trsf_scale_almost_1.stl | Bin 0 -> 195984 bytes tests/test_measure.cpp | 18 ++++++++++++++++++ tests/test_measure.h | 2 ++ 7 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 tests/inputs/face_trsf_scale_almost_1.stl diff --git a/src/base/task_progress.cpp b/src/base/task_progress.cpp index 5f25f709..c960d1de 100644 --- a/src/base/task_progress.cpp +++ b/src/base/task_progress.cpp @@ -64,9 +64,10 @@ void TaskProgress::setValue(int pct) void TaskProgress::setStep(std::string_view title) { - m_step = title; - if (m_taskMgr && m_taskId != TaskId_null) + if (m_taskMgr && m_taskId != TaskId_null) { + m_step = title; m_taskMgr->signalProgressStep.send(m_taskId, m_step); + } } bool TaskProgress::isAbortRequested(const TaskProgress* progress) diff --git a/src/base/unit_system.cpp b/src/base/unit_system.cpp index aba843da..6bff41f2 100644 --- a/src/base/unit_system.cpp +++ b/src/base/unit_system.cpp @@ -370,6 +370,11 @@ UnitSystem::TranslateResult UnitSystem::millimeters(QuantityLength length) return { length.value(), "mm", 1. }; } +UnitSystem::TranslateResult UnitSystem::squareMillimeters(QuantityArea area) +{ + return { area.value(), "mm²", 1. }; +} + UnitSystem::TranslateResult UnitSystem::cubicMillimeters(QuantityVolume volume) { return { volume.value(), "mm³", 1. }; diff --git a/src/base/unit_system.h b/src/base/unit_system.h index 5ffeffbd..e773e31a 100644 --- a/src/base/unit_system.h +++ b/src/base/unit_system.h @@ -38,6 +38,7 @@ class UnitSystem { static TranslateResult degrees(QuantityAngle angle); static TranslateResult meters(QuantityLength length); static TranslateResult millimeters(QuantityLength length); + static TranslateResult squareMillimeters(QuantityArea area); static TranslateResult cubicMillimeters(QuantityVolume volume); static TranslateResult millimetersPerSecond(QuantityVelocity speed); static TranslateResult milliseconds(QuantityTime duration); diff --git a/src/measure/measure_tool_brep.cpp b/src/measure/measure_tool_brep.cpp index 22edd4cf..7aec1e37 100644 --- a/src/measure/measure_tool_brep.cpp +++ b/src/measure/measure_tool_brep.cpp @@ -6,6 +6,7 @@ #include "measure_tool_brep.h" +#include "../base/brep_utils.h" #include "../base/geom_utils.h" #include "../base/math_utils.h" #include "../base/mesh_utils.h" @@ -278,7 +279,7 @@ MeasureCircle MeasureToolBRep::brepCircle(const TopoDS_Shape& shape) { throwErrorIf(shape.IsNull() || shape.ShapeType() != TopAbs_EDGE); const TopoDS_Edge& edge = TopoDS::Edge(shape); - if (BRep_Tool::IsGeometric(edge)) + if (BRepUtils::isGeometric(edge)) return MeasureToolBRep::brepCircleFromGeometricEdge(edge); else return MeasureToolBRep::brepCircleFromPolygonEdge(edge); @@ -371,7 +372,7 @@ MeasureLength MeasureToolBRep::brepLength(const TopoDS_Shape& shape) throwErrorIf(shape.IsNull() || shape.ShapeType() != TopAbs_EDGE); const TopoDS_Edge& edge = TopoDS::Edge(shape); - if (BRep_Tool::IsGeometric(edge)) { + if (BRepUtils::isGeometric(edge)) { const BRepAdaptor_Curve curve(edge); const double len = GCPnts_AbscissaPoint::Length(curve, 1e-6); lenResult.value = len * Quantity_Millimeter; @@ -421,7 +422,7 @@ MeasureArea MeasureToolBRep::brepArea(const TopoDS_Shape& shape) throwErrorIf(shape.IsNull() || shape.ShapeType() != TopAbs_FACE); const TopoDS_Face& face = TopoDS::Face(shape); - if (BRep_Tool::IsGeometric(face)) { + if (BRepUtils::isGeometric(face)) { GProp_GProps gprops; BRepGProp::SurfaceProperties(face, gprops); const double area = gprops.Mass(); diff --git a/tests/inputs/face_trsf_scale_almost_1.stl b/tests/inputs/face_trsf_scale_almost_1.stl new file mode 100644 index 0000000000000000000000000000000000000000..2eb24f97f896c5157314bfee4e712224e9282fba GIT binary patch literal 195984 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 X{2LKWI7ficj71g@Y}#}iS-_OqAk2vq`) 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 @@ -171,4 +174,19 @@ void TestMeasure::BRepLength_PolygonEdge_test() QCOMPARE(UnitSystem::millimeters(len.value).value, 24.); } +void TestMeasure::BRepArea_TriangulationFace() +{ + auto progress = &TaskProgress::null(); + IO::OccStlReader reader; + const bool okRead = reader.readFile("tests/inputs/face_trsf_scale_almost_1.stl", progress); + QVERIFY(okRead); + + auto doc = Application::instance()->newDocument(); + const TDF_LabelSequence seqLabel = reader.transfer(doc, progress); + QCOMPARE(seqLabel.Size(), 1); + const TopoDS_Shape shape = doc->xcaf().shape(seqLabel.First()); + const MeasureArea area = MeasureToolBRep::brepArea(shape); + QVERIFY(std::abs(double(UnitSystem::squareMillimeters(area.value)) - 597.6224) < 0.0001); +} + } // namespace Mayo diff --git a/tests/test_measure.h b/tests/test_measure.h index 8950ddd8..775f17c8 100644 --- a/tests/test_measure.h +++ b/tests/test_measure.h @@ -28,6 +28,8 @@ private slots: void BRepAngle_TwoLinesParallelError_test(); void BRepLength_PolygonEdge_test(); + + void BRepArea_TriangulationFace(); }; } // namespace Mayo From 0875a9f78f4574bdbab233ce4f884a2208e3b9e3 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 10 May 2023 16:34:35 +0200 Subject: [PATCH 14/92] App: add some doc --- src/app/widget_clip_planes.h | 1 + src/app/widget_explode_assembly.h | 1 + src/app/widget_home_files.h | 2 +- src/app/widget_measure.h | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/app/widget_clip_planes.h b/src/app/widget_clip_planes.h index 9375b667..13b15625 100644 --- a/src/app/widget_clip_planes.h +++ b/src/app/widget_clip_planes.h @@ -20,6 +20,7 @@ class QDoubleSpinBox; namespace Mayo { +// Widget panel dedicated to clip planes in 3D view class WidgetClipPlanes : public QWidget { Q_OBJECT public: diff --git a/src/app/widget_explode_assembly.h b/src/app/widget_explode_assembly.h index c4f0af40..9ff605ef 100644 --- a/src/app/widget_explode_assembly.h +++ b/src/app/widget_explode_assembly.h @@ -12,6 +12,7 @@ namespace Mayo { class GuiDocument; +// Widget panel dedicated to exploding of assemblies within a GuiDocument object class WidgetExplodeAssembly : public QWidget { Q_OBJECT public: diff --git a/src/app/widget_home_files.h b/src/app/widget_home_files.h index 1f02721f..93cdb222 100644 --- a/src/app/widget_home_files.h +++ b/src/app/widget_home_files.h @@ -20,7 +20,7 @@ class WidgetHomeFiles : public QWidget { signals: void newDocumentRequested(); void openDocumentsRequested(); - void recentFileOpenRequested(const FilePath& fp); + void recentFileOpenRequested(const Mayo::FilePath& fp); protected: void resizeEvent(QResizeEvent* event) override; diff --git a/src/app/widget_measure.h b/src/app/widget_measure.h index c43d5412..f451433d 100644 --- a/src/app/widget_measure.h +++ b/src/app/widget_measure.h @@ -20,6 +20,7 @@ namespace Mayo { class GuiDocument; +// Widget panel dedicated to measurements in 3D view class WidgetMeasure : public QWidget { Q_OBJECT public: From cd1f78dc02402027972ed73e4dac37ef17928ae8 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 10 May 2023 16:40:26 +0200 Subject: [PATCH 15/92] App: fix grid colors when switching grid type Relats to GitHub #189 --- src/app/widget_grid.cpp | 8 +++++--- src/app/widget_grid.h | 1 + src/graphics/graphics_utils.cpp | 7 +++++++ src/graphics/graphics_utils.h | 1 + 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/app/widget_grid.cpp b/src/app/widget_grid.cpp index 8fe1651d..3a6a5363 100644 --- a/src/app/widget_grid.cpp +++ b/src/app/widget_grid.cpp @@ -148,10 +148,12 @@ WidgetGrid::WidgetGrid(GraphicsViewPtr viewPtr, QWidget* parent) ); QObject::connect(m_ui->combo_Type, sigComboBoxActivated_int, this, [=](int typeIndex) { m_ui->stack_Config->setCurrentIndex(typeIndex); + auto gridColors = GraphicsUtils::V3dViewer_gridColors(viewer); viewer->ActivateGrid( toGridType(m_ui->combo_Type->currentIndex()), toGridDrawMode(m_ui->combo_DrawMode->currentIndex()) ); + GraphicsUtils::V3dViewer_setGridColors(viewer, gridColors); m_viewPtr.redraw(); }); QObject::connect(m_ui->combo_Plane, sigComboBoxActivated_int, this, [=](int planeIndex) { @@ -306,9 +308,9 @@ void WidgetGrid::chooseGridColor(GridColorType colorType) // Helper function to apply some base/tenth grid color auto fnApplyGridColor = [=](const Quantity_Color& color) { if (colorType == GridColorType::Base) - GraphicsUtils::V3dViewer_grid(viewer)->SetColors(color, gridColors.tenth); + GraphicsUtils::V3dViewer_setGridColors(viewer, { color, gridColors.tenth }); else - GraphicsUtils::V3dViewer_grid(viewer)->SetColors(gridColors.base, color); + GraphicsUtils::V3dViewer_setGridColors(viewer, { gridColors.base, color }); m_viewPtr.redraw(); }; @@ -318,7 +320,7 @@ void WidgetGrid::chooseGridColor(GridColorType colorType) dlg->setCurrentColor(QtGuiUtils::toQColor(onEntryGridColor)); QObject::connect(dlg, &QColorDialog::currentColorChanged, this, [=](const QColor& color) { - fnApplyGridColor(QtGuiUtils::toPreferredColorSpace(color)); + fnApplyGridColor(QtGuiUtils::toColor(color)); }); QObject::connect(dlg, &QDialog::accepted, this, [=]{ auto btn = colorType == GridColorType::Base ? m_ui->btn_Color : m_ui->btn_ColorTenth; diff --git a/src/app/widget_grid.h b/src/app/widget_grid.h index 5ab111bb..ef588a75 100644 --- a/src/app/widget_grid.h +++ b/src/app/widget_grid.h @@ -13,6 +13,7 @@ class gp_Ax2; namespace Mayo { +// Widget panel dedicated to management of the grid in 3D view class WidgetGrid : public QWidget { Q_OBJECT public: diff --git a/src/graphics/graphics_utils.cpp b/src/graphics/graphics_utils.cpp index bc421c85..404b7483 100644 --- a/src/graphics/graphics_utils.cpp +++ b/src/graphics/graphics_utils.cpp @@ -108,6 +108,13 @@ GraphicsUtils::AspectGridColors GraphicsUtils::V3dViewer_gridColors(const Handle return colors; } +void GraphicsUtils::V3dViewer_setGridColors(const Handle_V3d_Viewer &viewer, const AspectGridColors &colors) +{ + Handle_Aspect_Grid gridAspect = V3dViewer_grid(viewer); + if (gridAspect) + gridAspect->SetColors(colors.base, colors.tenth); +} + void GraphicsUtils::AisContext_eraseObject( const Handle_AIS_InteractiveContext& context, const Handle_AIS_InteractiveObject& object) diff --git a/src/graphics/graphics_utils.h b/src/graphics/graphics_utils.h index 909d2935..494a3ea8 100644 --- a/src/graphics/graphics_utils.h +++ b/src/graphics/graphics_utils.h @@ -31,6 +31,7 @@ struct GraphicsUtils { static bool V3dViewer_isGridActive(const Handle_V3d_Viewer& viewer); static Handle_Aspect_Grid V3dViewer_grid(const Handle_V3d_Viewer& viewer); static AspectGridColors V3dViewer_gridColors(const Handle_V3d_Viewer& viewer); + static void V3dViewer_setGridColors(const Handle_V3d_Viewer& viewer, const AspectGridColors& colors); static void AisContext_eraseObject( const Handle_AIS_InteractiveContext& context, From e32f59a4fca726acb0366e3c279bc5074e3b8f93 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 10 May 2023 18:10:36 +0200 Subject: [PATCH 16/92] App: implement on/off status for grid tenth color Relates to GitHub #189 --- src/app/widget_grid.cpp | 52 +++++++++++++++++++++++------ src/app/widget_grid.h | 2 ++ src/app/widget_grid.ui | 74 +++++++++++++++++++++++------------------ 3 files changed, 85 insertions(+), 43 deletions(-) diff --git a/src/app/widget_grid.cpp b/src/app/widget_grid.cpp index 3a6a5363..3c521680 100644 --- a/src/app/widget_grid.cpp +++ b/src/app/widget_grid.cpp @@ -20,6 +20,18 @@ namespace Mayo { +namespace { + +QPixmap colorSquarePixmap(const Quantity_Color& color) { + return IPropertyEditorFactory::colorSquarePixmap(QtGuiUtils::toQColor(color)); +} + +QPixmap colorSquarePixmap(const QColor& color) { + return IPropertyEditorFactory::colorSquarePixmap(color); +} + +} // namespace + WidgetGrid::WidgetGrid(GraphicsViewPtr viewPtr, QWidget* parent) : QWidget(parent), m_ui(new Ui_WidgetGrid), @@ -125,12 +137,10 @@ WidgetGrid::WidgetGrid(GraphicsViewPtr viewPtr, QWidget* parent) } // Install grid draw colors - if (gridAspect) { - Quantity_Color color, colorTenth; - gridAspect->Colors(color, colorTenth); - m_ui->btn_Color->setIcon(IPropertyEditorFactory::colorSquarePixmap(QtGuiUtils::toQColor(color))); - m_ui->btn_ColorTenth->setIcon(IPropertyEditorFactory::colorSquarePixmap(QtGuiUtils::toQColor(colorTenth))); - } + auto gridColors = GraphicsUtils::V3dViewer_gridColors(viewer); + m_ui->btn_Color->setIcon(colorSquarePixmap(gridColors.base)); + m_ui->btn_ColorTenth->setIcon(colorSquarePixmap(gridColors.tenth)); + m_gridColorTenth = gridColors.tenth; // Install widgets enable status m_ui->combo_Plane->setEnabled(GraphicsUtils::V3dViewer_isGridActive(viewer)); @@ -183,6 +193,9 @@ WidgetGrid::WidgetGrid(GraphicsViewPtr viewPtr, QWidget* parent) QObject::connect( m_ui->btn_ColorTenth, &QToolButton::clicked, this, [=]{ this->chooseGridColor(GridColorType::Tenth); } ); + QObject::connect( + m_ui->check_ColorTenth, &QAbstractButton::toggled, this, &WidgetGrid::enableGridColorTenth + ); auto sigGridParamChanged_double = qOverload(&QDoubleSpinBox::valueChanged); auto sigGridParamChanged_int = qOverload(&QSpinBox::valueChanged); @@ -307,10 +320,14 @@ void WidgetGrid::chooseGridColor(GridColorType colorType) auto gridColors = GraphicsUtils::V3dViewer_gridColors(viewer); // Helper function to apply some base/tenth grid color auto fnApplyGridColor = [=](const Quantity_Color& color) { - if (colorType == GridColorType::Base) - GraphicsUtils::V3dViewer_setGridColors(viewer, { color, gridColors.tenth }); - else + if (colorType == GridColorType::Base) { + const auto colorTenth = m_ui->check_ColorTenth->isChecked() ? gridColors.tenth : color; + GraphicsUtils::V3dViewer_setGridColors(viewer, { color, colorTenth }); + } + else { GraphicsUtils::V3dViewer_setGridColors(viewer, { gridColors.base, color }); + } + m_viewPtr.redraw(); }; @@ -324,15 +341,28 @@ void WidgetGrid::chooseGridColor(GridColorType colorType) }); QObject::connect(dlg, &QDialog::accepted, this, [=]{ auto btn = colorType == GridColorType::Base ? m_ui->btn_Color : m_ui->btn_ColorTenth; - btn->setIcon(IPropertyEditorFactory::colorSquarePixmap(dlg->selectedColor())); + btn->setIcon(colorSquarePixmap(dlg->selectedColor())); + if (colorType == GridColorType::Tenth) + m_gridColorTenth = QtGuiUtils::toColor(dlg->selectedColor()); }); QObject::connect(dlg, &QDialog::rejected, this, [=]{ auto btn = colorType == GridColorType::Base ? m_ui->btn_Color : m_ui->btn_ColorTenth; - btn->setIcon(IPropertyEditorFactory::colorSquarePixmap(QtGuiUtils::toQColor(onEntryGridColor))); + btn->setIcon(colorSquarePixmap(onEntryGridColor)); fnApplyGridColor(onEntryGridColor); }); QtWidgetsUtils::asyncDialogExec(dlg); } +void WidgetGrid::enableGridColorTenth(bool on) +{ + const Handle_V3d_Viewer& viewer = m_viewPtr->Viewer(); + m_ui->label_ColorTenth->setEnabled(on); + m_ui->btn_ColorTenth->setEnabled(on); + auto gridColors = GraphicsUtils::V3dViewer_gridColors(viewer); + const auto gridColorTenth = on ? m_gridColorTenth : gridColors.base; + GraphicsUtils::V3dViewer_setGridColors(viewer, { gridColors.base, gridColorTenth }); + m_viewPtr.redraw(); +} + } // namespace Mayo diff --git a/src/app/widget_grid.h b/src/app/widget_grid.h index ef588a75..d1d0b2e5 100644 --- a/src/app/widget_grid.h +++ b/src/app/widget_grid.h @@ -34,9 +34,11 @@ class WidgetGrid : public QWidget { void applyGridParams(); void applyGridGraphicsParams(); void chooseGridColor(GridColorType colorType); + void enableGridColorTenth(bool on); class Ui_WidgetGrid* m_ui = nullptr; GraphicsViewPtr m_viewPtr; + Quantity_Color m_gridColorTenth; }; } // namespace Mayo diff --git a/src/app/widget_grid.ui b/src/app/widget_grid.ui index d5dc5c2a..388d0078 100644 --- a/src/app/widget_grid.ui +++ b/src/app/widget_grid.ui @@ -620,17 +620,41 @@ 2 - - + + - Color + ... + + + + + + + Tenth Color + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + ... + + + + + + + Mode Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + @@ -644,17 +668,27 @@ - - + + - Mode + Color Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + + + + + + + true + + + + @@ -664,30 +698,6 @@ - - - - ... - - - - - - - Tenth Color - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - - - ... - - - From e329c05e8dbd32cca88bb47fb743761c9a79d973 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 11 May 2023 17:48:21 +0200 Subject: [PATCH 17/92] CI: split Linux/macOS builds in distinct yml files --- .github/workflows/{ci.yml => ci_linux.yml} | 49 ++++----------------- .github/workflows/ci_macos.yml | 50 ++++++++++++++++++++++ README.md | 5 ++- 3 files changed, 62 insertions(+), 42 deletions(-) rename .github/workflows/{ci.yml => ci_linux.yml} (56%) create mode 100644 .github/workflows/ci_macos.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci_linux.yml similarity index 56% rename from .github/workflows/ci.yml rename to .github/workflows/ci_linux.yml index 87db274f..9120b496 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci_linux.yml @@ -1,23 +1,14 @@ -name: CI +name: Linux on: [push] jobs: - ci: - strategy: - fail-fast: false - matrix: - os: [ubuntu-latest, macos-latest] - - runs-on: ${{matrix.os}} + build-linux: + runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v2 - with: - path: 'source' - fetch-depth: 0 - lfs: 'false' - name: Cache Qt id: cache-qt @@ -31,8 +22,7 @@ jobs: with: cached: ${{ steps.cache-qt.outputs.cache-hit }} - - name: Install OpenCascade[Ubuntu] - if: startsWith(matrix.os, 'ubuntu') + - name: Install OpenCascade run: | sudo apt-get -y install libocct-data-exchange-dev libocct-draw-dev GH_CASCADE_INC_DIR=`dpkg -L libocct-foundation-dev | grep -i "Standard_Version.hxx" | sed "s/\/Standard_Version.hxx//i"` @@ -40,37 +30,22 @@ jobs: echo "GH_CASCADE_INC_DIR=$GH_CASCADE_INC_DIR" >> $GITHUB_ENV echo "GH_CASCADE_LIB_DIR=$GH_CASCADE_LIB_DIR" >> $GITHUB_ENV - - name: Install OpenCascade[macOS] - if: startsWith(matrix.os, 'macos') - run: | - brew install opencascade - GH_CASCADE_BASE_DIR=`brew info opencascade | grep -E -i --only-matching --max-count=1 "^(/[a-z\.\-_0-9]+)+"` - echo "GH_CASCADE_INC_DIR=$GH_CASCADE_BASE_DIR/include/opencascade" >> $GITHUB_ENV - echo "GH_CASCADE_LIB_DIR=$GH_CASCADE_BASE_DIR/lib" >> $GITHUB_ENV - - name: Get count of CPU cores uses: SimenB/github-actions-cpu-cores@v1 id: cpu-cores - - name: Create Build folder - run: mkdir ${{github.workspace}}/build - - - name: QMake - working-directory: ${{github.workspace}}/build + - name: Build run: | + mkdir ${{github.workspace}}/build + cd ${{github.workspace}}/build echo CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} echo CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} [ ! -d $CASCADE_INC_DIR ] && echo "ERROR: OpenCascade include dir doesn't exist" [ ! -d $CASCADE_LIB_DIR ] && echo "ERROR: OpenCascade lib dir doesn't exist" - qmake ../source CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} CONFIG+=withtests - - - name: Build - working-directory: ${{github.workspace}}/build - run: | + qmake .. CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} CONFIG+=withtests make -j${{steps.cpu-cores.outputs.count}} - - name: Execute Unit Tests[Ubuntu] - if: startsWith(matrix.os, 'ubuntu') + - name: Execute Unit Tests working-directory: ${{github.workspace}}/build env: DISPLAY: :0 @@ -84,9 +59,3 @@ jobs: sleep 5s # Run tests ./mayo --runtests - - - name: Execute Unit Tests[macOS] - if: startsWith(matrix.os, 'macos') - working-directory: ${{github.workspace}}/build - run: | - ./mayo.app/Contents/MacOS/mayo --runtests diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml new file mode 100644 index 00000000..41506592 --- /dev/null +++ b/.github/workflows/ci_macos.yml @@ -0,0 +1,50 @@ +name: macOS + +on: [push] + +jobs: + build-macos: + runs-on: macos-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Cache Qt + id: cache-qt + uses: actions/cache@v1 + with: + path: ../Qt + key: ${{ runner.os }}-QtCache + + - name: Install Qt + uses: jurplel/install-qt-action@v2 + with: + cached: ${{ steps.cache-qt.outputs.cache-hit }} + + - name: Install OpenCascade + run: | + brew install opencascade + GH_CASCADE_BASE_DIR=`brew info opencascade | grep -E -i --only-matching --max-count=1 "^(/[a-z\.\-_0-9]+)+"` + echo "GH_CASCADE_INC_DIR=$GH_CASCADE_BASE_DIR/include/opencascade" >> $GITHUB_ENV + echo "GH_CASCADE_LIB_DIR=$GH_CASCADE_BASE_DIR/lib" >> $GITHUB_ENV + + - name: Get count of CPU cores + uses: SimenB/github-actions-cpu-cores@v1 + id: cpu-cores + + - name: Build + run: | + mkdir ${{github.workspace}}/build + cd ${{github.workspace}}/build + echo CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} + echo CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} + [ ! -d $CASCADE_INC_DIR ] && echo "ERROR: OpenCascade include dir doesn't exist" + [ ! -d $CASCADE_LIB_DIR ] && echo "ERROR: OpenCascade lib dir doesn't exist" + qmake .. CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} CONFIG+=withtests + make -j${{steps.cpu-cores.outputs.count}} + + - name: Execute Unit Tests + working-directory: ${{github.workspace}}/build + run: | + ./mayo.app/Contents/MacOS/mayo --runtests diff --git a/README.md b/README.md index e8051a4e..b6fbf09d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@
-[![CI](https://github.com/fougue/mayo/actions/workflows/ci.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci.yml) -[![Build status](https://ci.appveyor.com/api/projects/status/6d1w0d6gw28npxpf/branch/develop?svg=true)](https://ci.appveyor.com/project/HuguesDelorme/mayo) +[![Linux CI](https://github.com/fougue/mayo/actions/workflows/ci_linux.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_linux.yml) +[![macOS CI](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml) +[![Windows CI](https://ci.appveyor.com/api/projects/status/6d1w0d6gw28npxpf/branch/develop?svg=true)](https://ci.appveyor.com/project/HuguesDelorme/mayo) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/d51f8ca6fea34886b8308ff0246172ce)](https://www.codacy.com/gh/fougue/mayo/dashboard?utm_source=github.com&utm_medium=referral&utm_content=fougue/mayo&utm_campaign=Badge_Grade) [![Downloads](https://img.shields.io/github/downloads/fougue/mayo/total.svg)](https://github.com/fougue/mayo/releases) [![License](https://img.shields.io/badge/license-BSD%202--clause-blue.svg)](https://github.com/fougue/mayo/blob/develop/LICENSE.txt) From 78200da1fdb378630d8f5b06adb94cc38d17c1c4 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 15 May 2023 12:43:10 +0200 Subject: [PATCH 18/92] CI: add github Windows-specific build --- .github/workflows/ci_windows.yml | 83 +++++++++++++++++++++++++++++ README.md | 2 +- appveyor.yml | 63 ---------------------- mayo.pro | 5 +- scripts/bump-version.rb | 7 --- tests/runtests.cpp | 90 ++++++++++++++++++++++++++++++-- 6 files changed, 174 insertions(+), 76 deletions(-) create mode 100644 .github/workflows/ci_windows.yml delete mode 100644 appveyor.yml diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml new file mode 100644 index 00000000..f90e3925 --- /dev/null +++ b/.github/workflows/ci_windows.yml @@ -0,0 +1,83 @@ +name: Windows + +on: [push] + +jobs: + build-windows-msvc: + strategy: + matrix: + occ_version: [7.3.0, 7.4.0, 7.5.0, 7.6.0, 7.7.0] + + runs-on: windows-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Cache Qt + id: cache-qt + uses: actions/cache@v1 + with: + path: ../Qt + key: ${{ runner.os }}-QtCache + + - name: Install Qt + uses: jurplel/install-qt-action@v2 + with: + cached: ${{ steps.cache-qt.outputs.cache-hit }} + + - name: Cache OpenCascade archive + id: cache-occ + uses: actions/cache@v3 + with: + path: OpenCASCADE-${{matrix.occ_version}}-vc14-64.zip + key: occ-${{matrix.occ_version}} + + - name: Download OpenCascade + if: steps.cache-occ.outputs.cache-hit != 'true' + uses: carlosperate/download-file-action@v2 + with: + file-url: 'https://www.fougue.pro/share/bin/OpenCASCADE-${{matrix.occ_version}}-vc14-64.zip' + + - name: Extract OpenCascade + shell: pwsh + run: | + Expand-Archive -Path OpenCASCADE-${{matrix.occ_version}}-vc14-64.zip -DestinationPath . + + - name: Download jom.exe + uses: carlosperate/download-file-action@v2 + with: + file-url: 'https://www.fougue.pro/share/bin/jom.exe' + + - name: Get count of CPU cores + uses: SimenB/github-actions-cpu-cores@v1 + id: cpu-cores + + - name: Create Build folder + run: mkdir ${{github.workspace}}/build + + - name: Configure Compiler + uses: ilammy/msvc-dev-cmd@v1 + + - name: QMake + working-directory: ${{github.workspace}}/build + shell: cmd + run: | + call ..\OpenCASCADE-${{matrix.occ_version}}-vc14-64\opencascade-${{matrix.occ_version}}\env.bat + echo CSF_OCCTIncludePath=%CSF_OCCTIncludePath% + echo CSF_OCCTLibPath=%CSF_OCCTLibPath% + qmake --version + qmake ..\mayo.pro CONFIG+=release CONFIG+=withtests + + - name: Build + working-directory: ${{github.workspace}}/build + run: | + ..\jom.exe -j${{steps.cpu-cores.outputs.count}} + + - name: Execute Unit Tests + working-directory: ${{github.workspace}}/build + shell: cmd + run: | + call ..\OpenCASCADE-${{matrix.occ_version}}-vc14-64\opencascade-${{matrix.occ_version}}\env.bat + release\mayo.exe --runtests -o utests-output.txt + more utests-output.txt diff --git a/README.md b/README.md index b6fbf09d..7af3cf0c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@
+[![Windows CI](https://github.com/fougue/mayo/actions/workflows/ci_windows.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_windows.yml) [![Linux CI](https://github.com/fougue/mayo/actions/workflows/ci_linux.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_linux.yml) [![macOS CI](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml) -[![Windows CI](https://ci.appveyor.com/api/projects/status/6d1w0d6gw28npxpf/branch/develop?svg=true)](https://ci.appveyor.com/project/HuguesDelorme/mayo) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/d51f8ca6fea34886b8308ff0246172ce)](https://www.codacy.com/gh/fougue/mayo/dashboard?utm_source=github.com&utm_medium=referral&utm_content=fougue/mayo&utm_campaign=Badge_Grade) [![Downloads](https://img.shields.io/github/downloads/fougue/mayo/total.svg)](https://github.com/fougue/mayo/releases) [![License](https://img.shields.io/badge/license-BSD%202--clause-blue.svg)](https://github.com/fougue/mayo/blob/develop/LICENSE.txt) diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 4f7157bf..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,63 +0,0 @@ -version: 0.7_build{build} - -image: Visual Studio 2017 -platform: x64 -configuration: Release - -clone_folder: c:\projects\mayo - -#branches: -# only: -# - develop -# - master - -matrix: - fast_finish: true - -environment: - matrix: - - APPVEYOR_OCC_VERSION: 7.3.0 - - APPVEYOR_OCC_VERSION: 7.4.0 - - APPVEYOR_OCC_VERSION: 7.5.0 - - APPVEYOR_OCC_VERSION: 7.6.0 - - APPVEYOR_OCC_VERSION: 7.7.0 - -cache: - - OpenCASCADE-7.3.0-vc14-64.rar - - OpenCASCADE-7.4.0-vc14-64.rar - - OpenCASCADE-7.5.0-vc14-64.rar - - OpenCASCADE-7.6.0-vc14-64.rar - - OpenCASCADE-7.7.0-vc14-64.rar - -install: - - if not exist OpenCASCADE-%APPVEYOR_OCC_VERSION%-vc14-64.rar - appveyor DownloadFile http://www.fougue.pro/share/bin/OpenCASCADE-%APPVEYOR_OCC_VERSION%-vc14-64.rar -FileName OpenCASCADE-%APPVEYOR_OCC_VERSION%-vc14-64.rar - - 7z x OpenCASCADE-%APPVEYOR_OCC_VERSION%-vc14-64.rar - -before_build: - - echo JOB_NAME=%APPVEYOR_JOB_NAME% - - call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvars64.bat" - - call "OpenCASCADE-%APPVEYOR_OCC_VERSION%-vc14-64\opencascade-%APPVEYOR_OCC_VERSION%\env.bat" - - set PATH=C:\Qt\5.13\msvc2017_64\bin;%PATH% - - set PATH=C:\Qt\Tools\QtCreator\bin;%PATH% - - qmake --version - - echo NUMBER_OF_PROCESSORS=%NUMBER_OF_PROCESSORS% - -build_script: - - mkdir build-%APPVEYOR_OCC_VERSION% - - cd build-%APPVEYOR_OCC_VERSION% - - qmake ..\mayo.pro CONFIG+=withtests - - jom -j%NUMBER_OF_PROCESSORS% - - cd .. - -test_script: - - cd build-%APPVEYOR_OCC_VERSION% - - release\mayo.exe --runtests - - cd .. - -on_success: - - ps: >- - if ($true) - { - Write-Host "Success" - } diff --git a/mayo.pro b/mayo.pro index 25a5bdb6..368c532d 100644 --- a/mayo.pro +++ b/mayo.pro @@ -110,8 +110,9 @@ RC_ICONS = images/appicon.ico OTHER_FILES += \ README.md \ - appveyor.yml \ - .github/workflows/ci.yml \ + .github/workflows/ci_linux.yml \ + .github/workflows/ci_macos.yml \ + .github/workflows/ci_windows.yml \ images/credits.txt \ scripts/bump-version.rb \ diff --git a/scripts/bump-version.rb b/scripts/bump-version.rb index 13a54c90..dadfb5e5 100644 --- a/scripts/bump-version.rb +++ b/scripts/bump-version.rb @@ -33,10 +33,3 @@ version_pri.sub!(/(MAYO_VERSION_PAT\s*=\s*)\d+/, "\\1#{patch}") File.open(path_version_pri, "w").write(version_pri) puts "Bumped #{path_version_pri}" - -# ../appveyor.yml -path_appveyor_yml = "#{script_dir_name}/../appveyor.yml" -appveyor_yml = File.open(path_appveyor_yml, "r").read -appveyor_yml.sub!(/(version\s*:\s*)\d+\.\d+/, "\\1#{major}.#{minor}") -File.open(path_appveyor_yml, "w").write(appveyor_yml) -puts "Bumped #{path_appveyor_yml}" diff --git a/tests/runtests.cpp b/tests/runtests.cpp index c315fe41..78739dd3 100644 --- a/tests/runtests.cpp +++ b/tests/runtests.cpp @@ -8,28 +8,112 @@ #include "test_measure.h" #include "test_app.h" +#include + #include #include #include namespace Mayo { +namespace { + +// Helper function to return the path of some temporary file +// The file path should be unique just after function call +QString getTemporaryFilePath() +{ + QTemporaryFile file; + if (file.open()) + return file.fileName(); + + return {}; +} + +// Helper function to check equality between two C strings +bool cstringEqual(const char* lhs, const char* rhs) +{ + return std::strcmp(lhs, rhs) == 0; +} + +// Helper struct to hold the output filepath and format specified in command line +struct OutputFile { + QString path; + QString format; +}; + +// Retrieve the filename and format from string 'optionCmdLine' +// The 'optionCmdLine' argument should be the option specified in command line just after '-o' +// For example: +// $> mayo --runtests -o filename,format +// $> mayo --runtests -o filename +OutputFile parseOutputFile(const QString& optionCmdLine) +{ + OutputFile result; + const int posComma = optionCmdLine.lastIndexOf(','); + if (posComma != -1) { + result.path = optionCmdLine.left(posComma); + result.format = optionCmdLine.right(optionCmdLine.size() - posComma); + } + else { + result.path = optionCmdLine; + } + + return result; +} + +} // namespace + int runTests(int argc, char* argv[]) { + // Preprocess command-line arguments QStringList args; + QString* ptrArgOutputFileName = nullptr; for (int i = 0; i < argc; ++i) { - if (std::strcmp(argv[i], "--runtests") != 0) + // Don't keep "--runtests" argument because QText::qExec() will reject it + if (!cstringEqual(argv[i], "--runtests")) args.push_back(QString::fromUtf8(argv[i])); + + // Keep track of the output filename argument(specified after "-o" option) + if (i > 0 && cstringEqual(argv[i-1], "-o") && !args.empty() && !args.back().startsWith('-')) + ptrArgOutputFileName = &args.back(); } - int retcode = 0; + // Retrieve the output filename and format(separated by comma, eg "filename,format") + const QString argOutputFileName = ptrArgOutputFileName ? *ptrArgOutputFileName : QString{}; + const OutputFile argOutputFile = parseOutputFile(argOutputFileName); + + // Declare unit tests to be checked std::vector> vecTest; vecTest.emplace_back(new Mayo::TestBase); vecTest.emplace_back(new Mayo::TestMeasure); vecTest.emplace_back(new Mayo::TestApp); - for (const std::unique_ptr& test : vecTest) + + // Execute unit tests + // As QText::qExec() is called for each test object, it would overwrite any output file + // specified with "-o filename,format" + // This is solved by substituing output file argument with a temporary file whose contents + // is appended to the target output file + int retcode = 0; + for (const std::unique_ptr& test : vecTest) { + // Replace the output file argument with a temporary file path + const QString outputTestFileName = ptrArgOutputFileName ? getTemporaryFilePath() : QString{}; + if (ptrArgOutputFileName) + *ptrArgOutputFileName = outputTestFileName + argOutputFile.format; + + // Execute test retcode += QTest::qExec(test.get(), args); + // Append the temporary file to the target output file + if (ptrArgOutputFileName) { + const bool isFirstTest = &test == &vecTest.front(); + QFile outputTestFile(outputTestFileName); + QFile outputFile(argOutputFile.path); + outputTestFile.open(QIODevice::ReadOnly); + outputFile.open(QIODevice::WriteOnly | (isFirstTest ? QIODevice::NotOpen : QIODevice::Append)); + outputFile.write(outputTestFile.readAll()); + } + } + return retcode; } From 8ec448c59b335a819d3ce3fcc1d03bf469b067fa Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 16 May 2023 17:15:50 +0200 Subject: [PATCH 19/92] README: remove license badge[skip ci] --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 7af3cf0c..c1ce7572 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,6 @@ [![macOS CI](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/d51f8ca6fea34886b8308ff0246172ce)](https://www.codacy.com/gh/fougue/mayo/dashboard?utm_source=github.com&utm_medium=referral&utm_content=fougue/mayo&utm_campaign=Badge_Grade) [![Downloads](https://img.shields.io/github/downloads/fougue/mayo/total.svg)](https://github.com/fougue/mayo/releases) -[![License](https://img.shields.io/badge/license-BSD%202--clause-blue.svg)](https://github.com/fougue/mayo/blob/develop/LICENSE.txt) [![Version](https://img.shields.io/badge/version-v0.7.0-blue.svg?style=flat)](https://github.com/fougue/mayo/releases)
From 71be8b12c2702828b6ece26b829818cc7d627555 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 17 May 2023 11:00:23 +0200 Subject: [PATCH 20/92] Base: make TaskManager objects non-copyable Fix issue reported by codacy --- src/base/task_manager.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/base/task_manager.h b/src/base/task_manager.h index f5e17f7e..9509794e 100644 --- a/src/base/task_manager.h +++ b/src/base/task_manager.h @@ -25,6 +25,10 @@ class TaskManager { TaskManager(); ~TaskManager(); + // Not copyable + TaskManager(const TaskManager&) = delete; + TaskManager& operator=(const TaskManager&) = delete; + // Allocates a new task entity in manager // Returns the task identifier(unique in the scope of the owning TaskManager) TaskId newTask(TaskJob fn); From ccef1f5ac3de2770c7185c7191b3a4cfe1c9f89b Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 17 May 2023 18:36:28 +0200 Subject: [PATCH 21/92] App: add action to switch Home/Documents page Relates to GitHub #192 --- src/app/app_context.cpp | 21 ++++++++++-- src/app/app_context.h | 7 ++-- src/app/commands_api.h | 7 ++-- src/app/commands_file.cpp | 2 +- src/app/commands_window.cpp | 65 +++++++++++++++++++++++++++++++++++-- src/app/commands_window.h | 12 +++++++ src/app/mainwindow.cpp | 2 ++ 7 files changed, 107 insertions(+), 9 deletions(-) diff --git a/src/app/app_context.cpp b/src/app/app_context.cpp index a4778116..e44ab90f 100644 --- a/src/app/app_context.cpp +++ b/src/app/app_context.cpp @@ -31,14 +31,24 @@ TaskManager* AppContext::taskMgr() const return &m_wnd->m_taskMgr; } +QWidget* AppContext::widgetLeftSidebar() const +{ + return m_wnd->m_ui->widget_Left; +} + QWidget* AppContext::widgetMain() const { return m_wnd; } -QWidget* AppContext::widgetLeftSidebar() const +QWidget* AppContext::widgetMainByMode(ModeWidgetMain mode) const { - return m_wnd->m_ui->widget_Left; + if (mode == ModeWidgetMain::Home) + return m_wnd->m_ui->page_MainHome; + else if (mode == ModeWidgetMain::Documents) + return m_wnd->m_ui->page_MainControl; + else + return nullptr; } IAppContext::ModeWidgetMain AppContext::modeWidgetMain() const @@ -52,6 +62,13 @@ IAppContext::ModeWidgetMain AppContext::modeWidgetMain() const return ModeWidgetMain::Unknown; } +void AppContext::setModeWidgetMain(ModeWidgetMain mode) +{ + QWidget* widgetPage = this->widgetMainByMode(mode); + if (widgetPage) + m_wnd->m_ui->stack_Main->setCurrentWidget(widgetPage); +} + V3dViewController* AppContext::v3dViewController(const GuiDocument* guiDoc) const { auto widgetDoc = this->findWidgetGuiDocument([=](WidgetGuiDocument* candidate) { diff --git a/src/app/app_context.h b/src/app/app_context.h index 583ef5e4..0e12229b 100644 --- a/src/app/app_context.h +++ b/src/app/app_context.h @@ -20,11 +20,14 @@ class AppContext : public IAppContext { GuiApplication* guiApp() const override; TaskManager* taskMgr() const override; - QWidget* widgetMain() const override; QWidget* widgetLeftSidebar() const override; - ModeWidgetMain modeWidgetMain() const override; V3dViewController* v3dViewController(const GuiDocument* guiDoc) const override; + QWidget* widgetMain() const override; + QWidget* widgetMainByMode(ModeWidgetMain mode) const override; + ModeWidgetMain modeWidgetMain() const override; + void setModeWidgetMain(ModeWidgetMain mode) override; + int findDocumentIndex(Document::Identifier docId) const override; Document::Identifier findDocumentFromIndex(int index) const override; diff --git a/src/app/commands_api.h b/src/app/commands_api.h index 755ce7e1..3ee0c6df 100644 --- a/src/app/commands_api.h +++ b/src/app/commands_api.h @@ -32,11 +32,14 @@ class IAppContext : public QObject { virtual GuiApplication* guiApp() const = 0; virtual TaskManager* taskMgr() const = 0; - virtual QWidget* widgetMain() const = 0; virtual QWidget* widgetLeftSidebar() const = 0; - virtual ModeWidgetMain modeWidgetMain() const = 0; virtual V3dViewController* v3dViewController(const GuiDocument* guiDoc) const = 0; + virtual QWidget* widgetMain() const = 0; + virtual QWidget* widgetMainByMode(ModeWidgetMain mode) const = 0; + virtual ModeWidgetMain modeWidgetMain() const = 0; + virtual void setModeWidgetMain(ModeWidgetMain mode) = 0; + virtual Document::Identifier currentDocument() const = 0; virtual void setCurrentDocument(Document::Identifier docId) = 0; diff --git a/src/app/commands_file.cpp b/src/app/commands_file.cpp index 133d4d82..4be5fdf9 100644 --- a/src/app/commands_file.cpp +++ b/src/app/commands_file.cpp @@ -312,7 +312,7 @@ void CommandRecentFiles::recreateEntries() menu->clear(); int idFile = 0; auto appModule = AppModule::get(); - const RecentFiles& recentFiles = appModule->properties()->recentFiles.value(); + const RecentFiles& recentFiles = appModule->properties()->recentFiles; for (const RecentFile& recentFile : recentFiles) { const QString strFilePath = filepathTo(recentFile.filepath); const QString strEntryRecentFile = Command::tr("%1 | %2").arg(++idFile).arg(strFilePath); diff --git a/src/app/commands_window.cpp b/src/app/commands_window.cpp index 971497d2..cc87c298 100644 --- a/src/app/commands_window.cpp +++ b/src/app/commands_window.cpp @@ -56,8 +56,8 @@ CommandLeftSidebarWidgetToggle::CommandLeftSidebarWidgetToggle(IAppContext* cont void CommandLeftSidebarWidgetToggle::execute() { - const bool isVisible = this->context()->widgetLeftSidebar()->isVisible(); - this->context()->widgetLeftSidebar()->setVisible(!isVisible); + QWidget* widget = this->context()->widgetLeftSidebar(); + widget->setVisible(!widget->isVisible()); } bool CommandLeftSidebarWidgetToggle::getEnabledStatus() const @@ -94,6 +94,67 @@ void CommandLeftSidebarWidgetToggle::updateAction() this->action()->setToolTip(this->action()->text()); } +CommandSwitchMainWidgetMode::CommandSwitchMainWidgetMode(IAppContext* context) + : Command(context) +{ + auto action = new QAction(this); + action->setToolTip(Command::tr("Go To Home Page")); + action->setShortcut(Qt::CTRL + Qt::Key_0); + this->setAction(action); + this->updateAction(); + context->widgetMainByMode(IAppContext::ModeWidgetMain::Home)->installEventFilter(this); + context->widgetMainByMode(IAppContext::ModeWidgetMain::Documents)->installEventFilter(this); +} + +void CommandSwitchMainWidgetMode::execute() +{ + auto newMode = IAppContext::ModeWidgetMain::Unknown; + switch (this->context()->modeWidgetMain()) { + case IAppContext::ModeWidgetMain::Home: + newMode = IAppContext::ModeWidgetMain::Documents; + break; + case IAppContext::ModeWidgetMain::Documents: + newMode = IAppContext::ModeWidgetMain::Home; + break; + } + + this->context()->setModeWidgetMain(newMode); +} + +bool CommandSwitchMainWidgetMode::getEnabledStatus() const +{ + return this->app()->documentCount() != 0; +} + +bool CommandSwitchMainWidgetMode::eventFilter(QObject* watched, QEvent* event) +{ + if (watched == this->context()->widgetMainByMode(IAppContext::ModeWidgetMain::Home) + || watched == this->context()->widgetMainByMode(IAppContext::ModeWidgetMain::Documents)) + { + if (event->type() == QEvent::Show) { + this->updateAction(); + return true; + } + else { + return false; + } + } + + return Command::eventFilter(watched, event); +} + +void CommandSwitchMainWidgetMode::updateAction() +{ + switch (this->context()->modeWidgetMain()) { + case IAppContext::ModeWidgetMain::Home: + this->action()->setText(Command::tr("Go To Documents")); + break; + case IAppContext::ModeWidgetMain::Documents: + this->action()->setText(Command::tr("Go To Home Page")); + break; + } +} + CommandPreviousDocument::CommandPreviousDocument(IAppContext* context) : Command(context) { diff --git a/src/app/commands_window.h b/src/app/commands_window.h index 008ffbc8..de343edd 100644 --- a/src/app/commands_window.h +++ b/src/app/commands_window.h @@ -31,6 +31,18 @@ class CommandLeftSidebarWidgetToggle : public Command { void updateAction(); }; +class CommandSwitchMainWidgetMode : public Command { +public: + CommandSwitchMainWidgetMode(IAppContext* context); + void execute() override; + bool getEnabledStatus() const override; + + bool eventFilter(QObject* watched, QEvent* event) override; + +private: + void updateAction(); +}; + class CommandPreviousDocument : public Command { public: CommandPreviousDocument(IAppContext* context); diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index ce0c4531..ad4925a4 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -238,6 +238,7 @@ void MainWindow::createCommands() // "Window" commands this->addCommand("toggle-left-sidebar"); this->addCommand("toggle-fullscreen"); + this->addCommand("switch-main-widget-mode"); this->addCommand("previous-doc"); this->addCommand("next-doc"); @@ -295,6 +296,7 @@ void MainWindow::createMenus() menu->addAction(fnGetAction("toggle-left-sidebar")); menu->addAction(fnGetAction("toggle-fullscreen")); menu->addSeparator(); + menu->addAction(fnGetAction("switch-main-widget-mode")); menu->addAction(fnGetAction("previous-doc")); menu->addAction(fnGetAction("next-doc")); } From 7b8188dbe798a008cbd65d27375c0656cd26d975 Mon Sep 17 00:00:00 2001 From: Youen Date: Mon, 8 May 2023 23:49:12 +0200 Subject: [PATCH 22/92] Added measure tool "center-to-center distance" Same as "Min distance", but measures between centers of each selected shape --- i18n/mayo_fr.qm | Bin 55849 -> 55974 bytes i18n/mayo_fr.ts | 5 ++ src/app/widget_measure.cpp | 7 +-- src/app/widget_measure.ui | 5 ++ src/measure/measure_display.cpp | 28 +++++++++-- src/measure/measure_display.h | 6 +-- src/measure/measure_tool.cpp | 2 + src/measure/measure_tool.h | 23 ++++++--- src/measure/measure_tool_brep.cpp | 77 ++++++++++++++++++++++++++++-- src/measure/measure_tool_brep.h | 6 ++- src/measure/measure_type.h | 2 +- 11 files changed, 136 insertions(+), 25 deletions(-) diff --git a/i18n/mayo_fr.qm b/i18n/mayo_fr.qm index d0002376728bb4a106dfb7c15130a14a434e5b6d..8a08dc31a8ff06c663110997218025786a4c0931 100644 GIT binary patch delta 496 zcmXAlUr3W-6vm(T-M8=i_HO&ej2aEviqQsz6Uq2)0;NBUU{sK>h)T#7g`l7->B4nU zA=o10l+uOmqR50`7u)D&Ii1d_m0>}Dpt`Axqyi0efx&vo1Lyo6&bfFV&REX!IByyB zvE@7dHBk{zhMoY^_sGwJb>jwhB7oKF2L!yb{z&(ytW#mRvH5cz~t z*Yd#3ERFKZeD+Y*Z;3JXkb0FQFS@C!w6VVwv-UIB_J((Dh!T-1TL@;E<08M}{Hj?rs-SQMj<56Yx`)F#p#YrJ%v zY7US4hjI3s4`@Aa-2L-grua@FXV^O#H7a|vKq_i1w%C9RCyd49VW3o?E@zlewNcs` z+mdlDe@p`2J+2k+8)>)wq6~C1>o9f}EKN8_9iDAe+pLG$5l1Hy=$7o!Axo9L^+3Ec W5$~=~bk(>2SCoDg$cE?FUH<^2O{*pV delta 443 zcmXAhOK1~e6ot?KXOc<&Br_P$V8D!0Ohq9t;qcjLw5z&As zRE{+iwA~qtpo=uRNfVnkv8KML;3&QjTvSm|p^sf1=;nUkIhT9yRRUwBbJX`f)7m+iHD5>3n2M|#n$s(G>Z+9c2zp&47;I{C%ewz&pmb{V@9-+=BRMin Distance Distance min + + + Center-to-center Distance + Distance entre les centres + Length diff --git a/src/app/widget_measure.cpp b/src/app/widget_measure.cpp index def467db..45fc7b43 100644 --- a/src/app/widget_measure.cpp +++ b/src/app/widget_measure.cpp @@ -133,9 +133,10 @@ MeasureType WidgetMeasure::toMeasureType(int comboBoxId) case 1: return MeasureType::CircleCenter; case 2: return MeasureType::CircleDiameter; case 3: return MeasureType::MinDistance; - case 4: return MeasureType::Angle; - case 5: return MeasureType::Length; - case 6: return MeasureType::Area; + case 4: return MeasureType::CenterDistance; + case 5: return MeasureType::Angle; + case 6: return MeasureType::Length; + case 7: return MeasureType::Area; } return MeasureType::None; } diff --git a/src/app/widget_measure.ui b/src/app/widget_measure.ui index 8c06c05f..d5b2559f 100644 --- a/src/app/widget_measure.ui +++ b/src/app/widget_measure.ui @@ -124,6 +124,11 @@ Min Distance + + + Center-to-center Distance + + Angle diff --git a/src/measure/measure_display.cpp b/src/measure/measure_display.cpp index ade95d89..2d4935d9 100644 --- a/src/measure/measure_display.cpp +++ b/src/measure/measure_display.cpp @@ -36,7 +36,8 @@ std::unique_ptr BaseMeasureDisplay::createFrom(MeasureType type case MeasureType::CircleDiameter: return std::make_unique(std::get(value)); case MeasureType::MinDistance: - return std::make_unique(std::get(value)); + case MeasureType::CenterDistance: + return std::make_unique(std::get(value)); case MeasureType::Length: return std::make_unique(std::get(value)); case MeasureType::Angle: @@ -264,7 +265,7 @@ gp_Pnt MeasureDisplayCircleDiameter::diameterOpposedPnt(const gp_Pnt& pntOnCircl // -- MinDistance // -- -MeasureDisplayMinDistance::MeasureDisplayMinDistance(const MeasureMinDistance& dist) +MeasureDisplayDistance::MeasureDisplayDistance(const MeasureDistance& dist) : m_dist(dist), m_gfxLength(new AIS_Line(new Geom_CartesianPoint(dist.pnt1), new Geom_CartesianPoint(dist.pnt2))), m_gfxDistText(new AIS_TextLabel), @@ -277,12 +278,29 @@ MeasureDisplayMinDistance::MeasureDisplayMinDistance(const MeasureMinDistance& d BaseMeasureDisplay::applyGraphicsDefaults(this); } -void MeasureDisplayMinDistance::update(const MeasureDisplayConfig& config) +void MeasureDisplayDistance::update(const MeasureDisplayConfig& config) { const auto trLength = UnitSystem::translateLength(m_dist.value, config.lengthUnit); const auto strLength = BaseMeasureDisplay::text(trLength, config); + + std::string distStr; + switch(m_dist.type) + { + case DistanceType::MinDistance: + distStr = "Min Distance"; + break; + case DistanceType::CenterDistance: + distStr = "Distance"; + break; + default: + distStr = "Distance"; + break; + } + + distStr += ": {0}{1}
Point1: {2}
Point2: {3}"; + this->setText(fmt::format( - MeasureDisplayI18N::textIdTr("Min Distance: {0}{1}
Point1: {2}
Point2: {3}"), + MeasureDisplayI18N::textIdTr(distStr.c_str()), strLength, trLength.strUnit, BaseMeasureDisplay::text(m_dist.pnt1, config), @@ -292,7 +310,7 @@ void MeasureDisplayMinDistance::update(const MeasureDisplayConfig& config) BaseMeasureDisplay::adaptScale(m_gfxDistText, config); } -GraphicsObjectPtr MeasureDisplayMinDistance::graphicsObjectAt(int i) const +GraphicsObjectPtr MeasureDisplayDistance::graphicsObjectAt(int i) const { switch (i) { case 0: return m_gfxLength; diff --git a/src/measure/measure_display.h b/src/measure/measure_display.h index b5573c5c..85665e38 100644 --- a/src/measure/measure_display.h +++ b/src/measure/measure_display.h @@ -155,15 +155,15 @@ class MeasureDisplayCircleDiameter : public BaseMeasureDisplay { // -- MinDistance // -- -class MeasureDisplayMinDistance : public BaseMeasureDisplay { +class MeasureDisplayDistance : public BaseMeasureDisplay { public: - MeasureDisplayMinDistance(const MeasureMinDistance& dist); + MeasureDisplayDistance(const MeasureDistance& dist); void update(const MeasureDisplayConfig& config) override; int graphicsObjectsCount() const override { return 4; } GraphicsObjectPtr graphicsObjectAt(int i) const override; private: - MeasureMinDistance m_dist; + MeasureDistance m_dist; Handle_AIS_Line m_gfxLength; Handle_AIS_TextLabel m_gfxDistText; Handle_AIS_Point m_gfxPnt1; diff --git a/src/measure/measure_tool.cpp b/src/measure/measure_tool.cpp index 79d56c5e..2c688a72 100644 --- a/src/measure/measure_tool.cpp +++ b/src/measure/measure_tool.cpp @@ -37,6 +37,8 @@ MeasureValue IMeasureTool_computeValue( switch (type) { case MeasureType::MinDistance: return tool.minDistance(owner1, owner2); + case MeasureType::CenterDistance: + return tool.centerDistance(owner1, owner2); case MeasureType::Angle: return tool.angle(owner1, owner2); default: diff --git a/src/measure/measure_tool.h b/src/measure/measure_tool.h index 428d8e38..cc44512e 100644 --- a/src/measure/measure_tool.h +++ b/src/measure/measure_tool.h @@ -21,17 +21,25 @@ namespace Mayo { +enum class DistanceType { + None, + MinDistance, + CenterDistance +}; + // Void measure value struct MeasureNone {}; -// Measure of minimum distance between two entities -struct MeasureMinDistance { - // Point on 1st entity where minimum distance is located +// Measure of a distance between two entities +struct MeasureDistance { + // Point on 1st entity from which the distance is measured gp_Pnt pnt1; - // Point on 2nd entity where minimum distance is located + // Point on 2nd entity from which the distance is measured gp_Pnt pnt2; - // Length of the minimum distance + // Length of the distance QuantityLength value; + // Distance type + DistanceType type = DistanceType::None; }; // Measure of a circle entity @@ -68,7 +76,8 @@ class IMeasureTool { virtual gp_Pnt vertexPosition(const GraphicsOwnerPtr& owner) const = 0; virtual MeasureCircle circle(const GraphicsOwnerPtr& owner) const = 0; - virtual MeasureMinDistance minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const = 0; + virtual MeasureDistance minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const = 0; + virtual MeasureDistance centerDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const = 0; virtual MeasureAngle angle(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const = 0; virtual QuantityLength length(const GraphicsOwnerPtr& owner) const = 0; virtual QuantityArea area(const GraphicsOwnerPtr& owner) const = 0; @@ -85,7 +94,7 @@ using MeasureValue = std::variant< MeasureNone, // WARNING: ensure this is the first value type in the variant gp_Pnt, MeasureCircle, - MeasureMinDistance, + MeasureDistance, MeasureAngle, QuantityLength, QuantityArea diff --git a/src/measure/measure_tool_brep.cpp b/src/measure/measure_tool_brep.cpp index 608649f1..29bce8f3 100644 --- a/src/measure/measure_tool_brep.cpp +++ b/src/measure/measure_tool_brep.cpp @@ -49,6 +49,7 @@ enum class ErrorCode { NotBRepShape, NotGeometricOrPolygonEdge, MinDistanceFailure, + CenterFailure, NotAllEdges, NotLinearEdge, NotAllFaces, @@ -72,6 +73,8 @@ class BRepMeasureError : public IMeasureError { return textIdTr("Entity must be a geometric or polygon edge"); case ErrorCode::MinDistanceFailure: return textIdTr("Computation of minimum distance failed"); + case ErrorCode::CenterFailure: + return textIdTr("Unable to find center of the shape"); case ErrorCode::NotAllEdges: return textIdTr("All entities must be edges"); case ErrorCode::NotLinearEdge: @@ -115,7 +118,8 @@ Span MeasureToolBRep::selectionModes(MeasureT static const GraphicsObjectSelectionMode modes[] = { AIS_Shape::SelectionMode(TopAbs_EDGE) }; return modes; } - case MeasureType::MinDistance: { + case MeasureType::MinDistance: + case MeasureType::CenterDistance: { static const GraphicsObjectSelectionMode modes[] = { AIS_Shape::SelectionMode(TopAbs_VERTEX), AIS_Shape::SelectionMode(TopAbs_EDGE), @@ -154,11 +158,16 @@ MeasureCircle MeasureToolBRep::circle(const GraphicsOwnerPtr& owner) const return brepCircle(getShape(owner)); } -MeasureMinDistance MeasureToolBRep::minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const +MeasureDistance MeasureToolBRep::minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const { return brepMinDistance(getShape(owner1), getShape(owner2)); } +MeasureDistance MeasureToolBRep::centerDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const +{ + return brepCenterDistance(getShape(owner1), getShape(owner2)); +} + MeasureAngle MeasureToolBRep::angle(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const { return brepAngle(getShape(owner1), getShape(owner2)); @@ -271,7 +280,7 @@ MeasureCircle MeasureToolBRep::brepCircle(const TopoDS_Shape& shape) return MeasureToolBRep::brepCircleFromPolygonEdge(edge); } -MeasureMinDistance MeasureToolBRep::brepMinDistance( +MeasureDistance MeasureToolBRep::brepMinDistance( const TopoDS_Shape& shape1, const TopoDS_Shape& shape2) { throwErrorIf(shape1.IsNull()); @@ -280,10 +289,70 @@ MeasureMinDistance MeasureToolBRep::brepMinDistance( const BRepExtrema_DistShapeShape dist(shape1, shape2); throwErrorIf(!dist.IsDone()); - MeasureMinDistance distResult; + MeasureDistance distResult; distResult.pnt1 = dist.PointOnShape1(1); distResult.pnt2 = dist.PointOnShape2(1); distResult.value = dist.Value() * Quantity_Millimeter; + distResult.type = DistanceType::MinDistance; + return distResult; +} + +MeasureDistance MeasureToolBRep::brepCenterDistance( + const TopoDS_Shape& shape1, const TopoDS_Shape& shape2) +{ + throwErrorIf(shape1.IsNull()); + throwErrorIf(shape2.IsNull()); + + struct Local + { + static gp_Pnt computeShapeCenter(const TopoDS_Shape& shape) + { + GProp_GProps shellProps; + + if(shape.ShapeType() == TopAbs_VERTEX) + { + return BRep_Tool::Pnt(TopoDS::Vertex(shape)); + } + else + { + switch(shape.ShapeType()) + { + case TopAbs_FACE: + BRepGProp::SurfaceProperties(shape, shellProps); + break; + case TopAbs_WIRE: + BRepGProp::LinearProperties(shape, shellProps); + break; + case TopAbs_EDGE: { + try + { + MeasureCircle circle = brepCircle(shape); + return circle.value.Location(); + } + catch(const BRepMeasureError& e) + { + BRepGProp::LinearProperties(shape, shellProps); + } + break; + } + default: + throwErrorIf(true); + } + + throwErrorIf(shellProps.Mass() < Precision::Confusion()); + return shellProps.CentreOfMass(); + } + } + }; + + const gp_Pnt centerOfMass1 = Local::computeShapeCenter(shape1); + const gp_Pnt centerOfMass2 = Local::computeShapeCenter(shape2); + + MeasureDistance distResult; + distResult.pnt1 = centerOfMass1; + distResult.pnt2 = centerOfMass2; + distResult.value = centerOfMass1.Distance(centerOfMass2) * Quantity_Millimeter; + distResult.type = DistanceType::CenterDistance; return distResult; } diff --git a/src/measure/measure_tool_brep.h b/src/measure/measure_tool_brep.h index dec02fdd..1e72b3c2 100644 --- a/src/measure/measure_tool_brep.h +++ b/src/measure/measure_tool_brep.h @@ -22,14 +22,16 @@ class MeasureToolBRep : public IMeasureTool { gp_Pnt vertexPosition(const GraphicsOwnerPtr& owner) const override; MeasureCircle circle(const GraphicsOwnerPtr& owner) const override; - MeasureMinDistance minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const override; + MeasureDistance minDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const override; + MeasureDistance centerDistance(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const override; MeasureAngle angle(const GraphicsOwnerPtr& owner1, const GraphicsOwnerPtr& owner2) const override; QuantityLength length(const GraphicsOwnerPtr& owner) const override; QuantityArea area(const GraphicsOwnerPtr& owner) const override; static gp_Pnt brepVertexPosition(const TopoDS_Shape& shape); static MeasureCircle brepCircle(const TopoDS_Shape& shape); - static MeasureMinDistance brepMinDistance(const TopoDS_Shape& shape1, const TopoDS_Shape& shape2); + static MeasureDistance brepMinDistance(const TopoDS_Shape& shape1, const TopoDS_Shape& shape2); + static MeasureDistance brepCenterDistance(const TopoDS_Shape& shape1, const TopoDS_Shape& shape2); static MeasureAngle brepAngle(const TopoDS_Shape& shape1, const TopoDS_Shape& shape2); static QuantityLength brepLength(const TopoDS_Shape& shape); diff --git a/src/measure/measure_type.h b/src/measure/measure_type.h index 0684cfc9..b1bb640d 100644 --- a/src/measure/measure_type.h +++ b/src/measure/measure_type.h @@ -9,7 +9,7 @@ namespace Mayo { enum class MeasureType { - None, VertexPosition, CircleCenter, CircleDiameter, MinDistance, Angle, Length, Area + None, VertexPosition, CircleCenter, CircleDiameter, MinDistance, CenterDistance, Angle, Length, Area }; } // namespace Mayo From 718b9e9b03cf7e383b414ab52bef7450ab18a2c9 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 22 May 2023 00:06:06 +0200 Subject: [PATCH 23/92] Tests: fix compilation errors --- tests/test_measure.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_measure.cpp b/tests/test_measure.cpp index 68f02f07..5c2a6606 100644 --- a/tests/test_measure.cpp +++ b/tests/test_measure.cpp @@ -126,7 +126,7 @@ void TestMeasure::BRepMinDistance_TwoPoints_test() const gp_Pnt pnt2{ -57.4, 4487.56, 1.8 }; const TopoDS_Shape shape1 = BRepBuilderAPI_MakeVertex(pnt1); const TopoDS_Shape shape2 = BRepBuilderAPI_MakeVertex(pnt2); - const MeasureMinDistance minDist = MeasureToolBRep::brepMinDistance(shape1, shape2); + const MeasureDistance minDist = MeasureToolBRep::brepMinDistance(shape1, shape2); QVERIFY(minDist.pnt1.IsEqual(pnt1, Precision::Confusion())); QVERIFY(minDist.pnt2.IsEqual(pnt2, Precision::Confusion())); QCOMPARE(UnitSystem::millimeters(minDist.value).value, pnt1.Distance(pnt2)); @@ -140,7 +140,7 @@ void TestMeasure::BRepMinDistance_TwoBoxes_test() const gp_Pnt box2_max{ 55, 7, 7 }; const TopoDS_Shape shape1 = BRepPrimAPI_MakeBox(box1_min, box1_max); const TopoDS_Shape shape2 = BRepPrimAPI_MakeBox(box2_min, box2_max); - const MeasureMinDistance minDist = MeasureToolBRep::brepMinDistance(shape1, shape2); + const MeasureDistance minDist = MeasureToolBRep::brepMinDistance(shape1, shape2); QCOMPARE(UnitSystem::millimeters(minDist.value).value, std::abs(box1_max.X() - box2_min.X())); QCOMPARE(UnitSystem::millimeters(minDist.value).value, minDist.pnt1.Distance(minDist.pnt2)); } From d8f275bf64a13bb1a08af76a0d67b4d68d551455 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 22 May 2023 10:03:17 +0200 Subject: [PATCH 24/92] Measure: minor refactoring of code introduced with PR #194 Relates to GitHub #195 --- src/measure/measure_display.cpp | 4 +- src/measure/measure_tool.h | 4 +- src/measure/measure_tool_brep.cpp | 81 +++++++++++++------------------ 3 files changed, 39 insertions(+), 50 deletions(-) diff --git a/src/measure/measure_display.cpp b/src/measure/measure_display.cpp index 1b169bf8..62f24d63 100644 --- a/src/measure/measure_display.cpp +++ b/src/measure/measure_display.cpp @@ -286,10 +286,10 @@ void MeasureDisplayDistance::update(const MeasureDisplayConfig& config) std::string distStr; switch(m_dist.type) { - case DistanceType::MinDistance: + case DistanceType::Mininmum: distStr = "Min Distance"; break; - case DistanceType::CenterDistance: + case DistanceType::CenterToCenter: distStr = "Distance"; break; default: diff --git a/src/measure/measure_tool.h b/src/measure/measure_tool.h index e6162979..2b56d6b5 100644 --- a/src/measure/measure_tool.h +++ b/src/measure/measure_tool.h @@ -23,8 +23,8 @@ namespace Mayo { enum class DistanceType { None, - MinDistance, - CenterDistance + Mininmum, + CenterToCenter }; // Void measure value diff --git a/src/measure/measure_tool_brep.cpp b/src/measure/measure_tool_brep.cpp index 529ea565..f4132fb7 100644 --- a/src/measure/measure_tool_brep.cpp +++ b/src/measure/measure_tool_brep.cpp @@ -121,6 +121,37 @@ const TopoDS_Shape getShape(const GraphicsOwnerPtr& owner) return brepOwner ? brepOwner->Shape().Moved(ownerLoc) : nullShape; } +gp_Pnt computeShapeCenter(const TopoDS_Shape& shape) +{ + const TopAbs_ShapeEnum shapeType = shape.ShapeType(); + + if (shapeType == TopAbs_VERTEX) + return BRep_Tool::Pnt(TopoDS::Vertex(shape)); + + GProp_GProps shapeProps; + if (shapeType == TopAbs_FACE) { + // TODO Consider case where the face is cylindrical + BRepGProp::SurfaceProperties(shape, shapeProps); + } + else if (shapeType == TopAbs_WIRE) { + BRepGProp::LinearProperties(shape, shapeProps); + } + else if (shapeType == TopAbs_EDGE) { + try { + const MeasureCircle circle = MeasureToolBRep::brepCircle(shape); + return circle.value.Location(); + } + catch (const BRepMeasureError&) { + BRepGProp::LinearProperties(shape, shapeProps); + } + } + else { + throw BRepMeasureError(); + } + + throwErrorIf(shapeProps.Mass() < Precision::Confusion()); + return shapeProps.CentreOfMass(); +} } // namespace Span MeasureToolBRep::selectionModes(MeasureType type) const @@ -307,7 +338,7 @@ MeasureDistance MeasureToolBRep::brepMinDistance( distResult.pnt1 = dist.PointOnShape1(1); distResult.pnt2 = dist.PointOnShape2(1); distResult.value = dist.Value() * Quantity_Millimeter; - distResult.type = DistanceType::MinDistance; + distResult.type = DistanceType::Mininmum; return distResult; } @@ -317,56 +348,14 @@ MeasureDistance MeasureToolBRep::brepCenterDistance( throwErrorIf(shape1.IsNull()); throwErrorIf(shape2.IsNull()); - struct Local - { - static gp_Pnt computeShapeCenter(const TopoDS_Shape& shape) - { - GProp_GProps shellProps; - - if(shape.ShapeType() == TopAbs_VERTEX) - { - return BRep_Tool::Pnt(TopoDS::Vertex(shape)); - } - else - { - switch(shape.ShapeType()) - { - case TopAbs_FACE: - BRepGProp::SurfaceProperties(shape, shellProps); - break; - case TopAbs_WIRE: - BRepGProp::LinearProperties(shape, shellProps); - break; - case TopAbs_EDGE: { - try - { - MeasureCircle circle = brepCircle(shape); - return circle.value.Location(); - } - catch(const BRepMeasureError& e) - { - BRepGProp::LinearProperties(shape, shellProps); - } - break; - } - default: - throwErrorIf(true); - } - - throwErrorIf(shellProps.Mass() < Precision::Confusion()); - return shellProps.CentreOfMass(); - } - } - }; - - const gp_Pnt centerOfMass1 = Local::computeShapeCenter(shape1); - const gp_Pnt centerOfMass2 = Local::computeShapeCenter(shape2); + const gp_Pnt centerOfMass1 = computeShapeCenter(shape1); + const gp_Pnt centerOfMass2 = computeShapeCenter(shape2); MeasureDistance distResult; distResult.pnt1 = centerOfMass1; distResult.pnt2 = centerOfMass2; distResult.value = centerOfMass1.Distance(centerOfMass2) * Quantity_Millimeter; - distResult.type = DistanceType::CenterDistance; + distResult.type = DistanceType::CenterToCenter; return distResult; } From 261bde36e20172414220a6dbd760b425be44f66f Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 9 Jun 2023 13:05:28 +0200 Subject: [PATCH 25/92] App: refactor MainWindow to be splitted into main pages Relates to GitHub #201 --- mayo.pro | 2 +- src/app/app_context.cpp | 74 +++-- src/app/app_context.h | 9 +- src/app/commands_api.cpp | 33 ++ src/app/commands_api.h | 79 ++++- src/app/commands_display.h | 18 ++ src/app/commands_file.cpp | 5 +- src/app/commands_file.h | 18 ++ src/app/commands_help.h | 4 + src/app/commands_tools.h | 6 + src/app/commands_window.cpp | 52 ++- src/app/commands_window.h | 12 + src/app/iwidget_main_page.h | 39 +++ src/app/mainwindow.cpp | 516 ++++++------------------------ src/app/mainwindow.h | 55 +--- src/app/mainwindow.ui | 543 +------------------------------- src/app/qtgui_utils.cpp | 3 +- src/app/widget_main_control.cpp | 419 ++++++++++++++++++++++++ src/app/widget_main_control.h | 76 +++++ src/app/widget_main_control.ui | 491 +++++++++++++++++++++++++++++ src/app/widget_main_home.cpp | 49 +++ src/app/widget_main_home.h | 28 ++ src/app/widget_main_home.ui | 93 ++++++ 23 files changed, 1553 insertions(+), 1071 deletions(-) create mode 100644 src/app/iwidget_main_page.h create mode 100644 src/app/widget_main_control.cpp create mode 100644 src/app/widget_main_control.h create mode 100644 src/app/widget_main_control.ui create mode 100644 src/app/widget_main_home.cpp create mode 100644 src/app/widget_main_home.h create mode 100644 src/app/widget_main_home.ui diff --git a/mayo.pro b/mayo.pro index 368c532d..a37f5e4f 100644 --- a/mayo.pro +++ b/mayo.pro @@ -33,7 +33,7 @@ DEFINES += \ QT_IMPLICIT_QFILEINFO_CONSTRUCTION \ release_with_debuginfo:msvc { - # https://docs.microsoft.com/en-us/cpp/build/reference/how-to-debug-a-release-build + # https://learn.microsoft.com/en-us/cpp/build/how-to-debug-a-release-build?view=msvc-170 QMAKE_CXXFLAGS_RELEASE += /Zi QMAKE_LFLAGS_RELEASE += /DEBUG /INCREMENTAL:NO /OPT:REF /OPT:ICF } diff --git a/src/app/app_context.cpp b/src/app/app_context.cpp index e44ab90f..36a60afa 100644 --- a/src/app/app_context.cpp +++ b/src/app/app_context.cpp @@ -9,14 +9,22 @@ #include "mainwindow.h" #include "ui_mainwindow.h" #include "widget_gui_document.h" +#include "widget_main_control.h" +#include "widget_main_home.h" + +#include namespace Mayo { AppContext::AppContext(MainWindow* wnd) - : m_wnd(wnd) + : IAppContext(wnd), + m_wnd(wnd) { + assert(m_wnd != nullptr); + assert(m_wnd->widgetPageDocuments() != nullptr); + QObject::connect( - m_wnd->m_ui->combo_GuiDocuments, qOverload(&QComboBox::currentIndexChanged), + m_wnd->widgetPageDocuments(), &WidgetMainControl::currentDocumentIndexChanged, this, &AppContext::onCurrentDocumentIndexChanged ); } @@ -31,9 +39,9 @@ TaskManager* AppContext::taskMgr() const return &m_wnd->m_taskMgr; } -QWidget* AppContext::widgetLeftSidebar() const +QWidget* AppContext::pageDocuments_widgetLeftSideBar() const { - return m_wnd->m_ui->widget_Left; + return m_wnd->widgetPageDocuments()->widgetLeftSideBar(); } QWidget* AppContext::widgetMain() const @@ -41,32 +49,32 @@ QWidget* AppContext::widgetMain() const return m_wnd; } -QWidget* AppContext::widgetMainByMode(ModeWidgetMain mode) const +QWidget* AppContext::widgetPage(Page page) const { - if (mode == ModeWidgetMain::Home) - return m_wnd->m_ui->page_MainHome; - else if (mode == ModeWidgetMain::Documents) - return m_wnd->m_ui->page_MainControl; + if (page == Page::Home) + return m_wnd->widgetPageHome(); + else if (page == Page::Documents) + return m_wnd->widgetPageDocuments(); else return nullptr; } -IAppContext::ModeWidgetMain AppContext::modeWidgetMain() const +IAppContext::Page AppContext::currentPage() const { auto widget = m_wnd->m_ui->stack_Main->currentWidget(); - if (widget == m_wnd->m_ui->page_MainHome) - return ModeWidgetMain::Home; - else if (widget == m_wnd->m_ui->page_MainControl) - return ModeWidgetMain::Documents; + if (widget == m_wnd->widgetPageHome()) + return Page::Home; + else if (widget == m_wnd->widgetPageDocuments()) + return Page::Documents; - return ModeWidgetMain::Unknown; + return Page::Unknown; } -void AppContext::setModeWidgetMain(ModeWidgetMain mode) +void AppContext::setCurrentPage(Page page) { - QWidget* widgetPage = this->widgetMainByMode(mode); - if (widgetPage) - m_wnd->m_ui->stack_Main->setCurrentWidget(widgetPage); + QWidget* widgetPage = this->widgetPage(page); + assert(widgetPage); + m_wnd->m_ui->stack_Main->setCurrentWidget(widgetPage); } V3dViewController* AppContext::v3dViewController(const GuiDocument* guiDoc) const @@ -89,14 +97,14 @@ int AppContext::findDocumentIndex(Document::Identifier docId) const Document::Identifier AppContext::findDocumentFromIndex(int index) const { - auto widgetDoc = m_wnd->widgetGuiDocument(index); + auto widgetDoc = this->widgetGuiDocument(index); return widgetDoc ? widgetDoc->documentIdentifier() : -1; } Document::Identifier AppContext::currentDocument() const { - const int index = m_wnd->m_ui->combo_GuiDocuments->currentIndex(); - auto widgetDoc = m_wnd->widgetGuiDocument(index); + const int index = m_wnd->widgetPageDocuments()->currentDocumentIndex(); + auto widgetDoc = this->widgetGuiDocument(index); return widgetDoc ? widgetDoc->documentIdentifier() : -1; } @@ -105,8 +113,8 @@ void AppContext::setCurrentDocument(Document::Identifier docId) auto widgetDoc = this->findWidgetGuiDocument([=](WidgetGuiDocument* widgetDoc) { return widgetDoc->documentIdentifier() == docId; }); - const int docIndex = m_wnd->m_ui->stack_GuiDocuments->indexOf(widgetDoc); - m_wnd->m_ui->combo_GuiDocuments->setCurrentIndex(docIndex); + const int docIndex = m_wnd->widgetPageDocuments()->indexOfWidgetGuiDocument(widgetDoc); + m_wnd->widgetPageDocuments()->setCurrentDocumentIndex(docIndex); } void AppContext::updateControlsEnabledStatus() @@ -116,20 +124,22 @@ void AppContext::updateControlsEnabledStatus() void AppContext::deleteDocumentWidget(const DocumentPtr& doc) { - QWidget* widgetDoc = this->findWidgetGuiDocument([&](WidgetGuiDocument* widgetDoc) { + auto widgetDoc = this->findWidgetGuiDocument([&](WidgetGuiDocument* widgetDoc) { return widgetDoc->documentIdentifier() == doc->identifier(); }); - if (widgetDoc) { - m_wnd->m_ui->stack_GuiDocuments->removeWidget(widgetDoc); - widgetDoc->deleteLater(); - } + m_wnd->widgetPageDocuments()->removeWidgetGuiDocument(widgetDoc); +} + +WidgetGuiDocument* AppContext::widgetGuiDocument(int idx) const +{ + return m_wnd->widgetPageDocuments()->widgetGuiDocument(idx); } WidgetGuiDocument* AppContext::findWidgetGuiDocument(std::function fn) const { - const int widgetCount = m_wnd->m_ui->stack_GuiDocuments->count(); + const int widgetCount = m_wnd->widgetPageDocuments()->widgetGuiDocumentCount(); for (int i = 0; i < widgetCount; ++i) { - auto candidate = m_wnd->widgetGuiDocument(i); + auto candidate = this->widgetGuiDocument(i); if (candidate && fn(candidate)) return candidate; } @@ -139,7 +149,7 @@ WidgetGuiDocument* AppContext::findWidgetGuiDocument(std::functionwidgetGuiDocument(docIndex); + auto widgetDoc = this->widgetGuiDocument(docIndex); emit this->currentDocumentChanged(widgetDoc ? widgetDoc->documentIdentifier() : -1); } diff --git a/src/app/app_context.h b/src/app/app_context.h index 0e12229b..942011bd 100644 --- a/src/app/app_context.h +++ b/src/app/app_context.h @@ -20,13 +20,13 @@ class AppContext : public IAppContext { GuiApplication* guiApp() const override; TaskManager* taskMgr() const override; - QWidget* widgetLeftSidebar() const override; V3dViewController* v3dViewController(const GuiDocument* guiDoc) const override; QWidget* widgetMain() const override; - QWidget* widgetMainByMode(ModeWidgetMain mode) const override; - ModeWidgetMain modeWidgetMain() const override; - void setModeWidgetMain(ModeWidgetMain mode) override; + QWidget* widgetPage(Page page) const override; + Page currentPage() const override; + void setCurrentPage(Page page) override; + QWidget* pageDocuments_widgetLeftSideBar() const override; int findDocumentIndex(Document::Identifier docId) const override; Document::Identifier findDocumentFromIndex(int index) const override; @@ -38,6 +38,7 @@ class AppContext : public IAppContext { void deleteDocumentWidget(const DocumentPtr& doc) override; private: + WidgetGuiDocument* widgetGuiDocument(int idx) const; WidgetGuiDocument* findWidgetGuiDocument(std::function fn) const; void onCurrentDocumentIndexChanged(int docIndex); diff --git a/src/app/commands_api.cpp b/src/app/commands_api.cpp index 5ed5b40f..d762a9fe 100644 --- a/src/app/commands_api.cpp +++ b/src/app/commands_api.cpp @@ -10,6 +10,8 @@ #include "../gui/gui_application.h" #include +#include +#include namespace Mayo { @@ -51,4 +53,35 @@ void Command::setAction(QAction* action) QObject::connect(action, &QAction::triggered, this, &Command::execute); } +CommandContainer::CommandContainer(IAppContext* appContext) + : m_appContext(appContext) +{ +} + +void CommandContainer::setAppContext(IAppContext* appContext) +{ + assert(!m_appContext && m_mapCommand.empty()); + m_appContext = appContext; +} + +Command* CommandContainer::findCommand(std::string_view name) const +{ + auto it = m_mapCommand.find(name); + return it != m_mapCommand.cend() ? it->second : nullptr; +} + +QAction* CommandContainer::findCommandAction(std::string_view name) const +{ + auto cmd = this->findCommand(name); + return cmd ? cmd->action() : nullptr; +} + +void CommandContainer::addCommand_impl(std::string_view name, Command* cmd) +{ + assert(m_appContext != nullptr); + auto [it, ok] = m_mapCommand.insert({ name, cmd }); + if (!ok) + throw std::invalid_argument(fmt::format("Command name {} already exists", name)); +} + } // namespace Mayo diff --git a/src/app/commands_api.h b/src/app/commands_api.h index 3ee0c6df..f34332bf 100644 --- a/src/app/commands_api.h +++ b/src/app/commands_api.h @@ -12,6 +12,7 @@ #include #include // WARNING Qt5 / Qt6 +#include class QWidget; namespace Mayo { @@ -22,23 +23,25 @@ class GuiDocument; class V3dViewController; class TaskManager; +class Command; + // Provides interface to access/interact with application class IAppContext : public QObject { Q_OBJECT public: - enum class ModeWidgetMain { Unknown, Home, Documents }; + enum class Page { Unknown, Home, Documents }; IAppContext(QObject* parent = nullptr); virtual GuiApplication* guiApp() const = 0; virtual TaskManager* taskMgr() const = 0; - virtual QWidget* widgetLeftSidebar() const = 0; virtual V3dViewController* v3dViewController(const GuiDocument* guiDoc) const = 0; virtual QWidget* widgetMain() const = 0; - virtual QWidget* widgetMainByMode(ModeWidgetMain mode) const = 0; - virtual ModeWidgetMain modeWidgetMain() const = 0; - virtual void setModeWidgetMain(ModeWidgetMain mode) = 0; + virtual QWidget* widgetPage(Page page) const = 0; + virtual Page currentPage() const = 0; + virtual void setCurrentPage(Page page) = 0; + virtual QWidget* pageDocuments_widgetLeftSideBar() const = 0; virtual Document::Identifier currentDocument() const = 0; virtual void setCurrentDocument(Document::Identifier docId) = 0; @@ -85,4 +88,70 @@ class Command : public QObject { QAction* m_action = nullptr; }; +// Provides an associative container dedicated to Command objects +// Each command in the container is mapped to a unique identifier(ie the "command name") +class CommandContainer { +public: + CommandContainer() = default; + CommandContainer(IAppContext* appContext); + + IAppContext* appContext() const { return m_appContext; } + void setAppContext(IAppContext* appContext); + + template void foreachCommand(Function fn); + + // Returns the Command object mapped to 'name' + // That object was previously created and associated with a call to addCommand()/addNamedCommand() + // Might return null in case no command is mapped to 'name' + Command* findCommand(std::string_view name) const; + + // Helper function to retrieve the action provided by the Command object mapped to 'name' + // Might return null in case no command is mapped to 'name' + QAction* findCommandAction(std::string_view name) const; + + // Construct and add new Command object with arguments 'args' + // The command is associated to identigfier 'name' and can be retrieved later on with findCommand() + template CmdType* addCommand(std::string_view name, Args... p); + + // Same behavior as addCommand() function + // The command name is implicit and found by assuming the presence of CmdType::Name class member + template CmdType* addNamedCommand(Args... p); + +private: + void addCommand_impl(std::string_view name, Command* cmd); + + IAppContext* m_appContext = nullptr; + std::unordered_map m_mapCommand; +}; + + + +// -- +// -- Implementation +// -- + +template +void CommandContainer::foreachCommand(Function fn) +{ + for (auto [name, cmd] : m_mapCommand) { + fn(name, cmd); + } +} + +template +CmdType* CommandContainer::addCommand(std::string_view name, Args... p) +{ + auto cmd = new CmdType(m_appContext, p...); + this->addCommand_impl(name, cmd); + return cmd; +} + +template +CmdType* CommandContainer::addNamedCommand(Args... p) +{ + auto cmd = new CmdType(m_appContext, p...); + this->addCommand_impl(CmdType::Name, cmd); + return cmd; +} + } // namespace Mayo diff --git a/src/app/commands_display.h b/src/app/commands_display.h index 14dc6d50..79b63260 100644 --- a/src/app/commands_display.h +++ b/src/app/commands_display.h @@ -8,6 +8,8 @@ #include "commands_api.h" +#include + class QMenu; namespace Mayo { @@ -18,6 +20,8 @@ class CommandChangeProjection : public Command { void execute() override; bool getEnabledStatus() const override; + static constexpr std::string_view Name = "change-projection"; + private: void onCurrentDocumentChanged(); QAction* m_actionOrtho = nullptr; @@ -31,6 +35,8 @@ class CommandChangeDisplayMode : public Command { void execute() override; bool getEnabledStatus() const override; + static constexpr std::string_view Name = "change-display-mode"; + private: void recreateMenuDisplayMode(); }; @@ -41,6 +47,8 @@ class CommandToggleOriginTrihedron : public Command { void execute() override; bool getEnabledStatus() const override; + static constexpr std::string_view Name = "toggle-origin-trihedron"; + private: void onCurrentDocumentChanged(); }; @@ -51,6 +59,8 @@ class CommandTogglePerformanceStats : public Command { void execute() override; bool getEnabledStatus() const override; + static constexpr std::string_view Name = "toggle-performance-stats"; + private: void onCurrentDocumentChanged(); }; @@ -60,6 +70,8 @@ class CommandZoomInCurrentDocument : public Command { CommandZoomInCurrentDocument(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "current-doc-zoom-in"; }; class CommandZoomOutCurrentDocument : public Command { @@ -67,6 +79,8 @@ class CommandZoomOutCurrentDocument : public Command { CommandZoomOutCurrentDocument(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "current-doc-zoom-out"; }; class CommandTurnViewCounterClockWise : public Command { @@ -74,6 +88,8 @@ class CommandTurnViewCounterClockWise : public Command { CommandTurnViewCounterClockWise(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "current-doc-turn-view-ccw"; }; class CommandTurnViewClockWise : public Command { @@ -81,6 +97,8 @@ class CommandTurnViewClockWise : public Command { CommandTurnViewClockWise(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "current-doc-turn-view-cw"; }; } // namespace Mayo diff --git a/src/app/commands_file.cpp b/src/app/commands_file.cpp index 4be5fdf9..d5e8e03d 100644 --- a/src/app/commands_file.cpp +++ b/src/app/commands_file.cpp @@ -15,6 +15,7 @@ #include "recent_files.h" #include "theme.h" +#include #include #include #include @@ -167,6 +168,7 @@ void FileCommandTools::closeDocument(IAppContext* context, Document::Identifier void FileCommandTools::openDocumentsFromList(IAppContext* context, Span listFilePath) { + assert(context != nullptr); auto app = context->guiApp()->application(); auto appModule = AppModule::get(); for (const FilePath& fp : listFilePath) { @@ -416,7 +418,8 @@ void CommandExportSelectedApplicationItems::execute() Command::tr("Select Output File"), filepathTo(lastSettings.openDir), listWriterFileFilter.join(QLatin1String(";;")), - &lastSettings.selectedFilter); + &lastSettings.selectedFilter + ); if (strFilepath.isEmpty()) return; diff --git a/src/app/commands_file.h b/src/app/commands_file.h index bc06dcf7..d984e978 100644 --- a/src/app/commands_file.h +++ b/src/app/commands_file.h @@ -23,6 +23,8 @@ class CommandNewDocument : public Command { public: CommandNewDocument(IAppContext* context); void execute() override; + + static constexpr std::string_view Name = "new-doc"; }; class CommandOpenDocuments : public Command { @@ -30,6 +32,8 @@ class CommandOpenDocuments : public Command { CommandOpenDocuments(IAppContext* context); void execute() override; bool eventFilter(QObject* watched, QEvent* event) override; + + static constexpr std::string_view Name = "open-docs"; }; class CommandRecentFiles : public Command { @@ -38,6 +42,8 @@ class CommandRecentFiles : public Command { CommandRecentFiles(IAppContext* context, QMenu* containerMenu); void execute() override; void recreateEntries(); + + static constexpr std::string_view Name = "recent-files"; }; class CommandImportInCurrentDocument : public Command { @@ -45,6 +51,8 @@ class CommandImportInCurrentDocument : public Command { CommandImportInCurrentDocument(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "import"; }; class CommandExportSelectedApplicationItems : public Command { @@ -52,6 +60,8 @@ class CommandExportSelectedApplicationItems : public Command { CommandExportSelectedApplicationItems(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "export"; }; class CommandCloseCurrentDocument : public Command { @@ -60,6 +70,8 @@ class CommandCloseCurrentDocument : public Command { void execute() override; bool getEnabledStatus() const override; + static constexpr std::string_view Name = "close-doc"; + private: void updateActionText(Document::Identifier docId); }; @@ -69,6 +81,8 @@ class CommandCloseAllDocuments : public Command { CommandCloseAllDocuments(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "close-all-docs"; }; class CommandCloseAllDocumentsExceptCurrent : public Command { @@ -77,6 +91,8 @@ class CommandCloseAllDocumentsExceptCurrent : public Command { void execute() override; bool getEnabledStatus() const override; + static constexpr std::string_view Name = "close-all-docs-except-current"; + private: void updateActionText(Document::Identifier docId); }; @@ -85,6 +101,8 @@ class CommandQuitApplication : public Command { public: CommandQuitApplication(IAppContext* context); void execute() override; + + static constexpr std::string_view Name = "quit-app"; }; } // namespace Mayo diff --git a/src/app/commands_help.h b/src/app/commands_help.h index ca880669..bd8cdf25 100644 --- a/src/app/commands_help.h +++ b/src/app/commands_help.h @@ -14,12 +14,16 @@ class CommandReportBug : public Command { public: CommandReportBug(IAppContext* context); void execute() override; + + static constexpr std::string_view Name = "report-bug"; }; class CommandAbout : public Command { public: CommandAbout(IAppContext* context); void execute() override; + + static constexpr std::string_view Name = "about"; }; } // namespace Mayo diff --git a/src/app/commands_tools.h b/src/app/commands_tools.h index 5e3e803e..9ade0add 100644 --- a/src/app/commands_tools.h +++ b/src/app/commands_tools.h @@ -15,6 +15,8 @@ class CommandSaveViewImage : public Command { CommandSaveViewImage(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "save-view-image"; }; class CommandInspectXde : public Command { @@ -22,12 +24,16 @@ class CommandInspectXde : public Command { CommandInspectXde(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "inspect-xde"; }; class CommandEditOptions : public Command { public: CommandEditOptions(IAppContext* context); void execute() override; + + static constexpr std::string_view Name = "edit-options"; }; } // namespace Mayo diff --git a/src/app/commands_window.cpp b/src/app/commands_window.cpp index cc87c298..ddc0165e 100644 --- a/src/app/commands_window.cpp +++ b/src/app/commands_window.cpp @@ -48,33 +48,30 @@ CommandLeftSidebarWidgetToggle::CommandLeftSidebarWidgetToggle(IAppContext* cont action->setToolTip(Command::tr("Show/Hide Left Sidebar")); action->setShortcut(Qt::ALT + Qt::Key_0); action->setCheckable(true); - action->setChecked(context->widgetLeftSidebar()->isVisible()); + action->setChecked(context->pageDocuments_widgetLeftSideBar()->isVisible()); this->setAction(action); this->updateAction(); - context->widgetLeftSidebar()->installEventFilter(this); + context->pageDocuments_widgetLeftSideBar()->installEventFilter(this); } void CommandLeftSidebarWidgetToggle::execute() { - QWidget* widget = this->context()->widgetLeftSidebar(); + QWidget* widget = this->context()->pageDocuments_widgetLeftSideBar(); widget->setVisible(!widget->isVisible()); } bool CommandLeftSidebarWidgetToggle::getEnabledStatus() const { - return this->context()->modeWidgetMain() != IAppContext::ModeWidgetMain::Home; + return this->context()->currentPage() != IAppContext::Page::Home; } bool CommandLeftSidebarWidgetToggle::eventFilter(QObject* watched, QEvent* event) { - if (watched == this->context()->widgetLeftSidebar()) { - if (event->type() == QEvent::Show || event->type() == QEvent::Hide) { + if (event->type() == QEvent::Show || event->type() == QEvent::Hide) { + if (watched == this->context()->pageDocuments_widgetLeftSideBar()) { this->updateAction(); return true; } - else { - return false; - } } return Command::eventFilter(watched, event); @@ -82,7 +79,7 @@ bool CommandLeftSidebarWidgetToggle::eventFilter(QObject* watched, QEvent* event void CommandLeftSidebarWidgetToggle::updateAction() { - if (this->context()->widgetLeftSidebar()->isVisible()) { + if (this->context()->pageDocuments_widgetLeftSideBar()->isVisible()) { this->action()->setText(Command::tr("Hide Left Sidebar")); this->action()->setIcon(mayoTheme()->icon(Theme::Icon::BackSquare)); } @@ -102,23 +99,23 @@ CommandSwitchMainWidgetMode::CommandSwitchMainWidgetMode(IAppContext* context) action->setShortcut(Qt::CTRL + Qt::Key_0); this->setAction(action); this->updateAction(); - context->widgetMainByMode(IAppContext::ModeWidgetMain::Home)->installEventFilter(this); - context->widgetMainByMode(IAppContext::ModeWidgetMain::Documents)->installEventFilter(this); + context->widgetPage(IAppContext::Page::Home)->installEventFilter(this); + context->widgetPage(IAppContext::Page::Documents)->installEventFilter(this); } void CommandSwitchMainWidgetMode::execute() { - auto newMode = IAppContext::ModeWidgetMain::Unknown; - switch (this->context()->modeWidgetMain()) { - case IAppContext::ModeWidgetMain::Home: - newMode = IAppContext::ModeWidgetMain::Documents; + auto newPage = IAppContext::Page::Unknown; + switch (this->context()->currentPage()) { + case IAppContext::Page::Home: + newPage = IAppContext::Page::Documents; break; - case IAppContext::ModeWidgetMain::Documents: - newMode = IAppContext::ModeWidgetMain::Home; + case IAppContext::Page::Documents: + newPage = IAppContext::Page::Home; break; } - this->context()->setModeWidgetMain(newMode); + this->context()->setCurrentPage(newPage); } bool CommandSwitchMainWidgetMode::getEnabledStatus() const @@ -128,16 +125,13 @@ bool CommandSwitchMainWidgetMode::getEnabledStatus() const bool CommandSwitchMainWidgetMode::eventFilter(QObject* watched, QEvent* event) { - if (watched == this->context()->widgetMainByMode(IAppContext::ModeWidgetMain::Home) - || watched == this->context()->widgetMainByMode(IAppContext::ModeWidgetMain::Documents)) - { - if (event->type() == QEvent::Show) { + if (event->type() == QEvent::Show) { + if (watched == this->context()->widgetPage(IAppContext::Page::Home) + || watched == this->context()->widgetPage(IAppContext::Page::Documents)) + { this->updateAction(); return true; } - else { - return false; - } } return Command::eventFilter(watched, event); @@ -145,11 +139,11 @@ bool CommandSwitchMainWidgetMode::eventFilter(QObject* watched, QEvent* event) void CommandSwitchMainWidgetMode::updateAction() { - switch (this->context()->modeWidgetMain()) { - case IAppContext::ModeWidgetMain::Home: + switch (this->context()->currentPage()) { + case IAppContext::Page::Home: this->action()->setText(Command::tr("Go To Documents")); break; - case IAppContext::ModeWidgetMain::Documents: + case IAppContext::Page::Documents: this->action()->setText(Command::tr("Go To Home Page")); break; } diff --git a/src/app/commands_window.h b/src/app/commands_window.h index de343edd..bf936f57 100644 --- a/src/app/commands_window.h +++ b/src/app/commands_window.h @@ -15,10 +15,14 @@ class CommandMainWidgetToggleFullscreen : public Command { CommandMainWidgetToggleFullscreen(IAppContext* context); void execute() override; + static constexpr std::string_view Name = "toggle-fullscreen"; + private: Qt::WindowStates m_previousWindowState = Qt::WindowNoState; }; +// Provides command to toggle visibility of the left-side bar widget belonging to +// the "Documents" main page class CommandLeftSidebarWidgetToggle : public Command { public: CommandLeftSidebarWidgetToggle(IAppContext* context); @@ -27,6 +31,8 @@ class CommandLeftSidebarWidgetToggle : public Command { bool eventFilter(QObject* watched, QEvent* event) override; + static constexpr std::string_view Name = "toggle-left-sidebar"; + private: void updateAction(); }; @@ -39,6 +45,8 @@ class CommandSwitchMainWidgetMode : public Command { bool eventFilter(QObject* watched, QEvent* event) override; + static constexpr std::string_view Name = "switch-main-widget-mode"; + private: void updateAction(); }; @@ -48,6 +56,8 @@ class CommandPreviousDocument : public Command { CommandPreviousDocument(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "previous-doc"; }; class CommandNextDocument : public Command { @@ -55,6 +65,8 @@ class CommandNextDocument : public Command { CommandNextDocument(IAppContext* context); void execute() override; bool getEnabledStatus() const override; + + static constexpr std::string_view Name = "next-doc"; }; } // namespace Mayo diff --git a/src/app/iwidget_main_page.h b/src/app/iwidget_main_page.h new file mode 100644 index 00000000..7987fda4 --- /dev/null +++ b/src/app/iwidget_main_page.h @@ -0,0 +1,39 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#pragma once + +#include + +namespace Mayo { + +class CommandContainer; + +// Provides an interface for main pages within the Mayo application +// As its core, Mayo UI is basically a stack of widgets +// Such widgets are called "main pages" or just "pages" and only a single one is active at a time +class IWidgetMainPage : public QWidget { + Q_OBJECT +public: + // Builds UI objects(eg this might calls setupUi() on Qt-generated widgets) + IWidgetMainPage(QWidget* parent = nullptr) + : QWidget(parent) + {} + + // Completes initialization of the page(eg by linking some buttons to existing commands) + virtual void initialize(const CommandContainer* cmdContainer) = 0; + + // Update the activation("enabled" status) of the controls(ie any widget) belonging to this page + virtual void updatePageControlsActivation() = 0; + +signals: + // Signal emitted when a "global" or "complete" activation at the whole application level is + // required by this page + // This might, for example, be consecutive to event internal to this page + void updateGlobalControlsActivationRequired(); +}; + +} // namespace Mayo diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index ad4925a4..c684a962 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -8,13 +8,7 @@ #include "ui_mainwindow.h" #include "../base/application.h" -#include "../base/application_item_selection_model.h" -#include "../base/document.h" #include "../base/global.h" -#include "../base/messenger.h" -#include "../base/settings.h" -#include "../graphics/graphics_object_driver.h" -#include "../graphics/graphics_utils.h" #include "../gui/gui_application.h" #include "../gui/gui_document.h" #include "app_context.h" @@ -25,139 +19,48 @@ #include "commands_window.h" #include "commands_help.h" #include "dialog_task_manager.h" -#include "document_property_group.h" -#include "filepath_conv.h" -#include "gui_document_list_model.h" -#include "item_view_buttons.h" -#include "qstring_conv.h" #include "qtgui_utils.h" #include "qtwidgets_utils.h" #include "theme.h" -#include "widget_file_system.h" -#include "widget_gui_document.h" +#include "widget_main_control.h" +#include "widget_main_home.h" #include "widget_message_indicator.h" -#include "widget_model_tree.h" -#include "widget_occ_view.h" -#include "widget_properties_editor.h" #ifdef Q_OS_WIN # include "windows/win_taskbar_global_progress.h" #endif -#include #include namespace Mayo { -MainWindow::MainWindow(GuiApplication* guiApp, QWidget *parent) +MainWindow::MainWindow(GuiApplication* guiApp, QWidget* parent) : QMainWindow(parent), m_guiApp(guiApp), m_ui(new Ui_MainWindow) { m_ui->setupUi(this); - m_ui->widget_ModelTree->registerGuiApplication(guiApp); - - m_ui->splitter_Main->setChildrenCollapsible(false); - m_ui->splitter_Main->setStretchFactor(0, 1); - m_ui->splitter_Main->setStretchFactor(1, 3); - - m_ui->splitter_ModelTree->setStretchFactor(0, 1); - m_ui->splitter_ModelTree->setStretchFactor(1, 2); - - m_ui->stack_LeftContents->setCurrentIndex(0); - - m_ui->widget_Properties->setRowHeightFactor(1.4); - m_ui->widget_Properties->clear(); - - mayoTheme()->setupHeaderComboBox(m_ui->combo_LeftContents); - mayoTheme()->setupHeaderComboBox(m_ui->combo_GuiDocuments); + this->addPage(IAppContext::Page::Home, new WidgetMainHome(this)); + this->addPage(IAppContext::Page::Documents, new WidgetMainControl(guiApp, this)); + // AppContext requires WidgetMainControl object, ensure it has been created beforehand m_appContext = new AppContext(this); + m_cmdContainer.setAppContext(m_appContext); + + // Some commands requires WidgetMainControl UI page to exist, ensure it has been created beforehand this->createCommands(); this->createMenus(); - m_ui->btn_PreviousGuiDocument->setDefaultAction(this->getCommandAction("previous-doc")); - m_ui->btn_NextGuiDocument->setDefaultAction(this->getCommandAction("next-doc")); - m_ui->btn_CloseGuiDocument->setDefaultAction(this->getCommandAction("close-doc")); - m_ui->btn_CloseLeftSideBar->setDefaultAction(this->getCommandAction("toggle-left-sidebar")); + // WidgetMainControl page depends on some Command objects, ensure they have been created beforehand + for (auto [code, page] : m_mapWidgetPage) + page->initialize(&m_cmdContainer); - // "HomeFiles" actions - QObject::connect( - m_ui->widget_HomeFiles, &WidgetHomeFiles::newDocumentRequested, - this->getCommand("new-doc"), &Command::execute - ); - QObject::connect( - m_ui->widget_HomeFiles, &WidgetHomeFiles::openDocumentsRequested, - this->getCommand("open-docs"), &Command::execute - ); - QObject::connect( - m_ui->widget_HomeFiles, &WidgetHomeFiles::recentFileOpenRequested, - this, &MainWindow::openDocument - ); - // "Window" actions and navigation in documents - QObject::connect( - m_ui->combo_GuiDocuments, qOverload(&QComboBox::currentIndexChanged), - this, &MainWindow::onCurrentDocumentIndexChanged - ); - QObject::connect( - m_ui->widget_FileSystem, &WidgetFileSystem::locationActivated, - this, &MainWindow::onWidgetFileSystemLocationActivated - ); - // ... - QObject::connect( - m_ui->combo_LeftContents, qOverload(&QComboBox::currentIndexChanged), - this, &MainWindow::onLeftContentsPageChanged - ); - QObject::connect( - m_ui->listView_OpenedDocuments, &QListView::clicked, - this, [=](const QModelIndex& index) { this->setCurrentDocumentIndex(index.row()); } - ); - guiApp->application()->signalDocumentFilePathChanged.connectSlot([=](const DocumentPtr& doc, const FilePath& fp) { - if (this->currentWidgetGuiDocument()->documentIdentifier() == doc->identifier()) - m_ui->widget_FileSystem->setLocation(filepathTo(fp)); - }); AppModule::get()->signalMessage.connectSlot(&MainWindow::onMessage, this); guiApp->signalGuiDocumentAdded.connectSlot(&MainWindow::onGuiDocumentAdded, this); - guiApp->selectionModel()->signalChanged.connectSlot(&MainWindow::onApplicationItemSelectionChanged, this); - // Creation of annex objects - { - // Opened documents GUI - auto listViewBtns = new ItemViewButtons(m_ui->listView_OpenedDocuments, this); - auto actionCloseDoc = this->getCommandAction("close-doc"); - listViewBtns->addButton(1, actionCloseDoc->icon(), actionCloseDoc->toolTip()); - listViewBtns->setButtonDetection(1, -1, QVariant()); - listViewBtns->setButtonDisplayColumn(1, 0); - listViewBtns->setButtonDisplayModes(1, ItemViewButtons::DisplayOnDetection); - listViewBtns->setButtonItemSide(1, ItemViewButtons::ItemRightSide); - const int iconSize = this->style()->pixelMetric(QStyle::PM_ListViewIconSize); - listViewBtns->setButtonIconSize(1, QSize(iconSize * 0.66, iconSize * 0.66)); - listViewBtns->installDefaultItemDelegate(); - QObject::connect(listViewBtns, &ItemViewButtons::buttonClicked, this, [=](int btnId, QModelIndex index) { - if (btnId == 1) { - auto widgetDoc = this->widgetGuiDocument(index.row()); - if (widgetDoc) - FileCommandTools::closeDocument(m_appContext, widgetDoc->documentIdentifier()); - } - }); - } new DialogTaskManager(&m_taskMgr, this); - // BEWARE MainWindow::onGuiDocumentAdded() must be called before - // MainWindow::onCurrentDocumentIndexChanged() - auto guiDocModel = new GuiDocumentListModel(guiApp, this); - m_ui->combo_GuiDocuments->setModel(guiDocModel); - m_ui->listView_OpenedDocuments->setModel(guiDocModel); - - // Finalize setup - m_ui->widget_LeftHeader->installEventFilter(this); - m_ui->widget_ControlGuiDocuments->installEventFilter(this); - m_ui->stack_GuiDocuments->installEventFilter(this); - this->onLeftContentsPageChanged(m_ui->stack_LeftContents->currentIndex()); this->updateControlsActivation(); - m_ui->widget_MouseCoords->hide(); - - this->onCurrentDocumentIndexChanged(-1); } MainWindow::~MainWindow() @@ -165,35 +68,6 @@ MainWindow::~MainWindow() delete m_ui; } -bool MainWindow::eventFilter(QObject* watched, QEvent* event) -{ - auto fnSizeBtn = [](const QWidget* container, const QWidget* widgetHeightRef) { - const int btnSideLen = widgetHeightRef->frameGeometry().height(); - const QList listBtn = container->findChildren(); - for (QAbstractButton* btn : listBtn) - btn->setFixedSize(btnSideLen, btnSideLen); - }; - const QEvent::Type eventType = event->type(); - if (watched == m_ui->widget_ControlGuiDocuments && eventType == QEvent::Show) { - fnSizeBtn(m_ui->widget_ControlGuiDocuments, m_ui->combo_GuiDocuments); - return true; - } - - if (watched == m_ui->widget_LeftHeader && eventType == QEvent::Show) { - fnSizeBtn(m_ui->widget_LeftHeader, m_ui->combo_LeftContents); - return true; - } - - if (watched == m_ui->stack_GuiDocuments) { - if (eventType == QEvent::Enter || eventType == QEvent::Leave) { - m_ui->widget_MouseCoords->setHidden(eventType == QEvent::Leave); - return true; - } - } - - return false; -} - void MainWindow::showEvent(QShowEvent* event) { QMainWindow::showEvent(event); @@ -207,160 +81,120 @@ void MainWindow::showEvent(QShowEvent* event) #endif } +void MainWindow::addPage(IAppContext::Page page, IWidgetMainPage* pageWidget) +{ + assert(m_mapWidgetPage.find(page) == m_mapWidgetPage.cend()); + assert(m_ui->stack_Main->indexOf(pageWidget) == -1); + m_mapWidgetPage.insert({ page, pageWidget }); + m_ui->stack_Main->addWidget(pageWidget); + QObject::connect( + pageWidget, &IWidgetMainPage::updateGlobalControlsActivationRequired, + this, &MainWindow::updateControlsActivation + ); +} + void MainWindow::createCommands() { // "File" commands - this->addCommand("new-doc"); - this->addCommand("open-docs"); - this->addCommand("recent-files", m_ui->menu_File); - this->addCommand("import"); - this->addCommand("export"); - this->addCommand("close-doc"); - this->addCommand("close-all-docs"); - this->addCommand("close-all-docs-except-current"); - this->addCommand("quit"); + this->addCommand(); + this->addCommand(); + this->addCommand(m_ui->menu_File); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); // "Display" commands - this->addCommand("change-projection"); - this->addCommand("change-display-mode", m_ui->menu_Display); - this->addCommand("toggle-origin-trihedron"); - this->addCommand("toggle-performance-stats"); - this->addCommand("current-doc-zoom-in"); - this->addCommand("current-doc-zoom-out"); - this->addCommand("current-doc-turn-view-ccw"); - this->addCommand("current-doc-turn-view-cw"); + this->addCommand(); + this->addCommand(m_ui->menu_Display); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); // "Tools" commands - this->addCommand("save-view-image"); - this->addCommand("inspect-xde"); - this->addCommand("edit-options"); + this->addCommand(); + this->addCommand(); + this->addCommand(); // "Window" commands - this->addCommand("toggle-left-sidebar"); - this->addCommand("toggle-fullscreen"); - this->addCommand("switch-main-widget-mode"); - this->addCommand("previous-doc"); - this->addCommand("next-doc"); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); + this->addCommand(); // "Help" commands - this->addCommand("report-bug"); - this->addCommand("about"); + this->addCommand(); + this->addCommand(); } void MainWindow::createMenus() { - // Helper function to retrieve the QAction associated to the name of a command - auto fnGetAction = [=](std::string_view commandName) { - return this->getCommandAction(commandName); + // Helper function to add in 'menu' the QAction associated to 'commandName' + auto fnAddAction = [=](QMenu* menu, std::string_view commandName) { + menu->addAction(m_cmdContainer.findCommandAction(commandName)); }; + // TODO Create menu bar programmatically(not hard-code in .ui file) + { // File auto menu = m_ui->menu_File; - menu->addAction(fnGetAction("new-doc")); - menu->addAction(fnGetAction("open-docs")); - menu->addAction(fnGetAction("recent-files")); + fnAddAction(menu, CommandNewDocument::Name); + fnAddAction(menu, CommandOpenDocuments::Name); + fnAddAction(menu, CommandRecentFiles::Name); menu->addSeparator(); - menu->addAction(fnGetAction("import")); - menu->addAction(fnGetAction("export")); + fnAddAction(menu, CommandImportInCurrentDocument::Name); + fnAddAction(menu, CommandExportSelectedApplicationItems::Name); menu->addSeparator(); - menu->addAction(fnGetAction("close-doc")); - menu->addAction(fnGetAction("close-all-docs-except-current")); - menu->addAction(fnGetAction("close-all-docs")); + fnAddAction(menu, CommandCloseCurrentDocument::Name); + fnAddAction(menu, CommandCloseAllDocumentsExceptCurrent::Name); + fnAddAction(menu, CommandCloseAllDocuments::Name); menu->addSeparator(); - menu->addAction(fnGetAction("quit")); + fnAddAction(menu, CommandQuitApplication::Name); } { // Display auto menu = m_ui->menu_Display; - menu->addAction(fnGetAction("change-projection")); - menu->addAction(fnGetAction("change-display-mode")); - menu->addAction(fnGetAction("toggle-origin-trihedron")); - menu->addAction(fnGetAction("toggle-performance-stats")); + fnAddAction(menu, CommandChangeProjection::Name); + fnAddAction(menu, CommandChangeDisplayMode::Name); + fnAddAction(menu, CommandToggleOriginTrihedron::Name); + fnAddAction(menu, CommandTogglePerformanceStats::Name); menu->addSeparator(); - menu->addAction(fnGetAction("current-doc-zoom-in")); - menu->addAction(fnGetAction("current-doc-zoom-out")); - menu->addAction(fnGetAction("current-doc-turn-view-ccw")); - menu->addAction(fnGetAction("current-doc-turn-view-cw")); + fnAddAction(menu, CommandZoomInCurrentDocument::Name); + fnAddAction(menu, CommandZoomOutCurrentDocument::Name); + fnAddAction(menu, CommandTurnViewCounterClockWise::Name); + fnAddAction(menu, CommandTurnViewClockWise::Name); } { // Tools auto menu = m_ui->menu_Tools; - menu->addAction(fnGetAction("save-view-image")); - menu->addAction(fnGetAction("inspect-xde")); + fnAddAction(menu, CommandSaveViewImage::Name); + fnAddAction(menu, CommandInspectXde::Name); menu->addSeparator(); - menu->addAction(fnGetAction("edit-options")); + fnAddAction(menu, CommandEditOptions::Name); } { // Window auto menu = m_ui->menu_Window; - menu->addAction(fnGetAction("toggle-left-sidebar")); - menu->addAction(fnGetAction("toggle-fullscreen")); + fnAddAction(menu, CommandLeftSidebarWidgetToggle::Name); + fnAddAction(menu, CommandMainWidgetToggleFullscreen::Name); menu->addSeparator(); - menu->addAction(fnGetAction("switch-main-widget-mode")); - menu->addAction(fnGetAction("previous-doc")); - menu->addAction(fnGetAction("next-doc")); + fnAddAction(menu, CommandSwitchMainWidgetMode::Name); + fnAddAction(menu, CommandPreviousDocument::Name); + fnAddAction(menu, CommandNextDocument::Name); } { // Help auto menu = m_ui->menu_Help; - menu->addAction(fnGetAction("report-bug")); + fnAddAction(menu, CommandReportBug::Name); menu->addSeparator(); - menu->addAction(fnGetAction("about")); - } -} - -void MainWindow::onApplicationItemSelectionChanged() -{ - WidgetModelTree* uiModelTree = m_ui->widget_ModelTree; - WidgetPropertiesEditor* uiProps = m_ui->widget_Properties; - - uiProps->clear(); - Span spanAppItem = m_guiApp->selectionModel()->selectedItems(); - if (spanAppItem.size() == 1) { - const ApplicationItem& appItem = spanAppItem.front(); - if (appItem.isDocument()) { - auto dataProps = new DocumentPropertyGroup(appItem.document()); - uiProps->editProperties(dataProps, uiProps->addGroup(tr("Data"))); - m_ptrCurrentNodeDataProperties.reset(dataProps); - } - else if (appItem.isDocumentTreeNode()) { - const DocumentTreeNode& docTreeNode = appItem.documentTreeNode(); - auto dataProps = AppModule::get()->properties(docTreeNode); - if (dataProps) { - uiProps->editProperties(dataProps.get(), uiProps->addGroup(tr("Data"))); - dataProps->signalPropertyChanged.connectSlot([=]{ uiModelTree->refreshItemText(appItem); }); - m_ptrCurrentNodeDataProperties = std::move(dataProps); - } - - GuiDocument* guiDoc = m_guiApp->findGuiDocument(appItem.document()); - std::vector vecGfxObject; - guiDoc->foreachGraphicsObject(docTreeNode.id(), [&](GraphicsObjectPtr gfxObject) { - vecGfxObject.push_back(std::move(gfxObject)); - }); - auto commonGfxDriver = GraphicsObjectDriver::getCommon(vecGfxObject); - if (commonGfxDriver) { - auto gfxProps = commonGfxDriver->properties(vecGfxObject); - if (gfxProps) { - uiProps->editProperties(gfxProps.get(), uiProps->addGroup(tr("Graphics"))); - gfxProps->signalPropertyChanged.connectSlot([=]{ guiDoc->graphicsScene()->redraw(); }); - m_ptrCurrentNodeGraphicsProperties = std::move(gfxProps); - } - } - } - - auto app = m_guiApp->application(); - if (AppModule::get()->properties()->linkWithDocumentSelector) { - const int index = app->findIndexOfDocument(appItem.document()); - if (index != -1) - this->setCurrentDocumentIndex(index); - } + fnAddAction(menu, CommandAbout::Name); } - else { - // TODO - uiProps->clear(); - } - - this->updateControlsActivation(); } void MainWindow::onOperationFinished(bool ok, const QString &msg) @@ -398,86 +232,7 @@ void MainWindow::onGuiDocumentAdded(GuiDocument* guiDoc) fnConfigureHighlightStyle(gfxScene->drawerHighlight(Prs3d_TypeOfHighlight_LocalSelected).get()); fnConfigureHighlightStyle(gfxScene->drawerHighlight(Prs3d_TypeOfHighlight_Selected).get()); - // Configure 3D view behavior with respect to application settings - auto appModule = AppModule::get(); - auto appProps = appModule->properties(); - auto widget = new WidgetGuiDocument(guiDoc); - guiDoc->setDevicePixelRatio(widget->devicePixelRatioF()); - auto widgetCtrl = widget->controller(); - widgetCtrl->setInstantZoomFactor(appProps->instantZoomFactor); - widgetCtrl->setNavigationStyle(appProps->navigationStyle); - if (appProps->defaultShowOriginTrihedron) { - guiDoc->toggleOriginTrihedronVisibility(); - gfxScene->redraw(); - } - - appModule->settings()->signalChanged.connectSlot([=](const Property* setting) { - if (setting == &appProps->instantZoomFactor) - widgetCtrl->setInstantZoomFactor(appProps->instantZoomFactor); - else if (setting == &appProps->navigationStyle) - widgetCtrl->setNavigationStyle(appProps->navigationStyle); - }); - - // React to mouse move in 3D view: - // * update highlighting - // * compute and display 3D mouse coordinates(by silent picking) - widgetCtrl->signalMouseMoved.connectSlot([=](int xPos, int yPos) { - const double dpRatio = this->devicePixelRatioF(); - gfxScene->highlightAt(xPos * dpRatio, yPos * dpRatio, guiDoc->v3dView()); - widget->view()->redraw(); - auto selector = gfxScene->mainSelector(); - selector->Pick(xPos, yPos, guiDoc->v3dView()); - const gp_Pnt pos3d = - selector->NbPicked() > 0 ? - selector->PickedPoint(1) : - GraphicsUtils::V3dView_to3dPosition(guiDoc->v3dView(), xPos, yPos); - m_ui->label_ValuePosX->setText(QString::number(pos3d.X(), 'f', 3)); - m_ui->label_ValuePosY->setText(QString::number(pos3d.Y(), 'f', 3)); - m_ui->label_ValuePosZ->setText(QString::number(pos3d.Z(), 'f', 3)); - }); - - m_ui->stack_GuiDocuments->addWidget(widget); - this->updateControlsActivation(); - const int newDocIndex = m_guiApp->application()->documentCount() - 1; - QTimer::singleShot(0, this, [=]{ this->setCurrentDocumentIndex(newDocIndex); }); -} - -void MainWindow::onWidgetFileSystemLocationActivated(const QFileInfo& loc) -{ - this->openDocument(filepathFrom(loc)); -} - -void MainWindow::onLeftContentsPageChanged(int pageId) -{ - m_ui->stack_LeftContents->setCurrentIndex(pageId); - QWidget* placeHolder = this->recreateLeftHeaderPlaceHolder(); - if (m_ui->stack_LeftContents->currentWidget() == m_ui->page_ModelTree && placeHolder) { - const int btnSideLen = m_ui->combo_LeftContents->frameGeometry().height(); - auto btnSettings = new QToolButton(placeHolder); - btnSettings->setAutoRaise(true); - btnSettings->setFixedSize(btnSideLen, btnSideLen); - btnSettings->setIcon(mayoTheme()->icon(Theme::Icon::Gear)); - btnSettings->setToolTip(tr("Options")); - placeHolder->layout()->addWidget(btnSettings); - btnSettings->setMenu(this->createMenuModelTreeSettings()); - btnSettings->setPopupMode(QToolButton::InstantPopup); - } - else { - delete placeHolder; - } -} - -void MainWindow::onCurrentDocumentIndexChanged(int idx) -{ - m_ui->stack_GuiDocuments->setCurrentIndex(idx); - QAbstractItemView* view = m_ui->listView_OpenedDocuments; - view->setCurrentIndex(view->model()->index(idx, 0)); - this->updateControlsActivation(); - - const DocumentPtr docPtr = m_guiApp->application()->findDocumentByIndex(idx); - const FilePath docFilePath = docPtr ? docPtr->filePath() : FilePath(); - m_ui->widget_FileSystem->setLocation(filepathTo(docFilePath)); } void MainWindow::onMessage(Messenger::MessageType msgType, const QString& text) @@ -497,11 +252,6 @@ void MainWindow::onMessage(Messenger::MessageType msgType, const QString& text) } } -void MainWindow::openDocument(const FilePath& fp) -{ - FileCommandTools::openDocument(m_appContext, fp); -} - void MainWindow::openDocumentsFromList(Span listFilePath) { FileCommandTools::openDocumentsFromList(m_appContext, listFilePath); @@ -509,99 +259,33 @@ void MainWindow::openDocumentsFromList(Span listFilePath) void MainWindow::updateControlsActivation() { - const QWidget* currMainPage = m_ui->stack_Main->currentWidget(); + const QWidget* currentPage = m_ui->stack_Main->currentWidget(); const int appDocumentsCount = m_guiApp->application()->documentCount(); const bool appDocumentsEmpty = appDocumentsCount == 0; - QWidget* newMainPage = appDocumentsEmpty ? m_ui->page_MainHome : m_ui->page_MainControl; - if (currMainPage != newMainPage) - m_ui->stack_Main->setCurrentWidget(newMainPage); - - for (auto [name, cmd] : m_mapCommand) { + QWidget* newPage = + appDocumentsEmpty ? + static_cast(this->widgetPageHome()) + : static_cast(this->widgetPageDocuments()); + if (currentPage != newPage) + m_ui->stack_Main->setCurrentWidget(newPage); + + m_cmdContainer.foreachCommand([](std::string_view, Command* cmd) { cmd->action()->setEnabled(cmd->getEnabledStatus()); - } - - m_ui->combo_GuiDocuments->setEnabled(!appDocumentsEmpty); -} - -int MainWindow::currentDocumentIndex() const -{ - return m_ui->combo_GuiDocuments->currentIndex(); -} - -void MainWindow::setCurrentDocumentIndex(int idx) -{ - m_ui->combo_GuiDocuments->setCurrentIndex(idx); -} - -WidgetGuiDocument* MainWindow::widgetGuiDocument(int idx) const -{ - return qobject_cast(m_ui->stack_GuiDocuments->widget(idx)); -} - -WidgetGuiDocument* MainWindow::currentWidgetGuiDocument() const -{ - return this->widgetGuiDocument(this->currentDocumentIndex()); -} - -QWidget* MainWindow::findLeftHeaderPlaceHolder() const -{ - return m_ui->widget_LeftHeader->findChild( - "LeftHeaderPlaceHolder", Qt::FindDirectChildrenOnly - ); -} - -QWidget* MainWindow::recreateLeftHeaderPlaceHolder() -{ - QWidget* placeHolder = this->findLeftHeaderPlaceHolder(); - delete placeHolder; - placeHolder = new QWidget(m_ui->widget_LeftHeader); - placeHolder->setObjectName("LeftHeaderPlaceHolder"); - auto layoutPlaceHolder = new QHBoxLayout(placeHolder); - layoutPlaceHolder->setContentsMargins(0, 0, 0, 0); - layoutPlaceHolder->setSpacing(0); - m_ui->Layout_WidgetLeftHeader->insertWidget(2, placeHolder); - return placeHolder; -} - -QMenu* MainWindow::createMenuModelTreeSettings() -{ - auto menu = new QMenu(this->findLeftHeaderPlaceHolder()); - menu->setToolTipsVisible(true); - - // Link with document selector - auto appModule = AppModule::get(); - QAction* action = menu->addAction(to_QString(appModule->properties()->linkWithDocumentSelector.name().tr())); - action->setCheckable(true); - QObject::connect(action, &QAction::triggered, this, [=](bool on) { - appModule->properties()->linkWithDocumentSelector.setValue(on); }); - - // Model tree user actions - menu->addSeparator(); - const WidgetModelTree_UserActions userActions = m_ui->widget_ModelTree->createUserActions(menu); - for (QAction* usrAction : userActions.items) - menu->addAction(usrAction); - - // Sync before menu show - QObject::connect(menu, &QMenu::aboutToShow, this, [=]{ - action->setChecked(appModule->properties()->linkWithDocumentSelector); - if (userActions.fnSyncItems) - userActions.fnSyncItems(); - }); - - return menu; } -Command* MainWindow::getCommand(std::string_view name) const +WidgetMainHome* MainWindow::widgetPageHome() const { - auto it = m_mapCommand.find(name); - return it != m_mapCommand.cend() ? it->second : nullptr; + auto it = m_mapWidgetPage.find(IAppContext::Page::Home); + assert(it != m_mapWidgetPage.cend()); + return dynamic_cast(it->second); } -QAction* MainWindow::getCommandAction(std::string_view name) const +WidgetMainControl* MainWindow::widgetPageDocuments() const { - auto cmd = this->getCommand(name); - return cmd ? cmd->action() : nullptr; + auto it = m_mapWidgetPage.find(IAppContext::Page::Documents); + assert(it != m_mapWidgetPage.cend()); + return dynamic_cast(it->second); } } // namespace Mayo diff --git a/src/app/mainwindow.h b/src/app/mainwindow.h index f7a596ad..31ef198a 100644 --- a/src/app/mainwindow.h +++ b/src/app/mainwindow.h @@ -6,23 +6,21 @@ #pragma once +#include "commands_api.h" #include "../base/filepath.h" #include "../base/messenger.h" -#include "../base/property.h" #include "../base/task_manager.h" #include "../base/text_id.h" #include -#include #include -class QFileInfo; namespace Mayo { -class Command; class GuiApplication; class GuiDocument; -class IAppContext; -class WidgetGuiDocument; +class IWidgetMainPage; +class WidgetMainControl; +class WidgetMainHome; // Provides the root widget of the application GUI // It creates and owns the various available commands(actions) @@ -33,63 +31,38 @@ class MainWindow : public QMainWindow { MainWindow(GuiApplication* guiApp, QWidget* parent = nullptr); ~MainWindow(); - void openDocument(const FilePath& fp); void openDocumentsFromList(Span listFilePath); - bool eventFilter(QObject* watched, QEvent* event) override; - protected: void showEvent(QShowEvent* event) override; private: + void addPage(IAppContext::Page page, IWidgetMainPage* pageWidget); + void createCommands(); void createMenus(); + template void addCommand(Args... p) { + m_cmdContainer.addNamedCommand(std::forward(p)...); + } - Command* getCommand(std::string_view name) const; - QAction* getCommandAction(std::string_view name) const; - template CmdType* addCommand(std::string_view name, Args... p); - - void onApplicationItemSelectionChanged(); void onOperationFinished(bool ok, const QString& msg); void onGuiDocumentAdded(GuiDocument* guiDoc); - void onWidgetFileSystemLocationActivated(const QFileInfo& loc); - void onLeftContentsPageChanged(int pageId); - void onCurrentDocumentIndexChanged(int idx); + void onMessage(Messenger::MessageType msgType, const QString& text); void updateControlsActivation(); - int currentDocumentIndex() const; - void setCurrentDocumentIndex(int idx); - - WidgetGuiDocument* widgetGuiDocument(int idx) const; - WidgetGuiDocument* currentWidgetGuiDocument() const; - QWidget* findLeftHeaderPlaceHolder() const; - QWidget* recreateLeftHeaderPlaceHolder(); - QMenu* createMenuModelTreeSettings(); + WidgetMainHome* widgetPageHome() const; + WidgetMainControl* widgetPageDocuments() const; friend class AppContext; IAppContext* m_appContext = nullptr; GuiApplication* m_guiApp = nullptr; + CommandContainer m_cmdContainer; TaskManager m_taskMgr; class Ui_MainWindow* m_ui = nullptr; - std::unordered_map m_mapCommand; - std::unique_ptr m_ptrCurrentNodeDataProperties; - std::unique_ptr m_ptrCurrentNodeGraphicsProperties; + std::unordered_map m_mapWidgetPage; }; - - -// -- -// -- Implementation -// -- - -template CmdType* MainWindow::addCommand(std::string_view name, Args... p) -{ - auto cmd = new CmdType(m_appContext, p...); - m_mapCommand.insert({ name, cmd }); - return cmd; -} - } // namespace Mayo diff --git a/src/app/mainwindow.ui b/src/app/mainwindow.ui index d0cf6e20..dc2ab8b7 100644 --- a/src/app/mainwindow.ui +++ b/src/app/mainwindow.ui @@ -33,519 +33,8 @@ - 0 + -1 - - - - 20 - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - :/images/appicon_128.png - - - Qt::AlignHCenter|Qt::AlignTop - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 40 - - - - - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Horizontal - - - false - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 1 - - - 0 - - - 0 - - - 4 - - - 0 - - - - - - 1 - 0 - - - - - 0 - 22 - - - - - Model tree - - - - - Opened documents - - - - - File system - - - - - - - - QFrame::Plain - - - Qt::Vertical - - - - - - - Close Left Side Bar - - - - :/images/themes/classic/left-arrow-cross_16.png:/images/themes/classic/left-arrow-cross_16.png - - - true - - - - - - - - - - 0 - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::Vertical - - - - - 0 - 1 - - - - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Qt::ScrollBarAlwaysOff - - - QAbstractItemView::NoEditTriggers - - - Qt::ElideMiddle - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - - - - - - - - - - - - 0 - - - 1 - - - 0 - - - 0 - - - 1 - - - - - - 1 - - - 2 - - - 0 - - - 0 - - - 0 - - - - - - :/images/themes/classic/back_32.png:/images/themes/classic/back_32.png - - - - 12 - 12 - - - - true - - - - - - - - :/images/themes/classic/next_32.png:/images/themes/classic/next_32.png - - - - 12 - 12 - - - - true - - - - - - - - 0 - 22 - - - - QComboBox::AdjustToContents - - - - - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - :/images/themes/classic/cross_32.png:/images/themes/classic/cross_32.png - - - - 12 - 12 - - - - true - - - - - - - QFrame::Plain - - - Qt::Vertical - - - - - - - - 1 - 0 - - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - 0 - - - - - X= - - - - - - - ? - - - - - - - - - 0 - - - - - Y= - - - - - - - ? - - - - - - - - - 0 - - - - - Z= - - - - - - - ? - - - - - - - - - - - - - - - - 2 - 0 - - - - - - - - - - @@ -592,34 +81,6 @@ - - - WidgetModelTree - QWidget -
widget_model_tree.h
- 1 -
- - WidgetFileSystem - QWidget -
widget_file_system.h
- 1 -
- - WidgetPropertiesEditor - QWidget -
widget_properties_editor.h
- 1 -
- - WidgetHomeFiles - QWidget -
widget_home_files.h
- 1 -
-
- - - + diff --git a/src/app/qtgui_utils.cpp b/src/app/qtgui_utils.cpp index 776e6930..e1cf70b2 100644 --- a/src/app/qtgui_utils.cpp +++ b/src/app/qtgui_utils.cpp @@ -56,7 +56,8 @@ QColor lerp(const QColor& a, const QColor& b, double t) MathUtils::lerp(a.red(), b.red(), t), MathUtils::lerp(a.green(), b.green(), t), MathUtils::lerp(a.blue(), b.blue(), t), - MathUtils::lerp(a.alpha(), b.alpha(), t)); + MathUtils::lerp(a.alpha(), b.alpha(), t) + ); } QColor linearColorAt(const QGradient& gradient, double t) diff --git a/src/app/widget_main_control.cpp b/src/app/widget_main_control.cpp new file mode 100644 index 00000000..51eca635 --- /dev/null +++ b/src/app/widget_main_control.cpp @@ -0,0 +1,419 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#include "widget_main_control.h" +#include "ui_widget_main_control.h" + +#include "../base/application.h" +#include "../graphics/graphics_utils.h" +#include "../gui/gui_application.h" + +#include "app_module.h" +#include "commands_api.h" +#include "commands_file.h" +#include "commands_window.h" +#include "document_property_group.h" +#include "filepath_conv.h" +#include "gui_document_list_model.h" +#include "item_view_buttons.h" +#include "qstring_conv.h" +#include "theme.h" +#include "widget_file_system.h" +#include "widget_gui_document.h" +#include "widget_model_tree.h" +#include "widget_occ_view.h" +#include "widget_properties_editor.h" + +#include +#include +#include + +namespace Mayo { + +WidgetMainControl::WidgetMainControl(GuiApplication* guiApp, QWidget* parent) + : IWidgetMainPage(parent), + m_ui(new Ui_WidgetMainControl), + m_guiApp(guiApp) +{ + assert(m_guiApp != nullptr); + + m_ui->setupUi(this); + + m_ui->widget_ModelTree->registerGuiApplication(guiApp); + + m_ui->splitter_Main->setChildrenCollapsible(false); + m_ui->splitter_Main->setStretchFactor(0, 1); + m_ui->splitter_Main->setStretchFactor(1, 3); + + m_ui->splitter_ModelTree->setStretchFactor(0, 1); + m_ui->splitter_ModelTree->setStretchFactor(1, 2); + + m_ui->stack_LeftContents->setCurrentIndex(0); + + m_ui->widget_Properties->setRowHeightFactor(1.4); + m_ui->widget_Properties->clear(); + + mayoTheme()->setupHeaderComboBox(m_ui->combo_LeftContents); + mayoTheme()->setupHeaderComboBox(m_ui->combo_GuiDocuments); + + // "Window" actions and navigation in documents + QObject::connect( + m_ui->combo_GuiDocuments, qOverload(&QComboBox::currentIndexChanged), + this, &WidgetMainControl::onCurrentDocumentIndexChanged + ); + QObject::connect( + m_ui->widget_FileSystem, &WidgetFileSystem::locationActivated, + this, &WidgetMainControl::onWidgetFileSystemLocationActivated + ); + // ... + QObject::connect( + m_ui->combo_LeftContents, qOverload(&QComboBox::currentIndexChanged), + this, &WidgetMainControl::onLeftContentsPageChanged + ); + QObject::connect( + m_ui->listView_OpenedDocuments, &QListView::clicked, + this, [=](const QModelIndex& index) { this->setCurrentDocumentIndex(index.row()); } + ); + + guiApp->application()->signalDocumentFilePathChanged.connectSlot([=](const DocumentPtr& doc, const FilePath& fp) { + if (this->currentWidgetGuiDocument()->documentIdentifier() == doc->identifier()) + m_ui->widget_FileSystem->setLocation(filepathTo(fp)); + }); + guiApp->selectionModel()->signalChanged.connectSlot(&WidgetMainControl::onApplicationItemSelectionChanged, this); + guiApp->signalGuiDocumentAdded.connectSlot(&WidgetMainControl::onGuiDocumentAdded, this); + + // Creation of annex objects + m_listViewBtns = new ItemViewButtons(m_ui->listView_OpenedDocuments, this); + m_listViewBtns->installDefaultItemDelegate(); + + // BEWARE MainWindow::onGuiDocumentAdded() must be called before + // MainWindow::onCurrentDocumentIndexChanged() + auto guiDocModel = new GuiDocumentListModel(guiApp, this); + m_ui->combo_GuiDocuments->setModel(guiDocModel); + m_ui->listView_OpenedDocuments->setModel(guiDocModel); + + // Finalize setup + m_ui->widget_LeftHeader->installEventFilter(this); + m_ui->widget_ControlGuiDocuments->installEventFilter(this); + m_ui->stack_GuiDocuments->installEventFilter(this); + this->onLeftContentsPageChanged(m_ui->stack_LeftContents->currentIndex()); + m_ui->widget_MouseCoords->hide(); + + this->onCurrentDocumentIndexChanged(-1); +} + +WidgetMainControl::~WidgetMainControl() +{ + delete m_ui; +} + +void WidgetMainControl::initialize(const CommandContainer* cmdContainer) +{ + assert(cmdContainer != nullptr); + + m_appContext = cmdContainer->appContext(); + auto fnFindAction = [=](std::string_view cmdName) { + QAction* action = cmdContainer->findCommandAction(cmdName); + assert(action != nullptr); + return action; + }; + m_ui->btn_PreviousGuiDocument->setDefaultAction(fnFindAction(CommandPreviousDocument::Name)); + m_ui->btn_NextGuiDocument->setDefaultAction(fnFindAction(CommandNextDocument::Name)); + m_ui->btn_CloseGuiDocument->setDefaultAction(fnFindAction(CommandCloseCurrentDocument::Name)); + m_ui->btn_CloseLeftSideBar->setDefaultAction(fnFindAction(CommandLeftSidebarWidgetToggle::Name)); + + // Opened documents GUI + auto actionCloseDoc = fnFindAction(CommandCloseCurrentDocument::Name); + m_listViewBtns->addButton(1, actionCloseDoc->icon(), actionCloseDoc->toolTip()); + m_listViewBtns->setButtonDetection(1, -1, QVariant()); + m_listViewBtns->setButtonDisplayColumn(1, 0); + m_listViewBtns->setButtonDisplayModes(1, ItemViewButtons::DisplayOnDetection); + m_listViewBtns->setButtonItemSide(1, ItemViewButtons::ItemRightSide); + const int iconSize = this->style()->pixelMetric(QStyle::PM_ListViewIconSize); + m_listViewBtns->setButtonIconSize(1, QSize(iconSize * 0.66, iconSize * 0.66)); + QObject::connect(m_listViewBtns, &ItemViewButtons::buttonClicked, this, [=](int btnId, QModelIndex index) { + if (btnId == 1) { + assert(this->widgetGuiDocument(index.row()) != nullptr); + FileCommandTools::closeDocument( + cmdContainer->appContext(), + this->widgetGuiDocument(index.row())->documentIdentifier() + ); + } + }); +} + +void WidgetMainControl::updatePageControlsActivation() +{ + const int appDocumentsCount = m_guiApp->application()->documentCount(); + const bool appDocumentsEmpty = appDocumentsCount == 0; + m_ui->combo_GuiDocuments->setEnabled(!appDocumentsEmpty); +} + +QWidget* WidgetMainControl::widgetLeftSideBar() const +{ + return m_ui->widget_Left; +} + +bool WidgetMainControl::eventFilter(QObject* watched, QEvent* event) +{ + auto fnSizeBtn = [](const QWidget* container, const QWidget* widgetHeightRef) { + const int btnSideLen = widgetHeightRef->frameGeometry().height(); + const QList listBtn = container->findChildren(); + for (QAbstractButton* btn : listBtn) + btn->setFixedSize(btnSideLen, btnSideLen); + }; + const QEvent::Type eventType = event->type(); + if (watched == m_ui->widget_ControlGuiDocuments && eventType == QEvent::Show) { + fnSizeBtn(m_ui->widget_ControlGuiDocuments, m_ui->combo_GuiDocuments); + return true; + } + + if (watched == m_ui->widget_LeftHeader && eventType == QEvent::Show) { + fnSizeBtn(m_ui->widget_LeftHeader, m_ui->combo_LeftContents); + return true; + } + + if (watched == m_ui->stack_GuiDocuments) { + if (eventType == QEvent::Enter || eventType == QEvent::Leave) { + m_ui->widget_MouseCoords->setHidden(eventType == QEvent::Leave); + return true; + } + } + + return false; +} + +QMenu* WidgetMainControl::createMenuModelTreeSettings() +{ + auto menu = new QMenu(this->findLeftHeaderPlaceHolder()); + menu->setToolTipsVisible(true); + + // Link with document selector + auto appModule = AppModule::get(); + QAction* action = menu->addAction(to_QString(appModule->properties()->linkWithDocumentSelector.name().tr())); + action->setCheckable(true); + QObject::connect(action, &QAction::triggered, this, [=](bool on) { + appModule->properties()->linkWithDocumentSelector.setValue(on); + }); + + // Model tree user actions + menu->addSeparator(); + const WidgetModelTree_UserActions userActions = m_ui->widget_ModelTree->createUserActions(menu); + for (QAction* usrAction : userActions.items) + menu->addAction(usrAction); + + // Sync before menu show + QObject::connect(menu, &QMenu::aboutToShow, this, [=]{ + action->setChecked(appModule->properties()->linkWithDocumentSelector); + if (userActions.fnSyncItems) + userActions.fnSyncItems(); + }); + + return menu; +} + +void WidgetMainControl::onApplicationItemSelectionChanged() +{ + WidgetModelTree* uiModelTree = m_ui->widget_ModelTree; + WidgetPropertiesEditor* uiProps = m_ui->widget_Properties; + + uiProps->clear(); + Span spanAppItem = m_guiApp->selectionModel()->selectedItems(); + if (spanAppItem.size() == 1) { + const ApplicationItem& appItem = spanAppItem.front(); + if (appItem.isDocument()) { + auto dataProps = new DocumentPropertyGroup(appItem.document()); + uiProps->editProperties(dataProps, uiProps->addGroup(tr("Data"))); + m_ptrCurrentNodeDataProperties.reset(dataProps); + } + else if (appItem.isDocumentTreeNode()) { + const DocumentTreeNode& docTreeNode = appItem.documentTreeNode(); + auto dataProps = AppModule::get()->properties(docTreeNode); + if (dataProps) { + uiProps->editProperties(dataProps.get(), uiProps->addGroup(tr("Data"))); + dataProps->signalPropertyChanged.connectSlot([=]{ uiModelTree->refreshItemText(appItem); }); + m_ptrCurrentNodeDataProperties = std::move(dataProps); + } + + GuiDocument* guiDoc = m_guiApp->findGuiDocument(appItem.document()); + std::vector vecGfxObject; + guiDoc->foreachGraphicsObject(docTreeNode.id(), [&](GraphicsObjectPtr gfxObject) { + vecGfxObject.push_back(std::move(gfxObject)); + }); + auto commonGfxDriver = GraphicsObjectDriver::getCommon(vecGfxObject); + if (commonGfxDriver) { + auto gfxProps = commonGfxDriver->properties(vecGfxObject); + if (gfxProps) { + uiProps->editProperties(gfxProps.get(), uiProps->addGroup(tr("Graphics"))); + gfxProps->signalPropertyChanged.connectSlot([=]{ guiDoc->graphicsScene()->redraw(); }); + m_ptrCurrentNodeGraphicsProperties = std::move(gfxProps); + } + } + } + + auto app = m_guiApp->application(); + if (AppModule::get()->properties()->linkWithDocumentSelector) { + const int index = app->findIndexOfDocument(appItem.document()); + if (index != -1) + this->setCurrentDocumentIndex(index); + } + } + else { + // TODO + uiProps->clear(); + } + + emit this->updateGlobalControlsActivationRequired(); +} + + +void WidgetMainControl::onLeftContentsPageChanged(int pageId) +{ + m_ui->stack_LeftContents->setCurrentIndex(pageId); + QWidget* placeHolder = this->recreateLeftHeaderPlaceHolder(); + if (m_ui->stack_LeftContents->currentWidget() == m_ui->page_ModelTree && placeHolder) { + const int btnSideLen = m_ui->combo_LeftContents->frameGeometry().height(); + auto btnSettings = new QToolButton(placeHolder); + btnSettings->setAutoRaise(true); + btnSettings->setFixedSize(btnSideLen, btnSideLen); + btnSettings->setIcon(mayoTheme()->icon(Theme::Icon::Gear)); + btnSettings->setToolTip(tr("Options")); + placeHolder->layout()->addWidget(btnSettings); + btnSettings->setMenu(this->createMenuModelTreeSettings()); + btnSettings->setPopupMode(QToolButton::InstantPopup); + } + else { + delete placeHolder; + } +} + +QWidget* WidgetMainControl::findLeftHeaderPlaceHolder() const +{ + return m_ui->widget_LeftHeader->findChild( + "LeftHeaderPlaceHolder", Qt::FindDirectChildrenOnly + ); +} + +QWidget* WidgetMainControl::recreateLeftHeaderPlaceHolder() +{ + QWidget* placeHolder = this->findLeftHeaderPlaceHolder(); + delete placeHolder; + placeHolder = new QWidget(m_ui->widget_LeftHeader); + placeHolder->setObjectName("LeftHeaderPlaceHolder"); + auto layoutPlaceHolder = new QHBoxLayout(placeHolder); + layoutPlaceHolder->setContentsMargins(0, 0, 0, 0); + layoutPlaceHolder->setSpacing(0); + m_ui->Layout_WidgetLeftHeader->insertWidget(2, placeHolder); + return placeHolder; +} + +WidgetGuiDocument* WidgetMainControl::widgetGuiDocument(int idx) const +{ + assert(idx == -1 || (0 <= idx && idx < m_ui->stack_GuiDocuments->count())); + return qobject_cast(m_ui->stack_GuiDocuments->widget(idx)); +} + +WidgetGuiDocument* WidgetMainControl::currentWidgetGuiDocument() const +{ + return this->widgetGuiDocument(this->currentDocumentIndex()); +} + +int WidgetMainControl::indexOfWidgetGuiDocument(WidgetGuiDocument* widgetDoc) const +{ + return m_ui->stack_GuiDocuments->indexOf(widgetDoc); +} + +void WidgetMainControl::removeWidgetGuiDocument(WidgetGuiDocument* widgetDoc) +{ + if (widgetDoc) { + m_ui->stack_GuiDocuments->removeWidget(widgetDoc); + widgetDoc->deleteLater(); + } +} + +int WidgetMainControl::widgetGuiDocumentCount() const +{ + return m_ui->stack_GuiDocuments->count(); +} + +void WidgetMainControl::onGuiDocumentAdded(GuiDocument* guiDoc) +{ + auto gfxScene = guiDoc->graphicsScene(); + + // Configure 3D view behavior with respect to application settings + auto appModule = AppModule::get(); + auto appProps = appModule->properties(); + auto widget = new WidgetGuiDocument(guiDoc); + guiDoc->setDevicePixelRatio(widget->devicePixelRatioF()); + auto widgetCtrl = widget->controller(); + widgetCtrl->setInstantZoomFactor(appProps->instantZoomFactor); + widgetCtrl->setNavigationStyle(appProps->navigationStyle); + if (appProps->defaultShowOriginTrihedron) { + guiDoc->toggleOriginTrihedronVisibility(); + gfxScene->redraw(); + } + + appModule->settings()->signalChanged.connectSlot([=](const Property* setting) { + if (setting == &appProps->instantZoomFactor) + widgetCtrl->setInstantZoomFactor(appProps->instantZoomFactor); + else if (setting == &appProps->navigationStyle) + widgetCtrl->setNavigationStyle(appProps->navigationStyle); + }); + + // React to mouse move in 3D view: + // * update highlighting + // * compute and display 3D mouse coordinates(by silent picking) + widgetCtrl->signalMouseMoved.connectSlot([=](int xPos, int yPos) { + const double dpRatio = this->devicePixelRatioF(); + gfxScene->highlightAt(xPos * dpRatio, yPos * dpRatio, guiDoc->v3dView()); + widget->view()->redraw(); + auto selector = gfxScene->mainSelector(); + selector->Pick(xPos, yPos, guiDoc->v3dView()); + const gp_Pnt pos3d = + selector->NbPicked() > 0 ? + selector->PickedPoint(1) : + GraphicsUtils::V3dView_to3dPosition(guiDoc->v3dView(), xPos, yPos); + m_ui->label_ValuePosX->setText(QString::number(pos3d.X(), 'f', 3)); + m_ui->label_ValuePosY->setText(QString::number(pos3d.Y(), 'f', 3)); + m_ui->label_ValuePosZ->setText(QString::number(pos3d.Z(), 'f', 3)); + }); + + m_ui->stack_GuiDocuments->addWidget(widget); + const int newDocIndex = m_guiApp->application()->documentCount() - 1; + QTimer::singleShot(0, this, [=]{ this->setCurrentDocumentIndex(newDocIndex); }); +} + +int WidgetMainControl::currentDocumentIndex() const +{ + return m_ui->combo_GuiDocuments->currentIndex(); +} + +void WidgetMainControl::setCurrentDocumentIndex(int idx) +{ + m_ui->combo_GuiDocuments->setCurrentIndex(idx); +} + +void WidgetMainControl::onWidgetFileSystemLocationActivated(const QFileInfo& loc) +{ + FileCommandTools::openDocument(m_appContext, filepathFrom(loc)); +} + +void WidgetMainControl::onCurrentDocumentIndexChanged(int idx) +{ + m_ui->stack_GuiDocuments->setCurrentIndex(idx); + QAbstractItemView* view = m_ui->listView_OpenedDocuments; + view->setCurrentIndex(view->model()->index(idx, 0)); + + emit this->updateGlobalControlsActivationRequired(); + + const DocumentPtr docPtr = m_guiApp->application()->findDocumentByIndex(idx); + const FilePath docFilePath = docPtr ? docPtr->filePath() : FilePath(); + m_ui->widget_FileSystem->setLocation(filepathTo(docFilePath)); + + emit this->currentDocumentIndexChanged(idx); +} + +} // namespace Mayo diff --git a/src/app/widget_main_control.h b/src/app/widget_main_control.h new file mode 100644 index 00000000..9c9d5270 --- /dev/null +++ b/src/app/widget_main_control.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#pragma once + +#include "../base/property.h" +#include "iwidget_main_page.h" + +#include + +class QFileInfo; +class QMenu; + +namespace Mayo { + +class IAppContext; +class CommandContainer; +class GuiApplication; +class GuiDocument; +class ItemViewButtons; +class WidgetGuiDocument; + +// Provides a main page to control opened documents in the application +// Comes with the model tree, 3D view associated to each document, ... +class WidgetMainControl : public IWidgetMainPage { + Q_OBJECT +public: + WidgetMainControl(GuiApplication* guiApp, QWidget* parent = nullptr); + ~WidgetMainControl(); + + void initialize(const CommandContainer* cmdContainer) override; + void updatePageControlsActivation() override; + + // Widget at the left side of the app providing access to the model tree, file system, ... + QWidget* widgetLeftSideBar() const; + + int widgetGuiDocumentCount() const; + WidgetGuiDocument* widgetGuiDocument(int idx) const; + WidgetGuiDocument* currentWidgetGuiDocument() const; + int indexOfWidgetGuiDocument(WidgetGuiDocument* widgetDoc) const; + void removeWidgetGuiDocument(WidgetGuiDocument* widgetDoc); + + int currentDocumentIndex() const; + void setCurrentDocumentIndex(int idx); + + bool eventFilter(QObject* watched, QEvent* event) override; + +signals: + void currentDocumentIndexChanged(int docIndex); + +private: + QMenu* createMenuModelTreeSettings(); + + void onApplicationItemSelectionChanged(); + void onLeftContentsPageChanged(int pageId); + void onWidgetFileSystemLocationActivated(const QFileInfo& loc); + + QWidget* findLeftHeaderPlaceHolder() const; + QWidget* recreateLeftHeaderPlaceHolder(); + + void onGuiDocumentAdded(GuiDocument* guiDoc); + + void onCurrentDocumentIndexChanged(int idx); + + class Ui_WidgetMainControl* m_ui = nullptr; + GuiApplication* m_guiApp = nullptr; + IAppContext* m_appContext = nullptr; + ItemViewButtons* m_listViewBtns = nullptr; + std::unique_ptr m_ptrCurrentNodeDataProperties; + std::unique_ptr m_ptrCurrentNodeGraphicsProperties; +}; + +} // namespace Mayo diff --git a/src/app/widget_main_control.ui b/src/app/widget_main_control.ui new file mode 100644 index 00000000..27ac8e57 --- /dev/null +++ b/src/app/widget_main_control.ui @@ -0,0 +1,491 @@ + + + Mayo::WidgetMainControl + + + + 0 + 0 + 947 + 560 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Horizontal + + + false + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 1 + + + 0 + + + 0 + + + 4 + + + 0 + + + + + + 1 + 0 + + + + + 0 + 22 + + + + + Model tree + + + + + Opened documents + + + + + File system + + + + + + + + QFrame::Plain + + + Qt::Vertical + + + + + + + Close Left Side Bar + + + + :/images/themes/classic/left-arrow-cross_16.png:/images/themes/classic/left-arrow-cross_16.png + + + true + + + + + + + + + + 0 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::Vertical + + + + + 0 + 1 + + + + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + Qt::ScrollBarAlwaysOff + + + QAbstractItemView::NoEditTriggers + + + Qt::ElideMiddle + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + + + + + + 0 + + + 1 + + + 0 + + + 0 + + + 1 + + + + + + 1 + + + 2 + + + 0 + + + 0 + + + 0 + + + + + + :/images/themes/classic/back_32.png:/images/themes/classic/back_32.png + + + + 12 + 12 + + + + true + + + + + + + + :/images/themes/classic/next_32.png:/images/themes/classic/next_32.png + + + + 12 + 12 + + + + true + + + + + + + + 0 + 22 + + + + QComboBox::AdjustToContents + + + + + + + QFrame::Plain + + + Qt::Vertical + + + + + + + + :/images/themes/classic/cross_32.png:/images/themes/classic/cross_32.png + + + + 12 + 12 + + + + true + + + + + + + QFrame::Plain + + + Qt::Vertical + + + + + + + + 1 + 0 + + + + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + 0 + + + + + X= + + + + + + + ? + + + + + + + + + 0 + + + + + Y= + + + + + + + ? + + + + + + + + + 0 + + + + + Z= + + + + + + + ? + + + + + + + + + + + + + + + + 2 + 0 + + + + + + + + + + + + + WidgetModelTree + QWidget +
widget_model_tree.h
+ 1 +
+ + WidgetFileSystem + QWidget +
widget_file_system.h
+ 1 +
+ + WidgetPropertiesEditor + QWidget +
widget_properties_editor.h
+ 1 +
+
+ + +
diff --git a/src/app/widget_main_home.cpp b/src/app/widget_main_home.cpp new file mode 100644 index 00000000..ce67353e --- /dev/null +++ b/src/app/widget_main_home.cpp @@ -0,0 +1,49 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#include "widget_main_home.h" +#include "ui_widget_main_home.h" + +#include "commands_file.h" + +namespace Mayo { + +WidgetMainHome::WidgetMainHome(QWidget* parent) + : IWidgetMainPage(parent), + m_ui(new Ui::WidgetMainHome) +{ + m_ui->setupUi(this); +} + +WidgetMainHome::~WidgetMainHome() +{ + delete m_ui; +} + +void WidgetMainHome::initialize(const CommandContainer* cmdContainer) +{ + assert(cmdContainer != nullptr); + IAppContext* appContext = cmdContainer->appContext(); + + QObject::connect( + m_ui->widget_HomeFiles, &WidgetHomeFiles::newDocumentRequested, + cmdContainer->findCommand(CommandNewDocument::Name), &Command::execute + ); + QObject::connect( + m_ui->widget_HomeFiles, &WidgetHomeFiles::openDocumentsRequested, + cmdContainer->findCommand(CommandOpenDocuments::Name), &Command::execute + ); + QObject::connect( + m_ui->widget_HomeFiles, &WidgetHomeFiles::recentFileOpenRequested, + this, [=](const FilePath& fp) { FileCommandTools::openDocument(appContext, fp); } + ); +} + +void WidgetMainHome::updatePageControlsActivation() +{ +} + +} // namespace Mayo diff --git a/src/app/widget_main_home.h b/src/app/widget_main_home.h new file mode 100644 index 00000000..1bb226fc --- /dev/null +++ b/src/app/widget_main_home.h @@ -0,0 +1,28 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#pragma once + +#include "iwidget_main_page.h" + +namespace Mayo { + +// Provides the home page of the application +// Gives access to recent files as a 2D grid +class WidgetMainHome : public IWidgetMainPage { + Q_OBJECT +public: + WidgetMainHome(QWidget* parent = nullptr); + ~WidgetMainHome(); + + void initialize(const CommandContainer* cmdContainer) override; + void updatePageControlsActivation() override; + +private: + class Ui_WidgetMainHome* m_ui = nullptr; +}; + +} // namespace Mayo diff --git a/src/app/widget_main_home.ui b/src/app/widget_main_home.ui new file mode 100644 index 00000000..da172417 --- /dev/null +++ b/src/app/widget_main_home.ui @@ -0,0 +1,93 @@ + + + Mayo::WidgetMainHome + + + + 0 + 0 + 770 + 536 + + + + Form + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + :/images/appicon_128.png + + + Qt::AlignHCenter|Qt::AlignTop + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + + + + + + + + WidgetHomeFiles + QWidget +
widget_home_files.h
+ 1 +
+
+ + + + +
From abf759ddc8bc22501aa536ebb0fd70fc15161fc9 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 13 Jun 2023 12:41:02 +0200 Subject: [PATCH 26/92] CI: attempt to fix "Install Qt" step for Windows build --- .github/workflows/ci_windows.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index f90e3925..9c880c21 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -6,7 +6,8 @@ jobs: build-windows-msvc: strategy: matrix: - occ_version: [7.3.0, 7.4.0, 7.5.0, 7.6.0, 7.7.0] + #occ_version: [7.3.0, 7.4.0, 7.5.0, 7.6.0, 7.7.0] + occ_version: [7.7.0] runs-on: windows-latest From 8d6f99d9d5767567dcca7e1ca81be51a80df0ad4 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 13 Jun 2023 12:46:54 +0200 Subject: [PATCH 27/92] CI: update from @v2 to jurplel/install-qt-action@v3 --- .github/workflows/ci_linux.yml | 12 +++--------- .github/workflows/ci_macos.yml | 12 +++--------- .github/workflows/ci_windows.yml | 15 ++++----------- 3 files changed, 10 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 9120b496..d1291c2d 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -10,17 +10,11 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Cache Qt - id: cache-qt - uses: actions/cache@v1 - with: - path: ../Qt - key: ${{ runner.os }}-QtCache - - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: true + cache-key-prefix: ${{ runner.os }}-QtCache - name: Install OpenCascade run: | diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml index 41506592..7cbd6d3e 100644 --- a/.github/workflows/ci_macos.yml +++ b/.github/workflows/ci_macos.yml @@ -10,17 +10,11 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Cache Qt - id: cache-qt - uses: actions/cache@v1 - with: - path: ../Qt - key: ${{ runner.os }}-QtCache - - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: true + cache-key-prefix: ${{ runner.os }}-QtCache - name: Install OpenCascade run: | diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index 9c880c21..633bc631 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -6,8 +6,7 @@ jobs: build-windows-msvc: strategy: matrix: - #occ_version: [7.3.0, 7.4.0, 7.5.0, 7.6.0, 7.7.0] - occ_version: [7.7.0] + occ_version: [7.3.0, 7.4.0, 7.5.0, 7.6.0, 7.7.0] runs-on: windows-latest @@ -15,17 +14,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 - - name: Cache Qt - id: cache-qt - uses: actions/cache@v1 - with: - path: ../Qt - key: ${{ runner.os }}-QtCache - - name: Install Qt - uses: jurplel/install-qt-action@v2 + uses: jurplel/install-qt-action@v3 with: - cached: ${{ steps.cache-qt.outputs.cache-hit }} + cache: true + cache-key-prefix: ${{ runner.os }}-QtCache - name: Cache OpenCascade archive id: cache-occ From 5107d6b63e63c88602d27b1cdc35de63f87aeb52 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 13 Jun 2023 18:24:37 +0200 Subject: [PATCH 28/92] App: fix update of controls when MainWindow page changes --- src/app/commands_display.cpp | 67 ++++++++++-------------------------- src/app/commands_display.h | 30 ++++++++-------- src/app/commands_file.cpp | 6 ++-- src/app/commands_tools.cpp | 6 ++-- src/app/commands_window.cpp | 1 + src/app/dialog_options.cpp | 3 +- src/app/mainwindow.cpp | 27 +++++++++------ src/app/mainwindow.h | 2 ++ 8 files changed, 63 insertions(+), 79 deletions(-) diff --git a/src/app/commands_display.cpp b/src/app/commands_display.cpp index 7a7b8fd5..9cdea974 100644 --- a/src/app/commands_display.cpp +++ b/src/app/commands_display.cpp @@ -23,8 +23,19 @@ namespace Mayo { -CommandChangeProjection::CommandChangeProjection(IAppContext* context) +BaseCommandDisplay::BaseCommandDisplay(IAppContext* context) : Command(context) +{ +} + +bool BaseCommandDisplay::getEnabledStatus() const +{ + return this->app()->documentCount() != 0 + && this->context()->currentPage() == IAppContext::Page::Documents; +} + +CommandChangeProjection::CommandChangeProjection(IAppContext* context) + : BaseCommandDisplay(context) { m_actionOrtho = new QAction(Command::tr("Orthographic"), this); m_actionPersp = new QAction(Command::tr("Perspective"), this); @@ -67,11 +78,6 @@ void CommandChangeProjection::execute() { } -bool CommandChangeProjection::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - void CommandChangeProjection::onCurrentDocumentChanged() { const GuiDocument* guiDoc = this->currentGuiDocument(); @@ -89,7 +95,7 @@ void CommandChangeProjection::onCurrentDocumentChanged() } CommandChangeDisplayMode::CommandChangeDisplayMode(IAppContext* context) - : Command(context) + : BaseCommandDisplay(context) { auto action = new QAction(this); action->setText(Command::tr("Mode")); @@ -109,11 +115,6 @@ void CommandChangeDisplayMode::execute() { } -bool CommandChangeDisplayMode::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - void CommandChangeDisplayMode::recreateMenuDisplayMode() { QMenu* menu = this->action()->menu(); @@ -156,7 +157,7 @@ void CommandChangeDisplayMode::recreateMenuDisplayMode() } CommandToggleOriginTrihedron::CommandToggleOriginTrihedron(IAppContext* context) - : Command(context) + : BaseCommandDisplay(context) { auto action = new QAction(this); action->setText(Command::tr("Show Origin Trihedron")); @@ -180,11 +181,6 @@ void CommandToggleOriginTrihedron::execute() } } -bool CommandToggleOriginTrihedron::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - void CommandToggleOriginTrihedron::onCurrentDocumentChanged() { GuiDocument* guiDoc = this->currentGuiDocument(); @@ -199,7 +195,7 @@ void CommandToggleOriginTrihedron::onCurrentDocumentChanged() } CommandTogglePerformanceStats::CommandTogglePerformanceStats(IAppContext* context) - : Command(context) + : BaseCommandDisplay(context) { auto action = new QAction(this); action->setText(Command::tr("Show Performance Stats")); @@ -223,11 +219,6 @@ void CommandTogglePerformanceStats::execute() } } -bool CommandTogglePerformanceStats::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - void CommandTogglePerformanceStats::onCurrentDocumentChanged() { GuiDocument* guiDoc = this->currentGuiDocument(); @@ -242,7 +233,7 @@ void CommandTogglePerformanceStats::onCurrentDocumentChanged() } CommandZoomInCurrentDocument::CommandZoomInCurrentDocument(IAppContext* context) - : Command(context) + : BaseCommandDisplay(context) { auto action = new QAction(this); action->setText(Command::tr("Zoom In")); @@ -258,13 +249,8 @@ void CommandZoomInCurrentDocument::execute() ctrl->zoomIn(); } -bool CommandZoomInCurrentDocument::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - CommandZoomOutCurrentDocument::CommandZoomOutCurrentDocument(IAppContext* context) - : Command(context) + : BaseCommandDisplay(context) { auto action = new QAction(this); action->setText(Command::tr("Zoom Out")); @@ -280,13 +266,8 @@ void CommandZoomOutCurrentDocument::execute() ctrl->zoomOut(); } -bool CommandZoomOutCurrentDocument::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - CommandTurnViewCounterClockWise::CommandTurnViewCounterClockWise(IAppContext* context) - : Command(context) + : BaseCommandDisplay(context) { auto action = new QAction(this); action->setText(Command::tr("Turn Counter Clockwise")); @@ -303,13 +284,8 @@ void CommandTurnViewCounterClockWise::execute() ctrl->turn(V3d_Z, -increment); } -bool CommandTurnViewCounterClockWise::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - CommandTurnViewClockWise::CommandTurnViewClockWise(IAppContext* context) - : Command(context) + : BaseCommandDisplay(context) { auto action = new QAction(this); action->setText(Command::tr("Turn Clockwise")); @@ -326,9 +302,4 @@ void CommandTurnViewClockWise::execute() ctrl->turn(V3d_Z, increment); } -bool CommandTurnViewClockWise::getEnabledStatus() const -{ - return this->app()->documentCount() != 0; -} - } // namespace Mayo diff --git a/src/app/commands_display.h b/src/app/commands_display.h index 79b63260..7432fffc 100644 --- a/src/app/commands_display.h +++ b/src/app/commands_display.h @@ -14,11 +14,16 @@ class QMenu; namespace Mayo { -class CommandChangeProjection : public Command { +class BaseCommandDisplay : public Command { +public: + BaseCommandDisplay(IAppContext* context); + bool getEnabledStatus() const override; +}; + +class CommandChangeProjection : public BaseCommandDisplay { public: CommandChangeProjection(IAppContext* context); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "change-projection"; @@ -28,12 +33,11 @@ class CommandChangeProjection : public Command { QAction* m_actionPersp = nullptr; }; -class CommandChangeDisplayMode : public Command { +class CommandChangeDisplayMode : public BaseCommandDisplay { public: CommandChangeDisplayMode(IAppContext* context); CommandChangeDisplayMode(IAppContext* context, QMenu* containerMenu); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "change-display-mode"; @@ -41,11 +45,10 @@ class CommandChangeDisplayMode : public Command { void recreateMenuDisplayMode(); }; -class CommandToggleOriginTrihedron : public Command { +class CommandToggleOriginTrihedron : public BaseCommandDisplay { public: CommandToggleOriginTrihedron(IAppContext* context); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "toggle-origin-trihedron"; @@ -53,11 +56,10 @@ class CommandToggleOriginTrihedron : public Command { void onCurrentDocumentChanged(); }; -class CommandTogglePerformanceStats : public Command { +class CommandTogglePerformanceStats : public BaseCommandDisplay { public: CommandTogglePerformanceStats(IAppContext* context); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "toggle-performance-stats"; @@ -65,38 +67,34 @@ class CommandTogglePerformanceStats : public Command { void onCurrentDocumentChanged(); }; -class CommandZoomInCurrentDocument : public Command { +class CommandZoomInCurrentDocument : public BaseCommandDisplay { public: CommandZoomInCurrentDocument(IAppContext* context); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "current-doc-zoom-in"; }; -class CommandZoomOutCurrentDocument : public Command { +class CommandZoomOutCurrentDocument : public BaseCommandDisplay { public: CommandZoomOutCurrentDocument(IAppContext* context); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "current-doc-zoom-out"; }; -class CommandTurnViewCounterClockWise : public Command { +class CommandTurnViewCounterClockWise : public BaseCommandDisplay { public: CommandTurnViewCounterClockWise(IAppContext* context); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "current-doc-turn-view-ccw"; }; -class CommandTurnViewClockWise : public Command { +class CommandTurnViewClockWise : public BaseCommandDisplay { public: CommandTurnViewClockWise(IAppContext* context); void execute() override; - bool getEnabledStatus() const override; static constexpr std::string_view Name = "current-doc-turn-view-cw"; }; diff --git a/src/app/commands_file.cpp b/src/app/commands_file.cpp index d5e8e03d..32ab442a 100644 --- a/src/app/commands_file.cpp +++ b/src/app/commands_file.cpp @@ -386,7 +386,8 @@ void CommandImportInCurrentDocument::execute() bool CommandImportInCurrentDocument::getEnabledStatus() const { - return this->app()->documentCount() != 0; + return this->app()->documentCount() != 0 + && this->context()->currentPage() == IAppContext::Page::Documents; } CommandExportSelectedApplicationItems::CommandExportSelectedApplicationItems(IAppContext* context) @@ -447,7 +448,8 @@ void CommandExportSelectedApplicationItems::execute() bool CommandExportSelectedApplicationItems::getEnabledStatus() const { - return this->app()->documentCount() != 0; + return this->app()->documentCount() != 0 + && this->context()->currentPage() == IAppContext::Page::Documents; } CommandCloseCurrentDocument::CommandCloseCurrentDocument(IAppContext* context) diff --git a/src/app/commands_tools.cpp b/src/app/commands_tools.cpp index a8d52bb9..fd8af3c3 100644 --- a/src/app/commands_tools.cpp +++ b/src/app/commands_tools.cpp @@ -40,7 +40,8 @@ void CommandSaveViewImage::execute() bool CommandSaveViewImage::getEnabledStatus() const { - return this->app()->documentCount() != 0; + return this->app()->documentCount() != 0 + && this->context()->currentPage() == IAppContext::Page::Documents; } CommandInspectXde::CommandInspectXde(IAppContext* context) @@ -77,7 +78,8 @@ bool CommandInspectXde::getEnabledStatus() const !spanSelectedAppItem.empty() ? spanSelectedAppItem.front() : ApplicationItem(); return spanSelectedAppItem.size() == 1 && firstAppItem.isValid() - && firstAppItem.document()->isXCafDocument(); + && firstAppItem.document()->isXCafDocument() + && this->context()->currentPage() == IAppContext::Page::Documents; } CommandEditOptions::CommandEditOptions(IAppContext* context) diff --git a/src/app/commands_window.cpp b/src/app/commands_window.cpp index ddc0165e..5688a759 100644 --- a/src/app/commands_window.cpp +++ b/src/app/commands_window.cpp @@ -116,6 +116,7 @@ void CommandSwitchMainWidgetMode::execute() } this->context()->setCurrentPage(newPage); + this->context()->updateControlsEnabledStatus(); } bool CommandSwitchMainWidgetMode::getEnabledStatus() const diff --git a/src/app/dialog_options.cpp b/src/app/dialog_options.cpp index da01a316..10f147d4 100644 --- a/src/app/dialog_options.cpp +++ b/src/app/dialog_options.cpp @@ -251,7 +251,8 @@ DialogOptions::DialogOptions(Settings* settings, QWidget* parent) const QVariant variantNodeId = current.data(ItemSettingNodeId_Role); const QModelIndex indexFirst = settingsModel->index(0, 0); const QModelIndexList indexList = settingsModel->match( - indexFirst, ItemSettingNodeId_Role, variantNodeId, 1, Qt::MatchExactly); + indexFirst, ItemSettingNodeId_Role, variantNodeId, 1, Qt::MatchExactly + ); if (!indexList.isEmpty()) m_ui->listWidget_Settings->scrollTo(indexList.front(), QAbstractItemView::PositionAtTop); }); diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index c684a962..830fa0db 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -57,6 +57,7 @@ MainWindow::MainWindow(GuiApplication* guiApp, QWidget* parent) AppModule::get()->signalMessage.connectSlot(&MainWindow::onMessage, this); guiApp->signalGuiDocumentAdded.connectSlot(&MainWindow::onGuiDocumentAdded, this); + guiApp->signalGuiDocumentErased.connectSlot(&MainWindow::onGuiDocumentAdded, this); new DialogTaskManager(&m_taskMgr, this); @@ -232,6 +233,13 @@ void MainWindow::onGuiDocumentAdded(GuiDocument* guiDoc) fnConfigureHighlightStyle(gfxScene->drawerHighlight(Prs3d_TypeOfHighlight_LocalSelected).get()); fnConfigureHighlightStyle(gfxScene->drawerHighlight(Prs3d_TypeOfHighlight_Selected).get()); + this->updateCurrentPage(); + this->updateControlsActivation(); +} + +void MainWindow::onGuiDocumentErased(GuiDocument* /*guiDoc*/) +{ + this->updateCurrentPage(); this->updateControlsActivation(); } @@ -259,21 +267,20 @@ void MainWindow::openDocumentsFromList(Span listFilePath) void MainWindow::updateControlsActivation() { - const QWidget* currentPage = m_ui->stack_Main->currentWidget(); - const int appDocumentsCount = m_guiApp->application()->documentCount(); - const bool appDocumentsEmpty = appDocumentsCount == 0; - QWidget* newPage = - appDocumentsEmpty ? - static_cast(this->widgetPageHome()) - : static_cast(this->widgetPageDocuments()); - if (currentPage != newPage) - m_ui->stack_Main->setCurrentWidget(newPage); - m_cmdContainer.foreachCommand([](std::string_view, Command* cmd) { cmd->action()->setEnabled(cmd->getEnabledStatus()); }); } +void MainWindow::updateCurrentPage() +{ + const IAppContext::Page currentPage = m_appContext->currentPage(); + const bool appDocumentsEmpty = m_guiApp->guiDocuments().empty(); + const auto newPage = appDocumentsEmpty ? IAppContext::Page::Home : IAppContext::Page::Documents; + if (currentPage != newPage) + m_appContext->setCurrentPage(newPage); +} + WidgetMainHome* MainWindow::widgetPageHome() const { auto it = m_mapWidgetPage.find(IAppContext::Page::Home); diff --git a/src/app/mainwindow.h b/src/app/mainwindow.h index 31ef198a..c164e10e 100644 --- a/src/app/mainwindow.h +++ b/src/app/mainwindow.h @@ -47,10 +47,12 @@ class MainWindow : public QMainWindow { void onOperationFinished(bool ok, const QString& msg); void onGuiDocumentAdded(GuiDocument* guiDoc); + void onGuiDocumentErased(GuiDocument* guiDoc); void onMessage(Messenger::MessageType msgType, const QString& text); void updateControlsActivation(); + void updateCurrentPage(); WidgetMainHome* widgetPageHome() const; WidgetMainControl* widgetPageDocuments() const; From b9ed6663b4d37ad233fb89979f06498c09d157be Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Sun, 18 Jun 2023 11:12:18 +0200 Subject: [PATCH 29/92] App: fix enabled status of Previous/Next commands --- src/app/commands_window.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/app/commands_window.cpp b/src/app/commands_window.cpp index 5688a759..9b550f9a 100644 --- a/src/app/commands_window.cpp +++ b/src/app/commands_window.cpp @@ -169,7 +169,9 @@ void CommandPreviousDocument::execute() bool CommandPreviousDocument::getEnabledStatus() const { - return this->app()->documentCount() != 0 && this->currentDocumentIndex() > 0; + return this->app()->documentCount() != 0 + && this->context()->currentPage() == IAppContext::Page::Documents + && this->currentDocumentIndex() > 0; } CommandNextDocument::CommandNextDocument(IAppContext* context) @@ -192,7 +194,9 @@ void CommandNextDocument::execute() bool CommandNextDocument::getEnabledStatus() const { const int appDocumentCount = this->app()->documentCount(); - return appDocumentCount != 0 && this->currentDocumentIndex() < appDocumentCount - 1; + return appDocumentCount != 0 + && this->context()->currentPage() == IAppContext::Page::Documents + && this->currentDocumentIndex() < appDocumentCount - 1; } } // namespace Mayo From 0d6474b61d852939ae23b5edef2f14f0af8bf786 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 18 Jul 2023 18:48:06 +0200 Subject: [PATCH 30/92] QMake: add optional env.pri file --- .gitignore | 5 ++--- mayo.pro | 7 ++++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 39ce3cf0..96cf762e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ build-* *.user *.user.* -installer/setupvars.iss -installer/Output -custom.pri \ No newline at end of file +custom.pri +env.pri diff --git a/mayo.pro b/mayo.pro index a37f5e4f..e9f28f0d 100644 --- a/mayo.pro +++ b/mayo.pro @@ -116,6 +116,11 @@ OTHER_FILES += \ images/credits.txt \ scripts/bump-version.rb \ +# Optional developer-specific QMake pri file for environment related settings +exists($$PWD/env.pri) { + include($$PWD/env.pri) +} + # OpenCascade include(opencascade.pri) !isEmpty(OCC_VERSION_STR) { @@ -220,7 +225,7 @@ CONFIG(withtests) { DEFINES += MAYO_WITH_TESTS } -# Developer custom processing +# Optional developer-specific QMake pri file for custom processing exists($$PWD/custom.pri) { include($$PWD/custom.pri) } From 3a74b5fd2a906de3770089e4411b29ab4ccc5b1f Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 18 Jul 2023 00:31:38 +0200 Subject: [PATCH 31/92] App: add command to show system information Relates to GitHub #210 --- src/app/command_system_information.cpp | 409 +++++++++++++++++++++++++ src/app/commands_api.cpp | 4 +- src/app/commands_api.h | 8 +- src/app/commands_help.cpp | 6 +- src/app/commands_help.h | 10 + src/app/main.cpp | 16 +- src/app/mainwindow.cpp | 2 + src/app/qstring_conv.h | 10 + src/app/widget_occ_view_impl.cpp | 3 +- 9 files changed, 458 insertions(+), 10 deletions(-) create mode 100644 src/app/command_system_information.cpp diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp new file mode 100644 index 00000000..6d7611ae --- /dev/null +++ b/src/app/command_system_information.cpp @@ -0,0 +1,409 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#include "commands_help.h" + +#include "app_module.h" +#include "qstring_conv.h" +#include "qtwidgets_utils.h" +#include "../base/meta_enum.h" +#include "../base/filepath.h" +#include "../base/io_system.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// NOTICE for Linux/X11 +// Because of #define conflicts, OpenGL_Context.hxx must be included *before* QtGui/QOpenGLContext +// It also has to be included *after* QtCore/QTextStream +// Beware of these limitations when adding/removing inclusion of headers here +#include +#include + +#include +#include + +#ifdef HAVE_GMIO +# include +#endif + +#include + +namespace Mayo { + +CommandSystemInformation::CommandSystemInformation(IAppContext* context) + : Command(context) +{ + auto action = new QAction(this); + action->setText(Command::tr("System Information...")); + this->setAction(action); +} + +void CommandSystemInformation::execute() +{ + const QString text = CommandSystemInformation::data(); + + auto dlg = new QDialog(this->widgetMain()); + dlg->setWindowTitle(this->action()->text()); + dlg->resize(800 * dlg->devicePixelRatioF(), 600 * dlg->devicePixelRatioF()); + + auto textEdit = new QPlainTextEdit(dlg); + textEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); + textEdit->setReadOnly(true); + textEdit->setPlainText(text); + + auto btnBox = new QDialogButtonBox(dlg); + btnBox->addButton(QDialogButtonBox::Close); + auto btnCopy = btnBox->addButton(Command::tr("Copy to Clipboard"), QDialogButtonBox::ActionRole); + QObject::connect(btnCopy, &QAbstractButton::clicked, this, [=]{ + QGuiApplication::clipboard()->setText(text); + }); + QObject::connect(btnBox, &QDialogButtonBox::rejected, dlg, &QDialog::reject); + + auto layout = new QVBoxLayout(dlg); + layout->addWidget(textEdit); + layout->addWidget(btnBox); + + QtWidgetsUtils::asyncDialogExec(dlg); +} + +namespace { + +QTextStream& operator<<(QTextStream& str, bool v) +{ + str << (v ? "true" : "false"); + return str; +} + +QTextStream& operator<<(QTextStream& str, const QFont& f) +{ + str << '"' << f.family() << "\" " << f.pointSize(); + return str; +} + +QTextStream& operator<<(QTextStream& str, const QSize& sz) +{ + str << sz.width() << 'x' << sz.height(); + return str; +} + +QTextStream& operator<<(QTextStream& str, const QSizeF& sz) +{ + str << sz.width() << 'x' << sz.height(); + return str; +} + +QTextStream& operator<<(QTextStream& str, const QRect& r) +{ + str << '(' << r.x() << ", " << r.y() << ", " << r.size() << ")"; + return str; +} + +QTextStream& operator<<(QTextStream& str, std::string_view sv) +{ + str << to_QString(sv); + return str; +} + +const char indent[] = " "; +const char indentx2[] = " "; + +} // namespace + +static void dumpOpenGlInfo(QTextStream& str) +{ + QOpenGLContext qtContext; + if (!qtContext.create()) { + str << "Unable to create QOpenGLContext object" << '\n'; + return; + } + + QWindow window; + window.setSurfaceType(QSurface::OpenGLSurface); + window.create(); + qtContext.makeCurrent(&window); + + OpenGl_Context occContext; + if (!occContext.Init()) { + str << "Unable to initialize OpenGl_Context object" << '\n'; + return; + } + + TColStd_IndexedDataMapOfStringString dict; + occContext.DiagnosticInformation(dict, Graphic3d_DiagnosticInfo_Basic); + for (TColStd_IndexedDataMapOfStringString::Iterator it(dict); it.More(); it.Next()) + str << indent << to_QString(it.Key()) << ": " << to_QString(it.Value()) << '\n'; + + str << indent << "MaxDegreeOfAnisotropy: " << occContext.MaxDegreeOfAnisotropy() << '\n' + << indent << "MaxDrawBuffers: " << occContext.MaxDrawBuffers() << '\n' + << indent << "MaxClipPlanes: " << occContext.MaxClipPlanes() << '\n' + << indent << "HasRayTracing: " << occContext.HasRayTracing() << '\n' + << indent << "HasRayTracingTextures: " << occContext.HasRayTracingTextures() << '\n' + << indent << "HasRayTracingAdaptiveSampling: " << occContext.HasRayTracingAdaptiveSampling() << '\n' + << indent << "UseVBO: " << occContext.ToUseVbo() << '\n'; + +#if OCC_VERSION_HEX >= 0x070400 + str << indent << "MaxDumpSizeX: " << occContext.MaxDumpSizeX() << '\n' + << indent << "MaxDumpSizeY: " << occContext.MaxDumpSizeY() << '\n' + << indent << "HasRayTracingAdaptiveSamplingAtomic: " << occContext.HasRayTracingAdaptiveSamplingAtomic() << '\n'; +#endif + +#if OCC_VERSION_HEX >= 0x070500 + str << indent << "HasTextureBaseLevel: " << occContext.HasTextureBaseLevel() << '\n' + << indent << "HasSRGB: " << occContext.HasSRGB() << '\n' + << indent << "RenderSRGB: " << occContext.ToRenderSRGB() << '\n' + << indent << "IsWindowSRGB: " << occContext.IsWindowSRGB() << '\n' + << indent << "HasPBR: " << occContext.HasPBR() << '\n'; +#endif + +#if OCC_VERSION_HEX >= 0x070700 + str << indent << "GraphicsLibrary: " << MetaEnum::name(occContext.GraphicsLibrary()) << '\n' + << indent << "HasTextureMultisampling: " << occContext.HasTextureMultisampling() << '\n'; +#endif +} + +QString CommandSystemInformation::data() +{ + // Helper function returning unicode representation of a QChar object in the form "U+NNNN" + auto fnStrUnicodeChar = [](const QChar& ch) { + QString str; + QTextStream ostr(&str); + ostr << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << Qt::uppercasedigits << Qt::hex << ch.unicode(); + return str; + }; + + QString strSysInfo; + QTextStream ostr(&strSysInfo); + + // OS version + ostr << '\n' << "OS: " << QSysInfo::prettyProductName() + << " [" << QSysInfo::kernelType() << " version " << QSysInfo::kernelVersion() << "]" << '\n' + << "Current CPU Architecture: " << QSysInfo::currentCpuArchitecture() << '\n'; + + // Qt version + ostr << '\n' << QLibraryInfo::build() << " on \"" << QGuiApplication::platformName() << "\" " << '\n' + << indent << "QStyle keys: " << QStyleFactory::keys().join("; ") << '\n' + << indent << "Image formats(read): " << QImageReader::supportedImageFormats().join(' ') << '\n' + << indent << "Image formats(write): " << QImageWriter::supportedImageFormats().join(' ') << '\n'; + + // OpenCascade version + ostr << '\n' << "OpenCascade(build): " << OCC_VERSION_STRING_EXT << '\n'; + +// gmio version +#ifdef HAVE_GMIO + ostr << '\n' << "gmio(build): " << GMIO_VERSION_STR << '\n'; +#endif + + // I/O supported formats + { + ostr << '\n' << "Import(read) formats:" << '\n' << indent; + const IO::System* ioSystem = AppModule::get()->ioSystem(); + for (IO::Format format : ioSystem->readerFormats()) + ostr << IO::formatIdentifier(format) << " "; + + ostr << '\n' << "Export(write) formats:" << '\n' << indent; + for (IO::Format format : ioSystem->writerFormats()) + ostr << IO::formatIdentifier(format) << " "; + + ostr << '\n'; + } + + // Environment + ostr << '\n' << "Environment:\n"; + { + const QProcessEnvironment sysEnv = QProcessEnvironment::systemEnvironment(); + for (const QString& key : sysEnv.keys()) + ostr << indent << key << "=\"" << sysEnv.value(key) << "\"\n"; + } + + // Locales + ostr << '\n' << "Locale:\n"; + { + const std::locale& stdLoc = AppModule::get()->stdLocale(); + const auto& numFacet = std::use_facet>(stdLoc); + const QChar charDecPnt(numFacet.decimal_point()); + const QChar char1000Sep(numFacet.thousands_sep()); + ostr << indent << "std::locale:" << '\n' + << indentx2 << "name: " << to_QString(stdLoc.name()) << '\n' + << indentx2 << "numpunct.decimal_point: " << charDecPnt << " " << fnStrUnicodeChar(charDecPnt) << '\n' + << indentx2 << "numpunct.thousands_sep: " << char1000Sep << " " << fnStrUnicodeChar(char1000Sep) << '\n' + << indentx2 << "numpunct.grouping: " << to_QString(numFacet.grouping()) << '\n' + << indentx2 << "numpunct.truename: " << to_QString(numFacet.truename()) << '\n' + << indentx2 << "numpunct.falsename: " << to_QString(numFacet.falsename()) << '\n'; + const QLocale& qtLoc = AppModule::get()->qtLocale(); + ostr << indent << "QLocale:" << '\n' + << indentx2 << "name: " << qtLoc.name() << '\n' + << indentx2 << "language: " << MetaEnum::name(qtLoc.language()) << '\n' + << indentx2 << "measurementSytem: " << MetaEnum::name(qtLoc.measurementSystem()) << '\n' + << indentx2 << "textDirection: " << MetaEnum::name(qtLoc.textDirection()) << '\n' + << indentx2 << "decimalPoint: " << qtLoc.decimalPoint() << " " << fnStrUnicodeChar(qtLoc.decimalPoint()) << '\n' + << indentx2 << "groupSeparator: " << qtLoc.groupSeparator() << " " << fnStrUnicodeChar(qtLoc.groupSeparator()) << '\n'; + } + + // C++ StdLib + ostr << '\n' << "C++ StdLib:\n"; + { + const QChar dirSeparator(FilePath::preferred_separator); + ostr << indent << "std::thread::hardware_concurrency: " << std::thread::hardware_concurrency() << '\n' + << indent << "std::filepath::path::preferred_separator: " << dirSeparator << " " << fnStrUnicodeChar(dirSeparator) << '\n'; + } + + // Library info + ostr << '\n' << "Library info:\n"; + { + auto fnLibInfo = [&](QLibraryInfo::LibraryLocation loc) { + const QString locDir = QDir::toNativeSeparators(QLibraryInfo::QLibraryInfo::location(loc)); + ostr << indent << MetaEnum::name(loc) << ": " << locDir << '\n'; + }; + fnLibInfo(QLibraryInfo::PrefixPath); + fnLibInfo(QLibraryInfo::HeadersPath); + fnLibInfo(QLibraryInfo::LibrariesPath); + fnLibInfo(QLibraryInfo::LibraryExecutablesPath); + fnLibInfo(QLibraryInfo::BinariesPath); + fnLibInfo(QLibraryInfo::PluginsPath); + fnLibInfo(QLibraryInfo::ArchDataPath); + fnLibInfo(QLibraryInfo::DataPath); + fnLibInfo(QLibraryInfo::TranslationsPath); + fnLibInfo(QLibraryInfo::SettingsPath); + } + + // Standard paths + ostr << '\n' << "Standard Paths:\n"; + { + auto fnStdPath = [&](QStandardPaths::StandardLocation loc) { + QStringList locValues = QStandardPaths::standardLocations(loc); + for (QString& dir : locValues) + dir = QDir::toNativeSeparators(dir); + + ostr << indent << MetaEnum::name(loc) << ": " << locValues.join("; ") << '\n'; + }; + fnStdPath(QStandardPaths::DocumentsLocation); + fnStdPath(QStandardPaths::FontsLocation); + fnStdPath(QStandardPaths::ApplicationsLocation); + fnStdPath(QStandardPaths::TempLocation); + fnStdPath(QStandardPaths::HomeLocation); + fnStdPath(QStandardPaths::CacheLocation); + fnStdPath(QStandardPaths::GenericCacheLocation); + fnStdPath(QStandardPaths::GenericDataLocation); + fnStdPath(QStandardPaths::RuntimeLocation); + fnStdPath(QStandardPaths::ConfigLocation); + fnStdPath(QStandardPaths::GenericConfigLocation); + fnStdPath(QStandardPaths::AppDataLocation); + fnStdPath(QStandardPaths::AppLocalDataLocation); + fnStdPath(QStandardPaths::AppConfigLocation); + } + + // File selectors + ostr << '\n' << "File selectors(increasing order of precedence):\n" << indent; + for (const QString& selector : QFileSelector().allSelectors()) + ostr << selector << " "; + + ostr << '\n'; + + // QGuiApplication + ostr << '\n' << "QGuiApplication:\n"; + ostr << indent << "platformName: " << QGuiApplication::platformName() << '\n' + << indent << "desktopFileName: " << QGuiApplication::desktopFileName() << '\n' + << indent << "desktopSettingsAware: " << QGuiApplication::desktopSettingsAware() << '\n' + << indent << "layoutDirection: " << MetaEnum::name(QGuiApplication::layoutDirection()) << '\n'; + const QStyleHints* sh = QGuiApplication::styleHints(); + if (sh) { + const QChar pwdChar = sh->passwordMaskCharacter(); + ostr << indent << "styleHints:\n" + << indentx2 << "keyboardAutoRepeatRate: " << sh->keyboardAutoRepeatRate() << '\n' + << indentx2 << "keyboardInputInterval: " << sh->keyboardInputInterval() << '\n' + << indentx2 << "mouseDoubleClickInterval: " << sh->mouseDoubleClickInterval() << '\n' + << indentx2 << "mousePressAndHoldInterval: " << sh->mousePressAndHoldInterval() << '\n' + << indentx2 << "passwordMaskCharacter: " << pwdChar << " " << fnStrUnicodeChar(pwdChar) << '\n' + << indentx2 << "passwordMaskDelay: " << sh->passwordMaskDelay() << '\n' + << indentx2 << "setFocusOnTouchRelease: " << sh->setFocusOnTouchRelease() << '\n' + << indentx2 << "showIsFullScreen: " << sh->showIsFullScreen() << '\n' + << indentx2 << "showIsMaximized: " << sh->showIsMaximized() << '\n' + << indentx2 << "showShortcutsInContextMenus: " << sh->showShortcutsInContextMenus() << '\n' + << indentx2 << "startDragDistance: " << sh->startDragDistance() << '\n' + << indentx2 << "startDragTime: " << sh->startDragTime() << '\n' + << indentx2 << "startDragVelocity: " << sh->startDragVelocity() << '\n' + << indentx2 << "useRtlExtensions: " << sh->useRtlExtensions() << '\n' + << indentx2 << "tabFocusBehavior: " << MetaEnum::name(sh->tabFocusBehavior()) << '\n' + << indentx2 << "singleClickActivation: " << sh->singleClickActivation() << '\n' + << indentx2 << "useHoverEffects: " << sh->useHoverEffects() << '\n' + << indentx2 << "wheelScrollLines: " << sh->wheelScrollLines() << '\n' + << indentx2 << "mouseQuickSelectionThreshold: " << sh->mouseQuickSelectionThreshold() << '\n' + << indentx2 << "mouseDoubleClickDistance: " << sh->mouseDoubleClickDistance() << '\n' + << indentx2 << "mouseQuickSelectionThreshold: " << sh->mouseQuickSelectionThreshold() << '\n' + << indentx2 << "touchDoubleTapDistance: " << sh->touchDoubleTapDistance() << '\n'; + } + + // Fonts + ostr << '\n' << "Fonts:\n"; + ostr << indent << "General font: " << QFontDatabase::systemFont(QFontDatabase::GeneralFont) << '\n' + << indent << "Fixed font: " << QFontDatabase::systemFont(QFontDatabase::FixedFont) << '\n' + << indent << "Title font: " << QFontDatabase::systemFont(QFontDatabase::TitleFont) << '\n' + << indent << "Smallest font: " << QFontDatabase::systemFont(QFontDatabase::SmallestReadableFont) << '\n'; + + // Screens + ostr << '\n' << "Screens:\n"; + { + const QList listScreen = QGuiApplication::screens(); + ostr << indent << "Count: " << listScreen.size() << '\n'; + for (int i = 0; i < listScreen.size(); ++i) { + const QScreen* screen = listScreen.at(i); + ostr << indent << "Screen #" << i << '\n'; + ostr << indentx2 << "name: " << screen->name() << '\n' + << indentx2 << "model: " << screen->model() << '\n' + << indentx2 << "manufacturer: " << screen->manufacturer() << '\n' + << indentx2 << "serialNumber: " << screen->serialNumber() << '\n' + << indentx2 << "depth: " << screen->depth() << '\n' + << indentx2 << "size: " << screen->size() << '\n' + << indentx2 << "availableSize: " << screen->availableSize() << '\n' + << indentx2 << "virtualSize: " << screen->virtualSize() << '\n' + << indentx2 << "availableVirtualSize: " << screen->availableVirtualSize() << '\n' + << indentx2 << "geometry: " << screen->geometry() << '\n' + << indentx2 << "availableGeometry: " << screen->availableGeometry() << '\n' + << indentx2 << "virtualGeometry: " << screen->virtualGeometry() << '\n' + << indentx2 << "availableVirtualGeometry: " << screen->availableVirtualGeometry() << '\n' + << indentx2 << "physicalSize: " << screen->physicalSize() << '\n' + << indentx2 << "physicalDotsPerInchX: " << screen->physicalDotsPerInchX() << '\n' + << indentx2 << "physicalDotsPerInchY: " << screen->physicalDotsPerInchY() << '\n' + << indentx2 << "physicalDotsPerInch: " << screen->physicalDotsPerInch() << '\n' + << indentx2 << "logicalDotsPerInchX: " << screen->logicalDotsPerInchX() << '\n' + << indentx2 << "logicalDotsPerInchY: " << screen->logicalDotsPerInchY() << '\n' + << indentx2 << "logicalDotsPerInch: " << screen->logicalDotsPerInch() << '\n' + << indentx2 << "devicePixelRatio: " << screen->devicePixelRatio() << '\n' + << indentx2 << "logicalDotsPerInch: " << screen->logicalDotsPerInch() << '\n' + << indentx2 << "primaryOrientation: " << MetaEnum::name(screen->primaryOrientation()) << '\n' + << indentx2 << "orientation: " << MetaEnum::name(screen->orientation()) << '\n' + << indentx2 << "nativeOrientation: " << MetaEnum::name(screen->nativeOrientation()) << '\n' + << indentx2 << "refreshRate: " << screen->refreshRate() << "Hz" << '\n'; + } + } + + // OpenGL + ostr << '\n' << "OpenGL:" << '\n'; + dumpOpenGlInfo(ostr); + + ostr.flush(); + return strSysInfo; +} + +} // namespace Mayo diff --git a/src/app/commands_api.cpp b/src/app/commands_api.cpp index d762a9fe..047cf4df 100644 --- a/src/app/commands_api.cpp +++ b/src/app/commands_api.cpp @@ -28,7 +28,7 @@ Command::Command(IAppContext* context) Application* Command::app() const { - return m_context->guiApp()->application().get(); + return m_context ? m_context->guiApp()->application().get() : nullptr; } GuiDocument* Command::currentGuiDocument() const @@ -39,7 +39,7 @@ GuiDocument* Command::currentGuiDocument() const int Command::currentDocumentIndex() const { - return this->context()->findDocumentIndex(this->currentDocument()); + return m_context ? m_context->findDocumentIndex(this->currentDocument()) : -1; } void Command::setCurrentDocument(const DocumentPtr& doc) diff --git a/src/app/commands_api.h b/src/app/commands_api.h index f34332bf..a7bb956b 100644 --- a/src/app/commands_api.h +++ b/src/app/commands_api.h @@ -73,10 +73,10 @@ class Command : public QObject { protected: Application* app() const; - GuiApplication* guiApp() const { return m_context->guiApp(); } - TaskManager* taskMgr() const { return m_context->taskMgr(); } - QWidget* widgetMain() const { return m_context->widgetMain(); } - Document::Identifier currentDocument() const { return m_context->currentDocument(); } + GuiApplication* guiApp() const { return m_context ? m_context->guiApp() : nullptr; } + TaskManager* taskMgr() const { return m_context ? m_context->taskMgr() : nullptr; } + QWidget* widgetMain() const { return m_context ? m_context->widgetMain() : nullptr; } + Document::Identifier currentDocument() const { return m_context ? m_context->currentDocument() : -1; } GuiDocument* currentGuiDocument() const; int currentDocumentIndex() const; diff --git a/src/app/commands_help.cpp b/src/app/commands_help.cpp index b7fe8f3f..c03ac1b6 100644 --- a/src/app/commands_help.cpp +++ b/src/app/commands_help.cpp @@ -8,10 +8,12 @@ #include "dialog_about.h" #include "qtwidgets_utils.h" +#include "qstring_conv.h" +#include #include #include -#include +#include namespace Mayo { @@ -32,7 +34,7 @@ CommandAbout::CommandAbout(IAppContext* context) : Command(context) { auto action = new QAction(this); - action->setText(Command::tr("About %1").arg(QApplication::applicationName())); + action->setText(Command::tr("About %1").arg(QCoreApplication::applicationName())); this->setAction(action); } diff --git a/src/app/commands_help.h b/src/app/commands_help.h index bd8cdf25..0b652ab1 100644 --- a/src/app/commands_help.h +++ b/src/app/commands_help.h @@ -18,6 +18,16 @@ class CommandReportBug : public Command { static constexpr std::string_view Name = "report-bug"; }; +class CommandSystemInformation : public Command { +public: + CommandSystemInformation(IAppContext* context); + void execute() override; + + static QString data(); + + static constexpr std::string_view Name = "system-info"; +}; + class CommandAbout : public Command { public: CommandAbout(IAppContext* context); diff --git a/src/app/main.cpp b/src/app/main.cpp index 76e4b510..b5cdc268 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -22,6 +22,7 @@ #include "../gui/gui_application.h" #include "app_module.h" #include "cli_export.h" +#include "commands_help.h" #include "console.h" #include "document_tree_node_properties_providers.h" #include "filepath_conv.h" @@ -82,6 +83,7 @@ struct CommandLineArguments { std::vector listFilepathToExport; std::vector listFilepathToOpen; bool cliProgressReport = true; + bool showSystemInformation = false; }; // Provides customization of Qt message handler @@ -228,6 +230,12 @@ static CommandLineArguments processCommandLine() ); cmdParser.addOption(cmdCliNoProgress); + const QCommandLineOption cmdSysInfo( + QStringList{ "system-info" }, + Main::tr("Show detailed system information and quit") + ); + cmdParser.addOption(cmdSysInfo); + cmdParser.addPositionalArgument( Main::tr("files"), Main::tr("Files to open at startup, optionally"), @@ -268,6 +276,7 @@ static CommandLineArguments processCommandLine() args.includeDebugLogs = cmdParser.isSet(cmdDebugLogs); #endif args.cliProgressReport = !cmdParser.isSet(cmdCliNoProgress); + args.showSystemInformation = cmdParser.isSet(cmdSysInfo); return args; } @@ -396,7 +405,6 @@ static void initGui(GuiApplication* guiApp) if (!propForceOpenGlFallbackWidget && hasQGuiApplication) { // QOpenGL requires QGuiApplication const std::string strGlVersion = queryGlVersionString(); const QVersionNumber glVersion = parseSemanticVersionString(strGlVersion); - qInfo() << fmt::format("OpenGL v{}.{}", glVersion.majorVersion(), glVersion.minorVersion()).c_str(); if (!glVersion.isNull() && glVersion.majorVersion() >= 2) { // Requires at least OpenGL version >= 2.0 setFunctionCreateGraphicsDriver(&QOpenGLWidgetOccView::createCompatibleGraphicsDriver); IWidgetOccView::setCreator(&QOpenGLWidgetOccView::create); @@ -490,6 +498,12 @@ static int runApp(QCoreApplication* qtApp) appModule->properties()->retranslate(); // Process CLI + if (args.showSystemInformation) { + CommandSystemInformation cmdSysInfo(nullptr); + cmdSysInfo.execute(); + return qtApp->exec(); + } + if (!args.listFilepathToExport.empty()) { if (args.listFilepathToOpen.empty()) fnCriticalExit(Main::tr("No input files -> nothing to export")); diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index 830fa0db..34bd75cc 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -131,6 +131,7 @@ void MainWindow::createCommands() // "Help" commands this->addCommand(); + this->addCommand(); this->addCommand(); } @@ -193,6 +194,7 @@ void MainWindow::createMenus() { // Help auto menu = m_ui->menu_Help; fnAddAction(menu, CommandReportBug::Name); + fnAddAction(menu, CommandSystemInformation::Name); menu->addSeparator(); fnAddAction(menu, CommandAbout::Name); } diff --git a/src/app/qstring_conv.h b/src/app/qstring_conv.h index 2b7c5277..85ce484a 100644 --- a/src/app/qstring_conv.h +++ b/src/app/qstring_conv.h @@ -38,6 +38,11 @@ template<> struct StringConv { static auto to(const std::string& str) { return QString::fromStdString(str); } }; +// std::wstring -> QString +template<> struct StringConv { + static auto to(const std::wstring& str) { return QString::fromStdWString(str); } +}; + // std::string_view -> QString template<> struct StringConv { static auto to(std::string_view str) { return QString::fromUtf8(str.data(), int(str.size())); } @@ -97,6 +102,11 @@ template<> struct StringConv { } }; +// QString -> std::wstring +template<> struct StringConv { + static auto to(const QString& str) { return str.toStdWString(); } +}; + // QString -> TCollection_ExtendedString template<> struct StringConv { static auto to(const QString& str) { diff --git a/src/app/widget_occ_view_impl.cpp b/src/app/widget_occ_view_impl.cpp index d3f33345..d85711ce 100644 --- a/src/app/widget_occ_view_impl.cpp +++ b/src/app/widget_occ_view_impl.cpp @@ -81,7 +81,8 @@ void QOpenGLWidgetOccView_createOpenGlContext(std::functionRenderingContext()); + if (fnCallback) + fnCallback(glCtx->RenderingContext()); } Handle_Graphic3d_GraphicDriver QOpenGLWidgetOccView_createCompatibleGraphicsDriver() From 8f5af5ac3b85fec7b08eaee3cd88a0c1da1aa0fe Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 25 Jul 2023 11:24:11 +0200 Subject: [PATCH 32/92] App: fix compilation errors with Qt 5.13 version Relates to GitHub #210 --- src/app/command_system_information.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index 6d7611ae..7ba480cf 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -188,7 +188,9 @@ QString CommandSystemInformation::data() auto fnStrUnicodeChar = [](const QChar& ch) { QString str; QTextStream ostr(&str); - ostr << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << Qt::uppercasedigits << Qt::hex << ch.unicode(); + ostr.setNumberFlags(ostr.numberFlags() | QTextStream::UppercaseDigits); + ostr.setIntegerBase(16); // Same as Qt::hex + ostr << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << ch.unicode(); return str; }; @@ -209,7 +211,7 @@ QString CommandSystemInformation::data() // OpenCascade version ostr << '\n' << "OpenCascade(build): " << OCC_VERSION_STRING_EXT << '\n'; -// gmio version + // gmio version #ifdef HAVE_GMIO ostr << '\n' << "gmio(build): " << GMIO_VERSION_STR << '\n'; #endif @@ -349,9 +351,11 @@ QString CommandSystemInformation::data() << indentx2 << "useHoverEffects: " << sh->useHoverEffects() << '\n' << indentx2 << "wheelScrollLines: " << sh->wheelScrollLines() << '\n' << indentx2 << "mouseQuickSelectionThreshold: " << sh->mouseQuickSelectionThreshold() << '\n' +#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) << indentx2 << "mouseDoubleClickDistance: " << sh->mouseDoubleClickDistance() << '\n' - << indentx2 << "mouseQuickSelectionThreshold: " << sh->mouseQuickSelectionThreshold() << '\n' - << indentx2 << "touchDoubleTapDistance: " << sh->touchDoubleTapDistance() << '\n'; + << indentx2 << "touchDoubleTapDistance: " << sh->touchDoubleTapDistance() << '\n' +#endif + ; } // Fonts From 300e43887fb879d932a6c5426dd785123e4b4ca3 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 25 Jul 2023 11:28:53 +0200 Subject: [PATCH 33/92] App: reorganize system information data Relates to GitHub #210 --- src/app/command_system_information.cpp | 182 ++++++++++++------------- 1 file changed, 91 insertions(+), 91 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index 7ba480cf..bc19cef4 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -230,14 +230,6 @@ QString CommandSystemInformation::data() ostr << '\n'; } - // Environment - ostr << '\n' << "Environment:\n"; - { - const QProcessEnvironment sysEnv = QProcessEnvironment::systemEnvironment(); - for (const QString& key : sysEnv.keys()) - ostr << indent << key << "=\"" << sysEnv.value(key) << "\"\n"; - } - // Locales ostr << '\n' << "Locale:\n"; { @@ -270,50 +262,9 @@ QString CommandSystemInformation::data() << indent << "std::filepath::path::preferred_separator: " << dirSeparator << " " << fnStrUnicodeChar(dirSeparator) << '\n'; } - // Library info - ostr << '\n' << "Library info:\n"; - { - auto fnLibInfo = [&](QLibraryInfo::LibraryLocation loc) { - const QString locDir = QDir::toNativeSeparators(QLibraryInfo::QLibraryInfo::location(loc)); - ostr << indent << MetaEnum::name(loc) << ": " << locDir << '\n'; - }; - fnLibInfo(QLibraryInfo::PrefixPath); - fnLibInfo(QLibraryInfo::HeadersPath); - fnLibInfo(QLibraryInfo::LibrariesPath); - fnLibInfo(QLibraryInfo::LibraryExecutablesPath); - fnLibInfo(QLibraryInfo::BinariesPath); - fnLibInfo(QLibraryInfo::PluginsPath); - fnLibInfo(QLibraryInfo::ArchDataPath); - fnLibInfo(QLibraryInfo::DataPath); - fnLibInfo(QLibraryInfo::TranslationsPath); - fnLibInfo(QLibraryInfo::SettingsPath); - } - - // Standard paths - ostr << '\n' << "Standard Paths:\n"; - { - auto fnStdPath = [&](QStandardPaths::StandardLocation loc) { - QStringList locValues = QStandardPaths::standardLocations(loc); - for (QString& dir : locValues) - dir = QDir::toNativeSeparators(dir); - - ostr << indent << MetaEnum::name(loc) << ": " << locValues.join("; ") << '\n'; - }; - fnStdPath(QStandardPaths::DocumentsLocation); - fnStdPath(QStandardPaths::FontsLocation); - fnStdPath(QStandardPaths::ApplicationsLocation); - fnStdPath(QStandardPaths::TempLocation); - fnStdPath(QStandardPaths::HomeLocation); - fnStdPath(QStandardPaths::CacheLocation); - fnStdPath(QStandardPaths::GenericCacheLocation); - fnStdPath(QStandardPaths::GenericDataLocation); - fnStdPath(QStandardPaths::RuntimeLocation); - fnStdPath(QStandardPaths::ConfigLocation); - fnStdPath(QStandardPaths::GenericConfigLocation); - fnStdPath(QStandardPaths::AppDataLocation); - fnStdPath(QStandardPaths::AppLocalDataLocation); - fnStdPath(QStandardPaths::AppConfigLocation); - } + // OpenGL + ostr << '\n' << "OpenGL:" << '\n'; + dumpOpenGlInfo(ostr); // File selectors ostr << '\n' << "File selectors(increasing order of precedence):\n" << indent; @@ -322,42 +273,6 @@ QString CommandSystemInformation::data() ostr << '\n'; - // QGuiApplication - ostr << '\n' << "QGuiApplication:\n"; - ostr << indent << "platformName: " << QGuiApplication::platformName() << '\n' - << indent << "desktopFileName: " << QGuiApplication::desktopFileName() << '\n' - << indent << "desktopSettingsAware: " << QGuiApplication::desktopSettingsAware() << '\n' - << indent << "layoutDirection: " << MetaEnum::name(QGuiApplication::layoutDirection()) << '\n'; - const QStyleHints* sh = QGuiApplication::styleHints(); - if (sh) { - const QChar pwdChar = sh->passwordMaskCharacter(); - ostr << indent << "styleHints:\n" - << indentx2 << "keyboardAutoRepeatRate: " << sh->keyboardAutoRepeatRate() << '\n' - << indentx2 << "keyboardInputInterval: " << sh->keyboardInputInterval() << '\n' - << indentx2 << "mouseDoubleClickInterval: " << sh->mouseDoubleClickInterval() << '\n' - << indentx2 << "mousePressAndHoldInterval: " << sh->mousePressAndHoldInterval() << '\n' - << indentx2 << "passwordMaskCharacter: " << pwdChar << " " << fnStrUnicodeChar(pwdChar) << '\n' - << indentx2 << "passwordMaskDelay: " << sh->passwordMaskDelay() << '\n' - << indentx2 << "setFocusOnTouchRelease: " << sh->setFocusOnTouchRelease() << '\n' - << indentx2 << "showIsFullScreen: " << sh->showIsFullScreen() << '\n' - << indentx2 << "showIsMaximized: " << sh->showIsMaximized() << '\n' - << indentx2 << "showShortcutsInContextMenus: " << sh->showShortcutsInContextMenus() << '\n' - << indentx2 << "startDragDistance: " << sh->startDragDistance() << '\n' - << indentx2 << "startDragTime: " << sh->startDragTime() << '\n' - << indentx2 << "startDragVelocity: " << sh->startDragVelocity() << '\n' - << indentx2 << "useRtlExtensions: " << sh->useRtlExtensions() << '\n' - << indentx2 << "tabFocusBehavior: " << MetaEnum::name(sh->tabFocusBehavior()) << '\n' - << indentx2 << "singleClickActivation: " << sh->singleClickActivation() << '\n' - << indentx2 << "useHoverEffects: " << sh->useHoverEffects() << '\n' - << indentx2 << "wheelScrollLines: " << sh->wheelScrollLines() << '\n' - << indentx2 << "mouseQuickSelectionThreshold: " << sh->mouseQuickSelectionThreshold() << '\n' -#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) - << indentx2 << "mouseDoubleClickDistance: " << sh->mouseDoubleClickDistance() << '\n' - << indentx2 << "touchDoubleTapDistance: " << sh->touchDoubleTapDistance() << '\n' -#endif - ; - } - // Fonts ostr << '\n' << "Fonts:\n"; ostr << indent << "General font: " << QFontDatabase::systemFont(QFontDatabase::GeneralFont) << '\n' @@ -402,9 +317,94 @@ QString CommandSystemInformation::data() } } - // OpenGL - ostr << '\n' << "OpenGL:" << '\n'; - dumpOpenGlInfo(ostr); + // QGuiApplication + ostr << '\n' << "QGuiApplication:\n"; + ostr << indent << "platformName: " << QGuiApplication::platformName() << '\n' + << indent << "desktopFileName: " << QGuiApplication::desktopFileName() << '\n' + << indent << "desktopSettingsAware: " << QGuiApplication::desktopSettingsAware() << '\n' + << indent << "layoutDirection: " << MetaEnum::name(QGuiApplication::layoutDirection()) << '\n'; + const QStyleHints* sh = QGuiApplication::styleHints(); + if (sh) { + const QChar pwdChar = sh->passwordMaskCharacter(); + ostr << indent << "styleHints:\n" + << indentx2 << "keyboardAutoRepeatRate: " << sh->keyboardAutoRepeatRate() << '\n' + << indentx2 << "keyboardInputInterval: " << sh->keyboardInputInterval() << '\n' + << indentx2 << "mouseDoubleClickInterval: " << sh->mouseDoubleClickInterval() << '\n' + << indentx2 << "mousePressAndHoldInterval: " << sh->mousePressAndHoldInterval() << '\n' + << indentx2 << "passwordMaskCharacter: " << pwdChar << " " << fnStrUnicodeChar(pwdChar) << '\n' + << indentx2 << "passwordMaskDelay: " << sh->passwordMaskDelay() << '\n' + << indentx2 << "setFocusOnTouchRelease: " << sh->setFocusOnTouchRelease() << '\n' + << indentx2 << "showIsFullScreen: " << sh->showIsFullScreen() << '\n' + << indentx2 << "showIsMaximized: " << sh->showIsMaximized() << '\n' + << indentx2 << "showShortcutsInContextMenus: " << sh->showShortcutsInContextMenus() << '\n' + << indentx2 << "startDragDistance: " << sh->startDragDistance() << '\n' + << indentx2 << "startDragTime: " << sh->startDragTime() << '\n' + << indentx2 << "startDragVelocity: " << sh->startDragVelocity() << '\n' + << indentx2 << "useRtlExtensions: " << sh->useRtlExtensions() << '\n' + << indentx2 << "tabFocusBehavior: " << MetaEnum::name(sh->tabFocusBehavior()) << '\n' + << indentx2 << "singleClickActivation: " << sh->singleClickActivation() << '\n' + << indentx2 << "useHoverEffects: " << sh->useHoverEffects() << '\n' + << indentx2 << "wheelScrollLines: " << sh->wheelScrollLines() << '\n' + << indentx2 << "mouseQuickSelectionThreshold: " << sh->mouseQuickSelectionThreshold() << '\n' +#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + << indentx2 << "mouseDoubleClickDistance: " << sh->mouseDoubleClickDistance() << '\n' + << indentx2 << "touchDoubleTapDistance: " << sh->touchDoubleTapDistance() << '\n' +#endif + ; + } + + // Library info + ostr << '\n' << "Library info:\n"; + { + auto fnLibInfo = [&](QLibraryInfo::LibraryLocation loc) { + const QString locDir = QDir::toNativeSeparators(QLibraryInfo::QLibraryInfo::location(loc)); + ostr << indent << MetaEnum::name(loc) << ": " << locDir << '\n'; + }; + fnLibInfo(QLibraryInfo::PrefixPath); + fnLibInfo(QLibraryInfo::HeadersPath); + fnLibInfo(QLibraryInfo::LibrariesPath); + fnLibInfo(QLibraryInfo::LibraryExecutablesPath); + fnLibInfo(QLibraryInfo::BinariesPath); + fnLibInfo(QLibraryInfo::PluginsPath); + fnLibInfo(QLibraryInfo::ArchDataPath); + fnLibInfo(QLibraryInfo::DataPath); + fnLibInfo(QLibraryInfo::TranslationsPath); + fnLibInfo(QLibraryInfo::SettingsPath); + } + + // Standard paths + ostr << '\n' << "Standard Paths:\n"; + { + auto fnStdPath = [&](QStandardPaths::StandardLocation loc) { + QStringList locValues = QStandardPaths::standardLocations(loc); + for (QString& dir : locValues) + dir = QDir::toNativeSeparators(dir); + + ostr << indent << MetaEnum::name(loc) << ": " << locValues.join("; ") << '\n'; + }; + fnStdPath(QStandardPaths::DocumentsLocation); + fnStdPath(QStandardPaths::FontsLocation); + fnStdPath(QStandardPaths::ApplicationsLocation); + fnStdPath(QStandardPaths::TempLocation); + fnStdPath(QStandardPaths::HomeLocation); + fnStdPath(QStandardPaths::CacheLocation); + fnStdPath(QStandardPaths::GenericCacheLocation); + fnStdPath(QStandardPaths::GenericDataLocation); + fnStdPath(QStandardPaths::RuntimeLocation); + fnStdPath(QStandardPaths::ConfigLocation); + fnStdPath(QStandardPaths::GenericConfigLocation); + fnStdPath(QStandardPaths::AppDataLocation); + fnStdPath(QStandardPaths::AppLocalDataLocation); + fnStdPath(QStandardPaths::AppConfigLocation); + } + + // Environment + ostr << '\n' << "Environment:\n"; + { + const QProcessEnvironment sysEnv = QProcessEnvironment::systemEnvironment(); + for (const QString& key : sysEnv.keys()) + ostr << indent << key << "=\"" << sysEnv.value(key) << "\"\n"; + } ostr.flush(); return strSysInfo; From 84ca29c2359a90e6a79c68d6f8e11c5d029e5fa6 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 25 Jul 2023 12:25:10 +0200 Subject: [PATCH 34/92] QMake: error if Qt version isn't >= 5.14 Relates to GitHub #211 --- mayo.pro | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mayo.pro b/mayo.pro index e9f28f0d..4443c101 100644 --- a/mayo.pro +++ b/mayo.pro @@ -14,6 +14,10 @@ CONFIG(debug, debug|release) { } message(Qt version $$QT_VERSION) +!versionAtLeast(QT_VERSION, 5.14) { + error(Qt >= 5.14 is required but detected version is $$QT_VERSION) +} + QT += core gui widgets greaterThan(QT_MAJOR_VERSION, 5) { From ef4f7dabf44fa949ac4054ea971217bbfce02fb0 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 25 Jul 2023 12:51:39 +0200 Subject: [PATCH 35/92] QMake: replace minOpenCascadeVersion() by built-in versionAtLeast() --- mayo.pro | 16 ++++++---------- opencascade.pri | 29 +---------------------------- 2 files changed, 7 insertions(+), 38 deletions(-) diff --git a/mayo.pro b/mayo.pro index 4443c101..efff154b 100644 --- a/mayo.pro +++ b/mayo.pro @@ -18,7 +18,6 @@ message(Qt version $$QT_VERSION) error(Qt >= 5.14 is required but detected version is $$QT_VERSION) } - QT += core gui widgets greaterThan(QT_MAJOR_VERSION, 5) { QT += openglwidgets @@ -166,7 +165,7 @@ LIBS += \ -lTKXmlXCAF \ -lTKXSBase \ -minOpenCascadeVersion(7, 7, 0) { +versionAtLeast(OCC_VERSION_STR, 7.7.0) { LIBS += -lTKXDE } @@ -177,7 +176,7 @@ LIBS += -lTKSTEP -lTKSTEP209 -lTKSTEPAttr -lTKSTEPBase -lTKXDESTEP # -- STL support LIBS += -lTKSTL # -- OBJ/glTF support -minOpenCascadeVersion(7, 4, 0) { +versionAtLeast(OCC_VERSION_STR, 7.4.0) { LIBS += -lTKRWMesh } else { SOURCES -= \ @@ -186,16 +185,16 @@ minOpenCascadeVersion(7, 4, 0) { src/io_occ/io_occ_obj_reader.cpp } -!minOpenCascadeVersion(7, 5, 0) { +!versionAtLeast(OCC_VERSION_STR, 7.5.0) { SOURCES -= src/io_occ/io_occ_gltf_writer.cpp } -!minOpenCascadeVersion(7, 6, 0) { +!versionAtLeast(OCC_VERSION_STR, 7.6.0) { SOURCES -= src/io_occ/io_occ_obj_writer.cpp } # -- VRML support LIBS += -lTKVRML -!minOpenCascadeVersion(7, 7, 0) { +!versionAtLeast(OCC_VERSION_STR, 7.7.0) { SOURCES -= src/io_occ/io_occ_vrml_reader.cpp } @@ -216,10 +215,7 @@ isEmpty(GMIO_ROOT) { INCLUDEPATH += $$GMIO_ROOT/include LIBS += -L$$GMIO_ROOT/lib -lgmio_static -lzlibstatic - SOURCES += \ -# $$GMIO_ROOT/src/gmio_support/stl_occ_brep.cpp \ -# $$GMIO_ROOT/src/gmio_support/stl_occ_polytri.cpp \ - $$GMIO_ROOT/src/gmio_support/stream_qt.cpp + SOURCES += $$GMIO_ROOT/src/gmio_support/stream_qt.cpp DEFINES += HAVE_GMIO } diff --git a/opencascade.pri b/opencascade.pri index 76544374..18feb540 100644 --- a/opencascade.pri +++ b/opencascade.pri @@ -47,35 +47,8 @@ equals(QT_ARCH, i386) { } else:equals(QT_ARCH, x86_64) { DEFINES += _OCC64 } else { - warning(Platform architecture may be not supported (QT_ARCH = $$QT_ARCH)) + warning(Platform architecture may be not supported(QT_ARCH = $$QT_ARCH)) } LIBS += $$system_path($$join(CASCADE_LIB_DIR, " -L", -L)) QMAKE_RPATHDIR += $$CASCADE_LIB_DIR - -defineTest(minOpenCascadeVersion) { - maj = $$1 - min = $$2 - patch = $$3 - isEqual(OCC_VERSION_MAJOR, $$maj) { - isEqual(OCC_VERSION_MINOR, $$min) { - isEqual(OCC_VERSION_PATCH, $$patch) { - return(true) - } - - greaterThan(OCC_VERSION_PATCH, $$patch) { - return(true) - } - } - - greaterThan(OCC_VERSION_MINOR, $$min) { - return(true) - } - } - - greaterThan(OCC_VERSION_MAJOR, $$maj) { - return(true) - } - - return(false) -} From a6be15465dd3320f5bae1897de912f15531abdbe Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 25 Jul 2023 14:55:05 +0200 Subject: [PATCH 36/92] App: let CommandSystemInformation support registration of library info Relates to GitHub #210 --- src/app/command_system_information.cpp | 27 ++++++++++++++++++++++---- src/app/commands_help.h | 1 + src/app/main.cpp | 3 +++ src/io_gmio/io_gmio.h | 16 +++++++++++++++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index bc19cef4..573c6ed1 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -48,6 +48,7 @@ #endif #include +#include namespace Mayo { @@ -128,6 +129,17 @@ QTextStream& operator<<(QTextStream& str, std::string_view sv) const char indent[] = " "; const char indentx2[] = " "; +struct LibraryInfo { + std::string name; + std::string data; +}; + +std::vector& getLibraryInfos() +{ + static std::vector vec; + return vec; +} + } // namespace static void dumpOpenGlInfo(QTextStream& str) @@ -211,10 +223,9 @@ QString CommandSystemInformation::data() // OpenCascade version ostr << '\n' << "OpenCascade(build): " << OCC_VERSION_STRING_EXT << '\n'; - // gmio version -#ifdef HAVE_GMIO - ostr << '\n' << "gmio(build): " << GMIO_VERSION_STR << '\n'; -#endif + // Other registered libraries + for (const LibraryInfo& libInfo : getLibraryInfos()) + ostr << '\n' << to_QString(libInfo.name) << ": " << to_QString(libInfo.data) << '\n'; // I/O supported formats { @@ -410,4 +421,12 @@ QString CommandSystemInformation::data() return strSysInfo; } +void CommandSystemInformation::addLibraryInfo(std::string_view libName, std::string_view data) +{ + if (!libName.empty() && !data.empty()) { + LibraryInfo libInfo{ std::string(libName), std::string(data) }; + getLibraryInfos().push_back(std::move(libInfo)); + } +} + } // namespace Mayo diff --git a/src/app/commands_help.h b/src/app/commands_help.h index 0b652ab1..994e8e06 100644 --- a/src/app/commands_help.h +++ b/src/app/commands_help.h @@ -24,6 +24,7 @@ class CommandSystemInformation : public Command { void execute() override; static QString data(); + static void addLibraryInfo(std::string_view libName, std::string_view data); static constexpr std::string_view Name = "system-info"; }; diff --git a/src/app/main.cpp b/src/app/main.cpp index b5cdc268..72635261 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -497,6 +497,9 @@ static int runApp(QCoreApplication* qtApp) appModule->properties()->IO_bindParameters(ioSystem); appModule->properties()->retranslate(); + // Register library infos + CommandSystemInformation::addLibraryInfo(IO::GmioLib::strName, IO::GmioLib::strVersion); + // Process CLI if (args.showSystemInformation) { CommandSystemInformation cmdSysInfo(nullptr); diff --git a/src/io_gmio/io_gmio.h b/src/io_gmio/io_gmio.h index 722f78c1..98c6a48a 100644 --- a/src/io_gmio/io_gmio.h +++ b/src/io_gmio/io_gmio.h @@ -8,6 +8,11 @@ #include "../base/io_writer.h" #include "../base/property.h" + +#ifdef HAVE_GMIO +# include +#endif + #include namespace Mayo { @@ -29,5 +34,16 @@ class GmioFactoryWriter : public FactoryWriter { } }; +struct GmioLib { + static constexpr char strName[] = "gmio(build)"; + static constexpr char strVersion[] = +#ifdef HAVE_GMIO + GMIO_VERSION_STR +#else + "" +#endif + ; +}; + } // namespace IO } // namespace Mayo From 3b40bb89b3cb1c918b5949e644f0403122eea366 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 25 Jul 2023 15:42:24 +0200 Subject: [PATCH 37/92] IO_GMIO: more consistent GmioLib class --- src/app/main.cpp | 2 +- src/io_gmio/io_gmio.cpp | 7 +++++++ src/io_gmio/io_gmio.h | 12 +++--------- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 72635261..4d023fd8 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -498,7 +498,7 @@ static int runApp(QCoreApplication* qtApp) appModule->properties()->retranslate(); // Register library infos - CommandSystemInformation::addLibraryInfo(IO::GmioLib::strName, IO::GmioLib::strVersion); + CommandSystemInformation::addLibraryInfo(IO::GmioLib::strName(), IO::GmioLib::strVersion()); // Process CLI if (args.showSystemInformation) { diff --git a/src/io_gmio/io_gmio.cpp b/src/io_gmio/io_gmio.cpp index 79a5536c..e29c2858 100644 --- a/src/io_gmio/io_gmio.cpp +++ b/src/io_gmio/io_gmio.cpp @@ -8,6 +8,8 @@ #include "io_gmio_amf_writer.h" +#include + namespace Mayo { namespace IO { @@ -34,5 +36,10 @@ GmioFactoryWriter::createProperties(Format format, PropertyGroup* parentGroup) c return {}; } +std::string_view GmioLib::strVersion() +{ + return GMIO_VERSION_STR; +} + } // namespace IO } // namespace Mayo diff --git a/src/io_gmio/io_gmio.h b/src/io_gmio/io_gmio.h index 98c6a48a..5757e3c5 100644 --- a/src/io_gmio/io_gmio.h +++ b/src/io_gmio/io_gmio.h @@ -9,10 +9,6 @@ #include "../base/io_writer.h" #include "../base/property.h" -#ifdef HAVE_GMIO -# include -#endif - #include namespace Mayo { @@ -35,14 +31,12 @@ class GmioFactoryWriter : public FactoryWriter { }; struct GmioLib { - static constexpr char strName[] = "gmio(build)"; - static constexpr char strVersion[] = + static std::string_view strName() { return "gmio(build)"; } #ifdef HAVE_GMIO - GMIO_VERSION_STR + static std::string_view strVersion(); #else - "" + static std::string_view strVersion() { return ""; } #endif - ; }; } // namespace IO From aac120078417f72e733b707ee3aa88d981458a17 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 25 Jul 2023 16:47:19 +0200 Subject: [PATCH 38/92] App: fix display of std::locale::groupping() Relates to GitHub #210 --- src/app/command_system_information.cpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index 573c6ed1..f4804960 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -248,11 +248,15 @@ QString CommandSystemInformation::data() const auto& numFacet = std::use_facet>(stdLoc); const QChar charDecPnt(numFacet.decimal_point()); const QChar char1000Sep(numFacet.thousands_sep()); + std::string strGrouping; + for (char c : numFacet.grouping()) + strGrouping += std::to_string(static_cast(c)) + " "; + ostr << indent << "std::locale:" << '\n' << indentx2 << "name: " << to_QString(stdLoc.name()) << '\n' - << indentx2 << "numpunct.decimal_point: " << charDecPnt << " " << fnStrUnicodeChar(charDecPnt) << '\n' - << indentx2 << "numpunct.thousands_sep: " << char1000Sep << " " << fnStrUnicodeChar(char1000Sep) << '\n' - << indentx2 << "numpunct.grouping: " << to_QString(numFacet.grouping()) << '\n' + << indentx2 << "numpunct.decimal_point: " << charDecPnt << " " << fnStrUnicodeChar(charDecPnt) << '\n' + << indentx2 << "numpunct.thousands_sep: " << char1000Sep << " " << fnStrUnicodeChar(char1000Sep) << '\n' + << indentx2 << "numpunct.grouping: " << to_QString(strGrouping) << '\n' << indentx2 << "numpunct.truename: " << to_QString(numFacet.truename()) << '\n' << indentx2 << "numpunct.falsename: " << to_QString(numFacet.falsename()) << '\n'; const QLocale& qtLoc = AppModule::get()->qtLocale(); @@ -261,8 +265,8 @@ QString CommandSystemInformation::data() << indentx2 << "language: " << MetaEnum::name(qtLoc.language()) << '\n' << indentx2 << "measurementSytem: " << MetaEnum::name(qtLoc.measurementSystem()) << '\n' << indentx2 << "textDirection: " << MetaEnum::name(qtLoc.textDirection()) << '\n' - << indentx2 << "decimalPoint: " << qtLoc.decimalPoint() << " " << fnStrUnicodeChar(qtLoc.decimalPoint()) << '\n' - << indentx2 << "groupSeparator: " << qtLoc.groupSeparator() << " " << fnStrUnicodeChar(qtLoc.groupSeparator()) << '\n'; + << indentx2 << "decimalPoint: " << qtLoc.decimalPoint() << " " << fnStrUnicodeChar(qtLoc.decimalPoint()) << '\n' + << indentx2 << "groupSeparator: " << qtLoc.groupSeparator() << " " << fnStrUnicodeChar(qtLoc.groupSeparator()) << '\n'; } // C++ StdLib @@ -270,7 +274,7 @@ QString CommandSystemInformation::data() { const QChar dirSeparator(FilePath::preferred_separator); ostr << indent << "std::thread::hardware_concurrency: " << std::thread::hardware_concurrency() << '\n' - << indent << "std::filepath::path::preferred_separator: " << dirSeparator << " " << fnStrUnicodeChar(dirSeparator) << '\n'; + << indent << "std::filepath::path::preferred_separator: " << dirSeparator << " " << fnStrUnicodeChar(dirSeparator) << '\n'; } // OpenGL @@ -342,7 +346,7 @@ QString CommandSystemInformation::data() << indentx2 << "keyboardInputInterval: " << sh->keyboardInputInterval() << '\n' << indentx2 << "mouseDoubleClickInterval: " << sh->mouseDoubleClickInterval() << '\n' << indentx2 << "mousePressAndHoldInterval: " << sh->mousePressAndHoldInterval() << '\n' - << indentx2 << "passwordMaskCharacter: " << pwdChar << " " << fnStrUnicodeChar(pwdChar) << '\n' + << indentx2 << "passwordMaskCharacter: " << pwdChar << " " << fnStrUnicodeChar(pwdChar) << '\n' << indentx2 << "passwordMaskDelay: " << sh->passwordMaskDelay() << '\n' << indentx2 << "setFocusOnTouchRelease: " << sh->setFocusOnTouchRelease() << '\n' << indentx2 << "showIsFullScreen: " << sh->showIsFullScreen() << '\n' From 947538389aa6d0ca4069eb4a852efa231e3ad77f Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 26 Jul 2023 15:49:59 +0200 Subject: [PATCH 39/92] Base: introduce function Span_itemIndex() useful to fix compilation warnings --- src/base/settings.cpp | 10 +++++----- src/base/span.h | 20 ++++++++++++++++++++ src/io_gmio/io_gmio_amf_writer.cpp | 2 +- src/io_off/io_off_reader.cpp | 2 +- src/io_ply/io_ply_reader.cpp | 4 +++- tests/test_base.cpp | 15 +++++++++++++++ tests/test_base.h | 2 ++ 7 files changed, 47 insertions(+), 8 deletions(-) diff --git a/src/base/settings.cpp b/src/base/settings.cpp index bfc27840..219cb4a2 100644 --- a/src/base/settings.cpp +++ b/src/base/settings.cpp @@ -232,7 +232,7 @@ Settings::GroupIndex Settings::addGroup(std::string_view identifier) for (const Settings_Group& group : d->m_vecGroup) { if (group.identifier.key == identifier) - return GroupIndex(&group - &d->m_vecGroup.front()); + return GroupIndex(Span_itemIndex(d->m_vecGroup, group)); } d->m_vecGroup.push_back({}); @@ -327,9 +327,9 @@ Settings::SettingIndex Settings::findProperty(const Property* property) const for (const Settings_Section& section : group.vecSection) { for (const Settings_Setting& setting : section.vecSetting) { if (setting.property == property) { - const auto idSetting = &setting - §ion.vecSetting.front(); - const auto idSection = §ion - &group.vecSection.front(); - const auto idGroup = &group - &d->m_vecGroup.front(); + const auto idSetting = Span_itemIndex(section.vecSetting, setting); + const auto idSection = Span_itemIndex(group.vecSection, section); + const auto idGroup = Span_itemIndex(d->m_vecGroup, group); return SettingIndex(SectionIndex(GroupIndex(idGroup), idSection), idSetting); } } @@ -360,7 +360,7 @@ Settings::SettingIndex Settings::addSetting(Property* property, GroupIndex group // sectionDefault->identifier = "DEFAULT"; // sectionDefault->title = tr("DEFAULT"); sectionDefault->isDefault = true; - const SectionIndex sectionId(groupId, sectionDefault - &group.vecSection.front()); + const SectionIndex sectionId(groupId, Span_itemIndex(group.vecSection, *sectionDefault)); return this->addSetting(property, sectionId); } diff --git a/src/base/span.h b/src/base/span.h index 7fc492f3..37b9b33d 100644 --- a/src/base/span.h +++ b/src/base/span.h @@ -7,9 +7,29 @@ #pragma once #include +#include +#include namespace Mayo { template using Span = gsl::span; +// Returns the index of 'item' contained in 'span' +template +constexpr int Span_itemIndex(Span span, typename Span::const_reference item) +{ + assert(!span.empty()); + auto index = &item - &span.front(); + assert(index >= 0); + assert(index <= INT_MAX); + assert(&span[static_cast::size_type>(index)] == &item); + return static_cast(index); +} + +template +constexpr int Span_itemIndex(const Container& cont, typename Container::const_reference item) +{ + return Span_itemIndex(Span(cont), item); +} + } // namespace Mayo diff --git a/src/io_gmio/io_gmio_amf_writer.cpp b/src/io_gmio/io_gmio_amf_writer.cpp index 4dc5faca..b373e1ca 100644 --- a/src/io_gmio/io_gmio_amf_writer.cpp +++ b/src/io_gmio/io_gmio_amf_writer.cpp @@ -351,7 +351,7 @@ int GmioAmfWriter::createObject(const TDF_Label& labelShape) return mat.color == color; }); if (itColor != m_vecMaterial.cend()) { - materialId = itColor - m_vecMaterial.cbegin(); + materialId = CppUtils::safeStaticCast(itColor - m_vecMaterial.cbegin()); } else { materialId = CppUtils::safeStaticCast(m_vecMaterial.size()); diff --git a/src/io_off/io_off_reader.cpp b/src/io_off/io_off_reader.cpp index 2adffc09..2c87f7ee 100644 --- a/src/io_off/io_off_reader.cpp +++ b/src/io_off/io_off_reader.cpp @@ -319,7 +319,7 @@ TDF_Label OffReader::transferMesh(DocumentPtr doc, TaskProgress* progress) std::vector vecVertexColor; vecVertexColor.reserve(m_vecVertex.size()); for (const Vertex& vertex : m_vecVertex) { - const auto ivertex = &vertex - &m_vecVertex.front(); + const auto ivertex = Span_itemIndex(m_vecVertex, vertex); MeshUtils::setNode(mesh, ivertex + 1, vertex.coords); const std::uint32_t c = vertex.color; if (vertex.hasColor) { diff --git a/src/io_ply/io_ply_reader.cpp b/src/io_ply/io_ply_reader.cpp index 50798dbe..67930b10 100644 --- a/src/io_ply/io_ply_reader.cpp +++ b/src/io_ply/io_ply_reader.cpp @@ -202,7 +202,9 @@ TDF_Label PlyReader::transferPointCloud(DocumentPtr doc, TaskProgress* /*progres { const bool hasColors = !m_vecColorComponent.empty(); const bool hasNormals = false; //!m_vecNormalCoord.empty(); - auto gfxPoints = new Graphic3d_ArrayOfPoints(m_vecNodeCoord.size(), hasColors, hasNormals); + auto gfxPoints = new Graphic3d_ArrayOfPoints( + CppUtils::safeStaticCast(m_vecNodeCoord.size()), hasColors, hasNormals + ); // Add nodes(vertices) into point cloud for (int i = 0; CppUtils::cmpLess(i, m_vecNodeCoord.size()); i += 3) { diff --git a/tests/test_base.cpp b/tests/test_base.cpp index 7530422b..7b138c09 100644 --- a/tests/test_base.cpp +++ b/tests/test_base.cpp @@ -1004,6 +1004,21 @@ void TestBase::LibTree_test() } } +void TestBase::Span_test() +{ + const std::vector vecString = { "first", "second", "third", "fourth", "fifth" }; + const std::string& item0 = vecString.at(0); + const std::string& item1 = vecString.at(1); + const std::string& item2 = vecString.at(2); + const std::string& item3 = vecString.at(3); + const std::string& item4 = vecString.at(4); + QCOMPARE(Span_itemIndex(vecString, item0), 0); + QCOMPARE(Span_itemIndex(vecString, item1), 1); + QCOMPARE(Span_itemIndex(vecString, item2), 2); + QCOMPARE(Span_itemIndex(vecString, item3), 3); + QCOMPARE(Span_itemIndex(vecString, item4), 4); +} + void TestBase::initTestCase() { m_ioSystem = new IO::System; diff --git a/tests/test_base.h b/tests/test_base.h index 1d188b2e..56e8773c 100644 --- a/tests/test_base.h +++ b/tests/test_base.h @@ -66,6 +66,8 @@ private slots: void LibTask_test(); void LibTree_test(); + void Span_test(); + void initTestCase(); void cleanupTestCase(); From 34f3521f2a97134d0f74f575a551fd6adcadd179 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 26 Jul 2023 16:32:27 +0200 Subject: [PATCH 40/92] Base: introuce TaskProgress::setValue(double) to fix double/int mismatch warnings --- src/base/task_progress.cpp | 5 +++++ src/base/task_progress.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/base/task_progress.cpp b/src/base/task_progress.cpp index c960d1de..e9587318 100644 --- a/src/base/task_progress.cpp +++ b/src/base/task_progress.cpp @@ -62,6 +62,11 @@ void TaskProgress::setValue(int pct) } } +void TaskProgress::setValue(double pct) +{ + this->setValue(static_cast(pct)); +} + void TaskProgress::setStep(std::string_view title) { if (m_taskMgr && m_taskId != TaskId_null) { diff --git a/src/base/task_progress.h b/src/base/task_progress.h index bdd40263..b084303a 100644 --- a/src/base/task_progress.h +++ b/src/base/task_progress.h @@ -31,6 +31,7 @@ class TaskProgress { // Value in [0,100] int value() const { return m_value; } void setValue(int pct); + void setValue(double pct); const std::string& step() const { return m_step; } void setStep(std::string_view title); From 34de30a93af0656b3ab223ccb22843f466e588fe Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 26 Jul 2023 18:02:07 +0200 Subject: [PATCH 41/92] Base: fix double->int warning in PropertyValueConversion::Variant --- src/base/property_value_conversion.cpp | 13 +++++++---- src/gui/gui_document.cpp | 3 ++- tests/test_base.cpp | 31 ++++++++++++++++++++++++++ tests/test_base.h | 4 ++++ 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/base/property_value_conversion.cpp b/src/base/property_value_conversion.cpp index 694a44d0..dc3bf291 100644 --- a/src/base/property_value_conversion.cpp +++ b/src/base/property_value_conversion.cpp @@ -300,12 +300,17 @@ bool PropertyValueConversion::Variant::toBool(bool* ok) const int PropertyValueConversion::Variant::toInt(bool* ok) const { assignBoolPtr(ok, true); - if (std::holds_alternative(*this)) + if (std::holds_alternative(*this)) { return std::get(*this); - else if (std::holds_alternative(*this)) - return std::get(*this); - else if (std::holds_alternative(*this)) + } + else if (std::holds_alternative(*this)) { + auto dval = std::floor(std::get(*this)); + if (std::isgreaterequal(dval, INT_MIN) && std::islessequal(dval, INT_MAX)) + return static_cast(dval); + } + else if (std::holds_alternative(*this)) { return std::stoi(std::get(*this)); + } assignBoolPtr(ok, false); return 0; diff --git a/src/gui/gui_document.cpp b/src/gui/gui_document.cpp index d655a116..8c9ba963 100644 --- a/src/gui/gui_document.cpp +++ b/src/gui/gui_document.cpp @@ -481,7 +481,8 @@ int GuiDocument::aisViewCubeBoundingSize() const + hnd->BoxEdgeGap() + hnd->BoxEdgeMinSize() + hnd->BoxCornerMinSize() - + hnd->RoundRadius()) + + hnd->RoundRadius() + ) + hnd->AxesPadding() + hnd->FontHeight(); #else diff --git a/tests/test_base.cpp b/tests/test_base.cpp index 7b138c09..65f475e3 100644 --- a/tests/test_base.cpp +++ b/tests/test_base.cpp @@ -256,6 +256,37 @@ void TestBase::FilePath_test() } } +void TestBase::PropertyValueConversionVariant_doubleToInt_test() +{ + using Variant = PropertyValueConversion::Variant; + QFETCH(double, doubleValue); + QFETCH(bool, ok); + + const Variant dvar(doubleValue); + bool okActual = false; + const int asIntValue = dvar.toInt(&okActual); + if (ok) { + QCOMPARE(asIntValue, std::floor(doubleValue)); + } else { + QCOMPARE(asIntValue, 0); + } + + QCOMPARE(okActual, ok); +} + +void TestBase::PropertyValueConversionVariant_doubleToInt_test_data() +{ + using Variant = PropertyValueConversion::Variant; + QTest::addColumn("doubleValue"); + QTest::addColumn("ok"); + QTest::newRow("50.25") << 50.25 << true; + QTest::newRow("-50.25") << -50.25 << true; + QTest::newRow("INT_MAX+1") << (double(INT_MAX) + 1.) << false; + QTest::newRow("INT_MIN-1") << (double(INT_MIN) - 1.) << false; + QTest::newRow("INT_MAX") << double(INT_MAX) << true; + QTest::newRow("INT_MIN") << double(INT_MIN) << true; +} + void TestBase::PropertyValueConversion_test() { QFETCH(QString, strPropertyName); diff --git a/tests/test_base.h b/tests/test_base.h index 56e8773c..0fbffa7f 100644 --- a/tests/test_base.h +++ b/tests/test_base.h @@ -26,8 +26,12 @@ private slots: void FilePath_test(); + void PropertyValueConversionVariant_doubleToInt_test(); + void PropertyValueConversionVariant_doubleToInt_test_data(); + void PropertyValueConversion_test(); void PropertyValueConversion_test_data(); + void PropertyQuantityValueConversion_test(); void PropertyQuantityValueConversion_test_data(); From b71020de60b5cb848e2c2394174cec51d69e7181 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 26 Jul 2023 18:25:02 +0200 Subject: [PATCH 42/92] Base: fix more double->int compiler warnings --- src/base/io_system.cpp | 4 ++-- src/base/task_progress.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/base/io_system.cpp b/src/base/io_system.cpp index da47e5e4..da55bd54 100644 --- a/src/base/io_system.cpp +++ b/src/base/io_system.cpp @@ -216,7 +216,7 @@ bool System::importInDocument(const Args_ImportInDocument& args) if (taskData.fileFormat == Format_Unknown) return fnReadFileError(taskData.filepath, textIdTr("Unknown format")); - int portionSize = 40; + double portionSize = 40; if (fnEntityPostProcessRequired(taskData.fileFormat)) portionSize *= (100 - args.entityPostProcessProgressSize) / 100.; @@ -237,7 +237,7 @@ bool System::importInDocument(const Args_ImportInDocument& args) return true; }; auto fnTransfer = [&](TaskData& taskData) { - int portionSize = 60; + double portionSize = 60; if (fnEntityPostProcessRequired(taskData.fileFormat)) portionSize *= (100 - args.entityPostProcessProgressSize) / 100.; diff --git a/src/base/task_progress.cpp b/src/base/task_progress.cpp index e9587318..88f3840c 100644 --- a/src/base/task_progress.cpp +++ b/src/base/task_progress.cpp @@ -54,7 +54,7 @@ void TaskProgress::setValue(int pct) return; if (m_parent) { - const int valueDeltaInParent = std::ceil((m_value - valueOnEntry) * (m_portionSize / 100.)); + const auto valueDeltaInParent = std::ceil((m_value - valueOnEntry) * (m_portionSize / 100.)); m_parent->setValue(m_parent->value() + valueDeltaInParent); } else { From d0be856b7ae164d453105248271cca00e72602e0 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 26 Jul 2023 18:29:12 +0200 Subject: [PATCH 43/92] Base: fix compilation error with Span_itemIndex() Linux/macOS --- src/base/span.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/base/span.h b/src/base/span.h index 37b9b33d..f2e4e389 100644 --- a/src/base/span.h +++ b/src/base/span.h @@ -22,7 +22,7 @@ constexpr int Span_itemIndex(Span span, typename Span::const_reference ite auto index = &item - &span.front(); assert(index >= 0); assert(index <= INT_MAX); - assert(&span[static_cast::size_type>(index)] == &item); + assert(&span[static_cast::size_type>(index)] == &item); return static_cast(index); } From a5a5dd45927d7e7693720886cfc23ce7974577ac Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 27 Jul 2023 10:22:08 +0200 Subject: [PATCH 44/92] Set dev version to 0.8 [skip ci] --- version.pri | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.pri b/version.pri index 79555ca8..4d6d961b 100644 --- a/version.pri +++ b/version.pri @@ -9,7 +9,7 @@ defined(HAVE_GIT, var) { } MAYO_VERSION_MAJ = 0 -MAYO_VERSION_MIN = 7 +MAYO_VERSION_MIN = 8 MAYO_VERSION_PAT = 0 VERSION = $${MAYO_VERSION_MAJ}.$${MAYO_VERSION_MIN}.$${MAYO_VERSION_PAT}.$${MAYO_VERSION_REVNUM} MAYO_VERSION = $${VERSION}-$$MAYO_VERSION_COMMIT From 6528fb628d9e19c3ba814f1b40fbbaaa82f81b8c Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 27 Jul 2023 12:33:05 +0200 Subject: [PATCH 45/92] Fix MSVC/GCC/Clang compilation warnings --- src/app/commands_window.cpp | 4 ++++ src/app/dialog_inspect_xde.cpp | 4 ++++ src/app/qtgui_utils.cpp | 4 ++-- src/app/widget_clip_planes.cpp | 4 ++-- src/base/mesh_utils.cpp | 6 +++--- src/base/occ_progress_indicator.cpp | 3 +-- src/base/task_manager.cpp | 4 +++- src/base/task_progress.cpp | 4 ++-- src/graphics/graphics_texture2d.h | 24 ++++++++++++++++++++++++ src/graphics/graphics_utils.cpp | 4 ++-- src/gui/gui_document.cpp | 28 +++++++++++++++------------- src/gui/v3d_view_controller.cpp | 2 +- src/io_occ/io_occ_stl.cpp | 2 ++ tests/test_base.cpp | 10 ++++++---- tests/test_measure.h | 3 +++ 15 files changed, 74 insertions(+), 32 deletions(-) create mode 100644 src/graphics/graphics_texture2d.h diff --git a/src/app/commands_window.cpp b/src/app/commands_window.cpp index 9b550f9a..ad939fbf 100644 --- a/src/app/commands_window.cpp +++ b/src/app/commands_window.cpp @@ -113,6 +113,8 @@ void CommandSwitchMainWidgetMode::execute() case IAppContext::Page::Documents: newPage = IAppContext::Page::Home; break; + case IAppContext::Page::Unknown: + break; } this->context()->setCurrentPage(newPage); @@ -147,6 +149,8 @@ void CommandSwitchMainWidgetMode::updateAction() case IAppContext::Page::Documents: this->action()->setText(Command::tr("Go To Home Page")); break; + case IAppContext::Page::Unknown: + break; } } diff --git a/src/app/dialog_inspect_xde.cpp b/src/app/dialog_inspect_xde.cpp index 90ea81b6..9169eb2d 100644 --- a/src/app/dialog_inspect_xde.cpp +++ b/src/app/dialog_inspect_xde.cpp @@ -378,7 +378,11 @@ static void loadLabelVisMaterialProperties( item->addChild(createPropertyTreeItem("BaseColor", material->BaseColor())); item->addChild(createPropertyTreeItem("AlphaMode", MetaEnum::name(material->AlphaMode()))); item->addChild(createPropertyTreeItem("AlphaCutOff", material->AlphaCutOff())); +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 6, 0) + item->addChild(createPropertyTreeItem("FaceCulling", MetaEnum::name(material->FaceCulling()))); +#else item->addChild(createPropertyTreeItem("IsDoubleSided", material->IsDoubleSided())); +#endif if (!material->RawName().IsNull()) item->addChild(createPropertyTreeItem("RawName", to_QString(material->RawName()))); diff --git a/src/app/qtgui_utils.cpp b/src/app/qtgui_utils.cpp index e1cf70b2..8b3dcb1a 100644 --- a/src/app/qtgui_utils.cpp +++ b/src/app/qtgui_utils.cpp @@ -131,14 +131,14 @@ int screenPixelWidth(double screenRatio, const QScreen* screen) { screen = !screen ? QGuiApplication::primaryScreen() : screen; const int screenWidth = screen ? screen->geometry().width() : 800; - return std::round(screenWidth * screenRatio); + return qRound(screenWidth * screenRatio); } int screenPixelHeight(double screenRatio, const QScreen* screen) { screen = !screen ? QGuiApplication::primaryScreen() : screen; const int screenHeight = screen ? screen->geometry().height() : 600; - return std::round(screenHeight * screenRatio); + return qRound(screenHeight * screenRatio); } QSize screenPixelSize(double widthRatio, double heightRatio, const QScreen* screen) diff --git a/src/app/widget_clip_planes.cpp b/src/app/widget_clip_planes.cpp index be168ac1..fd2387e7 100644 --- a/src/app/widget_clip_planes.cpp +++ b/src/app/widget_clip_planes.cpp @@ -11,6 +11,7 @@ #include "../base/math_utils.h" #include "../base/settings.h" #include "../base/tkernel_utils.h" +#include "../graphics/graphics_texture2d.h" #include "../graphics/graphics_utils.h" #include "app_module.h" #include "ui_widget_clip_planes.h" @@ -19,7 +20,6 @@ #include #include #include -#include #include #include @@ -244,7 +244,7 @@ void WidgetClipPlanes::createPlaneCappingTexture() auto fileContentsData = reinterpret_cast(fileContents.constData()); Handle_Image_AlienPixMap imageCapping = new Image_AlienPixMap; imageCapping->Load(fileContentsData, fileContents.size(), filenameUtf8.constData()); - m_textureCapping = new Graphic3d_Texture2Dmanual(imageCapping); + m_textureCapping = new GraphicsTexture2D(imageCapping); m_textureCapping->EnableModulate(); m_textureCapping->EnableRepeat(); m_textureCapping->GetParams()->SetScale(Graphic3d_Vec2(0.05f, -0.05f)); diff --git a/src/base/mesh_utils.cpp b/src/base/mesh_utils.cpp index 129e370e..5ff2e249 100644 --- a/src/base/mesh_utils.cpp +++ b/src/base/mesh_utils.cpp @@ -92,9 +92,9 @@ void MeshUtils::setNormal(const Handle_Poly_Triangulation& triangulation, int in triangulation->SetNormal(index, n); #else TShort_Array1OfShortReal& normals = triangulation->ChangeNormals(); - normals.ChangeValue(index * 3 - 2) = n.X(); - normals.ChangeValue(index * 3 - 1) = n.Y(); - normals.ChangeValue(index * 3) = n.Z(); + normals.ChangeValue(index * 3 - 2) = static_cast(n.X()); + normals.ChangeValue(index * 3 - 1) = static_cast(n.Y()); + normals.ChangeValue(index * 3) = static_cast(n.Z()); #endif } diff --git a/src/base/occ_progress_indicator.cpp b/src/base/occ_progress_indicator.cpp index 2527c050..4b684d20 100644 --- a/src/base/occ_progress_indicator.cpp +++ b/src/base/occ_progress_indicator.cpp @@ -43,8 +43,7 @@ bool OccProgressIndicator::Show(const bool /*force*/) if (m_progress) { m_progress->setStep(to_stdStringView(this->GetScope(1).GetName())); const double pc = this->GetPosition(); // Always within [0,1] - const int val = pc * 100; - m_progress->setValue(val); + m_progress->setValue(pc * 100); } return true; diff --git a/src/base/task_manager.cpp b/src/base/task_manager.cpp index c31a9d38..dee1b779 100644 --- a/src/base/task_manager.cpp +++ b/src/base/task_manager.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -153,7 +154,8 @@ int TaskManager::globalProgress() const taskAccumPct += ptrEntity->taskProgress.value(); } - return MathUtils::toPercent(taskAccumPct, 0, d->mapEntity.size() * 100); + const auto pct = MathUtils::toPercent(taskAccumPct, 0, d->mapEntity.size() * 100); + return std::lround(pct); } const std::string& TaskManager::title(TaskId id) const diff --git a/src/base/task_progress.cpp b/src/base/task_progress.cpp index 88f3840c..0a5207c2 100644 --- a/src/base/task_progress.cpp +++ b/src/base/task_progress.cpp @@ -54,7 +54,7 @@ void TaskProgress::setValue(int pct) return; if (m_parent) { - const auto valueDeltaInParent = std::ceil((m_value - valueOnEntry) * (m_portionSize / 100.)); + const auto valueDeltaInParent = std::round((m_value - valueOnEntry) * (m_portionSize / 100.)); m_parent->setValue(m_parent->value() + valueDeltaInParent); } else { @@ -64,7 +64,7 @@ void TaskProgress::setValue(int pct) void TaskProgress::setValue(double pct) { - this->setValue(static_cast(pct)); + this->setValue(static_cast(std::lround(pct))); } void TaskProgress::setStep(std::string_view title) diff --git a/src/graphics/graphics_texture2d.h b/src/graphics/graphics_texture2d.h new file mode 100644 index 00000000..d46bcc29 --- /dev/null +++ b/src/graphics/graphics_texture2d.h @@ -0,0 +1,24 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#pragma once + +#include +#if OCC_VERSION_HEX >= 0x070700 +# include +#else +# include +#endif + +namespace Mayo { + +#if OCC_VERSION_HEX >= 0x070700 +using GraphicsTexture2D = Graphic3d_Texture2D; +#else +using GraphicsTexture2D = Graphic3d_Texture2Dmanual; +#endif + +} // namespace Mayo diff --git a/src/graphics/graphics_utils.cpp b/src/graphics/graphics_utils.cpp index 404b7483..e33b1adb 100644 --- a/src/graphics/graphics_utils.cpp +++ b/src/graphics/graphics_utils.cpp @@ -72,8 +72,8 @@ gp_Pnt GraphicsUtils::V3dView_to3dPosition(const Handle_V3d_View& view, double x const gp_Pln planeView(pntAt, dirEye); double px, py, pz; - const int ix = static_cast(std::round(x)); - const int iy = static_cast(std::round(y)); + const int ix = std::lround(x); + const int iy = std::lround(y); view->Convert(ix, iy, px, py, pz); const gp_Pnt pntConverted(px, py, pz); const gp_Pnt2d pntConvertedOnPlane = ProjLib::Project(planeView, pntConverted); diff --git a/src/gui/gui_document.cpp b/src/gui/gui_document.cpp index 8c9ba963..ff672e4c 100644 --- a/src/gui/gui_document.cpp +++ b/src/gui/gui_document.cpp @@ -130,12 +130,12 @@ void GuiDocument::setDevicePixelRatio(double ratio) if (viewCube) { viewCube->SetSize(55 * m_devicePixelRatio, true/*adaptOtherParams*/); viewCube->SetFontHeight(12 * m_devicePixelRatio); - const int xyOffset = int(std::round(85 * m_devicePixelRatio)); + const int xyOffset = std::lround(85 * m_devicePixelRatio); viewCube->SetTransformPersistence( new Graphic3d_TransformPers( - Graphic3d_TMF_TriedronPers, - m_viewTrihedronCorner, - Graphic3d_Vec2i(xyOffset, xyOffset) + Graphic3d_TMF_TriedronPers, + m_viewTrihedronCorner, + Graphic3d_Vec2i(xyOffset, xyOffset) ) ); viewCube->Redisplay(true/*allModes*/); @@ -476,15 +476,17 @@ int GuiDocument::aisViewCubeBoundingSize() const #if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 4, 0) auto hnd = opencascade::handle::DownCast(m_aisViewCube); - return 2 * (hnd->Size() - + hnd->BoxFacetExtension() - + hnd->BoxEdgeGap() - + hnd->BoxEdgeMinSize() - + hnd->BoxCornerMinSize() - + hnd->RoundRadius() - ) - + hnd->AxesPadding() - + hnd->FontHeight(); + auto size = + 2 * (hnd->Size() + + hnd->BoxFacetExtension() + + hnd->BoxEdgeGap() + + hnd->BoxEdgeMinSize() + + hnd->BoxCornerMinSize() + + hnd->RoundRadius() + ) + + hnd->AxesPadding() + + hnd->FontHeight(); + return std::lround(size); #else return 0; #endif diff --git a/src/gui/v3d_view_controller.cpp b/src/gui/v3d_view_controller.cpp index ea41f46e..16fdbbae 100644 --- a/src/gui/v3d_view_controller.cpp +++ b/src/gui/v3d_view_controller.cpp @@ -146,7 +146,7 @@ void V3dViewController::startInstantZoom(const Position& currPos) { this->startDynamicAction(DynamicAction::InstantZoom); this->backupCamera(); - const int dX = m_instantZoomFactor * 100; + const int dX = std::lround(m_instantZoomFactor * 100); m_view->StartZoomAtPoint(currPos.x, currPos.y); m_view->ZoomAtPoint(currPos.x, currPos.y, currPos.x + dX, currPos.y); this->redrawView(); diff --git a/src/io_occ/io_occ_stl.cpp b/src/io_occ/io_occ_stl.cpp index c61697c9..ceca9163 100644 --- a/src/io_occ/io_occ_stl.cpp +++ b/src/io_occ/io_occ_stl.cpp @@ -12,6 +12,7 @@ #include "../base/triangulation_annex_data.h" #include "../base/document.h" #include "../base/filepath_conv.h" +#include "../base/global.h" #include "../base/messenger.h" #include "../base/occ_progress_indicator.h" #include "../base/property_enumeration.h" @@ -138,6 +139,7 @@ bool OccStlWriter::writeFile(const FilePath& filepath, TaskProgress* progress) Handle_Message_ProgressIndicator indicator = new OccProgressIndicator(progress); return writer.Write(m_shape, strFilepath.c_str(), TKernelUtils::start(indicator)); #else + MAYO_UNUSED(progress); return writer.Write(m_shape, strFilepath.c_str()); #endif } diff --git a/tests/test_base.cpp b/tests/test_base.cpp index 65f475e3..ce34e019 100644 --- a/tests/test_base.cpp +++ b/tests/test_base.cpp @@ -276,7 +276,6 @@ void TestBase::PropertyValueConversionVariant_doubleToInt_test() void TestBase::PropertyValueConversionVariant_doubleToInt_test_data() { - using Variant = PropertyValueConversion::Variant; QTest::addColumn("doubleValue"); QTest::addColumn("ok"); QTest::newRow("50.25") << 50.25 << true; @@ -718,7 +717,7 @@ void TestBase::Enumeration_test() Enumeration baseEnum = Enumeration::fromType(); QVERIFY(!baseEnum.empty()); QCOMPARE(baseEnum.size(), MetaEnum::count()); - QCOMPARE(baseEnum.items().size(), baseEnum.size()); + QCOMPARE(baseEnum.items().size(), static_cast(baseEnum.size())); for (const auto& enumEntry : MetaEnum::entries()) { QVERIFY(baseEnum.contains(enumEntry.second)); QCOMPARE(baseEnum.findValueByName(enumEntry.second), int(enumEntry.first)); @@ -798,8 +797,11 @@ void TestBase::MeshUtils_test() for (int i = 1; i <= polyTri->NbTriangles(); ++i) { int n1, n2, n3; polyTri->Triangle(i).Get(n1, n2, n3); - polyTriBox->ChangeTriangle(idTriangleOffset + i).Set( - idNodeOffset + n1, idNodeOffset + n2, idNodeOffset + n3); + MeshUtils::setTriangle( + polyTriBox, + idTriangleOffset + i, + { idNodeOffset + n1, idNodeOffset + n2, idNodeOffset + n3 } + ); } idNodeOffset += polyTri->NbNodes(); diff --git a/tests/test_measure.h b/tests/test_measure.h index 775f17c8..852a5382 100644 --- a/tests/test_measure.h +++ b/tests/test_measure.h @@ -6,6 +6,9 @@ #pragma once +#ifdef _MSC_VER +# define _USE_MATH_DEFINES // Fix M_E, M_PI, ... macro redefinitions with qmath.h +#endif #include #include From 0c402c6957cb379e8b2197bfed8f26ee21963e35 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 27 Jul 2023 18:35:01 +0200 Subject: [PATCH 46/92] Graphics: fix crash happening in debug mode Relates to GitHub #217 --- src/app/mainwindow.cpp | 2 +- src/graphics/graphics_scene.cpp | 19 +++++++++++-------- src/gui/gui_application.cpp | 3 ++- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index 34bd75cc..0897e36e 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -57,7 +57,7 @@ MainWindow::MainWindow(GuiApplication* guiApp, QWidget* parent) AppModule::get()->signalMessage.connectSlot(&MainWindow::onMessage, this); guiApp->signalGuiDocumentAdded.connectSlot(&MainWindow::onGuiDocumentAdded, this); - guiApp->signalGuiDocumentErased.connectSlot(&MainWindow::onGuiDocumentAdded, this); + guiApp->signalGuiDocumentErased.connectSlot(&MainWindow::onGuiDocumentErased, this); new DialogTaskManager(&m_taskMgr, this); diff --git a/src/graphics/graphics_scene.cpp b/src/graphics/graphics_scene.cpp index 8160b838..c3cc49db 100644 --- a/src/graphics/graphics_scene.cpp +++ b/src/graphics/graphics_scene.cpp @@ -81,8 +81,7 @@ DEFINE_STANDARD_HANDLE(InteractiveContext, AIS_InteractiveContext) class GraphicsScene::Private { public: - Handle_V3d_Viewer m_v3dViewer; - Handle_InteractiveContext m_aisContext; + opencascade::handle m_aisContext; std::unordered_set m_setClipPlaneSensitive; bool m_isRedrawBlocked = false; SelectionMode m_selectionMode = SelectionMode::Single; @@ -91,23 +90,27 @@ class GraphicsScene::Private { GraphicsScene::GraphicsScene() : d(new Private) { - d->m_v3dViewer = Internal::createOccViewer(); - d->m_aisContext = new InteractiveContext(d->m_v3dViewer); + d->m_aisContext = new InteractiveContext(Internal::createOccViewer()); } GraphicsScene::~GraphicsScene() { + // Preventive cleaning fixes weird crash happening in MSVC Debug mode + d->m_aisContext->RemoveFilters(); + d->m_aisContext->Deactivate(); + d->m_aisContext->EraseAll(false); + d->m_aisContext->RemoveAll(false); delete d; } opencascade::handle GraphicsScene::createV3dView() { - return d->m_v3dViewer->CreateView(); + return this->v3dViewer()->CreateView(); } const opencascade::handle& GraphicsScene::v3dViewer() const { - return d->m_v3dViewer; + return d->m_aisContext->CurrentViewer(); } const opencascade::handle& GraphicsScene::mainSelector() const @@ -148,7 +151,7 @@ void GraphicsScene::redraw() return; //d->m_aisContext->UpdateCurrentViewer(); - for (auto itView = d->m_v3dViewer->DefinedViewIterator(); itView.More(); itView.Next()) + for (auto itView = this->v3dViewer()->DefinedViewIterator(); itView.More(); itView.Next()) this->signalRedrawRequested.send(itView.Value()); } @@ -157,7 +160,7 @@ void GraphicsScene::redraw(const Handle_V3d_View& view) if (d->m_isRedrawBlocked) return; - for (auto itView = d->m_v3dViewer->DefinedViewIterator(); itView.More(); itView.Next()) { + for (auto itView = this->v3dViewer()->DefinedViewIterator(); itView.More(); itView.Next()) { if (itView.Value() == view) { this->signalRedrawRequested.send(view); break; diff --git a/src/gui/gui_application.cpp b/src/gui/gui_application.cpp index 014df79c..4cd49b09 100644 --- a/src/gui/gui_application.cpp +++ b/src/gui/gui_application.cpp @@ -152,7 +152,8 @@ void GuiApplication::onDocumentAboutToClose(const DocumentPtr& doc) auto itFound = std::find_if( d->m_vecGuiDocument.begin(), d->m_vecGuiDocument.end(), - [=](const GuiDocument* guiDoc) { return guiDoc->document() == doc; }); + [=](const GuiDocument* guiDoc) { return guiDoc->document() == doc; } + ); if (itFound != d->m_vecGuiDocument.end()) { GuiDocument* guiDoc = *itFound; d->m_vecGuiDocument.erase(itFound); From 6f67d4ad87bc610f1b211a1abbb5991723508069 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 2 Aug 2023 12:31:44 +0200 Subject: [PATCH 47/92] App: fix compilation errors with Qt6 in CommandSystemInformation Relates to GitHub #210 --- src/app/command_system_information.cpp | 48 +++++++++++++++++--------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index f4804960..9ce38307 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -140,6 +140,30 @@ std::vector& getLibraryInfos() return vec; } +// Helper function returning unicode representation of a QChar object in the form "U+NNNN" +QString toUnicodeHexa(const QChar& ch) +{ + QString strHexa; + QTextStream ostr(&strHexa); + ostr.setNumberFlags(ostr.numberFlags() | QTextStream::UppercaseDigits); + ostr.setIntegerBase(16); // Same as Qt::hex + ostr << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << static_cast(ch.unicode()); + return strHexa; +} + +// Helper function returning unicode representation of a QString object in the form "U+NNNNU+PPPP..." +QString toUnicodeHexa(const QString& str) +{ + QString strHexa; + QTextStream ostr(&strHexa); + ostr.setNumberFlags(ostr.numberFlags() | QTextStream::UppercaseDigits); + ostr.setIntegerBase(16); // Same as Qt::hex + for (const QChar& ch : str) + ostr << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << static_cast(ch.unicode()); + + return strHexa; +} + } // namespace static void dumpOpenGlInfo(QTextStream& str) @@ -196,16 +220,6 @@ static void dumpOpenGlInfo(QTextStream& str) QString CommandSystemInformation::data() { - // Helper function returning unicode representation of a QChar object in the form "U+NNNN" - auto fnStrUnicodeChar = [](const QChar& ch) { - QString str; - QTextStream ostr(&str); - ostr.setNumberFlags(ostr.numberFlags() | QTextStream::UppercaseDigits); - ostr.setIntegerBase(16); // Same as Qt::hex - ostr << "U+" << qSetFieldWidth(4) << qSetPadChar('0') << ch.unicode(); - return str; - }; - QString strSysInfo; QTextStream ostr(&strSysInfo); @@ -254,8 +268,8 @@ QString CommandSystemInformation::data() ostr << indent << "std::locale:" << '\n' << indentx2 << "name: " << to_QString(stdLoc.name()) << '\n' - << indentx2 << "numpunct.decimal_point: " << charDecPnt << " " << fnStrUnicodeChar(charDecPnt) << '\n' - << indentx2 << "numpunct.thousands_sep: " << char1000Sep << " " << fnStrUnicodeChar(char1000Sep) << '\n' + << indentx2 << "numpunct.decimal_point: " << charDecPnt << " " << toUnicodeHexa(charDecPnt) << '\n' + << indentx2 << "numpunct.thousands_sep: " << char1000Sep << " " << toUnicodeHexa(char1000Sep) << '\n' << indentx2 << "numpunct.grouping: " << to_QString(strGrouping) << '\n' << indentx2 << "numpunct.truename: " << to_QString(numFacet.truename()) << '\n' << indentx2 << "numpunct.falsename: " << to_QString(numFacet.falsename()) << '\n'; @@ -265,8 +279,8 @@ QString CommandSystemInformation::data() << indentx2 << "language: " << MetaEnum::name(qtLoc.language()) << '\n' << indentx2 << "measurementSytem: " << MetaEnum::name(qtLoc.measurementSystem()) << '\n' << indentx2 << "textDirection: " << MetaEnum::name(qtLoc.textDirection()) << '\n' - << indentx2 << "decimalPoint: " << qtLoc.decimalPoint() << " " << fnStrUnicodeChar(qtLoc.decimalPoint()) << '\n' - << indentx2 << "groupSeparator: " << qtLoc.groupSeparator() << " " << fnStrUnicodeChar(qtLoc.groupSeparator()) << '\n'; + << indentx2 << "decimalPoint: " << qtLoc.decimalPoint() << " " << toUnicodeHexa(qtLoc.decimalPoint()) << '\n' + << indentx2 << "groupSeparator: " << qtLoc.groupSeparator() << " " << toUnicodeHexa(qtLoc.groupSeparator()) << '\n'; } // C++ StdLib @@ -274,7 +288,7 @@ QString CommandSystemInformation::data() { const QChar dirSeparator(FilePath::preferred_separator); ostr << indent << "std::thread::hardware_concurrency: " << std::thread::hardware_concurrency() << '\n' - << indent << "std::filepath::path::preferred_separator: " << dirSeparator << " " << fnStrUnicodeChar(dirSeparator) << '\n'; + << indent << "std::filepath::path::preferred_separator: " << dirSeparator << " " << toUnicodeHexa(dirSeparator) << '\n'; } // OpenGL @@ -340,13 +354,13 @@ QString CommandSystemInformation::data() << indent << "layoutDirection: " << MetaEnum::name(QGuiApplication::layoutDirection()) << '\n'; const QStyleHints* sh = QGuiApplication::styleHints(); if (sh) { - const QChar pwdChar = sh->passwordMaskCharacter(); + const auto pwdChar = sh->passwordMaskCharacter(); ostr << indent << "styleHints:\n" << indentx2 << "keyboardAutoRepeatRate: " << sh->keyboardAutoRepeatRate() << '\n' << indentx2 << "keyboardInputInterval: " << sh->keyboardInputInterval() << '\n' << indentx2 << "mouseDoubleClickInterval: " << sh->mouseDoubleClickInterval() << '\n' << indentx2 << "mousePressAndHoldInterval: " << sh->mousePressAndHoldInterval() << '\n' - << indentx2 << "passwordMaskCharacter: " << pwdChar << " " << fnStrUnicodeChar(pwdChar) << '\n' + << indentx2 << "passwordMaskCharacter: " << pwdChar << " " << toUnicodeHexa(pwdChar) << '\n' << indentx2 << "passwordMaskDelay: " << sh->passwordMaskDelay() << '\n' << indentx2 << "setFocusOnTouchRelease: " << sh->setFocusOnTouchRelease() << '\n' << indentx2 << "showIsFullScreen: " << sh->showIsFullScreen() << '\n' From 7df8642142c22492395f5d2ccce8eeb788dc5a92 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 2 Aug 2023 12:32:20 +0200 Subject: [PATCH 48/92] Tests: fix compilation warning about _USE_MATH_DEFINES with Qt6 --- tests/test_measure.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_measure.h b/tests/test_measure.h index 852a5382..c66d9756 100644 --- a/tests/test_measure.h +++ b/tests/test_measure.h @@ -6,7 +6,7 @@ #pragma once -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES) # define _USE_MATH_DEFINES // Fix M_E, M_PI, ... macro redefinitions with qmath.h #endif #include From 1381a0ef747fc5bc8f388ba7e752ec85722b39b5 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 3 Aug 2023 18:53:38 +0200 Subject: [PATCH 49/92] CI: add Qt6.5 build for linux pipeline --- .github/workflows/ci_linux.yml | 12 +++++++++++- .github/workflows/ci_macos.yml | 2 +- .github/workflows/ci_windows.yml | 2 +- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index d1291c2d..236734f0 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -4,6 +4,10 @@ on: [push] jobs: build-linux: + strategy: + matrix: + qt_version: [5.15.2, 6.5.2] + runs-on: ubuntu-latest steps: @@ -13,8 +17,14 @@ jobs: - name: Install Qt uses: jurplel/install-qt-action@v3 with: + version: ${{matrix.qt_version}} cache: true - cache-key-prefix: ${{ runner.os }}-QtCache + cache-key-prefix: ${{runner.os}}-QtCache + + # Actually needed for Qt6 + - name: Install dependencies for "xcb" Qt plugin + run: | + sudo apt-get -y install libxcb-cursor0 - name: Install OpenCascade run: | diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml index 7cbd6d3e..943a236a 100644 --- a/.github/workflows/ci_macos.yml +++ b/.github/workflows/ci_macos.yml @@ -14,7 +14,7 @@ jobs: uses: jurplel/install-qt-action@v3 with: cache: true - cache-key-prefix: ${{ runner.os }}-QtCache + cache-key-prefix: ${{runner.os}}-QtCache - name: Install OpenCascade run: | diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index 633bc631..1bb86eaa 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -18,7 +18,7 @@ jobs: uses: jurplel/install-qt-action@v3 with: cache: true - cache-key-prefix: ${{ runner.os }}-QtCache + cache-key-prefix: ${{runner.os}}-QtCache - name: Cache OpenCascade archive id: cache-occ From dd6cac759d09927541fbef3cd508f9a53f87a5a5 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 28 Aug 2023 17:18:41 +0200 Subject: [PATCH 50/92] CI: simplify Qt cache key prefix --- .github/workflows/ci_linux.yml | 2 +- .github/workflows/ci_macos.yml | 2 +- .github/workflows/ci_windows.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 236734f0..586901a5 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -19,7 +19,7 @@ jobs: with: version: ${{matrix.qt_version}} cache: true - cache-key-prefix: ${{runner.os}}-QtCache + cache-key-prefix: QtCache # Actually needed for Qt6 - name: Install dependencies for "xcb" Qt plugin diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml index 943a236a..215faeb8 100644 --- a/.github/workflows/ci_macos.yml +++ b/.github/workflows/ci_macos.yml @@ -14,7 +14,7 @@ jobs: uses: jurplel/install-qt-action@v3 with: cache: true - cache-key-prefix: ${{runner.os}}-QtCache + cache-key-prefix: QtCache - name: Install OpenCascade run: | diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index 1bb86eaa..63cbd1e8 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -18,7 +18,7 @@ jobs: uses: jurplel/install-qt-action@v3 with: cache: true - cache-key-prefix: ${{runner.os}}-QtCache + cache-key-prefix: QtCache - name: Cache OpenCascade archive id: cache-occ From de4414868762b9809f28c203bad46627e63c1e6d Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 29 Aug 2023 12:45:11 +0200 Subject: [PATCH 51/92] Tests: fix duplicated data in TestBase::UnitSystem_test_data() --- tests/test_base.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_base.cpp b/tests/test_base.cpp index ce34e019..6bbd5374 100644 --- a/tests/test_base.cpp +++ b/tests/test_base.cpp @@ -932,9 +932,9 @@ void TestBase::UnitSystem_test_data() QTest::newRow("time(5s)") << UnitSystem::milliseconds(5 * Quantity_Second) << UnitSystem::TranslateResult{ 5000., "ms", Quantity_Millisecond.value() }; - QTest::newRow("time(5s)") - << UnitSystem::milliseconds(5 * Quantity_Second) - << UnitSystem::TranslateResult{ 5000., "ms", Quantity_Millisecond.value() }; + QTest::newRow("time(2min)") + << UnitSystem::milliseconds(2 * Quantity_Minute) + << UnitSystem::TranslateResult{ 2 * 60 * 1000., "ms", Quantity_Millisecond.value() }; } void TestBase::LibTask_test() From 1016ee9ad07fcc04575cecdb9816f8cfe900f2f0 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 30 Aug 2023 10:11:09 +0200 Subject: [PATCH 52/92] README: fix URL of codacy badge [skip ci] --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c1ce7572..609cd760 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![Windows CI](https://github.com/fougue/mayo/actions/workflows/ci_windows.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_windows.yml) [![Linux CI](https://github.com/fougue/mayo/actions/workflows/ci_linux.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_linux.yml) [![macOS CI](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml/badge.svg?branch=develop)](https://github.com/fougue/mayo/actions/workflows/ci_macos.yml) -[![Codacy Badge](https://app.codacy.com/project/badge/Grade/d51f8ca6fea34886b8308ff0246172ce)](https://www.codacy.com/gh/fougue/mayo/dashboard?utm_source=github.com&utm_medium=referral&utm_content=fougue/mayo&utm_campaign=Badge_Grade) +[![Codacy Badge](https://app.codacy.com/project/badge/Grade/d51f8ca6fea34886b8308ff0246172ce)](https://app.codacy.com/gh/fougue/mayo/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) [![Downloads](https://img.shields.io/github/downloads/fougue/mayo/total.svg)](https://github.com/fougue/mayo/releases) [![Version](https://img.shields.io/badge/version-v0.7.0-blue.svg?style=flat)](https://github.com/fougue/mayo/releases) From da862359a7eac2248d20fa3dbf651e72f1557b46 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 7 Sep 2023 16:07:02 +0200 Subject: [PATCH 53/92] Base: refactor CppUtils(doc + separate decl/impl) --- src/base/cpp_utils.h | 82 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 72 insertions(+), 10 deletions(-) diff --git a/src/base/cpp_utils.h b/src/base/cpp_utils.h index 4dc71850..6e47a491 100644 --- a/src/base/cpp_utils.h +++ b/src/base/cpp_utils.h @@ -17,19 +17,85 @@ namespace Mayo { +// Declare CppUtils namespace and its "short" alias +namespace CppUtils {} +namespace Cpp = CppUtils; + +// -- +// -- Declaration +// -- + namespace CppUtils { -inline const std::string& nullString() +// Type alias for the value type associated(mapped) to a key for an associative container(eg std::map) +template +using MappedType = typename AssociativeContainer::mapped_type; + +// Type alias for the key type of an associative container(eg std::map) +template +using KeyType = typename AssociativeContainer::key_type; + +// Returns a default empty std::string object, whose memory address can be used safely +inline const std::string& nullString(); + +// Finds in associative container the value mapped to 'key' +// If 'key' isn't found then a default-constructed value is returned +// The value(mapped) type must default-constructible +template +MappedType findValue( + const KeyType& key, + const AssociativeContainer& container +); + +// Toggles input boolean value(eg true->false) +inline void toggle(bool& value); + +// Same as std::cmp_equal() but provides an implementation if !__cpp_lib_integer_comparison_functions +template constexpr bool cmpEqual(T t, U u) noexcept; + +// Same as std::cmp_not_equal() but provides an implementation if !__cpp_lib_integer_comparison_functions +template constexpr bool cmpNotEqual(T t, U u) noexcept; + +// Same as std::cmp_less() but provides an implementation if !__cpp_lib_integer_comparison_functions +template constexpr bool cmpLess(T t, U u) noexcept; + +// Same as std::cmp_greater() but provides an implementation if !__cpp_lib_integer_comparison_functions +template constexpr bool cmpGreater(T t, U u) noexcept; + +// Same as std::cmp_less_equal() but provides an implementation if !__cpp_lib_integer_comparison_functions +template constexpr bool cmpLessEqual(T t, U u) noexcept; + +// Same as std::cmp_greater_equal() but provides an implementation if !__cpp_lib_integer_comparison_functions +template constexpr bool cmpGreaterEqual(T t, U u) noexcept; + +// Same as std::in_range() but provides an implementation if !__cpp_lib_integer_comparison_functions +template constexpr bool inRange(T t) noexcept; + +// Throws object of specified error type if 'condition' is met +template +void throwErrorIf(bool condition, ErrorArgs... args); + +// Same as static_cast(t) but throws exception if 't' does not fit inside type 'R' +template constexpr R safeStaticCast(T t); + +} // namespace CppUtils + +// -- +// -- Implementation +// -- + +namespace CppUtils { + +const std::string& nullString() { static std::string str; return str; } template -typename AssociativeContainer::mapped_type findValue( - const typename AssociativeContainer::key_type& key, - const AssociativeContainer& container - ) +MappedType findValue( + const KeyType& key, const AssociativeContainer& container +) { auto it = container.find(key); if (it != container.cend()) { @@ -41,7 +107,7 @@ typename AssociativeContainer::mapped_type findValue( } } -inline void toggle(bool& value) +void toggle(bool& value) { value = !value; } @@ -131,7 +197,6 @@ template constexpr bool inRange(T t) noexcept #endif } -// Throws object of specified error type if 'condition' is met template void throwErrorIf(bool condition, ErrorArgs... args) { if (condition) { @@ -139,7 +204,6 @@ template void throwErrorIf(bool condi } } -// Same as static_cast(t) but throw exception if 't' does not fit inside type 'R' template constexpr R safeStaticCast(T t) { throwErrorIf(!inRange(t), "Value too big to fit inside range type"); @@ -148,6 +212,4 @@ template constexpr R safeStaticCast(T t) } // namespace CppUtils -namespace Cpp = CppUtils; - } // namespace Mayo From bb7f22aa66775f3cdb38d2262758d93481a4bc31 Mon Sep 17 00:00:00 2001 From: Undefined Date: Sat, 9 Sep 2023 00:17:27 +0200 Subject: [PATCH 54/92] Fix compilation error --- src/base/libtree.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/base/libtree.h b/src/base/libtree.h index c802bffd..5ef92fce 100644 --- a/src/base/libtree.h +++ b/src/base/libtree.h @@ -9,6 +9,7 @@ #include "cpp_utils.h" #include "span.h" #include +#include #include namespace Mayo { From 58c3c5d82d9bd2d1a8f70b73f912365680416aff Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 20 Sep 2023 18:41:30 +0200 Subject: [PATCH 55/92] App: force xcb QPA plugin only in certain conditions Relates to GitHub #227 --- src/app/main.cpp | 31 +++++++++++++++++++++---------- src/base/math_utils.cpp | 1 - 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/app/main.cpp b/src/app/main.cpp index 4d023fd8..8db21e3e 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -570,16 +570,10 @@ int main(int argc, char* argv[]) { qInstallMessageHandler(&Mayo::LogMessageHandler::qtHandler); - // OpenCascade TKOpenGl depends on XLib for Linux(excepting Android) and BSD systems(excepting macOS) - // See for example implementation of Aspect_DisplayConnection where XLib is explicitly used - // On systems running eg Wayland this would cause problems(see https://github.com/fougue/mayo/issues/178) - // As a workaround the Qt platform is forced to xcb -#if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || (defined(Q_OS_BSD4) && !defined(Q_OS_MACOS)) - qputenv("QT_QPA_PLATFORM", "xcb"); -#endif - // Helper function to check if application arguments contain any option listed in 'listOption' - auto fnArgsContainAnyOf = [=](std::initializer_list listOption) { + // IMPORTANT: capture by reference, because QApplication constructor may alter argc(due to + // parsing of arguments) + auto fnArgsContainAnyOf = [&](std::initializer_list listOption) { for (int i = 1; i < argc; ++i) { for (const char* option : listOption) { if (std::strcmp(argv[i], option) == 0) @@ -589,6 +583,24 @@ int main(int argc, char* argv[]) return false; }; + // If the arguments(argv) contain any of the following option, then Mayo has to run in CLI mode + const bool isAppCliMode = fnArgsContainAnyOf({ "-e", "--export", "-h", "--help", "-v", "--version" }); + + // OpenCascade TKOpenGl depends on XLib for Linux(excepting Android) and BSD systems(excepting macOS) + // See for example implementation of Aspect_DisplayConnection where XLib is explicitly used + // On systems running eg Wayland this would cause problems(see https://github.com/fougue/mayo/issues/178) + // As a workaround the Qt platform is forced to xcb +#if (defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)) || (defined(Q_OS_BSD4) && !defined(Q_OS_MACOS)) + if ( + !isAppCliMode + && !qEnvironmentVariableIsSet("QT_QPA_PLATFORM") + && !fnArgsContainAnyOf({ "-platform" }) + ) + { + qputenv("QT_QPA_PLATFORM", "xcb"); + } +#endif + // Configure and create Qt application object #if defined(Q_OS_WIN) // Never use ANGLE on Windows, since OCCT 3D Viewer does not expect this @@ -598,7 +610,6 @@ int main(int argc, char* argv[]) QCoreApplication::setOrganizationDomain("www.fougue.pro"); QCoreApplication::setApplicationName("Mayo"); QCoreApplication::setApplicationVersion(QString::fromUtf8(Mayo::strVersion)); - const bool isAppCliMode = fnArgsContainAnyOf({ "-e", "--export", "-h", "--help", "-v", "--version" }); std::unique_ptr ptrApp( isAppCliMode ? new QCoreApplication(argc, argv) : new QApplication(argc, argv) ); diff --git a/src/base/math_utils.cpp b/src/base/math_utils.cpp index 99802260..4eda17e9 100644 --- a/src/base/math_utils.cpp +++ b/src/base/math_utils.cpp @@ -13,7 +13,6 @@ #include namespace Mayo { - namespace MathUtils { bool isReversedStandardDir(const gp_Dir& n) From 76b3f76a0d62a71ee1cadd0c1e7c40d3c6e922be Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 4 Oct 2023 18:14:26 +0200 Subject: [PATCH 56/92] I18N: update and fix en/fr translations --- i18n/mayo_en.qm | Bin 21955 -> 52492 bytes i18n/mayo_en.ts | 1452 ++++++++++++++++++----------- i18n/mayo_fr.qm | Bin 55974 -> 60734 bytes i18n/mayo_fr.ts | 901 +++++++++++++----- i18n/messages.cpp | 84 +- src/app/app_module_properties.cpp | 3 + src/app/commands_file.cpp | 4 +- src/io_image/io_image.cpp | 1 + src/io_occ/io_occ_gltf_writer.cpp | 2 + 9 files changed, 1595 insertions(+), 852 deletions(-) diff --git a/i18n/mayo_en.qm b/i18n/mayo_en.qm index 2bd1c216ca12f94ceaba8bf3ee584790fc67df93..d83aed1248b5d3a2e2c95fd3d0b424cc34e5e44c 100644 GIT binary patch literal 52492 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

V%G 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 diff --git a/i18n/mayo_en.ts b/i18n/mayo_en.ts index 43b76ad8..5fcd5f1a 100644 --- a/i18n/mayo_en.ts +++ b/i18n/mayo_en.ts @@ -28,6 +28,33 @@ User Defined + + AppModuleProperties + + VeryCoarse + Very Coarse + + + Coarse + Coarse + + + Normal + Normal + + + Precise + Precise + + + VeryPrecise + Very Precise + + + UserDefined + User Defined + + Mayo::AppModule @@ -157,34 +184,28 @@ Export - VeryCoarse - Very Coarse + Very Coarse - Coarse - Coarse + Coarse - Normal - Normal + Normal - Precise - Precise + Precise - VeryPrecise - Very Precise + Very Precise - UserDefined - User Defined + User Defined @@ -240,17 +261,17 @@ Export - + Language used for the application. Change will take effect after application restart - + In case where multiple documents are opened, make sure the document displayed in the 3D view corresponds to what is selected in the model tree - + Force usage of the fallback Qt widget to display OpenGL graphics. When `OFF` the application will try to use OpenGL framebuffer for rendering, this allows to display overlay widgets(eg measure tools panel) with translucid background. However using OpenGL framebuffer might cause troubles for some users(eg empty 3D window) especially on macOS. @@ -261,49 +282,49 @@ This option is applicable when OpenCascade ≥ 7.6 version. Change will take eff - + Controls precision of the mesh to be computed from the BRep shape - + For the tessellation of faces the chordal deflection limits the distance between a curve and its tessellation - + For the tessellation of faces the angular deflection limits the angle between subsequent segments in a polyline - + Relative computation of edge tolerance If activated, deflection used for the polygonalisation of each edge will be `ChordalDeflection` &#215; `SizeOfEdge`. The deflection used for the faces will be the maximum deflection of their edges. - + 3D view manipulation shortcuts configuration to mimic other common CAD applications - + Angle increment used to turn(rotate) the 3D view around the normal of the view plane(Z axis frame reference) - + Show or hide by default the trihedron centered at world origin. This doesn't affect 3D view of currently opened documents - + Enable capping of currently clipped graphics - + Enable capping hatch texture of currently clipped graphics @@ -417,18 +438,58 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho showNodesOn Show Nodes + + + SI + + + + + ImperialUK + Imperial UK + + + + VeryCoarse + Very Coarse + + + + Coarse + Coarse + + + + Normal + Normal + + + + Precise + Precise + + + + VeryPrecise + Very Precise + + + + UserDefined + User Defined + Mayo::Application Binary Mayo Document Format - + XML Mayo Document Format - + @@ -462,214 +523,218 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho Mayo::Command - + Orthographic - + Perspective - + Projection - + Mode - + Show Origin Trihedron - + Show/Hide Origin Trihedron - + Show Performance Stats - + Show/Hide rendering performance statistics - + Zoom In - + Zoom Out - + Turn Counter Clockwise - + - + Turn Clockwise - + - + %1 files(%2) %1 is the format identifier and %2 is the file filters string - + All files(*.*) - + Select Part File - - + + Mesh BRep shapes - - + + Import time: {}ms - + New - + New Document - + Anonymous%1 - + Open - + Open Documents - + Recent files - + %1 | %2 - + Clear menu - - + + Import Import - + Import in current document - - + + Export selected items - + No item selected for export - + - + Select Output File - + Export time: {}ms - - + Close "%1" - + + Close %1 + + + + Close - + Close all - + Close all documents - - + + Close all except current - + Close all except current document - - Close all except "%1" + + Close all except %1 - + Quit - + Report Bug - + About %1 @@ -680,29 +745,34 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho - + Inspect XDE - - + + Options - + Fullscreen - + Switch Fullscreen/Normal - + + Hide Left Sidebar + + + + Show Left Sidebar @@ -712,17 +782,38 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho - - + + + Go To Home Page + + + + + Go To Documents + + + + + Previous Document - - + + Next Document + + + System Information... + + + + + Copy to Clipboard + + Mayo::DialogAbout @@ -772,82 +863,82 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho XDE - + ShapeType=%1, Evolution=%2 - + Yes - + No - + File Size: %1<br>Dimensions: %2x%3 Depth: %4 - + Error when loading texture file(invalid path?) - + - + Shape Shape - + Color Color - + Material - + - + VisMaterial - + - + Dimension - + - + Datum - + - + GeomTolerance - + - + Error - + - + This document is not suitable for XDE - + - + Attributes - + @@ -855,76 +946,76 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho Options - + Restore default values - + %1 / %2 - + - + Exchange - + - + Load from file... - + - + Save as... - + - - + + Choose INI file - + - - + + INI files(*.ini) - + - - - + + + Error - + - + '%1' doesn't exist - + - + '%1' is not readable - + - + Error when writing to'%1' - + - + Restore values for default section only - + - + Restore values for the whole group - + @@ -932,79 +1023,79 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho Save View to Image - + Options - + Width - + px - + Height - + Keep ratio - + Save - + Copy - + Preview - + %1 files(*.%2) - + Select image file - + Error - + Failed to save image '%1' - + %1x%2 %3 - + Free ratio - + @@ -1012,43 +1103,43 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho Tasks - + / - + Mayo::DocumentPropertyGroup - + filepath File Path - + fileSize File Size - + createdDateTime Created - + modifiedDateTime Modified - + owner Owner - + entityCount Count Of Entities @@ -1169,22 +1260,22 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho Scale entities according some factor - + Import text/dimension objects - + Group all objects within a layer into a single compound shape - + Name of the font to be used when creating shape for text objects - + @@ -1212,44 +1303,44 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho Decimal floating point(ex: 392.65) - + Scientific notation(ex: 3.9265E+2) - + Use the shortest representation: decimal or scientific - + Format used when writing `double` values as strings - + Maximum number of significant digits when writing `double` values - + Write AMF document in ZIP archive containing one file entry - + Filename of the single AMF entry within the ZIP archive. Only applicable if option `{}` is on - + Use the ZIP64 format extensions. Only applicable if option `{}` is on - + @@ -1276,6 +1367,21 @@ Only applicable if option `{}` is on useZip64 Use ZIP64 extensions + + + Decimal + + + + + Scientific + + + + + Shortest + + Mayo::IO::ImageWriter::Properties @@ -1305,52 +1411,62 @@ Only applicable if option `{}` is on Image width in pixels - + Image height in pixels - + Camera orientation expressed in Z-up convention as a unit vector - + - + width Width - + height Height - + backgroundColor Background Color - + cameraOrientation Camera Orientation - + cameraProjection Camera Projection - + No transferred application items - + - + Camera orientation vector must not be null - + + + + + Perspective + + + + + Orthographic + @@ -1384,60 +1500,60 @@ Only applicable if option `{}` is on Mayo::IO::OccCommon - - + + Undefined - + - + posYfwd_posZup - + +Zup - + negZfwd_posYup - + +Yup - + Micrometer - + - + Millimeter - + - + Centimeter - + - + Meter - + - + Kilometer - + - + Inch - + - + Foot - + - + Mile - + @@ -1455,12 +1571,12 @@ Only applicable if option `{}` is on Ignore nodes without geometry(`Yes` by default) - + Use mesh name in case if node name is empty(`Yes` by default) - + @@ -1470,129 +1586,139 @@ Only applicable if option `{}` is on Coordinates Converter - + transformationFormat Transformation Format - + format - Format + Target Format - + forceExportUV Force UV Export Source coordinate system transformation - + Target coordinate system transformation - + Preferred transformation format for writing into glTF file - + Export UV coordinates even if there is no mapped texture - + Automatically choose most compact representation between Mat4 and TRS - + 4x4 transformation matrix - + Transformation decomposed into Translation vector, Rotation quaternion and Scale factor(T * R * S) - + - + Name format for exporting nodes - + - + Name format for exporting meshes - + - + Write image textures into target file. If set to `false` then texture images will be written as separate files. Applicable only if option `{0}` is set to `{1}` - + - + Merge faces within a single part. May reduce JSON size thanks to smaller number of primitive arrays - + - + Prefer keeping 16-bit indexes while merging face. May reduce binary data size thanks to smaller triangle indexes. Applicable only if option `{}` is on - + - + inputCoordinateSystem - + Input Coordinate System - + outputCoordinateSystem - + Output Coordinate System - + nodeNameFormat Node Name Format - + meshNameFormat Mesh Name Format - + embedTextures Embed Textures - + mergeFaces Merge Faces - + keepIndices16b Keep 16bit Indices - + Option supported from OpenCascade ≥ v7.6 [option={}, actual version={}] - + + + + + Json + JSON + + + + Binary + Binary @@ -1620,7 +1746,7 @@ Applicable only if option `{}` is on Manages the continuity of BSpline curves (IGES entities 106, 112 and 126) after translation to Open CASCADE (it requires that the curves in a model be at least C1 continuous; no such requirement is made by IGES).This parameter does not change the continuity of curves that are used in the construction of IGES BRep entities. In this case, the parameter does not influence the continuity of the resulting Open CASCADE curves (it is ignored). - + @@ -1631,52 +1757,52 @@ Concerned entity types are 141 (Boundary), 142 (CurveOnSurface) and 508 (Loop). The processor also decides to re-compute either the 3D or the 2D curve even if both curves are translated successfully and seem to be correct, in case there is inconsistency between them. The processor considers that there is inconsistency if any of the following conditions is satisfied: - the number of sub-curves in the 2D curve is different from the number of sub-curves in the 3D curve. This can be either due to different numbers of sub-curves given in the IGES file or because of splitting of curves during translation - 3D or 2D curve is a Circular Arc (entity type 100) starting and ending in the same point (note that this case is incorrect according to the IGES standard) - + Read failed entities - + Curves are taken as they are in the IGES file. C0 entities of Open CASCADE may be produced - + If an IGES BSpline, Spline or CopiousData curve is C0 continuous, it is broken down into pieces of C1 continuous Geom_BSplineCurve - + IGES Spline curves are broken down into pieces of C2 continuity. If C2 cannot be ensured, the Spline curves will be broken down into pieces of C1 continuity - + Use the preference flag value in the entity's `Parameter Data` section - + The 2D is used to rebuild the 3D in case of their inconsistency - + The 2D is always used to rebuild the 3D (even if 3D is present in the file) - + The 3D is used to rebuild the 2D in case of their inconsistency - + The 3D is always used to rebuild the 2D (even if 2D is present in the file) - + @@ -1699,17 +1825,17 @@ The processor also decides to re-compute either the 3D or the 2D curve even if b Indicates if planes should be saved as Bsplines or Planes (type 108). Writing p-curves on planes is disabled - + OpenCascade TopoDS_Faces will be translated into IGES 144 (Trimmed Surface) entities, no BRep entities will be written to the IGES file - + OpenCascade TopoDS_Faces will be translated into IGES 510 (Face) entities, the IGES file will contain BRep entities - + @@ -1722,7 +1848,7 @@ The processor also decides to re-compute either the 3D or the 2D curve even if b Single precision flag for reading vertex data(coordinates) - + @@ -1734,22 +1860,22 @@ The processor also decides to re-compute either the 3D or the 2D curve even if b Source coordinate system transformation - + Target coordinate system transformation - + inputCoordinateSystem - + Input Coordinate System outputCoordinateSystem - + Output Coordinate System @@ -1788,83 +1914,83 @@ The processor also decides to re-compute either the 3D or the 2D curve even if b When reading AP 209 STEP files, allows selecting either only `design` or `analysis`, or both types of products for translation Note that in AP 203 and AP214 files all products should be marked as `design`, so if this mode is set to `analysis`, nothing will be read - + Specifies which data should be read for the products found in the STEP file - + Specifies preferred type of representation of the shape of the product, in case if a STEP file contains more than one representation (i.e. multiple `PRODUCT_DEFINITION_SHAPE` entities) for a single product - + Defines whether shapes associated with the `PRODUCT_DEFINITION_SHAPE` entity of the product via `SHAPE_ASPECT` should be translated. This kind of association was used for the representation of hybrid models (i.e. models whose shape is composed of different types of representations) in AP 203 files before 1998, but it is also used to associate auxiliary information with the sub-shapes of the part. Though STEP translator tries to recognize such cases correctly, this parameter may be useful to avoid unconditionally translation of shapes associated via `SHAPE_ASPECT` entities. - + Indicates whether to read sub-shape names from 'Name' attributes of STEP Representation Items - + Translate only products that have `PRODUCT_DEFINITION_CONTEXT` with field `life_cycle_stage` set to `design` - + Translate only products that have `PRODUCT_DEFINITION_CONTEXT` with field `life_cycle_stage` set to `analysis` - + Translates all products - + Translate the assembly structure and shapes associated with parts only(not with sub-assemblies) - + Translate only the assembly structure without shapes(a structure of empty compounds). This mode can be useful as an intermediate step in applications requiring specialized processing of assembly parts - + Translate only shapes associated with the product, ignoring the assembly structure (if any). This can be useful to translate only a shape associated with specific product, as a complement to assembly mode - + Translate both the assembly structure and all associated shapes. If both shape and sub-assemblies are associated with the same product, all of them are read and put in a single compound - + Translate all representations(if more than one, put in compound) - + Shift Japanese Industrial Standards - + EUC(Extended Unix Code), multi-byte encoding primarily for Japanese, Korean, and simplified Chinese - + GB(Guobiao) encoding for Simplified Chinese - + @@ -1922,58 +2048,58 @@ This kind of association was used for the representation of hybrid models (i.e. Version of schema used for the output STEP file - + Defines a unit in which the STEP file should be written. If set to unit other than millimeter, the model is converted to these units during the translation - + Parameter to write all free vertices in one SDR (name and style of vertex are lost) or each vertex in its own SDR (name and style of vertex are exported) - + All free vertices are united into one compound and exported in one shape definition representation (vertex name and style are lost) - + Each vertex is exported in its own `SHAPE DEFINITION REPRESENTATION`(vertex name and style are not lost, but the STEP file size increases) - + Indicates whether parametric curves (curves in parametric space of surface) should be written into the STEP file. It can be disabled in order to minimize the size of the resulting file. - + Indicates whether to write sub-shape names to 'Name' attributes of STEP Representation Items - + Author attribute in STEP header - + Organization(of author) attribute in STEP header - + Originating system attribute in STEP header - + Description attribute in STEP header - + @@ -1983,28 +2109,36 @@ It can be disabled in order to minimize the size of the resulting file. Target Format - Ascii - Text + Text - Binary - Binary + Binary Mayo::IO::OccStlWriterI18N - + targetFormat - Target Format + Target Format - - + + Not all BRep faces are meshed - + + + + + Ascii + Text + + + + Binary + Binary @@ -2052,171 +2186,186 @@ It can be disabled in order to minimize the size of the resulting file. Unknown host endianness + + + Ascii + Text + + + + Binary + Binary + Mayo::IO::System Reading file - + Unknown format - + Error during import of '{}' {} - + No supporting reader - + File read problem - + Transferring file - + File transfer problem - + Error during export to '{}' {} - + No supporting writer - + Transfer - + Write - + File write problem - + Mayo::Main - + Theme for the UI(classic|dark) - + - + name - + - + Writes log messages into output file - + - + Don't filter out debug log messages in release build - + - + Disable progress reporting in console output(CLI-mode only) - + - + + Show detailed system information and quit + + + + files - + - + Files to open at startup, optionally - + - + [files...] - + - + Execute unit tests and exit application - + - + OpenCascade settings file doesn't exist or is not readable [path=%1] - + - + OpenCascade settings file could not be loaded with QSettings [path=%1] - + - + Failed to load translation file [path=%1] - + - + Settings file(INI format) to load at startup - + - + Mayo the opensource 3D CAD viewer and converter - + - - - + + + filepath File Path - + Export opened files into an output file, can be repeated for different formats(eg. -e file.stp -e file.igs...) - + - + Failed to load application settings file [path=%1] - + - + No input files -> nothing to export - + - + Failed to load theme '%1' - + @@ -2224,105 +2373,47 @@ It can be disabled in order to minimize the size of the resulting file. Mayo - - - - - Model tree - - - - - Opened documents - - - - - File system - - - - - Close Left Side Bar - - - - - X= - - - - - - - ? - - - - - Y= - - - - - Z= - + - + &File - + - + &Help - + - + &Tools - + - + &Window - + - + &Display - + Import Import - - Options - - - - + Warning - + - - + + Error - - - - - - Data - - - - - Graphics - + @@ -2383,7 +2474,7 @@ It can be disabled in order to minimize the size of the resulting file. Choose color ... - + @@ -2391,33 +2482,33 @@ It can be disabled in order to minimize the size of the resulting file. %1d - + %1h - + %1min - + %1s - + %1%2 - + ERROR no stringifier for property type '%1' - + @@ -2426,12 +2517,12 @@ It can be disabled in order to minimize the size of the resulting file. (%1 %2 %3) - + [%1; %2%3; %4] - + @@ -2440,41 +2531,41 @@ It can be disabled in order to minimize the size of the resulting file. %1%2 - + B - + KB - + MB - + Yes - + No - + Partially - + @@ -2482,12 +2573,12 @@ It can be disabled in order to minimize the size of the resulting file. Edit clip planes - + X plane - + @@ -2495,7 +2586,7 @@ It can be disabled in order to minimize the size of the resulting file. Reverse plane - + @@ -2503,37 +2594,37 @@ It can be disabled in order to minimize the size of the resulting file. +/- - + Y plane - + Z plane - + Custom - + X - + Y - + Z - + @@ -2541,12 +2632,12 @@ It can be disabled in order to minimize the size of the resulting file. Form - + % - + @@ -2556,71 +2647,230 @@ It can be disabled in order to minimize the size of the resulting file. %1 Size: %2 Last modified: %3 - + + + + + Mayo::WidgetGrid + + + Form + + + + + Show Grid + + + + + Plane: XOY + + + + + Plane: ZOX + + + + + Plane: YOZ + + + + + Plane: Custom + + + + + Configuration + + + + + Type + + + + + Rectangular + + + + + Circular + + + + + + + + Y + + + + + Step + + + + + + + + X + + + + + Size + + + + + + Rotation + + + + + + ° + + + + + + Offset + + + + + + Origin + + + + + Radius + + + + + Radius Step + + + + + Division + + + + + Graphics + + + + + + ... + + + + + Tenth Color + + + + + Mode + + + + + Lines + + + + + Points + + + + + Color + Color Mayo::WidgetGuiDocument - + Fit All - + - + + Edit Grid + + + + Edit clip planes - + - + Explode assemblies - + - + Measure shapes - + - + Isometric - + - + Back - + - + Front - + - + Left - + - + Right - + - + Top - + - + Bottom - + - + <b>Left-click</b>: popup menu of pre-defined views <b>CTRL+Left-click</b>: apply '%1' view - + @@ -2628,47 +2878,47 @@ Last modified: %3 New Document - + Create and add an empty document where you can import files - + Open Document(s) - + Select files to load and open as distinct documents - + today %1 - + yersterday %1 - + %1 %2 - + %1 days ago %2 - + @@ -2680,7 +2930,81 @@ Created: %3 Modified: %4 Read: %5 - + + + + + Mayo::WidgetMainControl + + + Form + + + + + Model tree + + + + + Opened documents + + + + + File system + + + + + Close Left Side Bar + + + + + X= + + + + + + + ? + + + + + Y= + + + + + Z= + + + + + + Data + + + + + Graphics + + + + + Options + + + + + Mayo::WidgetMainHome + + + Form + @@ -2688,137 +3012,142 @@ Read: %5 Form - + Area Unit - + Measure - + Millimeter(mm) - + Centimeter(cm) - + Meter(m) - + Inch(in) - + Foot(ft) - + Yard(yd) - + Degree(°) - + Radian(rad) - + Vertex Position - + Circle Center - + Circle Diameter - + Min Distance - + - + + Center-to-center Distance + + + + Length - + - + Square Millimeter(mm²) - + - + Square Centimeter(cm²) - + - + Square Meter(m²) - + - + Square Inch(in²) - + - + Square Foot(ft²) - + - + Square Yard(yd²) - + - + Angle - + - + Surface Area - + Length Unit - + Angle Unit - + - + Select entities to measure - + @@ -2826,17 +3155,17 @@ Read: %5 Form - + Remove from document - + <unnamed> - + @@ -2849,22 +3178,22 @@ Read: %5 Show {} - + - + Instance - + - + Product - + - + Both - + @@ -2872,17 +3201,17 @@ Read: %5 Form - + Property - + Value - + @@ -2994,6 +3323,17 @@ Read: %5 OccStlWriter::Properties + + Ascii + Text + + + Binary + Binary + + + + OccStlWriterI18N Ascii Text @@ -3076,102 +3416,102 @@ Read: %5 Brass - + Bronze - + Copper - + Gold - + Pewter - + Plaster - + Plastic - + Silver - + Steel - + Stone - + ShinyPlastic - + Satin - + Metalized - + NeonGnc - + Chrome - + Aluminium - + Obsidian - + NeonPhc - + Jade - + Default - + diff --git a/i18n/mayo_fr.qm b/i18n/mayo_fr.qm index 8a08dc31a8ff06c663110997218025786a4c0931..abd5f188147847af4e0478ec0a08458a69f0a8c0 100644 GIT binary patch delta 7585 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 delta 4422 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 rAAR8XU(Custom + + AppModuleProperties + + VeryCoarse + Très grossière + + + Coarse + Grossière + + + Normal + Normale + + + Precise + Précise + + + VeryPrecise + Très précise + + + UserDefined + Custom + + Mayo::AppModule @@ -197,34 +224,28 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera Export - VeryCoarse - Très grossière + Très grossière - Coarse - Grossière + Grossière - Normal - Normale + Normale - Precise - Précise + Précise - VeryPrecise - Très précise + Très précise - UserDefined - Custom + Custom @@ -280,17 +301,17 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera Export - + Language used for the application. Change will take effect after application restart Langage de l'application. Tout changement sera effectif après redémarrage de l'application - + In case where multiple documents are opened, make sure the document displayed in the 3D view corresponds to what is selected in the model tree Dans le cas où plusieurs documents sont ouverts, fait en sort que le document affiché dans la vue 2D correspond à ce qui est sélectionné dans l'arborescence du modèle - + Force usage of the fallback Qt widget to display OpenGL graphics. When `OFF` the application will try to use OpenGL framebuffer for rendering, this allows to display overlay widgets(eg measure tools panel) with translucid background. However using OpenGL framebuffer might cause troubles for some users(eg empty 3D window) especially on macOS. @@ -307,17 +328,17 @@ Quand l'option est activée alors l'application utilisera un widget Qt Cette option est appliquable seulement avec la version ≥ 7.6 d'OpenCascade. Tout changement sera effectif après redémarrage de l'application - + Controls precision of the mesh to be computed from the BRep shape Contrôle la précision du maillage calculé à partir de la forme BRep - + For the tessellation of faces the chordal deflection limits the distance between a curve and its tessellation Pour la tesselation des faces, la déflection chordale limite la distance entre une courbe et sa discrétisation - + For the tessellation of faces the angular deflection limits the angle between subsequent segments in a polyline Pour la tesselation des faces, la déflection angulaire limite l'angle entre les segments successifs d'une polyligne @@ -330,7 +351,7 @@ Cette option est appliquable seulement avec la version ≥ 7.6 d'OpenCascad Pour la tesselation des faces, la déflection angulaire limite l'angle entre les segments successifs d'une polyligne - + Relative computation of edge tolerance If activated, deflection used for the polygonalisation of each edge will be `ChordalDeflection` &#215; `SizeOfEdge`. The deflection used for the faces will be the maximum deflection of their edges. @@ -339,27 +360,27 @@ If activated, deflection used for the polygonalisation of each edge will be `Cho Si actif, la déflection utilisée pour la polygonisation de chaque arête sera de `DéflectionChordale` &#215; `TailleArête`. La déflection utilisée pour les faces sera la déflection maximale de ses arêtes. - + 3D view manipulation shortcuts configuration to mimic other common CAD applications Configuration des raccourcis pour manipuler la vue 3D, permet d'imiter les autres application CAO - + Angle increment used to turn(rotate) the 3D view around the normal of the view plane(Z axis frame reference) Incrément angulaire utilisé pour tourner la vue 3D autour de la normale au plan de vue (axe Z de référence) - + Show or hide by default the trihedron centered at world origin. This doesn't affect 3D view of currently opened documents Montrer/cacher par défaut le trièdre positionné à l'orgine "monde". N'affecte pas la vue 3D des documents actuellement ouverts - + Enable capping of currently clipped graphics Activer le bouchage des graphismes actuellement coupés - + Enable capping hatch texture of currently clipped graphics Activer le hachage texturé pour le bouchage des graphismes actuellement coupés @@ -473,6 +494,46 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera showNodesOn Afficher les nœuds + + + SI + SI + + + + ImperialUK + Système impérial + + + + VeryCoarse + Très grossière + + + + Coarse + Grossière + + + + Normal + Normale + + + + Precise + Précise + + + + VeryPrecise + Très précise + + + + UserDefined + Custom + Mayo::Application @@ -561,214 +622,222 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera Mayo::Command - + Orthographic Orthographique - + Perspective - + Projection - + Mode Mode - + Show Origin Trihedron Montrer le trihèdre Origine - + Show/Hide Origin Trihedron Montrer/cacher le trihèdre Origine - + Show Performance Stats Montrer les statistiques de rendu - + Show/Hide rendering performance statistics Montrer/cacher les statistiques de rendu - + Zoom In Zoom avant - + Zoom Out Zoom arrière - + Turn Counter Clockwise Tourner dans le sens anti-horaire - + Turn Clockwise Tourner dans le sens horaire - + %1 files(%2) %1 is the format identifier and %2 is the file filters string %1 fichiers (%2) - + All files(*.*) Tous les fichiers (*.*) - + Select Part File Selectionner fichier pièce - - + + Mesh BRep shapes Maillage des formes BRep - - + + Import time: {}ms Durée import: {}ms - + New Nouveau - + New Document Nouveau Document - + Anonymous%1 Anonyme%1 - + Open Ouvrir - + Open Documents Ouvrir des documents - + Recent files Fichiers récents - + %1 | %2 - + Clear menu Vider le menu - - + + Import Importer - + Import in current document Importer dans le document courant - - + + Export selected items Exporter les éléments sélectionnées - + No item selected for export Aucun élément sélectionné pour l'export - + Select Output File Sélection fichier de sortie - + Export time: {}ms Durée export: {}ms - - + Close "%1" Fermer "%1" - + + Close %1 + Fermer %1 + + + Close Fermer - + Close all Tout fermer - + Close all documents Fermer tous les documents - - + + Close all except current Tout fermer sauf document courant - + Close all except current document Tout fermer sauf document courant - + + Close all except %1 + Tout fermer sauf %1 + + Close all except "%1" - Tout fermer sauf "%1" + Tout fermer sauf "%1" - + Quit Quitter - + Report Bug Signaler un bug - + About %1 À propos %1 @@ -779,29 +848,34 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera Sauvegarder la vue vers une image - + Inspect XDE Inspection XDE - - + + Options Options - + Fullscreen Plein-écran - + Switch Fullscreen/Normal Basculer plein-écran/normal - + + Hide Left Sidebar + Cacher le bandeau vertical fixé à gauche + + + Show Left Sidebar Montrer le bandeau vertical fixé à gauche @@ -811,17 +885,38 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera Montrer/cacher le bandeau vertical fixé à gauche - - + + + Go To Home Page + Aller à la page d'accueil + + + + Go To Documents + Aller à la page des documents + + + + Previous Document Document précédent - - + + Next Document Document suivant + + + System Information... + Informations du système ... + + + + Copy to Clipboard + Copier dans le presse-papiers + Mayo::CommandCloseCurrentDocument @@ -910,52 +1005,52 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera - + Shape Forme - + Color Couleur - + Material - + VisMaterial - + Dimension - + Datum - + GeomTolerance - + Error Erreur - + This document is not suitable for XDE Ce document n'est pas XDE-compatible - + Attributes Attributs @@ -978,61 +1073,61 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera %1 / %2 - + Exchange Échanger - + Load from file... Charger le fichier ... - + Save as... Sauvergarder vers ... - - + + Choose INI file Choisir fichier INI - - + + INI files(*.ini) Fichiers INI(*.ini) - - - + + + Error Erreur - + '%1' doesn't exist '%1' n'existe pas - + '%1' is not readable '%1' ne dispose pas des permissions de lecture - + Error when writing to'%1' Erreur lors de l'écriture vers '%1' - + Restore values for default section only Restaurer les valeurs seulement pour la section par défaut - + Restore values for the whole group Restaure les valeurs pour tout le groupe @@ -1133,32 +1228,32 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera Mayo::DocumentPropertyGroup - + filepath Chemin - + fileSize Taille - + createdDateTime Créé - + modifiedDateTime Modifié - + owner Propriétaire - + entityCount Nombre d'entités @@ -1412,6 +1507,21 @@ Seulement applicable si l'option `%1` est activée useZip64 Utiliser les extensions ZIP64 + + + Decimal + Décimal + + + + Scientific + Scientifique + + + + Shortest + Le plus bref + Mayo::IO::ImageWriter::Properties @@ -1466,40 +1576,50 @@ Seulement applicable si l'option `%1` est activée Orientation de la caméra selon la convention Z-up exprimée en tant que vecteur unitaire - + width Largeur - + height Hauteur - + backgroundColor Couleur de l'arrière plan - + cameraOrientation Orientation de la caméra - + cameraProjection Projection de la caméra - + No transferred application items Aucun élément transféré - + Camera orientation vector must not be null Le vecteur d'orienation de la caméra ne doit pas être nul + + + Perspective + + + + + Orthographic + Orthographique + Mayo::IO::OccBaseMeshReaderProperties @@ -1521,69 +1641,69 @@ Seulement applicable si l'option `%1` est activée Prefix for generating root labels name - + Préfixe pour la génération des noms de labels racine System length units to convert into while reading files - + Système d'unité de longueur cible lors de la lecture fichier Mayo::IO::OccCommon - - + + Undefined Indéfini - + posYfwd_posZup +Zup - + negZfwd_posYup +Yup - + Micrometer Micromètre - + Millimeter Millimètre - + Centimeter Centimètre - + Meter Mètre - + Kilometer Kilomètre - + Inch Pouce - + Foot Pied - + Mile Mile @@ -1622,17 +1742,17 @@ Seulement applicable si l'option `%1` est activée Convertisseur de coordonnées - + transformationFormat Format de transformation - + format - Format + Format cible - + forceExportUV Forcer l'export UV @@ -1676,17 +1796,17 @@ Seulement applicable si l'option `%1` est activée Transformation décomposée en vecteur de translation, quaternion de rotation et facteur d'échelle (T x R x S) - + Name format for exporting nodes Format du nom utilisé pour exporter la hiérarchie de nœuds - + Name format for exporting meshes Format du nom utilisé pour exporter la hiérarchie de maillages - + Write image textures into target file. If set to `false` then texture images will be written as separate files. @@ -1711,7 +1831,7 @@ If set to `false` then texture images will be written as separate files. Applicable only if option `{}` is set to `{}` - + Merge faces within a single part. May reduce JSON size thanks to smaller number of primitive arrays @@ -1720,7 +1840,7 @@ May reduce JSON size thanks to smaller number of primitive arrays Peut réduire la taille JSON grâce à une quantité réduite de tableaux de primitives - + Prefer keeping 16-bit indexes while merging face. May reduce binary data size thanks to smaller triangle indexes. @@ -1733,45 +1853,55 @@ Peut réduite la taille des données grâce à une quantité réduite d'ind Applicable seulement si l'option `{}` est cochée - + inputCoordinateSystem Système de coordonnées d'entrée - + outputCoordinateSystem Système de coordonnées de sortie - + nodeNameFormat Format du nom pour les nœuds - + meshNameFormat Format du nom pour les maillages - + embedTextures Incorporer les textures dans le même fichier cible - + mergeFaces Fusionner les faces - + keepIndices16b Utiliser des indices 16bit - + Option supported from OpenCascade ≥ v7.6 [option={}, actual version={}] Option prise en charge à partir de OpenCascade ≥ v7.6 [option={}, version actuelle={}] + + + Json + JSON + + + + Binary + Binaire + Mayo::IO::OccIgesReader::Properties @@ -1814,7 +1944,7 @@ The processor also decides to re-compute either the 3D or the 2D curve even if b Read failed entities - + Lecture des entités en erreur @@ -2161,29 +2291,37 @@ It can be disabled in order to minimize the size of the resulting file. Format cible - Ascii - Texte + Texte - Binary - Binaire + Binaire Mayo::IO::OccStlWriterI18N - + targetFormat Format cible - - + + Not all BRep faces are meshed Les faces BRep ne sont pas toutes maillées + + + Ascii + Texte + + + + Binary + Binaire + Mayo::IO::OccVrmlWriter::Properties @@ -2230,6 +2368,20 @@ It can be disabled in order to minimize the size of the resulting file. Unknown host endianness Boutisme du CPU inconnu + + Json + JSON + + + + Ascii + Texte + + + + Binary + Binaire + Mayo::IO::System @@ -2323,62 +2475,67 @@ It can be disabled in order to minimize the size of the resulting file. Mayo, une visionneuse 3D en code libre basée surQt5/OpenCascade - + Theme for the UI(classic|dark) Thème de l'IHM (classic|dark) - + name nom - + Writes log messages into output file Écrit les messages de log dans un fichier de sortie - + Don't filter out debug log messages in release build Ne pas filtrer les messages de debug dans la version "release" - + Disable progress reporting in console output(CLI-mode only) Désactiver l'indicateur de progression dans la sortie console (mode CLI seulement) - + + Show detailed system information and quit + Montrer les informations détaillées du système puis quitter + + + files files - + Files to open at startup, optionally Fichiers à ouvrir au démarrage, optionnel - + [files...] [fichiers ...] - + Execute unit tests and exit application Exécuter les tests unitaires et quitter l'application - + OpenCascade settings file doesn't exist or is not readable [path=%1] Le fichier de configuration OpenCascade n'existe pas ou non lisible [chemin=%1] - + OpenCascade settings file could not be loaded with QSettings [path=%1] Le fichier de configuration OpenCascade n'a pu être chargé par QSettings [chemin=%1] - + Failed to load translation file [path=%1] Échec chargement du fichier de traductions [chemin=%1] @@ -2391,7 +2548,7 @@ It can be disabled in order to minimize the size of the resulting file. Export de {} en cours ... - + Failed to load application settings file [path=%1] Échec chargement du fichier de configuration [chemin=%1] @@ -2402,24 +2559,24 @@ It can be disabled in order to minimize the size of the resulting file. - + Settings file(INI format) to load at startup Fichier de configuration (format INI) à charger au démarrage - + Mayo the opensource 3D CAD viewer and converter Mayo le visualiseur et convertisseur 3D pour la CAO - - - + + + filepath - + Export opened files into an output file, can be repeated for different formats(eg. -e file.stp -e file.igs...) Exporter des fichiers dans un fichier de sortie, répétable selon les différents formats supportés (par exemple -e file.stp -e file.igs ...) @@ -2444,12 +2601,12 @@ It can be disabled in order to minimize the size of the resulting file. Export de %1 en cours ... - + No input files -> nothing to export Auncun fichier en entrée -> aucun export - + Failed to load theme '%1' Impossible de charger le thème '%1' @@ -2470,69 +2627,59 @@ It can be disabled in order to minimize the size of the resulting file. - Model tree - Arborescence Modèle + Arborescence Modèle - Opened documents - Documents ouverts + Documents ouverts - File system - Système de fichiers + Système de fichiers - Close Left Side Bar - Fermer la barre à gauche + Fermer la barre à gauche - X= - X= + X= - - - ? - ? + ? - Y= - Y= + Y= - Z= - Z= + Z= - + &File &Fichier - + &Help &Aide - + &Tools &Outils - + &Window F&enêtre - + &Display A&ffichage @@ -2560,11 +2707,6 @@ It can be disabled in order to minimize the size of the resulting file. Report Bug Signaler un bug - - - Options - - Save View to Image Sauvegarder la vue vers une image @@ -2655,13 +2797,13 @@ It can be disabled in order to minimize the size of the resulting file. Selectionner fichier pièce - + Warning Avertissement - - + + Error Erreur @@ -2698,15 +2840,12 @@ It can be disabled in order to minimize the size of the resulting file. Temps export : %1ms - - Data - Données + Données - Graphics - Graphismes + Graphismes Close %1 @@ -2992,12 +3131,12 @@ It can be disabled in order to minimize the size of the resulting file. Form - Form + Form % - + @@ -3014,65 +3153,224 @@ Modifié le: %3 {1 ?} + + Mayo::WidgetGrid + + + Form + Form + + + + Show Grid + Afficher grille + + + + Plane: XOY + Plan : XOY + + + + Plane: ZOX + Plan : ZOX + + + + Plane: YOZ + Plan :YOZ + + + + Plane: Custom + Plan : personnalisé + + + + Configuration + Configuration + + + + Type + + + + + Rectangular + Rectangulaire + + + + Circular + Circulaire + + + + + + + Y + + + + + Step + Pas + + + + + + + X + + + + + Size + Taille + + + + + Rotation + + + + + + ° + + + + + + Offset + Décalage + + + + + Origin + Origine + + + + Radius + Rayon + + + + Radius Step + Pas du rayon + + + + Division + + + + + Graphics + Graphismes + + + + + ... + + + + + Tenth Color + Couleur des dizaines + + + + Mode + Mode + + + + Lines + Lignes + + + + Points + Points + + + + Color + Couleur + + Mayo::WidgetGuiDocument - + Fit All Adapter à tout - + + Edit Grid + Éditer la grille + + + Edit clip planes Éditer les plans de coupe - + Explode assemblies Éclater l'assemblage - + Measure shapes Mesures - + Isometric Isométrique - + Back Arrière - + Front Devant - + Left Gauche - + Right Droit - + Top Haut - + Bottom Bas - + <b>Left-click</b>: popup menu of pre-defined views <b>CTRL+Left-click</b>: apply '%1' view <b>Click gauche</b> : menu déroulant des vues pré-définies @@ -3150,12 +3448,86 @@ Lu: %5 + + Mayo::WidgetMainControl + + + Form + Form + + + + Model tree + Arborescence Modèle + + + + Opened documents + Documents ouverts + + + + File system + Système de fichiers + + + + Close Left Side Bar + Fermer le bandeau vertical fixé à gauche + + + + X= + X= + + + + + + ? + ? + + + + Y= + Y= + + + + Z= + Z= + + + + + Data + Données + + + + Graphics + Graphismes + + + + Options + Options + + + + Mayo::WidgetMainHome + + + Form + Form + + Mayo::WidgetMeasure Form - Form + Form @@ -3170,42 +3542,42 @@ Lu: %5 Millimeter(mm) - Millimètre(mm) + Millimètre (mm) Centimeter(cm) - Centimètre(cm) + Centimètre (cm) Meter(m) - Mètre(m) + Mètre (m) Inch(in) - Pouce(in) + Pouce (in) Foot(ft) - Pied(ft) + Pied (ft) Yard(yd) - + Yard (yd) Degree(°) - Degré(°) + Degré (°) Radian(rad) - + Radian (rad) @@ -3228,52 +3600,52 @@ Lu: %5 Distance min - + Center-to-center Distance Distance entre les centres - + Length Longueur - + Square Millimeter(mm²) - Millimètre carré(mm²) + Millimètre carré (mm²) - + Square Centimeter(cm²) - Centimètre carré(cm²) + Centimètre carré (cm²) - + Square Meter(m²) - Mètre carré(m²) + Mètre carré (m²) - + Square Inch(in²) - Pouce carré(in²) + Pouce carré (in²) - + Square Foot(ft²) - Pied carré(ft²) + Pied carré (ft²) - + Square Yard(yd²) - Yard carré(yd²) + Yard carré (yd²) - + Angle - + Surface Area Aire surface @@ -3308,7 +3680,7 @@ Lu: %5 Unité angle - + Select entities to measure Sélectionner les entités à mesurer @@ -3348,17 +3720,17 @@ Lu: %5 Montrer %1 - + Instance Instance - + Product Produit - + Both Les Deux @@ -3546,6 +3918,17 @@ Lu: %5 Binaire + + OccStlWriterI18N + + Ascii + Texte + + + Binary + Binaire + + OpenCascade::Aspect_HatchStyle diff --git a/i18n/messages.cpp b/i18n/messages.cpp index 2b6956c2..9770e5ac 100644 --- a/i18n/messages.cpp +++ b/i18n/messages.cpp @@ -2,45 +2,59 @@ namespace { double dummy = 0; } +#include "src/io_gmio/io_gmio_amf_writer.cpp" +#include "src/io_image/io_image.cpp" #include "src/io_occ/io_occ_common.h" #include "src/io_occ/io_occ_stl.cpp" +#include "src/io_occ/io_occ_gltf_writer.cpp" +#include "src/io_ply/io_ply_writer.cpp" #include "src/app/app_module.h" #include "src/app/widget_model_tree_builder_xde.h" -namespace Mayo { static void messages() { - AppModule::textId("VeryCoarse"); - AppModule::textId("Coarse"); - AppModule::textId("Normal"); - AppModule::textId("Precise"); - AppModule::textId("VeryPrecise"); - AppModule::textId("UserDefined"); - - WidgetModelTreeBuilder_Xde::textId("Instance"); - WidgetModelTreeBuilder_Xde::textId("Product"); - WidgetModelTreeBuilder_Xde::textId("Both"); + // App + Mayo::AppModuleProperties::textId("SI"); + Mayo::AppModuleProperties::textId("ImperialUK"); + + Mayo::AppModuleProperties::textId("VeryCoarse"); + Mayo::AppModuleProperties::textId("Coarse"); + Mayo::AppModuleProperties::textId("Normal"); + Mayo::AppModuleProperties::textId("Precise"); + Mayo::AppModuleProperties::textId("VeryPrecise"); + Mayo::AppModuleProperties::textId("UserDefined"); + + Mayo::WidgetModelTreeBuilder_Xde::textId("Instance"); + Mayo::WidgetModelTreeBuilder_Xde::textId("Product"); + Mayo::WidgetModelTreeBuilder_Xde::textId("Both"); + + // I/O + Mayo::IO::GmioAmfWriter::Properties::textId("Decimal"); + Mayo::IO::GmioAmfWriter::Properties::textId("Scientific"); + Mayo::IO::GmioAmfWriter::Properties::textId("Shortest"); + + Mayo::IO::OccCommon::textId("Undefined"); // RWMesh_CoordinateSystem_Undefined + Mayo::IO::OccCommon::textId("posYfwd_posZup"); // RWMesh_CoordinateSystem_Zup + Mayo::IO::OccCommon::textId("negZfwd_posYup"); // RWMesh_CoordinateSystem_Yup + + Mayo::IO::OccCommon::textId("Undefined"); + Mayo::IO::OccCommon::textId("Micrometer"); + Mayo::IO::OccCommon::textId("Millimeter"); + Mayo::IO::OccCommon::textId("Centimeter"); + Mayo::IO::OccCommon::textId("Meter"); + Mayo::IO::OccCommon::textId("Kilometer"); + Mayo::IO::OccCommon::textId("Inch"); + Mayo::IO::OccCommon::textId("Foot"); + Mayo::IO::OccCommon::textId("Mile"); + + Mayo::IO::OccStlWriterI18N::textId("Ascii"); + Mayo::IO::OccStlWriterI18N::textId("Binary"); + + Mayo::IO::OccGltfWriter::Properties::textId("Json"); + Mayo::IO::OccGltfWriter::Properties::textId("Binary"); + + Mayo::IO::PlyWriterI18N::textId("Ascii"); + Mayo::IO::PlyWriterI18N::textId("Binary"); + + Mayo::IO::ImageWriterI18N::textId("Perspective"); + Mayo::IO::ImageWriterI18N::textId("Orthographic"); } - -namespace IO { - -static void messages() { - OccCommon::textId("Undefined"); // RWMesh_CoordinateSystem_Undefined - OccCommon::textId("posYfwd_posZup"); // RWMesh_CoordinateSystem_Zup - OccCommon::textId("negZfwd_posYup"); // RWMesh_CoordinateSystem_Yup - - OccCommon::textId("Undefined"); - OccCommon::textId("Micrometer"); - OccCommon::textId("Millimeter"); - OccCommon::textId("Centimeter"); - OccCommon::textId("Meter"); - OccCommon::textId("Kilometer"); - OccCommon::textId("Inch"); - OccCommon::textId("Foot"); - OccCommon::textId("Mile"); - - OccStlWriter::Properties::textId("Ascii"); - OccStlWriter::Properties::textId("Binary"); -} - -} // namespace IO -} // namespace Mayo diff --git a/src/app/app_module_properties.cpp b/src/app/app_module_properties.cpp index a66b597f..e513e7ed 100644 --- a/src/app/app_module_properties.cpp +++ b/src/app/app_module_properties.cpp @@ -155,6 +155,9 @@ void AppModuleProperties::IO_bindParameters(const IO::System* ioSystem) void AppModuleProperties::retranslate() { + // System + this->unitSystemSchema.mutableEnumeration().changeTrContext(AppModuleProperties::textIdContext()); + // Application this->language.setDescription( textIdTr("Language used for the application. Change will take effect after application restart")); diff --git a/src/app/commands_file.cpp b/src/app/commands_file.cpp index 32ab442a..e8a77db9 100644 --- a/src/app/commands_file.cpp +++ b/src/app/commands_file.cpp @@ -490,7 +490,7 @@ void CommandCloseCurrentDocument::updateActionText(Document::Identifier docId) const QString docName = to_QString(docPtr ? docPtr->name() : std::string{}); const QString textActionClose = docPtr ? - Command::tr("Close \"%1\"").arg(strFilepathQuoted(docName)) : + Command::tr("Close %1").arg(strFilepathQuoted(docName)) : Command::tr("Close"); this->action()->setText(textActionClose); this->action()->setToolTip(textActionClose); @@ -561,7 +561,7 @@ void CommandCloseAllDocumentsExceptCurrent::updateActionText(Document::Identifie const QString docName = to_QString(docPtr ? docPtr->name() : std::string{}); const QString textActionClose = docPtr ? - Command::tr("Close all except \"%1\"").arg(strFilepathQuoted(docName)) : + Command::tr("Close all except %1").arg(strFilepathQuoted(docName)) : Command::tr("Close all except current"); this->action()->setText(textActionClose); } diff --git a/src/io_image/io_image.cpp b/src/io_image/io_image.cpp index e1e071d2..a8dc7731 100644 --- a/src/io_image/io_image.cpp +++ b/src/io_image/io_image.cpp @@ -58,6 +58,7 @@ class ImageWriter::Properties : public PropertyGroup { this->cameraOrientation.setDescription( ImageWriterI18N::textIdTr("Camera orientation expressed in Z-up convention as a unit vector")); + this->cameraProjection.mutableEnumeration().changeTrContext(ImageWriterI18N::textIdContext()); } void restoreDefaults() override { diff --git a/src/io_occ/io_occ_gltf_writer.cpp b/src/io_occ/io_occ_gltf_writer.cpp index 08aa4b47..7b5c7fc1 100644 --- a/src/io_occ/io_occ_gltf_writer.cpp +++ b/src/io_occ/io_occ_gltf_writer.cpp @@ -45,6 +45,8 @@ class OccGltfWriter::Properties : public PropertyGroup { "vector, Rotation quaternion and Scale factor(T * R * S)") } }); + this->format.mutableEnumeration().changeTrContext(OccGltfWriter::Properties::textIdContext()); + this->nodeNameFormat.setDescription(textIdTr("Name format for exporting nodes")); this->meshNameFormat.setDescription(textIdTr("Name format for exporting meshes")); this->embedTextures.setDescription( From d9cd9024cd54751835ee2f9ddcfb72435184ce4e Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 4 Oct 2023 18:24:44 +0200 Subject: [PATCH 57/92] App: show canonical path in document selector tooltips --- src/app/gui_document_list_model.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/app/gui_document_list_model.cpp b/src/app/gui_document_list_model.cpp index 5bbd27c3..9d4f10ed 100644 --- a/src/app/gui_document_list_model.cpp +++ b/src/app/gui_document_list_model.cpp @@ -6,6 +6,8 @@ #include "gui_document_list_model.h" +#include "filepath_conv.h" +#include "qstring_conv.h" #include "../base/application.h" #include "../base/document.h" #include "../gui/gui_application.h" @@ -28,18 +30,18 @@ GuiDocumentListModel::GuiDocumentListModel(const GuiApplication* guiApp, QObject QVariant GuiDocumentListModel::data(const QModelIndex& index, int role) const { if (!index.isValid() || index.row() >= this->rowCount()) - return QVariant(); + return {}; const DocumentPtr& doc = m_vecGuiDocument.at(index.row())->document(); switch (role) { case Qt::ToolTipRole: - return QString::fromStdString(doc->filePath().u8string()); + return filepathTo(filepathCanonical(doc->filePath())); case Qt::DisplayRole: case Qt::EditRole: - return QString::fromStdString(doc->name()); + return to_QString(doc->name()); } - return QVariant(); + return {}; } int GuiDocumentListModel::rowCount(const QModelIndex& /*parent*/) const @@ -71,7 +73,8 @@ void GuiDocumentListModel::onDocumentNameChanged(const DocumentPtr& doc, const s auto itFound = std::find_if( m_vecGuiDocument.cbegin(), m_vecGuiDocument.cend(), - [&](const GuiDocument* guiDoc) { return guiDoc->document() == doc; }); + [&](const GuiDocument* guiDoc) { return guiDoc->document() == doc; } + ); if (itFound != m_vecGuiDocument.cend()) { const int row = itFound - m_vecGuiDocument.begin(); const QModelIndex itemIndex = this->index(row); From a3bb8f7dd0305a690a37872b4c818daa8c552985 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 4 Oct 2023 18:30:03 +0200 Subject: [PATCH 58/92] I18N: fix fr for "About %1" message --- i18n/mayo_fr.qm | Bin 60734 -> 60740 bytes i18n/mayo_fr.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/mayo_fr.qm b/i18n/mayo_fr.qm index abd5f188147847af4e0478ec0a08458a69f0a8c0..dbaa78ea56aee779be1938e21505640e447a1640 100644 GIT binary patch delta 4000 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 C!qtWV delta 3994 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 diff --git a/i18n/mayo_fr.ts b/i18n/mayo_fr.ts index 4e31da37..3a75a448 100644 --- a/i18n/mayo_fr.ts +++ b/i18n/mayo_fr.ts @@ -839,7 +839,7 @@ Si actif, la déflection utilisée pour la polygonisation de chaque arête sera About %1 - À propos %1 + À propos de %1 From 4b1a64c4120f9315ef75ac6700fe696fa42b4621 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 4 Oct 2023 18:30:52 +0200 Subject: [PATCH 59/92] App: fix broken virtual dispatch in GuiDocumentListModel --- src/app/gui_document_list_model.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/app/gui_document_list_model.cpp b/src/app/gui_document_list_model.cpp index 9d4f10ed..7ebb5f9c 100644 --- a/src/app/gui_document_list_model.cpp +++ b/src/app/gui_document_list_model.cpp @@ -51,7 +51,9 @@ int GuiDocumentListModel::rowCount(const QModelIndex& /*parent*/) const void GuiDocumentListModel::appendGuiDocument(const GuiDocument* guiDoc) { - const int row = this->rowCount(); + // NOTE: don't use rowCount() as it's virtual and appendGuiDocument() is called in constructor + // of this class(virtual dispatch would be bypassed) + const auto row = int(m_vecGuiDocument.size()); this->beginInsertRows(QModelIndex(), row, row); m_vecGuiDocument.emplace_back(guiDoc); this->endInsertRows(); From cacdb7f272920e44130dd2125b933f99313420f5 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 9 Oct 2023 19:27:22 +0200 Subject: [PATCH 60/92] App: let "XDE Inspect" support embedded textures Relates to GitHub #230 --- src/app/dialog_inspect_xde.cpp | 64 ++++++++++++++++++++++++++++------ src/base/filepath_conv.h | 6 ++++ 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/app/dialog_inspect_xde.cpp b/src/app/dialog_inspect_xde.cpp index 9169eb2d..759d37dc 100644 --- a/src/app/dialog_inspect_xde.cpp +++ b/src/app/dialog_inspect_xde.cpp @@ -13,6 +13,7 @@ #include "../base/settings.h" #include "../base/tkernel_utils.h" #include "app_module.h" +#include "filepath_conv.h" #include "qmeta_tdf_label.h" #include "qstring_conv.h" #include "qstring_utils.h" @@ -295,9 +296,15 @@ static void loadLabelMaterialProperties( // This helper allows "lazy" loading of the image files class ImageFileTreeWidgetItem : public QTreeWidgetItem { public: - void setImageFilePath(int col, const QString& strFilePath) + void setImage(int col, const FilePath& filePath) { - const ItemData item{strFilePath, {}}; + const ItemData item{filePath, {}, {}}; + m_mapColumnItemData.insert({ col, item }); + } + + void setImage(int col, const QByteArray& data) + { + const ItemData item{{}, data, {}}; m_mapColumnItemData.insert({ col, item }); } @@ -312,12 +319,23 @@ class ImageFileTreeWidgetItem : public QTreeWidgetItem { return {}; if (ptrItem->strToolTip.isEmpty()) { - const QPixmap pixmap(ptrItem->strFilePath); + QPixmap pixmap; + uintmax_t imageSize = 0; + + if (!ptrItem->filePath.empty()) { + pixmap.load(filepathTo(ptrItem->filePath)); + imageSize = filepathFileSize(ptrItem->filePath); + } + else { + pixmap.loadFromData(ptrItem->fileData); + imageSize = ptrItem->fileData.size(); + } + if (!pixmap.isNull()) { QBuffer bufferPixmap; - const QPixmap pixmapClamped = pixmap.scaledToWidth(std::min(pixmap.width(), 400)); + const int pixmapWidth = std::min(pixmap.width(), int(400 * qGuiApp->devicePixelRatio())); + const QPixmap pixmapClamped = pixmap.scaledToWidth(pixmapWidth); pixmapClamped.save(&bufferPixmap, "PNG"); - const auto imageSize = QFileInfo(ptrItem->strFilePath).size(); const QString strImageSize = QStringUtils::bytesText(imageSize, appDefaultTextOptions().locale); ptrItem->strToolTip = QString("

%4

") @@ -325,7 +343,7 @@ class ImageFileTreeWidgetItem : public QTreeWidgetItem { .arg(pixmapClamped.width()) .arg(pixmapClamped.height()) .arg(DialogInspectXde::tr("File Size: %1
Dimensions: %2x%3 Depth: %4") - .arg(strImageSize).arg(pixmap.width()).arg(pixmap.height()).arg(pixmap.depth())) + .arg(strImageSize).arg(pixmap.width()).arg(pixmap.height()).arg(pixmap.depth())) ; } else { @@ -338,7 +356,8 @@ class ImageFileTreeWidgetItem : public QTreeWidgetItem { private: struct ItemData { - QString strFilePath; + FilePath filePath; + QByteArray fileData; QString strToolTip; }; @@ -350,11 +369,36 @@ static QTreeWidgetItem* createPropertyTreeItem(const QString& text, const Handle if (imgTexture.IsNull()) return static_cast(nullptr); - const QString strTextureFilePath = to_QString(imgTexture->FilePath()); auto item = new ImageFileTreeWidgetItem; item->setText(0, text); - item->setText(1, strTextureFilePath); - item->setImageFilePath(1, strTextureFilePath); + if (!imgTexture->FilePath().IsEmpty()) { + // Texture is provided through a file reference + const FilePath filePath = filepathCanonical(filepathFrom(imgTexture->FilePath())); + const QString strFilePath = filepathTo(filePath); + const auto fileOffset = imgTexture->FileOffset(); + if (fileOffset > 0) { + // Texture is defined in a file portion + item->setText(1, DialogInspectXde::tr("%1,offset:%2").arg(strFilePath).arg(fileOffset)); + QFile file(strFilePath); + if (file.open(QIODevice::ReadOnly)) { + file.seek(fileOffset); + const QByteArray buff = file.read(imgTexture->FileLength()); + item->setImage(1, buff); + } + } + else { + // Texture is defined in a file + item->setText(1, strFilePath); + item->setImage(1, filePath); + } + } + else if (imgTexture->DataBuffer() && !imgTexture->DataBuffer()->IsEmpty()) { + // Texture is provided by some embedded data + item->setText(1, DialogInspectXde::tr("")); + const Handle(NCollection_Buffer)& buff = imgTexture->DataBuffer(); + item->setImage(1, QByteArray::fromRawData(reinterpret_cast(buff->Data()), buff->Size())); + } + return item; } #endif diff --git a/src/base/filepath_conv.h b/src/base/filepath_conv.h index 28767fde..cb898148 100644 --- a/src/base/filepath_conv.h +++ b/src/base/filepath_conv.h @@ -51,5 +51,11 @@ inline FilePath filepathFrom(std::string_view strUtf8) { return std_filesystem::u8path(strUtf8); } +// TCollection_AsciiString -> FilePath +// Assumes utf8 encoding +inline FilePath filepathFrom(const TCollection_AsciiString& strUtf8) { + return std_filesystem::u8path(strUtf8.ToCString()); +} + } // namespace Mayo From 4b85215b3de19c807def74c0e36c4a2641daa948 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 10 Oct 2023 18:20:47 +0200 Subject: [PATCH 61/92] App: load builtin qtbase i18n files Relates to GitHub #231 --- mayo.pro | 8 ++++++++ src/app/main.cpp | 16 ++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/mayo.pro b/mayo.pro index efff154b..6322ef17 100644 --- a/mayo.pro +++ b/mayo.pro @@ -119,6 +119,14 @@ OTHER_FILES += \ images/credits.txt \ scripts/bump-version.rb \ +# Embed qtbase_*.qm files as a resource +qtBaseQmRes.files = \ + $$[QT_INSTALL_TRANSLATIONS]/qtbase_en.qm \ + $$[QT_INSTALL_TRANSLATIONS]/qtbase_fr.qm +qtBaseQmRes.base = $$[QT_INSTALL_TRANSLATIONS] +qtBaseQmRes.prefix = "/i18n" +RESOURCES += qtBaseQmRes + # Optional developer-specific QMake pri file for environment related settings exists($$PWD/env.pri) { include($$PWD/env.pri) diff --git a/src/app/main.cpp b/src/app/main.cpp index 8db21e3e..2379b28c 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -460,12 +460,16 @@ static int runApp(QCoreApplication* qtApp) appModule->settings()->setStorage(std::make_unique()); { // Load translation files - const QString qmFilePath = QString(":/i18n/mayo_%1.qm").arg(appModule->languageCode()); - auto translator = new QTranslator(qtApp); - if (translator->load(qmFilePath)) - qtApp->installTranslator(translator); - else - qWarning() << Main::tr("Failed to load translation file [path=%1]").arg(qmFilePath); + auto fnLoadQmFile = [=](const QString& qmFilePath) { + auto translator = new QTranslator(qtApp); + if (translator->load(qmFilePath)) + qtApp->installTranslator(translator); + else + qWarning() << Main::tr("Failed to load translation file [path=%1]").arg(qmFilePath); + }; + const QString appLangCode = appModule->languageCode(); + fnLoadQmFile(QString(":/i18n/mayo_%1.qm").arg(appLangCode)); + fnLoadQmFile(QString(":/i18n/qtbase_%1.qm").arg(appLangCode)); } // Initialize Base application From 0014d5dd083f27d895cb9a006c18f703c247f635 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 11 Oct 2023 18:46:27 +0200 Subject: [PATCH 62/92] Indentations --- src/app/widget_model_tree.cpp | 24 ++++++++++++++++-------- src/base/io_system.cpp | 15 ++++++++++----- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/app/widget_model_tree.cpp b/src/app/widget_model_tree.cpp index 3089d190..a2939bbe 100644 --- a/src/app/widget_model_tree.cpp +++ b/src/app/widget_model_tree.cpp @@ -143,11 +143,13 @@ WidgetModelTree::WidgetModelTree(QWidget* widget) modelTreeBtns->addButton( idBtnRemove, mayoTheme()->icon(Theme::Icon::Cross), - tr("Remove from document")); + tr("Remove from document") + ); modelTreeBtns->setButtonDetection( idBtnRemove, Internal::TreeItemTypeRole, - QVariant(Internal::TreeItemType_DocumentEntity)); + QVariant(Internal::TreeItemType_DocumentEntity) + ); modelTreeBtns->setButtonDisplayColumn(idBtnRemove, 0); modelTreeBtns->setButtonDisplayModes(idBtnRemove, ItemViewButtons::DisplayOnDetection); modelTreeBtns->setButtonItemSide(idBtnRemove, ItemViewButtons::ItemRightSide); @@ -318,7 +320,8 @@ WidgetModelTreeBuilder* WidgetModelTree::findSupportBuilder(const DocumentPtr& d auto it = std::find_if( std::next(m_vecBuilder.cbegin()), m_vecBuilder.cend(), - [=](const BuilderPtr& builder) { return builder->supportsDocument(doc); }); + [=](const BuilderPtr& builder) { return builder->supportsDocument(doc); } + ); return it != m_vecBuilder.cend() ? it->get() : m_vecBuilder.front().get(); } @@ -328,7 +331,8 @@ WidgetModelTreeBuilder* WidgetModelTree::findSupportBuilder(const DocumentTreeNo auto it = std::find_if( std::next(m_vecBuilder.cbegin()), m_vecBuilder.cend(), - [=](const BuilderPtr& builder) { return builder->supportsDocumentTreeNode(node); }); + [=](const BuilderPtr& builder) { return builder->supportsDocumentTreeNode(node); } + ); return it != m_vecBuilder.cend() ? it->get() : m_vecBuilder.front().get(); } @@ -409,7 +413,8 @@ void WidgetModelTree::connectTreeModelDataChanged(bool on) if (on) { m_connTreeModelDataChanged = QObject::connect( m_ui->treeWidget_Model->model(), &QAbstractItemModel::dataChanged, - this, &WidgetModelTree::onTreeModelDataChanged, Qt::UniqueConnection); + this, &WidgetModelTree::onTreeModelDataChanged, Qt::UniqueConnection + ); } else { QObject::disconnect(m_connTreeModelDataChanged); @@ -422,7 +427,8 @@ void WidgetModelTree::connectTreeWidgetDocumentSelectionChanged(bool on) m_connTreeWidgetDocumentSelectionChanged = QObject::connect( m_ui->treeWidget_Model->selectionModel(), &QItemSelectionModel::selectionChanged, this, &WidgetModelTree::onTreeWidgetDocumentSelectionChanged, - Qt::UniqueConnection); + Qt::UniqueConnection + ); } else { QObject::disconnect(m_connTreeWidgetDocumentSelectionChanged); @@ -430,7 +436,8 @@ void WidgetModelTree::connectTreeWidgetDocumentSelectionChanged(bool on) } void WidgetModelTree::onTreeModelDataChanged( - const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector& roles) + const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector& roles + ) { if (roles.contains(Qt::CheckStateRole) && topLeft == bottomRight) { const QModelIndex& indexItem = topLeft; @@ -454,7 +461,8 @@ void WidgetModelTree::onTreeModelDataChanged( } void WidgetModelTree::onNodesVisibilityChanged( - const GuiDocument* guiDoc, const std::unordered_map& mapNodeId) + const GuiDocument* guiDoc, const std::unordered_map& mapNodeId + ) { QTreeWidgetItem* treeItemDoc = this->findTreeItem(guiDoc->document()); if (!treeItemDoc) diff --git a/src/base/io_system.cpp b/src/base/io_system.cpp index da55bd54..2071d11d 100644 --- a/src/base/io_system.cpp +++ b/src/base/io_system.cpp @@ -228,7 +228,8 @@ bool System::importInDocument(const Args_ImportInDocument& args) taskData.reader->setMessenger(messenger); if (args.parametersProvider) { taskData.reader->applyProperties( - args.parametersProvider->findReaderParameters(taskData.fileFormat)); + args.parametersProvider->findReaderParameters(taskData.fileFormat) + ); } if (!taskData.reader->readFile(taskData.filepath, &progress)) @@ -257,7 +258,8 @@ bool System::importInDocument(const Args_ImportInDocument& args) TaskProgress progress( taskData.progress, args.entityPostProcessProgressSize, - args.entityPostProcessProgressStep); + args.entityPostProcessProgressStep + ); const double subPortionSize = 100. / double(taskData.seqTransferredEntity.Size()); for (const TDF_Label& labelEntity : taskData.seqTransferredEntity) { TaskProgress subProgress(&progress, subPortionSize); @@ -419,7 +421,8 @@ System::Operation_ExportApplicationItems System::exportApplicationItems() void System::visitUniqueItems( Span spanItem, - std::function fnCallback) + std::function fnCallback + ) { std::unordered_set setDoc; for (const ApplicationItem& item : spanItem) { @@ -446,7 +449,8 @@ void System::visitUniqueItems( void System::traverseUniqueItems( Span spanItem, std::function fnCallback, - TreeTraversal mode) + TreeTraversal mode + ) { System::visitUniqueItems(spanItem, [=](const ApplicationItem& item) { const DocumentPtr doc = item.document(); @@ -568,7 +572,8 @@ Format probeFormat_STL(const System::FormatProbeInput& input) bytes[offset] | (bytes[offset+1] << 8) | (bytes[offset+2] << 16) - | (bytes[offset+3] << 24); + | (bytes[offset+3] << 24) + ; constexpr unsigned facetSize = (sizeof(float) * 12) + sizeof(uint16_t); if ((facetSize * facetsCount + binaryStlHeaderSize) == input.hintFullSize) return Format_STL; From 82da1aa6e2c9a349b60a0643c5880f01cefd39c6 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 11 Oct 2023 18:48:28 +0200 Subject: [PATCH 63/92] Introduce helper function to_OccHandleHAsciiString() --- src/base/string_conv.h | 6 ++++++ src/io_occ/io_occ_step.cpp | 12 ++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/base/string_conv.h b/src/base/string_conv.h index 97dc9e22..3aed80f4 100644 --- a/src/base/string_conv.h +++ b/src/base/string_conv.h @@ -49,6 +49,12 @@ TCollection_AsciiString to_OccAsciiString(const StringType& str) { return string_conv(str); } +// X -> Handle(TCollection_HAsciiString) +template +Handle(TCollection_HAsciiString) to_OccHandleHAsciiString(const StringType& str) { + return string_conv(str); +} + // X -> TCollection_ExtendedString template TCollection_ExtendedString to_OccExtString(const StringType& str) { diff --git a/src/io_occ/io_occ_step.cpp b/src/io_occ/io_occ_step.cpp index 0cc929cb..71e3cfa3 100644 --- a/src/io_occ/io_occ_step.cpp +++ b/src/io_occ/io_occ_step.cpp @@ -329,14 +329,10 @@ bool OccStepWriter::writeFile(const FilePath& filepath, TaskProgress* /*progress this->changeStaticVariables(&rollback); APIHeaderSection_MakeHeader makeHeader(m_writer->ChangeWriter().Model()); - makeHeader.SetAuthorValue( - 1, string_conv(m_params.headerAuthor)); - makeHeader.SetOrganizationValue( - 1, string_conv(m_params.headerOrganization)); - makeHeader.SetOriginatingSystem( - string_conv(m_params.headerOriginatingSystem)); - makeHeader.SetDescriptionValue( - 1, string_conv(m_params.headerDescription)); + makeHeader.SetAuthorValue(1, to_OccHandleHAsciiString(m_params.headerAuthor)); + makeHeader.SetOrganizationValue(1, to_OccHandleHAsciiString(m_params.headerOrganization)); + makeHeader.SetOriginatingSystem(to_OccHandleHAsciiString(m_params.headerOriginatingSystem)); + makeHeader.SetDescriptionValue(1, to_OccHandleHAsciiString(m_params.headerDescription)); const IFSelect_ReturnStatus err = m_writer->Write(filepath.u8string().c_str()); return err == IFSelect_RetDone; From 61945117e37056acdb3e78bf17298baef2cac18a Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 11 Oct 2023 18:49:25 +0200 Subject: [PATCH 64/92] IO_OCC: use System::visitUniqueItems() helper function Relates to GitHub #229 --- src/base/brep_utils.cpp | 8 +++++++- src/base/brep_utils.h | 3 +++ src/base/io_system.cpp | 2 +- src/io_dxf/io_dxf.cpp | 13 +++++-------- src/io_gmio/io_gmio_amf_writer.cpp | 3 ++- src/io_occ/io_occ_brep.cpp | 14 ++++++-------- src/io_occ/io_occ_caf.cpp | 13 +++++++++---- src/io_occ/io_occ_gltf_writer.cpp | 5 +++-- src/io_occ/io_occ_iges.cpp | 8 ++++++-- src/io_occ/io_occ_obj_writer.cpp | 5 +++-- src/io_occ/io_occ_step.cpp | 1 + src/io_occ/io_occ_stl.cpp | 27 +++++++++++---------------- src/io_occ/io_occ_vrml_writer.cpp | 15 ++++++++++----- 13 files changed, 67 insertions(+), 50 deletions(-) diff --git a/src/base/brep_utils.cpp b/src/base/brep_utils.cpp index 47ea423c..f5ac725e 100644 --- a/src/base/brep_utils.cpp +++ b/src/base/brep_utils.cpp @@ -24,12 +24,18 @@ namespace Mayo { TopoDS_Compound BRepUtils::makeEmptyCompound() { - BRep_Builder builder; + TopoDS_Builder builder; TopoDS_Compound comp; builder.MakeCompound(comp); return comp; } +void BRepUtils::addShape(TopoDS_Shape* ptrTargetShape, const TopoDS_Shape& shape) +{ + TopoDS_Builder builder; + builder.Add(*ptrTargetShape, shape); +} + TopoDS_Face BRepUtils::makeFace(const Handle(Poly_Triangulation)& mesh) { TopoDS_Face face; diff --git a/src/base/brep_utils.h b/src/base/brep_utils.h index 727b7308..98d6952c 100644 --- a/src/base/brep_utils.h +++ b/src/base/brep_utils.h @@ -23,6 +23,9 @@ struct BRepUtils { // Creates a valid and empty TopoDS_Compound shape static TopoDS_Compound makeEmptyCompound(); + // Adds 'shape' in target shape 'ptrTargetShape' + static void addShape(TopoDS_Shape* ptrTargetShape, const TopoDS_Shape& shape); + // Creates a non-geometric TopoDS_Face wrapping triangulation 'mesh' static TopoDS_Face makeFace(const Handle(Poly_Triangulation)& mesh); diff --git a/src/base/io_system.cpp b/src/base/io_system.cpp index 2071d11d..47bfd7ac 100644 --- a/src/base/io_system.cpp +++ b/src/base/io_system.cpp @@ -426,7 +426,7 @@ void System::visitUniqueItems( { std::unordered_set setDoc; for (const ApplicationItem& item : spanItem) { - if (item.isDocument()) { + if (item.isDocument() && item.document()->entityCount() > 0) { auto [it, ok] = setDoc.insert(item.document()); if (ok) fnCallback(item); diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index 5d97b9ef..1d7b29da 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -6,6 +6,7 @@ #include "io_dxf.h" +#include "../base/brep_utils.h" #include "../base/cpp_utils.h" #include "../base/document.h" #include "../base/filepath.h" @@ -213,12 +214,10 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) if (startsWith(layerName, "BLOCKS")) continue; // Skip - BRep_Builder builder; - TopoDS_Compound comp; - builder.MakeCompound(comp); + TopoDS_Compound comp = BRepUtils::makeEmptyCompound(); for (const Entity& entity : vecEntity) { if (!entity.shape.IsNull()) - builder.Add(comp, entity.shape); + BRepUtils::addShape(&comp, entity.shape); } if (!comp.IsNull()) { @@ -421,12 +420,10 @@ void DxfReader::Internal::OnReadInsert(const double* point, const double* scale, if (!startsWith(k, prefix)) continue; // Skip - BRep_Builder builder; - TopoDS_Compound comp; - builder.MakeCompound(comp); + TopoDS_Compound comp = BRepUtils::makeEmptyCompound(); for (const DxfReader::Entity& entity : vecEntity) { if (!entity.shape.IsNull()) - builder.Add(comp, entity.shape); + BRepUtils::addShape(&comp, entity.shape); } if (comp.IsNull()) diff --git a/src/io_gmio/io_gmio_amf_writer.cpp b/src/io_gmio/io_gmio_amf_writer.cpp index b373e1ca..8c2d0199 100644 --- a/src/io_gmio/io_gmio_amf_writer.cpp +++ b/src/io_gmio/io_gmio_amf_writer.cpp @@ -157,7 +157,8 @@ class GmioAmfWriter::Properties : public PropertyGroup { this->createZipArchive.label())); } - void restoreDefaults() override { + void restoreDefaults() override + { const GmioAmfWriter::Parameters params; this->float64Format.setValue(params.float64Format); this->float64Precision.setValue(params.float64Precision); diff --git a/src/io_occ/io_occ_brep.cpp b/src/io_occ/io_occ_brep.cpp index aa5c9193..f39c7ec3 100644 --- a/src/io_occ/io_occ_brep.cpp +++ b/src/io_occ/io_occ_brep.cpp @@ -7,10 +7,12 @@ #include "io_occ_brep.h" #include "../base/application_item.h" +#include "../base/brep_utils.h" #include "../base/caf_utils.h" #include "../base/document.h" #include "../base/filepath_conv.h" #include "../base/occ_progress_indicator.h" +#include "../base/io_system.h" #include "../base/task_progress.h" #include "../base/tkernel_utils.h" @@ -52,7 +54,7 @@ bool OccBRepWriter::transfer(Span appItems, TaskProgress* std::vector vecShape; vecShape.reserve(appItems.size()); - for (const ApplicationItem& item : appItems) { + System::visitUniqueItems(appItems, [&](const ApplicationItem& item) { if (item.isDocument()) { for (const TDF_Label& label : item.document()->xcaf().topLevelFreeShapes()) vecShape.push_back(XCaf::shape(label)); @@ -61,16 +63,12 @@ bool OccBRepWriter::transfer(Span appItems, TaskProgress* const TDF_Label labelNode = item.documentTreeNode().label(); vecShape.push_back(XCaf::shape(labelNode)); } - } + }); if (vecShape.size() > 1) { - TopoDS_Compound cmpd; - BRep_Builder builder; - builder.MakeCompound(cmpd); + m_shape = BRepUtils::makeEmptyCompound(); for (const TopoDS_Shape& subShape : vecShape) - builder.Add(cmpd, subShape); - - m_shape = cmpd; + BRepUtils::addShape(&m_shape, subShape); } else if (vecShape.size() == 1) { m_shape = vecShape.front(); diff --git a/src/io_occ/io_occ_caf.cpp b/src/io_occ/io_occ_caf.cpp index bd522d4c..269347da 100644 --- a/src/io_occ/io_occ_caf.cpp +++ b/src/io_occ/io_occ_caf.cpp @@ -8,6 +8,7 @@ #include "../base/global.h" #include "../base/document.h" #include "../base/occ_progress_indicator.h" +#include "../base/io_system.h" #include "../base/task_progress.h" #include "../base/tkernel_utils.h" @@ -58,7 +59,11 @@ bool cafGenericWriteTransfer(CafWriterType& writer, Span auto _ = gsl::finally([&]{ Private::cafFinderProcess(writer)->SetProgress(nullptr); }); #endif - for (const ApplicationItem& item : appItems) { + bool okTransfer = true; + System::visitUniqueItems(appItems, [&](const ApplicationItem& item) { + if (!okTransfer) + return; // Skip if already in error state + bool okItemTransfer = false; if (item.isDocument()) okItemTransfer = writer.Transfer(item.document()); @@ -66,10 +71,10 @@ bool cafGenericWriteTransfer(CafWriterType& writer, Span okItemTransfer = writer.Transfer(item.documentTreeNode().label()); if (!okItemTransfer) - return false; - } + okTransfer = false; + }); - return true; + return okTransfer; } } // namespace diff --git a/src/io_occ/io_occ_gltf_writer.cpp b/src/io_occ/io_occ_gltf_writer.cpp index 7b5c7fc1..ca6da673 100644 --- a/src/io_occ/io_occ_gltf_writer.cpp +++ b/src/io_occ/io_occ_gltf_writer.cpp @@ -8,6 +8,7 @@ #include "../base/application_item.h" #include "../base/enumeration_fromenum.h" +#include "../base/io_system.h" #include "../base/messenger.h" #include "../base/occ_progress_indicator.h" #include "../base/property_builtins.h" @@ -119,7 +120,7 @@ bool OccGltfWriter::transfer(Span spanAppItem, TaskProgre { m_document.Nullify(); m_seqRootLabel.Clear(); - for (const ApplicationItem& appItem : spanAppItem) { + System::visitUniqueItems(spanAppItem, [=](const ApplicationItem& appItem) { if (appItem.isDocument() && m_document.IsNull()) { m_document = appItem.document(); } @@ -130,7 +131,7 @@ bool OccGltfWriter::transfer(Span spanAppItem, TaskProgre if (appItem.document().get() == m_document.get()) m_seqRootLabel.Append(appItem.documentTreeNode().label()); } - } + }); if (!m_document) return false; diff --git a/src/io_occ/io_occ_iges.cpp b/src/io_occ/io_occ_iges.cpp index c41a5811..ac469f06 100644 --- a/src/io_occ/io_occ_iges.cpp +++ b/src/io_occ/io_occ_iges.cpp @@ -31,7 +31,9 @@ class OccIgesReader::Properties : public PropertyGroup { "This parameter does not change the continuity of curves that are used " "in the construction of IGES BRep entities. In this case, the parameter " "does not influence the continuity of the resulting Open CASCADE curves " - "(it is ignored).")); + "(it is ignored)." + ) + ); this->surfaceCurveMode.setDescription( textIdTr("Preference for the computation of curves in case of 2D/3D inconsistency " @@ -49,7 +51,9 @@ class OccIgesReader::Properties : public PropertyGroup { "of sub-curves given in the IGES file or because of splitting of curves during " "translation\n" "- 3D or 2D curve is a Circular Arc (entity type 100) starting and ending " - "in the same point (note that this case is incorrect according to the IGES standard)")); + "in the same point (note that this case is incorrect according to the IGES standard)" + ) + ); this->readFaultyEntities.setDescription(textIdTr("Read failed entities")); diff --git a/src/io_occ/io_occ_obj_writer.cpp b/src/io_occ/io_occ_obj_writer.cpp index 5ffdd300..30123691 100644 --- a/src/io_occ/io_occ_obj_writer.cpp +++ b/src/io_occ/io_occ_obj_writer.cpp @@ -7,6 +7,7 @@ #include "io_occ_obj_writer.h" #include "../base/application_item.h" +#include "../base/io_system.h" #include "../base/occ_progress_indicator.h" #include "../base/property_builtins.h" #include "../base/property_enumeration.h" @@ -43,7 +44,7 @@ bool OccObjWriter::transfer(Span spanAppItem, TaskProgres { m_document.Nullify(); m_seqRootLabel.Clear(); - for (const ApplicationItem& appItem : spanAppItem) { + System::visitUniqueItems(spanAppItem, [=](const ApplicationItem& appItem) { if (appItem.isDocument() && m_document.IsNull()) { m_document = appItem.document(); } @@ -54,7 +55,7 @@ bool OccObjWriter::transfer(Span spanAppItem, TaskProgres if (appItem.document().get() == m_document.get()) m_seqRootLabel.Append(appItem.documentTreeNode().label()); } - } + }); if (!m_document) return false; diff --git a/src/io_occ/io_occ_step.cpp b/src/io_occ/io_occ_step.cpp index 71e3cfa3..85b343af 100644 --- a/src/io_occ/io_occ_step.cpp +++ b/src/io_occ/io_occ_step.cpp @@ -6,6 +6,7 @@ #include "io_occ_step.h" #include "io_occ_caf.h" +#include "../base/messenger.h" #include "../base/meta_enum.h" #include "../base/occ_static_variables_rollback.h" #include "../base/property_builtins.h" diff --git a/src/io_occ/io_occ_stl.cpp b/src/io_occ/io_occ_stl.cpp index ceca9163..869bd3b8 100644 --- a/src/io_occ/io_occ_stl.cpp +++ b/src/io_occ/io_occ_stl.cpp @@ -13,6 +13,7 @@ #include "../base/document.h" #include "../base/filepath_conv.h" #include "../base/global.h" +#include "../base/io_system.h" #include "../base/messenger.h" #include "../base/occ_progress_indicator.h" #include "../base/property_enumeration.h" @@ -39,11 +40,9 @@ static TopoDS_Shape asShape(const DocumentPtr& doc) shape = XCaf::shape(doc->entityLabel(0)); } else if (doc->entityCount() > 1) { - TopoDS_Compound cmpd; - BRep_Builder builder; - builder.MakeCompound(cmpd); + TopoDS_Compound cmpd = BRepUtils::makeEmptyCompound(); for (int i = 0; i < doc->entityCount(); ++i) - builder.Add(cmpd, XCaf::shape(doc->entityLabel(i))); + BRepUtils::addShape(&cmpd, XCaf::shape(doc->entityLabel(i))); shape = cmpd; } @@ -94,21 +93,17 @@ TDF_LabelSequence OccStlReader::transfer(DocumentPtr doc, TaskProgress* /*progre bool OccStlWriter::transfer(Span appItems, TaskProgress* /*progress*/) { -// if (appItems.size() > 1) -// return Result::error(tr("OpenCascade RWStl does not support multi-solids")); - - m_shape = {}; - if (!appItems.empty()) { - const ApplicationItem& item = appItems.front(); - if (item.isDocument()) { - m_shape = asShape(item.document()); + m_shape = BRepUtils::makeEmptyCompound(); + System::visitUniqueItems(appItems, [=](const ApplicationItem& appItem) { + if (appItem.isDocument()) { + BRepUtils::addShape(&m_shape, asShape(appItem.document())); } - else if (item.isDocumentTreeNode()) { - const TDF_Label label = item.documentTreeNode().label(); + else if (appItem.isDocumentTreeNode()) { + const TDF_Label label = appItem.documentTreeNode().label(); if (XCaf::isShape(label)) - m_shape = XCaf::shape(label); + BRepUtils::addShape(&m_shape, XCaf::shape(label)); } - } + }); return !m_shape.IsNull(); } diff --git a/src/io_occ/io_occ_vrml_writer.cpp b/src/io_occ/io_occ_vrml_writer.cpp index 61ca2906..c105938f 100644 --- a/src/io_occ/io_occ_vrml_writer.cpp +++ b/src/io_occ/io_occ_vrml_writer.cpp @@ -9,6 +9,7 @@ #include "../base/application_item.h" #include "../base/caf_utils.h" #include "../base/document.h" +#include "../base/io_system.h" #include "../base/math_utils.h" #include "../base/property_builtins.h" #include "../base/property_enumeration.h" @@ -46,12 +47,17 @@ bool OccVrmlWriter::transfer(Span spanAppItem, TaskProgre { m_scene.reset(new VrmlData_Scene); VrmlData_ShapeConvert converter(*m_scene); - for (const ApplicationItem& appItem : spanAppItem) { + + int count = 0; + System::visitUniqueItems(spanAppItem, [&](const ApplicationItem&) { ++count; }); + + int iCount = 0; + System::visitUniqueItems(spanAppItem, [&](const ApplicationItem& appItem) { if (appItem.isDocument()) { #if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 4, 0) converter.ConvertDocument(appItem.document()); #else - // TODO Call VrmlData_ShapeConvert::AddShape() on each child entity of "shape" type + // TODO Call VrmlData_ShapeConvert::AddShape() on each child entity of "shape" type #endif } else if (appItem.isDocumentTreeNode()) { @@ -60,9 +66,8 @@ bool OccVrmlWriter::transfer(Span spanAppItem, TaskProgre converter.AddShape(XCaf::shape(label)); } - const auto index = &appItem - &spanAppItem.front(); - progress->setValue(MathUtils::toPercent(index, 0, spanAppItem.size() - 1)); - } + progress->setValue(MathUtils::toPercent(++iCount, 0, count)); + }); const auto rep = m_shapeRepresentation; converter.Convert( From c2c11476ebe99d45aa298c7834a68888b4685f1e Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 2 Nov 2023 14:42:56 +0100 Subject: [PATCH 65/92] Base: fix encoding issue in PropertyValueConversion::fromVariant() Relates to GitHub #219 --- src/base/property_value_conversion.cpp | 6 ++- tests/test_base.cpp | 69 +++++++++++++++++--------- tests/test_base.h | 1 + 3 files changed, 51 insertions(+), 25 deletions(-) diff --git a/src/base/property_value_conversion.cpp b/src/base/property_value_conversion.cpp index dc3bf291..4e95b8d6 100644 --- a/src/base/property_value_conversion.cpp +++ b/src/base/property_value_conversion.cpp @@ -7,6 +7,7 @@ #include "property_value_conversion.h" #include "cpp_utils.h" +#include "filepath_conv.h" #include "math_utils.h" #include "property_builtins.h" #include "property_enumeration.h" @@ -205,8 +206,11 @@ bool PropertyValueConversion::fromVariant(Property* prop, const Variant& variant return fnError("Variant not convertible to string"); } else if (isType(prop)) { + // Note: explicit conversion from utf8 std::string to std::filesystem::path + // If character type of the source string is "char" then FilePath constructor assumes + // native narrow encoding(which might cause encoding issues) if (variant.isConvertibleToConstRefString()) - return ptr(prop)->setValue(variant.toConstRefString()); + return ptr(prop)->setValue(filepathFrom(variant.toConstRefString())); else return fnError("Variant expected to hold string"); } diff --git a/tests/test_base.cpp b/tests/test_base.cpp index 6bbd5374..b02268f5 100644 --- a/tests/test_base.cpp +++ b/tests/test_base.cpp @@ -78,6 +78,35 @@ Q_DECLARE_METATYPE(Mayo::PropertyValueConversion::Variant) namespace Mayo { +static std::optional findFrLocale() +{ + auto fnGetLocale = [](const char* name) -> std::optional { + try { + return std::locale(name); + } catch (...) { + qWarning().noquote() << QString("Locale '%1' not available").arg(name); + } + + return {}; + }; + + // Tests with "fr_FR" locale which is likely to be Windows-1252 or ISO8859-1 on Unix + std::vector frLocaleNames = { "fr_FR.ISO8859-15", "fr_FR.ISO-8859-15" }; +#ifndef MAYO_OS_WINDOWS + // No native utf8 support on Windows(or requires Windows 10 november 2019 update) + frLocaleNames.push_back("fr_FR.utf8"); +#endif + frLocaleNames.push_back("fr_FR"); + + std::optional frLocale; + for (const char* localeName : frLocaleNames) { + if (!frLocale) + frLocale = fnGetLocale(localeName); + } + + return frLocale; +} + // For the sake of QCOMPARE() static bool operator==(const UnitSystem::TranslateResult& lhs, const UnitSystem::TranslateResult& rhs) { @@ -311,6 +340,9 @@ void TestBase::PropertyValueConversion_test() enum class MayoTest_Color { Bleu, Blanc, Rouge }; prop.reset(new PropertyEnum(nullptr, {})); } + else if (strPropertyName == PropertyFilePath::TypeName) { + prop.reset(new PropertyFilePath(nullptr, {})); + } QVERIFY(prop); @@ -337,6 +369,18 @@ void TestBase::PropertyValueConversion_test_data() QTest::newRow("Enumeration(Color)") << PropertyEnumeration::TypeName << Variant("Blanc"); } +void TestBase::PropertyValueConversion_bugGitHub219_test() +{ + const std::string strPath = "c:\\é_à_À_œ_ç"; + PropertyValueConversion conv; + PropertyFilePath propFilePath(nullptr, {}); + const bool ok = conv.fromVariant(&propFilePath, strPath); + QVERIFY(ok); + //qDebug() << "strPath:" << QByteArray::fromStdString(strPath); + //qDebug() << "propFilePath:" << QByteArray::fromStdString(propFilePath.value().u8string()); + QCOMPARE(propFilePath.value().u8string(), strPath); +} + void TestBase::PropertyQuantityValueConversion_test() { QFETCH(QString, strPropertyName); @@ -554,30 +598,7 @@ void TestBase::IO_bugGitHub166_test_data() void TestBase::DoubleToString_test() { - auto fnGetLocale = [](const char* name) -> std::optional { - try { - return std::locale(name); - } catch (...) { - qWarning().noquote() << QString("Locale '%1' not available").arg(name); - } - - return {}; - }; - - // Tests with "fr_FR" locale which is likely to be Windows-1252 or ISO8859-1 on Unix - std::vector frLocaleNames = { "fr_FR.ISO8859-15", "fr_FR.ISO-8859-15" }; -#ifndef MAYO_OS_WINDOWS - // No native utf8 support on Windows(or requires Windows 10 november 2019 update) - frLocaleNames.push_back("fr_FR.utf8"); -#endif - frLocaleNames.push_back("fr_FR"); - - std::optional frLocale; - for (const char* localeName : frLocaleNames) { - if (!frLocale) - frLocale = fnGetLocale(localeName); - } - + std::optional frLocale = findFrLocale(); if (frLocale) { qInfo() << "frLocale:" << QString::fromStdString(frLocale->name()); // 1258. diff --git a/tests/test_base.h b/tests/test_base.h index 0fbffa7f..def9ed24 100644 --- a/tests/test_base.h +++ b/tests/test_base.h @@ -31,6 +31,7 @@ private slots: void PropertyValueConversion_test(); void PropertyValueConversion_test_data(); + void PropertyValueConversion_bugGitHub219_test(); void PropertyQuantityValueConversion_test(); void PropertyQuantityValueConversion_test_data(); From 84cb80a1f8970b599838a195d6efd6b570681454 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 14 Nov 2023 12:48:56 +0100 Subject: [PATCH 66/92] Gui: fix placement of reference shapes with redefined color Relates to GitHub #233 --- src/app/dialog_inspect_xde.cpp | 9 +++++++-- src/gui/gui_document.cpp | 6 +++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/app/dialog_inspect_xde.cpp b/src/app/dialog_inspect_xde.cpp index 759d37dc..4bdff451 100644 --- a/src/app/dialog_inspect_xde.cpp +++ b/src/app/dialog_inspect_xde.cpp @@ -121,9 +121,14 @@ static void loadLabelAttributes(const TDF_Label& label, QTreeWidgetItem* treeIte } else if (attrId == TNaming_NamedShape::GetID()) { const auto& namedShape = static_cast(*ptrAttr); + const TopoDS_Shape shape = namedShape.Get(); text = "TNaming_NamedShape"; - value = DialogInspectXde::tr("ShapeType=%1, Evolution=%2") - .arg(MetaEnum::name(namedShape.Get().ShapeType()).data()) + value = DialogInspectXde::tr("ShapeType=%1, ShapeLocation=%2, Evolution=%3") + .arg(MetaEnum::name(shape.ShapeType()).data()) + .arg(shape.Location().Transformation().Form() != gp_Identity ? + QStringUtils::text(shape.Location(), appDefaultTextOptions()) + : QString("id") + ) .arg(MetaEnum::name(namedShape.Evolution()).data()); } else { diff --git a/src/gui/gui_document.cpp b/src/gui/gui_document.cpp index ff672e4c..5e07c091 100644 --- a/src/gui/gui_document.cpp +++ b/src/gui/gui_document.cpp @@ -589,11 +589,15 @@ void GuiDocument::mapEntity(TreeNodeId entityTreeNodeId) } if (!docModelTree.nodeIsRoot(id)) { - const TDF_Label parentNodeLabel = docModelTree.nodeData(docModelTree.nodeParent(id)); + const TreeNodeId parentNodeId = docModelTree.nodeParent(id); + const TDF_Label parentNodeLabel = docModelTree.nodeData(parentNodeId); if (XCaf::isShapeReference(parentNodeLabel) && m_document->xcaf().hasShapeColor(parentNodeLabel)) { // Parent node is a reference and it redefines color attribute, so the graphics // can't be shared with the product auto gfxObject = m_guiApp->createGraphicsObject(parentNodeLabel); + const TreeNodeId grandParentNodeId = docModelTree.nodeParent(parentNodeId); + const TopLoc_Location locGrandParentShape = XCaf::shapeAbsoluteLocation(docModelTree, grandParentNodeId); + gfxObject->SetLocalTransformation(locGrandParentShape); gfxEntity.vecObject.push_back(gfxObject); } else { From a103cfb3445e925148b3b308c934b55be054badc Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 26 Oct 2023 18:31:09 +0200 Subject: [PATCH 67/92] Base: add OccHandle<> type alias --- src/base/occ_handle.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/base/occ_handle.h diff --git a/src/base/occ_handle.h b/src/base/occ_handle.h new file mode 100644 index 00000000..387a2243 --- /dev/null +++ b/src/base/occ_handle.h @@ -0,0 +1,16 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#pragma once + +#include + +namespace Mayo { + +// Template alias for OpenCascade handle +template using OccHandle = opencascade::handle; + +} // namespace Mayo From 234cf578ba53a8ad87d22f9e8e6e473e60a7c1fd Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 8 Nov 2023 18:37:04 +0100 Subject: [PATCH 68/92] Base: support stream-like syntax with Messenger --- src/app/app_module.cpp | 4 +-- src/app/app_module.h | 2 +- src/app/mainwindow.cpp | 11 +++---- src/app/mainwindow.h | 2 +- src/base/messenger.cpp | 65 +++++++++++++++++++++++++++++++++++++++++- src/base/messenger.h | 51 +++++++++++++++++++++++++++------ 6 files changed, 116 insertions(+), 19 deletions(-) diff --git a/src/app/app_module.cpp b/src/app/app_module.cpp index 46e87e49..efa02e97 100644 --- a/src/app/app_module.cpp +++ b/src/app/app_module.cpp @@ -38,7 +38,7 @@ AppModule::AppModule() { static bool metaTypesRegistered = false; if (!metaTypesRegistered) { - qRegisterMetaType("Messenger::MessageType"); + qRegisterMetaType("MessageType"); metaTypesRegistered = true; } @@ -139,7 +139,7 @@ bool AppModule::fromVariant(Property* prop, const Settings::Variant& variant) co } } -void AppModule::emitMessage(Messenger::MessageType msgType, std::string_view text) +void AppModule::emitMessage(MessageType msgType, std::string_view text) { const QString qtext = to_QString(text); { diff --git a/src/app/app_module.h b/src/app/app_module.h index 5fadb7a7..42e02b67 100644 --- a/src/app/app_module.h +++ b/src/app/app_module.h @@ -74,7 +74,7 @@ class AppModule : // Logging void clearMessageLog(); Span messageLog() const { return m_messageLog; } - Signal signalMessage; + Signal signalMessage; Signal<> signalMessageLogCleared; // Recent files diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index 0897e36e..de6233e5 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -245,18 +245,19 @@ void MainWindow::onGuiDocumentErased(GuiDocument* /*guiDoc*/) this->updateControlsActivation(); } -void MainWindow::onMessage(Messenger::MessageType msgType, const QString& text) +void MainWindow::onMessage(MessageType msgType, const QString& text) { switch (msgType) { - case Messenger::MessageType::Trace: + case MessageType::Trace: + qDebug() << text; break; - case Messenger::MessageType::Info: + case MessageType::Info: WidgetMessageIndicator::showInfo(text, this); break; - case Messenger::MessageType::Warning: + case MessageType::Warning: QtWidgetsUtils::asyncMsgBoxWarning(this, tr("Warning"), text); break; - case Messenger::MessageType::Error: + case MessageType::Error: QtWidgetsUtils::asyncMsgBoxCritical(this, tr("Error"), text); break; } diff --git a/src/app/mainwindow.h b/src/app/mainwindow.h index c164e10e..2b8f4b91 100644 --- a/src/app/mainwindow.h +++ b/src/app/mainwindow.h @@ -49,7 +49,7 @@ class MainWindow : public QMainWindow { void onGuiDocumentAdded(GuiDocument* guiDoc); void onGuiDocumentErased(GuiDocument* guiDoc); - void onMessage(Messenger::MessageType msgType, const QString& text); + void onMessage(MessageType msgType, const QString& text); void updateControlsActivation(); void updateCurrentPage(); diff --git a/src/base/messenger.cpp b/src/base/messenger.cpp index fa299e03..23c1d064 100644 --- a/src/base/messenger.cpp +++ b/src/base/messenger.cpp @@ -6,6 +6,8 @@ #include "messenger.h" +#include + namespace Mayo { namespace { @@ -17,6 +19,47 @@ class NullMessenger : public Messenger { } // namespace +MessageStream::MessageStream(MessageType type, Messenger& messenger) + : m_type(type), m_messenger(messenger) +{ +} + +//Message::Message(const Message& other) +// : m_type(other.m_type), m_messenger(other.m_messenger), m_buffer(other.m_buffer) +//{ +//} + +MessageStream::~MessageStream() +{ + const std::string str = m_istream.str(); + switch (m_type) { + case MessageType::Trace: + m_messenger.emitTrace(str); + break; + case MessageType::Info: + m_messenger.emitInfo(str); + break; + case MessageType::Warning: + m_messenger.emitWarning(str); + break; + case MessageType::Error: + m_messenger.emitError(str); + break; + } +} + +MessageStream& MessageStream::space() +{ + m_istream << ' '; + return *this; +} + +MessageStream& MessageStream::operator<<(bool v) +{ + m_istream << (v ? "true" : "false"); + return *this; +} + void Messenger::emitTrace(std::string_view text) { this->emitMessage(MessageType::Trace, text); @@ -37,6 +80,26 @@ void Messenger::emitError(std::string_view text) this->emitMessage(MessageType::Error, text); } +MessageStream Messenger::trace() +{ + return MessageStream(MessageType::Trace, *this); +} + +MessageStream Messenger::info() +{ + return MessageStream(MessageType::Info, *this); +} + +MessageStream Messenger::warning() +{ + return MessageStream(MessageType::Warning, *this); +} + +MessageStream Messenger::error() +{ + return MessageStream(MessageType::Error, *this); +} + Messenger& Messenger::null() { static NullMessenger null; @@ -48,7 +111,7 @@ MessengerByCallback::MessengerByCallback(std::function +#include #include namespace Mayo { +class Messenger; + +enum class MessageType { + Trace, + Info, + Warning, + Error +}; + +// Provides stream-like syntax support, eg: +// messenger->info() << "Something happened, value: " << valueInt; +class MessageStream { +public: + MessageStream(MessageType type, Messenger& messenger); + MessageStream(const MessageStream&) = delete; + MessageStream& operator=(const MessageStream&) = delete; + ~MessageStream(); + + MessageType messageType() const { return m_type; } + std::istream& istream() { return m_istream; } + + MessageStream& space(); + MessageStream& operator<<(bool); + + template + MessageStream& operator<<(T t) { + m_istream << t; + return *this; + } + +private: + MessageType m_type = MessageType::Trace; + Messenger& m_messenger; + std::stringstream m_istream; +}; + // Provides a general-purpose interface to issue text messages without knowledge of how these // messages will be further processed -// TODO Support stream-like syntax, eg: -// messenger->info() << "Something happened, value: " << valueInt; class Messenger { public: - enum class MessageType { - Trace, - Info, - Warning, - Error - }; - // Dispatch the message 'text' to all observers virtual void emitMessage(MessageType msgType, std::string_view text) = 0; @@ -33,6 +61,11 @@ class Messenger { void emitWarning(std::string_view text); void emitError(std::string_view text); + MessageStream trace(); + MessageStream info(); + MessageStream warning(); + MessageStream error(); + static Messenger& null(); }; From 5d4e0dbf1759a98cc1896668acf83c808f645f6e Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Thu, 22 Jun 2023 17:27:40 +0200 Subject: [PATCH 69/92] IO_Assimp: introduce new reader based on Assimp library Relates to GitHub #19 --- .github/workflows/ci_linux.yml | 18 +- mayo.pro | 47 ++ src/app/console.cpp | 2 +- src/app/main.cpp | 3 + src/base/io_format.cpp | 68 ++- src/base/io_format.h | 19 +- src/base/mesh_utils.cpp | 9 + src/base/mesh_utils.h | 1 + src/base/string_conv.h | 8 + src/io_assimp/io_assimp.cpp | 87 ++++ src/io_assimp/io_assimp.h | 40 ++ src/io_assimp/io_assimp_reader.cpp | 685 +++++++++++++++++++++++++++++ src/io_assimp/io_assimp_reader.h | 76 ++++ 13 files changed, 1030 insertions(+), 33 deletions(-) create mode 100644 src/io_assimp/io_assimp.cpp create mode 100644 src/io_assimp/io_assimp.h create mode 100644 src/io_assimp/io_assimp_reader.cpp create mode 100644 src/io_assimp/io_assimp_reader.h diff --git a/.github/workflows/ci_linux.yml b/.github/workflows/ci_linux.yml index 586901a5..9703dc99 100644 --- a/.github/workflows/ci_linux.yml +++ b/.github/workflows/ci_linux.yml @@ -34,6 +34,14 @@ jobs: echo "GH_CASCADE_INC_DIR=$GH_CASCADE_INC_DIR" >> $GITHUB_ENV echo "GH_CASCADE_LIB_DIR=$GH_CASCADE_LIB_DIR" >> $GITHUB_ENV + - name: Install Assimp + run: | + sudo apt-get -y install libassimp-dev + GH_ASSIMP_INC_DIR=`dpkg -L libassimp-dev | grep -i "version.h" | sed "s/\/version.h//i"` + GH_ASSIMP_LIB_DIR=`dpkg -L libassimp-dev | grep -i "libassimp.so" | sed "s/\/libassimp.so//i"` + echo "GH_ASSIMP_INC_DIR=$GH_ASSIMP_INC_DIR" >> $GITHUB_ENV + echo "GH_ASSIMP_LIB_DIR=$GH_ASSIMP_LIB_DIR" >> $GITHUB_ENV + - name: Get count of CPU cores uses: SimenB/github-actions-cpu-cores@v1 id: cpu-cores @@ -44,9 +52,17 @@ jobs: cd ${{github.workspace}}/build echo CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} echo CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} + echo ASSIMP_INC_DIR=${{env.GH_ASSIMP_INC_DIR}} + echo ASSIMP_LIB_DIR=${{env.GH_ASSIMP_LIB_DIR}} [ ! -d $CASCADE_INC_DIR ] && echo "ERROR: OpenCascade include dir doesn't exist" [ ! -d $CASCADE_LIB_DIR ] && echo "ERROR: OpenCascade lib dir doesn't exist" - qmake .. CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} CONFIG+=withtests + [ ! -d $ASSIMP_INC_DIR ] && echo "ERROR: assimp include dir doesn't exist" + [ ! -d $ASSIMP_LIB_DIR ] && echo "ERROR: assimp lib dir doesn't exist" + qmake .. CONFIG+=withtests \ + CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} \ + CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} \ + ASSIMP_INC_DIR=${{env.GH_ASSIMP_INC_DIR}} \ + ASSIMP_LIB_DIR=${{env.GH_ASSIMP_LIB_DIR}} make -j${{steps.cpu-cores.outputs.count}} - name: Execute Unit Tests diff --git a/mayo.pro b/mayo.pro index 6322ef17..daafee08 100644 --- a/mayo.pro +++ b/mayo.pro @@ -191,19 +191,66 @@ versionAtLeast(OCC_VERSION_STR, 7.4.0) { src/io_occ/io_occ_base_mesh.cpp \ src/io_occ/io_occ_gltf_reader.cpp \ src/io_occ/io_occ_obj_reader.cpp + + message(glTF reader disabled because OpenCascade < v7.4) + message(OBJ reader disabled because OpenCascade < v7.4) } !versionAtLeast(OCC_VERSION_STR, 7.5.0) { SOURCES -= src/io_occ/io_occ_gltf_writer.cpp + message(glTF writer disabled because OpenCascade < v7.5) } !versionAtLeast(OCC_VERSION_STR, 7.6.0) { SOURCES -= src/io_occ/io_occ_obj_writer.cpp + message(OBJ writer disabled because OpenCascade < v7.6) } # -- VRML support LIBS += -lTKVRML !versionAtLeast(OCC_VERSION_STR, 7.7.0) { SOURCES -= src/io_occ/io_occ_vrml_reader.cpp + message(VRML reader disabled because OpenCascade < v7.7) +} + +# assimp +isEmpty(ASSIMP_INC_DIR) | isEmpty(ASSIMP_LIB_DIR) { + message(assimp OFF) +} else { + !versionAtLeast(OCC_VERSION_STR, 7.5.0) { + message(assimp reader disabled because OpenCascade < v7.5) + } + else { + message(assimp ON) + ASSIMP_IS_ON = 1 + } +} + +defined(ASSIMP_IS_ON, var) { + HEADERS += $$files(src/io_assimp/*.h) + SOURCES += $$files(src/io_assimp/*.cpp) + + ASSIMP_VERSION_FILE_CONTENTS = $$cat($$ASSIMP_INC_DIR/version.h, lines) + ASSIMP_aiGetVersionPatch = $$find(ASSIMP_VERSION_FILE_CONTENTS, aiGetVersionPatch) + !isEmpty(ASSIMP_aiGetVersionPatch) { + } else { + DEFINES += NO_ASSIMP_aiGetVersionPatch + message(Assimp function aiGetVersionPatch() not available) + } + + INCLUDEPATH += $$ASSIMP_INC_DIR/.. + LIBS += -L$$ASSIMP_LIB_DIR + win32 { + CONFIG(debug, debug|release) { + LIBS += -lassimp-vc142-mtd -lzlibstaticd + } else { + LIBS +=-lassimp-vc142-mtd -lzlibstatic + } + } + else { + LIBS += -lassimp + } + + DEFINES += HAVE_ASSIMP } # gmio diff --git a/src/app/console.cpp b/src/app/console.cpp index cc70ce10..183cac75 100644 --- a/src/app/console.cpp +++ b/src/app/console.cpp @@ -11,7 +11,7 @@ # include # include #else -# include //ioctl() and TIOCGWINSZ +# include // ioctl() and TIOCGWINSZ # include // for STDOUT_FILENO # include #endif diff --git a/src/app/main.cpp b/src/app/main.cpp index 2379b28c..d925643c 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -8,6 +8,7 @@ #include "../base/document_tree_node_properties_provider.h" #include "../base/io_system.h" #include "../base/settings.h" +#include "../io_assimp/io_assimp.h" #include "../io_dxf/io_dxf.h" #include "../io_gmio/io_gmio.h" #include "../io_image/io_image.h" @@ -492,6 +493,7 @@ static int runApp(QCoreApplication* qtApp) ioSystem->addFactoryReader(std::make_unique()); ioSystem->addFactoryReader(std::make_unique()); ioSystem->addFactoryReader(std::make_unique()); + ioSystem->addFactoryReader(IO::AssimpFactoryReader::create()); ioSystem->addFactoryWriter(std::make_unique()); ioSystem->addFactoryWriter(std::make_unique()); ioSystem->addFactoryWriter(std::make_unique()); @@ -503,6 +505,7 @@ static int runApp(QCoreApplication* qtApp) // Register library infos CommandSystemInformation::addLibraryInfo(IO::GmioLib::strName(), IO::GmioLib::strVersion()); + CommandSystemInformation::addLibraryInfo(IO::AssimpLib::strName(), IO::AssimpLib::strVersion()); // Process CLI if (args.showSystemInformation) { diff --git a/src/base/io_format.cpp b/src/base/io_format.cpp index 4a93cc29..8e362919 100644 --- a/src/base/io_format.cpp +++ b/src/base/io_format.cpp @@ -27,6 +27,11 @@ std::string_view formatIdentifier(Format format) case Format_DXF: return "DXF"; case Format_PLY: return "PLY"; case Format_OFF: return "OFF"; + case Format_3DS: return "3DS"; + case Format_3MF: return "3MF"; + case Format_COLLADA: return "COLLADA"; + case Format_FBX: return "FBX"; + case Format_X3D: return "X3D"; } return ""; @@ -48,6 +53,11 @@ std::string_view formatName(Format format) case Format_DXF: return "Drawing Exchange Format"; case Format_PLY: return "Polygon File Format"; case Format_OFF: return "Object File Format"; + case Format_3DS: return "3DS Max File"; + case Format_3MF: return "33D Manufacturing Format"; + case Format_COLLADA: return "COLLAborative Design Activity(ISO/PAS 17506)"; + case Format_FBX: return "Filmbox"; + case Format_X3D: return "Extensible 3D Graphics(ISO/IEC 19775/19776/19777)"; } return ""; @@ -55,33 +65,43 @@ std::string_view formatName(Format format) Span formatFileSuffixes(Format format) { - static std::string_view img_suffix[] = { "bmp", "jpeg", "jpg", "png", "gif", "ppm", "tiff" }; - static std::string_view step_suffix[] = { "step", "stp" }; - static std::string_view iges_suffix[] = { "iges", "igs" }; - static std::string_view occ_suffix[] = { "brep", "rle", "occ" }; - static std::string_view stl_suffix[] = { "stl" }; - static std::string_view obj_suffix[] = { "obj" }; - static std::string_view gltf_suffix[] = { "gltf", "glb" }; - static std::string_view vrml_suffix[] = { "wrl", "wrz", "vrml" }; - static std::string_view amf_suffix[] = { "amf" }; - static std::string_view dxf_suffix[] = { "dxf" }; - static std::string_view ply_suffix[] = { "ply" }; - static std::string_view off_suffix[] = { "off" }; + static std::string_view suffix_img[] = { "bmp", "jpeg", "jpg", "png", "gif", "ppm", "tiff" }; + static std::string_view suffix_3ds[] = { "3ds" }; + static std::string_view suffix_3mf[] = { "3mf" }; + static std::string_view suffix_amf[] = { "amf" }; + static std::string_view suffix_collada[] = { "dae", "zae" }; + static std::string_view suffix_dxf[] = { "dxf" }; + static std::string_view suffix_fbx[] = { "fbx" }; + static std::string_view suffix_gltf[] = { "gltf", "glb" }; + static std::string_view suffix_iges[] = { "iges", "igs" }; + static std::string_view suffix_obj[] = { "obj" }; + static std::string_view suffix_occ[] = { "brep", "rle", "occ" }; + static std::string_view suffix_off[] = { "off" }; + static std::string_view suffix_ply[] = { "ply" }; + static std::string_view suffix_step[] = { "step", "stp" }; + static std::string_view suffix_stl[] = { "stl" }; + static std::string_view suffix_vrml[] = { "wrl", "wrz", "vrml" }; + static std::string_view suffix_x3d[] = { "x3d", "x3dv", "x3db", "x3dz", "x3dbz", "x3dvz" }; switch (format) { case Format_Unknown: return {}; - case Format_Image: return img_suffix; - case Format_STEP: return step_suffix; - case Format_IGES: return iges_suffix; - case Format_OCCBREP: return occ_suffix; - case Format_STL: return stl_suffix; - case Format_OBJ: return obj_suffix; - case Format_GLTF: return gltf_suffix; - case Format_VRML: return vrml_suffix; - case Format_AMF: return amf_suffix; - case Format_DXF: return dxf_suffix; - case Format_PLY: return ply_suffix; - case Format_OFF: return off_suffix; + case Format_Image: return suffix_img; + case Format_3DS: return suffix_3ds; + case Format_3MF: return suffix_3mf; + case Format_AMF: return suffix_amf; + case Format_COLLADA: return suffix_collada; + case Format_DXF: return suffix_dxf; + case Format_FBX: return suffix_fbx; + case Format_GLTF: return suffix_gltf; + case Format_IGES: return suffix_iges; + case Format_OBJ: return suffix_obj; + case Format_OCCBREP: return suffix_occ; + case Format_OFF: return suffix_off; + case Format_PLY: return suffix_ply; + case Format_STEP: return suffix_step; + case Format_STL: return suffix_stl; + case Format_VRML: return suffix_vrml; + case Format_X3D: return suffix_x3d; } return {}; diff --git a/src/base/io_format.h b/src/base/io_format.h index da7de0a8..c3d21701 100644 --- a/src/base/io_format.h +++ b/src/base/io_format.h @@ -16,17 +16,22 @@ namespace IO { enum Format { Format_Unknown, Format_Image, - Format_STEP, + Format_3DS, + Format_3MF, + Format_AMF, + Format_COLLADA, + Format_DXF, + Format_FBX, + Format_GLTF, Format_IGES, + Format_OBJ, Format_OCCBREP, + Format_OFF, + Format_PLY, + Format_STEP, Format_STL, - Format_OBJ, - Format_GLTF, Format_VRML, - Format_AMF, - Format_DXF, - Format_PLY, - Format_OFF + Format_X3D }; // Returns identifier(unique short name) corresponding to 'format' diff --git a/src/base/mesh_utils.cpp b/src/base/mesh_utils.cpp index 5ff2e249..82ac14a7 100644 --- a/src/base/mesh_utils.cpp +++ b/src/base/mesh_utils.cpp @@ -98,6 +98,15 @@ void MeshUtils::setNormal(const Handle_Poly_Triangulation& triangulation, int in #endif } +void MeshUtils::setUvNode(const Handle_Poly_Triangulation& triangulation, int index, double u, double v) +{ +#if OCC_VERSION_HEX >= 0x070600 + triangulation->SetUVNode(index, gp_Pnt2d{u, v}); +#else + triangulation->ChangeUVNode(index) = gp_Pnt2d{u, v}; +#endif +} + void MeshUtils::allocateNormals(const Handle_Poly_Triangulation& triangulation) { #if OCC_VERSION_HEX >= 0x070600 diff --git a/src/base/mesh_utils.h b/src/base/mesh_utils.h index 6630db9f..85aecd00 100644 --- a/src/base/mesh_utils.h +++ b/src/base/mesh_utils.h @@ -29,6 +29,7 @@ struct MeshUtils { static void setNode(const Handle_Poly_Triangulation& triangulation, int index, const gp_Pnt& pnt); static void setTriangle(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangle& triangle); static void setNormal(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangulation_NormalType& n); + static void setUvNode(const Handle_Poly_Triangulation& triangulation, int index, double u, double v); static void allocateNormals(const Handle_Poly_Triangulation& triangulation); static const Poly_Array1OfTriangle& triangles(const Handle_Poly_Triangulation& triangulation) { diff --git a/src/base/string_conv.h b/src/base/string_conv.h index 3aed80f4..166ccb67 100644 --- a/src/base/string_conv.h +++ b/src/base/string_conv.h @@ -128,6 +128,14 @@ template<> struct StringConv { } }; +// std::string_view -> Handle(TCollection_HAsciiString) +template<> struct StringConv { + static auto to(std::string_view str) { + Handle(TCollection_HAsciiString) hnd = new TCollection_HAsciiString(to_OccAsciiString(str)); + return hnd; + } +}; + // -- // -- Handle(TCollection_HAsciiString) -> X // -- diff --git a/src/io_assimp/io_assimp.cpp b/src/io_assimp/io_assimp.cpp new file mode 100644 index 00000000..c0d40ec6 --- /dev/null +++ b/src/io_assimp/io_assimp.cpp @@ -0,0 +1,87 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#include "io_assimp.h" +#include "io_assimp_reader.h" + +#ifdef HAVE_ASSIMP +# include +#endif + +namespace Mayo { +namespace IO { + +Span AssimpFactoryReader::formats() const +{ + static const Format array[] = { + Format_AMF, Format_3DS, Format_3MF, Format_COLLADA, Format_FBX, Format_X3D + }; + return array; +} + +std::unique_ptr AssimpFactoryReader::create(Format format) const +{ + auto itFound = std::find(this->formats().begin(), this->formats().end(), format); + if (itFound != this->formats().end()) + return std::make_unique(); + + return {}; +} + +std::unique_ptr AssimpFactoryReader::createProperties(Format format, PropertyGroup* parentGroup) const +{ + auto itFound = std::find(this->formats().begin(), this->formats().end(), format); + if (itFound != this->formats().end()) + return AssimpReader::createProperties(parentGroup); + + return {}; +} + +std::string_view AssimpLib::strVersion() +{ + static std::string str; + + if (str.empty()) { + const std::string strBranchName = aiGetBranchName() ? aiGetBranchName() : ""; + + std::string strCompileFlags; + { + const unsigned compileFlags = aiGetCompileFlags(); + auto addFlagIfDefined = [&](unsigned flag, const char* strFlag) { + if (compileFlags & flag) { + if (!strCompileFlags.empty()) + strCompileFlags += "|"; + strCompileFlags += strFlag; + } + }; + addFlagIfDefined(ASSIMP_CFLAGS_SHARED, "shared"); + addFlagIfDefined(ASSIMP_CFLAGS_STLPORT, "stlport"); + addFlagIfDefined(ASSIMP_CFLAGS_DEBUG, "debug"); + addFlagIfDefined(ASSIMP_CFLAGS_NOBOOST, "no-boost"); + addFlagIfDefined(ASSIMP_CFLAGS_SINGLETHREADED, "single-threaded"); +#ifdef ASSIMP_CFLAGS_DOUBLE_SUPPORT + addFlagIfDefined(ASSIMP_CFLAGS_DOUBLE_SUPPORT, "double-support"); +#endif + } + + str += std::to_string(aiGetVersionMajor()) + + "." + std::to_string(aiGetVersionMinor()) +#ifndef NO_ASSIMP_aiGetVersionPatch + + "." + std::to_string(aiGetVersionPatch()) +#else + + ".?" +#endif + + " rev:" + std::to_string(aiGetVersionRevision()) + + " branch:" + (!strBranchName.empty() ? strBranchName : "?") + + " flags:" + strCompileFlags + ; + } + + return str; +} + +} // namespace IO +} // namespace Mayo diff --git a/src/io_assimp/io_assimp.h b/src/io_assimp/io_assimp.h new file mode 100644 index 00000000..bdf4db00 --- /dev/null +++ b/src/io_assimp/io_assimp.h @@ -0,0 +1,40 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#include "../base/io_reader.h" +#include "../base/property.h" +#include + +namespace Mayo { +namespace IO { + +// Provides factory for Assimp-based Reader objects +class AssimpFactoryReader : public FactoryReader { +public: + Span formats() const override; + std::unique_ptr create(Format format) const override; + std::unique_ptr createProperties(Format format, PropertyGroup* parentGroup) const override; + + static std::unique_ptr create() { +#ifdef HAVE_ASSIMP + return std::make_unique(); +#else + return {}; +#endif + } +}; + +struct AssimpLib { + static std::string_view strName() { return "Assimp"; } +#ifdef HAVE_ASSIMP + static std::string_view strVersion(); +#else + static std::string_view strVersion() { return ""; } +#endif +}; + +} // namespace IO +} // namespace Mayo diff --git a/src/io_assimp/io_assimp_reader.cpp b/src/io_assimp/io_assimp_reader.cpp new file mode 100644 index 00000000..05ce928b --- /dev/null +++ b/src/io_assimp/io_assimp_reader.cpp @@ -0,0 +1,685 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#include "io_assimp_reader.h" +#include "../base/brep_utils.h" +#include "../base/caf_utils.h" +#include "../base/cpp_utils.h" +#include "../base/document.h" +#include "../base/filepath_conv.h" +#include "../base/math_utils.h" +#include "../base/mesh_utils.h" +#include "../base/messenger.h" +#include "../base/occ_handle.h" +#include "../base/property.h" +#include "../base/string_conv.h" +#include "../base/task_progress.h" +#include "../base/xcaf.h" + +#include +#include +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +//#define MAYO_ASSIMP_READER_HANDLE_SCALING 1 + +namespace Mayo { +namespace IO { + +namespace { + +struct AssimpReaderI18N { + MAYO_DECLARE_TEXT_ID_FUNCTIONS(Mayo::IO::AssimpReaderI18N) +}; + +// Retrieve the scaling component in assimp matrix 'trsf' +aiVector3D aiMatrixScaling(const aiMatrix4x4& trsf) +{ + const ai_real scalingX = aiVector3D(trsf.a1, trsf.a2, trsf.a3).Length(); + const ai_real scalingY = aiVector3D(trsf.b1, trsf.b2, trsf.b3).Length(); + const ai_real scalingZ = aiVector3D(trsf.c1, trsf.c2, trsf.c3).Length(); + return aiVector3D(scalingX, scalingY, scalingZ); +} + +bool hasScaleFactor(const gp_Trsf& trsf) +{ + const double topLocationScalePrec = +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 6, 0) + TopLoc_Location::ScalePrec(); +#else + 1.e-14; +#endif + return (Abs(Abs(trsf.ScaleFactor()) - 1.) > topLocationScalePrec) || trsf.IsNegative(); +} + +bool hasScaleFactor(const aiVector3D& scaling) +{ + return (!MathUtils::fuzzyEqual(scaling.x, 1) + || !MathUtils::fuzzyEqual(scaling.y, 1) + || !MathUtils::fuzzyEqual(scaling.z, 1) + || scaling.x < 0. || scaling.y < 0. || scaling.z < 0. + ); +} + +bool hasScaleFactor(const aiMatrix4x4& trsf) +{ + const aiVector3D scaling = aiMatrixScaling(trsf); + return hasScaleFactor(scaling); +} + +// Check if Assimp tree from 'node' contains a transformation having scale +bool deep_aiNodeTransformationHasScaling(const aiNode* node) +{ + const aiVector3D scaling = aiMatrixScaling(node->mTransformation); + if (!MathUtils::fuzzyEqual(scaling.x, 1) + || !MathUtils::fuzzyEqual(scaling.y, 1) + || !MathUtils::fuzzyEqual(scaling.z, 1) + || scaling.x < 0. || scaling.y < 0. || scaling.z < 0. + ) + { + //std::cout << "[TRACE] hasScaling: " << scaling.x << " " << scaling.y << " " <mNumChildren; ++ichild) { + if (deep_aiNodeTransformationHasScaling(node->mChildren[ichild])) + return true; + } + + return false; +} + +// Visit each node in Assimp tree and call 'fnCallback' +void deep_aiNodeVisit(const aiNode* node, const std::function& fnCallback) +{ + fnCallback(node); + for (unsigned ichild = 0; ichild < node->mNumChildren; ++ichild) + deep_aiNodeVisit(node->mChildren[ichild], fnCallback); +} + +// Returns the OpenCascade transformation converted from assimp matrix +gp_Trsf toOccTrsf(const aiMatrix4x4& matrix) +{ + // TODO Check scaling != 0 + const aiVector3D scaling = aiMatrixScaling(matrix); + gp_Trsf trsf; + trsf.SetValues( + matrix.a1 / scaling.x, matrix.a2 / scaling.x, matrix.a3 / scaling.x, matrix.a4, + matrix.b1 / scaling.y, matrix.b2 / scaling.y, matrix.b3 / scaling.y, matrix.b4, + matrix.c1 / scaling.z, matrix.c2 / scaling.z, matrix.c3 / scaling.z, matrix.c4 + ); + return trsf; +} + +// Returns the Quantity_Color object equivalent to assimp 'color' +Quantity_Color toOccColor(const aiColor4D& color, Quantity_TypeOfColor colorType = Quantity_TOC_RGB) +{ + return Quantity_Color(color.r, color.g, color.b, colorType); +} + +// Create an OpenCascade Image_Texture object from assimp texture +Handle(Image_Texture) createOccTexture(const aiTexture* texture) +{ + const auto textureWidth = texture->mWidth; + const auto textureHeight = texture->mHeight; + const auto textureSize = textureHeight == 0 ? textureWidth : 4 * textureWidth * textureHeight; + Handle(NCollection_Buffer) buff = new NCollection_Buffer( + NCollection_BaseAllocator::CommonBaseAllocator(), + textureSize + ); + auto textureData = reinterpret_cast(texture->pcData); + std::copy(textureData, textureData + textureSize, buff->ChangeData()); + return new Image_Texture(buff, texture->mFilename.C_Str()); +} + +// Create an OpenCascade Poly_Triangulation object from assimp mesh +// The input 'mesh' is assumed to contain only triangles +Handle(Poly_Triangulation) createOccTriangulation(const aiMesh* mesh) +{ + assert(mesh != nullptr); + assert(mesh->mPrimitiveTypes & aiPrimitiveType_TRIANGLE); + + const unsigned textureIndex = 0; + const bool hasUvNodes = mesh->HasTextureCoords(textureIndex) && mesh->mNumUVComponents[textureIndex] == 2; + Handle(Poly_Triangulation) triangulation = new Poly_Triangulation(mesh->mNumVertices, mesh->mNumFaces, hasUvNodes); + + for (unsigned i = 0; i < mesh->mNumVertices; ++i) { + const aiVector3D& vertex = mesh->mVertices[i]; + MeshUtils::setNode(triangulation, i + 1, { vertex.x, vertex.y, vertex.z }); + } + + for (unsigned i = 0; i < mesh->mNumFaces; ++i) { + const auto indices = mesh->mFaces[i].mIndices; + assert(mesh->mFaces[i].mNumIndices == 3); + MeshUtils::setTriangle(triangulation, i + 1, Poly_Triangle(indices[0] + 1, indices[1] + 1, indices[2] + 1)); + } + + if (mesh->HasNormals()) { + MeshUtils::allocateNormals(triangulation); + for (unsigned i = 0; i < mesh->mNumVertices; ++i) { + using OccNormal = MeshUtils::Poly_Triangulation_NormalType; + const aiVector3D& normal = mesh->mNormals[i]; + MeshUtils::setNormal(triangulation, i + 1, OccNormal{ normal.x, normal.y, normal.z }); + } + } + + if (hasUvNodes) { + for (unsigned i = 0; i < mesh->mNumVertices; i++) { + const aiVector3D& t = mesh->mTextureCoords[textureIndex][i]; + MeshUtils::setUvNode(triangulation, i + 1, t.x, t.y); + } + } + + return triangulation; +} + +// Provides assimp progress handler for TaskProgress +class AssimpProgressHandler : public Assimp::ProgressHandler { +public: + AssimpProgressHandler(TaskProgress* progress) + : m_progress(progress) + {} + + bool Update(float percent = -1.f) override + { + if (TaskProgress::isAbortRequested(m_progress)) + return false; + + if (percent > 0) + m_progress->setValue(percent * 100); + + return true; + } + +private: + TaskProgress* m_progress = nullptr; +}; + +} // namespace + +// -- +// -- AssimpReader +// -- + +class AssimpReader::Properties : public PropertyGroup { +public: + Properties(PropertyGroup* parentGroup) + : PropertyGroup(parentGroup) + { + } +}; + +bool AssimpReader::readFile(const FilePath& filepath, TaskProgress* progress) +{ + m_vecTriangulation.clear(); + m_vecMaterial.clear(); + m_mapMaterialLabel.clear(); + m_mapNodeData.clear(); + m_mapEmbeddedTexture.clear(); + m_mapFileTexture.clear(); + + const unsigned flags = + aiProcess_Triangulate + | aiProcess_JoinIdenticalVertices + | aiProcess_SortByPType + //| aiProcess_OptimizeGraph + //| aiProcess_TransformUVCoords + //| aiProcess_FlipUVs + //| aiProcess_FindInstances + //| aiProcess_PreTransformVertices + //| aiProcess_FixInfacingNormals + //| aiProcess_GlobalScale -> AI_CONFIG_GLOBAL_SCALE_FACTOR_KEY + //| aiProcess_GenNormals + //| aiProcess_GenSmoothNormals + //| aiProcess_GenUVCoords + //| aiProcess_CalcTangentSpace + //| aiProcess_ValidateDataStructure + ; + //const unsigned flags = aiProcess_Triangulate | aiProcess_FlipUVs | aiProcess_CalcTangentSpace; + //m_importer.SetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, false); + m_importer.SetPropertyBool(AI_CONFIG_PP_PTV_KEEP_HIERARCHY, true); + m_importer.SetProgressHandler(new AssimpProgressHandler(progress)); + m_scene = m_importer.ReadFile(filepath.u8string(), flags); + if (!m_scene || (m_scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE) || !m_scene->mRootNode) { + this->messenger()->emitError(m_importer.GetErrorString()); + return false; + } + +#ifndef MAYO_ASSIMP_READER_HANDLE_SCALING + // Apply "aiProcess_PreTransformVertices" post-processing step + // This avoids issues with any non-identity scaling matrix + // WARNING Assimp bones and animations are destructed by this step + if (deep_aiNodeTransformationHasScaling(m_scene->mRootNode)) { + m_scene = m_importer.ApplyPostProcessing(aiProcess_PreTransformVertices); + this->messenger()->emitTrace("aiProcess_PreTransformVertices ON"); + } +#endif + + // Create OpenCascade elements from the assimp meshes + // mesh of triangles -> Poly_Triangulation + // mesh lines -> Poly_Polygon3D + m_vecTriangulation.resize(m_scene->mNumMeshes); + std::fill(m_vecTriangulation.begin(), m_vecTriangulation.end(), nullptr); + for (unsigned i = 0; i < m_scene->mNumMeshes; ++i) { + const aiMesh* mesh = m_scene->mMeshes[i]; + if (mesh->mPrimitiveTypes & aiPrimitiveType_TRIANGLE) { + auto triangulation = createOccTriangulation(mesh); + m_vecTriangulation.at(i) = triangulation; + } + else if (mesh->mPrimitiveTypes & aiPrimitiveType_LINE) { + // TODO Create and add a Poly_Polygon3D object + this->messenger()->emitWarning(AssimpReaderI18N::textIdTr("LINE primitives not supported yet")); + } + else { + this->messenger()->emitWarning(AssimpReaderI18N::textIdTr("Some primitive not supported")); + } + } + + for (unsigned i = 0; i < m_scene->mNumTextures; ++i) { + const aiTexture* texture = m_scene->mTextures[i]; + m_mapEmbeddedTexture.insert({ texture, createOccTexture(texture) }); + } + + m_vecMaterial.resize(m_scene->mNumMaterials); + std::fill(m_vecMaterial.begin(), m_vecMaterial.end(), nullptr); + for (unsigned i = 0; i < m_scene->mNumMaterials; ++i) { + const aiMaterial* material = m_scene->mMaterials[i]; + m_vecMaterial.at(i) = this->createOccVisMaterial(material, filepath); + } + + return true; +} + +TDF_LabelSequence AssimpReader::transfer(DocumentPtr doc, TaskProgress* progress) +{ + if (!m_scene) + return {}; + + m_mapNodeData.clear(); + // Compute data for each aiNode object in the scene + deep_aiNodeVisit(m_scene->mRootNode, [=](const aiNode* node) { + aiNodeData nodeData; + auto itParentData = m_mapNodeData.find(node->mParent); + if (itParentData != m_mapNodeData.cend()) { + const aiNodeData& parentData = itParentData->second; + nodeData.aiAbsoluteTrsf = parentData.aiAbsoluteTrsf * node->mTransformation; + nodeData.occAbsoluteTrsf = parentData.occAbsoluteTrsf * toOccTrsf(node->mTransformation); + } + else { + nodeData.aiAbsoluteTrsf = node->mTransformation; + nodeData.occAbsoluteTrsf = toOccTrsf(node->mTransformation); + } + + m_mapNodeData.insert({ node, nodeData }); + }); + + // Compute count of meshes in the scene + int meshCount = 0; + deep_aiNodeVisit(m_scene->mRootNode, [&](const aiNode* node) { + for (unsigned imesh = 0; imesh < node->mNumMeshes; ++imesh) + ++meshCount; + }); + + // Add materials in target document + auto materialTool = doc->xcaf().visMaterialTool(); + for (const Handle_XCAFDoc_VisMaterial& material : m_vecMaterial) { + const TDF_Label label = materialTool->AddMaterial(material, material->RawName()->String()); + m_mapMaterialLabel.insert({ material, label }); + } + + // Create entities in target document + int imesh = 0; + const TopoDS_Shape shapeEntity = BRepUtils::makeEmptyCompound(); + const TDF_Label labelEntity = doc->xcaf().shapeTool()->AddShape(shapeEntity, true/*makeAssembly*/); + TDataStd_Name::Set(labelEntity, to_OccExtString(m_scene->mRootNode->mName.C_Str())); + this->transferSceneNode(m_scene->mRootNode, doc, labelEntity, [&](const aiMesh*) { + progress->setValue(MathUtils::toPercent(++imesh, 0, meshCount)); + }); + //doc->xcaf().shapeTool()->ComputeShapes(labelEntity); + doc->xcaf().shapeTool()->UpdateAssemblies(); + return CafUtils::makeLabelSequence({ labelEntity }); +} + +std::unique_ptr AssimpReader::createProperties(PropertyGroup* /*parentGroup*/) +{ + return {}; +} + +void AssimpReader::applyProperties(const PropertyGroup* group) +{ + auto ptr = dynamic_cast(group); + if (ptr) { + } +} + +Handle(Image_Texture) AssimpReader::findOccTexture( + const std::string& strFilepath, const FilePath& modelFilepath + ) +{ + // Texture might be embedded + { + // Note: aiScene::GetEmbeddedTextureAndIndex() isn't available for version < 5.1 + const aiTexture* texture = m_scene->GetEmbeddedTexture(strFilepath.c_str()); + Handle(Image_Texture) occTexture = Cpp::findValue(texture, m_mapEmbeddedTexture); + if (occTexture) + return occTexture; + } + + // Texture might have already been loaded from file + { + Handle(Image_Texture) texture = CppUtils::findValue(strFilepath, m_mapFileTexture); + if (texture) + return texture; + } + + // Fallback: load texture from filepath + + // Define texture "candidate" filepaths that will be tried + const FilePath textureFilepath = filepathFrom(strFilepath); + const FilePath textureFilepathCandidates[] = { + textureFilepath, + modelFilepath.parent_path() / textureFilepath, + modelFilepath.parent_path() / textureFilepath.filename() + }; + + const FilePath* ptrTextureFilepath = nullptr; + for (const FilePath& fp : textureFilepathCandidates) { + if (filepathExists(fp)) { + ptrTextureFilepath = &fp; + break; + } + } + + // Could find an existing filepath for the texture + if (ptrTextureFilepath) { + Handle(Image_Texture) texture = new Image_Texture(filepathTo(*ptrTextureFilepath)); + // Cache texture + m_mapFileTexture.insert({ strFilepath, texture }); + return texture; + } + + // Report warning "texture not found" + MessageStream msgWarning = this->messenger()->warning(); + msgWarning << fmt::format(AssimpReaderI18N::textIdTr("Texture not found: {}\nTried:"), strFilepath); + for (const FilePath& fp : textureFilepathCandidates) + msgWarning << "\n " << filepathCanonical(fp).make_preferred().u8string(); + + return {}; +} + +Handle(XCAFDoc_VisMaterial) AssimpReader::createOccVisMaterial( + const aiMaterial* material, const FilePath& modelFilepath + ) +{ + Handle(XCAFDoc_VisMaterial) mat = new XCAFDoc_VisMaterial; + + //mat->SetAlphaMode(Graphic3d_AlphaMode_Opaque); + + ai_real shininessMax = 1.; + std::string suffix = modelFilepath.extension().u8string(); + std::transform(suffix.cbegin(), suffix.cend(), suffix.begin(), [](char c) { + return std::tolower(c, std::locale::classic()); + }); + if (suffix == ".fbx") + shininessMax = 128.f; + else if (suffix == ".obj") + shininessMax = 1000.f; + + // Set name + { + aiString matName; + material->Get(AI_MATKEY_NAME, matName); + std::string_view vMatName{ matName.C_Str(), matName.length }; + mat->SetRawName(string_conv(vMatName)); + } + + // Backface culling + { + int flag; + if (material->Get(AI_MATKEY_TWOSIDED, flag) == aiReturn_SUCCESS) { +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 6, 0) + mat->SetFaceCulling( + flag ? + Graphic3d_TypeOfBackfacingModel_DoubleSided + : Graphic3d_TypeOfBackfacingModel_BackCulled + ); +#else + mat->SetDoubleSided(flag != 0); +#endif + } + } + + // Helper function to update some boolean flag if 'res' holds success status + auto fnUpdateDefinedFlag = [](bool* ptrDefinedFlag, aiReturn res) { + if (ptrDefinedFlag && res == aiReturn_SUCCESS) + *ptrDefinedFlag = true; + return res == aiReturn_SUCCESS; + }; + + // Helper function to get the color value of some property + auto fnGetColor4D = [=](const char* key, unsigned type, unsigned index, aiColor4D* ptrColor, bool* ptrDefinedFlag = nullptr) { + const aiReturn res = material->Get(key, type, index, *ptrColor); + // Some models have wrong color components outside [0, 1] range, and Quantity_Color reject + // them(exception in constructor) + ptrColor->r = std::clamp(ptrColor->r, 0.f, 1.f); + ptrColor->g = std::clamp(ptrColor->g, 0.f, 1.f); + ptrColor->b = std::clamp(ptrColor->b, 0.f, 1.f); + ptrColor->a = std::clamp(ptrColor->a, 0.f, 1.f); + return fnUpdateDefinedFlag(ptrDefinedFlag, res); + }; + + // Helper function to get the value(real) of some property + auto fnGetReal = [=](const char* key, unsigned type, unsigned index, ai_real* ptrValue, bool* ptrDefinedFlag = nullptr) { + const aiReturn res = material->Get(key, type, index, *ptrValue); + return fnUpdateDefinedFlag(ptrDefinedFlag, res); + }; + + // Helper function to get the texture path value of some property + auto fnGetTexture = [=](aiTextureType type, aiString* ptrTexture, bool* ptrDefinedFlag = nullptr) { + const aiReturn res = material->GetTexture(type, 0, ptrTexture); + return fnUpdateDefinedFlag(ptrDefinedFlag, res); + }; + + // Helper function around AssimpReader::findOccTexture() + auto fnFindOccTexture = [=](const aiString& strTexture) { + return this->findOccTexture(strTexture.C_Str(), modelFilepath); + }; + + // Common + XCAFDoc_VisMaterialCommon matCommon; + matCommon.IsDefined = false; + + { + aiColor4D color; + if (fnGetColor4D(AI_MATKEY_COLOR_AMBIENT, &color, &matCommon.IsDefined)) + matCommon.AmbientColor = toOccColor(color); + + if (fnGetColor4D(AI_MATKEY_COLOR_DIFFUSE, &color, &matCommon.IsDefined)) + matCommon.DiffuseColor = toOccColor(color); + + if (fnGetColor4D(AI_MATKEY_COLOR_SPECULAR, &color, &matCommon.IsDefined)) + matCommon.SpecularColor = toOccColor(color); + +#if 0 + ai_real factor; + if (fnGetReal(AI_MATKEY_SPECULAR_FACTOR, &factor, &matCommon.IsDefined)) + this->messenger()->trace() << "AI_MATKEY_SPECULAR_FACTOR: " << factor; +#endif + + if (fnGetColor4D(AI_MATKEY_COLOR_EMISSIVE, &color, &matCommon.IsDefined)) + matCommon.EmissiveColor = toOccColor(color); + } + + { + ai_real value; + if (fnGetReal(AI_MATKEY_OPACITY, &value, &matCommon.IsDefined)) + matCommon.Transparency = std::clamp(1.f - value, 0.f, 1.f); + + if (fnGetReal(AI_MATKEY_SHININESS, &value, &matCommon.IsDefined)) { + matCommon.Shininess = std::clamp(value / shininessMax, 0.f, 1.f); + //this->messenger()->trace() << "Shininess: " << value << " max: " << shininessMax; + } + } + + { + aiString texDiffuse; + if (fnGetTexture(aiTextureType_DIFFUSE, &texDiffuse, &matCommon.IsDefined)) + matCommon.DiffuseTexture = fnFindOccTexture(texDiffuse); + } + + // PBR + XCAFDoc_VisMaterialPBR matPbr; + matPbr.IsDefined = false; + + { + aiString strTexture; + if (fnGetTexture(aiTextureType_BASE_COLOR, &strTexture, &matPbr.IsDefined)) + matPbr.BaseColorTexture = fnFindOccTexture(strTexture); + + if (fnGetTexture(aiTextureType_METALNESS, &strTexture)) + matPbr.MetallicRoughnessTexture = fnFindOccTexture(strTexture); + + if (fnGetTexture(aiTextureType_EMISSION_COLOR, &strTexture, &matPbr.IsDefined)) + matPbr.EmissiveTexture = fnFindOccTexture(strTexture); + + if (fnGetTexture(aiTextureType_AMBIENT_OCCLUSION, &strTexture, &matPbr.IsDefined)) + matPbr.OcclusionTexture = fnFindOccTexture(strTexture); + + if (fnGetTexture(aiTextureType_NORMALS, &strTexture, &matPbr.IsDefined)) + matPbr.NormalTexture = fnFindOccTexture(strTexture); + } + +#ifdef AI_MATKEY_BASE_COLOR + { + aiColor4D color; + if (fnGetColor4D(AI_MATKEY_BASE_COLOR, &color, &matPbr.IsDefined)) + matPbr.BaseColor = Quantity_ColorRGBA(toOccColor(color), color.a); + } +#endif + + { + // TODO Handle EmissiveFactor + } + + { + ai_real value; +#ifdef AI_MATKEY_METALLIC_FACTOR + if (fnGetReal(AI_MATKEY_METALLIC_FACTOR, &value, &matPbr.IsDefined)) + matPbr.Metallic = std::clamp(value, 0.f, 1.f); +#endif + +#ifdef AI_MATKEY_ROUGHNESS_FACTOR + if (fnGetReal(AI_MATKEY_ROUGHNESS_FACTOR, &value, &matPbr.IsDefined)) + matPbr.Roughness = std::clamp(value, 0.f, 1.f); +#endif + + if (fnGetReal(AI_MATKEY_REFRACTI, &value, &matPbr.IsDefined)) { + // Refraction index must be in range [1.0, 3.0] + // If < 1 then an exception is thrown by Graphic3d_MaterialAspect::SetRefractionIndex() + matPbr.RefractionIndex = std::clamp(value, 1.f, 3.f); + } + } + + if (matCommon.IsDefined) + mat->SetCommonMaterial(matCommon); + + if (matPbr.IsDefined) + mat->SetPbrMaterial(matPbr); + + return mat; +} + +void AssimpReader::transferSceneNode( + const aiNode* node, + DocumentPtr targetDoc, + const TDF_Label& labelEntity, + const std::function& fnCallbackMesh + ) +{ + if (!node) + return; + + const std::string nodeName = node->mName.C_Str(); + + const aiNodeData nodeData = Cpp::findValue(node, m_mapNodeData); + gp_Trsf nodeAbsoluteTrsf = nodeData.occAbsoluteTrsf; + if (hasScaleFactor(nodeAbsoluteTrsf)) + nodeAbsoluteTrsf.SetScaleFactor(1.); + +#ifdef MAYO_ASSIMP_READER_HANDLE_SCALING + const aiVector3D nodeScaling = aiMatrixScaling(nodeData.aiAbsoluteTrsf); + const bool nodeHasScaling = hasScaleFactor(nodeScaling); +#endif + + // Produce shape corresponding to the node + for (unsigned imesh = 0; imesh < node->mNumMeshes; ++imesh) { + auto sceneMeshIndex = node->mMeshes[imesh]; + const aiMesh* mesh = m_scene->mMeshes[sceneMeshIndex]; + fnCallbackMesh(mesh); + auto triangulation = m_vecTriangulation.at(sceneMeshIndex); + if (!triangulation) + continue; // Skip + +#ifdef MAYO_ASSIMP_READER_HANDLE_SCALING + if (nodeHasScaling) { + triangulation = triangulation->Copy(); + for (int i = 1; i < triangulation->NbNodes(); ++i) { + gp_Pnt pnt = triangulation->Node(i); + pnt.SetX(pnt.X() * nodeScaling.x); + pnt.SetY(pnt.Y() * nodeScaling.y); + pnt.SetZ(pnt.Z() * nodeScaling.z); + MeshUtils::setNode(triangulation, i , pnt); + } + } +#endif + + TopoDS_Face face = BRepUtils::makeFace(triangulation); + face.Location(nodeAbsoluteTrsf); + const TDF_Label labelComponent = targetDoc->xcaf().shapeTool()->AddComponent(labelEntity, face); + const TDF_Label labelFace = targetDoc->xcaf().shapeReferred(labelComponent); + + if (mesh->mMaterialIndex < m_vecMaterial.size()) { + const OccHandle& material = m_vecMaterial.at(mesh->mMaterialIndex); + const TDF_Label materialLabel = Cpp::findValue(material, m_mapMaterialLabel); + if (!materialLabel.IsNull()) + targetDoc->xcaf().visMaterialTool()->SetShapeMaterial(labelFace, materialLabel); + else + this->messenger()->trace() << "Material not found(umap), index: " << mesh->mMaterialIndex; + } + + std::string shapeName = nodeName; + if (node->mNumMeshes > 1) { + shapeName += "_"; + if (mesh->mName.length > 0) + shapeName += mesh->mName.C_Str(); + else + shapeName += "mesh" + std::to_string(imesh); + } + + TDataStd_Name::Set(labelFace, to_OccExtString(shapeName)); + } + + // Process child nodes + for (unsigned ichild = 0; ichild < node->mNumChildren; ++ichild) + this->transferSceneNode(node->mChildren[ichild], targetDoc, labelEntity, fnCallbackMesh); +} + +} // namespace IO +} // namespace Mayo diff --git a/src/io_assimp/io_assimp_reader.h b/src/io_assimp/io_assimp_reader.h new file mode 100644 index 00000000..6593b7d9 --- /dev/null +++ b/src/io_assimp/io_assimp_reader.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** Copyright (c) 2023, Fougue Ltd. +** All rights reserved. +** See license at https://github.com/fougue/mayo/blob/master/LICENSE.txt +****************************************************************************/ + +#pragma once + +#include "../base/document_ptr.h" +#include "../base/io_reader.h" +#include "../base/tkernel_utils.h" + +#include + +#include +#include +#include + +#include +#include +#include + +struct aiMaterial; +struct aiMesh; +struct aiNode; +struct aiTexture; + +namespace Mayo { +namespace IO { + +// Assimp-based reader +// Requires OpenCascade >= v7.5.0(for XCAFDoc_VisMaterial) +class AssimpReader : public Reader { +public: + bool readFile(const FilePath& filepath, TaskProgress* progress) override; + TDF_LabelSequence transfer(DocumentPtr doc, TaskProgress* progress) override; + + static std::unique_ptr createProperties(PropertyGroup* parentGroup); + void applyProperties(const PropertyGroup* params) override; + +private: + // Create OpenCascade texture object + // Parameter 'strFilepath' is the filepath to the texture as specified by the assimp material + // Parameter 'modelFilepath' is the filepath to the 3D model being imported with Reader::readFile() + Handle(Image_Texture) findOccTexture(const std::string& strFilepath, const FilePath& modelFilepath); + + // Create XCAFDoc_VisMaterial from assimp material + // Parameter 'modelFilepath' is the filepath to the 3D model being imported with Reader::readFile() + Handle(XCAFDoc_VisMaterial) createOccVisMaterial(const aiMaterial* material, const FilePath& modelFilepath); + + void transferSceneNode( + const aiNode* node, + DocumentPtr targetDoc, + const TDF_Label& labelEntity, + const std::function& fnCallbackMesh + ); + + struct aiNodeData { + gp_Trsf occAbsoluteTrsf; + aiMatrix4x4 aiAbsoluteTrsf; + }; + + class Properties; + Assimp::Importer m_importer; + const aiScene* m_scene = nullptr; + + std::vector m_vecTriangulation; + std::vector m_vecMaterial; + std::unordered_map m_mapMaterialLabel; + std::unordered_map m_mapNodeData; + std::unordered_map m_mapEmbeddedTexture; + std::unordered_map m_mapFileTexture; +}; + +} // namespace IO +} // namespace Mayo From 9cc5df08dd4dc209e34cbd2a26f18268ce5f9484 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 14 Nov 2023 17:46:11 +0100 Subject: [PATCH 70/92] App: no longer hard-code used 3rd-party libraries in DialogAbout --- src/app/command_system_information.cpp | 37 +++++++++++++++++--------- src/app/commands_help.cpp | 3 +++ src/app/commands_help.h | 14 +++++++++- src/app/dialog_about.cpp | 16 +++++------ src/app/dialog_about.h | 3 +++ src/app/dialog_about.ui | 22 +++++---------- src/app/main.cpp | 8 ++++-- src/io_assimp/io_assimp.cpp | 28 ++++++++++++------- src/io_assimp/io_assimp.h | 2 ++ src/io_gmio/io_gmio.h | 4 ++- 10 files changed, 88 insertions(+), 49 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index 9ce38307..75c9d5d0 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -129,14 +129,9 @@ QTextStream& operator<<(QTextStream& str, std::string_view sv) const char indent[] = " "; const char indentx2[] = " "; -struct LibraryInfo { - std::string name; - std::string data; -}; - -std::vector& getLibraryInfos() +std::vector& getLibraryInfos() { - static std::vector vec; + static std::vector vec; return vec; } @@ -235,11 +230,14 @@ QString CommandSystemInformation::data() << indent << "Image formats(write): " << QImageWriter::supportedImageFormats().join(' ') << '\n'; // OpenCascade version - ostr << '\n' << "OpenCascade(build): " << OCC_VERSION_STRING_EXT << '\n'; + ostr << '\n' << "OpenCascade: " << OCC_VERSION_STRING_EXT << " (build)" << '\n'; // Other registered libraries - for (const LibraryInfo& libInfo : getLibraryInfos()) - ostr << '\n' << to_QString(libInfo.name) << ": " << to_QString(libInfo.data) << '\n'; + for (const LibraryInfo& libInfo : getLibraryInfos()) { + ostr << '\n' << to_QString(libInfo.name) << ": " << to_QString(libInfo.version) + << " " << to_QString(libInfo.versionDetails) + << '\n'; + } // I/O supported formats { @@ -439,12 +437,25 @@ QString CommandSystemInformation::data() return strSysInfo; } -void CommandSystemInformation::addLibraryInfo(std::string_view libName, std::string_view data) +void CommandSystemInformation::addLibraryInfo( + std::string_view libName, + std::string_view version, + std::string_view versionDetails + ) { - if (!libName.empty() && !data.empty()) { - LibraryInfo libInfo{ std::string(libName), std::string(data) }; + if (!libName.empty() && !version.empty()) { + const LibraryInfo libInfo{ + std::string(libName), + std::string(version), + std::string(versionDetails) + }; getLibraryInfos().push_back(std::move(libInfo)); } } +Span CommandSystemInformation::libraryInfos() +{ + return getLibraryInfos(); +} + } // namespace Mayo diff --git a/src/app/commands_help.cpp b/src/app/commands_help.cpp index c03ac1b6..92cb882e 100644 --- a/src/app/commands_help.cpp +++ b/src/app/commands_help.cpp @@ -41,6 +41,9 @@ CommandAbout::CommandAbout(IAppContext* context) void CommandAbout::execute() { auto dlg = new DialogAbout(this->widgetMain()); + for (const auto& libInfo : CommandSystemInformation::libraryInfos()) + dlg->addLibraryInfo(libInfo.name, libInfo.version); + QtWidgetsUtils::asyncDialogExec(dlg); } diff --git a/src/app/commands_help.h b/src/app/commands_help.h index 994e8e06..23c49a92 100644 --- a/src/app/commands_help.h +++ b/src/app/commands_help.h @@ -7,6 +7,7 @@ #pragma once #include "commands_api.h" +#include "../base/span.h" namespace Mayo { @@ -24,7 +25,18 @@ class CommandSystemInformation : public Command { void execute() override; static QString data(); - static void addLibraryInfo(std::string_view libName, std::string_view data); + + struct LibraryInfo { + std::string name; + std::string version; + std::string versionDetails; + }; + static void addLibraryInfo( + std::string_view libName, + std::string_view version, + std::string_view versionDetails = "" + ); + static Span libraryInfos(); static constexpr std::string_view Name = "system-info"; }; diff --git a/src/app/dialog_about.cpp b/src/app/dialog_about.cpp index 4c11e362..1c62d02a 100644 --- a/src/app/dialog_about.cpp +++ b/src/app/dialog_about.cpp @@ -7,11 +7,9 @@ #include "dialog_about.h" #include "ui_dialog_about.h" +#include "qstring_conv.h" #include "version.h" #include -#ifdef HAVE_GMIO -# include -#endif namespace Mayo { @@ -28,11 +26,6 @@ DialogAbout::DialogAbout(QWidget* parent) m_ui->label_BuildDateTime->setText(m_ui->label_BuildDateTime->text().arg(__DATE__, __TIME__)); m_ui->label_Qt->setText(m_ui->label_Qt->text().arg(QT_VERSION_STR)); m_ui->label_Occ->setText(m_ui->label_Occ->text().arg(OCC_VERSION_COMPLETE)); -#ifdef HAVE_GMIO - m_ui->label_Gmio->setText(m_ui->label_Gmio->text().arg(GMIO_VERSION_STR)); -#else - m_ui->label_Gmio->hide(); -#endif } DialogAbout::~DialogAbout() @@ -40,4 +33,11 @@ DialogAbout::~DialogAbout() delete m_ui; } +void DialogAbout::addLibraryInfo(std::string_view libName, std::string_view libVersion) +{ + auto label = new QLabel(this); + label->setText(tr("%1 %2").arg(to_QString(libName), to_QString(libVersion))); + m_ui->layout_Infos->addWidget(label);; +} + } // namespace Mayo diff --git a/src/app/dialog_about.h b/src/app/dialog_about.h index 34bb8114..86428322 100644 --- a/src/app/dialog_about.h +++ b/src/app/dialog_about.h @@ -7,6 +7,7 @@ #pragma once #include +#include namespace Mayo { @@ -16,6 +17,8 @@ class DialogAbout : public QDialog { DialogAbout(QWidget* parent = nullptr); ~DialogAbout(); + void addLibraryInfo(std::string_view libName, std::string_view libVersion); + private: class Ui_DialogAbout* m_ui = nullptr; }; diff --git a/src/app/dialog_about.ui b/src/app/dialog_about.ui index 13f1837b..af20ac50 100644 --- a/src/app/dialog_about.ui +++ b/src/app/dialog_about.ui @@ -6,8 +6,8 @@ 0 0 - 288 - 175 + 270 + 160 @@ -35,7 +35,7 @@ - :/images/appicon_64.png + :/images/appicon_64.png Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop @@ -46,7 +46,6 @@ - 75 true @@ -86,28 +85,21 @@ - - + + Qt %1 - + OpenCascade %1 - - - - gmio %1 - - - @@ -136,7 +128,7 @@ - + diff --git a/src/app/main.cpp b/src/app/main.cpp index d925643c..4805c958 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -504,8 +504,12 @@ static int runApp(QCoreApplication* qtApp) appModule->properties()->retranslate(); // Register library infos - CommandSystemInformation::addLibraryInfo(IO::GmioLib::strName(), IO::GmioLib::strVersion()); - CommandSystemInformation::addLibraryInfo(IO::AssimpLib::strName(), IO::AssimpLib::strVersion()); + CommandSystemInformation::addLibraryInfo( + IO::AssimpLib::strName(), IO::AssimpLib::strVersion(), IO::AssimpLib::strVersionDetails() + ); + CommandSystemInformation::addLibraryInfo( + IO::GmioLib::strName(), IO::GmioLib::strVersion(), IO::GmioLib::strVersionDetails() + ); // Process CLI if (args.showSystemInformation) { diff --git a/src/io_assimp/io_assimp.cpp b/src/io_assimp/io_assimp.cpp index c0d40ec6..2de7df6c 100644 --- a/src/io_assimp/io_assimp.cpp +++ b/src/io_assimp/io_assimp.cpp @@ -44,6 +44,24 @@ std::string_view AssimpLib::strVersion() { static std::string str; + if (str.empty()) { + str += std::to_string(aiGetVersionMajor()) + + "." + std::to_string(aiGetVersionMinor()) +#ifndef NO_ASSIMP_aiGetVersionPatch + + "." + std::to_string(aiGetVersionPatch()) +#else + + ".?" +#endif + ; + } + + return str; +} + +std::string_view AssimpLib::strVersionDetails() +{ + static std::string str; + if (str.empty()) { const std::string strBranchName = aiGetBranchName() ? aiGetBranchName() : ""; @@ -67,14 +85,7 @@ std::string_view AssimpLib::strVersion() #endif } - str += std::to_string(aiGetVersionMajor()) - + "." + std::to_string(aiGetVersionMinor()) -#ifndef NO_ASSIMP_aiGetVersionPatch - + "." + std::to_string(aiGetVersionPatch()) -#else - + ".?" -#endif - + " rev:" + std::to_string(aiGetVersionRevision()) + str += "rev:" + std::to_string(aiGetVersionRevision()) + " branch:" + (!strBranchName.empty() ? strBranchName : "?") + " flags:" + strCompileFlags ; @@ -82,6 +93,5 @@ std::string_view AssimpLib::strVersion() return str; } - } // namespace IO } // namespace Mayo diff --git a/src/io_assimp/io_assimp.h b/src/io_assimp/io_assimp.h index bdf4db00..d8a25b04 100644 --- a/src/io_assimp/io_assimp.h +++ b/src/io_assimp/io_assimp.h @@ -31,8 +31,10 @@ struct AssimpLib { static std::string_view strName() { return "Assimp"; } #ifdef HAVE_ASSIMP static std::string_view strVersion(); + static std::string_view strVersionDetails(); #else static std::string_view strVersion() { return ""; } + static std::string_view strVersionDetails() { return ""; } #endif }; diff --git a/src/io_gmio/io_gmio.h b/src/io_gmio/io_gmio.h index 5757e3c5..5ec737c0 100644 --- a/src/io_gmio/io_gmio.h +++ b/src/io_gmio/io_gmio.h @@ -31,11 +31,13 @@ class GmioFactoryWriter : public FactoryWriter { }; struct GmioLib { - static std::string_view strName() { return "gmio(build)"; } + static std::string_view strName() { return "gmio"; } #ifdef HAVE_GMIO static std::string_view strVersion(); + static std::string_view strVersionDetails() { return "(build)"; } #else static std::string_view strVersion() { return ""; } + static std::string_view strVersionDetails() { return ""; } #endif }; From b8e868a79473bd17dba2421fda67c95ad4e7d3a5 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 14 Nov 2023 18:07:11 +0100 Subject: [PATCH 71/92] CI: use Assimp with macOS builds --- .github/workflows/ci_macos.yml | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_macos.yml b/.github/workflows/ci_macos.yml index 215faeb8..8161795a 100644 --- a/.github/workflows/ci_macos.yml +++ b/.github/workflows/ci_macos.yml @@ -23,6 +23,13 @@ jobs: echo "GH_CASCADE_INC_DIR=$GH_CASCADE_BASE_DIR/include/opencascade" >> $GITHUB_ENV echo "GH_CASCADE_LIB_DIR=$GH_CASCADE_BASE_DIR/lib" >> $GITHUB_ENV + - name: Install Assimp + run: | + brew install assimp + GH_ASSIMP_BASE_DIR=`brew info assimp | grep -E -i --only-matching --max-count=1 "^(/[a-z\.\-_0-9]+)+"` + echo "GH_ASSIMP_INC_DIR=$GH_ASSIMP_BASE_DIR/include/assimp" >> $GITHUB_ENV + echo "GH_ASSIMP_LIB_DIR=$GH_ASSIMP_BASE_DIR/lib" >> $GITHUB_ENV + - name: Get count of CPU cores uses: SimenB/github-actions-cpu-cores@v1 id: cpu-cores @@ -33,9 +40,17 @@ jobs: cd ${{github.workspace}}/build echo CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} echo CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} + echo ASSIMP_INC_DIR=${{env.GH_ASSIMP_INC_DIR}} + echo ASSIMP_LIB_DIR=${{env.GH_ASSIMP_LIB_DIR}} [ ! -d $CASCADE_INC_DIR ] && echo "ERROR: OpenCascade include dir doesn't exist" [ ! -d $CASCADE_LIB_DIR ] && echo "ERROR: OpenCascade lib dir doesn't exist" - qmake .. CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} CONFIG+=withtests + [ ! -d $ASSIMP_INC_DIR ] && echo "ERROR: assimp include dir doesn't exist" + [ ! -d $ASSIMP_LIB_DIR ] && echo "ERROR: assimp lib dir doesn't exist" + qmake .. CONFIG+=withtests \ + CASCADE_INC_DIR=${{env.GH_CASCADE_INC_DIR}} \ + CASCADE_LIB_DIR=${{env.GH_CASCADE_LIB_DIR}} \ + ASSIMP_INC_DIR=${{env.GH_ASSIMP_INC_DIR}} \ + ASSIMP_LIB_DIR=${{env.GH_ASSIMP_LIB_DIR}} make -j${{steps.cpu-cores.outputs.count}} - name: Execute Unit Tests From da4a33bc6f5a34b67ab2dbb28b561c330611b029 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 14 Nov 2023 18:59:36 +0100 Subject: [PATCH 72/92] IO_Assimp: improve build support --- mayo.pro | 13 +------------ src/io_assimp/io_assimp_reader.cpp | 3 ++- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/mayo.pro b/mayo.pro index daafee08..a21b22d9 100644 --- a/mayo.pro +++ b/mayo.pro @@ -238,18 +238,7 @@ defined(ASSIMP_IS_ON, var) { } INCLUDEPATH += $$ASSIMP_INC_DIR/.. - LIBS += -L$$ASSIMP_LIB_DIR - win32 { - CONFIG(debug, debug|release) { - LIBS += -lassimp-vc142-mtd -lzlibstaticd - } else { - LIBS +=-lassimp-vc142-mtd -lzlibstatic - } - } - else { - LIBS += -lassimp - } - + LIBS += -L$$ASSIMP_LIB_DIR -lassimp$$ASSIMP_LIBNAME_SUFFIX DEFINES += HAVE_ASSIMP } diff --git a/src/io_assimp/io_assimp_reader.cpp b/src/io_assimp/io_assimp_reader.cpp index 05ce928b..1e7b70d3 100644 --- a/src/io_assimp/io_assimp_reader.cpp +++ b/src/io_assimp/io_assimp_reader.cpp @@ -238,7 +238,8 @@ bool AssimpReader::readFile(const FilePath& filepath, TaskProgress* progress) const unsigned flags = aiProcess_Triangulate | aiProcess_JoinIdenticalVertices - | aiProcess_SortByPType + //| aiProcess_SortByPType /* Crashes with assimp-5.3.1 on Windows */ + //| aiProcess_OptimizeGraph //| aiProcess_TransformUVCoords //| aiProcess_FlipUVs From dfddd4ab636d21ab83f304e997afb478e8b10dfe Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 15 Nov 2023 09:36:41 +0100 Subject: [PATCH 73/92] CI: support assimp for Windows builds --- .github/workflows/ci_windows.yml | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci_windows.yml b/.github/workflows/ci_windows.yml index 63cbd1e8..de894de8 100644 --- a/.github/workflows/ci_windows.yml +++ b/.github/workflows/ci_windows.yml @@ -38,6 +38,24 @@ jobs: run: | Expand-Archive -Path OpenCASCADE-${{matrix.occ_version}}-vc14-64.zip -DestinationPath . + - name: Cache Assimp archive + id: cache-assimp + uses: actions/cache@v3 + with: + path: assimp-5.3.1.zip + key: assimp-5.3.1 + + - name: Download Assimp + if: steps.cache-assimp.outputs.cache-hit != 'true' + uses: carlosperate/download-file-action@v2 + with: + file-url: 'https://www.fougue.pro/share/bin/assimp-5.3.1.zip' + + - name: Extract Assimp + shell: pwsh + run: | + Expand-Archive -Path assimp-5.3.1.zip -DestinationPath . + - name: Download jom.exe uses: carlosperate/download-file-action@v2 with: @@ -61,7 +79,10 @@ jobs: echo CSF_OCCTIncludePath=%CSF_OCCTIncludePath% echo CSF_OCCTLibPath=%CSF_OCCTLibPath% qmake --version - qmake ..\mayo.pro CONFIG+=release CONFIG+=withtests + qmake ..\mayo.pro CONFIG+=release CONFIG+=withtests ^ + ASSIMP_INC_DIR=${{github.workspace}}/assimp-5.3.1/include/assimp ^ + ASSIMP_LIB_DIR=${{github.workspace}}/assimp-5.3.1/lib ^ + ASSIMP_LIBNAME_SUFFIX=-vc143-mt - name: Build working-directory: ${{github.workspace}}/build @@ -73,5 +94,6 @@ jobs: shell: cmd run: | call ..\OpenCASCADE-${{matrix.occ_version}}-vc14-64\opencascade-${{matrix.occ_version}}\env.bat + set PATH=${{github.workspace}}\assimp-5.3.1\bin;%PATH% release\mayo.exe --runtests -o utests-output.txt more utests-output.txt From df7a7e85362fa1674836326b267a980fdc787d6f Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 15 Nov 2023 12:51:13 +0100 Subject: [PATCH 74/92] IO_Assimp: add support for Blender file format Relates to GitHub #19 --- src/base/io_format.cpp | 7 ++++++- src/base/io_format.h | 3 ++- src/io_assimp/io_assimp.cpp | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/base/io_format.cpp b/src/base/io_format.cpp index 8e362919..b7505b3d 100644 --- a/src/base/io_format.cpp +++ b/src/base/io_format.cpp @@ -32,6 +32,7 @@ std::string_view formatIdentifier(Format format) case Format_COLLADA: return "COLLADA"; case Format_FBX: return "FBX"; case Format_X3D: return "X3D"; + case Format_Blender: return "Blender"; } return ""; @@ -58,6 +59,7 @@ std::string_view formatName(Format format) case Format_COLLADA: return "COLLAborative Design Activity(ISO/PAS 17506)"; case Format_FBX: return "Filmbox"; case Format_X3D: return "Extensible 3D Graphics(ISO/IEC 19775/19776/19777)"; + case Format_Blender: return "Blender File Format"; } return ""; @@ -82,6 +84,7 @@ Span formatFileSuffixes(Format format) static std::string_view suffix_stl[] = { "stl" }; static std::string_view suffix_vrml[] = { "wrl", "wrz", "vrml" }; static std::string_view suffix_x3d[] = { "x3d", "x3dv", "x3db", "x3dz", "x3dbz", "x3dvz" }; + static std::string_view suffix_blender[] = { "blend", "blender", "blend1", "blend2" }; switch (format) { case Format_Unknown: return {}; @@ -102,6 +105,7 @@ Span formatFileSuffixes(Format format) case Format_STL: return suffix_stl; case Format_VRML: return suffix_vrml; case Format_X3D: return suffix_x3d; + case Format_Blender: return suffix_blender; } return {}; @@ -121,7 +125,8 @@ bool formatProvidesMesh(Format format) { return !formatProvidesBRep(format) && format != Format_Unknown - && format != Format_Image; + && format != Format_Image + ; } } // namespace IO diff --git a/src/base/io_format.h b/src/base/io_format.h index c3d21701..081e746e 100644 --- a/src/base/io_format.h +++ b/src/base/io_format.h @@ -31,7 +31,8 @@ enum Format { Format_STEP, Format_STL, Format_VRML, - Format_X3D + Format_X3D, + Format_Blender }; // Returns identifier(unique short name) corresponding to 'format' diff --git a/src/io_assimp/io_assimp.cpp b/src/io_assimp/io_assimp.cpp index 2de7df6c..98d74fc3 100644 --- a/src/io_assimp/io_assimp.cpp +++ b/src/io_assimp/io_assimp.cpp @@ -17,7 +17,7 @@ namespace IO { Span AssimpFactoryReader::formats() const { static const Format array[] = { - Format_AMF, Format_3DS, Format_3MF, Format_COLLADA, Format_FBX, Format_X3D + Format_AMF, Format_3DS, Format_3MF, Format_COLLADA, Format_FBX, Format_X3D, Format_Blender }; return array; } From 31c5fd73f2f9dd026fc527cd384ec07211327a36 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 20 Nov 2023 18:51:41 +0100 Subject: [PATCH 75/92] IO_Dxf: syncronize with latest FreeCad + better MTEXT support Relates to GitHub #240 --- src/base/string_conv.h | 15 + src/io_dxf/dxf.cpp | 3367 +++++++++++++++++++++--------------- src/io_dxf/dxf.h | 335 ++-- src/io_dxf/io_dxf.cpp | 125 +- src/io_off/io_off_reader.h | 1 - 5 files changed, 2365 insertions(+), 1478 deletions(-) diff --git a/src/base/string_conv.h b/src/base/string_conv.h index 166ccb67..4570ee52 100644 --- a/src/base/string_conv.h +++ b/src/base/string_conv.h @@ -6,6 +6,7 @@ #pragma once +#include #include #include #include @@ -136,6 +137,13 @@ template<> struct StringConv } }; +// std::string_view -> NCollection_Utf8String +template<> struct StringConv { + static auto to(std::string_view str) { + return NCollection_Utf8String(str.data(), static_cast(str.size())); + } +}; + // -- // -- Handle(TCollection_HAsciiString) -> X // -- @@ -180,6 +188,13 @@ template<> struct StringConv { } }; +// std::string -> NCollection_Utf8String +template<> struct StringConv { + static auto to(const std::string& str) { + return NCollection_Utf8String(str.c_str(), static_cast(str.size())); + } +}; + // -- // -- TCollection_AsciiString -> X // -- diff --git a/src/io_dxf/dxf.cpp b/src/io_dxf/dxf.cpp index 730be108..edcf93c6 100644 --- a/src/io_dxf/dxf.cpp +++ b/src/io_dxf/dxf.cpp @@ -3,15 +3,18 @@ // This program is released under the BSD license. See the file COPYING for details. // modified 2018 wandererfan -// MAYO: file initially taken from FreeCad/src/Mod/Import/App/dxf.cpp -- commit #1ac35d2 +// MAYO: file taken from FreeCad/src/Mod/Import/App/dxf.cpp -- commit #55292e9 #if defined(_MSC_VER) && !defined(_USE_MATH_DEFINES) //required by windows for M_PI definition # define _USE_MATH_DEFINES #endif +#include +#include #include #include +#include #include "../base/filepath.h" #include "dxf.h" @@ -19,10 +22,52 @@ namespace { template -void safe_strcpy(char (&dst)[N1], const char (&src)[N2]) { +void safe_strcpy(char (&dst)[N1], const char (&src)[N2]) +{ strncpy(dst, src, std::min(N1, N2)); } +class ScopedCLocale { +public: + ScopedCLocale(int category) + : m_category(category), + m_savedLocale(std::setlocale(category, nullptr)) + { + std::setlocale(category, "C"); + } + + ~ScopedCLocale() + { + std::setlocale(m_category, m_savedLocale); + } + +private: + int m_category = 0; + const char* m_savedLocale = nullptr; +}; + +double stringToDouble(const std::string& line) +{ + try { + return std::stod(line); + } catch (...) { + throw std::runtime_error("Failed to fetch double value from line:\n" + line); + } + + return 0.; +} + +int stringToInt(const std::string& line) +{ + try { + return std::stoi(line); + } catch (...) { + throw std::runtime_error("Failed to fetch int value from line:\n" + line); + } + + return 0; +} + } // namespace Base::Vector3d toVector3d(const double* a) @@ -34,27 +79,27 @@ Base::Vector3d toVector3d(const double* a) return result; } -CDxfWrite::CDxfWrite(const char* filepath) : -m_ofs(filepath, std::ios::out), -//TODO: these should probably be parameters in config file -//handles: -//boilerplate 0 - A00 -//used by dxf.cpp A01 - FFFE -//ACAD HANDSEED FFFF - -m_handle(0xA00), //room for 2560 handles in boilerplate files -//m_entityHandle(0x300), //don't need special ranges for handles -//m_layerHandle(0x30), -//m_blockHandle(0x210), -//m_blkRecordHandle(0x110), -m_polyOverride(false), -m_layerName("none") +CDxfWrite::CDxfWrite(const char* filepath) + : m_ofs(filepath, std::ios::out), + //TODO: these should probably be parameters in config file + //handles: + //boilerplate 0 - A00 + //used by dxf.cpp A01 - FFFE + //ACAD HANDSEED FFFF + + m_handle(0xA00), //room for 2560 handles in boilerplate files + //m_entityHandle(0x300), //don't need special ranges for handles + //m_layerHandle(0x30), + //m_blockHandle(0x210), + //m_blkRecordHandle(0x110), + m_polyOverride(false), + m_layerName("none") { // start the file m_fail = false; m_version = 12; - if(!m_ofs) + if (!m_ofs) m_fail = true; else m_ofs.imbue(std::locale::classic()); @@ -64,7 +109,7 @@ CDxfWrite::~CDxfWrite() { } -void CDxfWrite::init(void) +void CDxfWrite::init() { writeHeaderSection(); makeBlockRecordTableHead(); @@ -72,7 +117,7 @@ void CDxfWrite::init(void) } //! assemble pieces into output file -void CDxfWrite::endRun(void) +void CDxfWrite::endRun() { makeLayerTable(); makeBlockRecordTableBody(); @@ -90,7 +135,7 @@ void CDxfWrite::endRun(void) //*************************** //writeHeaderSection //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeHeaderSection(void) +void CDxfWrite::writeHeaderSection() { std::stringstream ss; #if 0 @@ -117,7 +162,7 @@ void CDxfWrite::writeHeaderSection(void) //*************************** //writeClassesSection //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeClassesSection(void) +void CDxfWrite::writeClassesSection() { if (m_version < 14) { return; @@ -133,7 +178,7 @@ void CDxfWrite::writeClassesSection(void) //*************************** //writeTablesSection //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeTablesSection(void) +void CDxfWrite::writeTablesSection() { //static tables section head end content std::stringstream ss; @@ -162,7 +207,7 @@ void CDxfWrite::writeTablesSection(void) //*************************** //makeLayerTable //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::makeLayerTable(void) +void CDxfWrite::makeLayerTable() { std::string tablehash = getLayerHandle(); m_ssLayer << " 0" << std::endl; @@ -230,63 +275,63 @@ void CDxfWrite::makeLayerTable(void) //*************************** //makeBlockRecordTableHead //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::makeBlockRecordTableHead(void) +void CDxfWrite::makeBlockRecordTableHead() { if (m_version < 14) { return; } - std::string tablehash = getBlkRecordHandle(); - m_saveBlockRecordTableHandle = tablehash; - m_ssBlkRecord << " 0" << std::endl; - m_ssBlkRecord << "TABLE" << std::endl; - m_ssBlkRecord << " 2" << std::endl; - m_ssBlkRecord << "BLOCK_RECORD" << std::endl; - m_ssBlkRecord << " 5" << std::endl; - m_ssBlkRecord << tablehash << std::endl; - m_ssBlkRecord << "330" << std::endl; - m_ssBlkRecord << "0" << std::endl; - m_ssBlkRecord << "100" << std::endl; - m_ssBlkRecord << "AcDbSymbolTable" << std::endl; - m_ssBlkRecord << " 70" << std::endl; - m_ssBlkRecord << (m_blockList.size() + 5) << std::endl; - - m_saveModelSpaceHandle = getBlkRecordHandle(); - m_ssBlkRecord << " 0" << std::endl; - m_ssBlkRecord << "BLOCK_RECORD" << std::endl; - m_ssBlkRecord << " 5" << std::endl; - m_ssBlkRecord << m_saveModelSpaceHandle << std::endl; - m_ssBlkRecord << "330" << std::endl; - m_ssBlkRecord << tablehash << std::endl; - m_ssBlkRecord << "100" << std::endl; - m_ssBlkRecord << "AcDbSymbolTableRecord" << std::endl; - m_ssBlkRecord << "100" << std::endl; - m_ssBlkRecord << "AcDbBlockTableRecord" << std::endl; - m_ssBlkRecord << " 2" << std::endl; - m_ssBlkRecord << "*MODEL_SPACE" << std::endl; -// m_ssBlkRecord << " 1" << std::endl; -// m_ssBlkRecord << " " << std::endl; - - m_savePaperSpaceHandle = getBlkRecordHandle(); - m_ssBlkRecord << " 0" << std::endl; - m_ssBlkRecord << "BLOCK_RECORD" << std::endl; - m_ssBlkRecord << " 5" << std::endl; - m_ssBlkRecord << m_savePaperSpaceHandle << std::endl; - m_ssBlkRecord << "330" << std::endl; - m_ssBlkRecord << tablehash << std::endl; - m_ssBlkRecord << "100" << std::endl; - m_ssBlkRecord << "AcDbSymbolTableRecord" << std::endl; - m_ssBlkRecord << "100" << std::endl; - m_ssBlkRecord << "AcDbBlockTableRecord" << std::endl; - m_ssBlkRecord << " 2" << std::endl; - m_ssBlkRecord << "*PAPER_SPACE" << std::endl; -// m_ssBlkRecord << " 1" << std::endl; -// m_ssBlkRecord << " " << std::endl; + std::string tablehash = getBlkRecordHandle(); + m_saveBlockRecordTableHandle = tablehash; + m_ssBlkRecord << " 0" << std::endl; + m_ssBlkRecord << "TABLE" << std::endl; + m_ssBlkRecord << " 2" << std::endl; + m_ssBlkRecord << "BLOCK_RECORD" << std::endl; + m_ssBlkRecord << " 5" << std::endl; + m_ssBlkRecord << tablehash << std::endl; + m_ssBlkRecord << "330" << std::endl; + m_ssBlkRecord << "0" << std::endl; + m_ssBlkRecord << "100" << std::endl; + m_ssBlkRecord << "AcDbSymbolTable" << std::endl; + m_ssBlkRecord << " 70" << std::endl; + m_ssBlkRecord << (m_blockList.size() + 5) << std::endl; + + m_saveModelSpaceHandle = getBlkRecordHandle(); + m_ssBlkRecord << " 0" << std::endl; + m_ssBlkRecord << "BLOCK_RECORD" << std::endl; + m_ssBlkRecord << " 5" << std::endl; + m_ssBlkRecord << m_saveModelSpaceHandle << std::endl; + m_ssBlkRecord << "330" << std::endl; + m_ssBlkRecord << tablehash << std::endl; + m_ssBlkRecord << "100" << std::endl; + m_ssBlkRecord << "AcDbSymbolTableRecord" << std::endl; + m_ssBlkRecord << "100" << std::endl; + m_ssBlkRecord << "AcDbBlockTableRecord" << std::endl; + m_ssBlkRecord << " 2" << std::endl; + m_ssBlkRecord << "*MODEL_SPACE" << std::endl; + // m_ssBlkRecord << " 1" << std::endl; + // m_ssBlkRecord << " " << std::endl; + + m_savePaperSpaceHandle = getBlkRecordHandle(); + m_ssBlkRecord << " 0" << std::endl; + m_ssBlkRecord << "BLOCK_RECORD" << std::endl; + m_ssBlkRecord << " 5" << std::endl; + m_ssBlkRecord << m_savePaperSpaceHandle << std::endl; + m_ssBlkRecord << "330" << std::endl; + m_ssBlkRecord << tablehash << std::endl; + m_ssBlkRecord << "100" << std::endl; + m_ssBlkRecord << "AcDbSymbolTableRecord" << std::endl; + m_ssBlkRecord << "100" << std::endl; + m_ssBlkRecord << "AcDbBlockTableRecord" << std::endl; + m_ssBlkRecord << " 2" << std::endl; + m_ssBlkRecord << "*PAPER_SPACE" << std::endl; + // m_ssBlkRecord << " 1" << std::endl; + // m_ssBlkRecord << " " << std::endl; } - + //*************************** //makeBlockRecordTableBody //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::makeBlockRecordTableBody(void) +void CDxfWrite::makeBlockRecordTableBody() { if (m_version < 14) { return; @@ -306,8 +351,8 @@ void CDxfWrite::makeBlockRecordTableBody(void) m_ssBlkRecord << "AcDbBlockTableRecord" << std::endl; m_ssBlkRecord << " 2" << std::endl; m_ssBlkRecord << b << std::endl; -// m_ssBlkRecord << " 70" << std::endl; -// m_ssBlkRecord << " 0" << std::endl; + // m_ssBlkRecord << " 70" << std::endl; + // m_ssBlkRecord << " 0" << std::endl; iBlkRecord++; } } @@ -315,7 +360,7 @@ void CDxfWrite::makeBlockRecordTableBody(void) //*************************** //makeBlockSectionHead //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::makeBlockSectionHead(void) +void CDxfWrite::makeBlockSectionHead() { m_ssBlock << " 0" << std::endl; m_ssBlock << "SECTION" << std::endl; @@ -432,8 +477,7 @@ std::string CDxfWrite::getPlateFile(const std::string& fileSpec) std::string line; std::ifstream inFile (fpath); - while (!inFile.eof()) - { + while (!inFile.eof()) { std::getline(inFile,line); if (!inFile.eof()) { outString << line << '\n'; @@ -443,7 +487,7 @@ std::string CDxfWrite::getPlateFile(const std::string& fileSpec) return outString.str(); } -std::string CDxfWrite::getHandle(void) +std::string CDxfWrite::getHandle() { m_handle++; std::stringstream ss; @@ -452,24 +496,44 @@ std::string CDxfWrite::getHandle(void) return ss.str(); } -std::string CDxfWrite::getEntityHandle(void) +std::string CDxfWrite::getEntityHandle() { return getHandle(); + // m_entityHandle++; + // std::stringstream ss; + // ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + // ss << m_entityHandle; + // return ss.str(); } -std::string CDxfWrite::getLayerHandle(void) +std::string CDxfWrite::getLayerHandle() { return getHandle(); + // m_layerHandle++; + // std::stringstream ss; + // ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + // ss << m_layerHandle; + // return ss.str(); } -std::string CDxfWrite::getBlockHandle(void) +std::string CDxfWrite::getBlockHandle() { return getHandle(); + // m_blockHandle++; + // std::stringstream ss; + // ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + // ss << m_blockHandle; + // return ss.str(); } -std::string CDxfWrite::getBlkRecordHandle(void) +std::string CDxfWrite::getBlkRecordHandle() { return getHandle(); + // m_blkRecordHandle++; + // std::stringstream ss; + // ss << std::uppercase << std::hex << std::setfill('0') << std::setw(2); + // ss << m_blkRecordHandle; + // return ss.str(); } void CDxfWrite::addBlockName(std::string b, std::string h) @@ -480,8 +544,8 @@ void CDxfWrite::addBlockName(std::string b, std::string h) void CDxfWrite::setLayerName(std::string s) { - m_layerName = s; - m_layerList.push_back(s); + m_layerName = s; + m_layerList.push_back(s); } void CDxfWrite::writeLine(const double* s, const double* e) @@ -489,9 +553,11 @@ void CDxfWrite::writeLine(const double* s, const double* e) putLine(toVector3d(s),toVector3d(e),m_ssEntity, getEntityHandle(), m_saveModelSpaceHandle); } -void CDxfWrite::putLine(const Base::Vector3d& s, const Base::Vector3d& e, - std::ostringstream& outStream, const std::string& handle, - const std::string& ownerHandle) +void CDxfWrite::putLine(const Base::Vector3d& s, + const Base::Vector3d& e, + std::ostringstream& outStream, + const std::string& handle, + const std::string& ownerHandle) { outStream << " 0" << std::endl; outStream << "LINE" << std::endl; @@ -551,11 +617,11 @@ void CDxfWrite::writeLWPolyLine(const LWPolyDataOut &pd) m_ssEntity << pd.Flag << std::endl; m_ssEntity << " 43" << std::endl; m_ssEntity << "0" << std::endl; //Constant width opt -// m_ssEntity << pd.Width << std::endl; //Constant width opt -// m_ssEntity << " 38" << std::endl; -// m_ssEntity << pd.Elev << std::endl; // Elevation -// m_ssEntity << " 39" << std::endl; -// m_ssEntity << pd.Thick << std::endl; // Thickness + // m_ssEntity << pd.Width << std::endl; //Constant width opt + // m_ssEntity << " 38" << std::endl; + // m_ssEntity << pd.Elev << std::endl; // Elevation + // m_ssEntity << " 39" << std::endl; + // m_ssEntity << pd.Thick << std::endl; // Thickness for (auto& p: pd.Verts) { m_ssEntity << " 10" << std::endl; // Vertices m_ssEntity << p.x << std::endl; @@ -574,12 +640,12 @@ void CDxfWrite::writeLWPolyLine(const LWPolyDataOut &pd) m_ssEntity << " 42" << std::endl; m_ssEntity << b << std::endl; } -// m_ssEntity << "210" << std::endl; //Extrusion dir -// m_ssEntity << pd.Extr.x << std::endl; -// m_ssEntity << "220" << std::endl; -// m_ssEntity << pd.Extr.y << std::endl; -// m_ssEntity << "230" << std::endl; -// m_ssEntity << pd.Extr.z << std::endl; + // m_ssEntity << "210" << std::endl; //Extrusion dir + // m_ssEntity << pd.Extr.x << std::endl; + // m_ssEntity << "220" << std::endl; + // m_ssEntity << pd.Extr.y << std::endl; + // m_ssEntity << "230" << std::endl; + // m_ssEntity << pd.Extr.z << std::endl; } //*************************** @@ -671,7 +737,7 @@ void CDxfWrite::writeArc(const double* s, const double* e, const double* c, bool double start_angle = atan2(ay, ax) * 180/M_PI; double end_angle = atan2(by, bx) * 180/M_PI; double radius = sqrt(ax*ax + ay*ay); - if(!dir){ + if (!dir){ double temp = start_angle; start_angle = end_angle; end_angle = temp; @@ -688,9 +754,9 @@ void CDxfWrite::writeArc(const double* s, const double* e, const double* c, bool } m_ssEntity << " 8" << std::endl; // Group code for layer name m_ssEntity << getLayerName() << std::endl; // Layer number -// m_ssEntity << " 62" << std::endl; -// m_ssEntity << " 0" << std::endl; - if (m_version > 12) { + // m_ssEntity << " 62" << std::endl; + // m_ssEntity << " 0" << std::endl; + if (m_version > 12) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDbCircle" << std::endl; } @@ -727,7 +793,7 @@ void CDxfWrite::writeCircle(const double* c, double radius) } m_ssEntity << " 8" << std::endl; // Group code for layer name m_ssEntity << getLayerName() << std::endl; // Layer number - if (m_version > 12) { + if (m_version > 12) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDbCircle" << std::endl; } @@ -735,14 +801,18 @@ void CDxfWrite::writeCircle(const double* c, double radius) m_ssEntity << c[0] << std::endl; // X in WCS coordinates m_ssEntity << " 20" << std::endl; m_ssEntity << c[1] << std::endl; // Y in WCS coordinates -// m_ssEntity << " 30" << std::endl; -// m_ssEntity << c[2] << std::endl; // Z in WCS coordinates + // m_ssEntity << " 30" << std::endl; + // m_ssEntity << c[2] << std::endl; // Z in WCS coordinates m_ssEntity << " 40" << std::endl; // m_ssEntity << radius << std::endl; // Radius } -void CDxfWrite::writeEllipse(const double* c, double major_radius, double minor_radius, - double rotation, double start_angle, double end_angle, +void CDxfWrite::writeEllipse(const double* c, + double major_radius, + double minor_radius, + double rotation, + double start_angle, + double end_angle, bool endIsCW) { double m[3]; @@ -752,7 +822,7 @@ void CDxfWrite::writeEllipse(const double* c, double major_radius, double minor_ double ratio = minor_radius/major_radius; - if(!endIsCW){ //end is NOT CW from start + if (!endIsCW){ //end is NOT CW from start double temp = start_angle; start_angle = end_angle; end_angle = temp; @@ -769,7 +839,7 @@ void CDxfWrite::writeEllipse(const double* c, double major_radius, double minor_ } m_ssEntity << " 8" << std::endl; // Group code for layer name m_ssEntity << getLayerName() << std::endl; // Layer number - if (m_version > 12) { + if (m_version > 12) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDbEllipse" << std::endl; } @@ -787,12 +857,12 @@ void CDxfWrite::writeEllipse(const double* c, double major_radius, double minor_ m_ssEntity << m[2] << std::endl; // Major Z m_ssEntity << " 40" << std::endl; // m_ssEntity << ratio << std::endl; // Ratio -// m_ssEntity << "210" << std::endl; //extrusion dir?? -// m_ssEntity << "0" << std::endl; -// m_ssEntity << "220" << std::endl; -// m_ssEntity << "0" << std::endl; -// m_ssEntity << "230" << std::endl; -// m_ssEntity << "1" << std::endl; + // m_ssEntity << "210" << std::endl; //extrusion dir?? + // m_ssEntity << "0" << std::endl; + // m_ssEntity << "220" << std::endl; + // m_ssEntity << "0" << std::endl; + // m_ssEntity << "230" << std::endl; + // m_ssEntity << "1" << std::endl; m_ssEntity << " 41" << std::endl; m_ssEntity << start_angle << std::endl; // Start angle (radians [0..2pi]) m_ssEntity << " 42" << std::endl; @@ -838,18 +908,18 @@ void CDxfWrite::writeSpline(const SplineDataOut &sd) m_ssEntity << " 74" << std::endl; m_ssEntity << 0 << std::endl; -// m_ssEntity << " 12" << std::endl; -// m_ssEntity << sd.starttan.x << std::endl; -// m_ssEntity << " 22" << std::endl; -// m_ssEntity << sd.starttan.y << std::endl; -// m_ssEntity << " 32" << std::endl; -// m_ssEntity << sd.starttan.z << std::endl; -// m_ssEntity << " 13" << std::endl; -// m_ssEntity << sd.endtan.x << std::endl; -// m_ssEntity << " 23" << std::endl; -// m_ssEntity << sd.endtan.y << std::endl; -// m_ssEntity << " 33" << std::endl; -// m_ssEntity << sd.endtan.z << std::endl; + // m_ssEntity << " 12" << std::endl; + // m_ssEntity << sd.starttan.x << std::endl; + // m_ssEntity << " 22" << std::endl; + // m_ssEntity << sd.starttan.y << std::endl; + // m_ssEntity << " 32" << std::endl; + // m_ssEntity << sd.starttan.z << std::endl; + // m_ssEntity << " 13" << std::endl; + // m_ssEntity << sd.endtan.x << std::endl; + // m_ssEntity << " 23" << std::endl; + // m_ssEntity << sd.endtan.y << std::endl; + // m_ssEntity << " 33" << std::endl; + // m_ssEntity << sd.endtan.z << std::endl; for (auto& k: sd.knot) { m_ssEntity << " 40" << std::endl; @@ -910,21 +980,33 @@ void CDxfWrite::writeVertex(double x, double y, double z) m_ssEntity << 0 << std::endl; } -void CDxfWrite::writeText(const char* text, const double* location1, const double* location2, - const double height, const int horizJust) +void CDxfWrite::writeText(const char* text, + const double* location1, + const double* location2, + const double height, + const int horizJust) { - putText(text, toVector3d(location1), toVector3d(location2), - height, horizJust, - m_ssEntity, getEntityHandle(), m_saveModelSpaceHandle); + putText(text, + toVector3d(location1), + toVector3d(location2), + height, + horizJust, + m_ssEntity, + getEntityHandle(), + m_saveModelSpaceHandle); } //*************************** //putText //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::putText(const char* text, const Base::Vector3d& location1, const Base::Vector3d& location2, - const double height, const int horizJust, - std::ostringstream& outStream, const std::string& handle, - const std::string& ownerHandle) +void CDxfWrite::putText(const char* text, + const Base::Vector3d& location1, + const Base::Vector3d& location2, + const double height, + const int horizJust, + std::ostringstream& outStream, + const std::string& handle, + const std::string& ownerHandle) { (void) location2; @@ -944,8 +1026,8 @@ void CDxfWrite::putText(const char* text, const Base::Vector3d& location1, const outStream << "100" << std::endl; outStream << "AcDbText" << std::endl; } -// outStream << " 39" << std::endl; -// outStream << 0 << std::endl; //thickness + // outStream << " 39" << std::endl; + // outStream << 0 << std::endl; //thickness outStream << " 10" << std::endl; //first alignment point outStream << location1.x << std::endl; outStream << " 20" << std::endl; @@ -956,33 +1038,33 @@ void CDxfWrite::putText(const char* text, const Base::Vector3d& location1, const outStream << height << std::endl; outStream << " 1" << std::endl; outStream << text << std::endl; -// outStream << " 50" << std::endl; -// outStream << 0 << std::endl; //rotation -// outStream << " 41" << std::endl; -// outStream << 1 << std::endl; -// outStream << " 51" << std::endl; -// outStream << 0 << std::endl; + // outStream << " 50" << std::endl; + // outStream << 0 << std::endl; //rotation + // outStream << " 41" << std::endl; + // outStream << 1 << std::endl; + // outStream << " 51" << std::endl; + // outStream << 0 << std::endl; outStream << " 7" << std::endl; outStream << "STANDARD" << std::endl; //style -// outStream << " 71" << std::endl; //default -// outStream << "0" << std::endl; + // outStream << " 71" << std::endl; //default + // outStream << "0" << std::endl; outStream << " 72" << std::endl; outStream << horizJust << std::endl; -//// outStream << " 73" << std::endl; -//// outStream << "0" << std::endl; + //// outStream << " 73" << std::endl; + //// outStream << "0" << std::endl; outStream << " 11" << std::endl; //second alignment point outStream << location2.x << std::endl; outStream << " 21" << std::endl; outStream << location2.y << std::endl; outStream << " 31" << std::endl; outStream << location2.z << std::endl; -// outStream << "210" << std::endl; -// outStream << "0" << std::endl; -// outStream << "220" << std::endl; -// outStream << "0" << std::endl; -// outStream << "230" << std::endl; -// outStream << "1" << std::endl; + // outStream << "210" << std::endl; + // outStream << "0" << std::endl; + // outStream << "220" << std::endl; + // outStream << "0" << std::endl; + // outStream << "230" << std::endl; + // outStream << "1" << std::endl; if (m_version > 12) { outStream << "100" << std::endl; outStream << "AcDbText" << std::endl; @@ -990,8 +1072,11 @@ void CDxfWrite::putText(const char* text, const Base::Vector3d& location1, const } -void CDxfWrite::putArrow(const Base::Vector3d& arrowPos, const Base::Vector3d& barb1Pos, const Base::Vector3d& barb2Pos, - std::ostringstream& outStream, const std::string& handle, +void CDxfWrite::putArrow(const Base::Vector3d& arrowPos, + const Base::Vector3d& barb1Pos, + const Base::Vector3d& barb2Pos, + std::ostringstream& outStream, + const std::string& handle, const std::string& ownerHandle) { outStream << " 0" << std::endl; @@ -1044,9 +1129,12 @@ void CDxfWrite::putArrow(const Base::Vector3d& arrowPos, const Base::Vector3d& b #define ALIGNED 0 #define HORIZONTAL 1 #define VERTICAL 2 -void CDxfWrite::writeLinearDim(const double* textMidPoint, const double* lineDefPoint, - const double* extLine1, const double* extLine2, - const char* dimText, int type) +void CDxfWrite::writeLinearDim(const double* textMidPoint, + const double* lineDefPoint, + const double* extLine1, + const double* extLine2, + const char* dimText, + int type) { m_ssEntity << " 0" << std::endl; m_ssEntity << "DIMENSION" << std::endl; @@ -1083,17 +1171,17 @@ void CDxfWrite::writeLinearDim(const double* textMidPoint, const double* lineDef m_ssEntity << 1 << std::endl; // dimType1 = Aligned } if ( (type == HORIZONTAL) || - (type == VERTICAL) ) { + (type == VERTICAL) ) { m_ssEntity << " 70" << std::endl; m_ssEntity << 32 << std::endl; // dimType0 = Aligned + 32 (bit for unique block)? } -// m_ssEntity << " 71" << std::endl; // not R12 -// m_ssEntity << 1 << std::endl; // attachPoint ??1 = topleft + // m_ssEntity << " 71" << std::endl; // not R12 + // m_ssEntity << 1 << std::endl; // attachPoint ??1 = topleft m_ssEntity << " 1" << std::endl; m_ssEntity << dimText << std::endl; m_ssEntity << " 3" << std::endl; m_ssEntity << "STANDARD" << std::endl; //style -//linear dims + //linear dims if (m_version > 12) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDbAlignedDimension" << std::endl; @@ -1115,27 +1203,27 @@ void CDxfWrite::writeLinearDim(const double* textMidPoint, const double* lineDef m_ssEntity << " 50" << std::endl; m_ssEntity << "90" << std::endl; } - if ( (type == HORIZONTAL) || - (type == VERTICAL) ) { + if ( (type == HORIZONTAL) || (type == VERTICAL) ) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDbRotatedDimension" << std::endl; } } writeDimBlockPreamble(); - writeLinearDimBlock(textMidPoint,lineDefPoint, - extLine1, extLine2, - dimText, type); + writeLinearDimBlock(textMidPoint, lineDefPoint, extLine1, extLine2, dimText, type); writeBlockTrailer(); } //*************************** //writeAngularDim //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeAngularDim(const double* textMidPoint, const double* lineDefPoint, - const double* startExt1, const double* endExt1, - const double* startExt2, const double* endExt2, - const char* dimText) +void CDxfWrite::writeAngularDim(const double* textMidPoint, + const double* lineDefPoint, + const double* startExt1, + const double* endExt1, + const double* startExt2, + const double* endExt2, + const char* dimText) { m_ssEntity << " 0" << std::endl; m_ssEntity << "DIMENSION" << std::endl; @@ -1172,14 +1260,14 @@ void CDxfWrite::writeAngularDim(const double* textMidPoint, const double* lineDe m_ssEntity << " 70" << std::endl; m_ssEntity << 2 << std::endl; // dimType 2 = Angular 5 = Angular 3 point - // +32 for block?? (not R12) -// m_ssEntity << " 71" << std::endl; // not R12? not required? -// m_ssEntity << 5 << std::endl; // attachPoint 5 = middle + // +32 for block?? (not R12) + // m_ssEntity << " 71" << std::endl; // not R12? not required? + // m_ssEntity << 5 << std::endl; // attachPoint 5 = middle m_ssEntity << " 1" << std::endl; m_ssEntity << dimText << std::endl; m_ssEntity << " 3" << std::endl; m_ssEntity << "STANDARD" << std::endl; //style -//angular dims + //angular dims if (m_version > 12) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDb2LineAngularDimension" << std::endl; @@ -1212,9 +1300,12 @@ void CDxfWrite::writeAngularDim(const double* textMidPoint, const double* lineDe m_ssEntity << " 36" << std::endl; m_ssEntity << lineDefPoint[2] << std::endl; writeDimBlockPreamble(); - writeAngularDimBlock(textMidPoint, lineDefPoint, - startExt1, endExt1, - startExt2, endExt2, + writeAngularDimBlock(textMidPoint, + lineDefPoint, + startExt1, + endExt1, + startExt2, + endExt2, dimText); writeBlockTrailer(); } @@ -1222,9 +1313,10 @@ void CDxfWrite::writeAngularDim(const double* textMidPoint, const double* lineDe //*************************** //writeRadialDim //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeRadialDim(const double* centerPoint, const double* textMidPoint, - const double* arcPoint, - const char* dimText) +void CDxfWrite::writeRadialDim(const double* centerPoint, + const double* textMidPoint, + const double* arcPoint, + const char* dimText) { m_ssEntity << " 0" << std::endl; m_ssEntity << "DIMENSION" << std::endl; @@ -1258,13 +1350,13 @@ void CDxfWrite::writeRadialDim(const double* centerPoint, const double* textMidP m_ssEntity << textMidPoint[2] << std::endl; m_ssEntity << " 70" << std::endl; m_ssEntity << 4 << std::endl; // dimType 4 = Radius -// m_ssEntity << " 71" << std::endl; // not R12 -// m_ssEntity << 1 << std::endl; // attachPoint 5 = middle center + // m_ssEntity << " 71" << std::endl; // not R12 + // m_ssEntity << 1 << std::endl; // attachPoint 5 = middle center m_ssEntity << " 1" << std::endl; m_ssEntity << dimText << std::endl; m_ssEntity << " 3" << std::endl; m_ssEntity << "STANDARD" << std::endl; //style -//radial dims + //radial dims if (m_version > 12) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDbRadialDimension" << std::endl; @@ -1286,9 +1378,10 @@ void CDxfWrite::writeRadialDim(const double* centerPoint, const double* textMidP //*************************** //writeDiametricDim //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeDiametricDim(const double* textMidPoint, - const double* arcPoint1, const double* arcPoint2, - const char* dimText) +void CDxfWrite::writeDiametricDim(const double* textMidPoint, + const double* arcPoint1, + const double* arcPoint2, + const char* dimText) { m_ssEntity << " 0" << std::endl; m_ssEntity << "DIMENSION" << std::endl; @@ -1322,13 +1415,13 @@ void CDxfWrite::writeDiametricDim(const double* textMidPoint, m_ssEntity << textMidPoint[2] << std::endl; m_ssEntity << " 70" << std::endl; m_ssEntity << 3 << std::endl; // dimType 3 = Diameter -// m_ssEntity << " 71" << std::endl; // not R12 -// m_ssEntity << 5 << std::endl; // attachPoint 5 = middle center + // m_ssEntity << " 71" << std::endl; // not R12 + // m_ssEntity << 5 << std::endl; // attachPoint 5 = middle center m_ssEntity << " 1" << std::endl; m_ssEntity << dimText << std::endl; m_ssEntity << " 3" << std::endl; m_ssEntity << "STANDARD" << std::endl; //style -//diametric dims + //diametric dims if (m_version > 12) { m_ssEntity << "100" << std::endl; m_ssEntity << "AcDbDiametricDimension" << std::endl; @@ -1350,7 +1443,7 @@ void CDxfWrite::writeDiametricDim(const double* textMidPoint, //*************************** //writeDimBlockPreamble //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeDimBlockPreamble(void) +void CDxfWrite::writeDimBlockPreamble() { if (m_version > 12) { std::string blockName("*"); @@ -1395,7 +1488,7 @@ void CDxfWrite::writeDimBlockPreamble(void) //*************************** //writeBlockTrailer //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeBlockTrailer(void) +void CDxfWrite::writeBlockTrailer() { m_ssBlock << " 0" << std::endl; m_ssBlock << "ENDBLK" << std::endl; @@ -1407,8 +1500,8 @@ void CDxfWrite::writeBlockTrailer(void) m_ssBlock << "100" << std::endl; m_ssBlock << "AcDbEntity" << std::endl; } -// m_ssBlock << " 67" << std::endl; -// m_ssBlock << "1" << std::endl; + // m_ssBlock << " 67" << std::endl; + // m_ssBlock << "1" << std::endl; m_ssBlock << " 8" << std::endl; m_ssBlock << getLayerName() << std::endl; if (m_version > 12) { @@ -1420,9 +1513,12 @@ void CDxfWrite::writeBlockTrailer(void) //*************************** //writeLinearDimBlock //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, const double* dimLine, - const double* e1Start, const double* e2Start, - const char* dimText, int type) +void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, + const double* dimLine, + const double* e1Start, + const double* e2Start, + const char* dimText, + int type) { Base::Vector3d e1S(e1Start[0],e1Start[1],e1Start[2]); Base::Vector3d e2S(e2Start[0],e2Start[1],e2Start[2]); @@ -1436,7 +1532,8 @@ void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, const double* di angle = angle * 180.0 / M_PI; if (type == ALIGNED) { //NOP - } else if (type == HORIZONTAL) { + } + else if (type == HORIZONTAL) { double x = e1Start[0]; double y = dimLine[1]; e1E = Base::Vector3d(x, y, 0.0); @@ -1451,7 +1548,8 @@ void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, const double* di para = Base::Vector3d(-1, 0, 0); //left } angle = 0; - } else if (type == VERTICAL) { + } + else if (type == VERTICAL) { double x = dimLine[0]; double y = e1Start[1]; e1E = Base::Vector3d(x, y, 0.0); @@ -1471,44 +1569,45 @@ void CDxfWrite::writeLinearDimBlock(const double* textMidPoint, const double* di double arrowLen = 5.0; //magic number double arrowWidth = arrowLen/6.0/2.0; //magic number calc! - putLine(e2S, e2E, - m_ssBlock, getBlockHandle(), - m_saveBlkRecordHandle); + putLine(e2S, e2E, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); - putLine(e1S, e1E, - m_ssBlock, getBlockHandle(), - m_saveBlkRecordHandle); + putLine(e1S, e1E, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); - putLine(e1E, e2E, - m_ssBlock, getBlockHandle(), - m_saveBlkRecordHandle); + putLine(e1E, e2E, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); - putText(dimText,toVector3d(textMidPoint), toVector3d(dimLine),3.5,1, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putText(dimText, + toVector3d(textMidPoint), + toVector3d(dimLine), + 3.5, + 1, + m_ssBlock, + getBlockHandle(), + m_saveBlkRecordHandle); perp.Normalize(); para.Normalize(); Base::Vector3d arrowStart = e1E; Base::Vector3d barb1 = arrowStart + perp*arrowWidth - para*arrowLen; Base::Vector3d barb2 = arrowStart - perp*arrowWidth - para*arrowLen; - putArrow(arrowStart, barb1, barb2, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putArrow(arrowStart, barb1, barb2, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); arrowStart = e2E; barb1 = arrowStart + perp*arrowWidth + para*arrowLen; barb2 = arrowStart - perp*arrowWidth + para*arrowLen; - putArrow(arrowStart, barb1, barb2, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putArrow(arrowStart, barb1, barb2, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); } //*************************** //writeAngularDimBlock //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, const double* lineDefPoint, - const double* startExt1, const double* endExt1, - const double* startExt2, const double* endExt2, - const char* dimText) +void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, + const double* lineDefPoint, + const double* startExt1, + const double* endExt1, + const double* startExt2, + const double* endExt2, + const char* dimText) { Base::Vector3d e1S(startExt1[0],startExt1[1],startExt1[2]); //apex Base::Vector3d e2S(startExt2[0],startExt2[1],startExt2[2]); @@ -1522,10 +1621,10 @@ void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, const double* l double span = fabs(endAngle - startAngle); double offset = span * 0.10; if (startAngle < 0) { - startAngle += 2.0 * M_PI; + startAngle += 2.0 * M_PI; } if (endAngle < 0) { - endAngle += 2.0 * M_PI; + endAngle += 2.0 * M_PI; } Base::Vector3d startOff(cos(startAngle + offset),sin(startAngle + offset),0.0); Base::Vector3d endOff(cos(endAngle - offset),sin(endAngle - offset),0.0); @@ -1547,8 +1646,8 @@ void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, const double* l } m_ssBlock << " 8" << std::endl; m_ssBlock << "0" << std::endl; -// m_ssBlock << " 62" << std::endl; -// m_ssBlock << " 0" << std::endl; + // m_ssBlock << " 62" << std::endl; + // m_ssBlock << " 0" << std::endl; if (m_version > 12) { m_ssBlock << "100" << std::endl; m_ssBlock << "AcDbCircle" << std::endl; @@ -1570,8 +1669,14 @@ void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, const double* l m_ssBlock << " 51" << std::endl; m_ssBlock << endAngle << std::endl; //end angle - putText(dimText,toVector3d(textMidPoint), toVector3d(textMidPoint),3.5,1, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putText(dimText, + toVector3d(textMidPoint), + toVector3d(textMidPoint), + 3.5, + 1, + m_ssBlock, + getBlockHandle(), + m_saveBlkRecordHandle); e1.Normalize(); e2.Normalize(); @@ -1591,28 +1696,36 @@ void CDxfWrite::writeAngularDimBlock(const double* textMidPoint, const double* l Base::Vector3d barb1 = arrow1Start + perp1*arrowWidth - tanP1*arrowLen; Base::Vector3d barb2 = arrow1Start - perp1*arrowWidth - tanP1*arrowLen; - putArrow(arrow1Start, barb1, barb2, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putArrow(arrow1Start, barb1, barb2, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); barb1 = arrow2Start + perp2*arrowWidth - tanP2*arrowLen; barb2 = arrow2Start - perp2*arrowWidth - tanP2*arrowLen; - putArrow(arrow2Start, barb1, barb2, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putArrow(arrow2Start, barb1, barb2, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); } //*************************** //writeRadialDimBlock //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeRadialDimBlock(const double* centerPoint, const double* textMidPoint, - const double* arcPoint, const char* dimText) +void CDxfWrite::writeRadialDimBlock(const double* centerPoint, + const double* textMidPoint, + const double* arcPoint, + const char* dimText) { - putLine(toVector3d(centerPoint), toVector3d(arcPoint), - m_ssBlock, getBlockHandle(), + putLine(toVector3d(centerPoint), + toVector3d(arcPoint), + m_ssBlock, + getBlockHandle(), m_saveBlkRecordHandle); - putText(dimText,toVector3d(textMidPoint), toVector3d(textMidPoint),3.5,1, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putText(dimText, + toVector3d(textMidPoint), + toVector3d(textMidPoint), + 3.5, + 1, + m_ssBlock, + getBlockHandle(), + m_saveBlkRecordHandle); Base::Vector3d c(centerPoint[0],centerPoint[1],centerPoint[2]); Base::Vector3d a(arcPoint[0],arcPoint[1],arcPoint[2]); @@ -1625,23 +1738,31 @@ void CDxfWrite::writeRadialDimBlock(const double* centerPoint, const double* tex Base::Vector3d barb1 = arrowStart + perp*arrowWidth - para*arrowLen; Base::Vector3d barb2 = arrowStart - perp*arrowWidth - para*arrowLen; - putArrow(arrowStart, barb1, barb2, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putArrow(arrowStart, barb1, barb2, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); } //*************************** //writeDiametricDimBlock //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeDiametricDimBlock(const double* textMidPoint, - const double* arcPoint1, const double* arcPoint2, - const char* dimText) +void CDxfWrite::writeDiametricDimBlock(const double* textMidPoint, + const double* arcPoint1, + const double* arcPoint2, + const char* dimText) { - putLine(toVector3d(arcPoint1), toVector3d(arcPoint2), - m_ssBlock, getBlockHandle(), + putLine(toVector3d(arcPoint1), + toVector3d(arcPoint2), + m_ssBlock, + getBlockHandle(), m_saveBlkRecordHandle); - putText(dimText,toVector3d(textMidPoint), toVector3d(textMidPoint),3.5,1, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putText(dimText, + toVector3d(textMidPoint), + toVector3d(textMidPoint), + 3.5, + 1, + m_ssBlock, + getBlockHandle(), + m_saveBlkRecordHandle); Base::Vector3d a1(arcPoint1[0],arcPoint1[1],arcPoint1[2]); Base::Vector3d a2(arcPoint2[0],arcPoint2[1],arcPoint2[2]); @@ -1654,21 +1775,18 @@ void CDxfWrite::writeDiametricDimBlock(const double* textMidPoint, Base::Vector3d barb1 = arrowStart + perp*arrowWidth + para*arrowLen; Base::Vector3d barb2 = arrowStart - perp*arrowWidth + para*arrowLen; - putArrow(arrowStart, barb1, barb2, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); + putArrow(arrowStart, barb1, barb2, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); arrowStart = a2; barb1 = arrowStart + perp*arrowWidth - para*arrowLen; barb2 = arrowStart - perp*arrowWidth - para*arrowLen; - putArrow(arrowStart, barb1, barb2, - m_ssBlock,getBlockHandle(),m_saveBlkRecordHandle); - + putArrow(arrowStart, barb1, barb2, m_ssBlock, getBlockHandle(), m_saveBlkRecordHandle); } //*************************** //writeBlocksSection //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeBlocksSection(void) +void CDxfWrite::writeBlocksSection() { if (m_version < 14) { std::stringstream ss; @@ -1687,7 +1805,7 @@ void CDxfWrite::writeBlocksSection(void) //*************************** //writeEntitiesSection //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeEntitiesSection(void) +void CDxfWrite::writeEntitiesSection() { std::stringstream ss; ss << "entities" << m_version << ".rub"; @@ -1705,7 +1823,7 @@ void CDxfWrite::writeEntitiesSection(void) //*************************** //writeObjectsSection //added by Wandererfan 2018 (wandererfan@gmail.com) for FreeCAD project -void CDxfWrite::writeObjectsSection(void) +void CDxfWrite::writeObjectsSection() { if (m_version < 14) { return; @@ -1723,7 +1841,7 @@ CDxfRead::CDxfRead(const char* filepath) memset( m_str, '\0', sizeof(m_str) ); memset( m_unused_line, '\0', sizeof(m_unused_line) ); m_fail = false; - m_aci = 0; + m_ColorIndex = 0; m_eUnits = eMillimeters; m_measurement_inch = false; safe_strcpy(m_layer_name, "0"); // Default layer name @@ -1731,6 +1849,10 @@ CDxfRead::CDxfRead(const char* filepath) memset( m_block_name, '\0', sizeof(m_block_name) ); m_ignore_errors = true; + m_version = RUnknown; + //m_CodePage = nullptr; + //m_encoding = nullptr; + if (!m_ifs) m_fail = true; else @@ -1739,39 +1861,66 @@ CDxfRead::CDxfRead(const char* filepath) CDxfRead::~CDxfRead() { + //delete m_CodePage; + //delete m_encoding; } double CDxfRead::mm( double value ) const { - if(m_measurement_inch) - { + // re #6461 + // this if handles situation of malformed DXF file where + // MEASUREMENT specifies English units, but + // INSUNITS specifies millimeters or is not specified + //(millimeters is our default) + if (m_measurement_inch && (m_eUnits == eMillimeters)) { value *= 25.4; } - switch(m_eUnits) - { - case eUnspecified: return(value); // We don't know any better. - case eInches: return(value * 25.4); - case eFeet: return(value * 25.4 * 12); - case eMiles: return(value * 1609344.0); - case eMillimeters: return(value); - case eCentimeters: return(value * 10.0); - case eMeters: return(value * 1000.0); - case eKilometers: return(value * 1000000.0); - case eMicroinches: return(value * 25.4 / 1000.0); - case eMils: return(value * 25.4 / 1000.0); - case eYards: return(value * 3 * 12 * 25.4); - case eAngstroms: return(value * 0.0000001); - case eNanometers: return(value * 0.000001); - case eMicrons: return(value * 0.001); - case eDecimeters: return(value * 100.0); - case eDekameters: return(value * 10000.0); - case eHectometers: return(value * 100000.0); - case eGigameters: return(value * 1000000000000.0); - case eAstronomicalUnits: return(value * 149597870690000.0); - case eLightYears: return(value * 9454254955500000000.0); - case eParsecs: return(value * 30856774879000000000.0); - default: return(value); // We don't know any better. + switch (m_eUnits) { + case eUnspecified: + return (value * 1.0); // We don't know any better. + case eInches: + return (value * 25.4); + case eFeet: + return (value * 25.4 * 12); + case eMiles: + return (value * 1609344.0); + case eMillimeters: + return (value * 1.0); + case eCentimeters: + return (value * 10.0); + case eMeters: + return (value * 1000.0); + case eKilometers: + return (value * 1000000.0); + case eMicroinches: + return (value * 25.4 / 1000.0); + case eMils: + return (value * 25.4 / 1000.0); + case eYards: + return (value * 3 * 12 * 25.4); + case eAngstroms: + return (value * 0.0000001); + case eNanometers: + return (value * 0.000001); + case eMicrons: + return (value * 0.001); + case eDecimeters: + return (value * 100.0); + case eDekameters: + return (value * 10000.0); + case eHectometers: + return (value * 100000.0); + case eGigameters: + return (value * 1000000000000.0); + case eAstronomicalUnits: + return (value * 149597870690000.0); + case eLightYears: + return (value * 9454254955500000000.0); + case eParsecs: + return (value * 30856774879000000000.0); + default: + return (value * 1.0); // We don't know any better. } // End switch } // End mm() method @@ -1782,95 +1931,130 @@ bool CDxfRead::ReadLine() double e[3] = {0, 0, 0}; bool hidden = false; - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadLine()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found, so finish with line - DerefACI(); - OnReadLine(s, e, hidden); - hidden = false; - return true; - - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found, so finish with line + ResolveColorIndex(); + OnReadLine(s, e, hidden); + hidden = false; + return true; - case 6: // line style name follows - get_line(); - if(m_str[0] == 'h' || m_str[0] == 'H')hidden = true; - break; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; - case 10: - // start x - get_line(); - ss.str(m_str); ss >> s[0]; s[0] = mm(s[0]); if(ss.fail()) return false; - break; - case 20: - // start y - get_line(); - ss.str(m_str); ss >> s[1]; s[1] = mm(s[1]); if(ss.fail()) return false; - break; - case 30: - // start z - get_line(); - ss.str(m_str); ss >> s[2]; s[2] = mm(s[2]); if(ss.fail()) return false; - break; - case 11: - // end x - get_line(); - ss.str(m_str); ss >> e[0]; e[0] = mm(e[0]); if(ss.fail()) return false; - break; - case 21: - // end y - get_line(); - ss.str(m_str); ss >> e[1]; e[1] = mm(e[1]); if(ss.fail()) return false; - break; - case 31: - // end z - get_line(); - ss.str(m_str); ss >> e[2]; e[2] = mm(e[2]); if(ss.fail()) return false; - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - - case 100: - case 39: - case 210: - case 220: - case 230: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; + case 6: // line style name follows + get_line(); + if (m_str[0] == 'h' || m_str[0] == 'H') { + hidden = true; + } + break; + + case 10: + // start x + get_line(); + ss.str(m_str); + ss >> s[0]; + s[0] = mm(s[0]); + if (ss.fail()) { + return false; + } + break; + case 20: + // start y + get_line(); + ss.str(m_str); + ss >> s[1]; + s[1] = mm(s[1]); + if (ss.fail()) { + return false; + } + break; + case 30: + // start z + get_line(); + ss.str(m_str); + ss >> s[2]; + s[2] = mm(s[2]); + if (ss.fail()) { + return false; + } + break; + case 11: + // end x + get_line(); + ss.str(m_str); + ss >> e[0]; + e[0] = mm(e[0]); + if (ss.fail()) { + return false; + } + break; + case 21: + // end y + get_line(); + ss.str(m_str); + ss >> e[1]; + e[1] = mm(e[1]); + if (ss.fail()) { + return false; + } + break; + case 31: + // end z + get_line(); + ss.str(m_str); + ss >> e[2]; + e[2] = mm(e[2]); + if (ss.fail()) { + return false; + } + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + + case 100: + case 39: + case 210: + case 220: + case 230: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; } } try { - DerefACI(); + ResolveColorIndex(); OnReadLine(s, e, false); } - catch(...) - { - if (! IgnoreErrors()) throw; // Re-throw the exception. + catch (...) { + if (!IgnoreErrors()) { + throw; // Re-throw the exception. + } } return false; @@ -1880,76 +2064,93 @@ bool CDxfRead::ReadPoint() { double s[3] = {0, 0, 0}; - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadPoint()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found, so finish with line - DerefACI(); - OnReadPoint(s); - return true; - - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found, so finish with line + ResolveColorIndex(); + OnReadPoint(s); + return true; - case 10: - // start x - get_line(); - ss.str(m_str); ss >> s[0]; s[0] = mm(s[0]); if(ss.fail()) return false; - break; - case 20: - // start y - get_line(); - ss.str(m_str); ss >> s[1]; s[1] = mm(s[1]); if(ss.fail()) return false; - break; - case 30: - // start z - get_line(); - ss.str(m_str); ss >> s[2]; s[2] = mm(s[2]); if(ss.fail()) return false; - break; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - - case 100: - case 39: - case 210: - case 220: - case 230: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; - } + case 10: + // start x + get_line(); + ss.str(m_str); + ss >> s[0]; + s[0] = mm(s[0]); + if (ss.fail()) { + return false; + } + break; + case 20: + // start y + get_line(); + ss.str(m_str); + ss >> s[1]; + s[1] = mm(s[1]); + if (ss.fail()) { + return false; + } + break; + case 30: + // start z + get_line(); + ss.str(m_str); + ss >> s[2]; + s[2] = mm(s[2]); + if (ss.fail()) { + return false; + } + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + + case 100: + case 39: + case 210: + case 220: + case 230: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; + } } try { - DerefACI(); + ResolveColorIndex(); OnReadPoint(s); } - catch(...) - { - if (! IgnoreErrors()) throw; // Re-throw the exception. + catch (...) { + if (!IgnoreErrors()) { + throw; // Re-throw the exception. + } } return false; @@ -1964,94 +2165,129 @@ bool CDxfRead::ReadArc() double z_extrusion_dir = 1.0; bool hidden = false; - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadArc()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found, so finish with arc - DerefACI(); - OnReadArc(start_angle, end_angle, radius, c,z_extrusion_dir, hidden); - hidden = false; - return true; - - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found, so finish with arc + ResolveColorIndex(); + OnReadArc(start_angle, end_angle, radius, c,z_extrusion_dir, hidden); + hidden = false; + return true; - case 6: // line style name follows - get_line(); - if(m_str[0] == 'h' || m_str[0] == 'H')hidden = true; - break; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; - case 10: - // centre x - get_line(); - ss.str(m_str); ss >> c[0]; c[0] = mm(c[0]); if(ss.fail()) return false; - break; - case 20: - // centre y - get_line(); - ss.str(m_str); ss >> c[1]; c[1] = mm(c[1]); if(ss.fail()) return false; - break; - case 30: - // centre z - get_line(); - ss.str(m_str); ss >> c[2]; c[2] = mm(c[2]); if(ss.fail()) return false; - break; - case 40: - // radius - get_line(); - ss.str(m_str); ss >> radius; radius = mm(radius); if(ss.fail()) return false; - break; - case 50: - // start angle - get_line(); - ss.str(m_str); ss >> start_angle; if(ss.fail()) return false; - break; - case 51: - // end angle - get_line(); - ss.str(m_str); ss >> end_angle; if(ss.fail()) return false; - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; + case 6: // line style name follows + get_line(); + if (m_str[0] == 'h' || m_str[0] == 'H') { + hidden = true; + } + break; + case 10: + // centre x + get_line(); + ss.str(m_str); + ss >> c[0]; + c[0] = mm(c[0]); + if (ss.fail()) { + return false; + } + break; + case 20: + // centre y + get_line(); + ss.str(m_str); + ss >> c[1]; + c[1] = mm(c[1]); + if (ss.fail()) { + return false; + } + break; + case 30: + // centre z + get_line(); + ss.str(m_str); + ss >> c[2]; + c[2] = mm(c[2]); + if (ss.fail()) { + return false; + } + break; + case 40: + // radius + get_line(); + ss.str(m_str); + ss >> radius; + radius = mm(radius); + if (ss.fail()) { + return false; + } + break; + case 50: + // start angle + get_line(); + ss.str(m_str); + ss >> start_angle; + if (ss.fail()) { + return false; + } + break; + case 51: + // end angle + get_line(); + ss.str(m_str); + ss >> end_angle; + if (ss.fail()) { + return false; + } + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; - case 100: - case 39: - case 210: - case 220: - // skip the next line - get_line(); - break; - case 230: - //Z extrusion direction for arc - get_line(); - ss.str(m_str); ss >> z_extrusion_dir; if(ss.fail()) return false; - break; + case 100: + case 39: + case 210: + case 220: + // skip the next line + get_line(); + break; + case 230: + //Z extrusion direction for arc + get_line(); + ss.str(m_str); + ss >> z_extrusion_dir; + if (ss.fail()) { + return false; + } + break; - default: - // skip the next line - get_line(); - break; + default: + // skip the next line + get_line(); + break; } } - DerefACI(); + ResolveColorIndex(); OnReadArc(start_angle, end_angle, radius, c, z_extrusion_dir, false); return false; } @@ -2070,340 +2306,475 @@ bool CDxfRead::ReadSpline() double temp_double; - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadSpline()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found, so finish with Spline - DerefACI(); - OnReadSpline(sd); - return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - case 210: - // normal x - get_line(); - ss.str(m_str); ss >> sd.norm[0]; if(ss.fail()) return false; - break; - case 220: - // normal y - get_line(); - ss.str(m_str); ss >> sd.norm[1]; if(ss.fail()) return false; - break; - case 230: - // normal z - get_line(); - ss.str(m_str); ss >> sd.norm[2]; if(ss.fail()) return false; - break; - case 70: - // flag - get_line(); - ss.str(m_str); ss >> sd.flag; if(ss.fail()) return false; - break; - case 71: - // degree - get_line(); - ss.str(m_str); ss >> sd.degree; if(ss.fail()) return false; - break; - case 72: - // knots - get_line(); - ss.str(m_str); ss >> sd.knots; if(ss.fail()) return false; - break; - case 73: - // control points - get_line(); - ss.str(m_str); ss >> sd.control_points; if(ss.fail()) return false; - break; - case 74: - // fit points - get_line(); - ss.str(m_str); ss >> sd.fit_points; if(ss.fail()) return false; - break; - case 12: - // starttan x - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.starttanx.push_back(temp_double); - break; - case 22: - // starttan y - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.starttany.push_back(temp_double); - break; - case 32: - // starttan z - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.starttanz.push_back(temp_double); - break; - case 13: - // endtan x - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.endtanx.push_back(temp_double); - break; - case 23: - // endtan y - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.endtany.push_back(temp_double); - break; - case 33: - // endtan z - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.endtanz.push_back(temp_double); - break; - case 40: - // knot - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.knot.push_back(temp_double); - break; - case 41: - // weight - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.weight.push_back(temp_double); - break; - case 10: - // control x - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.controlx.push_back(temp_double); - break; - case 20: - // control y - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.controly.push_back(temp_double); - break; - case 30: - // control z - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.controlz.push_back(temp_double); - break; - case 11: - // fit x - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.fitx.push_back(temp_double); - break; - case 21: - // fit y - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.fity.push_back(temp_double); - break; - case 31: - // fit z - get_line(); - ss.str(m_str); ss >> temp_double; temp_double = mm(temp_double); if(ss.fail()) return false; - sd.fitz.push_back(temp_double); - break; - case 42: - case 43: - case 44: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; - } - } - DerefACI(); - OnReadSpline(sd); - return false; -} - - -bool CDxfRead::ReadCircle() -{ - double radius = 0.0; - double c[3] = {0,0,0}; // centre - bool hidden = false; - - while(!m_ifs.eof()) - { - get_line(); - int n; - if(sscanf(m_str, "%d", &n) != 1) - { + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found, so finish with Spline + ResolveColorIndex(); + OnReadSpline(sd); + return true; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + case 210: + // normal x + get_line(); + ss.str(m_str); + ss >> sd.norm[0]; + if (ss.fail()) { + return false; + } + break; + case 220: + // normal y + get_line(); + ss.str(m_str); + ss >> sd.norm[1]; + if (ss.fail()) { + return false; + } + break; + case 230: + // normal z + get_line(); + ss.str(m_str); + ss >> sd.norm[2]; + if (ss.fail()) { + return false; + } + break; + case 70: + // flag + get_line(); + ss.str(m_str); + ss >> sd.flag; + if (ss.fail()) { + return false; + } + break; + case 71: + // degree + get_line(); + ss.str(m_str); + ss >> sd.degree; + if (ss.fail()) { + return false; + } + break; + case 72: + // knots + get_line(); + ss.str(m_str); + ss >> sd.knots; + if (ss.fail()) { + return false; + } + break; + case 73: + // control points + get_line(); + ss.str(m_str); + ss >> sd.control_points; + if (ss.fail()) { + return false; + } + break; + case 74: + // fit points + get_line(); + ss.str(m_str); + ss >> sd.fit_points; + if (ss.fail()) { + return false; + } + break; + case 12: + // starttan x + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.starttanx.push_back(temp_double); + break; + case 22: + // starttan y + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.starttany.push_back(temp_double); + break; + case 32: + // starttan z + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.starttanz.push_back(temp_double); + break; + case 13: + // endtan x + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.endtanx.push_back(temp_double); + break; + case 23: + // endtan y + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.endtany.push_back(temp_double); + break; + case 33: + // endtan z + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.endtanz.push_back(temp_double); + break; + case 40: + // knot + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.knot.push_back(temp_double); + break; + case 41: + // weight + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.weight.push_back(temp_double); + break; + case 10: + // control x + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.controlx.push_back(temp_double); + break; + case 20: + // control y + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.controly.push_back(temp_double); + break; + case 30: + // control z + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.controlz.push_back(temp_double); + break; + case 11: + // fit x + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.fitx.push_back(temp_double); + break; + case 21: + // fit y + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.fity.push_back(temp_double); + break; + case 31: + // fit z + get_line(); + ss.str(m_str); + ss >> temp_double; + temp_double = mm(temp_double); + if (ss.fail()) { + return false; + } + sd.fitz.push_back(temp_double); + break; + case 42: + case 43: + case 44: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; + } + } + ResolveColorIndex(); + OnReadSpline(sd); + return false; +} + + +bool CDxfRead::ReadCircle() +{ + double radius = 0.0; + double c[3] = {0,0,0}; // centre + bool hidden = false; + + while (!m_ifs.eof()) { + get_line(); + int n; + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadCircle()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found, so finish with Circle - DerefACI(); - OnReadCircle(c, radius, hidden); - hidden = false; - return true; - - case 6: // line style name follows - get_line(); - if(m_str[0] == 'h' || m_str[0] == 'H')hidden = true; - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found, so finish with Circle + ResolveColorIndex(); + OnReadCircle(c, radius, hidden); + hidden = false; + return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; + case 6: // line style name follows + get_line(); + if (m_str[0] == 'h' || m_str[0] == 'H') { + hidden = true; + } + break; - case 10: - // centre x - get_line(); - ss.str(m_str); ss >> c[0]; c[0] = mm(c[0]); if(ss.fail()) return false; - break; - case 20: - // centre y - get_line(); - ss.str(m_str); ss >> c[1]; c[1] = mm(c[1]); if(ss.fail()) return false; - break; - case 30: - // centre z - get_line(); - ss.str(m_str); ss >> c[2]; c[2] = mm(c[2]); if(ss.fail()) return false; - break; - case 40: - // radius - get_line(); - ss.str(m_str); ss >> radius; radius = mm(radius); if(ss.fail()) return false; - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - - case 100: - case 39: - case 210: - case 220: - case 230: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; + + case 10: + // centre x + get_line(); + ss.str(m_str); + ss >> c[0]; + c[0] = mm(c[0]); + if (ss.fail()) { + return false; + } + break; + case 20: + // centre y + get_line(); + ss.str(m_str); + ss >> c[1]; + c[1] = mm(c[1]); + if (ss.fail()) { + return false; + } + break; + case 30: + // centre z + get_line(); + ss.str(m_str); + ss >> c[2]; + c[2] = mm(c[2]); + if (ss.fail()) { + return false; + } + break; + case 40: + // radius + get_line(); + ss.str(m_str); + ss >> radius; + radius = mm(radius); + if (ss.fail()) { + return false; + } + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + + case 100: + case 39: + case 210: + case 220: + case 230: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; } } - DerefACI(); + ResolveColorIndex(); OnReadCircle(c, radius, false); return false; } - -bool CDxfRead::ReadText() +void CDxfRead::ReadText() { - double c[3]; // coordinate - double height = 0.03082; - double rotation = 0.; // degrees - char text[1024] = {}; + ScopedCLocale _(LC_NUMERIC); - memset( c, 0, sizeof(c) ); - - while(!m_ifs.eof()) - { + DxfText text; + while (!m_ifs.eof()) { get_line(); - int n; - if(sscanf(m_str, "%d", &n) != 1) - { - this->ReportError_readInteger("DXF::ReadText()"); - return false; - } - std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - DerefACI(); - OnReadText(c, height * 25.4 / 72.0, rotation, text); - return(true); - - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; + const int n = stringToInt(m_str); + switch (n) { + case 0: + ResolveColorIndex(); + { + size_t pos = text.str.find("\\P", 0); + while (pos != std::string::npos) { + text.str.replace(pos, 2, "\n"); + pos = text.str.find("\\P", pos + 1); + } - case 10: - // centre x - get_line(); - ss.str(m_str); ss >> c[0]; c[0] = mm(c[0]); if(ss.fail()) return false; - break; - case 20: - // centre y - get_line(); - ss.str(m_str); ss >> c[1]; c[1] = mm(c[1]); if(ss.fail()) return false; - break; - case 30: - // centre z - get_line(); - ss.str(m_str); ss >> c[2]; c[2] = mm(c[2]); if(ss.fail()) return false; - break; - case 40: - // text height - get_line(); - ss.str(m_str); ss >> height; height = mm(height); if(ss.fail()) return false; - break; - case 1: - // text - get_line(); - safe_strcpy(text, m_str); - break; + text.str = this->toUtf8(text.str); + OnReadText(text); + } + return; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; - case 50: - // text rotation - get_line(); - ss.str(m_str); ss >> rotation; if(ss.fail()) return false; - break; + case 10: + // centre x + get_line(); + text.point[0] = mm(stringToDouble(m_str)); + break; + case 20: + // centre y + get_line(); + text.point[1] = mm(stringToDouble(m_str)); + break; + case 30: + // centre z + get_line(); + text.point[2] = mm(stringToDouble(m_str)); + break; + case 40: + // text height + get_line(); + text.height = mm(stringToDouble(m_str)) * 25.4 / 72.0; + break; + case 50: + // text rotation + get_line(); + text.rotation = stringToDouble(m_str); + break; + case 3: + // Additional text that goes before the type 1 text + // Note that if breaking the text into type-3 records splits a UFT-8 encoding we do + // the decoding after splicing the lines together. I'm not sure if this actually + // occurs, but handling the text this way will treat this condition properly. + get_line(); + text.str.append(m_str); + break; + case 1: + // final text + get_line(); + text.str.append(m_str); + break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - - case 100: - case 39: - case 210: - case 220: - case 230: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; + case 62: + // color index + get_line(); + m_ColorIndex = stringToInt(m_str); + break; + + case 71: { + // attachment point + get_line(); + const int ap = stringToInt(m_str); + if (ap >= 1 && ap <= 9) { + text.attachPoint = static_cast(ap); + } } - } + break; - return false; + case 100: + case 39: + case 210: + case 220: + case 230: + default: + // skip the next line + get_line(); + break; + } + } } @@ -2415,92 +2786,136 @@ bool CDxfRead::ReadEllipse() double start=0; //start of arc double end=0; // end of arc - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadEllipse()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found, so finish with Ellipse - DerefACI(); - OnReadEllipse(c, m, ratio, start, end); - return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found, so finish with Ellipse + ResolveColorIndex(); + OnReadEllipse(c, m, ratio, start, end); + return true; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; - case 10: - // centre x - get_line(); - ss.str(m_str); ss >> c[0]; c[0] = mm(c[0]); if(ss.fail()) return false; - break; - case 20: - // centre y - get_line(); - ss.str(m_str); ss >> c[1]; c[1] = mm(c[1]); if(ss.fail()) return false; - break; - case 30: - // centre z - get_line(); - ss.str(m_str); ss >> c[2]; c[2] = mm(c[2]); if(ss.fail()) return false; - break; - case 11: - // major x - get_line(); - ss.str(m_str); ss >> m[0]; m[0] = mm(m[0]); if(ss.fail()) return false; - break; - case 21: - // major y - get_line(); - ss.str(m_str); ss >> m[1]; m[1] = mm(m[1]); if(ss.fail()) return false; - break; - case 31: - // major z - get_line(); - ss.str(m_str); ss >> m[2]; m[2] = mm(m[2]); if(ss.fail()) return false; - break; - case 40: - // ratio - get_line(); - ss.str(m_str); ss >> ratio; if(ss.fail()) return false; - break; - case 41: - // start - get_line(); - ss.str(m_str); ss >> start; if(ss.fail()) return false; - break; - case 42: - // end - get_line(); - ss.str(m_str); ss >> end; if(ss.fail()) return false; - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - case 100: - case 210: - case 220: - case 230: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; + case 10: + // centre x + get_line(); + ss.str(m_str); + ss >> c[0]; + c[0] = mm(c[0]); + if (ss.fail()) { + return false; + } + break; + case 20: + // centre y + get_line(); + ss.str(m_str); + ss >> c[1]; + c[1] = mm(c[1]); + if (ss.fail()) { + return false; + } + break; + case 30: + // centre z + get_line(); + ss.str(m_str); + ss >> c[2]; + c[2] = mm(c[2]); + if (ss.fail()) { + return false; + } + break; + case 11: + // major x + get_line(); + ss.str(m_str); + ss >> m[0]; + m[0] = mm(m[0]); + if (ss.fail()) { + return false; + } + break; + case 21: + // major y + get_line(); + ss.str(m_str); + ss >> m[1]; + m[1] = mm(m[1]); + if (ss.fail()) { + return false; + } + break; + case 31: + // major z + get_line(); + ss.str(m_str); + ss >> m[2]; + m[2] = mm(m[2]); + if (ss.fail()) { + return false; + } + break; + case 40: + // ratio + get_line(); + ss.str(m_str); + ss >> ratio; + if (ss.fail()) { + return false; + } + break; + case 41: + // start + get_line(); + ss.str(m_str); + ss >> start; + if (ss.fail()) { + return false; + } + break; + case 42: + // end + get_line(); + ss.str(m_str); + ss >> end; + if (ss.fail()) { + return false; + } + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + case 100: + case 210: + case 220: + case 230: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; } } - DerefACI(); + ResolveColorIndex(); OnReadEllipse(c, m, ratio, start, end); return false; } @@ -2517,15 +2932,14 @@ static double poly_first_x; static double poly_first_y; static double poly_first_z; -static void AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, bool bulge_found, double bulge) +static void +AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, bool bulge_found, double bulge) { try { - if(poly_prev_found) - { + if (poly_prev_found) { bool arc_done = false; - if(poly_prev_bulge_found) - { + if (poly_prev_bulge_found) { double cot = 0.5 * ((1.0 / poly_prev_bulge) - poly_prev_bulge); double cx = ((poly_prev_x + x) - ((y - poly_prev_y) * cot)) / 2.0; double cy = ((poly_prev_y + y) + ((x - poly_prev_x) * cot)) / 2.0; @@ -2536,8 +2950,7 @@ static void AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, b arc_done = true; } - if(!arc_done) - { + if (!arc_done) { double s[3] = {poly_prev_x, poly_prev_y, poly_prev_z}; double e[3] = {x, y, z}; dxf_read->OnReadLine(s, e, false); @@ -2548,8 +2961,7 @@ static void AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, b poly_prev_x = x; poly_prev_y = y; poly_prev_z = z; - if(!poly_first_found) - { + if (!poly_first_found) { poly_first_x = x; poly_first_y = y; poly_first_z = z; @@ -2558,9 +2970,10 @@ static void AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, b poly_prev_bulge_found = bulge_found; poly_prev_bulge = bulge; } - catch(...) - { - if (! dxf_read->IgnoreErrors()) throw; // Re-throw it. + catch (...) { + if (!dxf_read->IgnoreErrors()) { + throw; // Re-throw it. + } } } @@ -2585,89 +2998,110 @@ bool CDxfRead::ReadLwPolyLine() int flags; bool next_item_found = false; - while(!m_ifs.eof() && !next_item_found) - { + while (!m_ifs.eof() && !next_item_found) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadLwPolyLine()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found - - DerefACI(); - if(x_found && y_found){ - // add point - AddPolyLinePoint(this, x, y, z, bulge_found, bulge); - bulge_found = false; - x_found = false; - y_found = false; - } - next_item_found = true; - break; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 10: - // x - get_line(); - if(x_found && y_found){ - // add point - AddPolyLinePoint(this, x, y, z, bulge_found, bulge); - bulge_found = false; - x_found = false; - y_found = false; - } - ss.str(m_str); ss >> x; x = mm(x); if(ss.fail()) return false; - x_found = true; - break; - case 20: - // y - get_line(); - ss.str(m_str); ss >> y; y = mm(y); if(ss.fail()) return false; - y_found = true; - break; - case 38: - // elevation - get_line(); - ss.str(m_str); ss >> z; z = mm(z); if(ss.fail()) return false; - break; - case 42: - // bulge - get_line(); - ss.str(m_str); ss >> bulge; if(ss.fail()) return false; - bulge_found = true; - break; - case 70: - // flags - get_line(); - if(sscanf(m_str, "%d", &flags) != 1)return false; - closed = ((flags & 1) != 0); - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - default: - // skip the next line - get_line(); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found + + ResolveColorIndex(); + if (x_found && y_found){ + // add point + AddPolyLinePoint(this, x, y, z, bulge_found, bulge); + bulge_found = false; + x_found = false; + y_found = false; + } + next_item_found = true; + break; + case 8: // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; + case 10: + // x + get_line(); + if (x_found && y_found) { + // add point + AddPolyLinePoint(this, x, y, z, bulge_found, bulge); + bulge_found = false; + x_found = false; + y_found = false; + } + ss.str(m_str); + ss >> x; + x = mm(x); + if (ss.fail()) { + return false; + } + x_found = true; + break; + case 20: + // y + get_line(); + ss.str(m_str); + ss >> y; + y = mm(y); + if (ss.fail()) { + return false; + } + y_found = true; + break; + case 38: + // elevation + get_line(); + ss.str(m_str); + ss >> z; + z = mm(z); + if (ss.fail()) { + return false; + } + break; + case 42: + // bulge + get_line(); + ss.str(m_str); + ss >> bulge; + if (ss.fail()) { + return false; + } + bulge_found = true; + break; + case 70: + // flags + get_line(); + if (sscanf(m_str, "%d", &flags) != 1) { + return false; + } + closed = ((flags & 1) != 0); + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + default: + // skip the next line + get_line(); + break; } } - if(next_item_found) - { - if(closed && poly_first_found) - { + if (next_item_found) { + if (closed && poly_first_found) { // repeat the first point - DerefACI(); + ResolveColorIndex(); AddPolyLinePoint(this, poly_first_x, poly_first_y, poly_first_z, false, 0.0); } return true; @@ -2692,7 +3126,7 @@ bool CDxfRead::ReadVertex(double *pVertex, bool *bulge_found, double *bulge) pVertex[1] = 0.0; pVertex[2] = 0.0; - while(!m_ifs.eof()) { + while (!m_ifs.eof()) { get_line(); int n; if(sscanf(m_str, "%d", &n) != 1) { @@ -2700,12 +3134,12 @@ bool CDxfRead::ReadVertex(double *pVertex, bool *bulge_found, double *bulge) return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ + ss.imbue(std::locale::classic()); + switch (n){ case 0: - DerefACI(); + ResolveColorIndex(); put_line(m_str); // read one line too many. put it back. - return(x_found && y_found); + return (x_found && y_found); break; case 8: // Layer name follows @@ -2716,31 +3150,54 @@ bool CDxfRead::ReadVertex(double *pVertex, bool *bulge_found, double *bulge) case 10: // x get_line(); - ss.str(m_str); ss >> x; pVertex[0] = mm(x); if(ss.fail()) return false; + ss.str(m_str); + ss >> x; + pVertex[0] = mm(x); + if (ss.fail()) { + return false; + } x_found = true; break; case 20: // y get_line(); - ss.str(m_str); ss >> y; pVertex[1] = mm(y); if(ss.fail()) return false; + ss.str(m_str); + ss >> y; + pVertex[1] = mm(y); + if (ss.fail()) { + return false; + } y_found = true; break; case 30: // z get_line(); - ss.str(m_str); ss >> z; pVertex[2] = mm(z); if(ss.fail()) return false; + ss.str(m_str); + ss >> z; + pVertex[2] = mm(z); + if (ss.fail()) { + return false; + } break; case 42: get_line(); *bulge_found = true; - ss.str(m_str); ss >> *bulge; if(ss.fail()) return false; + ss.str(m_str); + ss >> *bulge; + if (ss.fail()) { + return false; + } + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; default: // skip the next line @@ -2753,7 +3210,6 @@ bool CDxfRead::ReadVertex(double *pVertex, bool *bulge_found, double *bulge) } - bool CDxfRead::ReadPolyLine() { PolyLineStart(); @@ -2765,115 +3221,133 @@ bool CDxfRead::ReadPolyLine() bool bulge_found; double bulge; - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadPolyLine()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found - DerefACI(); - get_line(); - if (! strcmp(m_str,"VERTEX")) - { - double vertex[3] = {0,0,0}; - if (CDxfRead::ReadVertex(vertex, &bulge_found, &bulge)) - { - if(!first_vertex_section_found) { - first_vertex_section_found = true; - memcpy(first_vertex, vertex, 3*sizeof(double)); - } - AddPolyLinePoint(this, vertex[0], vertex[1], vertex[2], bulge_found, bulge); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found + ResolveColorIndex(); + get_line(); + if (!strcmp(m_str, "VERTEX")) { + double vertex[3] = {0,0,0}; + if (CDxfRead::ReadVertex(vertex, &bulge_found, &bulge)) { + if (!first_vertex_section_found) { + first_vertex_section_found = true; + memcpy(first_vertex, vertex, 3*sizeof(double)); } + AddPolyLinePoint(this, vertex[0], vertex[1], vertex[2], bulge_found, bulge); + break; } - if (! strcmp(m_str,"SEQEND")) - { - if(closed && first_vertex_section_found) { - AddPolyLinePoint(this, first_vertex[0], first_vertex[1], first_vertex[2], 0, 0); - } - first_vertex_section_found = false; - PolyLineStart(); - return(true); + } + if (!strcmp(m_str, "SEQEND")) { + if (closed && first_vertex_section_found) { + AddPolyLinePoint(this, + first_vertex[0], + first_vertex[1], + first_vertex[2], + 0, + 0); } - break; - case 70: - // flags - get_line(); - if(sscanf(m_str, "%d", &flags) != 1)return false; - closed = ((flags & 1) != 0); - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - default: - // skip the next line - get_line(); - break; + first_vertex_section_found = false; + PolyLineStart(); + return (true); + } + break; + case 70: + // flags + get_line(); + if (sscanf(m_str, "%d", &flags) != 1) { + return false; + } + closed = ((flags & 1) != 0); + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + default: + // skip the next line + get_line(); + break; } } return false; } -void CDxfRead::OnReadArc(double start_angle, double end_angle, double radius, const double* c, double z_extrusion_dir, bool hidden){ - double s[3] = {0,0,0}, e[3] = {0,0,0}, temp[3] = {0,0,0}; - if (z_extrusion_dir==1.0) - { - temp[0] =c[0]; - temp[1] =c[1]; - temp[2] =c[2]; - s[0] = c[0] + radius * cos(start_angle * M_PI/180); - s[1] = c[1] + radius * sin(start_angle * M_PI/180); - s[2] = c[2]; - e[0] = c[0] + radius * cos(end_angle * M_PI/180); - e[1] = c[1] + radius * sin(end_angle * M_PI/180); - e[2] = c[2]; - } - else - { - temp[0] =-c[0]; - temp[1] =c[1]; - temp[2] =c[2]; - - e[0] = -(c[0] + radius * cos(start_angle * M_PI/180)); - e[1] = (c[1] + radius * sin(start_angle * M_PI/180)); - e[2] = c[2]; - s[0] = -(c[0] + radius * cos(end_angle * M_PI/180)); - s[1] = (c[1] + radius * sin(end_angle * M_PI/180)); - s[2] = c[2]; - +void CDxfRead::OnReadArc(double start_angle, + double end_angle, + double radius, + const double* c, + double z_extrusion_dir, + bool hidden) +{ + double s[3] = {0, 0, 0}, e[3] = {0, 0, 0}, temp[3] = {0, 0, 0}; + if (z_extrusion_dir == 1.0) { + temp[0] = c[0]; + temp[1] = c[1]; + temp[2] = c[2]; + s[0] = c[0] + radius * cos(start_angle * M_PI / 180); + s[1] = c[1] + radius * sin(start_angle * M_PI / 180); + s[2] = c[2]; + e[0] = c[0] + radius * cos(end_angle * M_PI / 180); + e[1] = c[1] + radius * sin(end_angle * M_PI / 180); + e[2] = c[2]; + } + else { + temp[0] =-c[0]; + temp[1] =c[1]; + temp[2] =c[2]; + + e[0] = -(c[0] + radius * cos(start_angle * M_PI/180)); + e[1] = (c[1] + radius * sin(start_angle * M_PI/180)); + e[2] = c[2]; + s[0] = -(c[0] + radius * cos(end_angle * M_PI/180)); + s[1] = (c[1] + radius * sin(end_angle * M_PI/180)); + s[2] = c[2]; } OnReadArc(s, e, temp, true, hidden); } -void CDxfRead::OnReadCircle(const double* c, double radius, bool hidden){ +void CDxfRead::OnReadCircle(const double* c, double radius, bool hidden) +{ double s[3]; double start_angle = 0; - s[0] = c[0] + radius * cos(start_angle * M_PI/180); - s[1] = c[1] + radius * sin(start_angle * M_PI/180); + s[0] = c[0] + radius * cos(start_angle * M_PI / 180); + s[1] = c[1] + radius * sin(start_angle * M_PI / 180); s[2] = c[2]; - OnReadCircle(s, c, false, hidden); //false to change direction because otherwise the arc length is zero + OnReadCircle(s, + c, + false, + hidden); // false to change direction because otherwise the arc length is zero } -void CDxfRead::OnReadEllipse(const double* c, const double* m, double ratio, double start_angle, double end_angle){ - double major_radius = sqrt(m[0]*m[0] + m[1]*m[1] + m[2]*m[2]); +void CDxfRead::OnReadEllipse(const double* c, + const double* m, + double ratio, + double start_angle, + double end_angle) +{ + double major_radius = sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]); double minor_radius = major_radius * ratio; - //Since we only support 2d stuff, we can calculate the rotation from the major axis x and y value only, - //since z is zero, major_radius is the vector length + // Since we only support 2d stuff, we can calculate the rotation from the major axis x and y + // value only, since z is zero, major_radius is the vector length - double rotation = atan2(m[1]/major_radius,m[0]/major_radius); + double rotation = atan2(m[1] / major_radius, m[0] / major_radius); OnReadEllipse(c, major_radius, minor_radius, rotation, start_angle, end_angle, true); @@ -2887,85 +3361,118 @@ bool CDxfRead::ReadInsert() double rot = 0.0; // rotation char name[1024] = {0}; - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadInsert()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found - DerefACI(); - OnReadInsert(c, s, name, rot * M_PI/180); - return(true); - case 8: - // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 10: - // coord x - get_line(); - ss.str(m_str); ss >> c[0]; c[0] = mm(c[0]); if(ss.fail()) return false; - break; - case 20: - // coord y - get_line(); - ss.str(m_str); ss >> c[1]; c[1] = mm(c[1]); if(ss.fail()) return false; - break; - case 30: - // coord z - get_line(); - ss.str(m_str); ss >> c[2]; c[2] = mm(c[2]); if(ss.fail()) return false; - break; - case 41: - // scale x - get_line(); - ss.str(m_str); ss >> s[0]; if(ss.fail()) return false; - break; - case 42: - // scale y - get_line(); - ss.str(m_str); ss >> s[1]; if(ss.fail()) return false; - break; - case 43: - // scale z - get_line(); - ss.str(m_str); ss >> s[2]; if(ss.fail()) return false; - break; - case 50: - // rotation - get_line(); - ss.str(m_str); ss >> rot; if(ss.fail()) return false; - break; - case 2: - // block name - get_line(); - safe_strcpy(name, m_str); - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - case 100: - case 39: - case 210: - case 220: - case 230: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found + ResolveColorIndex(); + OnReadInsert(c, s, name, rot * M_PI/180); + return(true); + case 8: + // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; + case 10: + // coord x + get_line(); + ss.str(m_str); + ss >> c[0]; + c[0] = mm(c[0]); + if (ss.fail()) { + return false; + } + break; + case 20: + // coord y + get_line(); + ss.str(m_str); + ss >> c[1]; + c[1] = mm(c[1]); + if (ss.fail()) { + return false; + } + break; + case 30: + // coord z + get_line(); + ss.str(m_str); + ss >> c[2]; + c[2] = mm(c[2]); + if (ss.fail()) { + return false; + } + break; + case 41: + // scale x + get_line(); + ss.str(m_str); + ss >> s[0]; + if (ss.fail()) { + return false; + } + break; + case 42: + // scale y + get_line(); + ss.str(m_str); + ss >> s[1]; + if (ss.fail()) { + return false; + } + break; + case 43: + // scale z + get_line(); + ss.str(m_str); + ss >> s[2]; + if (ss.fail()) { + return false; + } + break; + case 50: + // rotation + get_line(); + ss.str(m_str); + ss >> rot; + if (ss.fail()) { + return false; + } + break; + case 2: + // block name + get_line(); + strcpy(name, m_str); + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + case 100: + case 39: + case 210: + case 220: + case 230: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; } } return false; @@ -2979,95 +3486,146 @@ bool CDxfRead::ReadDimension() double p[3] = {0,0,0}; // dimpoint double rot = -1.0; // rotation - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadDimension()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: - // next item found - DerefACI(); - OnReadDimension(s, e, p, rot * M_PI/180); - return(true); - case 8: - // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 13: - // start x - get_line(); - ss.str(m_str); ss >> s[0]; s[0] = mm(s[0]); if(ss.fail()) return false; - break; - case 23: - // start y - get_line(); - ss.str(m_str); ss >> s[1]; s[1] = mm(s[1]); if(ss.fail()) return false; - break; - case 33: - // start z - get_line(); - ss.str(m_str); ss >> s[2]; s[2] = mm(s[2]); if(ss.fail()) return false; - break; - case 14: - // end x - get_line(); - ss.str(m_str); ss >> e[0]; e[0] = mm(e[0]); if(ss.fail()) return false; - break; - case 24: - // end y - get_line(); - ss.str(m_str); ss >> e[1]; e[1] = mm(e[1]); if(ss.fail()) return false; - break; - case 34: - // end z - get_line(); - ss.str(m_str); ss >> e[2]; e[2] = mm(e[2]); if(ss.fail()) return false; - break; - case 10: - // dimline x - get_line(); - ss.str(m_str); ss >> p[0]; p[0] = mm(p[0]); if(ss.fail()) return false; - break; - case 20: - // dimline y - get_line(); - ss.str(m_str); ss >> p[1]; p[1] = mm(p[1]); if(ss.fail()) return false; - break; - case 30: - // dimline z - get_line(); - ss.str(m_str); ss >> p[2]; p[2] = mm(p[2]); if(ss.fail()) return false; - break; - case 50: - // rotation - get_line(); - ss.str(m_str); ss >> rot; if(ss.fail()) return false; - break; - case 62: - // color index - get_line(); - ss.str(m_str); ss >> m_aci; if(ss.fail()) return false; - break; - case 100: - case 39: - case 210: - case 220: - case 230: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: + // next item found + ResolveColorIndex(); + OnReadDimension(s, e, p, rot * M_PI/180); + return(true); + case 8: + // Layer name follows + get_line(); + safe_strcpy(m_layer_name, m_str); + break; + case 13: + // start x + get_line(); + ss.str(m_str); + ss >> s[0]; + s[0] = mm(s[0]); + if (ss.fail()) { + return false; + } + break; + case 23: + // start y + get_line(); + ss.str(m_str); + ss >> s[1]; + s[1] = mm(s[1]); + if (ss.fail()) { + return false; + } + break; + case 33: + // start z + get_line(); + ss.str(m_str); + ss >> s[2]; + s[2] = mm(s[2]); + if (ss.fail()) { + return false; + } + break; + case 14: + // end x + get_line(); + ss.str(m_str); + ss >> e[0]; + e[0] = mm(e[0]); + if (ss.fail()) { + return false; + } + break; + case 24: + // end y + get_line(); + ss.str(m_str); + ss >> e[1]; + e[1] = mm(e[1]); + if (ss.fail()) { + return false; + } + break; + case 34: + // end z + get_line(); + ss.str(m_str); + ss >> e[2]; + e[2] = mm(e[2]); + if (ss.fail()) { + return false; + } + break; + case 10: + // dimline x + get_line(); + ss.str(m_str); + ss >> p[0]; + p[0] = mm(p[0]); + if (ss.fail()) { + return false; + } + break; + case 20: + // dimline y + get_line(); + ss.str(m_str); + ss >> p[1]; + p[1] = mm(p[1]); + if (ss.fail()) { + return false; + } + break; + case 30: + // dimline z + get_line(); + ss.str(m_str); + ss >> p[2]; + p[2] = mm(p[2]); + if (ss.fail()) { + return false; + } + break; + case 50: + // rotation + get_line(); + ss.str(m_str); + ss >> rot; + if (ss.fail()) { + return false; + } + break; + case 62: + // color index + get_line(); + ss.str(m_str); + ss >> m_ColorIndex; + if (ss.fail()) { + return false; + } + break; + case 100: + case 39: + case 210: + case 220: + case 230: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; } } return false; @@ -3076,32 +3634,30 @@ bool CDxfRead::ReadDimension() bool CDxfRead::ReadBlockInfo() { - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadBlockInfo()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 2: - // block name - get_line(); - safe_strcpy(m_block_name, m_str); - return true; - case 3: - // block name too??? - get_line(); - safe_strcpy(m_block_name, m_str); - return true; - default: - // skip the next line - get_line(); - break; + ss.imbue(std::locale::classic()); + switch (n){ + case 2: + // block name + get_line(); + safe_strcpy(m_block_name, m_str); + return true; + case 3: + // block name too??? + get_line(); + safe_strcpy(m_block_name, m_str); + return true; + default: + // skip the next line + get_line(); + break; } } return false; @@ -3110,25 +3666,23 @@ bool CDxfRead::ReadBlockInfo() void CDxfRead::get_line() { - if (m_unused_line[0] != '\0') - { + if (m_unused_line[0] != '\0') { safe_strcpy(m_str, m_unused_line); - memset( m_unused_line, '\0', sizeof(m_unused_line)); + memset(m_unused_line, '\0', sizeof(m_unused_line)); return; } m_ifs.getline(m_str, 1024); - ++m_lineNum; char str[1024]; size_t len = strlen(m_str); int j = 0; bool non_white_found = false; - for(size_t i = 0; iReportError_readInteger("DXF::ReadUnits()"); return(false); } @@ -3175,215 +3727,313 @@ bool CDxfRead::ReadUnits() bool CDxfRead::ReadLayer() { std::string layername; - int aci = -1; + ColorIndex_t colorIndex = -1; - while(!m_ifs.eof()) - { + while (!m_ifs.eof()) { get_line(); int n; - if(sscanf(m_str, "%d", &n) != 1) - { + if (sscanf(m_str, "%d", &n) != 1) { this->ReportError_readInteger("DXF::ReadLayer()"); return false; } std::istringstream ss; - ss.imbue(std::locale("C")); - switch(n){ - case 0: // next item found, so finish with line - if (layername.empty()) - return false; + ss.imbue(std::locale::classic()); + switch (n){ + case 0: // next item found, so finish with line + if (layername.empty()) { + this->ReportError_readInteger("DXF::ReadLayer() - no layer name"); + return false; + } + m_layer_ColorIndex_map[layername] = colorIndex; + return true; - m_layer_aci[layername] = aci; - return true; + case 2: // Layer name follows + get_line(); + layername = m_str; + break; - case 2: // Layer name follows - get_line(); - layername = m_str; - break; + case 62: + // layer color ; if negative, layer is off + get_line(); + if (sscanf(m_str, "%d", &colorIndex) != 1) { + return false; + } + break; - case 62: - // layer color ; if negative, layer is off - get_line(); - if(sscanf(m_str, "%d", &aci) != 1)return false; - break; - - case 6: // linetype name - case 70: // layer flags - case 100: - case 290: - case 370: - case 390: - // skip the next line - get_line(); - break; - default: - // skip the next line - get_line(); - break; + case 6: // linetype name + case 70: // layer flags + case 100: + case 290: + case 370: + case 390: + // skip the next line + get_line(); + break; + default: + // skip the next line + get_line(); + break; } } return false; } +bool CDxfRead::ReadVersion() +{ + static const std::vector VersionNames = { + // This table is indexed by eDXFVersion_t - (ROlder+1) + "AC1006", + "AC1009", + "AC1012", + "AC1014", + "AC1015", + "AC1018", + "AC1021", + "AC1024", + "AC1027", + "AC1032"}; + + assert(VersionNames.size() == RNewer - ROlder - 1); + get_line(); + get_line(); + std::vector::const_iterator first = VersionNames.cbegin(); + std::vector::const_iterator last = VersionNames.cend(); + std::vector::const_iterator found = std::lower_bound(first, last, m_str); + if (found == last) { + m_version = RNewer; + } + else if (*found == m_str) { + m_version = (eDXFVersion_t)(std::distance(first, found) + (ROlder + 1)); + } + else if (found == first) { + m_version = ROlder; + } + else { + m_version = RUnknown; + } + + return ResolveEncoding(); +} + +bool CDxfRead::ReadDWGCodePage() +{ + get_line(); + get_line(); + m_CodePage = m_str; + + return ResolveEncoding(); +} + +bool CDxfRead::ResolveEncoding() +{ + // + // See https://ezdxf.readthedocs.io/en/stable/dxfinternals/fileencoding.html# + // + + if (m_version >= R2007) { // Note this does not include RUnknown, but does include RLater + return this->setSourceEncoding("UTF8"); + } + else { + std::transform(m_CodePage.cbegin(), m_CodePage.cend(), m_CodePage.begin(), [](char c) { + return std::toupper(c, std::locale::classic()); + }); + // ANSI_1252 by default if $DWGCODEPAGE is not set + if (m_CodePage.empty()) + m_CodePage = "ANSI_1252"; + + return this->setSourceEncoding(m_CodePage); + } +} + +#if 0 +const char* CDxfRead::UTF8ToUTF8(const char* encoded) const +{ + return encoded; +} + +const char* CDxfRead::GeneralToUTF8(const char* encoded) const +{ + Base::PyGILStateLocker lock; + PyObject* decoded = PyUnicode_Decode(encoded, strlen(encoded), m_encoding->c_str(), "strict"); + if (decoded == nullptr) { + return nullptr; + } + Py_ssize_t len; + const char* converted = PyUnicode_AsUTF8AndSize(decoded, &len); + char* result = nullptr; + if (converted != nullptr) { + // converted only has lifetime of decoded so we must save a copy. + result = (char*)malloc(len + 1); + if (result == nullptr) { + PyErr_SetString(PyExc_MemoryError, "Out of memory"); + } + else { + memcpy(result, converted, len + 1); + } + } + Py_DECREF(decoded); + return result; +} +#endif + void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) { m_ignore_errors = ignore_errors; - if(m_fail)return; + if (m_fail) { + return; + } get_line(); - while(!m_ifs.eof()) - { - m_aci = 256; - - if (!strcmp( m_str, "$INSUNITS" )){ - if (!ReadUnits())return; + while (!m_ifs.eof()) { + if (!strcmp(m_str, "$INSUNITS" )) { + if (!ReadUnits()) { + return; + } continue; } // End if - then - if (!strcmp( m_str, "$MEASUREMENT" )){ + if (!strcmp(m_str, "$MEASUREMENT" )) { get_line(); get_line(); int n = 1; - if(sscanf(m_str, "%d", &n) == 1) - { - if(n == 0)m_measurement_inch = true; + if (sscanf(m_str, "%d", &n) == 1) { + if (n == 0) { + m_measurement_inch = true; + } } continue; } // End if - then - else if(!strcmp(m_str, "0")) - { + if (!strcmp(m_str, "$ACADVER")) { + if (!ReadVersion()) { + return; + } + continue; + } // End if - then + + if (!strcmp(m_str, "$DWGCODEPAGE")) { + if (!ReadDWGCodePage()) { + return; + } + continue; + } // End if - then + + if (!strcmp(m_str, "0")) { get_line(); - if (!strcmp( m_str, "SECTION" )){ - safe_strcpy(m_section_name, ""); - get_line(); - get_line(); - if (strcmp( m_str, "ENTITIES" )) - safe_strcpy(m_section_name, m_str); - safe_strcpy(m_block_name, ""); + if (!strcmp( m_str, "SECTION" )) { + safe_strcpy(m_section_name, ""); + get_line(); + get_line(); + if (strcmp( m_str, "ENTITIES" )) { + safe_strcpy(m_section_name, m_str); + } + safe_strcpy(m_block_name, ""); - } // End if - then - else if (!strcmp( m_str, "TABLE" )){ - get_line(); - get_line(); - } + } // End if - then + else if (!strcmp( m_str, "TABLE" )) { + get_line(); + get_line(); + } - else if (!strcmp( m_str, "LAYER" )){ - if(!ReadLayer()) - { - this->ReportError("DXF::DoRead() - Failed to read layer"); - //return; Some objects or tables can have "LAYER" as name... + else if (!strcmp( m_str, "LAYER" )) { + get_line(); + get_line(); + if (!ReadLayer()) { + this->ReportError("DXF::DoRead() - Failed to read layer"); + //return; Some objects or tables can have "LAYER" as name... } - continue; - } - - else if (!strcmp( m_str, "BLOCK" )) { - if(!ReadBlockInfo()) - { - this->ReportError("DXF::DoRead() - Failed to read block info"); - return; + continue; } - continue; - } // End if - then - else if (!strcmp( m_str, "ENDSEC" )){ - safe_strcpy(m_section_name, ""); - safe_strcpy(m_block_name, ""); - } // End if - then - else if(!strcmp(m_str, "LINE")){ - if(!ReadLine()) - { - this->ReportError("DXF::DoRead() - Failed to read line"); + else if (!strcmp( m_str, "BLOCK" )) { + if (!ReadBlockInfo()) { + this->ReportError("DXF::DoRead() - Failed to read block info"); return; } continue; - } - else if(!strcmp(m_str, "ARC")){ - if(!ReadArc()) - { - this->ReportError("DXF::DoRead() - Failed to read arc"); + } // End if - then + + else if (!strcmp( m_str, "ENDSEC" )) { + safe_strcpy(m_section_name, ""); + safe_strcpy(m_block_name, ""); + } // End if - then + else if (!strcmp(m_str, "LINE")) { + if (!ReadLine()) { + this->ReportError("DXF::DoRead() - Failed to read line"); return; } continue; } - else if(!strcmp(m_str, "CIRCLE")){ - if(!ReadCircle()) - { - this->ReportError("DXF::DoRead() - Failed to read circle"); + else if (!strcmp(m_str, "ARC")) { + if (!ReadArc()) { + this->ReportError("DXF::DoRead() - Failed to read arc"); return; } continue; } - else if(!strcmp(m_str, "MTEXT")){ - if(!ReadText()) - { - this->ReportError("DXF::DoRead() - Failed to read text"); + else if (!strcmp(m_str, "CIRCLE")) { + if (!ReadCircle()) { + this->ReportError("DXF::DoRead() - Failed to read circle"); return; } continue; } - else if(!strcmp(m_str, "TEXT")){ - if(!ReadText()) - { - this->ReportError("DXF::DoRead() - Failed to read text"); + else if (!strcmp(m_str, "MTEXT") || !strcmp(m_str, "TEXT")) { + try { + ReadText(); + } catch (const std::runtime_error& err) { + this->ReportError("DXF::DoRead() - Failed to read text\nError: " + std::string(err.what())); return; } continue; } - else if(!strcmp(m_str, "ELLIPSE")){ - if(!ReadEllipse()) - { + else if (!strcmp(m_str, "ELLIPSE")) { + if (!ReadEllipse()) { this->ReportError("DXF::DoRead() - Failed to read ellipse"); return; } continue; } - else if(!strcmp(m_str, "SPLINE")){ - if(!ReadSpline()) - { + else if (!strcmp(m_str, "SPLINE")) { + if (!ReadSpline()) { this->ReportError("DXF::DoRead() - Failed to read spline"); return; } continue; } else if (!strcmp(m_str, "LWPOLYLINE")) { - if(!ReadLwPolyLine()) - { + if (!ReadLwPolyLine()) { this->ReportError("DXF::DoRead() - Failed to read LW Polyline"); return; } continue; } else if (!strcmp(m_str, "POLYLINE")) { - if(!ReadPolyLine()) - { + if (!ReadPolyLine()) { this->ReportError("DXF::DoRead() - Failed to read Polyline"); return; } continue; } else if (!strcmp(m_str, "POINT")) { - if(!ReadPoint()) - { + if (!ReadPoint()) { this->ReportError("DXF::DoRead() - Failed to read Point"); return; } continue; } else if (!strcmp(m_str, "INSERT")) { - if(!ReadInsert()) - { + if (!ReadInsert()) { this->ReportError("DXF::DoRead() - Failed to read Insert"); return; } continue; } else if (!strcmp(m_str, "DIMENSION")) { - if(!ReadDimension()) - { + if (!ReadDimension()) { this->ReportError("DXF::DoRead() - Failed to read Dimension"); return; } @@ -3397,12 +4047,12 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) } -void CDxfRead::DerefACI() +void CDxfRead::ResolveColorIndex() { - if (m_aci == 256) // if color = layer color, replace by color from layer + if (m_ColorIndex == ColorBylayer) // if color = layer color, replace by color from layer { - m_aci = m_layer_aci[std::string(m_layer_name)]; + m_ColorIndex = m_layer_ColorIndex_map[std::string(m_layer_name)]; } } @@ -3429,20 +4079,17 @@ std::string CDxfRead::LayerName() const { std::string result; - if (strlen(m_section_name) > 0) - { + if (strlen(m_section_name) > 0) { result.append(m_section_name); result.append(" "); } - if (strlen(m_block_name) > 0) - { + if (strlen(m_block_name) > 0) { result.append(m_block_name); result.append(" "); } - if (strlen(m_layer_name) > 0) - { + if (strlen(m_layer_name) > 0) { result.append(m_layer_name); } diff --git a/src/io_dxf/dxf.h b/src/io_dxf/dxf.h index 9cd8b05e..f38bdacd 100644 --- a/src/io_dxf/dxf.h +++ b/src/io_dxf/dxf.h @@ -3,30 +3,27 @@ // This program is released under the BSD license. See the file COPYING for details. // modified 2018 wandererfan -// MAYO: file initially taken from FreeCad/src/Mod/Import/App/dxf.h -- commit #47d5707 +// MAYO: file taken from FreeCad/src/Mod/Import/App/dxf.h -- commit #55292e9 #pragma once #include +#include +#include +#include +#include +#include #include -#include +#include #include #include -#include #include -#include -#include -#include -#include +#include +#include #include "freecad.h" -//Following is required to be defined on Ubuntu with OCC 6.3.1 -#ifndef HAVE_IOSTREAM -#define HAVE_IOSTREAM -#endif - -typedef int Aci_t; // AutoCAD color index +typedef int ColorIndex_t; // DXF color index typedef enum { @@ -53,6 +50,19 @@ typedef enum eParsecs } eDxfUnits_t; +enum class AttachmentPoint { + TopLeft = 1, TopCenter, TopRight, + MiddleLeft, MiddleCenter, MiddleRight, + BottomLeft, BottomCenter, BottomRight +}; + +struct DxfText { + double point[3] = {}; + double height = 0.03082; + std::string str; + double rotation = 0.; // radians + AttachmentPoint attachPoint = AttachmentPoint::TopLeft; +}; //spline data for reading struct SplineData @@ -118,9 +128,26 @@ struct LWPolyDataOut std::vector Bulge; point3D Extr; }; +typedef enum +{ + RUnknown, + ROlder, + R10, + R11_12, + R13, + R14, + R2000, + R2004, + R2007, + R2010, + R2013, + R2018, + RNewer, +} eDXFVersion_t; //******************** -class CDxfWrite{ +class CDxfWrite +{ private: std::ofstream m_ofs; bool m_fail; @@ -130,29 +157,45 @@ class CDxfWrite{ std::ostringstream m_ssLayer; protected: - void putLine(const Base::Vector3d& s, const Base::Vector3d& e, - std::ostringstream& outStream, const std::string& handle, + void putLine(const Base::Vector3d& s, + const Base::Vector3d& e, + std::ostringstream& outStream, + const std::string& handle, const std::string& ownerHandle); - void putText(const char* text, const Base::Vector3d& location1, const Base::Vector3d& location2, - const double height, const int horizJust, - std::ostringstream& outStream, const std::string& handle, + void putText(const char* text, + const Base::Vector3d& location1, + const Base::Vector3d& location2, + const double height, + const int horizJust, + std::ostringstream& outStream, + const std::string& handle, const std::string& ownerHandle); - void putArrow(const Base::Vector3d& arrowPos, const Base::Vector3d& barb1Pos, const Base::Vector3d& barb2Pos, - std::ostringstream& outStream, const std::string& handle, + void putArrow(const Base::Vector3d& arrowPos, + const Base::Vector3d& barb1Pos, + const Base::Vector3d& barb2Pos, + std::ostringstream& outStream, + const std::string& handle, const std::string& ownerHandle); //! copy boiler plate file std::string getPlateFile(const std::string& fileSpec); - void setDataDir(const std::string& s) { m_dataDir = s; } - std::string getHandle(void); - std::string getEntityHandle(void); - std::string getLayerHandle(void); - std::string getBlockHandle(void); - std::string getBlkRecordHandle(void); + void setDataDir(const std::string& s) + { + m_dataDir = s; + } + std::string getHandle(); + std::string getEntityHandle(); + std::string getLayerHandle(); + std::string getBlockHandle(); + std::string getBlkRecordHandle(); std::string m_optionSource; int m_version; int m_handle; + int m_entityHandle; + int m_layerHandle; + int m_blockHandle; + int m_blkRecordHandle; bool m_polyOverride; std::string m_saveModelSpaceHandle; @@ -170,74 +213,112 @@ class CDxfWrite{ CDxfWrite(const char* filepath); ~CDxfWrite(); - void init(void); - void endRun(void); + void init(); + void endRun(); - bool Failed(){return m_fail;} + bool Failed() + { + return m_fail; + } // void setOptions(void); // bool isVersionValid(int vers); - std::string getLayerName() { return m_layerName; } + std::string getLayerName() + { + return m_layerName; + } void setLayerName(std::string s); - void setVersion(int v) { m_version = v;} - void setPolyOverride(bool b) { m_polyOverride = b; } + void setVersion(int v) + { + m_version = v; + } + void setPolyOverride(bool b) + { + m_polyOverride = b; + } void addBlockName(std::string s, std::string blkRecordHandle); void writeLine(const double* s, const double* e); void writePoint(const double*); void writeArc(const double* s, const double* e, const double* c, bool dir); - void writeEllipse(const double* c, double major_radius, double minor_radius, - double rotation, double start_angle, double end_angle, bool endIsCW); + void writeEllipse(const double* c, + double major_radius, + double minor_radius, + double rotation, + double start_angle, + double end_angle, + bool endIsCW); void writeCircle(const double* c, double radius ); - void writeSpline(const SplineDataOut &sd); - void writeLWPolyLine(const LWPolyDataOut &pd); - void writePolyline(const LWPolyDataOut &pd); + void writeSpline(const SplineDataOut& sd); + void writeLWPolyLine(const LWPolyDataOut& pd); + void writePolyline(const LWPolyDataOut& pd); void writeVertex(double x, double y, double z); - void writeText(const char* text, const double* location1, const double* location2, - const double height, const int horizJust); - void writeLinearDim(const double* textMidPoint, const double* lineDefPoint, - const double* extLine1, const double* extLine2, - const char* dimText, int type); - void writeLinearDimBlock(const double* textMidPoint, const double* lineDefPoint, - const double* extLine1, const double* extLine2, - const char* dimText, int type); - void writeAngularDim(const double* textMidPoint, const double* lineDefPoint, - const double* startExt1, const double* endExt1, - const double* startExt2, const double* endExt2, - const char* dimText); - void writeAngularDimBlock(const double* textMidPoint, const double* lineDefPoint, - const double* startExt1, const double* endExt1, - const double* startExt2, const double* endExt2, - const char* dimText); - void writeRadialDim(const double* centerPoint, const double* textMidPoint, - const double* arcPoint, - const char* dimText); - void writeRadialDimBlock(const double* centerPoint, const double* textMidPoint, - const double* arcPoint, const char* dimText); - void writeDiametricDim(const double* textMidPoint, - const double* arcPoint1, const double* arcPoint2, - const char* dimText); - void writeDiametricDimBlock(const double* textMidPoint, - const double* arcPoint1, const double* arcPoint2, + void writeText(const char* text, + const double* location1, + const double* location2, + const double height, + const int horizJust); + void writeLinearDim(const double* textMidPoint, + const double* lineDefPoint, + const double* extLine1, + const double* extLine2, + const char* dimText, + int type); + void writeLinearDimBlock(const double* textMidPoint, + const double* lineDefPoint, + const double* extLine1, + const double* extLine2, + const char* dimText, + int type); + void writeAngularDim(const double* textMidPoint, + const double* lineDefPoint, + const double* startExt1, + const double* endExt1, + const double* startExt2, + const double* endExt2, const char* dimText); + void writeAngularDimBlock(const double* textMidPoint, + const double* lineDefPoint, + const double* startExt1, + const double* endExt1, + const double* startExt2, + const double* endExt2, + const char* dimText); + void writeRadialDim(const double* centerPoint, + const double* textMidPoint, + const double* arcPoint, + const char* dimText); + void writeRadialDimBlock(const double* centerPoint, + const double* textMidPoint, + const double* arcPoint, + const char* dimText); + void writeDiametricDim(const double* textMidPoint, + const double* arcPoint1, + const double* arcPoint2, + const char* dimText); + void writeDiametricDimBlock(const double* textMidPoint, + const double* arcPoint1, + const double* arcPoint2, + const char* dimText); void writeDimBlockPreamble(); - void writeBlockTrailer(void); - - void writeHeaderSection(void); - void writeTablesSection(void); - void writeBlocksSection(void); - void writeEntitiesSection(void); - void writeObjectsSection(void); - void writeClassesSection(void); - - void makeLayerTable(void); - void makeBlockRecordTableHead(void); - void makeBlockRecordTableBody(void); - void makeBlockSectionHead(void); + void writeBlockTrailer(); + + void writeHeaderSection(); + void writeTablesSection(); + void writeBlocksSection(); + void writeEntitiesSection(); + void writeObjectsSection(); + void writeClassesSection(); + + void makeLayerTable(); + void makeBlockRecordTableHead(); + void makeBlockRecordTableBody(); + void makeBlockSectionHead(); }; // derive a class from this and implement it's virtual functions -class CDxfRead{ +class CDxfRead +{ private: std::ifstream m_ifs; @@ -252,13 +333,14 @@ class CDxfRead{ bool m_ignore_errors; - typedef std::map< std::string,Aci_t > LayerAciMap_t; - LayerAciMap_t m_layer_aci; // layer names -> layer color aci map + std::map + m_layer_ColorIndex_map; // Mapping from layer name -> layer color index + const ColorIndex_t ColorBylayer = 256; bool ReadUnits(); bool ReadLayer(); bool ReadLine(); - bool ReadText(); + void ReadText(); bool ReadArc(); bool ReadCircle(); bool ReadEllipse(); @@ -267,48 +349,97 @@ class CDxfRead{ bool ReadLwPolyLine(); bool ReadPolyLine(); bool ReadVertex(double *pVertex, bool *bulge_found, double *bulge); - void OnReadArc(double start_angle, double end_angle, double radius, const double* c, double z_extrusion_dir, bool hidden); + void OnReadArc(double start_angle, + double end_angle, + double radius, + const double* c, + double z_extrusion_dir, + bool hidden); void OnReadCircle(const double* c, double radius, bool hidden); - void OnReadEllipse(const double* c, const double* m, double ratio, double start_angle, double end_angle); + void OnReadEllipse(const double* c, + const double* m, + double ratio, + double start_angle, + double end_angle); bool ReadInsert(); bool ReadDimension(); bool ReadBlockInfo(); + bool ReadVersion(); + bool ReadDWGCodePage(); + bool ResolveEncoding(); void put_line(const char *value); - void DerefACI(); + void ResolveColorIndex(); void ReportError_readInteger(const char* context); protected: - Aci_t m_aci; // manifest color name or 256 for layer color - int m_lineNum = 0; + ColorIndex_t m_ColorIndex; + eDXFVersion_t m_version; // Version from $ACADVER variable in DXF std::streamsize gcount() const; virtual void get_line(); - virtual void ReportError(const char* /*msg*/) {} + virtual void ReportError(const std::string& /*msg*/) {} + + virtual bool setSourceEncoding(const std::string& /*codepage*/) { return true; } + virtual std::string toUtf8(const std::string& strSource) { return strSource; } + +private: + std::string m_CodePage; // Code Page name from $DWGCODEPAGE or null if none/not read yet public: CDxfRead(const char* filepath); // this opens the file virtual ~CDxfRead(); // this closes the file - bool Failed(){return m_fail;} - void DoRead(const bool ignore_errors = false); // this reads the file and calls the following functions + bool Failed() + { + return m_fail; + } + void DoRead( + const bool ignore_errors = false); // this reads the file and calls the following functions double mm( double value ) const; - bool IgnoreErrors() const { return(m_ignore_errors); } - - virtual void OnReadLine(const double* /*s*/, const double* /*e*/, bool /*hidden*/){} - virtual void OnReadPoint(const double* /*s*/){} - virtual void OnReadText(const double* /*point*/, const double /*height*/, double /*rotation*/, const char* /*text*/){} - virtual void OnReadArc(const double* /*s*/, const double* /*e*/, const double* /*c*/, bool /*dir*/, bool /*hidden*/){} - virtual void OnReadCircle(const double* /*s*/, const double* /*c*/, bool /*dir*/, bool /*hidden*/){} - virtual void OnReadEllipse(const double* /*c*/, double /*major_radius*/, double /*minor_radius*/, double /*rotation*/, double /*start_angle*/, double /*end_angle*/, bool /*dir*/){} - virtual void OnReadSpline(struct SplineData& /*sd*/){} - virtual void OnReadInsert(const double* /*point*/, const double* /*scale*/, const char* /*name*/, double /*rotation*/){} - virtual void OnReadDimension(const double* /*s*/, const double* /*e*/, const double* /*point*/, double /*rotation*/){} - virtual void AddGraphics() const { } + bool IgnoreErrors() const + { + return(m_ignore_errors); + } + + virtual void OnReadLine(const double* /*s*/, const double* /*e*/, bool /*hidden*/) + {} + virtual void OnReadPoint(const double* /*s*/) + {} + virtual void OnReadText(const DxfText&) {} + virtual void OnReadArc(const double* /*s*/, + const double* /*e*/, + const double* /*c*/, + bool /*dir*/, + bool /*hidden*/) + {} + virtual void OnReadCircle(const double* /*s*/, const double* /*c*/, bool /*dir*/, bool /*hidden*/) + {} + virtual void OnReadEllipse(const double* /*c*/, + double /*major_radius*/, + double /*minor_radius*/, + double /*rotation*/, + double /*start_angle*/, + double /*end_angle*/, + bool /*dir*/) + {} + virtual void OnReadSpline(struct SplineData& /*sd*/) + {} + virtual void OnReadInsert(const double* /*point*/, + const double* /*scale*/, + const char* /*name*/, + double /*rotation*/) + {} + virtual void OnReadDimension(const double* /*s*/, + const double* /*e*/, + const double* /*point*/, + double /*rotation*/) + {} + virtual void AddGraphics() const + {} std::string LayerName() const; - }; diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index 1d7b29da..37dc2d73 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -16,6 +16,7 @@ #include "../base/property_enumeration.h" #include "../base/task_progress.h" #include "../base/string_conv.h" +#include "../base/tkernel_utils.h" #include "../base/unit_system.h" #include "aci_table.h" #include "dxf.h" @@ -26,16 +27,20 @@ #include #include #include +#include +#include #include #include #include #include #include +#include #include #include #include #include +#include #include #include @@ -74,9 +79,12 @@ class DxfReader::Internal : public CDxfRead { TaskProgress* m_progress = nullptr; std::uintmax_t m_fileSize = 0; std::uintmax_t m_fileReadSize = 0; + Resource_FormatType m_srcEncoding = Resource_ANSI; protected: void get_line() override; + bool setSourceEncoding(const std::string& codepage) override; + std::string toUtf8(const std::string& strSource) override; public: Internal(const FilePath& filepath, TaskProgress* progress = nullptr); @@ -88,7 +96,7 @@ class DxfReader::Internal : public CDxfRead { // CDxfRead's virtual functions void OnReadLine(const double* s, const double* e, bool hidden) override; void OnReadPoint(const double* s) override; - void OnReadText(const double* point, const double height, double rotation, const char* text) override; + void OnReadText(const DxfText& text) override; void OnReadArc(const double* s, const double* e, const double* c, bool dir, bool hidden) override; void OnReadCircle(const double* s, const double* c, bool dir, bool hidden) override; void OnReadEllipse(const double* c, double major_radius, double minor_radius, double rotation, double start_angle, double end_angle, bool dir) override; @@ -96,7 +104,7 @@ class DxfReader::Internal : public CDxfRead { void OnReadInsert(const double* point, const double* scale, const char* name, double rotation) override; void OnReadDimension(const double* s, const double* e, const double* point, double rotation) override; - void ReportError(const char* msg) override; + void ReportError(const std::string& msg) override; static Handle_Geom_BSplineCurve createSplineFromPolesAndKnots(struct SplineData& sd); static Handle_Geom_BSplineCurve createInterpolationSpline(struct SplineData& sd); @@ -153,7 +161,7 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) Handle_XCAFDoc_ColorTool colorTool = doc->xcaf().colorTool(); Handle_XCAFDoc_LayerTool layerTool = doc->xcaf().layerTool(); std::unordered_map mapLayerNameLabel; - std::unordered_map mapAciColorLabel; + std::unordered_map mapAciColorLabel; auto fnAddRootShape = [&](const TopoDS_Shape& shape, const std::string& shapeName, TDF_Label layer) { const TDF_Label labelShape = shapeTool->NewShape(); @@ -166,7 +174,7 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) return labelShape; }; - auto fnAddAci = [&](Aci_t aci) { + auto fnAddAci = [&](ColorIndex_t aci) { auto it = mapAciColorLabel.find(aci); if (it != mapAciColorLabel.cend()) return it->second; @@ -225,7 +233,7 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) const TDF_Label compLabel = fnAddRootShape(comp, layerName, layerLabel); // Check if all entities have the same color bool uniqueColor = true; - const Aci_t aci = !vecEntity.empty() ? vecEntity.front().aci : -1; + const ColorIndex_t aci = !vecEntity.empty() ? vecEntity.front().aci : -1; for (const Entity& entity : vecEntity) { uniqueColor = entity.aci == aci; if (!uniqueColor) @@ -277,6 +285,76 @@ void DxfReader::Internal::get_line() m_progress->setValue(MathUtils::toPercent(m_fileReadSize, 0, m_fileSize)); } +bool DxfReader::Internal::setSourceEncoding(const std::string& codepage) +{ + std::optional encoding; + +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 4, 0) + if (codepage == "UTF8") + encoding = Resource_FormatType_UTF8; + else if (codepage == "ANSI_932") // Japanese + encoding = Resource_FormatType_SJIS; + else if (codepage == "ANSI_936") // UnifiedChinese + encoding = Resource_FormatType_GB; + else if (codepage == "ANSI_949") // Korean + encoding = Resource_FormatType_EUC; +#endif + +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 5, 0) + if (encoding) + ; // NOP: encoding already found above + else if (codepage == "ANSI_936") // UnifiedChinese + encoding = Resource_FormatType_GBK; + else if (codepage == "ANSI_950") // TradChinese + encoding = Resource_FormatType_Big5; + else if (codepage == "ANSI_1250") + encoding = Resource_FormatType_CP1250; + else if (codepage == "ANSI_1251") + encoding = Resource_FormatType_CP1251; + else if (codepage == "ANSI_1252") + encoding = Resource_FormatType_CP1252; + else if (codepage == "ANSI_1253") + encoding = Resource_FormatType_CP1253; + else if (codepage == "ANSI_1254") + encoding = Resource_FormatType_CP1254; + else if (codepage == "ANSI_1255") + encoding = Resource_FormatType_CP1255; + else if (codepage == "ANSI_1256") + encoding = Resource_FormatType_CP1256; + else if (codepage == "ANSI_1257") + encoding = Resource_FormatType_CP1257; + else if (codepage == "ANSI_1258") + encoding = Resource_FormatType_CP1258; +#endif + + if (encoding) { + m_srcEncoding = encoding.value(); + } + else { + m_srcEncoding = Resource_ANSI; + m_messenger->emitWarning("Codepage " + codepage + " not supported"); + } + + return true; +} + +std::string DxfReader::Internal::toUtf8(const std::string& strSource) +{ + if (m_srcEncoding == Resource_ANSI) // Resource_ANSI is a pass-through(OpenCascade) + return strSource; + +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 4, 0) + if (m_srcEncoding == Resource_FormatType_UTF8) + return strSource; + + TCollection_ExtendedString extStr; + Resource_Unicode::ConvertFormatToUnicode(m_srcEncoding, strSource.c_str(), extStr); + return to_stdString(extStr); +#else + return strSource; +#endif +} + DxfReader::Internal::Internal(const FilePath& filepath, TaskProgress* progress) : CDxfRead(filepath.u8string().c_str()), m_progress(progress) @@ -302,25 +380,40 @@ void DxfReader::Internal::OnReadPoint(const double* s) this->addShape(vertex); } -void DxfReader::Internal::OnReadText(const double* point, const double height, double rotation, const char* text) +void DxfReader::Internal::OnReadText(const DxfText& text) { if (!m_params.importAnnotations) return; - const gp_Pnt pt = this->toPnt(point); + const gp_Pnt pt = this->toPnt(text.point); const std::string layerName = this->LayerName(); if (!startsWith(layerName, "BLOCKS")) { const std::string& fontName = m_params.fontNameForTextObjects; - const double fontHeight = 4 * height * m_params.scaling; + const double fontHeight = 4 * text.height * m_params.scaling; Font_BRepFont brepFont; if (brepFont.Init(fontName.c_str(), Font_FA_Regular, fontHeight)) { gp_Trsf rotTrsf; - if (rotation != 0.) - rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), UnitSystem::radians(rotation * Quantity_Degree)); + if (!MathUtils::fuzzyIsNull(text.rotation)) + rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), text.rotation); + + const int ap = static_cast(text.attachPoint); + Graphic3d_HorizontalTextAlignment hAttachPnt = Graphic3d_HTA_LEFT; + if (ap == 2 || ap == 5 || ap == 8) + hAttachPnt = Graphic3d_HTA_CENTER; + else if (ap == 3 || ap == 6 || ap == 9) + hAttachPnt = Graphic3d_HTA_RIGHT; + + Graphic3d_VerticalTextAlignment vAttachPnt = Graphic3d_VTA_TOP; + if (ap == 4 || ap == 5 || ap == 6) + vAttachPnt = Graphic3d_VTA_CENTER; + else if (ap == 7 || ap == 8 || ap == 9) + vAttachPnt = Graphic3d_VTA_BOTTOM; const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); Font_BRepTextBuilder brepTextBuilder; - const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, text, locText); + const TopoDS_Shape shapeText = brepTextBuilder.Perform( + brepFont, string_conv(text.str), locText, hAttachPnt, vAttachPnt + ); this->addShape(shapeText); } else { @@ -368,7 +461,8 @@ void DxfReader::Internal::OnReadEllipse( double major_radius, double minor_radius, double rotation, double /*start_angle*/, double /*end_angle*/, - bool dir) + bool dir + ) { const gp_Dir up = dir ? gp::DZ() : -gp::DZ(); const gp_Pnt pc = this->toPnt(c); @@ -435,7 +529,8 @@ void DxfReader::Internal::OnReadInsert(const double* point, const double* scale, trsfScale.SetValues( nscale[0], 0, 0, 0, 0, nscale[1], 0, 0, - 0, 0, nscale[2], 0); + 0, 0, nscale[2], 0 + ); gp_Trsf trsfRotZ; trsfRotZ.SetRotation(gp::OZ(), rotation); gp_Trsf trsfMove; @@ -460,7 +555,7 @@ void DxfReader::Internal::OnReadDimension(const double* s, const double* e, cons } } -void DxfReader::Internal::ReportError(const char* msg) +void DxfReader::Internal::ReportError(const std::string& msg) { m_messenger->emitError(msg); } @@ -481,7 +576,7 @@ gp_Pnt DxfReader::Internal::toPnt(const double* coords) const void DxfReader::Internal::addShape(const TopoDS_Shape& shape) { - const Entity newEntity{ m_aci, shape }; + const Entity newEntity{ m_ColorIndex, shape }; const std::string layerName = this->LayerName(); auto itFound = m_layers.find(layerName); if (itFound != m_layers.end()) { diff --git a/src/io_off/io_off_reader.h b/src/io_off/io_off_reader.h index eba56187..c5e319f9 100644 --- a/src/io_off/io_off_reader.h +++ b/src/io_off/io_off_reader.h @@ -11,7 +11,6 @@ #include #include - #include namespace Mayo { From 85a3aa12f0a1fe9a991f3715fd6f812cdf58702b Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 21 Nov 2023 12:19:28 +0100 Subject: [PATCH 76/92] IO_Dxf: handle CP850 codepage when possible --- src/io_dxf/io_dxf.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index 37dc2d73..a26effc5 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -302,7 +302,7 @@ bool DxfReader::Internal::setSourceEncoding(const std::string& codepage) #if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 5, 0) if (encoding) - ; // NOP: encoding already found above + ; // Encoding already found above else if (codepage == "ANSI_936") // UnifiedChinese encoding = Resource_FormatType_GBK; else if (codepage == "ANSI_950") // TradChinese @@ -327,6 +327,13 @@ bool DxfReader::Internal::setSourceEncoding(const std::string& codepage) encoding = Resource_FormatType_CP1258; #endif +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 6, 0) + if (encoding) + ; // Encoding already found above + else if (codepage == "ANSI_850" || codepage == "DOS850") + encoding = Resource_FormatType_CP850; +#endif + if (encoding) { m_srcEncoding = encoding.value(); } From a3d1e9b0be9cb89ad129a73bbb32ab92ce1f3a64 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 22 Nov 2023 11:08:44 +0100 Subject: [PATCH 77/92] Base: add BRepUtils::makeEdge() helper function --- src/base/brep_utils.cpp | 9 +++++++++ src/base/brep_utils.h | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/src/base/brep_utils.cpp b/src/base/brep_utils.cpp index f5ac725e..1b2f1197 100644 --- a/src/base/brep_utils.cpp +++ b/src/base/brep_utils.cpp @@ -36,6 +36,15 @@ void BRepUtils::addShape(TopoDS_Shape* ptrTargetShape, const TopoDS_Shape& shape builder.Add(*ptrTargetShape, shape); } +TopoDS_Edge BRepUtils::makeEdge(const Handle(Poly_Polygon3D)& polygon) +{ + TopoDS_Edge edge; + BRep_Builder builder; + builder.MakeEdge(edge); + builder.UpdateEdge(edge, polygon); + return edge; +} + TopoDS_Face BRepUtils::makeFace(const Handle(Poly_Triangulation)& mesh) { TopoDS_Face face; diff --git a/src/base/brep_utils.h b/src/base/brep_utils.h index 98d6952c..76830e89 100644 --- a/src/base/brep_utils.h +++ b/src/base/brep_utils.h @@ -8,7 +8,9 @@ #include "occ_brep_mesh_parameters.h" +#include #include +#include #include #include #include @@ -26,6 +28,9 @@ struct BRepUtils { // Adds 'shape' in target shape 'ptrTargetShape' static void addShape(TopoDS_Shape* ptrTargetShape, const TopoDS_Shape& shape); + // Creates a non-geometric TopoDS_Edge wrapping 'polygon' + static TopoDS_Edge makeEdge(const Handle(Poly_Polygon3D)& polygon); + // Creates a non-geometric TopoDS_Face wrapping triangulation 'mesh' static TopoDS_Face makeFace(const Handle(Poly_Triangulation)& mesh); From fe6c38749ea1f770a84c5bb6c7382cc7ae0676b2 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 22 Nov 2023 11:08:57 +0100 Subject: [PATCH 78/92] IO_Dxf: reader improvements * Fix crash when aci isn't found in XCAFDoc_ColorTool * Refactor support of POLYLINE entities * Centralize handling of common group codes(8, 62) * Fix reading of layers Relates to GitHub #241 --- src/io_dxf/dxf.cpp | 375 +++++++++--------------------------------- src/io_dxf/dxf.h | 66 +++++++- src/io_dxf/io_dxf.cpp | 31 +++- 3 files changed, 172 insertions(+), 300 deletions(-) diff --git a/src/io_dxf/dxf.cpp b/src/io_dxf/dxf.cpp index edcf93c6..853c1aa0 100644 --- a/src/io_dxf/dxf.cpp +++ b/src/io_dxf/dxf.cpp @@ -19,6 +19,8 @@ #include "../base/filepath.h" #include "dxf.h" +#include + namespace { template @@ -31,7 +33,7 @@ class ScopedCLocale { public: ScopedCLocale(int category) : m_category(category), - m_savedLocale(std::setlocale(category, nullptr)) + m_savedLocale(std::setlocale(category, nullptr)) { std::setlocale(category, "C"); } @@ -68,6 +70,17 @@ int stringToInt(const std::string& line) return 0; } +unsigned stringToUnsigned(const std::string& line) +{ + try { + return std::stoul(line); + } catch (...) { + throw std::runtime_error("Failed to fetch unsigned int value from line:\n" + line); + } + + return 0; +} + } // namespace Base::Vector3d toVector3d(const double* a) @@ -138,15 +151,6 @@ void CDxfWrite::endRun() void CDxfWrite::writeHeaderSection() { std::stringstream ss; -#if 0 - ss << "FreeCAD v" - << App::Application::Config()["BuildVersionMajor"] - << "." - << App::Application::Config()["BuildVersionMinor"] - << " " - << App::Application::Config()["BuildRevision"]; -#endif - //header & version m_ofs << "999" << std::endl; m_ofs << ss.str() << std::endl; @@ -1844,7 +1848,7 @@ CDxfRead::CDxfRead(const char* filepath) m_ColorIndex = 0; m_eUnits = eMillimeters; m_measurement_inch = false; - safe_strcpy(m_layer_name, "0"); // Default layer name + m_layer_name = "0"; // Default layer name memset( m_section_name, '\0', sizeof(m_section_name) ); memset( m_block_name, '\0', sizeof(m_block_name) ); m_ignore_errors = true; @@ -1950,11 +1954,6 @@ bool CDxfRead::ReadLine() hidden = false; return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 6: // line style name follows get_line(); if (m_str[0] == 'h' || m_str[0] == 'H') { @@ -2022,16 +2021,6 @@ bool CDxfRead::ReadLine() return false; } break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; - case 100: case 39: case 210: @@ -2041,8 +2030,8 @@ bool CDxfRead::ReadLine() get_line(); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -2082,11 +2071,6 @@ bool CDxfRead::ReadPoint() OnReadPoint(s); return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 10: // start x get_line(); @@ -2118,16 +2102,6 @@ bool CDxfRead::ReadPoint() } break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; - case 100: case 39: case 210: @@ -2137,8 +2111,8 @@ bool CDxfRead::ReadPoint() get_line(); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -2183,11 +2157,6 @@ bool CDxfRead::ReadArc() hidden = false; return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 6: // line style name follows get_line(); if (m_str[0] == 'h' || m_str[0] == 'H') { @@ -2253,16 +2222,6 @@ bool CDxfRead::ReadArc() return false; } break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; - case 100: case 39: @@ -2282,8 +2241,8 @@ bool CDxfRead::ReadArc() break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -2315,25 +2274,12 @@ bool CDxfRead::ReadSpline() } std::istringstream ss; ss.imbue(std::locale::classic()); - switch (n){ + switch (n) { case 0: // next item found, so finish with Spline ResolveColorIndex(); OnReadSpline(sd); return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; case 210: // normal x get_line(); @@ -2567,8 +2513,8 @@ bool CDxfRead::ReadSpline() get_line(); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -2608,11 +2554,6 @@ bool CDxfRead::ReadCircle() } break; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 10: // centre x get_line(); @@ -2653,15 +2594,6 @@ bool CDxfRead::ReadCircle() return false; } break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; case 100: case 39: @@ -2672,8 +2604,8 @@ bool CDxfRead::ReadCircle() get_line(); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -2704,11 +2636,6 @@ void CDxfRead::ReadText() OnReadText(text); } return; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 10: // centre x get_line(); @@ -2748,12 +2675,6 @@ void CDxfRead::ReadText() text.str.append(m_str); break; - case 62: - // color index - get_line(); - m_ColorIndex = stringToInt(m_str); - break; - case 71: { // attachment point get_line(); @@ -2770,8 +2691,8 @@ void CDxfRead::ReadText() case 220: case 230: default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -2801,10 +2722,6 @@ bool CDxfRead::ReadEllipse() ResolveColorIndex(); OnReadEllipse(c, m, ratio, start, end); return true; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; case 10: // centre x @@ -2893,15 +2810,6 @@ bool CDxfRead::ReadEllipse() return false; } break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; case 100: case 210: case 220: @@ -2910,8 +2818,8 @@ bool CDxfRead::ReadEllipse() get_line(); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -2920,7 +2828,7 @@ bool CDxfRead::ReadEllipse() return false; } - +// TODO Remove this(refactoring of CDxfRead::ReadLwPolyLine() static bool poly_prev_found = false; static double poly_prev_x; static double poly_prev_y; @@ -2932,6 +2840,7 @@ static double poly_first_x; static double poly_first_y; static double poly_first_z; +// TODO Remove this(refactoring of CDxfRead::ReadLwPolyLine() static void AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, bool bulge_found, double bulge) { @@ -2977,12 +2886,14 @@ AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, bool bulge_fo } } +// TODO Remove this(refactoring of CDxfRead::ReadLwPolyLine() static void PolyLineStart() { poly_prev_found = false; poly_first_found = false; } +// TODO Reimplement this function(refactoring of CDxfRead::ReadLwPolyLine() bool CDxfRead::ReadLwPolyLine() { PolyLineStart(); @@ -3010,7 +2921,6 @@ bool CDxfRead::ReadLwPolyLine() switch (n){ case 0: // next item found - ResolveColorIndex(); if (x_found && y_found){ // add point @@ -3021,10 +2931,6 @@ bool CDxfRead::ReadLwPolyLine() } next_item_found = true; break; - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; case 10: // x get_line(); @@ -3082,18 +2988,9 @@ bool CDxfRead::ReadLwPolyLine() } closed = ((flags & 1) != 0); break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -3110,22 +3007,10 @@ bool CDxfRead::ReadLwPolyLine() return false; } - -bool CDxfRead::ReadVertex(double *pVertex, bool *bulge_found, double *bulge) +bool CDxfRead::ReadVertex(DxfVertex* vertex) { bool x_found = false; bool y_found = false; - - double x = 0.0; - double y = 0.0; - double z = 0.0; - *bulge = 0.0; - *bulge_found = false; - - pVertex[0] = 0.0; - pVertex[1] = 0.0; - pVertex[2] = 0.0; - while (!m_ifs.eof()) { get_line(); int n; @@ -3133,75 +3018,51 @@ bool CDxfRead::ReadVertex(double *pVertex, bool *bulge_found, double *bulge) this->ReportError_readInteger("DXF::ReadVertex()"); return false; } - std::istringstream ss; - ss.imbue(std::locale::classic()); + switch (n){ case 0: ResolveColorIndex(); put_line(m_str); // read one line too many. put it back. return (x_found && y_found); break; - - case 8: // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; - case 10: // x get_line(); - ss.str(m_str); - ss >> x; - pVertex[0] = mm(x); - if (ss.fail()) { - return false; - } + vertex->point[0] = mm(stringToDouble(m_str)); x_found = true; break; case 20: // y get_line(); - ss.str(m_str); - ss >> y; - pVertex[1] = mm(y); - if (ss.fail()) { - return false; - } + vertex->point[1] = mm(stringToDouble(m_str)); y_found = true; break; case 30: // z get_line(); - ss.str(m_str); - ss >> z; - pVertex[2] = mm(z); - if (ss.fail()) { - return false; - } + vertex->point[2] = mm(stringToDouble(m_str)); break; - case 42: + case 42: { + // bulge get_line(); - *bulge_found = true; - ss.str(m_str); - ss >> *bulge; - if (ss.fail()) { - return false; - } + const int bulge = stringToInt(m_str); + if (bulge == 0) + vertex->bulge = DxfVertex::Bulge::StraightSegment; + else + vertex->bulge = DxfVertex::Bulge::SemiCircle; + } break; - case 62: - // color index + + case 70: + // flags get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } + vertex->flags = stringToUnsigned(m_str); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -3212,15 +3073,8 @@ bool CDxfRead::ReadVertex(double *pVertex, bool *bulge_found, double *bulge) bool CDxfRead::ReadPolyLine() { - PolyLineStart(); - - bool closed = false; - int flags; - bool first_vertex_section_found = false; - double first_vertex[3] = {0,0,0}; - bool bulge_found; - double bulge; - + ScopedCLocale _(LC_NUMERIC); + DxfPolyline polyline; while (!m_ifs.eof()) { get_line(); int n; @@ -3228,58 +3082,32 @@ bool CDxfRead::ReadPolyLine() this->ReportError_readInteger("DXF::ReadPolyLine()"); return false; } - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n){ + + switch (n) { case 0: // next item found ResolveColorIndex(); get_line(); if (!strcmp(m_str, "VERTEX")) { - double vertex[3] = {0,0,0}; - if (CDxfRead::ReadVertex(vertex, &bulge_found, &bulge)) { - if (!first_vertex_section_found) { - first_vertex_section_found = true; - memcpy(first_vertex, vertex, 3*sizeof(double)); - } - AddPolyLinePoint(this, vertex[0], vertex[1], vertex[2], bulge_found, bulge); - break; - } + DxfVertex vertex; + if (ReadVertex(&vertex)) + polyline.vertices.push_back(vertex); } + if (!strcmp(m_str, "SEQEND")) { - if (closed && first_vertex_section_found) { - AddPolyLinePoint(this, - first_vertex[0], - first_vertex[1], - first_vertex[2], - 0, - 0); - } - first_vertex_section_found = false; - PolyLineStart(); - return (true); + OnReadPolyline(polyline); + return true; } + break; case 70: // flags get_line(); - if (sscanf(m_str, "%d", &flags) != 1) { - return false; - } - closed = ((flags & 1) != 0); - break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } + polyline.flags = stringToUnsigned(m_str); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -3376,11 +3204,6 @@ bool CDxfRead::ReadInsert() ResolveColorIndex(); OnReadInsert(c, s, name, rot * M_PI/180); return(true); - case 8: - // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; case 10: // coord x get_line(); @@ -3452,15 +3275,6 @@ bool CDxfRead::ReadInsert() get_line(); strcpy(name, m_str); break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; case 100: case 39: case 210: @@ -3470,8 +3284,8 @@ bool CDxfRead::ReadInsert() get_line(); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -3501,11 +3315,6 @@ bool CDxfRead::ReadDimension() ResolveColorIndex(); OnReadDimension(s, e, p, rot * M_PI/180); return(true); - case 8: - // Layer name follows - get_line(); - safe_strcpy(m_layer_name, m_str); - break; case 13: // start x get_line(); @@ -3605,15 +3414,6 @@ bool CDxfRead::ReadDimension() return false; } break; - case 62: - // color index - get_line(); - ss.str(m_str); - ss >> m_ColorIndex; - if (ss.fail()) { - return false; - } - break; case 100: case 39: case 210: @@ -3623,8 +3423,8 @@ bool CDxfRead::ReadDimension() get_line(); break; default: - // skip the next line get_line(); + HandleCommonGroupCode(n); break; } } @@ -3689,6 +3489,7 @@ void CDxfRead::get_line() } str[j] = 0; safe_strcpy(m_str, str); + ++m_line_nb; } void dxf_strncpy(char* dst, const char* src, size_t size) @@ -3740,7 +3541,7 @@ bool CDxfRead::ReadLayer() std::istringstream ss; ss.imbue(std::locale::classic()); - switch (n){ + switch (n) { case 0: // next item found, so finish with line if (layername.empty()) { this->ReportError_readInteger("DXF::ReadLayer() - no layer name"); @@ -3847,36 +3648,19 @@ bool CDxfRead::ResolveEncoding() } } -#if 0 -const char* CDxfRead::UTF8ToUTF8(const char* encoded) const +void CDxfRead::HandleCommonGroupCode(int n) { - return encoded; -} - -const char* CDxfRead::GeneralToUTF8(const char* encoded) const -{ - Base::PyGILStateLocker lock; - PyObject* decoded = PyUnicode_Decode(encoded, strlen(encoded), m_encoding->c_str(), "strict"); - if (decoded == nullptr) { - return nullptr; - } - Py_ssize_t len; - const char* converted = PyUnicode_AsUTF8AndSize(decoded, &len); - char* result = nullptr; - if (converted != nullptr) { - // converted only has lifetime of decoded so we must save a copy. - result = (char*)malloc(len + 1); - if (result == nullptr) { - PyErr_SetString(PyExc_MemoryError, "Out of memory"); - } - else { - memcpy(result, converted, len + 1); - } + switch (n) { + case 8: + // layer name + m_layer_name = m_str; + break; + case 62: + // color index + m_ColorIndex = stringToInt(m_str); + break; } - Py_DECREF(decoded); - return result; } -#endif void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) { @@ -3888,6 +3672,8 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) get_line(); while (!m_ifs.eof()) { + m_ColorIndex = ColorBylayer; // Default + if (!strcmp(m_str, "$INSUNITS" )) { if (!ReadUnits()) { return; @@ -3923,6 +3709,9 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) if (!strcmp(m_str, "0")) { get_line(); + if (!strcmp(m_str, "0")) + get_line(); // Skip again + if (!strcmp( m_str, "SECTION" )) { safe_strcpy(m_section_name, ""); get_line(); @@ -3939,8 +3728,8 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) } else if (!strcmp( m_str, "LAYER" )) { - get_line(); - get_line(); + //get_line(); + //get_line(); if (!ReadLayer()) { this->ReportError("DXF::DoRead() - Failed to read layer"); //return; Some objects or tables can have "LAYER" as name... @@ -4052,7 +3841,7 @@ void CDxfRead::ResolveColorIndex() if (m_ColorIndex == ColorBylayer) // if color = layer color, replace by color from layer { - m_ColorIndex = m_layer_ColorIndex_map[std::string(m_layer_name)]; + m_ColorIndex = m_layer_ColorIndex_map[m_layer_name]; } } @@ -4089,7 +3878,7 @@ std::string CDxfRead::LayerName() const result.append(" "); } - if (strlen(m_layer_name) > 0) { + if (!m_layer_name.empty()) { result.append(m_layer_name); } diff --git a/src/io_dxf/dxf.h b/src/io_dxf/dxf.h index f38bdacd..9dbbc44e 100644 --- a/src/io_dxf/dxf.h +++ b/src/io_dxf/dxf.h @@ -64,6 +64,60 @@ struct DxfText { AttachmentPoint attachPoint = AttachmentPoint::TopLeft; }; +struct DxfVertex { + enum class Bulge { StraightSegment = 0, SemiCircle = 1 }; + enum Flag { + None = 0, + ExtraVertex = 1, + CurveFitTangent = 2, + NotUsed = 4, + SplineVertex = 8, + SplineFrameControlPoint = 16, + Polyline3dVertex = 32, + Polygon3dVertex = 64, + PolyfaceMesgVertex = 128 + }; + using Flags = unsigned; + + double point[3] = {}; + Bulge bulge = Bulge::StraightSegment; + Flags flags = Flag::None; +}; + +struct DxfPolyline { + enum Flag { + None = 0, + Closed = 1, + CurveFit = 2, + SplineFit = 4, + Polyline3d = 8, + PolygonMesh3d = 16, + PolygonMeshClosedNDir = 32, + PolyfaceMesh = 64, + ContinuousLinetypePattern = 128 + }; + using Flags = unsigned; + + enum Type { + NoSmoothSurfaceFitted = 0, + QuadraticBSplineSurface = 5, + CubicBSplineSurface = 6, + BezierSurface = 8 + }; + + double elevation = 0.; + double thickness = 0.; + Flags flags = Flag::None; + double defaultStartWidth = 0.; + double defaultEndWidth = 0.; + int polygonMeshMVertexCount = 0; + int polygonMeshNVertexCount = 0; + double smoothSurfaceMDensity = 0.; + double smoothSurfaceNDensity = 0.; + double extrusionDir[3] = { 0., 0., 1. }; + std::vector vertices; +}; + //spline data for reading struct SplineData { @@ -327,11 +381,13 @@ class CDxfRead char m_unused_line[1024]; eDxfUnits_t m_eUnits; bool m_measurement_inch; - char m_layer_name[1024]; + std::string m_layer_name; char m_section_name[1024]; char m_block_name[1024]; bool m_ignore_errors; + int m_line_nb = 0; + std::map m_layer_ColorIndex_map; // Mapping from layer name -> layer color index @@ -348,7 +404,8 @@ class CDxfRead bool ReadSpline(); bool ReadLwPolyLine(); bool ReadPolyLine(); - bool ReadVertex(double *pVertex, bool *bulge_found, double *bulge); + bool ReadVertex(DxfVertex* vertex); + void OnReadArc(double start_angle, double end_angle, double radius, @@ -368,6 +425,8 @@ class CDxfRead bool ReadDWGCodePage(); bool ResolveEncoding(); + void HandleCommonGroupCode(int n); + void put_line(const char *value); void ResolveColorIndex(); @@ -407,6 +466,9 @@ class CDxfRead virtual void OnReadLine(const double* /*s*/, const double* /*e*/, bool /*hidden*/) {} + + virtual void OnReadPolyline(const DxfPolyline&) {} + virtual void OnReadPoint(const double* /*s*/) {} virtual void OnReadText(const DxfText&) {} diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index a26effc5..5eb0ad5d 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -95,6 +95,7 @@ class DxfReader::Internal : public CDxfRead { // CDxfRead's virtual functions void OnReadLine(const double* s, const double* e, bool hidden) override; + void OnReadPolyline(const DxfPolyline& polyline) override; void OnReadPoint(const double* s) override; void OnReadText(const DxfText& text) override; void OnReadArc(const double* s, const double* e, const double* c, bool dir, bool hidden) override; @@ -174,7 +175,7 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) return labelShape; }; - auto fnAddAci = [&](ColorIndex_t aci) { + auto fnAddAci = [&](ColorIndex_t aci) -> TDF_Label { auto it = mapAciColorLabel.find(aci); if (it != mapAciColorLabel.cend()) return it->second; @@ -182,7 +183,8 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) if (0 <= aci && CppUtils::cmpLess(aci, std::size(aciTable))) { const RGB_Color& c = aciTable[aci].second; const TDF_Label colorLabel = colorTool->AddColor( - Quantity_Color(c.r / 255., c.g / 255., c.b / 255., Quantity_TOC_RGB)); + Quantity_Color(c.r / 255., c.g / 255., c.b / 255., Quantity_TOC_RGB) + ); mapAciColorLabel.insert({ aci, colorLabel }); return colorLabel; } @@ -203,6 +205,12 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) progress->setValue(MathUtils::toPercent(iShape, 0, shapeCount)); }; + auto fnSetShapeColor = [=](const TDF_Label& labelShape, int aci) { + const TDF_Label labelColor = fnAddAci(aci); + if (!labelColor.IsNull()) + colorTool->SetColor(labelShape, labelColor, XCAFDoc_ColorGen); + }; + if (!m_params.groupLayers) { for (const auto& [layerName, vecEntity] : m_layers) { if (startsWith(layerName, "BLOCKS")) @@ -241,13 +249,13 @@ TDF_LabelSequence DxfReader::transfer(DocumentPtr doc, TaskProgress* progress) } if (uniqueColor) { - colorTool->SetColor(compLabel, fnAddAci(aci), XCAFDoc_ColorGen); + fnSetShapeColor(compLabel, aci); } else { for (const Entity& entity : vecEntity) { if (!entity.shape.IsNull()) { const TDF_Label entityLabel = shapeTool->AddSubShape(compLabel, entity.shape); - colorTool->SetColor(entityLabel, fnAddAci(entity.aci), XCAFDoc_ColorGen); + fnSetShapeColor(entityLabel, entity.aci); } } } @@ -381,6 +389,19 @@ void DxfReader::Internal::OnReadLine(const double* s, const double* e, bool /*hi this->addShape(edge); } +void DxfReader::Internal::OnReadPolyline(const DxfPolyline& polyline) +{ + const auto& vertices = polyline.vertices; + Handle(Poly_Polygon3D) polygon = new Poly_Polygon3D( + CppUtils::safeStaticCast(vertices.size()), + false/*!hasParams*/ + ); + for (unsigned i = 0; i < vertices.size(); ++i) + polygon->ChangeNodes().ChangeValue(i + 1) = this->toPnt(vertices.at(i).point); + + this->addShape(BRepUtils::makeEdge(polygon)); +} + void DxfReader::Internal::OnReadPoint(const double* s) { const TopoDS_Vertex vertex = BRepBuilderAPI_MakeVertex(this->toPnt(s)); @@ -572,7 +593,7 @@ gp_Pnt DxfReader::Internal::toPnt(const double* coords) const double sp1(coords[0]); double sp2(coords[1]); double sp3(coords[2]); - if (m_params.scaling != 1.0) { + if (!MathUtils::fuzzyEqual(m_params.scaling, 1.)) { sp1 = sp1 * m_params.scaling; sp2 = sp2 * m_params.scaling; sp3 = sp3 * m_params.scaling; From 462c900eadbcaaec8a7c10ac77f2ece1004c3ede Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 24 Nov 2023 14:07:19 +0100 Subject: [PATCH 79/92] Base: introduce Polygon3dBuilder helper --- src/base/mesh_utils.cpp | 108 +++++++++++++++++++++++++++++++++++----- src/base/mesh_utils.h | 107 +++++++++++++++++++++++---------------- 2 files changed, 161 insertions(+), 54 deletions(-) diff --git a/src/base/mesh_utils.cpp b/src/base/mesh_utils.cpp index 82ac14a7..0f1166d2 100644 --- a/src/base/mesh_utils.cpp +++ b/src/base/mesh_utils.cpp @@ -6,17 +6,32 @@ #include "mesh_utils.h" #include "math_utils.h" -#include + +#include #include +#include namespace Mayo { +namespace MeshUtils { + +namespace { -double MeshUtils::triangleSignedVolume(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3) +TColStd_Array1OfReal createArray1OfReal(int count) +{ + if (count > 0) + return TColStd_Array1OfReal(1 , count); + else + return TColStd_Array1OfReal(); +} + +} // namespace + +double triangleSignedVolume(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3) { return p1.Dot(p2.Crossed(p3)) / 6.0f; } -double MeshUtils::triangleArea(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3) +double triangleArea(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3) { const double ax = p2.X() - p1.X(); const double ay = p2.Y() - p1.Y(); @@ -30,7 +45,7 @@ double MeshUtils::triangleArea(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& return 0.5 * std::sqrt(cx*cx + cy*cy + cz*cz); } -double MeshUtils::triangulationVolume(const Handle_Poly_Triangulation& triangulation) +double triangulationVolume(const Handle_Poly_Triangulation& triangulation) { if (!triangulation) return 0; @@ -49,7 +64,7 @@ double MeshUtils::triangulationVolume(const Handle_Poly_Triangulation& triangula return std::abs(volume); } -double MeshUtils::triangulationArea(const Handle_Poly_Triangulation& triangulation) +double triangulationArea(const Handle_Poly_Triangulation& triangulation) { if (!triangulation) return 0; @@ -68,7 +83,7 @@ double MeshUtils::triangulationArea(const Handle_Poly_Triangulation& triangulati return area; } -void MeshUtils::setNode(const Handle_Poly_Triangulation& triangulation, int index, const gp_Pnt& pnt) +void setNode(const Handle_Poly_Triangulation& triangulation, int index, const gp_Pnt& pnt) { #if OCC_VERSION_HEX >= 0x070600 triangulation->SetNode(index, pnt); @@ -77,7 +92,7 @@ void MeshUtils::setNode(const Handle_Poly_Triangulation& triangulation, int inde #endif } -void MeshUtils::setTriangle(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangle& triangle) +void setTriangle(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangle& triangle) { #if OCC_VERSION_HEX >= 0x070600 triangulation->SetTriangle(index, triangle); @@ -86,7 +101,7 @@ void MeshUtils::setTriangle(const Handle_Poly_Triangulation& triangulation, int #endif } -void MeshUtils::setNormal(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangulation_NormalType& n) +void setNormal(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangulation_NormalType& n) { #if OCC_VERSION_HEX >= 0x070600 triangulation->SetNormal(index, n); @@ -98,7 +113,7 @@ void MeshUtils::setNormal(const Handle_Poly_Triangulation& triangulation, int in #endif } -void MeshUtils::setUvNode(const Handle_Poly_Triangulation& triangulation, int index, double u, double v) +void setUvNode(const Handle_Poly_Triangulation& triangulation, int index, double u, double v) { #if OCC_VERSION_HEX >= 0x070600 triangulation->SetUVNode(index, gp_Pnt2d{u, v}); @@ -107,7 +122,7 @@ void MeshUtils::setUvNode(const Handle_Poly_Triangulation& triangulation, int in #endif } -void MeshUtils::allocateNormals(const Handle_Poly_Triangulation& triangulation) +void allocateNormals(const Handle_Poly_Triangulation& triangulation) { #if OCC_VERSION_HEX >= 0x070600 triangulation->AddNormals(); @@ -117,8 +132,18 @@ void MeshUtils::allocateNormals(const Handle_Poly_Triangulation& triangulation) #endif } +const Poly_Array1OfTriangle& triangles(const Handle_Poly_Triangulation& triangulation) +{ +#if OCC_VERSION_HEX < 0x070600 + return triangulation->Triangles(); +#else + // Note: Poly_Triangulation::Triangles() was deprecated starting from OpenCascade v7.6.0 + return triangulation->InternalTriangles(); +#endif +} + // Adapted from http://cs.smith.edu/~jorourke/Code/polyorient.C -MeshUtils::Orientation MeshUtils::orientation(const AdaptorPolyline2d& polyline) +MeshUtils::Orientation orientation(const AdaptorPolyline2d& polyline) { const int pntCount = polyline.pointCount(); if (pntCount < 2) @@ -172,7 +197,7 @@ MeshUtils::Orientation MeshUtils::orientation(const AdaptorPolyline2d& polyline) } } -gp_Vec MeshUtils::directionAt(const AdaptorPolyline3d& polyline, int i) +gp_Vec directionAt(const AdaptorPolyline3d& polyline, int i) { const int pntCount = polyline.pointCount(); if (pntCount > 1) { @@ -191,4 +216,63 @@ gp_Vec MeshUtils::directionAt(const AdaptorPolyline3d& polyline, int i) return gp_Vec(); } +Polygon3dBuilder::Polygon3dBuilder(int nodeCount, ParametersOption option) +#if OCC_VERSION_HEX >= 0x070500 + : m_polygon(new Poly_Polygon3D(nodeCount, option == ParametersOption::With)), + m_ptrNodes(&m_polygon->ChangeNodes()), + m_ptrParams(option == ParametersOption::With ? &m_polygon->ChangeParameters() : nullptr) +#else + : m_nodes(1, nodeCount), + m_params(std::move(createArray1OfReal(option == ParametersOption::With ? nodeCount : 0))), + m_ptrNodes(&m_nodes), + m_ptrParams(option == ParametersOption::With ? &m_params : nullptr) +#endif +{ + assert(m_ptrNodes); + assert( + (option == ParametersOption::None && !m_ptrParams) + || (option == ParametersOption::With && m_ptrParams) + ); +} + +void Polygon3dBuilder::setNode(int i, const gp_Pnt &pnt) +{ + if (m_isFinalized) + throw std::runtime_error("Can't call setNode() on finalized Polygon3dBuilder object"); + + m_ptrNodes->ChangeValue(i) = pnt; +} + +void Polygon3dBuilder::setParameter(int i, double u) +{ + if (m_isFinalized) + throw std::runtime_error("Can't call setParameter() on finalized Polygon3dBuilder object"); + + if (m_ptrParams) + m_ptrParams->ChangeValue(i) = u; +} + +void Polygon3dBuilder::finalize() +{ + if (m_isFinalized) + return; + +#if OCC_VERSION_HEX < 0x070500 + if (m_ptrParams) + m_polygon = new Poly_Polygon3D(m_nodes, m_params); + else + m_polygon = new Poly_Polygon3D(m_nodes); +#endif + m_isFinalized = true; +} + +OccHandle Polygon3dBuilder::get() const +{ + if (!m_isFinalized) + throw std::runtime_error("Can't call get() on non finalized Polygon3dBuilder object"); + + return m_polygon; +} + +} // namespace MeshUtils } // namespace Mayo diff --git a/src/base/mesh_utils.h b/src/base/mesh_utils.h index 85aecd00..791045fc 100644 --- a/src/base/mesh_utils.h +++ b/src/base/mesh_utils.h @@ -6,6 +6,9 @@ #pragma once +#include "occ_handle.h" + +#include #include #include class gp_XYZ; @@ -13,56 +16,76 @@ class gp_XYZ; namespace Mayo { // Provides helper functions for mesh and triangle objects -struct MeshUtils { - static double triangleSignedVolume(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3); - static double triangleArea(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3); +namespace MeshUtils { + +double triangleSignedVolume(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3); +double triangleArea(const gp_XYZ& p1, const gp_XYZ& p2, const gp_XYZ& p3); - static double triangulationVolume(const Handle_Poly_Triangulation& triangulation); - static double triangulationArea(const Handle_Poly_Triangulation& triangulation); +double triangulationVolume(const Handle_Poly_Triangulation& triangulation); +double triangulationArea(const Handle_Poly_Triangulation& triangulation); #if OCC_VERSION_HEX >= 0x070600 - using Poly_Triangulation_NormalType = gp_Vec3f; +using Poly_Triangulation_NormalType = gp_Vec3f; #else - using Poly_Triangulation_NormalType = gp_Vec; +using Poly_Triangulation_NormalType = gp_Vec; #endif - static void setNode(const Handle_Poly_Triangulation& triangulation, int index, const gp_Pnt& pnt); - static void setTriangle(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangle& triangle); - static void setNormal(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangulation_NormalType& n); - static void setUvNode(const Handle_Poly_Triangulation& triangulation, int index, double u, double v); - static void allocateNormals(const Handle_Poly_Triangulation& triangulation); +void setNode(const Handle_Poly_Triangulation& triangulation, int index, const gp_Pnt& pnt); +void setTriangle(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangle& triangle); +void setNormal(const Handle_Poly_Triangulation& triangulation, int index, const Poly_Triangulation_NormalType& n); +void setUvNode(const Handle_Poly_Triangulation& triangulation, int index, double u, double v); +void allocateNormals(const Handle_Poly_Triangulation& triangulation); - static const Poly_Array1OfTriangle& triangles(const Handle_Poly_Triangulation& triangulation) { -#if OCC_VERSION_HEX < 0x070600 - return triangulation->Triangles(); -#else - // Note: Poly_Triangulation::Triangles() was deprecated starting from OpenCascade v7.6.0 - return triangulation->InternalTriangles(); +const Poly_Array1OfTriangle& triangles(const Handle_Poly_Triangulation& triangulation); + +enum class Orientation { + Unknown, + Clockwise, + CounterClockwise +}; + +class AdaptorPolyline2d { +public: + virtual gp_Pnt2d pointAt(int index) const = 0; + virtual int pointCount() const = 0; + virtual bool empty() const { return this->pointCount() <= 0; } +}; + +class AdaptorPolyline3d { +public: + virtual const gp_Pnt& pointAt(int i) const = 0; + virtual int pointCount() const = 0; + virtual int empty() const { return this->pointCount() <= 0; } +}; + +Orientation orientation(const AdaptorPolyline2d& polyline); +gp_Vec directionAt(const AdaptorPolyline3d& polyline, int i); + +// Provides helper to create Poly_Polygon3D objects +// Poly_Polygon3D class interface changed from OpenCascade 7.4 to 7.5 version so using this class +// directly might cause compilation errors +// Prefer Polygon3dBuilder so application code doesn't have to care about OpenCascade version +class Polygon3dBuilder { +public: + enum class ParametersOption { None, With }; + + Polygon3dBuilder(int nodeCount, ParametersOption option = ParametersOption::None); + + void setNode(int i, const gp_Pnt& pnt); + void setParameter(int i, double u); + void finalize(); + OccHandle get() const; + +private: + bool m_isFinalized = false; + OccHandle m_polygon; +#if OCC_VERSION_HEX < 0x070500 + TColgp_Array1OfPnt m_nodes; + TColStd_Array1OfReal m_params; #endif - } - - enum class Orientation { - Unknown, - Clockwise, - CounterClockwise - }; - - class AdaptorPolyline2d { - public: - virtual gp_Pnt2d pointAt(int index) const = 0; - virtual int pointCount() const = 0; - virtual bool empty() const { return this->pointCount() <= 0; } - }; - - class AdaptorPolyline3d { - public: - virtual const gp_Pnt& pointAt(int i) const = 0; - virtual int pointCount() const = 0; - virtual int empty() const { return this->pointCount() <= 0; } - }; - - static Orientation orientation(const AdaptorPolyline2d& polyline); - static gp_Vec directionAt(const AdaptorPolyline3d& polyline, int i); + TColgp_Array1OfPnt* m_ptrNodes = nullptr; + TColStd_Array1OfReal* m_ptrParams = nullptr; }; +} // namespace MeshUtils } // namespace Mayo From 92a6afd069cdcab5521ee29af8762b4e9878c3f8 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 24 Nov 2023 14:07:57 +0100 Subject: [PATCH 80/92] IO_Dxf: massive refactoring * Replace char[] members by std::string * Replace double* and double[3] X,Y,Z triplets with DxfCoords struct * Replace sscanf(%d) calls by internal stringToInt() * Replace std::istringstream usage by internal stringToNumeric(m_str) * Factorize X,Y,Z parsing with HandleCoordCode() function * Centralize calls to get_line() by a single call before switch(n) in each Read() function * Rewrite get_line() with C++ code based on std::string --- src/base/property_value_conversion.cpp | 20 +- src/io_dxf/dxf.cpp | 1337 ++++++++---------------- src/io_dxf/dxf.h | 192 ++-- src/io_dxf/io_dxf.cpp | 110 +- 4 files changed, 609 insertions(+), 1050 deletions(-) diff --git a/src/base/property_value_conversion.cpp b/src/base/property_value_conversion.cpp index 4e95b8d6..e44ae8c4 100644 --- a/src/base/property_value_conversion.cpp +++ b/src/base/property_value_conversion.cpp @@ -33,18 +33,18 @@ namespace { static std::string toString(double value, int prec = 6) { #if __cpp_lib_to_chars - char buff[64] = {}; - auto toCharsFormat = std::chars_format::general; - auto resToChars = std::to_chars(std::begin(buff), std::end(buff), value, toCharsFormat, prec); - if (resToChars.ec != std::errc()) - throw std::runtime_error("value_too_large"); + char buff[64] = {}; + auto toCharsFormat = std::chars_format::general; + auto resToChars = std::to_chars(std::begin(buff), std::end(buff), value, toCharsFormat, prec); + if (resToChars.ec != std::errc()) + throw std::runtime_error("value_too_large"); - return std::string(buff, resToChars.ptr - buff); + return std::string(buff, resToChars.ptr - buff); #else - std::stringstream sstr; - sstr.precision(prec); - sstr << value; - return sstr.str(); + std::stringstream sstr; + sstr.precision(prec); + sstr << value; + return sstr.str(); #endif } diff --git a/src/io_dxf/dxf.cpp b/src/io_dxf/dxf.cpp index 853c1aa0..6b6fcdc7 100644 --- a/src/io_dxf/dxf.cpp +++ b/src/io_dxf/dxf.cpp @@ -10,8 +10,12 @@ # define _USE_MATH_DEFINES #endif #include +#include #include #include +#if __cpp_lib_to_chars +# include +#endif #include #include @@ -23,12 +27,6 @@ namespace { -template -void safe_strcpy(char (&dst)[N1], const char (&src)[N2]) -{ - strncpy(dst, src, std::min(N1, N2)); -} - class ScopedCLocale { public: ScopedCLocale(int category) @@ -48,40 +46,93 @@ class ScopedCLocale { const char* m_savedLocale = nullptr; }; -double stringToDouble(const std::string& line) +} // namespace + +namespace DxfPrivate { + +template bool isStringToErrorValue(T value) { - try { - return std::stod(line); - } catch (...) { - throw std::runtime_error("Failed to fetch double value from line:\n" + line); + if constexpr(std::is_same_v) { + return value == std::numeric_limits::max(); + } + else if constexpr(std::is_same_v) { + return value == std::numeric_limits::max(); + } + else if constexpr(std::is_same_v) { + constexpr double dMax = std::numeric_limits::max(); + return std::abs(value - dMax) * 1000000000000. <= std::min(std::abs(value), std::abs(dMax)); + } + else { + return false; } - - return 0.; } -int stringToInt(const std::string& line) +template +T stringToNumeric(const std::string& line, StringToErrorMode errorMode) { +#if __cpp_lib_to_chars + T value; + auto [ptr, err] = std::from_chars(line.c_str(), line.c_str() + line.size(), value); + if (err == std::errc()) + return value; +#else try { - return std::stoi(line); + if constexpr(std::is_same_v) { + return std::stoi(line); + } + else if constexpr(std::is_same_v) { + return std::stoul(line); + } + else if constexpr(std::is_same_v) { + return std::stod(line); + } + else { + if (errorMode == StringToErrorMode::ReturnErrorValue) + return std::numeric_limits::max(); + else + throw std::runtime_error("Failed to fetch numeric value from line:\n" + line); + } } catch (...) { - throw std::runtime_error("Failed to fetch int value from line:\n" + line); +#endif + + if (errorMode == StringToErrorMode::ReturnErrorValue) { + return std::numeric_limits::max(); + } + else { + std::string strTypeName = "?"; + if constexpr(std::is_same_v) + strTypeName = "int"; + else if constexpr(std::is_same_v) + strTypeName = "unsigned"; + else if constexpr(std::is_same_v) + strTypeName = "double"; + + throw std::runtime_error("Failed to fetch " + strTypeName + " value from line:\n" + line); } - return 0; +#ifndef __cpp_lib_to_chars + } +#endif } -unsigned stringToUnsigned(const std::string& line) +int stringToInt(const std::string& line, StringToErrorMode errorMode) { - try { - return std::stoul(line); - } catch (...) { - throw std::runtime_error("Failed to fetch unsigned int value from line:\n" + line); - } + return stringToNumeric(line, errorMode); +} - return 0; +unsigned stringToUnsigned(const std::string& line, StringToErrorMode errorMode) +{ + return stringToNumeric(line, errorMode); } -} // namespace +double stringToDouble(const std::string& line, StringToErrorMode errorMode) +{ + return stringToNumeric(line, errorMode); +} + +} // namespace DxfPrivate + +using namespace DxfPrivate; Base::Vector3d toVector3d(const double* a) { @@ -1842,20 +1893,14 @@ CDxfRead::CDxfRead(const char* filepath) : m_ifs(filepath) { // start the file - memset( m_str, '\0', sizeof(m_str) ); - memset( m_unused_line, '\0', sizeof(m_unused_line) ); m_fail = false; m_ColorIndex = 0; m_eUnits = eMillimeters; m_measurement_inch = false; m_layer_name = "0"; // Default layer name - memset( m_section_name, '\0', sizeof(m_section_name) ); - memset( m_block_name, '\0', sizeof(m_block_name) ); m_ignore_errors = true; m_version = RUnknown; - //m_CodePage = nullptr; - //m_encoding = nullptr; if (!m_ifs) m_fail = true; @@ -1865,11 +1910,9 @@ CDxfRead::CDxfRead(const char* filepath) CDxfRead::~CDxfRead() { - //delete m_CodePage; - //delete m_encoding; } -double CDxfRead::mm( double value ) const +double CDxfRead::mm(double value) const { // re #6461 // this if handles situation of malformed DXF file where @@ -1931,95 +1974,42 @@ double CDxfRead::mm( double value ) const bool CDxfRead::ReadLine() { - double s[3] = {0, 0, 0}; - double e[3] = {0, 0, 0}; + DxfCoords s = {}; + DxfCoords e = {}; bool hidden = false; while (!m_ifs.eof()) { get_line(); - int n; - - if (sscanf(m_str, "%d", &n) != 1) { - this->ReportError_readInteger("DXF::ReadLine()"); - return false; - } - - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n){ - case 0: + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { // next item found, so finish with line ResolveColorIndex(); OnReadLine(s, e, hidden); - hidden = false; return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadLine()"); + return false; + } + get_line(); + switch (n) { case 6: // line style name follows - get_line(); - if (m_str[0] == 'h' || m_str[0] == 'H') { + if (!m_str.empty() && (m_str[0] == 'h' || m_str[0] == 'H')) { hidden = true; } break; - case 10: - // start x - get_line(); - ss.str(m_str); - ss >> s[0]; - s[0] = mm(s[0]); - if (ss.fail()) { - return false; - } - break; case 20: - // start y - get_line(); - ss.str(m_str); - ss >> s[1]; - s[1] = mm(s[1]); - if (ss.fail()) { - return false; - } - break; case 30: - // start z - get_line(); - ss.str(m_str); - ss >> s[2]; - s[2] = mm(s[2]); - if (ss.fail()) { - return false; - } + // start coords + HandleCoordCode(n, &s); break; case 11: - // end x - get_line(); - ss.str(m_str); - ss >> e[0]; - e[0] = mm(e[0]); - if (ss.fail()) { - return false; - } - break; case 21: - // end y - get_line(); - ss.str(m_str); - ss >> e[1]; - e[1] = mm(e[1]); - if (ss.fail()) { - return false; - } - break; case 31: - // end z - get_line(); - ss.str(m_str); - ss >> e[2]; - e[2] = mm(e[2]); - if (ss.fail()) { - return false; - } + // end coords + HandleCoordCode<11, 21, 31>(n, &e); break; case 100: case 39: @@ -2027,10 +2017,8 @@ bool CDxfRead::ReadLine() case 220: case 230: // skip the next line - get_line(); break; default: - get_line(); HandleCommonGroupCode(n); break; } @@ -2051,55 +2039,29 @@ bool CDxfRead::ReadLine() bool CDxfRead::ReadPoint() { - double s[3] = {0, 0, 0}; + DxfCoords s = {}; while (!m_ifs.eof()) { get_line(); - int n; - - if (sscanf(m_str, "%d", &n) != 1) { - this->ReportError_readInteger("DXF::ReadPoint()"); - return false; - } - - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n){ - case 0: + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { // next item found, so finish with line ResolveColorIndex(); OnReadPoint(s); return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadPoint()"); + return false; + } + get_line(); + switch (n){ case 10: - // start x - get_line(); - ss.str(m_str); - ss >> s[0]; - s[0] = mm(s[0]); - if (ss.fail()) { - return false; - } - break; case 20: - // start y - get_line(); - ss.str(m_str); - ss >> s[1]; - s[1] = mm(s[1]); - if (ss.fail()) { - return false; - } - break; case 30: - // start z - get_line(); - ss.str(m_str); - ss >> s[2]; - s[2] = mm(s[2]); - if (ss.fail()) { - return false; - } + // start coords + HandleCoordCode(n, &s); break; case 100: @@ -2108,10 +2070,8 @@ bool CDxfRead::ReadPoint() case 220: case 230: // skip the next line - get_line(); break; default: - get_line(); HandleCommonGroupCode(n); break; } @@ -2135,92 +2095,50 @@ bool CDxfRead::ReadArc() double start_angle = 0.0;// in degrees double end_angle = 0.0; double radius = 0.0; - double c[3] = {0,0,0}; // centre + DxfCoords c = {}; // centre double z_extrusion_dir = 1.0; bool hidden = false; while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { - this->ReportError_readInteger("DXF::ReadArc()"); - return false; - } - - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n){ - case 0: + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { // next item found, so finish with arc ResolveColorIndex(); - OnReadArc(start_angle, end_angle, radius, c,z_extrusion_dir, hidden); + OnReadArc(start_angle, end_angle, radius, c, z_extrusion_dir, hidden); hidden = false; return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadArc()"); + return false; + } + get_line(); + switch (n){ case 6: // line style name follows - get_line(); - if (m_str[0] == 'h' || m_str[0] == 'H') { + if (!m_str.empty() && (m_str[0] == 'h' || m_str[0] == 'H')) { hidden = true; } break; case 10: - // centre x - get_line(); - ss.str(m_str); - ss >> c[0]; - c[0] = mm(c[0]); - if (ss.fail()) { - return false; - } - break; case 20: - // centre y - get_line(); - ss.str(m_str); - ss >> c[1]; - c[1] = mm(c[1]); - if (ss.fail()) { - return false; - } - break; case 30: - // centre z - get_line(); - ss.str(m_str); - ss >> c[2]; - c[2] = mm(c[2]); - if (ss.fail()) { - return false; - } + // centre coords + HandleCoordCode(n, &c); break; case 40: // radius - get_line(); - ss.str(m_str); - ss >> radius; - radius = mm(radius); - if (ss.fail()) { - return false; - } + radius = mm(stringToDouble(m_str)); break; case 50: // start angle - get_line(); - ss.str(m_str); - ss >> start_angle; - if (ss.fail()) { - return false; - } + start_angle = mm(stringToDouble(m_str)); break; case 51: // end angle - get_line(); - ss.str(m_str); - ss >> end_angle; - if (ss.fail()) { - return false; - } + end_angle = mm(stringToDouble(m_str)); break; case 100: @@ -2228,24 +2146,18 @@ bool CDxfRead::ReadArc() case 210: case 220: // skip the next line - get_line(); break; case 230: //Z extrusion direction for arc - get_line(); - ss.str(m_str); - ss >> z_extrusion_dir; - if (ss.fail()) { - return false; - } + z_extrusion_dir = mm(stringToDouble(m_str)); break; default: - get_line(); HandleCommonGroupCode(n); break; } } + ResolveColorIndex(); OnReadArc(start_angle, end_angle, radius, c, z_extrusion_dir, false); return false; @@ -2254,270 +2166,122 @@ bool CDxfRead::ReadArc() bool CDxfRead::ReadSpline() { struct SplineData sd; - sd.norm[0] = 0; - sd.norm[1] = 0; - sd.norm[2] = 1; + sd.norm = {0., 0., 1.}; sd.degree = 0; sd.knots = 0; sd.flag = 0; sd.control_points = 0; sd.fit_points = 0; - double temp_double; - while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { - this->ReportError_readInteger("DXF::ReadSpline()"); - return false; - } - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n) { - case 0: + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { // next item found, so finish with Spline ResolveColorIndex(); OnReadSpline(sd); return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadSpline()"); + return false; + } + + get_line(); + switch (n) { case 210: - // normal x - get_line(); - ss.str(m_str); - ss >> sd.norm[0]; - if (ss.fail()) { - return false; - } - break; case 220: - // normal y - get_line(); - ss.str(m_str); - ss >> sd.norm[1]; - if (ss.fail()) { - return false; - } - break; case 230: - // normal z - get_line(); - ss.str(m_str); - ss >> sd.norm[2]; - if (ss.fail()) { - return false; - } + // normal coords + HandleCoordCode<210, 220, 230>(n, &sd.norm); break; case 70: // flag - get_line(); - ss.str(m_str); - ss >> sd.flag; - if (ss.fail()) { - return false; - } + sd.flag = stringToInt(m_str); break; case 71: // degree - get_line(); - ss.str(m_str); - ss >> sd.degree; - if (ss.fail()) { - return false; - } + sd.degree = stringToInt(m_str); break; case 72: // knots - get_line(); - ss.str(m_str); - ss >> sd.knots; - if (ss.fail()) { - return false; - } + sd.knots = stringToInt(m_str); break; case 73: // control points - get_line(); - ss.str(m_str); - ss >> sd.control_points; - if (ss.fail()) { - return false; - } + sd.control_points = stringToInt(m_str); break; case 74: // fit points - get_line(); - ss.str(m_str); - ss >> sd.fit_points; - if (ss.fail()) { - return false; - } + sd.fit_points = stringToInt(m_str); break; case 12: // starttan x - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.starttanx.push_back(temp_double); + sd.starttanx.push_back(mm(stringToDouble(m_str))); break; case 22: // starttan y - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.starttany.push_back(temp_double); + sd.starttany.push_back(mm(stringToDouble(m_str))); break; case 32: // starttan z - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.starttanz.push_back(temp_double); + sd.starttanz.push_back(mm(stringToDouble(m_str))); break; case 13: // endtan x - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.endtanx.push_back(temp_double); + sd.endtanx.push_back(mm(stringToDouble(m_str))); break; case 23: // endtan y - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.endtany.push_back(temp_double); + sd.endtany.push_back(mm(stringToDouble(m_str))); break; case 33: // endtan z - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.endtanz.push_back(temp_double); + sd.endtanz.push_back(mm(stringToDouble(m_str))); break; case 40: // knot - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.knot.push_back(temp_double); + sd.knot.push_back(mm(stringToDouble(m_str))); break; case 41: // weight - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.weight.push_back(temp_double); + sd.weight.push_back(mm(stringToDouble(m_str))); break; case 10: // control x - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.controlx.push_back(temp_double); + sd.controlx.push_back(mm(stringToDouble(m_str))); break; case 20: // control y - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.controly.push_back(temp_double); + sd.controly.push_back(mm(stringToDouble(m_str))); break; case 30: // control z - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.controlz.push_back(temp_double); + sd.controlz.push_back(mm(stringToDouble(m_str))); break; case 11: // fit x - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.fitx.push_back(temp_double); + sd.fitx.push_back(mm(stringToDouble(m_str))); break; case 21: // fit y - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.fity.push_back(temp_double); + sd.fity.push_back(mm(stringToDouble(m_str))); break; case 31: // fit z - get_line(); - ss.str(m_str); - ss >> temp_double; - temp_double = mm(temp_double); - if (ss.fail()) { - return false; - } - sd.fitz.push_back(temp_double); + sd.fitz.push_back(mm(stringToDouble(m_str))); break; case 42: case 43: case 44: // skip the next line - get_line(); break; default: - get_line(); HandleCommonGroupCode(n); break; } } + ResolveColorIndex(); OnReadSpline(sd); return false; @@ -2527,72 +2291,39 @@ bool CDxfRead::ReadSpline() bool CDxfRead::ReadCircle() { double radius = 0.0; - double c[3] = {0,0,0}; // centre + DxfCoords c = {}; // centre bool hidden = false; while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { - this->ReportError_readInteger("DXF::ReadCircle()"); - return false; - } - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n){ - case 0: + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { // next item found, so finish with Circle ResolveColorIndex(); OnReadCircle(c, radius, hidden); - hidden = false; return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadCircle()"); + return false; + } + get_line(); + switch (n){ case 6: // line style name follows - get_line(); - if (m_str[0] == 'h' || m_str[0] == 'H') { + if (!m_str.empty() && (m_str[0] == 'h' || m_str[0] == 'H')) { hidden = true; } break; - case 10: - // centre x - get_line(); - ss.str(m_str); - ss >> c[0]; - c[0] = mm(c[0]); - if (ss.fail()) { - return false; - } - break; case 20: - // centre y - get_line(); - ss.str(m_str); - ss >> c[1]; - c[1] = mm(c[1]); - if (ss.fail()) { - return false; - } - break; case 30: - // centre z - get_line(); - ss.str(m_str); - ss >> c[2]; - c[2] = mm(c[2]); - if (ss.fail()) { - return false; - } + // centre coords + HandleCoordCode(n, &c); break; case 40: // radius - get_line(); - ss.str(m_str); - ss >> radius; - radius = mm(radius); - if (ss.fail()) { - return false; - } + radius = mm(stringToDouble(m_str)); break; case 100: @@ -2601,14 +2332,13 @@ bool CDxfRead::ReadCircle() case 220: case 230: // skip the next line - get_line(); break; default: - get_line(); HandleCommonGroupCode(n); break; } } + ResolveColorIndex(); OnReadCircle(c, radius, false); return false; @@ -2616,49 +2346,38 @@ bool CDxfRead::ReadCircle() void CDxfRead::ReadText() { - ScopedCLocale _(LC_NUMERIC); - DxfText text; while (!m_ifs.eof()) { get_line(); const int n = stringToInt(m_str); - switch (n) { - case 0: + if (n == 0) { ResolveColorIndex(); - { - size_t pos = text.str.find("\\P", 0); - while (pos != std::string::npos) { - text.str.replace(pos, 2, "\n"); - pos = text.str.find("\\P", pos + 1); - } - - text.str = this->toUtf8(text.str); - OnReadText(text); + // Replace \P by \n + size_t pos = text.str.find("\\P", 0); + while (pos != std::string::npos) { + text.str.replace(pos, 2, "\n"); + pos = text.str.find("\\P", pos + 1); } + + text.str = this->toUtf8(text.str); + OnReadText(text); return; + } + + get_line(); + switch (n) { case 10: - // centre x - get_line(); - text.point[0] = mm(stringToDouble(m_str)); - break; case 20: - // centre y - get_line(); - text.point[1] = mm(stringToDouble(m_str)); - break; case 30: - // centre z - get_line(); - text.point[2] = mm(stringToDouble(m_str)); + // centre coords + HandleCoordCode(n, &text.point); break; case 40: // text height - get_line(); text.height = mm(stringToDouble(m_str)) * 25.4 / 72.0; break; case 50: // text rotation - get_line(); text.rotation = stringToDouble(m_str); break; case 3: @@ -2666,18 +2385,15 @@ void CDxfRead::ReadText() // Note that if breaking the text into type-3 records splits a UFT-8 encoding we do // the decoding after splicing the lines together. I'm not sure if this actually // occurs, but handling the text this way will treat this condition properly. - get_line(); text.str.append(m_str); break; case 1: // final text - get_line(); text.str.append(m_str); break; case 71: { // attachment point - get_line(); const int ap = stringToInt(m_str); if (ap >= 1 && ap <= 9) { text.attachPoint = static_cast(ap); @@ -2691,7 +2407,6 @@ void CDxfRead::ReadText() case 220: case 230: default: - get_line(); HandleCommonGroupCode(n); break; } @@ -2701,128 +2416,64 @@ void CDxfRead::ReadText() bool CDxfRead::ReadEllipse() { - double c[3] = {0,0,0}; // centre - double m[3] = {0,0,0}; //major axis point - double ratio=0; //ratio of major to minor axis - double start=0; //start of arc - double end=0; // end of arc + DxfCoords c = {}; // centre + DxfCoords m = {}; //major axis point + double ratio = 0; //ratio of major to minor axis + double start = 0; //start of arc + double end = 0; // end of arc while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { - this->ReportError_readInteger("DXF::ReadEllipse()"); - return false; - } - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n){ - case 0: + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { // next item found, so finish with Ellipse ResolveColorIndex(); OnReadEllipse(c, m, ratio, start, end); return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadEllipse()"); + return false; + } + get_line(); + switch (n) { case 10: - // centre x - get_line(); - ss.str(m_str); - ss >> c[0]; - c[0] = mm(c[0]); - if (ss.fail()) { - return false; - } - break; case 20: - // centre y - get_line(); - ss.str(m_str); - ss >> c[1]; - c[1] = mm(c[1]); - if (ss.fail()) { - return false; - } - break; case 30: - // centre z - get_line(); - ss.str(m_str); - ss >> c[2]; - c[2] = mm(c[2]); - if (ss.fail()) { - return false; - } + // centre coords + HandleCoordCode(n, &c); break; case 11: - // major x - get_line(); - ss.str(m_str); - ss >> m[0]; - m[0] = mm(m[0]); - if (ss.fail()) { - return false; - } - break; case 21: - // major y - get_line(); - ss.str(m_str); - ss >> m[1]; - m[1] = mm(m[1]); - if (ss.fail()) { - return false; - } - break; case 31: - // major z - get_line(); - ss.str(m_str); - ss >> m[2]; - m[2] = mm(m[2]); - if (ss.fail()) { - return false; - } + // major coords + HandleCoordCode<11, 21, 31>(n, &m); break; case 40: // ratio - get_line(); - ss.str(m_str); - ss >> ratio; - if (ss.fail()) { - return false; - } + ratio = stringToDouble(m_str); break; case 41: // start - get_line(); - ss.str(m_str); - ss >> start; - if (ss.fail()) { - return false; - } + start = stringToDouble(m_str); break; case 42: // end - get_line(); - ss.str(m_str); - ss >> end; - if (ss.fail()) { - return false; - } + end = stringToDouble(m_str); break; case 100: case 210: case 220: case 230: // skip the next line - get_line(); break; default: - get_line(); HandleCommonGroupCode(n); break; } } + ResolveColorIndex(); OnReadEllipse(c, m, ratio, start, end); return false; @@ -2852,16 +2503,16 @@ AddPolyLinePoint(CDxfRead* dxf_read, double x, double y, double z, bool bulge_fo double cot = 0.5 * ((1.0 / poly_prev_bulge) - poly_prev_bulge); double cx = ((poly_prev_x + x) - ((y - poly_prev_y) * cot)) / 2.0; double cy = ((poly_prev_y + y) + ((x - poly_prev_x) * cot)) / 2.0; - double ps[3] = {poly_prev_x, poly_prev_y, poly_prev_z}; - double pe[3] = {x, y, z}; - double pc[3] = {cx, cy, (poly_prev_z + z)/2.0}; + const DxfCoords ps = {poly_prev_x, poly_prev_y, poly_prev_z}; + const DxfCoords pe = {x, y, z}; + const DxfCoords pc = {cx, cy, (poly_prev_z + z)/2.0}; dxf_read->OnReadArc(ps, pe, pc, poly_prev_bulge >= 0, false); arc_done = true; } if (!arc_done) { - double s[3] = {poly_prev_x, poly_prev_y, poly_prev_z}; - double e[3] = {x, y, z}; + const DxfCoords s = {poly_prev_x, poly_prev_y, poly_prev_z}; + const DxfCoords e = {x, y, z}; dxf_read->OnReadLine(s, e, false); } } @@ -2911,11 +2562,12 @@ bool CDxfRead::ReadLwPolyLine() while (!m_ifs.eof() && !next_item_found) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { + const int n = stringToInt(m_str); + if (isStringToErrorValue(n)) { this->ReportError_readInteger("DXF::ReadLwPolyLine()"); return false; } + std::istringstream ss; ss.imbue(std::locale::classic()); switch (n){ @@ -2983,9 +2635,7 @@ bool CDxfRead::ReadLwPolyLine() case 70: // flags get_line(); - if (sscanf(m_str, "%d", &flags) != 1) { - return false; - } + flags = stringToInt(m_str); closed = ((flags & 1) != 0); break; default: @@ -3013,39 +2663,29 @@ bool CDxfRead::ReadVertex(DxfVertex* vertex) bool y_found = false; while (!m_ifs.eof()) { get_line(); - int n; - if(sscanf(m_str, "%d", &n) != 1) { + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { + ResolveColorIndex(); + put_line(m_str); // read one line too many. put it back. + return x_found && y_found; + } + else if (isStringToErrorValue(n)) { this->ReportError_readInteger("DXF::ReadVertex()"); return false; } + get_line(); switch (n){ - case 0: - ResolveColorIndex(); - put_line(m_str); // read one line too many. put it back. - return (x_found && y_found); - break; case 10: - // x - get_line(); - vertex->point[0] = mm(stringToDouble(m_str)); - x_found = true; - break; case 20: - // y - get_line(); - vertex->point[1] = mm(stringToDouble(m_str)); - y_found = true; - break; case 30: - // z - get_line(); - vertex->point[2] = mm(stringToDouble(m_str)); + // coords + x_found = x_found || n == 10; + y_found = y_found || n == 20; + HandleCoordCode(n, &vertex->point); break; - case 42: { // bulge - get_line(); const int bulge = stringToInt(m_str); if (bulge == 0) vertex->bulge = DxfVertex::Bulge::StraightSegment; @@ -3053,15 +2693,11 @@ bool CDxfRead::ReadVertex(DxfVertex* vertex) vertex->bulge = DxfVertex::Bulge::SemiCircle; } break; - case 70: // flags - get_line(); vertex->flags = stringToUnsigned(m_str); break; - default: - get_line(); HandleCommonGroupCode(n); break; } @@ -3073,28 +2709,27 @@ bool CDxfRead::ReadVertex(DxfVertex* vertex) bool CDxfRead::ReadPolyLine() { - ScopedCLocale _(LC_NUMERIC); DxfPolyline polyline; while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (isStringToErrorValue(n)) { this->ReportError_readInteger("DXF::ReadPolyLine()"); return false; } + get_line(); switch (n) { case 0: // next item found ResolveColorIndex(); - get_line(); - if (!strcmp(m_str, "VERTEX")) { + if (m_str == "VERTEX") { DxfVertex vertex; if (ReadVertex(&vertex)) - polyline.vertices.push_back(vertex); + polyline.vertices.push_back(std::move(vertex)); } - if (!strcmp(m_str, "SEQEND")) { + if (m_str == "SEQEND") { OnReadPolyline(polyline); return true; } @@ -3102,11 +2737,9 @@ bool CDxfRead::ReadPolyLine() break; case 70: // flags - get_line(); polyline.flags = stringToUnsigned(m_str); break; default: - get_line(); HandleCommonGroupCode(n); break; } @@ -3118,162 +2751,117 @@ bool CDxfRead::ReadPolyLine() void CDxfRead::OnReadArc(double start_angle, double end_angle, double radius, - const double* c, + const DxfCoords& c, double z_extrusion_dir, bool hidden) { - double s[3] = {0, 0, 0}, e[3] = {0, 0, 0}, temp[3] = {0, 0, 0}; + DxfCoords s = {}; + DxfCoords e = {}; + DxfCoords temp = {}; if (z_extrusion_dir == 1.0) { - temp[0] = c[0]; - temp[1] = c[1]; - temp[2] = c[2]; - s[0] = c[0] + radius * cos(start_angle * M_PI / 180); - s[1] = c[1] + radius * sin(start_angle * M_PI / 180); - s[2] = c[2]; - e[0] = c[0] + radius * cos(end_angle * M_PI / 180); - e[1] = c[1] + radius * sin(end_angle * M_PI / 180); - e[2] = c[2]; + temp.x = c.x; + temp.y = c.y; + temp.z = c.z; + s.x = c.x + radius * cos(start_angle * M_PI / 180); + s.y = c.y + radius * sin(start_angle * M_PI / 180); + s.z = c.z; + e.x = c.x + radius * cos(end_angle * M_PI / 180); + e.y = c.y + radius * sin(end_angle * M_PI / 180); + e.z = c.z; } else { - temp[0] =-c[0]; - temp[1] =c[1]; - temp[2] =c[2]; + temp.x = -c.x; + temp.y = c.y; + temp.z = c.z; - e[0] = -(c[0] + radius * cos(start_angle * M_PI/180)); - e[1] = (c[1] + radius * sin(start_angle * M_PI/180)); - e[2] = c[2]; - s[0] = -(c[0] + radius * cos(end_angle * M_PI/180)); - s[1] = (c[1] + radius * sin(end_angle * M_PI/180)); - s[2] = c[2]; + e.x = -(c.x + radius * cos(start_angle * M_PI/180)); + e.y = (c.y + radius * sin(start_angle * M_PI/180)); + e.z = c.z; + s.x = -(c.x + radius * cos(end_angle * M_PI/180)); + s.y = (c.y + radius * sin(end_angle * M_PI/180)); + s.z = c.z; } + OnReadArc(s, e, temp, true, hidden); } -void CDxfRead::OnReadCircle(const double* c, double radius, bool hidden) +void CDxfRead::OnReadCircle(const DxfCoords& c, double radius, bool hidden) { - double s[3]; - double start_angle = 0; - s[0] = c[0] + radius * cos(start_angle * M_PI / 180); - s[1] = c[1] + radius * sin(start_angle * M_PI / 180); - s[2] = c[2]; + constexpr double start_angle = 0; + const DxfCoords s = { + c.x + radius * cos(start_angle * M_PI / 180), + c.y + radius * sin(start_angle * M_PI / 180), + c.z + }; - OnReadCircle(s, - c, - false, - hidden); // false to change direction because otherwise the arc length is zero + const bool dir = false; // 'false' to change direction because otherwise the arc length is zero + OnReadCircle(s, c, dir, hidden); } -void CDxfRead::OnReadEllipse(const double* c, - const double* m, +void CDxfRead::OnReadEllipse(const DxfCoords& c, + const DxfCoords& m, double ratio, double start_angle, double end_angle) { - double major_radius = sqrt(m[0] * m[0] + m[1] * m[1] + m[2] * m[2]); - double minor_radius = major_radius * ratio; + const double major_radius = sqrt(m.x * m.x + m.y * m.y + m.z * m.z); + const double minor_radius = major_radius * ratio; // Since we only support 2d stuff, we can calculate the rotation from the major axis x and y // value only, since z is zero, major_radius is the vector length - double rotation = atan2(m[1] / major_radius, m[0] / major_radius); - - + const double rotation = atan2(m.y / major_radius, m.x / major_radius); OnReadEllipse(c, major_radius, minor_radius, rotation, start_angle, end_angle, true); } - bool CDxfRead::ReadInsert() { - double c[3] = {0,0,0}; // coordinate - double s[3] = {1,1,1}; // scale + DxfCoords c = {}; // coordinate + DxfScale s = {1., 1., 1.}; // scale double rot = 0.0; // rotation - char name[1024] = {0}; + std::string name; while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { + // next item found + ResolveColorIndex(); + OnReadInsert(c, s, name, rot * M_PI/180); + return true; + } + else if (isStringToErrorValue(n)) { this->ReportError_readInteger("DXF::ReadInsert()"); return false; } - std::istringstream ss; - ss.imbue(std::locale::classic()); + + get_line(); switch (n){ - case 0: - // next item found - ResolveColorIndex(); - OnReadInsert(c, s, name, rot * M_PI/180); - return(true); case 10: - // coord x - get_line(); - ss.str(m_str); - ss >> c[0]; - c[0] = mm(c[0]); - if (ss.fail()) { - return false; - } - break; case 20: - // coord y - get_line(); - ss.str(m_str); - ss >> c[1]; - c[1] = mm(c[1]); - if (ss.fail()) { - return false; - } - break; case 30: - // coord z - get_line(); - ss.str(m_str); - ss >> c[2]; - c[2] = mm(c[2]); - if (ss.fail()) { - return false; - } + // 3d coords + HandleCoordCode(n, &c); break; case 41: // scale x - get_line(); - ss.str(m_str); - ss >> s[0]; - if (ss.fail()) { - return false; - } + s.x = stringToDouble(m_str); break; case 42: // scale y - get_line(); - ss.str(m_str); - ss >> s[1]; - if (ss.fail()) { - return false; - } + s.y = stringToDouble(m_str); break; case 43: // scale z - get_line(); - ss.str(m_str); - ss >> s[2]; - if (ss.fail()) { - return false; - } + s.z = stringToDouble(m_str); break; case 50: // rotation - get_line(); - ss.str(m_str); - ss >> rot; - if (ss.fail()) { - return false; - } + rot = stringToDouble(m_str); break; case 2: // block name - get_line(); - strcpy(name, m_str); + name = m_str; break; case 100: case 39: @@ -3281,138 +2869,60 @@ bool CDxfRead::ReadInsert() case 220: case 230: // skip the next line - get_line(); break; default: - get_line(); HandleCommonGroupCode(n); break; } } + return false; } - bool CDxfRead::ReadDimension() { - double s[3] = {0,0,0}; // startpoint - double e[3] = {0,0,0}; // endpoint - double p[3] = {0,0,0}; // dimpoint + DxfCoords s = {}; // startpoint + DxfCoords e = {}; // endpoint + DxfCoords p = {}; // dimpoint double rot = -1.0; // rotation while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { + // next item found + ResolveColorIndex(); + OnReadDimension(s, e, p, rot * M_PI/180); + return true; + } + else if (isStringToErrorValue(n)) { this->ReportError_readInteger("DXF::ReadDimension()"); return false; } - std::istringstream ss; - ss.imbue(std::locale::classic()); + + get_line(); switch (n){ - case 0: - // next item found - ResolveColorIndex(); - OnReadDimension(s, e, p, rot * M_PI/180); - return(true); case 13: - // start x - get_line(); - ss.str(m_str); - ss >> s[0]; - s[0] = mm(s[0]); - if (ss.fail()) { - return false; - } - break; case 23: - // start y - get_line(); - ss.str(m_str); - ss >> s[1]; - s[1] = mm(s[1]); - if (ss.fail()) { - return false; - } - break; case 33: - // start z - get_line(); - ss.str(m_str); - ss >> s[2]; - s[2] = mm(s[2]); - if (ss.fail()) { - return false; - } + // start coords + HandleCoordCode<13, 23, 33>(n, &s); break; case 14: - // end x - get_line(); - ss.str(m_str); - ss >> e[0]; - e[0] = mm(e[0]); - if (ss.fail()) { - return false; - } - break; case 24: - // end y - get_line(); - ss.str(m_str); - ss >> e[1]; - e[1] = mm(e[1]); - if (ss.fail()) { - return false; - } - break; case 34: - // end z - get_line(); - ss.str(m_str); - ss >> e[2]; - e[2] = mm(e[2]); - if (ss.fail()) { - return false; - } + // end coords + HandleCoordCode<14, 24, 34>(n, &e); break; case 10: - // dimline x - get_line(); - ss.str(m_str); - ss >> p[0]; - p[0] = mm(p[0]); - if (ss.fail()) { - return false; - } - break; case 20: - // dimline y - get_line(); - ss.str(m_str); - ss >> p[1]; - p[1] = mm(p[1]); - if (ss.fail()) { - return false; - } - break; case 30: - // dimline z - get_line(); - ss.str(m_str); - ss >> p[2]; - p[2] = mm(p[2]); - if (ss.fail()) { - return false; - } + // dimline coords + HandleCoordCode<10, 20, 30>(n, &p); break; case 50: // rotation - get_line(); - ss.str(m_str); - ss >> rot; - if (ss.fail()) { - return false; - } + rot = stringToDouble(m_str); break; case 100: case 39: @@ -3420,14 +2930,13 @@ bool CDxfRead::ReadDimension() case 220: case 230: // skip the next line - get_line(); break; default: - get_line(); HandleCommonGroupCode(n); break; } } + return false; } @@ -3436,95 +2945,75 @@ bool CDxfRead::ReadBlockInfo() { while (!m_ifs.eof()) { get_line(); - int n; - if (sscanf(m_str, "%d", &n) != 1) { + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (isStringToErrorValue(n)) { this->ReportError_readInteger("DXF::ReadBlockInfo()"); return false; } - std::istringstream ss; - ss.imbue(std::locale::classic()); + + get_line(); switch (n){ case 2: // block name - get_line(); - safe_strcpy(m_block_name, m_str); + m_block_name = m_str; return true; case 3: // block name too??? - get_line(); - safe_strcpy(m_block_name, m_str); + m_block_name = m_str; return true; default: // skip the next line - get_line(); break; } } + return false; } - void CDxfRead::get_line() { - if (m_unused_line[0] != '\0') { - safe_strcpy(m_str, m_unused_line); - memset(m_unused_line, '\0', sizeof(m_unused_line)); + if (!m_unused_line.empty()) { + m_str = m_unused_line; + m_unused_line.clear(); return; } - m_ifs.getline(m_str, 1024); - - char str[1024]; - size_t len = strlen(m_str); - int j = 0; - bool non_white_found = false; - for (size_t i = 0; i < len; i++) { - if (non_white_found || (m_str[i] != ' ' && m_str[i] != '\t')) { - if (m_str[i] != '\r') { - str[j] = m_str[i]; - j++; - } - non_white_found = true; - } - } - str[j] = 0; - safe_strcpy(m_str, str); + std::getline(m_ifs, m_str); + m_gcount = m_str.size(); ++m_line_nb; -} -void dxf_strncpy(char* dst, const char* src, size_t size) -{ - size_t ret = strlen(src); + // Erase leading whitespace characters + auto itNonSpace = m_str.begin(); + while (itNonSpace != m_str.end()) { + if (!std::isspace(*itNonSpace)) + break; - if (size) { - size_t len = (ret >= size) ? size - 1 : ret; - memcpy(dst, src, len); - dst[len] = '\0'; + ++itNonSpace; } + + m_str.erase(m_str.begin(), itNonSpace); } -void CDxfRead::put_line(const char *value) +void CDxfRead::put_line(const std::string& value) { - dxf_strncpy( m_unused_line, value, sizeof(m_unused_line) ); + m_unused_line = value; } - bool CDxfRead::ReadUnits() { get_line(); // Skip to next line. get_line(); // Skip to next line. - int n = 0; - if (sscanf(m_str, "%d", &n) == 1) { - m_eUnits = eDxfUnits_t( n ); - return(true); - } // End if - then + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (!isStringToErrorValue(n)) { + m_eUnits = static_cast(n); + return true; + } else { this->ReportError_readInteger("DXF::ReadUnits()"); - return(false); + return false; } } - bool CDxfRead::ReadLayer() { std::string layername; @@ -3532,37 +3021,30 @@ bool CDxfRead::ReadLayer() while (!m_ifs.eof()) { get_line(); - int n; - - if (sscanf(m_str, "%d", &n) != 1) { - this->ReportError_readInteger("DXF::ReadLayer()"); - return false; - } - - std::istringstream ss; - ss.imbue(std::locale::classic()); - switch (n) { - case 0: // next item found, so finish with line + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { if (layername.empty()) { this->ReportError_readInteger("DXF::ReadLayer() - no layer name"); return false; } + m_layer_ColorIndex_map[layername] = colorIndex; return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadLayer()"); + return false; + } + get_line(); + switch (n) { case 2: // Layer name follows - get_line(); layername = m_str; break; - case 62: // layer color ; if negative, layer is off - get_line(); - if (sscanf(m_str, "%d", &colorIndex) != 1) { - return false; - } + colorIndex = stringToInt(m_str); break; - case 6: // linetype name case 70: // layer flags case 100: @@ -3570,11 +3052,9 @@ bool CDxfRead::ReadLayer() case 370: case 390: // skip the next line - get_line(); break; default: // skip the next line - get_line(); break; } } @@ -3584,17 +3064,18 @@ bool CDxfRead::ReadLayer() bool CDxfRead::ReadVersion() { static const std::vector VersionNames = { - // This table is indexed by eDXFVersion_t - (ROlder+1) - "AC1006", - "AC1009", - "AC1012", - "AC1014", - "AC1015", - "AC1018", - "AC1021", - "AC1024", - "AC1027", - "AC1032"}; + // This table is indexed by eDXFVersion_t - (ROlder+1) + "AC1006", + "AC1009", + "AC1012", + "AC1014", + "AC1015", + "AC1018", + "AC1021", + "AC1024", + "AC1027", + "AC1032" + }; assert(VersionNames.size() == RNewer - ROlder - 1); get_line(); @@ -3662,72 +3143,72 @@ void CDxfRead::HandleCommonGroupCode(int n) } } -void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) +void CDxfRead::DoRead(bool ignore_errors) { m_ignore_errors = ignore_errors; + m_gcount = 0; if (m_fail) { return; } get_line(); + ScopedCLocale _(LC_NUMERIC); while (!m_ifs.eof()) { m_ColorIndex = ColorBylayer; // Default - if (!strcmp(m_str, "$INSUNITS" )) { + if (m_str == "$INSUNITS") { if (!ReadUnits()) { return; } continue; } // End if - then - if (!strcmp(m_str, "$MEASUREMENT" )) { + if (m_str == "$MEASUREMENT") { get_line(); get_line(); - int n = 1; - if (sscanf(m_str, "%d", &n) == 1) { - if (n == 0) { - m_measurement_inch = true; - } - } + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) + m_measurement_inch = true; + continue; } // End if - then - if (!strcmp(m_str, "$ACADVER")) { + if (m_str == "$ACADVER") { if (!ReadVersion()) { return; } continue; } // End if - then - if (!strcmp(m_str, "$DWGCODEPAGE")) { + if (m_str == "$DWGCODEPAGE") { if (!ReadDWGCodePage()) { return; } continue; } // End if - then - if (!strcmp(m_str, "0")) { + if (m_str == "0") { get_line(); - if (!strcmp(m_str, "0")) + if (m_str == "0") get_line(); // Skip again - if (!strcmp( m_str, "SECTION" )) { - safe_strcpy(m_section_name, ""); + if (m_str == "SECTION") { + m_section_name.clear(); get_line(); get_line(); - if (strcmp( m_str, "ENTITIES" )) { - safe_strcpy(m_section_name, m_str); + if (m_str != "ENTITIES") { + m_section_name = m_str; } - safe_strcpy(m_block_name, ""); + m_block_name.clear(); } // End if - then - else if (!strcmp( m_str, "TABLE" )) { + else if (m_str == "TABLE") { get_line(); get_line(); } - else if (!strcmp( m_str, "LAYER" )) { + else if (m_str == "LAYER" ) { //get_line(); //get_line(); if (!ReadLayer()) { @@ -3737,40 +3218,40 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) continue; } - else if (!strcmp( m_str, "BLOCK" )) { + else if (m_str == "BLOCK" ) { if (!ReadBlockInfo()) { - this->ReportError("DXF::DoRead() - Failed to read block info"); + this->ReportError("DXF::DoRead()f - Failed to read block info"); return; } continue; } // End if - then - else if (!strcmp( m_str, "ENDSEC" )) { - safe_strcpy(m_section_name, ""); - safe_strcpy(m_block_name, ""); + else if (m_str == "ENDSEC" ) { + m_section_name.clear(); + m_block_name.clear(); } // End if - then - else if (!strcmp(m_str, "LINE")) { + else if (m_str == "LINE") { if (!ReadLine()) { this->ReportError("DXF::DoRead() - Failed to read line"); return; } continue; } - else if (!strcmp(m_str, "ARC")) { + else if (m_str == "ARC") { if (!ReadArc()) { this->ReportError("DXF::DoRead() - Failed to read arc"); return; } continue; } - else if (!strcmp(m_str, "CIRCLE")) { + else if (m_str == "CIRCLE") { if (!ReadCircle()) { this->ReportError("DXF::DoRead() - Failed to read circle"); return; } continue; } - else if (!strcmp(m_str, "MTEXT") || !strcmp(m_str, "TEXT")) { + else if (m_str == "MTEXT" || m_str == "TEXT") { try { ReadText(); } catch (const std::runtime_error& err) { @@ -3779,49 +3260,49 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) } continue; } - else if (!strcmp(m_str, "ELLIPSE")) { + else if (m_str == "ELLIPSE") { if (!ReadEllipse()) { this->ReportError("DXF::DoRead() - Failed to read ellipse"); return; } continue; } - else if (!strcmp(m_str, "SPLINE")) { + else if (m_str == "SPLINE") { if (!ReadSpline()) { this->ReportError("DXF::DoRead() - Failed to read spline"); return; } continue; } - else if (!strcmp(m_str, "LWPOLYLINE")) { + else if (m_str == "LWPOLYLINE") { if (!ReadLwPolyLine()) { this->ReportError("DXF::DoRead() - Failed to read LW Polyline"); return; } continue; } - else if (!strcmp(m_str, "POLYLINE")) { + else if (m_str == "POLYLINE") { if (!ReadPolyLine()) { this->ReportError("DXF::DoRead() - Failed to read Polyline"); return; } continue; } - else if (!strcmp(m_str, "POINT")) { + else if (m_str == "POINT") { if (!ReadPoint()) { this->ReportError("DXF::DoRead() - Failed to read Point"); return; } continue; } - else if (!strcmp(m_str, "INSERT")) { + else if (m_str == "INSERT") { if (!ReadInsert()) { this->ReportError("DXF::DoRead() - Failed to read Insert"); return; } continue; } - else if (!strcmp(m_str, "DIMENSION")) { + else if (m_str == "DIMENSION") { if (!ReadDimension()) { this->ReportError("DXF::DoRead() - Failed to read Dimension"); return; @@ -3832,17 +3313,15 @@ void CDxfRead::DoRead(const bool ignore_errors /* = false */ ) get_line(); } + AddGraphics(); } void CDxfRead::ResolveColorIndex() { - if (m_ColorIndex == ColorBylayer) // if color = layer color, replace by color from layer - { m_ColorIndex = m_layer_ColorIndex_map[m_layer_name]; - } } void CDxfRead::ReportError_readInteger(const char* context) @@ -3861,19 +3340,21 @@ void CDxfRead::ReportError_readInteger(const char* context) std::streamsize CDxfRead::gcount() const { - return m_ifs.gcount(); + // std::getline() doesn't affect std::istream::gcount + //return m_ifs.gcount(); + return m_gcount; } std::string CDxfRead::LayerName() const { std::string result; - if (strlen(m_section_name) > 0) { + if (!m_section_name.empty()) { result.append(m_section_name); result.append(" "); } - if (strlen(m_block_name) > 0) { + if (!m_block_name.empty()) { result.append(m_block_name); result.append(" "); } @@ -3882,5 +3363,5 @@ std::string CDxfRead::LayerName() const result.append(m_layer_name); } - return(result); + return result; } diff --git a/src/io_dxf/dxf.h b/src/io_dxf/dxf.h index 9dbbc44e..7361672e 100644 --- a/src/io_dxf/dxf.h +++ b/src/io_dxf/dxf.h @@ -56,8 +56,20 @@ enum class AttachmentPoint { BottomLeft, BottomCenter, BottomRight }; +struct DxfCoords { + double x; + double y; + double z; +}; + +struct DxfScale { + double x; + double y; + double z; +}; + struct DxfText { - double point[3] = {}; + DxfCoords point = {}; double height = 0.03082; std::string str; double rotation = 0.; // radians @@ -79,7 +91,7 @@ struct DxfVertex { }; using Flags = unsigned; - double point[3] = {}; + DxfCoords point = {}; Bulge bulge = Bulge::StraightSegment; Flags flags = Flag::None; }; @@ -121,7 +133,7 @@ struct DxfPolyline { //spline data for reading struct SplineData { - double norm[3]; + DxfCoords norm; int degree; int knots; int control_points; @@ -370,6 +382,27 @@ class CDxfWrite void makeBlockSectionHead(); }; +namespace DxfPrivate { + +enum class StringToErrorMode { Throw = 0x1, ReturnErrorValue = 0x2 }; + +double stringToDouble( + const std::string& line, + StringToErrorMode errorMode = StringToErrorMode::Throw +); + +int stringToInt( + const std::string& line, + StringToErrorMode errorMode = StringToErrorMode::Throw +); + +unsigned stringToUnsigned( + const std::string& line, + StringToErrorMode errorMode = StringToErrorMode::Throw +); + +} // namespace DxfPrivate + // derive a class from this and implement it's virtual functions class CDxfRead { @@ -377,20 +410,21 @@ class CDxfRead std::ifstream m_ifs; bool m_fail; - char m_str[1024]; - char m_unused_line[1024]; + std::string m_str; + std::string m_unused_line; eDxfUnits_t m_eUnits; bool m_measurement_inch; std::string m_layer_name; - char m_section_name[1024]; - char m_block_name[1024]; + std::string m_section_name; + std::string m_block_name; bool m_ignore_errors; + std::streamsize m_gcount = 0; int m_line_nb = 0; - std::map - m_layer_ColorIndex_map; // Mapping from layer name -> layer color index + // Mapping from layer name -> layer color index + std::map m_layer_ColorIndex_map; const ColorIndex_t ColorBylayer = 256; bool ReadUnits(); @@ -406,18 +440,22 @@ class CDxfRead bool ReadPolyLine(); bool ReadVertex(DxfVertex* vertex); - void OnReadArc(double start_angle, - double end_angle, - double radius, - const double* c, - double z_extrusion_dir, - bool hidden); - void OnReadCircle(const double* c, double radius, bool hidden); - void OnReadEllipse(const double* c, - const double* m, - double ratio, - double start_angle, - double end_angle); + void OnReadArc( + double start_angle, + double end_angle, + double radius, + const DxfCoords& c, + double z_extrusion_dir, + bool hidden + ); + void OnReadCircle(const DxfCoords& c, double radius, bool hidden); + void OnReadEllipse( + const DxfCoords& c, + const DxfCoords& m, + double ratio, + double start_angle, + double end_angle + ); bool ReadInsert(); bool ReadDimension(); bool ReadBlockInfo(); @@ -425,9 +463,25 @@ class CDxfRead bool ReadDWGCodePage(); bool ResolveEncoding(); + template + void HandleCoordCode(int n, DxfCoords* coords) + { + switch (n) { + case XCode: + coords->x = mm(DxfPrivate::stringToDouble(m_str)); + break; + case YCode: + coords->y = mm(DxfPrivate::stringToDouble(m_str)); + break; + case ZCode: + coords->z = mm(DxfPrivate::stringToDouble(m_str)); + break; + } + } + void HandleCommonGroupCode(int n); - void put_line(const char *value); + void put_line(const std::string& value); void ResolveColorIndex(); void ReportError_readInteger(const char* context); @@ -450,58 +504,54 @@ class CDxfRead CDxfRead(const char* filepath); // this opens the file virtual ~CDxfRead(); // this closes the file - bool Failed() - { - return m_fail; - } - void DoRead( - const bool ignore_errors = false); // this reads the file and calls the following functions + bool IgnoreErrors() const { return m_ignore_errors; } + bool Failed() const { return m_fail; } - double mm( double value ) const; + double mm(double value) const; - bool IgnoreErrors() const - { - return(m_ignore_errors); - } + void DoRead(bool ignore_errors = false); // this reads the file and calls the following functions + + virtual void OnReadLine(const DxfCoords& s, const DxfCoords& e, bool hidden) = 0; + + virtual void OnReadPolyline(const DxfPolyline&) = 0; + + virtual void OnReadPoint(const DxfCoords& s) = 0; + + virtual void OnReadText(const DxfText&) = 0; + + virtual void OnReadArc( + const DxfCoords& s, const DxfCoords& e, const DxfCoords& c, bool dir, bool hidden + ) = 0; + + virtual void OnReadCircle(const DxfCoords& s, const DxfCoords& c, bool dir, bool hidden) = 0; + + virtual void OnReadEllipse( + const DxfCoords& c, + double major_radius, + double minor_radius, + double rotation, + double start_angle, + double end_angle, + bool dir + ) = 0; + + virtual void OnReadSpline(struct SplineData& sd) = 0; + + virtual void OnReadInsert( + const DxfCoords& point, + const DxfScale& scale, + const std::string& name, + double rotation + ) = 0; + + virtual void OnReadDimension( + const DxfCoords& s, + const DxfCoords& e, + const DxfCoords& point, + double rotation + ) = 0; - virtual void OnReadLine(const double* /*s*/, const double* /*e*/, bool /*hidden*/) - {} - - virtual void OnReadPolyline(const DxfPolyline&) {} - - virtual void OnReadPoint(const double* /*s*/) - {} - virtual void OnReadText(const DxfText&) {} - virtual void OnReadArc(const double* /*s*/, - const double* /*e*/, - const double* /*c*/, - bool /*dir*/, - bool /*hidden*/) - {} - virtual void OnReadCircle(const double* /*s*/, const double* /*c*/, bool /*dir*/, bool /*hidden*/) - {} - virtual void OnReadEllipse(const double* /*c*/, - double /*major_radius*/, - double /*minor_radius*/, - double /*rotation*/, - double /*start_angle*/, - double /*end_angle*/, - bool /*dir*/) - {} - virtual void OnReadSpline(struct SplineData& /*sd*/) - {} - virtual void OnReadInsert(const double* /*point*/, - const double* /*scale*/, - const char* /*name*/, - double /*rotation*/) - {} - virtual void OnReadDimension(const double* /*s*/, - const double* /*e*/, - const double* /*point*/, - double /*rotation*/) - {} - virtual void AddGraphics() const - {} + virtual void AddGraphics() const = 0; std::string LayerName() const; }; diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index 5eb0ad5d..23741eb2 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -11,6 +11,7 @@ #include "../base/document.h" #include "../base/filepath.h" #include "../base/math_utils.h" +#include "../base/mesh_utils.h" #include "../base/messenger.h" #include "../base/property_builtins.h" #include "../base/property_enumeration.h" @@ -27,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -44,6 +46,8 @@ #include #include +#include + namespace Mayo { namespace IO { @@ -94,23 +98,24 @@ class DxfReader::Internal : public CDxfRead { const auto& layers() const { return m_layers; } // CDxfRead's virtual functions - void OnReadLine(const double* s, const double* e, bool hidden) override; + void OnReadLine(const DxfCoords& s, const DxfCoords& e, bool hidden) override; void OnReadPolyline(const DxfPolyline& polyline) override; - void OnReadPoint(const double* s) override; + void OnReadPoint(const DxfCoords& s) override; void OnReadText(const DxfText& text) override; - void OnReadArc(const double* s, const double* e, const double* c, bool dir, bool hidden) override; - void OnReadCircle(const double* s, const double* c, bool dir, bool hidden) override; - void OnReadEllipse(const double* c, double major_radius, double minor_radius, double rotation, double start_angle, double end_angle, bool dir) override; + void OnReadArc(const DxfCoords& s, const DxfCoords& e, const DxfCoords& c, bool dir, bool hidden) override; + void OnReadCircle(const DxfCoords& s, const DxfCoords& c, bool dir, bool hidden) override; + void OnReadEllipse(const DxfCoords& c, double major_radius, double minor_radius, double rotation, double start_angle, double end_angle, bool dir) override; void OnReadSpline(struct SplineData& sd) override; - void OnReadInsert(const double* point, const double* scale, const char* name, double rotation) override; - void OnReadDimension(const double* s, const double* e, const double* point, double rotation) override; + void OnReadInsert(const DxfCoords& point, const DxfScale& scale, const std::string& name, double rotation) override; + void OnReadDimension(const DxfCoords& s, const DxfCoords& e, const DxfCoords& point, double rotation) override; void ReportError(const std::string& msg) override; + void AddGraphics() const override; static Handle_Geom_BSplineCurve createSplineFromPolesAndKnots(struct SplineData& sd); static Handle_Geom_BSplineCurve createInterpolationSpline(struct SplineData& sd); - gp_Pnt toPnt(const double* coords) const; + gp_Pnt toPnt(const DxfCoords& coords) const; void addShape(const TopoDS_Shape& shape); }; @@ -378,7 +383,7 @@ DxfReader::Internal::Internal(const FilePath& filepath, TaskProgress* progress) m_fileSize = filepathFileSize(filepath); } -void DxfReader::Internal::OnReadLine(const double* s, const double* e, bool /*hidden*/) +void DxfReader::Internal::OnReadLine(const DxfCoords& s, const DxfCoords& e, bool /*hidden*/) { const gp_Pnt p0 = this->toPnt(s); const gp_Pnt p1 = this->toPnt(e); @@ -392,17 +397,16 @@ void DxfReader::Internal::OnReadLine(const double* s, const double* e, bool /*hi void DxfReader::Internal::OnReadPolyline(const DxfPolyline& polyline) { const auto& vertices = polyline.vertices; - Handle(Poly_Polygon3D) polygon = new Poly_Polygon3D( - CppUtils::safeStaticCast(vertices.size()), - false/*!hasParams*/ - ); + const int nodeCount = CppUtils::safeStaticCast(vertices.size()); + MeshUtils::Polygon3dBuilder polygonBuilder(nodeCount); for (unsigned i = 0; i < vertices.size(); ++i) - polygon->ChangeNodes().ChangeValue(i + 1) = this->toPnt(vertices.at(i).point); + polygonBuilder.setNode(i + 1, this->toPnt(vertices.at(i).point)); - this->addShape(BRepUtils::makeEdge(polygon)); + polygonBuilder.finalize(); + this->addShape(BRepUtils::makeEdge(polygonBuilder.get())); } -void DxfReader::Internal::OnReadPoint(const double* s) +void DxfReader::Internal::OnReadPoint(const DxfCoords& s) { const TopoDS_Vertex vertex = BRepBuilderAPI_MakeVertex(this->toPnt(s)); this->addShape(vertex); @@ -451,7 +455,7 @@ void DxfReader::Internal::OnReadText(const DxfText& text) } // Excerpted from FreeCad/src/Mod/Import/App/ImpExpDxf -void DxfReader::Internal::OnReadArc(const double* s, const double* e, const double* c, bool dir, bool /*hidden*/) +void DxfReader::Internal::OnReadArc(const DxfCoords& s, const DxfCoords& e, const DxfCoords& c, bool dir, bool /*hidden*/) { const gp_Pnt p0 = this->toPnt(s); const gp_Pnt p1 = this->toPnt(e); @@ -468,7 +472,7 @@ void DxfReader::Internal::OnReadArc(const double* s, const double* e, const doub } // Excerpted from FreeCad/src/Mod/Import/App/ImpExpDxf -void DxfReader::Internal::OnReadCircle(const double* s, const double* c, bool dir, bool /*hidden*/) +void DxfReader::Internal::OnReadCircle(const DxfCoords& s, const DxfCoords& c, bool dir, bool /*hidden*/) { const gp_Pnt p0 = this->toPnt(s); const gp_Dir up = dir ? gp::DZ() : -gp::DZ(); @@ -485,7 +489,7 @@ void DxfReader::Internal::OnReadCircle(const double* s, const double* c, bool di // Excerpted from FreeCad/src/Mod/Import/App/ImpExpDxf void DxfReader::Internal::OnReadEllipse( - const double* c, + const DxfCoords& c, double major_radius, double minor_radius, double rotation, double /*start_angle*/, double /*end_angle*/, @@ -534,15 +538,16 @@ void DxfReader::Internal::OnReadSpline(SplineData& sd) } // Excerpted from FreeCad/src/Mod/Import/App/ImpExpDxf -void DxfReader::Internal::OnReadInsert(const double* point, const double* scale, const char* name, double rotation) +void DxfReader::Internal::OnReadInsert( + const DxfCoords& point, const DxfScale& scale, const std::string& name, double rotation + ) { - //std::cout << "Inserting block " << name << " rotation " << rotation << " pos " << point[0] << "," << point[1] << "," << point[2] << " scale " << scale[0] << "," << scale[1] << "," << scale[2] << std::endl; const std::string prefix = std::string("BLOCKS ") + name + " "; for (const auto& [k, vecEntity] : m_layers) { if (!startsWith(k, prefix)) continue; // Skip - TopoDS_Compound comp = BRepUtils::makeEmptyCompound(); + TopoDS_Shape comp = BRepUtils::makeEmptyCompound(); for (const DxfReader::Entity& entity : vecEntity) { if (!entity.shape.IsNull()) BRepUtils::addShape(&comp, entity.shape); @@ -551,33 +556,51 @@ void DxfReader::Internal::OnReadInsert(const double* point, const double* scale, if (comp.IsNull()) continue; // Skip - auto nonNull = [](double v) { return !MathUtils::fuzzyIsNull(v) ? v : 1.; }; - const double nscale[] = { nonNull(scale[0]), nonNull(scale[1]), nonNull(scale[2]) }; - gp_Trsf trsfScale; - trsfScale.SetValues( - nscale[0], 0, 0, 0, - 0, nscale[1], 0, 0, - 0, 0, nscale[2], 0 - ); + if (!MathUtils::fuzzyEqual(scale.x, scale.y) || !MathUtils::fuzzyEqual(scale.x, scale.y)) { + m_messenger->emitWarning( + fmt::format("OnReadInsert('{}') - non-uniform scales aren't supported({}, {}, {})", + name, scale.x, scale.y, scale.z + ) + ); + } + + auto fnNonNull = [](double v) { return !MathUtils::fuzzyIsNull(v) ? v : 1.; }; + const double avgScale = std::abs(fnNonNull((scale.x + scale.y + scale.z) / 3.)); + if (!MathUtils::fuzzyEqual(avgScale, 1.)) { + gp_Trsf trsf; + trsf.SetScaleFactor(avgScale); + BRepBuilderAPI_Transform brepTrsf(comp, trsf); + if (brepTrsf.IsDone()) { + comp = brepTrsf.Shape(); + } + else { + m_messenger->emitWarning( + fmt::format("OnReadInsert('{}') - scaling failed({}, {}, {})", name, scale.x, scale.y, scale.z) + ); + } + } + gp_Trsf trsfRotZ; - trsfRotZ.SetRotation(gp::OZ(), rotation); + if (!MathUtils::fuzzyIsNull(rotation)) + trsfRotZ.SetRotation(gp::OZ(), rotation); + gp_Trsf trsfMove; trsfMove.SetTranslation(this->toPnt(point).XYZ()); - const gp_Trsf trsf = trsfScale * trsfRotZ * trsfMove; - comp.Location(trsf); + + comp.Location(trsfRotZ * trsfMove); this->addShape(comp); } } -void DxfReader::Internal::OnReadDimension(const double* s, const double* e, const double* point, double rotation) +void DxfReader::Internal::OnReadDimension(const DxfCoords& s, const DxfCoords& e, const DxfCoords& point, double rotation) { if (m_params.importAnnotations) { // TODO std::stringstream sstr; sstr << "DxfReader::OnReadDimension() - Not yet implemented" << std::endl - << " s: " << s[0] << ", " << s[1] << ", " << s[2] << std::endl - << " e: " << e[0] << ", " << e[1] << ", " << e[2] << std::endl - << " point: " << point[0] << ", " << point[1] << ", " << point[2] << std::endl + << " s: " << s.x << ", " << s.y << ", " << s.z << std::endl + << " e: " << e.x << ", " << e.y << ", " << e.z << std::endl + << " point: " << point.x << ", " << point.y << ", " << point.z << std::endl << " rotation: " << rotation << std::endl; m_messenger->emitWarning(sstr.str()); } @@ -588,11 +611,16 @@ void DxfReader::Internal::ReportError(const std::string& msg) m_messenger->emitError(msg); } -gp_Pnt DxfReader::Internal::toPnt(const double* coords) const +void DxfReader::Internal::AddGraphics() const +{ + // Nothing +} + +gp_Pnt DxfReader::Internal::toPnt(const DxfCoords& coords) const { - double sp1(coords[0]); - double sp2(coords[1]); - double sp3(coords[2]); + double sp1(coords.x); + double sp2(coords.y); + double sp3(coords.z); if (!MathUtils::fuzzyEqual(m_params.scaling, 1.)) { sp1 = sp1 * m_params.scaling; sp2 = sp2 * m_params.scaling; From 9bf4c707beb8b2fa2400f0232473645dadf036d6 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 29 Nov 2023 15:53:54 +0100 Subject: [PATCH 81/92] IO_Dxf: fix handling of closed POLYLINEs in DxfReader::Internal --- src/io_dxf/io_dxf.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index 23741eb2..f4b2dd0a 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -397,11 +397,15 @@ void DxfReader::Internal::OnReadLine(const DxfCoords& s, const DxfCoords& e, boo void DxfReader::Internal::OnReadPolyline(const DxfPolyline& polyline) { const auto& vertices = polyline.vertices; - const int nodeCount = CppUtils::safeStaticCast(vertices.size()); + const bool isPolylineClosed = polyline.flags & DxfPolyline::Flag::Closed; + const int nodeCount = CppUtils::safeStaticCast(vertices.size() + (isPolylineClosed ? 1 : 0)); MeshUtils::Polygon3dBuilder polygonBuilder(nodeCount); for (unsigned i = 0; i < vertices.size(); ++i) polygonBuilder.setNode(i + 1, this->toPnt(vertices.at(i).point)); + if (isPolylineClosed) + polygonBuilder.setNode(nodeCount, this->toPnt(vertices.at(0).point)); + polygonBuilder.finalize(); this->addShape(BRepUtils::makeEdge(polygonBuilder.get())); } From 472d5011e569f7d19116707edab1f2f37d2b8772 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 5 Dec 2023 19:07:30 +0100 Subject: [PATCH 82/92] IO_Dxf: improvements with format support * Support SOLID and STYLE * Distinct handling of MTEXT and TEXT * Rewrite CDxfRead::ReadInsert() with new Dxf_INSERT struct Relates to GitHub #241 --- src/io_dxf/dxf.cpp | 419 +++++++++++++++++++++++++++++++++--------- src/io_dxf/dxf.h | 201 +++++++++++++++++--- src/io_dxf/io_dxf.cpp | 215 +++++++++++++++++----- 3 files changed, 675 insertions(+), 160 deletions(-) diff --git a/src/io_dxf/dxf.cpp b/src/io_dxf/dxf.cpp index 6b6fcdc7..7eee415f 100644 --- a/src/io_dxf/dxf.cpp +++ b/src/io_dxf/dxf.cpp @@ -1971,6 +1971,14 @@ double CDxfRead::mm(double value) const } // End switch } // End mm() method +const Dxf_STYLE* CDxfRead::findStyle(const std::string& name) const +{ + if (name.empty()) + return nullptr; + + auto itFound = m_mapStyle.find(name); + return itFound != m_mapStyle.cend() ? &itFound->second : nullptr; +} bool CDxfRead::ReadLine() { @@ -1999,15 +2007,11 @@ bool CDxfRead::ReadLine() hidden = true; } break; - case 10: - case 20: - case 30: + case 10: case 20: case 30: // start coords HandleCoordCode(n, &s); break; - case 11: - case 21: - case 31: + case 11: case 21: case 31: // end coords HandleCoordCode<11, 21, 31>(n, &e); break; @@ -2315,9 +2319,7 @@ bool CDxfRead::ReadCircle() hidden = true; } break; - case 10: - case 20: - case 30: + case 10: case 20: case 30: // centre coords HandleCoordCode(n, &c); break; @@ -2344,12 +2346,16 @@ bool CDxfRead::ReadCircle() return false; } -void CDxfRead::ReadText() +void CDxfRead::ReadMText() { - DxfText text; + Dxf_MTEXT text; + bool withinAcadColumnInfo = false; + bool withinAcadColumns = false; + bool withinAcadDefinedHeight = false; + while (!m_ifs.eof()) { get_line(); - const int n = stringToInt(m_str); + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); if (n == 0) { ResolveColorIndex(); // Replace \P by \n @@ -2360,25 +2366,105 @@ void CDxfRead::ReadText() } text.str = this->toUtf8(text.str); - OnReadText(text); + OnReadMText(text); return; } get_line(); + + auto fnMatchExtensionBegin = [=](std::string_view extName, bool& tag) { + if (!tag && m_str == extName) { + tag = true; + return true; + } + return false; + }; + + auto fnMatchExtensionEnd = [=](std::string_view extName, bool& tag) { + if (tag && m_str == extName) { + tag = false; + return true; + } + return false; + }; + + if (fnMatchExtensionBegin("ACAD_MTEXT_COLUMN_INFO_BEGIN", withinAcadColumnInfo)) { + text.acadHasColumnInfo = true; + continue; // Skip + } + + if (fnMatchExtensionEnd("ACAD_MTEXT_COLUMN_INFO_END", withinAcadColumnInfo)) + continue; // Skip + + if (fnMatchExtensionBegin("ACAD_MTEXT_COLUMNS_BEGIN", withinAcadColumns)) + continue; // Skip + + if (fnMatchExtensionEnd("ACAD_MTEXT_COLUMNS_END", withinAcadColumns)) + continue; // Skip + + if (fnMatchExtensionBegin("ACAD_MTEXT_DEFINED_HEIGHT_BEGIN", withinAcadDefinedHeight)) { + text.acadHasDefinedHeight = true; + continue; // Skip + } + + if (fnMatchExtensionEnd("ACAD_MTEXT_DEFINED_HEIGHT_END", withinAcadDefinedHeight)) + continue; // Skip + + if (withinAcadColumnInfo) { + // 1040/1070 extended data code was found at beginning of current iteration + const int xn = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + get_line(); // Skip 1040/1070 line + get_line(); // Get value line of extended data code + switch (xn) { + case 75: { // 1070 + const int t = stringToInt(m_str); + if (0 <= t && t <= 2) + text.acadColumnInfo_Type = static_cast(t); + } + break; + case 76: // 1070 + text.acadColumnInfo_Count = stringToInt(m_str); + break; + case 78: // 1070 + text.acadColumnInfo_FlowReversed = stringToInt(m_str) != 0; + break; + case 79: // 1070 + text.acadColumnInfo_AutoHeight = stringToInt(m_str) != 0; + break; + case 48: // 1040 + text.acadColumnInfo_Width = mm(stringToDouble(m_str)); + break; + case 49: // 1040 + text.acadColumnInfo_GutterWidth = mm(stringToDouble(m_str)); + break; + } // endswitch + + continue; // Skip + } + + if (withinAcadDefinedHeight) { + // 1040/1070 extended data code was found at beginning of current iteration + const int xn = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + get_line(); // Skip 1040/1070 line + get_line(); // Get value line of extended data code + if (xn == 46) + text.acadDefinedHeight = mm(stringToDouble(m_str)); + + continue; // Skip + } + switch (n) { - case 10: - case 20: - case 30: + case 10: case 20: case 30: // centre coords - HandleCoordCode(n, &text.point); + HandleCoordCode(n, &text.insertionPoint); break; case 40: // text height - text.height = mm(stringToDouble(m_str)) * 25.4 / 72.0; + text.height = mm(stringToDouble(m_str)); break; case 50: // text rotation - text.rotation = stringToDouble(m_str); + text.rotationAngle = stringToDouble(m_str); break; case 3: // Additional text that goes before the type 1 text @@ -2395,17 +2481,21 @@ void CDxfRead::ReadText() case 71: { // attachment point const int ap = stringToInt(m_str); - if (ap >= 1 && ap <= 9) { - text.attachPoint = static_cast(ap); - } + if (ap >= 1 && ap <= 9) + text.attachmentPoint = static_cast(ap); } break; - case 100: - case 39: - case 210: - case 220: - case 230: + case 11: case 21: case 31: + // X-axis direction vector + HandleCoordCode<11, 21, 31>(n, &text.xAxisDirectionVector); + break; + + case 210: case 220: case 230: + // extrusion direction + HandleCoordCode<210, 220, 230>(n, &text.extrusionDirection); + break; + default: HandleCommonGroupCode(n); break; @@ -2413,6 +2503,67 @@ void CDxfRead::ReadText() } } +void CDxfRead::ReadText() +{ + Dxf_TEXT text; + + while (!m_ifs.eof()) { + get_line(); + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { + ResolveColorIndex(); + OnReadText(text); + return; + } + + get_line(); + + switch (n) { + case 10: case 20: case 30: + HandleCoordCode(n, &text.firstAlignmentPoint); + break; + case 40: + text.height = mm(stringToDouble(m_str)); + break; + case 1: + text.str = this->toUtf8(m_str); + break; + case 50: + text.rotationAngle = stringToDouble(m_str); + break; + case 41: + text.relativeXScaleFactorWidth = stringToDouble(m_str); + break; + case 51: + text.obliqueAngle = stringToDouble(m_str); + break; + case 7: + text.styleName = m_str; + break; + case 72: { + const int hjust = stringToInt(m_str); + if (hjust >= 0 && hjust <= 5) + text.horizontalJustification = static_cast(hjust); + } + break; + case 11: case 21: case 31: + HandleCoordCode<11, 21, 31>(n, &text.secondAlignmentPoint); + break; + case 210: case 220: case 230: + HandleCoordCode<210, 220, 230>(n, &text.extrusionDirection); + break; + case 73: { + const int vjust = stringToInt(m_str); + if (vjust >= 0 && vjust <= 3) + text.verticalJustification = static_cast(vjust); + } + break; + default: + HandleCommonGroupCode(n); + break; + } + } +} bool CDxfRead::ReadEllipse() { @@ -2438,15 +2589,11 @@ bool CDxfRead::ReadEllipse() get_line(); switch (n) { - case 10: - case 20: - case 30: + case 10: case 20: case 30: // centre coords HandleCoordCode(n, &c); break; - case 11: - case 21: - case 31: + case 11: case 21: case 31: // major coords HandleCoordCode<11, 21, 31>(n, &m); break; @@ -2657,7 +2804,7 @@ bool CDxfRead::ReadLwPolyLine() return false; } -bool CDxfRead::ReadVertex(DxfVertex* vertex) +bool CDxfRead::ReadVertex(Dxf_VERTEX* vertex) { bool x_found = false; bool y_found = false; @@ -2676,9 +2823,7 @@ bool CDxfRead::ReadVertex(DxfVertex* vertex) get_line(); switch (n){ - case 10: - case 20: - case 30: + case 10: case 20: case 30: // coords x_found = x_found || n == 10; y_found = y_found || n == 20; @@ -2688,9 +2833,9 @@ bool CDxfRead::ReadVertex(DxfVertex* vertex) // bulge const int bulge = stringToInt(m_str); if (bulge == 0) - vertex->bulge = DxfVertex::Bulge::StraightSegment; + vertex->bulge = Dxf_VERTEX::Bulge::StraightSegment; else - vertex->bulge = DxfVertex::Bulge::SemiCircle; + vertex->bulge = Dxf_VERTEX::Bulge::SemiCircle; } break; case 70: @@ -2706,10 +2851,56 @@ bool CDxfRead::ReadVertex(DxfVertex* vertex) return false; } +bool CDxfRead::ReadSolid() +{ + Dxf_SOLID solid; + + while (!m_ifs.eof()) { + get_line(); + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { + ResolveColorIndex(); + OnReadSolid(solid); + return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadSolid()"); + return false; + } + + get_line(); + switch (n) { + case 10: case 20: case 30: + HandleCoordCode<10, 20, 30>(n, &solid.corner1); + break; + case 11: case 21: case 31: + HandleCoordCode<11, 21, 31>(n, &solid.corner2); + break; + case 12: case 22: case 32: + HandleCoordCode<12, 22, 32>(n, &solid.corner3); + break; + case 13: case 23: case 33: + HandleCoordCode<13, 23, 33>(n, &solid.corner4); + solid.hasCorner4 = true; + break; + case 39: + solid.thickness = stringToDouble(m_str); + break; + case 210: case 220: case 230: + HandleCoordCode<210, 220, 230>(n, &solid.extrusionDirection); + break; + default: + HandleCommonGroupCode(n); + break; + } + } + + return false; +} bool CDxfRead::ReadPolyLine() { - DxfPolyline polyline; + Dxf_POLYLINE polyline; while (!m_ifs.eof()) { get_line(); const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); @@ -2724,7 +2915,7 @@ bool CDxfRead::ReadPolyLine() // next item found ResolveColorIndex(); if (m_str == "VERTEX") { - DxfVertex vertex; + Dxf_VERTEX vertex; if (ReadVertex(&vertex)) polyline.vertices.push_back(std::move(vertex)); } @@ -2816,10 +3007,7 @@ void CDxfRead::OnReadEllipse(const DxfCoords& c, bool CDxfRead::ReadInsert() { - DxfCoords c = {}; // coordinate - DxfScale s = {1., 1., 1.}; // scale - double rot = 0.0; // rotation - std::string name; + Dxf_INSERT insert; while (!m_ifs.eof()) { get_line(); @@ -2827,7 +3015,7 @@ bool CDxfRead::ReadInsert() if (n == 0) { // next item found ResolveColorIndex(); - OnReadInsert(c, s, name, rot * M_PI/180); + OnReadInsert(insert); return true; } else if (isStringToErrorValue(n)) { @@ -2837,38 +3025,38 @@ bool CDxfRead::ReadInsert() get_line(); switch (n){ - case 10: - case 20: - case 30: - // 3d coords - HandleCoordCode(n, &c); + case 2: + insert.blockName = m_str; + break; + case 10: case 20: case 30: + HandleCoordCode(n, &insert.insertPoint); break; case 41: - // scale x - s.x = stringToDouble(m_str); + insert.scaleFactor.x = stringToDouble(m_str); break; case 42: - // scale y - s.y = stringToDouble(m_str); + insert.scaleFactor.y = stringToDouble(m_str); break; case 43: - // scale z - s.z = stringToDouble(m_str); + insert.scaleFactor.z = stringToDouble(m_str); break; case 50: - // rotation - rot = stringToDouble(m_str); + insert.rotationAngle = stringToDouble(m_str); break; - case 2: - // block name - name = m_str; + case 70: + insert.columnCount = stringToInt(m_str); break; - case 100: - case 39: - case 210: - case 220: - case 230: - // skip the next line + case 71: + insert.rowCount = stringToInt(m_str); + break; + case 44: + insert.columnSpacing = mm(stringToDouble(m_str)); + break; + case 45: + insert.rowSpacing = mm(stringToDouble(m_str)); + break; + case 210: case 220: case 230: + HandleCoordCode<210, 220, 230>(n, &insert.extrusionDirection); break; default: HandleCommonGroupCode(n); @@ -2902,21 +3090,15 @@ bool CDxfRead::ReadDimension() get_line(); switch (n){ - case 13: - case 23: - case 33: + case 13: case 23: case 33: // start coords HandleCoordCode<13, 23, 33>(n, &s); break; - case 14: - case 24: - case 34: + case 14: case 24: case 34: // end coords HandleCoordCode<14, 24, 34>(n, &e); break; - case 10: - case 20: - case 30: + case 10: case 20: case 30: // dimline coords HandleCoordCode<10, 20, 30>(n, &p); break; @@ -3058,6 +3240,56 @@ bool CDxfRead::ReadLayer() break; } } + + return false; +} + +bool CDxfRead::ReadStyle() +{ + Dxf_STYLE style; + + while (!m_ifs.eof()) { + get_line(); + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) { + if (style.name.empty()) { + this->ReportError_readInteger("DXF::ReadStyle() - no style name"); + return false; + } + + m_mapStyle.insert({ style.name, style }); + return true; + } + else if (isStringToErrorValue(n)) { + this->ReportError_readInteger("DXF::ReadStyle()"); + return false; + } + + get_line(); + switch (n) { + case 2: + style.name = m_str; + break; + case 40: + style.fixedTextHeight = mm(stringToDouble(m_str)); + break; + case 41: + style.widthFactor = stringToDouble(m_str); + break; + case 50: + style.obliqueAngle = stringToDouble(m_str); + break; + case 3: + style.primaryFontFileName = m_str; + break; + case 4: + style.bigFontFileName = m_str; + break; + default: + break; // skip the next line + } + } + return false; } @@ -3080,9 +3312,9 @@ bool CDxfRead::ReadVersion() assert(VersionNames.size() == RNewer - ROlder - 1); get_line(); get_line(); - std::vector::const_iterator first = VersionNames.cbegin(); - std::vector::const_iterator last = VersionNames.cend(); - std::vector::const_iterator found = std::lower_bound(first, last, m_str); + auto first = VersionNames.cbegin(); + auto last = VersionNames.cend(); + auto found = std::lower_bound(first, last, m_str); if (found == last) { m_version = RNewer; } @@ -3209,8 +3441,6 @@ void CDxfRead::DoRead(bool ignore_errors) } else if (m_str == "LAYER" ) { - //get_line(); - //get_line(); if (!ReadLayer()) { this->ReportError("DXF::DoRead() - Failed to read layer"); //return; Some objects or tables can have "LAYER" as name... @@ -3218,6 +3448,11 @@ void CDxfRead::DoRead(bool ignore_errors) continue; } + else if (m_str == "STYLE" ) { + ReadStyle(); + continue; + } + else if (m_str == "BLOCK" ) { if (!ReadBlockInfo()) { this->ReportError("DXF::DoRead()f - Failed to read block info"); @@ -3251,11 +3486,20 @@ void CDxfRead::DoRead(bool ignore_errors) } continue; } - else if (m_str == "MTEXT" || m_str == "TEXT") { + else if (m_str == "MTEXT") { + try { + ReadMText(); + } catch (const std::runtime_error& err) { + this->ReportError("DXF::DoRead() - Failed to read MTEXT\nError: " + std::string(err.what())); + return; + } + continue; + } + else if (m_str == "TEXT") { try { ReadText(); } catch (const std::runtime_error& err) { - this->ReportError("DXF::DoRead() - Failed to read text\nError: " + std::string(err.what())); + this->ReportError("DXF::DoRead() - Failed to read TEXT\nError: " + std::string(err.what())); return; } continue; @@ -3309,6 +3553,13 @@ void CDxfRead::DoRead(bool ignore_errors) } continue; } + else if (m_str == "SOLID") { + if (!ReadSolid()) { + this->ReportError("DXF::DoRead() - Failed to read Solid"); + return; + } + continue; + } } get_line(); diff --git a/src/io_dxf/dxf.h b/src/io_dxf/dxf.h index 7361672e..1ab93d81 100644 --- a/src/io_dxf/dxf.h +++ b/src/io_dxf/dxf.h @@ -15,10 +15,11 @@ #include #include #include -#include +#include #include #include #include +#include #include #include "freecad.h" @@ -50,12 +51,6 @@ typedef enum eParsecs } eDxfUnits_t; -enum class AttachmentPoint { - TopLeft = 1, TopCenter, TopRight, - MiddleLeft, MiddleCenter, MiddleRight, - BottomLeft, BottomCenter, BottomRight -}; - struct DxfCoords { double x; double y; @@ -68,15 +63,127 @@ struct DxfScale { double z; }; -struct DxfText { - DxfCoords point = {}; - double height = 0.03082; +struct Dxf_STYLE { + // Code: 2 + std::string name; + // Code: 40 + double fixedTextHeight = 0; + // Code: 41 + double widthFactor = 1.; + // Code: 50 + // AutoCad documentation doesn't specify units, but "Group Codes in Numerical Order" section + // states that codes 50-58 are in degrees + double obliqueAngle = 0.; + // Code: 3 + std::string primaryFontFileName; + // Code: 4 + std::string bigFontFileName; + + // TODO Code 70(standard flag values) + // TODO Code 71(text generation flags) + // TODO Code 42(last height used) +}; + +struct Dxf_TEXT { + // Code: 39 + double thickness = 0.; + // Code: 10, 20, 30 + DxfCoords firstAlignmentPoint = {}; + // Code: 40 + double height = 0.; + // Code: 1 std::string str; - double rotation = 0.; // radians - AttachmentPoint attachPoint = AttachmentPoint::TopLeft; + // Code: 50 + // AutoCad documentation doesn't specify units, but "Group Codes in Numerical Order" section + // states that codes 50-58 are in degrees + double rotationAngle = 0.; + // Code: 41 + // "This value is also adjusted when fit-type text is used" + double relativeXScaleFactorWidth = 1.; + // Code: 51 + // AutoCad documentation doesn't specify units, but "Group Codes in Numerical Order" section + // states that codes 50-58 are in degrees + double obliqueAngle = 0.; + // Code: 7 + std::string styleName; + + // TODO Code 71(text generation flags) + + enum class HorizontalJustification { + Left = 0, Center = 1, Right = 2, Aligned = 3, Middle = 4, Fit = 5 + }; + // Code: 72 + HorizontalJustification horizontalJustification = HorizontalJustification::Left; + // Code: 11, 21, 31 + DxfCoords secondAlignmentPoint = {}; + // Code: 210, 220, 230 + DxfCoords extrusionDirection = {0., 0., 1.}; + + enum class VerticalJustification { + Baseline = 0, Bottom = 1, Middle = 2, Top = 3 + }; + // Code: 73 + VerticalJustification verticalJustification = VerticalJustification::Baseline; }; -struct DxfVertex { +struct Dxf_MTEXT { + enum class AttachmentPoint { + TopLeft = 1, TopCenter, TopRight, + MiddleLeft, MiddleCenter, MiddleRight, + BottomLeft, BottomCenter, BottomRight + }; + + // Code: 10, 20, 30 + DxfCoords insertionPoint = {}; + // Code: 40 + double height = 0.; + // Code: 41 + double referenceRectangleWidth = 0; + // Code 71 + AttachmentPoint attachmentPoint = AttachmentPoint::TopLeft; + + // TODO Code 72(drawing direction) + + // Code: 1, 3 + std::string str; + + // TODO Code 7(text sytle name) + + // Code: 210, 220, 230 + DxfCoords extrusionDirection = {0., 0., 1.}; + + // Code: 11, 21, 31 + DxfCoords xAxisDirectionVector; // WCS + + // NOTE AutoCad documentation states that codes 42, 43 are "read-only, ignored if supplied" + + double rotationAngle = 0.; // radians(AutoCad documentation) + + // TODO Code 73(line spacing style) + // TODO Code 44(line spacing factor) + // TODO Code 90(background fill setting) + // TODO Code 420-429(background color, if RGB) + // TODO Code 430-439(background color, if name) + // TODO Code 45(fill box scale) + // TODO Code 63(background fill color) + // TODO Code 441(transparency of background fill color) + // TODO Codes for columns: 75, 76, 78, 79, 48, 49, 50 + + enum class ColumnType { None = 0, Static, Dynamic }; + bool acadHasColumnInfo = false; + ColumnType acadColumnInfo_Type = ColumnType::None; + bool acadColumnInfo_AutoHeight = false; + int acadColumnInfo_Count = 0; + bool acadColumnInfo_FlowReversed = false; + double acadColumnInfo_Width = 0.; + double acadColumnInfo_GutterWidth = 0.; + + bool acadHasDefinedHeight = false; + double acadDefinedHeight = 0.; + +}; + +struct Dxf_VERTEX { enum class Bulge { StraightSegment = 0, SemiCircle = 1 }; enum Flag { None = 0, @@ -96,7 +203,7 @@ struct DxfVertex { Flags flags = Flag::None; }; -struct DxfPolyline { +struct Dxf_POLYLINE { enum Flag { None = 0, Closed = 1, @@ -127,7 +234,44 @@ struct DxfPolyline { double smoothSurfaceMDensity = 0.; double smoothSurfaceNDensity = 0.; double extrusionDir[3] = { 0., 0., 1. }; - std::vector vertices; + std::vector vertices; +}; + +struct Dxf_INSERT { + // Code: 2 + std::string blockName; + // Code: 10, 20, 30 + DxfCoords insertPoint = {}; // OCS + // Code: 41, 42, 43 + DxfScale scaleFactor = { 1., 1., 1. }; + // Code: 50 + double rotationAngle = 0.; + // Code: 70 + int columnCount = 1; + // Code: 71 + int rowCount = 1; + // Code: 44 + double columnSpacing = 0.; + // Code: 45 + double rowSpacing = 0.; + // Code: 210, 220, 230 + DxfCoords extrusionDirection = { 0., 0., 1. }; +}; + +struct Dxf_SOLID { + // Code: 10, 20, 30 + DxfCoords corner1; + // Code: 11, 21, 31 + DxfCoords corner2; + // Code: 12, 22, 32 + DxfCoords corner3; + // Code: 13, 23, 33 + DxfCoords corner4; + bool hasCorner4 = false; + // Code: 39 + double thickness = 0.; + // Code: 210, 220, 230 + DxfCoords extrusionDirection = { 0., 0., 1. }; }; //spline data for reading @@ -422,14 +566,17 @@ class CDxfRead std::streamsize m_gcount = 0; int m_line_nb = 0; - // Mapping from layer name -> layer color index - std::map m_layer_ColorIndex_map; + std::unordered_map m_layer_ColorIndex_map; const ColorIndex_t ColorBylayer = 256; + std::unordered_map m_mapStyle; + bool ReadUnits(); bool ReadLayer(); + bool ReadStyle(); bool ReadLine(); + void ReadMText(); void ReadText(); bool ReadArc(); bool ReadCircle(); @@ -438,7 +585,8 @@ class CDxfRead bool ReadSpline(); bool ReadLwPolyLine(); bool ReadPolyLine(); - bool ReadVertex(DxfVertex* vertex); + bool ReadVertex(Dxf_VERTEX* vertex); + bool ReadSolid(); void OnReadArc( double start_angle, @@ -509,15 +657,19 @@ class CDxfRead double mm(double value) const; + const Dxf_STYLE* findStyle(const std::string& name) const; + void DoRead(bool ignore_errors = false); // this reads the file and calls the following functions virtual void OnReadLine(const DxfCoords& s, const DxfCoords& e, bool hidden) = 0; - virtual void OnReadPolyline(const DxfPolyline&) = 0; + virtual void OnReadPolyline(const Dxf_POLYLINE&) = 0; virtual void OnReadPoint(const DxfCoords& s) = 0; - virtual void OnReadText(const DxfText&) = 0; + virtual void OnReadText(const Dxf_TEXT&) = 0; + + virtual void OnReadMText(const Dxf_MTEXT&) = 0; virtual void OnReadArc( const DxfCoords& s, const DxfCoords& e, const DxfCoords& c, bool dir, bool hidden @@ -537,12 +689,9 @@ class CDxfRead virtual void OnReadSpline(struct SplineData& sd) = 0; - virtual void OnReadInsert( - const DxfCoords& point, - const DxfScale& scale, - const std::string& name, - double rotation - ) = 0; + virtual void OnReadInsert(const Dxf_INSERT& ins) = 0; + + virtual void OnReadSolid(const Dxf_SOLID& solid) = 0; virtual void OnReadDimension( const DxfCoords& s, diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index f4b2dd0a..07942a28 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -27,7 +27,9 @@ #include #include #include +#include #include +#include #include #include #include @@ -99,15 +101,17 @@ class DxfReader::Internal : public CDxfRead { // CDxfRead's virtual functions void OnReadLine(const DxfCoords& s, const DxfCoords& e, bool hidden) override; - void OnReadPolyline(const DxfPolyline& polyline) override; + void OnReadPolyline(const Dxf_POLYLINE& polyline) override; void OnReadPoint(const DxfCoords& s) override; - void OnReadText(const DxfText& text) override; + void OnReadText(const Dxf_TEXT& text) override; + void OnReadMText(const Dxf_MTEXT& text) override; void OnReadArc(const DxfCoords& s, const DxfCoords& e, const DxfCoords& c, bool dir, bool hidden) override; void OnReadCircle(const DxfCoords& s, const DxfCoords& c, bool dir, bool hidden) override; void OnReadEllipse(const DxfCoords& c, double major_radius, double minor_radius, double rotation, double start_angle, double end_angle, bool dir) override; void OnReadSpline(struct SplineData& sd) override; - void OnReadInsert(const DxfCoords& point, const DxfScale& scale, const std::string& name, double rotation) override; + void OnReadInsert(const Dxf_INSERT& ins) override; void OnReadDimension(const DxfCoords& s, const DxfCoords& e, const DxfCoords& point, double rotation) override; + void OnReadSolid(const Dxf_SOLID& solid) override; void ReportError(const std::string& msg) override; void AddGraphics() const override; @@ -394,10 +398,10 @@ void DxfReader::Internal::OnReadLine(const DxfCoords& s, const DxfCoords& e, boo this->addShape(edge); } -void DxfReader::Internal::OnReadPolyline(const DxfPolyline& polyline) +void DxfReader::Internal::OnReadPolyline(const Dxf_POLYLINE& polyline) { const auto& vertices = polyline.vertices; - const bool isPolylineClosed = polyline.flags & DxfPolyline::Flag::Closed; + const bool isPolylineClosed = polyline.flags & Dxf_POLYLINE::Flag::Closed; const int nodeCount = CppUtils::safeStaticCast(vertices.size() + (isPolylineClosed ? 1 : 0)); MeshUtils::Polygon3dBuilder polygonBuilder(nodeCount); for (unsigned i = 0; i < vertices.size(); ++i) @@ -416,46 +420,124 @@ void DxfReader::Internal::OnReadPoint(const DxfCoords& s) this->addShape(vertex); } -void DxfReader::Internal::OnReadText(const DxfText& text) +void DxfReader::Internal::OnReadText(const Dxf_TEXT& text) { if (!m_params.importAnnotations) return; - const gp_Pnt pt = this->toPnt(text.point); + const gp_Pnt pt = this->toPnt(text.firstAlignmentPoint); const std::string layerName = this->LayerName(); - if (!startsWith(layerName, "BLOCKS")) { - const std::string& fontName = m_params.fontNameForTextObjects; - const double fontHeight = 4 * text.height * m_params.scaling; - Font_BRepFont brepFont; - if (brepFont.Init(fontName.c_str(), Font_FA_Regular, fontHeight)) { - gp_Trsf rotTrsf; - if (!MathUtils::fuzzyIsNull(text.rotation)) - rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), text.rotation); - - const int ap = static_cast(text.attachPoint); - Graphic3d_HorizontalTextAlignment hAttachPnt = Graphic3d_HTA_LEFT; - if (ap == 2 || ap == 5 || ap == 8) - hAttachPnt = Graphic3d_HTA_CENTER; - else if (ap == 3 || ap == 6 || ap == 9) - hAttachPnt = Graphic3d_HTA_RIGHT; - - Graphic3d_VerticalTextAlignment vAttachPnt = Graphic3d_VTA_TOP; - if (ap == 4 || ap == 5 || ap == 6) - vAttachPnt = Graphic3d_VTA_CENTER; - else if (ap == 7 || ap == 8 || ap == 9) - vAttachPnt = Graphic3d_VTA_BOTTOM; - - const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); - Font_BRepTextBuilder brepTextBuilder; - const TopoDS_Shape shapeText = brepTextBuilder.Perform( - brepFont, string_conv(text.str), locText, hAttachPnt, vAttachPnt - ); - this->addShape(shapeText); - } - else { - m_messenger->emitWarning(fmt::format("Font_BRepFont is null for '{}'", fontName)); - } + if (startsWith(layerName, "BLOCKS")) + return; + + const Dxf_STYLE* ptrStyle = this->findStyle(text.styleName); + std::string fontName = ptrStyle ? ptrStyle->name : m_params.fontNameForTextObjects; + auto fnToLower = [](const std::string& str) { + std::string lstr = str; + for (char& c : lstr) + c = std::tolower(c, std::locale::classic()); + return lstr; + }; + + if (fnToLower(fontName) == "arial_narrow") + fontName.replace(5, 1, " "); + + const double fontHeight = 1.4 * text.height * m_params.scaling; + Font_BRepFont brepFont; + brepFont.SetWidthScaling(static_cast(text.relativeXScaleFactorWidth)); + if (!brepFont.Init(fontName.c_str(), Font_FA_Regular, fontHeight/*, Font_StrictLevel_Aliases*/)) { + m_messenger->emitWarning(fmt::format("Font_BRepFont is null for '{}'", fontName)); + return; + } + + gp_Trsf rotTrsf; + if (!MathUtils::fuzzyIsNull(text.rotationAngle)) + rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), UnitSystem::radians(text.rotationAngle * Quantity_Degree)); + +#if 0 + const Dxf_TEXT::HorizontalJustification hjust = text.horizontalJustification; + Graphic3d_HorizontalTextAlignment hAlign = Graphic3d_HTA_LEFT; + switch (hjust) { + case Dxf_TEXT::HorizontalJustification::Center: + case Dxf_TEXT::HorizontalJustification::Middle: + hAlign = Graphic3d_HTA_CENTER; + break; + case Dxf_TEXT::HorizontalJustification::Right: + hAlign = Graphic3d_HTA_RIGHT; + break; + } + + const Dxf_TEXT::VerticalJustification vjust = text.verticalJustification; + Graphic3d_VerticalTextAlignment vAlign = Graphic3d_VTA_TOP; + switch (vjust) { + case Dxf_TEXT::VerticalJustification::Bottom: + vAlign = Graphic3d_VTA_BOTTOM; + break; + case Dxf_TEXT::VerticalJustification::Middle: + vAlign = Graphic3d_VTA_CENTER; + break; + } +#endif + + const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); + Font_BRepTextBuilder brepTextBuilder; + const auto textStr = string_conv(text.str); + const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, textStr, locText/*, hAlign, vAlign*/); + this->addShape(shapeText); +} + +void DxfReader::Internal::OnReadMText(const Dxf_MTEXT& text) +{ + if (!m_params.importAnnotations) + return; + + const gp_Pnt pt = this->toPnt(text.insertionPoint); + const std::string layerName = this->LayerName(); + if (startsWith(layerName, "BLOCKS")) + return; + + const std::string& fontName = m_params.fontNameForTextObjects; + const double fontHeight = 1.4 * text.height * m_params.scaling; + Font_BRepFont brepFont; + if (!brepFont.Init(fontName.c_str(), Font_FA_Regular, fontHeight)) { + m_messenger->emitWarning(fmt::format("Font_BRepFont is null for '{}'", fontName)); + return; } + + gp_Trsf rotTrsf; + if (!MathUtils::fuzzyIsNull(text.rotationAngle)) + rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), text.rotationAngle); + + const int ap = static_cast(text.attachmentPoint); + Graphic3d_HorizontalTextAlignment hAttachPnt = Graphic3d_HTA_LEFT; + if (ap == 2 || ap == 5 || ap == 8) + hAttachPnt = Graphic3d_HTA_CENTER; + else if (ap == 3 || ap == 6 || ap == 9) + hAttachPnt = Graphic3d_HTA_RIGHT; + + Graphic3d_VerticalTextAlignment vAttachPnt = Graphic3d_VTA_TOP; + if (ap == 4 || ap == 5 || ap == 6) + vAttachPnt = Graphic3d_VTA_CENTER; + else if (ap == 7 || ap == 8 || ap == 9) + vAttachPnt = Graphic3d_VTA_BOTTOM; + + OccHandle textFormat = new Font_TextFormatter; + textFormat->SetupAlignment(hAttachPnt, vAttachPnt); + textFormat->Append(string_conv(text.str), *brepFont.FTFont()); +#if 0 + // Font_TextFormatter computes weird ResultWidth() so wrapping is currently broken + if (text.acadHasColumnInfo && text.acadColumnInfo_Width > 0.) { + textFormat->SetWordWrapping(true); + textFormat->SetWrapping(text.acadColumnInfo_Width); + } +#endif + + textFormat->Format(); + + const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); + Font_BRepTextBuilder brepTextBuilder; + const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, textFormat, locText); + this->addShape(shapeText); } // Excerpted from FreeCad/src/Mod/Import/App/ImpExpDxf @@ -542,11 +624,9 @@ void DxfReader::Internal::OnReadSpline(SplineData& sd) } // Excerpted from FreeCad/src/Mod/Import/App/ImpExpDxf -void DxfReader::Internal::OnReadInsert( - const DxfCoords& point, const DxfScale& scale, const std::string& name, double rotation - ) +void DxfReader::Internal::OnReadInsert(const Dxf_INSERT& ins) { - const std::string prefix = std::string("BLOCKS ") + name + " "; + const std::string prefix = "BLOCKS " + ins.blockName + " "; for (const auto& [k, vecEntity] : m_layers) { if (!startsWith(k, prefix)) continue; // Skip @@ -560,16 +640,19 @@ void DxfReader::Internal::OnReadInsert( if (comp.IsNull()) continue; // Skip - if (!MathUtils::fuzzyEqual(scale.x, scale.y) || !MathUtils::fuzzyEqual(scale.x, scale.y)) { + if (!MathUtils::fuzzyEqual(ins.scaleFactor.x, ins.scaleFactor.y) + || !MathUtils::fuzzyEqual(ins.scaleFactor.x, ins.scaleFactor.y) + ) + { m_messenger->emitWarning( fmt::format("OnReadInsert('{}') - non-uniform scales aren't supported({}, {}, {})", - name, scale.x, scale.y, scale.z + ins.blockName, ins.scaleFactor.x, ins.scaleFactor.y, ins.scaleFactor.z ) ); } auto fnNonNull = [](double v) { return !MathUtils::fuzzyIsNull(v) ? v : 1.; }; - const double avgScale = std::abs(fnNonNull((scale.x + scale.y + scale.z) / 3.)); + const double avgScale = std::abs(fnNonNull((ins.scaleFactor.x + ins.scaleFactor.y + ins.scaleFactor.z) / 3.)); if (!MathUtils::fuzzyEqual(avgScale, 1.)) { gp_Trsf trsf; trsf.SetScaleFactor(avgScale); @@ -579,17 +662,19 @@ void DxfReader::Internal::OnReadInsert( } else { m_messenger->emitWarning( - fmt::format("OnReadInsert('{}') - scaling failed({}, {}, {})", name, scale.x, scale.y, scale.z) + fmt::format("OnReadInsert('{}') - scaling failed({}, {}, {})", + ins.blockName, ins.scaleFactor.x, ins.scaleFactor.y, ins.scaleFactor.z + ) ); } } gp_Trsf trsfRotZ; - if (!MathUtils::fuzzyIsNull(rotation)) - trsfRotZ.SetRotation(gp::OZ(), rotation); + if (!MathUtils::fuzzyIsNull(ins.rotationAngle)) + trsfRotZ.SetRotation(gp::OZ(), ins.rotationAngle); gp_Trsf trsfMove; - trsfMove.SetTranslation(this->toPnt(point).XYZ()); + trsfMove.SetTranslation(this->toPnt(ins.insertPoint).XYZ()); comp.Location(trsfRotZ * trsfMove); this->addShape(comp); @@ -610,6 +695,36 @@ void DxfReader::Internal::OnReadDimension(const DxfCoords& s, const DxfCoords& e } } +void DxfReader::Internal::OnReadSolid(const Dxf_SOLID& solid) +{ + const gp_Pnt p1 = this->toPnt(solid.corner1); + const gp_Pnt p2 = this->toPnt(solid.corner2); + const gp_Pnt p3 = this->toPnt(solid.corner3); + const gp_Pnt p4 = this->toPnt(solid.corner4); + + TopoDS_Face face; + try { + BRepBuilderAPI_MakeWire makeWire; + makeWire.Add(BRepBuilderAPI_MakeEdge(p1, p2)); + if (solid.hasCorner4 && !p3.IsEqual(p4, Precision::Confusion())) { + makeWire.Add(BRepBuilderAPI_MakeEdge(p2, p4)); + makeWire.Add(BRepBuilderAPI_MakeEdge(p4, p3)); + } + else { + makeWire.Add(BRepBuilderAPI_MakeEdge(p2, p3)); + } + + makeWire.Add(BRepBuilderAPI_MakeEdge(p3, p1)); + if (makeWire.IsDone()) + face = BRepBuilderAPI_MakeFace(makeWire.Wire(), true/*onlyPlane*/); + } catch (...) { + m_messenger->emitError("OnReadSolid() failed"); + } + + if (!face.IsNull()) + this->addShape(face); +} + void DxfReader::Internal::ReportError(const std::string& msg) { m_messenger->emitError(msg); From f48ae1c3911e8d35e778cfb11854b548c9cefa7a Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 6 Dec 2023 10:06:05 +0100 Subject: [PATCH 83/92] IO_Dxf: factorize code in CDxfRead::DoRead() --- src/io_dxf/dxf.cpp | 273 ++++++++++++++++++--------------------------- src/io_dxf/dxf.h | 17 ++- 2 files changed, 118 insertions(+), 172 deletions(-) diff --git a/src/io_dxf/dxf.cpp b/src/io_dxf/dxf.cpp index 7eee415f..2260ca36 100644 --- a/src/io_dxf/dxf.cpp +++ b/src/io_dxf/dxf.cpp @@ -17,6 +17,7 @@ # include #endif +#include #include #include @@ -2346,7 +2347,7 @@ bool CDxfRead::ReadCircle() return false; } -void CDxfRead::ReadMText() +bool CDxfRead::ReadMText() { Dxf_MTEXT text; bool withinAcadColumnInfo = false; @@ -2367,7 +2368,7 @@ void CDxfRead::ReadMText() text.str = this->toUtf8(text.str); OnReadMText(text); - return; + return true; } get_line(); @@ -2501,9 +2502,11 @@ void CDxfRead::ReadMText() break; } } + + return false; } -void CDxfRead::ReadText() +bool CDxfRead::ReadText() { Dxf_TEXT text; @@ -2513,7 +2516,7 @@ void CDxfRead::ReadText() if (n == 0) { ResolveColorIndex(); OnReadText(text); - return; + return true; } get_line(); @@ -2563,6 +2566,8 @@ void CDxfRead::ReadText() break; } } + + return false; } bool CDxfRead::ReadEllipse() @@ -2898,6 +2903,32 @@ bool CDxfRead::ReadSolid() return false; } +bool CDxfRead::ReadSection() +{ + m_section_name.clear(); + get_line(); + get_line(); + if (m_str != "ENTITIES") + m_section_name = m_str; + + m_block_name.clear(); + return true; +} + +bool CDxfRead::ReadTable() +{ + get_line(); + get_line(); + return true; +} + +bool CDxfRead::ReadEndSec() +{ + m_section_name.clear(); + m_block_name.clear(); + return true; +} + bool CDxfRead::ReadPolyLine() { Dxf_POLYLINE polyline; @@ -3181,7 +3212,7 @@ void CDxfRead::put_line(const std::string& value) m_unused_line = value; } -bool CDxfRead::ReadUnits() +bool CDxfRead::ReadInsUnits() { get_line(); // Skip to next line. get_line(); // Skip to next line. @@ -3196,6 +3227,17 @@ bool CDxfRead::ReadUnits() } } +bool CDxfRead::ReadMeasurement() +{ + get_line(); + get_line(); + const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); + if (n == 0) + m_measurement_inch = true; + + return true; +} + bool CDxfRead::ReadLayer() { std::string layername; @@ -3293,7 +3335,7 @@ bool CDxfRead::ReadStyle() return false; } -bool CDxfRead::ReadVersion() +bool CDxfRead::ReadAcadVer() { static const std::vector VersionNames = { // This table is indexed by eDXFVersion_t - (ROlder+1) @@ -3331,7 +3373,7 @@ bool CDxfRead::ReadVersion() return ResolveEncoding(); } -bool CDxfRead::ReadDWGCodePage() +bool CDxfRead::ReadDwgCodePage() { get_line(); get_line(); @@ -3379,9 +3421,35 @@ void CDxfRead::DoRead(bool ignore_errors) { m_ignore_errors = ignore_errors; m_gcount = 0; - if (m_fail) { + if (m_fail) return; - } + + std::unordered_map> mapHeaderVarHandler; + mapHeaderVarHandler.insert({ "$INSUNITS", [=]{ return ReadInsUnits(); } }); + mapHeaderVarHandler.insert({ "$MEASUREMENT", [=]{ return ReadMeasurement(); } }); + mapHeaderVarHandler.insert({ "$ACADVER", [=]{ return ReadAcadVer(); } }); + mapHeaderVarHandler.insert({ "$DWGCODEPAGE", [=]{ return ReadDwgCodePage(); } }); + + std::unordered_map> mapEntityHandler; + mapEntityHandler.insert({ "ARC", [=]{ return ReadArc(); } }); + mapEntityHandler.insert({ "BLOCK", [=]{ return ReadBlockInfo(); } }); + mapEntityHandler.insert({ "CIRCLE", [=]{ return ReadCircle(); } }); + mapEntityHandler.insert({ "DIMENSION", [=]{ return ReadDimension(); } }); + mapEntityHandler.insert({ "ELLIPSE", [=]{ return ReadEllipse(); } }); + mapEntityHandler.insert({ "INSERT", [=]{ return ReadInsert(); } }); + mapEntityHandler.insert({ "LAYER", [=]{ return ReadLayer(); } }); + mapEntityHandler.insert({ "LINE", [=]{ return ReadLine(); } }); + mapEntityHandler.insert({ "LWPOLYLINE", [=]{ return ReadLwPolyLine(); } }); + mapEntityHandler.insert({ "MTEXT", [=]{ return ReadMText(); } }); + mapEntityHandler.insert({ "POINT", [=]{ return ReadPoint(); } }); + mapEntityHandler.insert({ "POLYLINE", [=]{ return ReadPolyLine(); } }); + mapEntityHandler.insert({ "SECTION", [=]{ return ReadSection(); } }); + mapEntityHandler.insert({ "SOLID", [=]{ return ReadSolid(); } }); + mapEntityHandler.insert({ "SPLINE", [=]{ return ReadSpline(); } }); + mapEntityHandler.insert({ "STYLE", [=]{ return ReadStyle(); } }); + mapEntityHandler.insert({ "TEXT", [=]{ return ReadText(); } }); + mapEntityHandler.insert({ "TABLE", [=]{ return ReadTable(); } }); + mapEntityHandler.insert({ "ENDSEC", [=]{ return ReadEndSec(); } }); get_line(); @@ -3389,176 +3457,47 @@ void CDxfRead::DoRead(bool ignore_errors) while (!m_ifs.eof()) { m_ColorIndex = ColorBylayer; // Default - if (m_str == "$INSUNITS") { - if (!ReadUnits()) { - return; - } - continue; - } // End if - then - - if (m_str == "$MEASUREMENT") { - get_line(); - get_line(); - const int n = stringToInt(m_str, StringToErrorMode::ReturnErrorValue); - if (n == 0) - m_measurement_inch = true; - - continue; - } // End if - then - - if (m_str == "$ACADVER") { - if (!ReadVersion()) { - return; - } - continue; - } // End if - then - - if (m_str == "$DWGCODEPAGE") { - if (!ReadDWGCodePage()) { - return; + { // Handle header variable + auto itHandler = mapHeaderVarHandler.find(m_str); + if (itHandler != mapHeaderVarHandler.cend()) { + const auto& fn = itHandler->second; + if (fn()) + continue; + else + return; } - continue; - } // End if - then + } if (m_str == "0") { get_line(); if (m_str == "0") get_line(); // Skip again - if (m_str == "SECTION") { - m_section_name.clear(); - get_line(); - get_line(); - if (m_str != "ENTITIES") { - m_section_name = m_str; - } - m_block_name.clear(); - - } // End if - then - else if (m_str == "TABLE") { - get_line(); - get_line(); - } - - else if (m_str == "LAYER" ) { - if (!ReadLayer()) { - this->ReportError("DXF::DoRead() - Failed to read layer"); - //return; Some objects or tables can have "LAYER" as name... - } - continue; - } - - else if (m_str == "STYLE" ) { - ReadStyle(); - continue; - } - - else if (m_str == "BLOCK" ) { - if (!ReadBlockInfo()) { - this->ReportError("DXF::DoRead()f - Failed to read block info"); - return; - } - continue; - } // End if - then - - else if (m_str == "ENDSEC" ) { - m_section_name.clear(); - m_block_name.clear(); - } // End if - then - else if (m_str == "LINE") { - if (!ReadLine()) { - this->ReportError("DXF::DoRead() - Failed to read line"); - return; - } - continue; - } - else if (m_str == "ARC") { - if (!ReadArc()) { - this->ReportError("DXF::DoRead() - Failed to read arc"); - return; - } - continue; - } - else if (m_str == "CIRCLE") { - if (!ReadCircle()) { - this->ReportError("DXF::DoRead() - Failed to read circle"); - return; - } - continue; - } - else if (m_str == "MTEXT") { + auto itHandler = mapEntityHandler.find(m_str); + if (itHandler != mapEntityHandler.cend()) { + const auto& fn = itHandler->second; + bool okRead = false; + std::string exceptionMsg; try { - ReadMText(); + okRead = fn(); } catch (const std::runtime_error& err) { - this->ReportError("DXF::DoRead() - Failed to read MTEXT\nError: " + std::string(err.what())); - return; + exceptionMsg = err.what(); } - continue; - } - else if (m_str == "TEXT") { - try { - ReadText(); - } catch (const std::runtime_error& err) { - this->ReportError("DXF::DoRead() - Failed to read TEXT\nError: " + std::string(err.what())); - return; - } - continue; - } - else if (m_str == "ELLIPSE") { - if (!ReadEllipse()) { - this->ReportError("DXF::DoRead() - Failed to read ellipse"); - return; - } - continue; - } - else if (m_str == "SPLINE") { - if (!ReadSpline()) { - this->ReportError("DXF::DoRead() - Failed to read spline"); - return; - } - continue; - } - else if (m_str == "LWPOLYLINE") { - if (!ReadLwPolyLine()) { - this->ReportError("DXF::DoRead() - Failed to read LW Polyline"); - return; - } - continue; - } - else if (m_str == "POLYLINE") { - if (!ReadPolyLine()) { - this->ReportError("DXF::DoRead() - Failed to read Polyline"); - return; - } - continue; - } - else if (m_str == "POINT") { - if (!ReadPoint()) { - this->ReportError("DXF::DoRead() - Failed to read Point"); - return; - } - continue; - } - else if (m_str == "INSERT") { - if (!ReadInsert()) { - this->ReportError("DXF::DoRead() - Failed to read Insert"); - return; - } - continue; - } - else if (m_str == "DIMENSION") { - if (!ReadDimension()) { - this->ReportError("DXF::DoRead() - Failed to read Dimension"); - return; + + if (okRead) { + continue; } - continue; - } - else if (m_str == "SOLID") { - if (!ReadSolid()) { - this->ReportError("DXF::DoRead() - Failed to read Solid"); - return; + else { + std::string errMsg = "DXF::DoRead() - Failed to read " + m_str; + if (!exceptionMsg.empty()) + errMsg += "\nError: " + exceptionMsg; + + this->ReportError(errMsg); + if (m_str == "LAYER") // Some objects or tables can have "LAYER" as name... + continue; + else + return; } - continue; } } diff --git a/src/io_dxf/dxf.h b/src/io_dxf/dxf.h index 1ab93d81..39344d83 100644 --- a/src/io_dxf/dxf.h +++ b/src/io_dxf/dxf.h @@ -570,14 +570,19 @@ class CDxfRead std::unordered_map m_layer_ColorIndex_map; const ColorIndex_t ColorBylayer = 256; + // Map styleName to Style object std::unordered_map m_mapStyle; - bool ReadUnits(); + bool ReadInsUnits(); + bool ReadMeasurement(); + bool ReadAcadVer(); + bool ReadDwgCodePage(); + bool ReadLayer(); bool ReadStyle(); bool ReadLine(); - void ReadMText(); - void ReadText(); + bool ReadMText(); + bool ReadText(); bool ReadArc(); bool ReadCircle(); bool ReadEllipse(); @@ -587,6 +592,9 @@ class CDxfRead bool ReadPolyLine(); bool ReadVertex(Dxf_VERTEX* vertex); bool ReadSolid(); + bool ReadSection(); + bool ReadTable(); + bool ReadEndSec(); void OnReadArc( double start_angle, @@ -607,8 +615,7 @@ class CDxfRead bool ReadInsert(); bool ReadDimension(); bool ReadBlockInfo(); - bool ReadVersion(); - bool ReadDWGCodePage(); + bool ResolveEncoding(); template From 5f66a7a205bbe825ee4fde7437d6cb8781f6dd70 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 6 Dec 2023 10:06:28 +0100 Subject: [PATCH 84/92] IO_Dxf: fix compilation error for OpenCascade < 7.5 --- src/io_dxf/io_dxf.cpp | 56 ++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index 07942a28..097587b1 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -60,6 +60,15 @@ bool startsWith(std::string_view str, std::string_view prefix) return str.substr(0, prefix.size()) == prefix; } +std::string toLowerCase_C(const std::string& str) +{ + std::string lstr = str; + for (char& c : lstr) + c = std::tolower(c, std::locale::classic()); + + return lstr; +} + const Enumeration& systemFontNames() { static Enumeration fontNames; @@ -432,14 +441,8 @@ void DxfReader::Internal::OnReadText(const Dxf_TEXT& text) const Dxf_STYLE* ptrStyle = this->findStyle(text.styleName); std::string fontName = ptrStyle ? ptrStyle->name : m_params.fontNameForTextObjects; - auto fnToLower = [](const std::string& str) { - std::string lstr = str; - for (char& c : lstr) - c = std::tolower(c, std::locale::classic()); - return lstr; - }; - - if (fnToLower(fontName) == "arial_narrow") + // "ARIAL_NARROW" -> "ARIAL NARROW" + if (toLowerCase_C(fontName) == "arial_narrow") fontName.replace(5, 1, " "); const double fontHeight = 1.4 * text.height * m_params.scaling; @@ -455,6 +458,8 @@ void DxfReader::Internal::OnReadText(const Dxf_TEXT& text) rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), UnitSystem::radians(text.rotationAngle * Quantity_Degree)); #if 0 + // TEXT justification is subtle(eg baseline and fit modes) + // See doc https://ezdxf.readthedocs.io/en/stable/tutorials/text.html const Dxf_TEXT::HorizontalJustification hjust = text.horizontalJustification; Graphic3d_HorizontalTextAlignment hAlign = Graphic3d_HTA_LEFT; switch (hjust) { @@ -482,7 +487,7 @@ void DxfReader::Internal::OnReadText(const Dxf_TEXT& text) const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); Font_BRepTextBuilder brepTextBuilder; const auto textStr = string_conv(text.str); - const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, textStr, locText/*, hAlign, vAlign*/); + const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, textStr, locText); this->addShape(shapeText); } @@ -509,34 +514,37 @@ void DxfReader::Internal::OnReadMText(const Dxf_MTEXT& text) rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), text.rotationAngle); const int ap = static_cast(text.attachmentPoint); - Graphic3d_HorizontalTextAlignment hAttachPnt = Graphic3d_HTA_LEFT; + Graphic3d_HorizontalTextAlignment hAlign = Graphic3d_HTA_LEFT; if (ap == 2 || ap == 5 || ap == 8) - hAttachPnt = Graphic3d_HTA_CENTER; + hAlign = Graphic3d_HTA_CENTER; else if (ap == 3 || ap == 6 || ap == 9) - hAttachPnt = Graphic3d_HTA_RIGHT; + hAlign = Graphic3d_HTA_RIGHT; - Graphic3d_VerticalTextAlignment vAttachPnt = Graphic3d_VTA_TOP; + Graphic3d_VerticalTextAlignment vAlign = Graphic3d_VTA_TOP; if (ap == 4 || ap == 5 || ap == 6) - vAttachPnt = Graphic3d_VTA_CENTER; + vAlign = Graphic3d_VTA_CENTER; else if (ap == 7 || ap == 8 || ap == 9) - vAttachPnt = Graphic3d_VTA_BOTTOM; + vAlign = Graphic3d_VTA_BOTTOM; + const auto occTextStr = string_conv(text.str); + const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); + Font_BRepTextBuilder brepTextBuilder; +#if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 5, 0) OccHandle textFormat = new Font_TextFormatter; - textFormat->SetupAlignment(hAttachPnt, vAttachPnt); - textFormat->Append(string_conv(text.str), *brepFont.FTFont()); -#if 0 - // Font_TextFormatter computes weird ResultWidth() so wrapping is currently broken + textFormat->SetupAlignment(hAlign, vAlign); + textFormat->Append(occTextStr, *brepFont.FTFont()); + /* Font_TextFormatter computes weird ResultWidth() so wrapping is currently broken if (text.acadHasColumnInfo && text.acadColumnInfo_Width > 0.) { textFormat->SetWordWrapping(true); textFormat->SetWrapping(text.acadColumnInfo_Width); } -#endif - + */ textFormat->Format(); - - const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); - Font_BRepTextBuilder brepTextBuilder; const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, textFormat, locText); +#else + const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, occTextStr, locText, hAlign, vAlign); +#endif + this->addShape(shapeText); } From b1f5c094cbbcfa6ac208810066627b70fa60d97a Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Wed, 6 Dec 2023 12:48:30 +0100 Subject: [PATCH 85/92] Fix -Wunused-function GCC warnings --- src/app/command_system_information.cpp | 2 +- src/app/main.cpp | 4 ++-- src/base/mesh_utils.cpp | 5 +++-- src/io_assimp/io_assimp_reader.cpp | 2 +- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index 75c9d5d0..c4776065 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -147,7 +147,7 @@ QString toUnicodeHexa(const QChar& ch) } // Helper function returning unicode representation of a QString object in the form "U+NNNNU+PPPP..." -QString toUnicodeHexa(const QString& str) +[[maybe_unused]] QString toUnicodeHexa(const QString& str) { QString strHexa; QTextStream ostr(&strHexa); diff --git a/src/app/main.cpp b/src/app/main.cpp index 4805c958..d7eed7ab 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -352,7 +352,7 @@ static std::string_view qtTranslate(const TextId& text, int n) } // Helper to query the OpenGL version string -static std::string queryGlVersionString() +[[maybe_unused]] static std::string queryGlVersionString() { QOpenGLContext glContext; if (!glContext.create()) @@ -372,7 +372,7 @@ static std::string queryGlVersionString() // Helper to parse a string containing a semantic version eg "4.6.5 CodeNamed" // Note: only major and minor versions are detected -static QVersionNumber parseSemanticVersionString(std::string_view strVersion) +[[maybe_unused]] static QVersionNumber parseSemanticVersionString(std::string_view strVersion) { if (strVersion.empty()) return {}; diff --git a/src/base/mesh_utils.cpp b/src/base/mesh_utils.cpp index 0f1166d2..04a375ee 100644 --- a/src/base/mesh_utils.cpp +++ b/src/base/mesh_utils.cpp @@ -16,10 +16,11 @@ namespace MeshUtils { namespace { -TColStd_Array1OfReal createArray1OfReal(int count) +// Helper function to create TColStd_Array1OfReal +[[maybe_unused]] TColStd_Array1OfReal createArray1OfReal(int count) { if (count > 0) - return TColStd_Array1OfReal(1 , count); + return TColStd_Array1OfReal(1, count); else return TColStd_Array1OfReal(); } diff --git a/src/io_assimp/io_assimp_reader.cpp b/src/io_assimp/io_assimp_reader.cpp index 1e7b70d3..01400547 100644 --- a/src/io_assimp/io_assimp_reader.cpp +++ b/src/io_assimp/io_assimp_reader.cpp @@ -78,7 +78,7 @@ bool hasScaleFactor(const aiVector3D& scaling) ); } -bool hasScaleFactor(const aiMatrix4x4& trsf) +[[maybe_unused]] bool hasScaleFactor(const aiMatrix4x4& trsf) { const aiVector3D scaling = aiMatrixScaling(trsf); return hasScaleFactor(scaling); From 0a233f1a150c52b66e804f7c491928d4127d2f80 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 8 Dec 2023 10:55:18 +0100 Subject: [PATCH 86/92] IO_Dxf: handle TEXT/MTEXT orientation(extrusion direction) Relates to GitHub #241 --- src/io_dxf/dxf.cpp | 3 +- src/io_dxf/dxf.h | 2 +- src/io_dxf/io_dxf.cpp | 100 ++++++++++++++++++++++++++++++++---------- 3 files changed, 80 insertions(+), 25 deletions(-) diff --git a/src/io_dxf/dxf.cpp b/src/io_dxf/dxf.cpp index 2260ca36..ab432b5b 100644 --- a/src/io_dxf/dxf.cpp +++ b/src/io_dxf/dxf.cpp @@ -2489,7 +2489,7 @@ bool CDxfRead::ReadMText() case 11: case 21: case 31: // X-axis direction vector - HandleCoordCode<11, 21, 31>(n, &text.xAxisDirectionVector); + HandleCoordCode<11, 21, 31>(n, &text.xAxisDirection); break; case 210: case 220: case 230: @@ -2520,7 +2520,6 @@ bool CDxfRead::ReadText() } get_line(); - switch (n) { case 10: case 20: case 30: HandleCoordCode(n, &text.firstAlignmentPoint); diff --git a/src/io_dxf/dxf.h b/src/io_dxf/dxf.h index 39344d83..369bcc3f 100644 --- a/src/io_dxf/dxf.h +++ b/src/io_dxf/dxf.h @@ -153,7 +153,7 @@ struct Dxf_MTEXT { DxfCoords extrusionDirection = {0., 0., 1.}; // Code: 11, 21, 31 - DxfCoords xAxisDirectionVector; // WCS + DxfCoords xAxisDirection = {1., 0., 0.}; // WCS // NOTE AutoCad documentation states that codes 42, 43 are "read-only, ignored if supplied" diff --git a/src/io_dxf/io_dxf.cpp b/src/io_dxf/io_dxf.cpp index 097587b1..2bc42bfa 100644 --- a/src/io_dxf/io_dxf.cpp +++ b/src/io_dxf/io_dxf.cpp @@ -84,6 +84,11 @@ const Enumeration& systemFontNames() return fontNames; } +gp_Vec toOccVec(const DxfCoords& coords) +{ + return { coords.x, coords.y, coords.z }; +} + } // namespace class DxfReader::Internal : public CDxfRead { @@ -434,7 +439,6 @@ void DxfReader::Internal::OnReadText(const Dxf_TEXT& text) if (!m_params.importAnnotations) return; - const gp_Pnt pt = this->toPnt(text.firstAlignmentPoint); const std::string layerName = this->LayerName(); if (startsWith(layerName, "BLOCKS")) return; @@ -453,41 +457,76 @@ void DxfReader::Internal::OnReadText(const Dxf_TEXT& text) return; } - gp_Trsf rotTrsf; - if (!MathUtils::fuzzyIsNull(text.rotationAngle)) - rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), UnitSystem::radians(text.rotationAngle * Quantity_Degree)); - -#if 0 + using DxfHJustification = Dxf_TEXT::HorizontalJustification; + using DxfVJustification = Dxf_TEXT::VerticalJustification; // TEXT justification is subtle(eg baseline and fit modes) // See doc https://ezdxf.readthedocs.io/en/stable/tutorials/text.html - const Dxf_TEXT::HorizontalJustification hjust = text.horizontalJustification; + const DxfHJustification hjust = text.horizontalJustification; Graphic3d_HorizontalTextAlignment hAlign = Graphic3d_HTA_LEFT; switch (hjust) { - case Dxf_TEXT::HorizontalJustification::Center: - case Dxf_TEXT::HorizontalJustification::Middle: + case DxfHJustification::Center: + case DxfHJustification::Middle: hAlign = Graphic3d_HTA_CENTER; break; - case Dxf_TEXT::HorizontalJustification::Right: + case DxfHJustification::Right: hAlign = Graphic3d_HTA_RIGHT; break; } - const Dxf_TEXT::VerticalJustification vjust = text.verticalJustification; + const DxfVJustification vjust = text.verticalJustification; Graphic3d_VerticalTextAlignment vAlign = Graphic3d_VTA_TOP; switch (vjust) { - case Dxf_TEXT::VerticalJustification::Bottom: + case DxfVJustification::Baseline: + vAlign = Graphic3d_VTA_TOPFIRSTLINE; + break; + case DxfVJustification::Bottom: vAlign = Graphic3d_VTA_BOTTOM; break; - case Dxf_TEXT::VerticalJustification::Middle: + case DxfVJustification::Middle: vAlign = Graphic3d_VTA_CENTER; break; } -#endif - const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); + // Ensure non-null extrusion direction + gp_Vec extDir = toOccVec(text.extrusionDirection); + if (extDir.Magnitude() < gp::Resolution()) + extDir = gp::DZ(); + + // Alignment point + const bool applyFirstAlignPnt = + hjust == DxfHJustification::Left + || vjust == DxfVJustification::Baseline + ; + + const DxfCoords& alignPnt = applyFirstAlignPnt ? text.firstAlignmentPoint : text.secondAlignmentPoint; + const gp_Pnt pt = this->toPnt(alignPnt); + + gp_Vec xAxisDir = gp::DX(); + if (hjust == DxfHJustification::Aligned || hjust == DxfHJustification::Fit) { + const gp_Pnt p1 = this->toPnt(text.firstAlignmentPoint); + const gp_Pnt p2 = this->toPnt(text.secondAlignmentPoint); + xAxisDir = gp_Vec{p1, p2}; + + // Ensure non-null x-axis direction + if (xAxisDir.Magnitude() < gp::Resolution()) + xAxisDir = gp::DX(); + } + + // If rotation angle is non-null and x-axis direction defaults to standard Ox then set x-axis + // so it matches rotation angle + xAxisDir.Normalize(); + if (!MathUtils::fuzzyIsNull(text.rotationAngle) + && xAxisDir.IsEqual(gp::DX(), Precision::Confusion(), Precision::Angular())) + { + gp_Trsf rotTrsf; + rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), text.rotationAngle); + xAxisDir = gp::DX().Transformed(rotTrsf); + } + + const gp_Ax3 locText(pt, extDir, xAxisDir); Font_BRepTextBuilder brepTextBuilder; - const auto textStr = string_conv(text.str); - const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, textStr, locText); + const auto occTextStr = string_conv(text.str); + const TopoDS_Shape shapeText = brepTextBuilder.Perform(brepFont, occTextStr, locText, hAlign, vAlign); this->addShape(shapeText); } @@ -509,10 +548,6 @@ void DxfReader::Internal::OnReadMText(const Dxf_MTEXT& text) return; } - gp_Trsf rotTrsf; - if (!MathUtils::fuzzyIsNull(text.rotationAngle)) - rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), text.rotationAngle); - const int ap = static_cast(text.attachmentPoint); Graphic3d_HorizontalTextAlignment hAlign = Graphic3d_HTA_LEFT; if (ap == 2 || ap == 5 || ap == 8) @@ -526,8 +561,29 @@ void DxfReader::Internal::OnReadMText(const Dxf_MTEXT& text) else if (ap == 7 || ap == 8 || ap == 9) vAlign = Graphic3d_VTA_BOTTOM; + // Ensure non-null extrusion direction + gp_Vec extDir = toOccVec(text.extrusionDirection); + if (extDir.Magnitude() < gp::Resolution()) + extDir = gp::DZ(); + + // Ensure non-null x-axis direction + gp_Vec xAxisDir = toOccVec(text.xAxisDirection); + if (xAxisDir.Magnitude() < gp::Resolution()) + xAxisDir = gp::DX(); + + // If rotation angle is non-null and x-axis direction defaults to standard Ox then set x-axis + // so it matches rotation angle + xAxisDir.Normalize(); + if (!MathUtils::fuzzyIsNull(text.rotationAngle) + && xAxisDir.IsEqual(gp::DX(), Precision::Confusion(), Precision::Angular())) + { + gp_Trsf rotTrsf; + rotTrsf.SetRotation(gp_Ax1(pt, gp::DZ()), text.rotationAngle); + xAxisDir = gp::DX().Transformed(rotTrsf); + } + const auto occTextStr = string_conv(text.str); - const gp_Ax3 locText(pt, gp::DZ(), gp::DX().Transformed(rotTrsf)); + const gp_Ax3 locText(pt, extDir, xAxisDir); Font_BRepTextBuilder brepTextBuilder; #if OCC_VERSION_HEX >= OCC_VERSION_CHECK(7, 5, 0) OccHandle textFormat = new Font_TextFormatter; From 4b92d85763ffe7b3bf475dada1af457840d3f5c6 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Mon, 11 Dec 2023 19:04:38 +0100 Subject: [PATCH 87/92] App: adopt "standard" version number(major.minor.patch) --- src/app/command_system_information.cpp | 9 +++++++++ src/app/dialog_about.cpp | 5 ++++- version.pri | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/app/command_system_information.cpp b/src/app/command_system_information.cpp index c4776065..5d149644 100644 --- a/src/app/command_system_information.cpp +++ b/src/app/command_system_information.cpp @@ -9,6 +9,7 @@ #include "app_module.h" #include "qstring_conv.h" #include "qtwidgets_utils.h" +#include "version.h" #include "../base/meta_enum.h" #include "../base/filepath.h" #include "../base/io_system.h" @@ -218,6 +219,14 @@ QString CommandSystemInformation::data() QString strSysInfo; QTextStream ostr(&strSysInfo); + // Mayo version + ostr << '\n' + << "Mayo: v" << strVersion + << " commit:" << strVersionCommitId + << " revnum:" << versionRevisionNumber + << " " << QT_POINTER_SIZE * 8 << "bit" + << '\n'; + // OS version ostr << '\n' << "OS: " << QSysInfo::prettyProductName() << " [" << QSysInfo::kernelType() << " version " << QSysInfo::kernelVersion() << "]" << '\n' diff --git a/src/app/dialog_about.cpp b/src/app/dialog_about.cpp index 1c62d02a..86d674bb 100644 --- a/src/app/dialog_about.cpp +++ b/src/app/dialog_about.cpp @@ -22,7 +22,10 @@ DialogAbout::DialogAbout(QWidget* parent) tr("%1 By %2").arg(QApplication::applicationName(), QApplication::organizationName()) ); - m_ui->label_Version->setText(m_ui->label_Version->text().arg(strVersion).arg(QT_POINTER_SIZE * 8)); + const QString strVersionFull = + QString("%1 commit:%2 revnum:%3") + .arg(strVersion).arg(strVersionCommitId).arg(versionRevisionNumber); + m_ui->label_Version->setText(m_ui->label_Version->text().arg(strVersionFull).arg(QT_POINTER_SIZE * 8)); m_ui->label_BuildDateTime->setText(m_ui->label_BuildDateTime->text().arg(__DATE__, __TIME__)); m_ui->label_Qt->setText(m_ui->label_Qt->text().arg(QT_VERSION_STR)); m_ui->label_Occ->setText(m_ui->label_Occ->text().arg(OCC_VERSION_COMPLETE)); diff --git a/version.pri b/version.pri index 4d6d961b..07bcd9d9 100644 --- a/version.pri +++ b/version.pri @@ -11,8 +11,8 @@ defined(HAVE_GIT, var) { MAYO_VERSION_MAJ = 0 MAYO_VERSION_MIN = 8 MAYO_VERSION_PAT = 0 -VERSION = $${MAYO_VERSION_MAJ}.$${MAYO_VERSION_MIN}.$${MAYO_VERSION_PAT}.$${MAYO_VERSION_REVNUM} -MAYO_VERSION = $${VERSION}-$$MAYO_VERSION_COMMIT +VERSION = $${MAYO_VERSION_MAJ}.$${MAYO_VERSION_MIN}.$${MAYO_VERSION_PAT} +MAYO_VERSION = $${VERSION} equals(QT_ARCH, i386) { VERSION_TARGET_ARCH = x86 From 0e8372ee716e1a5453819f988f22bf8c87741ea7 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 12 Dec 2023 17:35:22 +0100 Subject: [PATCH 88/92] Doc: add screenshot image for Ubuntu --- doc/screenshot_ubuntu_1.png | Bin 0 -> 228085 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/screenshot_ubuntu_1.png diff --git a/doc/screenshot_ubuntu_1.png b/doc/screenshot_ubuntu_1.png new file mode 100644 index 0000000000000000000000000000000000000000..dd877c88c5e9b0cc8d89c8086e25c8a4ff30c7aa GIT binary patch literal 228085 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

b18+nB>iOM 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�q!Aul!RE$M6}DaS+ca!)DX}c^@Kt~%kXf=)Y5%z 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

xy` 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”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 literal 0 HcmV?d00001 diff --git a/doc/screenshot_ubuntu_4.png b/doc/screenshot_ubuntu_4.png new file mode 100755 index 0000000000000000000000000000000000000000..2a0f4070e393e1731ee0ea7666db28bbe892662c GIT binary patch literal 282896 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%0D6)B7Ie_rDz^aY4$IUQ=h5W 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%0AOW{`EC-x3Z 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ⅆ42VD#~1%*)D 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

^(Iv+p=#@W`O)`TU~bMn*oNP#>z@hUnb`#7z^xy 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 SP2G^e&nD9?tQ-@k$o~Mgm!UBL literal 0 HcmV?d00001 diff --git a/doc/screenshot_ubuntu_5.png b/doc/screenshot_ubuntu_5.png new file mode 100755 index 0000000000000000000000000000000000000000..34ab7e52c11ad0a66da5a8f50b5e50d361f1f391 GIT binary patch literal 392532 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 z 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

O8c)Zg7;PiDjp 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 z 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℞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

*oG`ad~+RLY@KE*Pi9P@^YNi0f?f#?=RX>qO}8v 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�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 literal 0 HcmV?d00001 diff --git a/doc/screenshot_ubuntu_main.png b/doc/screenshot_ubuntu_main.png new file mode 100755 index 0000000000000000000000000000000000000000..9519a13a1064f85450a9122e8bcf8ee2d3639f70 GIT binary patch literal 234931 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%0D6Hn~)Vn7{V9zzbPcR z`4AM+!h%gy1LRirT8O$4#jwyewxayJ3U2Gw%2&UovpJJkgo#zdI`%*;o7ZQ%3o2`{|yg z@5Qv=J(f@JC@kZvIKSVZ!h_ZRQuUGQn4k(ympLP2m?j-?MYnQj9hPIUvac^a$=A?+ zmKHn}>5m$kRTH!2Cc)6S`-v3Xl@+Hn(_x!3EpY8iS%AJ0Ah;`-R^e6AP zqB6bw$Z`7oD;a0cW+|ighy*kUzVayJPjMZL8XWL#P{CR$#>nne& z%|*8ztuqBWY>T%i86Xm*Twr`xmy{#of((&!& zj;4>6HYm!8r|$T9*x8jY6TE7s{95D3e;We%4514I#GqafA^VIu@v^5sd~b8ACA}!~ zcLKpxUvi(I#Ls_(m-_w;qn~?=2^#M7@AnYBU~nBYYJdG+o^d%e!E-q`c$>NEZw79) zUZ-lK`;|{;M33)U<50|w8^{SOxR8vhZsO9?wEEJ_{pHQaD6BX6-=M#(C@N%-7i^(Ke9f@3Z6VuX;^@E&FjPYGob(6MzlI}zZ>TDY)74RKVA2tWSA*{p8hdl!-cOkg+So25 zg63&NdXZ*yGB18lRP)~Y`pD#Q!)KHG*GxntqCbkG9$p|vZplUj#8Y{y!wG0{L{8*R1Ko*cm;6ZK1Hdy?*Hle=FDuYx}0Hp(X2 z(U*-Ur!RCqAWuHWzo3nD)3mNPQqXcg#r|D)!e+IiucdOyJ0tM#tT;bE>&K75g|}w6 zL&YI_vfp<&QL>W2)?ysUJe(C+5IN!*Cu2nLp3kpX= zVMs^J{iYwBP3_JytH12Yi>sRvAgp}UE1DbKy2n>n3Md%kcMu<)(}s!5QG*xD+??Is zF=SGwD>B@BfRUj*?@=&ao#5kh7gYO(KeUY;payJ6-*y^QCb028yERE6BsbY*7gEOg z%0D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�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 TJei!dx<&WJ3 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 literal 0 HcmV?d00001 From c8dabc23d3e2a289a78f440dce53db0ce881e72d Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Fri, 15 Dec 2023 10:37:44 +0100 Subject: [PATCH 90/92] App: fix crash at shutdown in some conditions --- src/app/app_context.cpp | 5 +++-- src/app/commands_api.cpp | 9 +++++++++ src/app/commands_api.h | 2 ++ src/app/commands_window.h | 1 + src/app/mainwindow.cpp | 16 ++++++++++------ src/app/mainwindow.h | 1 + 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/app/app_context.cpp b/src/app/app_context.cpp index 36a60afa..8cecc24e 100644 --- a/src/app/app_context.cpp +++ b/src/app/app_context.cpp @@ -26,7 +26,7 @@ AppContext::AppContext(MainWindow* wnd) QObject::connect( m_wnd->widgetPageDocuments(), &WidgetMainControl::currentDocumentIndexChanged, this, &AppContext::onCurrentDocumentIndexChanged - ); + ); } GuiApplication* AppContext::guiApp() const @@ -41,7 +41,8 @@ TaskManager* AppContext::taskMgr() const QWidget* AppContext::pageDocuments_widgetLeftSideBar() const { - return m_wnd->widgetPageDocuments()->widgetLeftSideBar(); + const WidgetMainControl* pageDocs = m_wnd->widgetPageDocuments(); + return pageDocs ? pageDocs->widgetLeftSideBar() : nullptr; } QWidget* AppContext::widgetMain() const diff --git a/src/app/commands_api.cpp b/src/app/commands_api.cpp index 047cf4df..d7c1a500 100644 --- a/src/app/commands_api.cpp +++ b/src/app/commands_api.cpp @@ -76,6 +76,15 @@ QAction* CommandContainer::findCommandAction(std::string_view name) const return cmd ? cmd->action() : nullptr; } +void CommandContainer::clear() +{ + for (auto [name, cmd] : m_mapCommand) { + delete cmd; + } + + m_mapCommand.clear(); +} + void CommandContainer::addCommand_impl(std::string_view name, Command* cmd) { assert(m_appContext != nullptr); diff --git a/src/app/commands_api.h b/src/app/commands_api.h index a7bb956b..1b70fdcd 100644 --- a/src/app/commands_api.h +++ b/src/app/commands_api.h @@ -117,6 +117,8 @@ class CommandContainer { // The command name is implicit and found by assuming the presence of CmdType::Name class member template CmdType* addNamedCommand(Args... p); + void clear(); + private: void addCommand_impl(std::string_view name, Command* cmd); diff --git a/src/app/commands_window.h b/src/app/commands_window.h index bf936f57..1488fdef 100644 --- a/src/app/commands_window.h +++ b/src/app/commands_window.h @@ -26,6 +26,7 @@ class CommandMainWidgetToggleFullscreen : public Command { class CommandLeftSidebarWidgetToggle : public Command { public: CommandLeftSidebarWidgetToggle(IAppContext* context); + void execute() override; bool getEnabledStatus() const override; diff --git a/src/app/mainwindow.cpp b/src/app/mainwindow.cpp index de6233e5..2d8e10f9 100644 --- a/src/app/mainwindow.cpp +++ b/src/app/mainwindow.cpp @@ -66,6 +66,8 @@ MainWindow::MainWindow(GuiApplication* guiApp, QWidget* parent) MainWindow::~MainWindow() { + // Force deletion of Command objects as some of them are event filters of MainWindow widgets + m_cmdContainer.clear(); delete m_ui; } @@ -284,18 +286,20 @@ void MainWindow::updateCurrentPage() m_appContext->setCurrentPage(newPage); } +IWidgetMainPage* MainWindow::widgetMainPage(IAppContext::Page page) const +{ + auto it = m_mapWidgetPage.find(page); + return it != m_mapWidgetPage.cend() ? it->second : nullptr; +} + WidgetMainHome* MainWindow::widgetPageHome() const { - auto it = m_mapWidgetPage.find(IAppContext::Page::Home); - assert(it != m_mapWidgetPage.cend()); - return dynamic_cast(it->second); + return dynamic_cast(this->widgetMainPage(IAppContext::Page::Home)); } WidgetMainControl* MainWindow::widgetPageDocuments() const { - auto it = m_mapWidgetPage.find(IAppContext::Page::Documents); - assert(it != m_mapWidgetPage.cend()); - return dynamic_cast(it->second); + return dynamic_cast(this->widgetMainPage(IAppContext::Page::Documents)); } } // namespace Mayo diff --git a/src/app/mainwindow.h b/src/app/mainwindow.h index 2b8f4b91..c82dd1db 100644 --- a/src/app/mainwindow.h +++ b/src/app/mainwindow.h @@ -54,6 +54,7 @@ class MainWindow : public QMainWindow { void updateControlsActivation(); void updateCurrentPage(); + IWidgetMainPage* widgetMainPage(IAppContext::Page page) const; WidgetMainHome* widgetPageHome() const; WidgetMainControl* widgetPageDocuments() const; From b81888771e7b632e77e5e0bffbca51f3f7c74295 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 19 Dec 2023 16:22:35 +0100 Subject: [PATCH 91/92] Tests: add unit test for StringConv utility --- tests/test_base.cpp | 11 +++++++++++ tests/test_base.h | 1 + 2 files changed, 12 insertions(+) diff --git a/tests/test_base.cpp b/tests/test_base.cpp index b02268f5..e98f482f 100644 --- a/tests/test_base.cpp +++ b/tests/test_base.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -630,6 +631,16 @@ void TestBase::DoubleToString_test() QCOMPARE(to_stdString(-45.6789).locale(cLocale).decimalCount(6).get(), "-45.6789"); } +void TestBase::StringConv_test() +{ + std::optional frLocale = findFrLocale(); + if (frLocale) { + const std::string stdStr = to_stdString(14758.5).locale(frLocale.value()); + const auto occExtStr = to_OccExtString(stdStr); + QCOMPARE(stdStr, to_stdString(occExtStr)); + } +} + void TestBase::BRepUtils_test() { QVERIFY(BRepUtils::moreComplex(TopAbs_COMPOUND, TopAbs_SOLID)); diff --git a/tests/test_base.h b/tests/test_base.h index def9ed24..b5a73817 100644 --- a/tests/test_base.h +++ b/tests/test_base.h @@ -45,6 +45,7 @@ private slots: void IO_bugGitHub166_test_data(); void DoubleToString_test(); + void StringConv_test(); void BRepUtils_test(); From a61a27ad12aa221489dfa6db0814dc751310c211 Mon Sep 17 00:00:00 2001 From: Hugues Delorme Date: Tue, 19 Dec 2023 17:11:27 +0100 Subject: [PATCH 92/92] Update README.md[skip ci] --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 609cd760..1fba5424 100644 --- a/README.md +++ b/README.md @@ -62,9 +62,14 @@ OBJ | :white_check_mark: | :white_check_mark: | glTF | :white_check_mark: | :white_check_mark: | 1.0, 2.0 and GLB VRML | :white_check_mark: | :white_check_mark: | v2.0 UTF8 STL | :white_check_mark: | :white_check_mark: | ASCII/binary -AMF | :x: | :white_check_mark: | v1.2 Text/ZIP +AMF | :white_check_mark: | :white_check_mark: | v1.2 Text/ZIP(export) PLY | :white_check_mark: | :white_check_mark: | ASCII/binary OFF | :white_check_mark: | :white_check_mark: | +3MF | :white_check_mark: | :x: | +3DS | :white_check_mark: | :x: | +FBX | :white_check_mark: | :x: | +Collada | :white_check_mark: | :x: | +X3D | :white_check_mark: | :x: | Image | :x: | :white_check_mark: | PNG, JPEG, ... See also this dedicated [wikipage](https://github.com/fougue/mayo/wiki/Supported-formats) for more details

$oWz*Jhq~)r8mylL+s||Tu)lc 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 Date: Thu, 14 Dec 2023 11:05:42 +0100 Subject: [PATCH 89/92] Doc: add more screenshots for Ubuntu[skip ci] --- doc/screenshot_ubuntu_2.png | Bin 0 -> 207658 bytes doc/screenshot_ubuntu_3.png | Bin 0 -> 199406 bytes doc/screenshot_ubuntu_4.png | Bin 0 -> 282896 bytes doc/screenshot_ubuntu_5.png | Bin 0 -> 392532 bytes doc/screenshot_ubuntu_main.png | Bin 0 -> 234931 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 doc/screenshot_ubuntu_2.png create mode 100755 doc/screenshot_ubuntu_3.png create mode 100755 doc/screenshot_ubuntu_4.png create mode 100755 doc/screenshot_ubuntu_5.png create mode 100755 doc/screenshot_ubuntu_main.png diff --git a/doc/screenshot_ubuntu_2.png b/doc/screenshot_ubuntu_2.png new file mode 100755 index 0000000000000000000000000000000000000000..b57cdc3e8fadfe57b555b2afe9a4160bf1634bc8 GIT binary patch literal 207658 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 @;e0_akU1=cHt_aA6m8(4C6tjVy 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%0A^A~Swpv5^1j@~eLcFpke*di5 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