Merge pull request #17 from specklesystems/david/cnx-716-documentless-state-in-archicad

cnx 716 documentless state in archicad
This commit is contained in:
Ralph Wessel
2024-11-06 19:35:38 +00:00
committed by GitHub
5 changed files with 101 additions and 38 deletions
@@ -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<UpdateModel>();
addMethod<HighlightModel>();
addMethod<OpenUrl>();
// 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;
}
@@ -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) {
@@ -32,22 +32,6 @@ SendBridge::SendBridge() : BrowserBridge{"sendBinding"} {
addMethod<GetSendFilters>();
addMethod<GetSendSettings>();
addMethod<Send>();
// 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
@@ -17,6 +17,8 @@
#include "Speckle/Event/Type/MenuEvent.h"
#include "Speckle/Interface/Browser/JSPortal.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include <ACAPinc.h>
#include <DGModule.hpp>
#include <DGBrowser.hpp>
@@ -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:
@@ -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;
};
}