From 2d23eb6b2878f069bf8a98fd01ddbdf5c0b931cc Mon Sep 17 00:00:00 2001 From: Ralph Wessel Date: Tue, 15 Oct 2024 23:05:07 +0100 Subject: [PATCH] Fixes to Column and ColumnSegment classes --- SpeckleLib/Speckle/Database/Content/Record.cpp | 2 +- .../Element/ArchicadElementDBaseEngine.cpp | 7 +++++-- SpeckleLib/Speckle/Record/Element/ColumnSegment.cpp | 10 ++++++++++ SpeckleLib/Speckle/Record/Element/ColumnSegment.h | 5 +++++ SpeckleLib/Speckle/Record/Element/Element.cpp | 13 +++++++++++-- SpeckleLib/Speckle/Record/Element/Element.h | 5 +++++ .../Record/Element/Interface/SegmentedColumn.cpp | 4 ++-- SpeckleLib/Speckle/Record/Element/Memo.h | 13 ++++++++++++- 8 files changed, 51 insertions(+), 8 deletions(-) diff --git a/SpeckleLib/Speckle/Database/Content/Record.cpp b/SpeckleLib/Speckle/Database/Content/Record.cpp index 3df4c86..3d75448 100644 --- a/SpeckleLib/Speckle/Database/Content/Record.cpp +++ b/SpeckleLib/Speckle/Database/Content/Record.cpp @@ -40,7 +40,7 @@ bool Record::fillInventory(active::serialise::Inventory& inventory) const { }.withType(&typeid(base))); inventory.merge(Inventory{ { - { Identity{fieldID[speckleTypeID]}, speckleTypeID, element }, + { Identity{fieldID[speckleTypeID]}, speckleTypeID, attribute }, }, }.withType(&typeid(Record))); return true; diff --git a/SpeckleLib/Speckle/Database/Storage/ArchicadDBase/Element/ArchicadElementDBaseEngine.cpp b/SpeckleLib/Speckle/Database/Storage/ArchicadDBase/Element/ArchicadElementDBaseEngine.cpp index b6ed332..a1d7fd5 100644 --- a/SpeckleLib/Speckle/Database/Storage/ArchicadDBase/Element/ArchicadElementDBaseEngine.cpp +++ b/SpeckleLib/Speckle/Database/Storage/ArchicadDBase/Element/ArchicadElementDBaseEngine.cpp @@ -137,8 +137,11 @@ std::unique_ptr ArchicadElementDBaseEngine::getObject(const BIMRecordID uint64_t filter = documentID ? Guid::toInt(*documentID) : APIMemoMask_All; if (auto err = ACAPI_Element_GetMemo(ID, memo.get(), filter); err != NoError) ACAPI_DisposeElemMemoHdls(memo.get()); - else - return std::make_unique(std::move(memo)); + else { + auto result = std::make_unique(); + result->set(std::move(memo)); + return result; + } } if (!tableID) { //Use the active table if none is specified diff --git a/SpeckleLib/Speckle/Record/Element/ColumnSegment.cpp b/SpeckleLib/Speckle/Record/Element/ColumnSegment.cpp index f18b949..34d4cb2 100644 --- a/SpeckleLib/Speckle/Record/Element/ColumnSegment.cpp +++ b/SpeckleLib/Speckle/Record/Element/ColumnSegment.cpp @@ -86,6 +86,16 @@ ColumnSegment::ColumnSegment(const ColumnSegment& source) : base{ source } { } //ColumnSegment::ColumnSegment +/*-------------------------------------------------------------------- + Move constructor + + source: The object to move + --------------------------------------------------------------------*/ +ColumnSegment::ColumnSegment(ColumnSegment&& source) : base{source} { + m_data = std::move(source.m_data); +} //ColumnSegment::ColumnSegment + + /*-------------------------------------------------------------------- Destructor --------------------------------------------------------------------*/ diff --git a/SpeckleLib/Speckle/Record/Element/ColumnSegment.h b/SpeckleLib/Speckle/Record/Element/ColumnSegment.h index d16b414..85c731b 100644 --- a/SpeckleLib/Speckle/Record/Element/ColumnSegment.h +++ b/SpeckleLib/Speckle/Record/Element/ColumnSegment.h @@ -45,6 +45,11 @@ namespace speckle::record::element { @param source The object to copy */ ColumnSegment(const ColumnSegment& source); + /*! + Move constructor + @param source The object to move + */ + ColumnSegment(ColumnSegment&& source); /*! Destructor */ diff --git a/SpeckleLib/Speckle/Record/Element/Element.cpp b/SpeckleLib/Speckle/Record/Element/Element.cpp index d2a80ff..5aa28e4 100644 --- a/SpeckleLib/Speckle/Record/Element/Element.cpp +++ b/SpeckleLib/Speckle/Record/Element/Element.cpp @@ -87,6 +87,16 @@ Element::Element(const Element& source) : base{ source } { } //Element::Element +/*-------------------------------------------------------------------- + Move constructor + + source: The object to move + --------------------------------------------------------------------*/ +Element::Element(Element&& source) : base{source} { + m_data = std::move(source.m_data); +} //Element::Element + + /*-------------------------------------------------------------------- Destructor --------------------------------------------------------------------*/ @@ -277,8 +287,7 @@ void Element::loadMemo(Part::filter_bits filter, std::unique_ptr& memo) co auto project = addon()->getActiveProject().lock(); if (!project) return; - auto elementDatabase = project->getElementDatabase(); - if (auto loaded = elementDatabase->getMemo(getBIMID(), filter); loaded) + if (auto loaded = project->getElementDatabase()->getMemo(getBIMID(), filter); loaded) memo.reset(loaded.release()); } } //Element::loadMemo diff --git a/SpeckleLib/Speckle/Record/Element/Element.h b/SpeckleLib/Speckle/Record/Element/Element.h index 80e479d..8a2bef1 100644 --- a/SpeckleLib/Speckle/Record/Element/Element.h +++ b/SpeckleLib/Speckle/Record/Element/Element.h @@ -52,6 +52,11 @@ namespace speckle::record::element { @param source The object to copy */ Element(const Element& source); + /*! + Move constructor + @param source The object to move + */ + Element(Element&& source); /*! Destructor */ diff --git a/SpeckleLib/Speckle/Record/Element/Interface/SegmentedColumn.cpp b/SpeckleLib/Speckle/Record/Element/Interface/SegmentedColumn.cpp index e181fee..92bab68 100644 --- a/SpeckleLib/Speckle/Record/Element/Interface/SegmentedColumn.cpp +++ b/SpeckleLib/Speckle/Record/Element/Interface/SegmentedColumn.cpp @@ -131,7 +131,7 @@ bool SegmentedColumn::receive(const Memo& memo) const { auto cutPtr = memo.root()->assemblySegmentCuts; auto schemePtr = memo.root()->assemblySegmentSchemes; auto profilePtr = memo.root()->assemblySegmentProfiles; - if ((segmentPtr == nullptr) || (cutPtr == nullptr) || (schemePtr == nullptr) || (profilePtr == nullptr)) + if ((segmentPtr == nullptr) || (cutPtr == nullptr) || (schemePtr == nullptr)) return false; //Determine available item count auto segmentCount = BIMMemory::getPtrSize(segmentPtr) / sizeof(API_ColumnSegmentType); @@ -149,7 +149,7 @@ bool SegmentedColumn::receive(const Memo& memo) const { break; } } - m_data->segments.push_back({segmentPtr[n], getTableID(), cutPtr[n], cutPtr[n + 1], schemePtr[n], thisProfile}); + m_data->segments.emplace_back(ColumnSegment{segmentPtr[n], getTableID(), cutPtr[n], cutPtr[n + 1], schemePtr[n], thisProfile}); m_data->segments.back().setPath(path); } setMemoLoaded(true); diff --git a/SpeckleLib/Speckle/Record/Element/Memo.h b/SpeckleLib/Speckle/Record/Element/Memo.h index 644a5e0..b78e77b 100644 --- a/SpeckleLib/Speckle/Record/Element/Memo.h +++ b/SpeckleLib/Speckle/Record/Element/Memo.h @@ -63,7 +63,18 @@ namespace speckle::record::element { #endif // MARK: - Functions (mutating) - + +#ifdef ARCHICAD + /*! + Get the memo root data + @return The memo root data (nullptr on failure) + */ + Memo& set(std::unique_ptr memo) { + m_data = std::move(memo); + return *this; + } +#endif + private: #ifdef ARCHICAD //NB: The following is functionally redundant for memos - requirement of base class