Files
IfcOpenShell/src/bonsaiviewer/modules/properties/View.cpp
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

125 lines
5.2 KiB
C++
Raw Normal View History

2026-05-05 09:40:58 +10:00
// 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/>. *
* *
********************************************************************************/
2026-05-06 21:35:12 +10:00
#include "View.h"
2026-05-05 09:40:58 +10:00
2026-05-09 19:43:26 +10:00
#include "Panel.h"
2026-05-05 09:40:58 +10:00
2026-05-06 10:47:03 +10:00
#include "../../ElementRegistry.h"
2026-05-07 17:10:04 +10:00
#include "../../SessionState.h"
2026-05-06 10:47:03 +10:00
2026-05-20 09:38:10 +10:00
namespace bonsaiviewer::modules::properties {
2026-05-05 09:40:58 +10:00
2026-05-09 19:43:26 +10:00
PropertiesPanelView::PropertiesPanelView(PropertiesPanel* widget,
2026-05-20 09:38:10 +10:00
bonsaiviewer::SessionState* session_state,
2026-05-06 10:47:03 +10:00
QObject* parent)
2026-05-07 17:10:04 +10:00
: QObject(parent), widget_(widget), session_state_(session_state)
2026-05-05 09:40:58 +10:00
{
2026-05-20 09:38:10 +10:00
connect(session_state_, &bonsaiviewer::SessionState::selectionChanged, this, [this](uint32_t object_id) {
2026-05-06 10:47:03 +10:00
refresh(object_id);
});
2026-05-20 09:38:10 +10:00
connect(session_state_, &bonsaiviewer::SessionState::projectReset, this, [this]() {
2026-05-07 17:10:04 +10:00
refresh(0);
});
2026-05-20 09:38:10 +10:00
connect(session_state_, &bonsaiviewer::SessionState::projectOpened, this, [this](const QString&) {
2026-05-15 17:08:08 +10:00
refresh(0);
});
2026-05-07 12:21:55 +10:00
refresh(0);
}
2026-05-06 10:47:03 +10:00
void PropertiesPanelView::refresh(uint32_t object_id) {
2026-05-07 17:10:04 +10:00
auto* registry = session_state_->elementRegistry();
2026-05-06 10:47:03 +10:00
PropertiesPanelState state;
state.entity = {"IfcWall", "SOLIDWALL"};
state.attributes = {
2026-05-05 09:40:58 +10:00
{"GlobalId", "2Q$n5SLPP9Q8B7wQKjKfUQ"},
{"Name", "Core-EXT-204"},
{"Description", "External load-bearing wall"},
};
2026-05-06 10:47:03 +10:00
state.relationships = {
2026-05-05 09:40:58 +10:00
{"Type", "Basic Wall: Exterior - 200mm"},
{"Container", "Level 02"},
};
2026-05-06 10:47:03 +10:00
state.property_sets = {
2026-05-05 09:40:58 +10:00
{"Pset_WallCommon",
{{"Reference", "Core-EXT-204"},
{"Status", "Reviewed"},
{"Fire Rating", "120 min"},
{"LoadBearing", "True"}}},
{"Identity Data",
{{"Type", "IfcWall"},
{"Name", "Core-EXT-204"},
{"Owner", "Architecture"},
{"Phase", "Construction"}}},
{"BIM Collaboration",
{{"Issue Count", "2 open"},
{"Last Review", "2026-04-30"},
{"Assigned To", "Design Coordination"}}},
};
2026-05-06 10:47:03 +10:00
state.quantity_sets = {
2026-05-05 09:40:58 +10:00
{"BaseQuantities",
{{"Length", "6.20 m"},
{"Height", "3.45 m"},
{"Width", "0.30 m"},
{"Volume", "6.42 m3"}}},
{"Finish Quantities",
{{"NetSideArea", "21.39 m2"},
{"GrossArea", "22.10 m2"},
{"Paint Coverage", "42.78 m2"}}},
};
2026-05-07 17:10:04 +10:00
if (!registry) {
2026-05-06 12:36:28 +10:00
widget_->render(state);
return;
}
auto entity = registry->findEntity(object_id);
if (entity) {
state.entity.entity_class = QString::fromStdString(entity->declaration().name());
if (!state.property_sets.isEmpty() && !state.property_sets[1].rows.isEmpty()) {
state.property_sets[1].rows[0].value = state.entity.entity_class;
}
} else {
// No live IFC source for this object — typical when a pure-geometry
// .ifcview sidecar was loaded without its .ifc/.rdb sibling. Fall
// back to the basic info cached in the element registry so the
// panel still shows class / name / guid for visible elements.
2026-05-07 17:10:04 +10:00
auto info = registry->findBasicElementInfo(object_id);
2026-05-06 10:47:03 +10:00
if (info && !info->type.isEmpty()) {
state.entity.entity_class = info->type;
if (!state.property_sets.isEmpty() && !state.property_sets[1].rows.isEmpty()) {
state.property_sets[1].rows[0].value = info->type;
}
}
if (info && !info->name.isEmpty()) {
state.attributes[1].value = info->name;
if (state.property_sets.size() > 1 && state.property_sets[1].rows.size() > 1) {
state.property_sets[1].rows[1].value = info->name;
}
}
if (info && !info->guid.isEmpty()) {
state.attributes[0].value = info->guid;
}
}
widget_->render(state);
2026-05-05 09:40:58 +10:00
}
2026-05-20 09:38:10 +10:00
} // namespace bonsaiviewer::modules::properties