Interface mockup 11

This commit is contained in:
Dion Moult
2026-05-07 14:45:23 +10:00
parent a340e6cf9a
commit d565dc3ff3
7 changed files with 366 additions and 44 deletions
@@ -0,0 +1,138 @@
// This file was generated with the assistance of an AI coding tool.
/********************************************************************************
* *
* This file is part of IfcOpenShell. *
* *
* IfcOpenShell is free software: you can redistribute it and/or modify *
* it under the terms of the Lesser GNU General Public License as published by *
* the Free Software Foundation, either version 3.0 of the License, or *
* (at your option) any later version. *
* *
* IfcOpenShell is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* Lesser GNU General Public License for more details. *
* *
* You should have received a copy of the Lesser GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
********************************************************************************/
#include "Controller.h"
#include "../../../ifcviewer/AppSettings.h"
#include "../../../ifcviewer/Federation.h"
#include "../../../ifcviewer/SceneLoader.h"
#include "../../../ifcviewer/ViewportWindow.h"
#include <Eigen/Dense>
namespace ifcinterface::panels::viewport {
ViewportController::ViewportController(Federation* federation,
SceneLoader* loader,
ViewportWindow* viewport,
const QHash<QString, uint32_t>* fed_id_to_model_id,
const QHash<uint32_t, QString>* model_id_to_fed_id,
QObject* parent)
: QObject(parent)
, federation_(federation)
, loader_(loader)
, viewport_(viewport)
, fed_id_to_model_id_(fed_id_to_model_id)
, model_id_to_fed_id_(model_id_to_fed_id)
{
connect(federation_, &Federation::federatedFalseOriginChanged,
this, &ViewportController::applyFederatedFalseOrigin);
connect(federation_, &Federation::configChanged, this, [this]() {
applyFederatedFalseOrigin();
for (auto it = model_id_to_fed_id_->cbegin(); it != model_id_to_fed_id_->cend(); ++it) {
applyModelTransformation(it.key());
}
});
connect(federation_, &Federation::modelTransformationChanged,
this, [this](const QString& fed_id) {
auto it = fed_id_to_model_id_->find(fed_id);
if (it != fed_id_to_model_id_->end()) {
applyModelTransformation(it.value());
}
});
connect(loader_, &SceneLoader::loadedFromSidecar, this,
[this](uint32_t mid, qint64 /*elapsed_ms*/) {
applyCoordinateOperation(mid);
maybeGuessFederatedFalseOrigin(mid);
});
connect(loader_, &SceneLoader::dataSourceReady, this,
[this](uint32_t mid) {
applyCoordinateOperation(mid);
});
connect(loader_, &SceneLoader::loadedFromStream, this,
[this](uint32_t mid, qint64 /*elapsed_ms*/) {
applyCoordinateOperation(mid);
maybeGuessFederatedFalseOrigin(mid);
});
connect(&AppSettings::instance(),
&AppSettings::applyCoordinateOperationChanged,
this, [this](bool /*enabled*/) {
for (auto it = model_id_to_fed_id_->cbegin(); it != model_id_to_fed_id_->cend(); ++it) {
applyCoordinateOperation(it.key());
}
});
}
void ViewportController::applyCoordinateOperation(uint32_t mid) {
Eigen::Matrix4d matrix = Eigen::Matrix4d::Identity();
if (AppSettings::instance().applyCoordinateOperation()) {
if (const ModelGeoref* georef = loader_->modelGeoref(mid)) {
if (georef->has_coordinate_operation) {
matrix = georef->coordinate_operation_meters;
}
}
}
viewport_->setModelCoordinateOperation(mid, matrix);
applyModelTransformation(mid);
}
void ViewportController::applyModelTransformation(uint32_t mid) {
Eigen::Matrix4d matrix = Eigen::Matrix4d::Identity();
auto fed_it = model_id_to_fed_id_->find(mid);
if (fed_it != model_id_to_fed_id_->end()) {
if (const Federation::Model* model = federation_->findById(fed_it.value())) {
ModelUnits units;
Eigen::Matrix4d coordinate_operation = Eigen::Matrix4d::Identity();
if (const ModelGeoref* georef = loader_->modelGeoref(mid)) {
units = georef->units;
if (AppSettings::instance().applyCoordinateOperation() &&
georef->has_coordinate_operation) {
coordinate_operation = georef->coordinate_operation_meters;
}
}
matrix = composeModelTransformation(
model->model_transformation, federation_->config(), units, coordinate_operation);
}
}
viewport_->setModelTransformation(mid, matrix);
}
void ViewportController::applyFederatedFalseOrigin() {
viewport_->setFederatedFalseOrigin(
composeFederatedFalseOrigin(federation_->federatedFalseOrigin(), federation_->config()));
}
void ViewportController::maybeGuessFederatedFalseOrigin(uint32_t mid) {
if (!federation_->filePath().isEmpty()) return;
const FederatedFalseOrigin& current = federation_->federatedFalseOrigin();
const FederatedFalseOrigin defaults;
if (current.xyz != defaults.xyz || current.rz_deg != defaults.rz_deg) return;
const Eigen::Matrix4d* placement = loader_->firstPlacement(mid);
const ModelGeoref* georef = loader_->modelGeoref(mid);
if (placement == nullptr || georef == nullptr) return;
federation_->setFederatedFalseOrigin(guessFederatedFalseOrigin(
*placement, *georef, federation_->config(),
AppSettings::instance().applyCoordinateOperation()));
}
} // namespace ifcinterface::panels::viewport
@@ -0,0 +1,60 @@
// This file was generated with the assistance of an AI coding tool.
/********************************************************************************
* *
* This file is part of IfcOpenShell. *
* *
* IfcOpenShell is free software: you can redistribute it and/or modify *
* it under the terms of the Lesser GNU General Public License as published by *
* the Free Software Foundation, either version 3.0 of the License, or *
* (at your option) any later version. *
* *
* IfcOpenShell is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* Lesser GNU General Public License for more details. *
* *
* You should have received a copy of the Lesser GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
********************************************************************************/
#ifndef IFCINTERFACE_PANELS_VIEWPORT_CONTROLLER_H
#define IFCINTERFACE_PANELS_VIEWPORT_CONTROLLER_H
#include <QHash>
#include <QObject>
class Federation;
class SceneLoader;
class ViewportWindow;
namespace ifcinterface::panels::viewport {
class ViewportController : public QObject {
Q_OBJECT
public:
explicit ViewportController(Federation* federation,
SceneLoader* loader,
ViewportWindow* viewport,
const QHash<QString, uint32_t>* fed_id_to_model_id,
const QHash<uint32_t, QString>* model_id_to_fed_id,
QObject* parent = nullptr);
void applyFederatedFalseOrigin();
private:
void applyCoordinateOperation(uint32_t mid);
void applyModelTransformation(uint32_t mid);
void maybeGuessFederatedFalseOrigin(uint32_t mid);
Federation* federation_ = nullptr;
SceneLoader* loader_ = nullptr;
ViewportWindow* viewport_ = nullptr;
const QHash<QString, uint32_t>* fed_id_to_model_id_ = nullptr;
const QHash<uint32_t, QString>* model_id_to_fed_id_ = nullptr;
};
} // namespace ifcinterface::panels::viewport
#endif
+60
View File
@@ -0,0 +1,60 @@
// This file was generated with the assistance of an AI coding tool.
/********************************************************************************
* *
* This file is part of IfcOpenShell. *
* *
* IfcOpenShell is free software: you can redistribute it and/or modify *
* it under the terms of the Lesser GNU General Public License as published by *
* the Free Software Foundation, either version 3.0 of the License, or *
* (at your option) any later version. *
* *
* IfcOpenShell is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* Lesser GNU General Public License for more details. *
* *
* You should have received a copy of the Lesser GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
********************************************************************************/
#include "Widget.h"
#include "../../../ifcviewer/ViewportWindow.h"
#include <QFrame>
#include <QVBoxLayout>
#include <QWidget>
namespace ifcinterface::panels::viewport {
ViewportWidget::ViewportWidget(QWidget* parent)
: QWidget(parent)
{
auto* root = new QVBoxLayout(this);
root->setContentsMargins(0, 0, 0, 0);
root->setSpacing(0);
auto* shell = new QFrame(this);
shell->setObjectName("viewportShell");
auto* shell_layout = new QVBoxLayout(shell);
shell_layout->setContentsMargins(10, 10, 10, 10);
shell_layout->setSpacing(0);
auto* frame = new QFrame(shell);
frame->setObjectName("viewportFrame");
auto* frame_layout = new QVBoxLayout(frame);
frame_layout->setContentsMargins(0, 0, 0, 0);
frame_layout->setSpacing(0);
viewport_ = new ViewportWindow();
viewport_container_ = QWidget::createWindowContainer(viewport_, frame);
viewport_container_->setMinimumSize(400, 300);
viewport_container_->setFocusPolicy(Qt::StrongFocus);
frame_layout->addWidget(viewport_container_);
shell_layout->addWidget(frame);
root->addWidget(shell);
}
} // namespace ifcinterface::panels::viewport
+45
View File
@@ -0,0 +1,45 @@
// This file was generated with the assistance of an AI coding tool.
/********************************************************************************
* *
* This file is part of IfcOpenShell. *
* *
* IfcOpenShell is free software: you can redistribute it and/or modify *
* it under the terms of the Lesser GNU General Public License as published by *
* the Free Software Foundation, either version 3.0 of the License, or *
* (at your option) any later version. *
* *
* IfcOpenShell is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* Lesser GNU General Public License for more details. *
* *
* You should have received a copy of the Lesser GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
* *
********************************************************************************/
#ifndef IFCINTERFACE_PANELS_VIEWPORT_WIDGET_H
#define IFCINTERFACE_PANELS_VIEWPORT_WIDGET_H
#include <QWidget>
class ViewportWindow;
namespace ifcinterface::panels::viewport {
class ViewportWidget : public QWidget {
Q_OBJECT
public:
explicit ViewportWidget(QWidget* parent = nullptr);
ViewportWindow* viewport() const { return viewport_; }
private:
ViewportWindow* viewport_ = nullptr;
QWidget* viewport_container_ = nullptr;
};
} // namespace ifcinterface::panels::viewport
#endif