mirror of
https://github.com/IfcOpenShell/IfcOpenShell.git
synced 2026-09-26 10:11:46 +00:00
properties: real attributes + relationships; keep selection on deselect
Add helpers to src/helpers/element: get_scalar_attributes (primitive EXPRESS attributes only — entity refs / aggregates omitted), get_type and get_container (ports of ifcopenshell.util.element), and a public get_string_attribute for safe by-name reads. Wire them into the properties panel: - Attributes section shows the element's direct primitive attributes for live entities, or cached GlobalId / Name for geometry-only elements. - Relationships section shows the construction Type and spatial Container by name (falling back to the class when unnamed). - Placeholders are cleared once a project is loaded, so no mock data leaks. Also: a deselect (click on empty space -> object_id 0) no longer resets the panel; it keeps showing the last active object. Project reset/open still clear it. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,8 @@
|
||||
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
// Mirrors ifcopenshell.util.element.get_predefined_type. Returns the element's
|
||||
// PredefinedType, falling back to the user-defined ObjectType / ElementType /
|
||||
@@ -35,4 +37,28 @@
|
||||
// IfcObject, or a geometry-only proxy with no live IFC data).
|
||||
std::optional<std::string> get_predefined_type(const express::Base& element);
|
||||
|
||||
// Mirrors ifcopenshell.util.element.get_type: the construction type element of
|
||||
// an occurrence (via IsTypedBy on IFC4+, IsDefinedBy on IFC2X3). A type element
|
||||
// returns itself. Empty express::Base when the element is untyped.
|
||||
express::Base get_type(const express::Base& element);
|
||||
|
||||
// Mirrors ifcopenshell.util.element.get_container (indirect, no ifc_class
|
||||
// filter): the spatial element that contains this element — the directly
|
||||
// containing spatial structure, or, for an aggregated part, the container of its
|
||||
// aggregate parent. Empty when uncontained. (The nest / filled-void /
|
||||
// voided-element branches of the Python original are not ported.)
|
||||
express::Base get_container(const express::Base& element);
|
||||
|
||||
// Safely read a string- or enum-valued attribute by name (Python's getattr).
|
||||
// std::nullopt when the attribute is absent for this entity's type or IFC null.
|
||||
std::optional<std::string> get_string_attribute(const express::Base& element,
|
||||
const std::string& name);
|
||||
|
||||
// The element's direct EXPRESS attributes that have a primitive scalar value
|
||||
// (string / enum / integer / real / boolean / logical), as (name, formatted
|
||||
// value) pairs in declaration order. Attributes that are entity references,
|
||||
// aggregates / lists, or unset (IFC null) are omitted — so the caller gets a
|
||||
// flat, display-ready view with no nested objects.
|
||||
std::vector<std::pair<std::string, std::string>> get_scalar_attributes(const express::Base& element);
|
||||
|
||||
#endif // ELEMENT_H
|
||||
|
||||
Reference in New Issue
Block a user