diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp b/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp index 6c9e660..4c5f125 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Base/BaseBridge.cpp @@ -11,8 +11,37 @@ #include "Connector/Interface/Browser/Bridge/Base/OpenUrl.h" #include "Speckle/Event/Type/ProjectEvent.h" +#include "Speckle/Environment/Project.h" +#include "Speckle/Record/Element/Element.h" +#include "Connector/Connector.h" +#include "Connector/ConnectorResource.h" +#include "Speckle/Database/Identity/RecordID.h" +#include "Speckle/Database/BIMElementDatabase.h" +#include "Connector/Record/Model/SenderModelCard.h" +#include "Connector/Record/Model/Filter/SendFilter.h" +#include "Connector/Database/ModelCardDatabase.h" + using namespace connector::interfac::browser::bridge; +namespace { +#ifdef ARCHICAD + void subscribeAllElementsToElementChangeEvents() + { + auto project = connector::connector()->getActiveProject().lock(); + if (!project) + return; + + auto elementDatabase = project->getElementDatabase(); + //auto table = elementDatabase->getTables(speckle::database::ElementStorage::TableType::primary2D); + //auto allElements = elementDatabase->findElements(nullptr, *table.begin()); + auto allElements = elementDatabase->findElements(); + + for (const auto& id : allElements) + ACAPI_Element_AttachObserver(id); + } +#endif +} + /*-------------------------------------------------------------------- Default constructor --------------------------------------------------------------------*/ @@ -28,6 +57,10 @@ BaseBridge::BaseBridge() : BrowserBridge{"baseBinding"} { addMethod(); addMethod(); addMethod(); + + // POC: Attaching Observer to all elements is too slow, registration is commented out for now + // subscribeAllElementsToElementChangeEvents(); + } //BaseBridge::BaseBridge /*-------------------------------------------------------------------- @@ -40,9 +73,11 @@ BaseBridge::BaseBridge() : BrowserBridge{"baseBinding"} { bool BaseBridge::handle(const speckle::event::ProjectEvent& event) { using enum speckle::event::ProjectEvent::Type; switch (event.getType()) { - case open: case close: + case open: { sendEvent("documentChanged"); - break; + // POC: Attaching Observer to all elements is too slow, registration is commented out for now + // subscribeAllElementsToElementChangeEvents(); + } break; default: break; } diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/Send.cpp b/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/Send.cpp index bf0cadf..59813f7 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/Send.cpp +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/Send.cpp @@ -44,6 +44,13 @@ Send::Send() : BridgeMethod{"Send", [&](const SendArgs& args) { modelCardID: The ID of the model card identifying the objects to send --------------------------------------------------------------------*/ void Send::run(const String& modelCardID) const { + +#ifdef ARCHICAD + // we currently rely on the ModelerAPI instead of the ModelAccessAPI + // we have to open a 3D window to get the Mesh data of the model elements + ACAPI_View_ShowAllIn3D(); +#endif + //Get the active project auto project = connector()->getActiveProject().lock(); if (!project) { diff --git a/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp b/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp index 7188881..6d8ae7e 100644 --- a/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp +++ b/SpeckleConnector/Connector/Interface/Browser/Bridge/Send/SendBridge.cpp @@ -32,22 +32,6 @@ SendBridge::SendBridge() : BrowserBridge{"sendBinding"} { addMethod(); addMethod(); addMethod(); - - // POC: do we have a better place to attach observer to elements? -#ifdef ARCHICAD - auto project = connector()->getActiveProject().lock(); - if (!project) { - // TODO: is this OK? should this throw? - return; - } - - auto elementDatabase = project->getElementDatabase(); - auto elements = elementDatabase->getElements(); - ElementIDList elementIds; - for (const auto& id : elementIds) { - ACAPI_Element_AttachObserver(id); - } -#endif } //SendBridge::SendBridge diff --git a/SpeckleConnector/Connector/Interface/ConnectorPalette.cpp b/SpeckleConnector/Connector/Interface/ConnectorPalette.cpp index 9e63b78..5dd0408 100644 --- a/SpeckleConnector/Connector/Interface/ConnectorPalette.cpp +++ b/SpeckleConnector/Connector/Interface/ConnectorPalette.cpp @@ -17,6 +17,8 @@ #include "Speckle/Event/Type/MenuEvent.h" #include "Speckle/Interface/Browser/JSPortal.h" +#include "Speckle/Event/Type/ProjectEvent.h" + #include #include #include @@ -108,7 +110,9 @@ ConnectorPalette::ConnectorPalette() { return: The subscription list (an empty list will put the subscriber into a suspended state) --------------------------------------------------------------------*/ ConnectorPalette::Subscription ConnectorPalette::subscription() const { - return { {toggleConnectorPaletteID} }; + auto result = ProjectSubscriber::subscription(); + result.insert(toggleConnectorPaletteID); + return result; } //ConnectorPalette::subscription @@ -130,16 +134,49 @@ bool ConnectorPalette::start() { return: True if the event should be closed --------------------------------------------------------------------*/ bool ConnectorPalette::receive(const active::event::Event& event) { - if (BrowserPalette::HasInstance() && BrowserPalette::GetInstance().IsVisible()) { - BrowserPalette::GetInstance().Hide (); - } else { - if (!BrowserPalette::HasInstance()) - BrowserPalette::CreateInstance(); - BrowserPalette::GetInstance().Show(); + if (event == toggleConnectorPaletteID) { + if (BrowserPalette::HasInstance() && BrowserPalette::GetInstance().IsVisible()) { + BrowserPalette::GetInstance().Hide(); + } + else { + if (!BrowserPalette::HasInstance()) + BrowserPalette::CreateInstance(); + BrowserPalette::GetInstance().Show(); + } + return true; } - return true; + + return ProjectSubscriber::receive(event); + } //ConnectorPalette::receive +/*-------------------------------------------------------------------- + Handle a project event + + event: The project event + + return: True if the event should be closed + --------------------------------------------------------------------*/ +bool ConnectorPalette::handle(const speckle::event::ProjectEvent& event) { + using enum speckle::event::ProjectEvent::Type; + switch (event.getType()) { + case open: { + if (BrowserPalette::HasInstance() && !BrowserPalette::GetInstance().IsVisible()) { + BrowserPalette::GetInstance().Show(); + BrowserPalette::GetInstance().EnableItems(); + } + } break; + case close: { + if (BrowserPalette::HasInstance() && BrowserPalette::GetInstance().IsVisible()) { + BrowserPalette::GetInstance().Hide(); + } + } break; + default: + break; + } + return false; +} //ConnectorPalette::handle + //NB: Following is placeholder from GS example code - will be refactored to better suit our purposes @@ -282,18 +319,10 @@ GSErrCode __ACENV_CALL BrowserPalette::PaletteControlCallBack(Int32, API_Palette break; case APIPalMsg_HidePalette_End: - if(HasInstance() && !GetInstance().IsVisible()) + if (HasInstance() && !GetInstance().IsVisible()) + { GetInstance().Show(); - break; - - case APIPalMsg_DisableItems_Begin: - if(HasInstance() && GetInstance().IsVisible()) - GetInstance().DisableItems(); - break; - - case APIPalMsg_DisableItems_End: - if(HasInstance() && GetInstance().IsVisible()) - GetInstance().EnableItems(); + } break; case APIPalMsg_IsPaletteVisible: diff --git a/SpeckleConnector/Connector/Interface/ConnectorPalette.h b/SpeckleConnector/Connector/Interface/ConnectorPalette.h index 289e243..b756242 100644 --- a/SpeckleConnector/Connector/Interface/ConnectorPalette.h +++ b/SpeckleConnector/Connector/Interface/ConnectorPalette.h @@ -2,10 +2,11 @@ #define CONNECTOR_CONNECTOR_PALETTE #include "Active/Event/Subscriber.h" +#include "Speckle/Event/Subscriber/ProjectSubscriber.h" namespace connector { - class ConnectorPalette : public active::event::Subscriber { + class ConnectorPalette : public speckle::event::ProjectSubscriber { public: /*! Default constructor @@ -32,6 +33,13 @@ namespace connector { @return True if the event should be closed */ bool receive(const active::event::Event& event) override; + protected: + /*! + Handle the project events + @param event The project event + @return True if the event should be closed + */ + bool handle(const speckle::event::ProjectEvent& event) override; }; }