Merge pull request #17 from specklesystems/david/cnx-716-documentless-state-in-archicad
cnx 716 documentless state in archicad
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user