Compare commits

..

1 Commits

Author SHA1 Message Date
oguzhankoral 77645fbea4 Batch sample 2024-10-02 18:17:13 +03:00
191 changed files with 634 additions and 12598 deletions
+2 -14
View File
@@ -104,8 +104,6 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetDocumentState.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetDocumentState.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationName.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationName.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationVersion.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationVersion.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\HighlightModel.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\OpenUrl.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.cpp" />
@@ -113,9 +111,6 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetConfig.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetConfig.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\UpdateConfig.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Config\UpdateConfig.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\Arg\SelectionInfo.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\GetSelection.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\SelectionBridge.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\SendError.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\SendError.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\SendObject.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\SendObject.cpp" />
@@ -132,9 +127,8 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.cpp" /> <ClCompile Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.cpp" />
<ClCompile Include="Connector\Interface\ConnectorMenu.cpp" /> <ClCompile Include="Connector\Interface\ConnectorMenu.cpp" />
<ClCompile Include="Connector\Interface\ConnectorPalette.cpp" /> <ClCompile Include="Connector\Interface\ConnectorPalette.cpp" />
<ClCompile Include="Connector\Record\Collection\FinishProxy.cpp" />
<ClCompile Include="Connector\Record\Collection\ProjectCollection.cpp" />
<ClCompile Include="Connector\Record\Collection\RecordCollection.cpp" /> <ClCompile Include="Connector\Record\Collection\RecordCollection.cpp" />
<ClCompile Include="Connector\Record\Collection\RootCollection.cpp" />
<ClCompile Include="Connector\Record\Model\CardMover.cpp" /> <ClCompile Include="Connector\Record\Model\CardMover.cpp" />
<ClCompile Include="Connector\Record\Model\CardSetting.cpp" /> <ClCompile Include="Connector\Record\Model\CardSetting.cpp" />
<ClCompile Include="Connector\Record\Model\Filter\DirectSelectionSendFilter.cpp" /> <ClCompile Include="Connector\Record\Model\Filter\DirectSelectionSendFilter.cpp" />
@@ -161,8 +155,6 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetDocumentState.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetDocumentState.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationName.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationName.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationVersion.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Base\GetSourceApplicationVersion.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\HighlightModel.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\OpenUrl.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Base\RemoveModel.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Base\UpdateModel.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Config\Arg\ConnectorConfig.h" />
@@ -170,9 +162,6 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetConfig.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetConfig.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\UpdateConfig.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Config\UpdateConfig.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\Arg\SelectionInfo.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\GetSelection.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\SelectionBridge.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\SendError.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\SendError.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\SendObject.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\SendObject.h" />
@@ -189,9 +178,8 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.h" /> <ClInclude Include="Connector\Interface\Browser\Bridge\Test\TriggerEvent.h" />
<ClInclude Include="Connector\Interface\ConnectorMenu.h" /> <ClInclude Include="Connector\Interface\ConnectorMenu.h" />
<ClInclude Include="Connector\Interface\ConnectorPalette.h" /> <ClInclude Include="Connector\Interface\ConnectorPalette.h" />
<ClInclude Include="Connector\Record\Collection\FinishProxy.h" />
<ClInclude Include="Connector\Record\Collection\ProjectCollection.h" />
<ClInclude Include="Connector\Record\Collection\RecordCollection.h" /> <ClInclude Include="Connector\Record\Collection\RecordCollection.h" />
<ClInclude Include="Connector\Record\Collection\RootCollection.h" />
<ClInclude Include="Connector\Record\Model\CardMover.h" /> <ClInclude Include="Connector\Record\Model\CardMover.h" />
<ClInclude Include="Connector\Record\Model\CardSetting.h" /> <ClInclude Include="Connector\Record\Model\CardSetting.h" />
<ClInclude Include="Connector\Record\Model\Filter\ArchicadEverythingFilter.h" /> <ClInclude Include="Connector\Record\Model\Filter\ArchicadEverythingFilter.h" />
+6 -48
View File
@@ -65,12 +65,6 @@
<Filter Include="Connector\Interface\Browser\Bridge\Send\Arg"> <Filter Include="Connector\Interface\Browser\Bridge\Send\Arg">
<UniqueIdentifier>{6693f9a9-5ece-4853-b008-4064d1c551ab}</UniqueIdentifier> <UniqueIdentifier>{6693f9a9-5ece-4853-b008-4064d1c551ab}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Selection">
<UniqueIdentifier>{806f4af5-fa02-49b8-ac01-297991fe90ea}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Selection\Arg">
<UniqueIdentifier>{8bb3df60-affe-4b66-8d78-f1b98e6ba8df}</UniqueIdentifier>
</Filter>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="RFIX.win\Connector.rc2"> <None Include="RFIX.win\Connector.rc2">
@@ -213,6 +207,9 @@
<ClCompile Include="Connector\Record\Collection\RecordCollection.cpp"> <ClCompile Include="Connector\Record\Collection\RecordCollection.cpp">
<Filter>Connector\Record\Collection</Filter> <Filter>Connector\Record\Collection</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Connector\Record\Collection\RootCollection.cpp">
<Filter>Connector\Record\Collection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.cpp"> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter> <Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter>
</ClCompile> </ClCompile>
@@ -228,27 +225,6 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.cpp"> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Connector\Record\Collection\FinishProxy.cpp">
<Filter>Connector\Record\Collection</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Collection\ProjectCollection.cpp">
<Filter>Connector\Record\Collection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\GetSelection.cpp">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\SelectionBridge.cpp">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\Arg\SelectionInfo.cpp">
<Filter>Connector\Interface\Browser\Bridge\Selection\Arg</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\HighlightModel.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\OpenUrl.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="Connector\ConnectorResource.h"> <ClInclude Include="Connector\ConnectorResource.h">
@@ -387,6 +363,9 @@
<ClInclude Include="Connector\Record\Collection\RecordCollection.h"> <ClInclude Include="Connector\Record\Collection\RecordCollection.h">
<Filter>Connector\Record\Collection</Filter> <Filter>Connector\Record\Collection</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Connector\Record\Collection\RootCollection.h">
<Filter>Connector\Record\Collection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.h"> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.h">
<Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter> <Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter>
</ClInclude> </ClInclude>
@@ -402,26 +381,5 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.h"> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.h">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Connector\Record\Collection\FinishProxy.h">
<Filter>Connector\Record\Collection</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Collection\ProjectCollection.h">
<Filter>Connector\Record\Collection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\GetSelection.h">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\SelectionBridge.h">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\Arg\SelectionInfo.h">
<Filter>Connector\Interface\Browser\Bridge\Selection\Arg</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\HighlightModel.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\OpenUrl.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
</Project> </Project>
@@ -23,25 +23,19 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
210CC8832C80E6A300610F58 /* TriggerEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 210CC8812C80E6A300610F58 /* TriggerEvent.cpp */; }; 210CC8832C80E6A300610F58 /* TriggerEvent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 210CC8812C80E6A300610F58 /* TriggerEvent.cpp */; };
21384BCD2CD2EE7400D4602B /* OpenUrl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21384BC92CD2EE7400D4602B /* OpenUrl.cpp */; };
213CC39C2B1101F500088049 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2151077C2AEDB9070022CD24 /* Cocoa.framework */; }; 213CC39C2B1101F500088049 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2151077C2AEDB9070022CD24 /* Cocoa.framework */; };
214B7A372C764BCD00D586C1 /* UpdateConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69FBD2C7630B3008B6A06 /* UpdateConfig.cpp */; }; 214B7A372C764BCD00D586C1 /* UpdateConfig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69FBD2C7630B3008B6A06 /* UpdateConfig.cpp */; };
215F082A2C947F4400CD343B /* CardMover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08262C947F4400CD343B /* CardMover.cpp */; }; 215F082A2C947F4400CD343B /* CardMover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08262C947F4400CD343B /* CardMover.cpp */; };
215F082E2C94C5C000CD343B /* FilterMover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F082C2C94C5C000CD343B /* FilterMover.cpp */; }; 215F082E2C94C5C000CD343B /* FilterMover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F082C2C94C5C000CD343B /* FilterMover.cpp */; };
215F08372C95808B00CD343B /* ReceiverModelCard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08362C95808B00CD343B /* ReceiverModelCard.cpp */; }; 215F08372C95808B00CD343B /* ReceiverModelCard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08362C95808B00CD343B /* ReceiverModelCard.cpp */; };
215F08462C9633A800CD343B /* EverythingSendFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08452C9633A800CD343B /* EverythingSendFilter.cpp */; }; 215F08462C9633A800CD343B /* EverythingSendFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 215F08452C9633A800CD343B /* EverythingSendFilter.cpp */; };
2192460D2CA3469D00CF5703 /* ProjectCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2192460B2CA3469D00CF5703 /* ProjectCollection.cpp */; }; 2192460D2CA3469D00CF5703 /* RootCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 2192460B2CA3469D00CF5703 /* RootCollection.cpp */; };
219F30422C769283009834E9 /* ConfigTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 219F30402C769282009834E9 /* ConfigTests.cpp */; }; 219F30422C769283009834E9 /* ConfigTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 219F30402C769282009834E9 /* ConfigTests.cpp */; };
21A0FB982CB723240023F24E /* FinishProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21A0FB942CB723240023F24E /* FinishProxy.cpp */; };
21A79EC92CCDA45C001754E4 /* HighlightModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21A79EC52CCDA45C001754E4 /* HighlightModel.cpp */; };
21A890BC2CC15C540087E732 /* SelectionInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21A890B22CC15C540087E732 /* SelectionInfo.cpp */; };
21A890BD2CC15C540087E732 /* GetSelection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21A890B52CC15C540087E732 /* GetSelection.cpp */; };
21A890BE2CC15C540087E732 /* SelectionBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21A890B72CC15C540087E732 /* SelectionBridge.cpp */; };
21AEF9EB2CAB56E5000B8681 /* SendError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9E32CAB56E5000B8681 /* SendError.cpp */; }; 21AEF9EB2CAB56E5000B8681 /* SendError.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9E32CAB56E5000B8681 /* SendError.cpp */; };
21AEF9EC2CAB56E5000B8681 /* SendViaBrowserArgs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9E52CAB56E5000B8681 /* SendViaBrowserArgs.cpp */; }; 21AEF9EC2CAB56E5000B8681 /* SendViaBrowserArgs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9E52CAB56E5000B8681 /* SendViaBrowserArgs.cpp */; };
21AEF9EF2CAB5720000B8681 /* SendObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9EE2CAB5720000B8681 /* SendObject.cpp */; }; 21AEF9EF2CAB5720000B8681 /* SendObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9EE2CAB5720000B8681 /* SendObject.cpp */; };
21AEF9F32CAC12D1000B8681 /* SendManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9F02CAC12D1000B8681 /* SendManager.cpp */; };
21AEF9FA2CAC3897000B8681 /* ConversionResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9F92CAC3897000B8681 /* ConversionResult.cpp */; }; 21AEF9FA2CAC3897000B8681 /* ConversionResult.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9F92CAC3897000B8681 /* ConversionResult.cpp */; };
21AEF9FD2CAD3FD8000B8681 /* GetSendSettings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21AEF9FB2CAD3FD8000B8681 /* GetSendSettings.cpp */; };
21B67CA32C769CB400FD64FC /* libActiveLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 21F69EF52C64FE91008B6A06 /* libActiveLib.a */; }; 21B67CA32C769CB400FD64FC /* libActiveLib.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 21F69EF52C64FE91008B6A06 /* libActiveLib.a */; };
21B67CA42C769CB400FD64FC /* libArchicad27.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 21F69ECD2C64C035008B6A06 /* libArchicad27.a */; }; 21B67CA42C769CB400FD64FC /* libArchicad27.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 21F69ECD2C64C035008B6A06 /* libArchicad27.a */; };
21B67CAC2C77329800FD64FC /* BaseBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CA52C77329800FD64FC /* BaseBridge.cpp */; }; 21B67CAC2C77329800FD64FC /* BaseBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21B67CA52C77329800FD64FC /* BaseBridge.cpp */; };
@@ -297,8 +291,6 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
210CC8812C80E6A300610F58 /* TriggerEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TriggerEvent.cpp; sourceTree = "<group>"; }; 210CC8812C80E6A300610F58 /* TriggerEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TriggerEvent.cpp; sourceTree = "<group>"; };
210CC8822C80E6A300610F58 /* TriggerEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TriggerEvent.h; sourceTree = "<group>"; }; 210CC8822C80E6A300610F58 /* TriggerEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TriggerEvent.h; sourceTree = "<group>"; };
21384BC92CD2EE7400D4602B /* OpenUrl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = OpenUrl.cpp; sourceTree = "<group>"; };
21384BCC2CD2EE7400D4602B /* OpenUrl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenUrl.h; sourceTree = "<group>"; };
213CC3A52B1101F500088049 /* Speckle Connector.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Speckle Connector.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; 213CC3A52B1101F500088049 /* Speckle Connector.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Speckle Connector.bundle"; sourceTree = BUILT_PRODUCTS_DIR; };
2151077C2AEDB9070022CD24 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; 2151077C2AEDB9070022CD24 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
215F08262C947F4400CD343B /* CardMover.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CardMover.cpp; sourceTree = "<group>"; }; 215F08262C947F4400CD343B /* CardMover.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CardMover.cpp; sourceTree = "<group>"; };
@@ -313,32 +305,22 @@
215F08452C9633A800CD343B /* EverythingSendFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EverythingSendFilter.cpp; sourceTree = "<group>"; }; 215F08452C9633A800CD343B /* EverythingSendFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EverythingSendFilter.cpp; sourceTree = "<group>"; };
215F084A2C9782F100CD343B /* ArchicadEverythingFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ArchicadEverythingFilter.h; sourceTree = "<group>"; }; 215F084A2C9782F100CD343B /* ArchicadEverythingFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ArchicadEverythingFilter.h; sourceTree = "<group>"; };
2161FD902BF2600C006D9527 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; }; 2161FD902BF2600C006D9527 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = "<group>"; };
2192460B2CA3469D00CF5703 /* ProjectCollection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ProjectCollection.cpp; sourceTree = "<group>"; }; 2192460B2CA3469D00CF5703 /* RootCollection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RootCollection.cpp; sourceTree = "<group>"; };
2192460C2CA3469D00CF5703 /* ProjectCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectCollection.h; sourceTree = "<group>"; }; 2192460C2CA3469D00CF5703 /* RootCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RootCollection.h; sourceTree = "<group>"; };
219388682C4E5DE2002A0180 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; }; 219388682C4E5DE2002A0180 /* CMakeLists.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
219F30352C768F0A009834E9 /* Connector-AC27-Test.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Connector-AC27-Test.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; 219F30352C768F0A009834E9 /* Connector-AC27-Test.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Connector-AC27-Test.bundle"; sourceTree = BUILT_PRODUCTS_DIR; };
219F30402C769282009834E9 /* ConfigTests.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = ConfigTests.cpp; sourceTree = "<group>"; }; 219F30402C769282009834E9 /* ConfigTests.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = ConfigTests.cpp; sourceTree = "<group>"; };
219F30432C7693B6009834E9 /* Connector-AC27-Debug.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Connector-AC27-Debug.xctestplan"; sourceTree = SOURCE_ROOT; }; 219F30432C7693B6009834E9 /* Connector-AC27-Debug.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = "Connector-AC27-Debug.xctestplan"; sourceTree = SOURCE_ROOT; };
21A0FB942CB723240023F24E /* FinishProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FinishProxy.cpp; sourceTree = "<group>"; };
21A0FB972CB723240023F24E /* FinishProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FinishProxy.h; sourceTree = "<group>"; };
21A79EC52CCDA45C001754E4 /* HighlightModel.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HighlightModel.cpp; sourceTree = "<group>"; };
21A79EC82CCDA45C001754E4 /* HighlightModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HighlightModel.h; sourceTree = "<group>"; };
21A890B22CC15C540087E732 /* SelectionInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionInfo.cpp; sourceTree = "<group>"; };
21A890B32CC15C540087E732 /* SelectionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionInfo.h; sourceTree = "<group>"; };
21A890B52CC15C540087E732 /* GetSelection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetSelection.cpp; sourceTree = "<group>"; };
21A890B62CC15C540087E732 /* GetSelection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetSelection.h; sourceTree = "<group>"; };
21A890B72CC15C540087E732 /* SelectionBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectionBridge.cpp; sourceTree = "<group>"; };
21A890B82CC15C540087E732 /* SelectionBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectionBridge.h; sourceTree = "<group>"; };
21AEF9E32CAB56E5000B8681 /* SendError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendError.cpp; sourceTree = "<group>"; }; 21AEF9E32CAB56E5000B8681 /* SendError.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendError.cpp; sourceTree = "<group>"; };
21AEF9E42CAB56E5000B8681 /* SendError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendError.h; sourceTree = "<group>"; }; 21AEF9E42CAB56E5000B8681 /* SendError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendError.h; sourceTree = "<group>"; };
21AEF9E52CAB56E5000B8681 /* SendViaBrowserArgs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendViaBrowserArgs.cpp; sourceTree = "<group>"; }; 21AEF9E52CAB56E5000B8681 /* SendViaBrowserArgs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendViaBrowserArgs.cpp; sourceTree = "<group>"; };
21AEF9E62CAB56E5000B8681 /* SendViaBrowserArgs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendViaBrowserArgs.h; sourceTree = "<group>"; }; 21AEF9E62CAB56E5000B8681 /* SendViaBrowserArgs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendViaBrowserArgs.h; sourceTree = "<group>"; };
21AEF9ED2CAB5720000B8681 /* SendObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendObject.h; sourceTree = "<group>"; }; 21AEF9ED2CAB5720000B8681 /* SendObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendObject.h; sourceTree = "<group>"; };
21AEF9EE2CAB5720000B8681 /* SendObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendObject.cpp; sourceTree = "<group>"; }; 21AEF9EE2CAB5720000B8681 /* SendObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendObject.cpp; sourceTree = "<group>"; };
21AEF9F02CAC12D1000B8681 /* SendManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendManager.cpp; sourceTree = "<group>"; };
21AEF9F12CAC12D1000B8681 /* SendManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendManager.h; sourceTree = "<group>"; };
21AEF9F82CAC3897000B8681 /* ConversionResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConversionResult.h; sourceTree = "<group>"; }; 21AEF9F82CAC3897000B8681 /* ConversionResult.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConversionResult.h; sourceTree = "<group>"; };
21AEF9F92CAC3897000B8681 /* ConversionResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConversionResult.cpp; sourceTree = "<group>"; }; 21AEF9F92CAC3897000B8681 /* ConversionResult.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ConversionResult.cpp; sourceTree = "<group>"; };
21AEF9FB2CAD3FD8000B8681 /* GetSendSettings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetSendSettings.cpp; sourceTree = "<group>"; };
21AEF9FC2CAD3FD8000B8681 /* GetSendSettings.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GetSendSettings.h; sourceTree = "<group>"; };
21B67CA52C77329800FD64FC /* BaseBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BaseBridge.cpp; sourceTree = "<group>"; }; 21B67CA52C77329800FD64FC /* BaseBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BaseBridge.cpp; sourceTree = "<group>"; };
21B67CA62C77329800FD64FC /* BaseBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseBridge.h; sourceTree = "<group>"; }; 21B67CA62C77329800FD64FC /* BaseBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BaseBridge.h; sourceTree = "<group>"; };
21B67CA72C77329800FD64FC /* GetSourceApplicationName.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetSourceApplicationName.cpp; sourceTree = "<group>"; }; 21B67CA72C77329800FD64FC /* GetSourceApplicationName.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = GetSourceApplicationName.cpp; sourceTree = "<group>"; };
@@ -978,27 +960,6 @@
path = ConnectorTests; path = ConnectorTests;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
21A890B42CC15C540087E732 /* Arg */ = {
isa = PBXGroup;
children = (
21A890B22CC15C540087E732 /* SelectionInfo.cpp */,
21A890B32CC15C540087E732 /* SelectionInfo.h */,
);
path = Arg;
sourceTree = "<group>";
};
21A890B92CC15C540087E732 /* Selection */ = {
isa = PBXGroup;
children = (
21A890B42CC15C540087E732 /* Arg */,
21A890B52CC15C540087E732 /* GetSelection.cpp */,
21A890B62CC15C540087E732 /* GetSelection.h */,
21A890B72CC15C540087E732 /* SelectionBridge.cpp */,
21A890B82CC15C540087E732 /* SelectionBridge.h */,
);
path = Selection;
sourceTree = "<group>";
};
21AEF9E72CAB56E5000B8681 /* Arg */ = { 21AEF9E72CAB56E5000B8681 /* Arg */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1014,6 +975,15 @@
path = Arg; path = Arg;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
21AEF9F22CAC12D1000B8681 /* Serialise */ = {
isa = PBXGroup;
children = (
21AEF9F02CAC12D1000B8681 /* SendManager.cpp */,
21AEF9F12CAC12D1000B8681 /* SendManager.h */,
);
path = Serialise;
sourceTree = "<group>";
};
21B67CAB2C77329800FD64FC /* Base */ = { 21B67CAB2C77329800FD64FC /* Base */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -1032,10 +1002,6 @@
21B67CA82C77329800FD64FC /* GetSourceApplicationName.h */, 21B67CA82C77329800FD64FC /* GetSourceApplicationName.h */,
21B67CA92C77329800FD64FC /* GetSourceApplicationVersion.cpp */, 21B67CA92C77329800FD64FC /* GetSourceApplicationVersion.cpp */,
21B67CAA2C77329800FD64FC /* GetSourceApplicationVersion.h */, 21B67CAA2C77329800FD64FC /* GetSourceApplicationVersion.h */,
21A79EC52CCDA45C001754E4 /* HighlightModel.cpp */,
21A79EC82CCDA45C001754E4 /* HighlightModel.h */,
21384BC92CD2EE7400D4602B /* OpenUrl.cpp */,
21384BCC2CD2EE7400D4602B /* OpenUrl.h */,
21D0BDD52C935DAE0077E104 /* RemoveModel.cpp */, 21D0BDD52C935DAE0077E104 /* RemoveModel.cpp */,
21D0BDD62C935DAE0077E104 /* RemoveModel.h */, 21D0BDD62C935DAE0077E104 /* RemoveModel.h */,
21D0BDD22C935D1A0077E104 /* UpdateModel.cpp */, 21D0BDD22C935D1A0077E104 /* UpdateModel.cpp */,
@@ -1105,8 +1071,6 @@
21AEF9E72CAB56E5000B8681 /* Arg */, 21AEF9E72CAB56E5000B8681 /* Arg */,
21D0BD962C8F13F30077E104 /* GetSendFilters.cpp */, 21D0BD962C8F13F30077E104 /* GetSendFilters.cpp */,
21D0BD952C8F13F30077E104 /* GetSendFilters.h */, 21D0BD952C8F13F30077E104 /* GetSendFilters.h */,
21AEF9FB2CAD3FD8000B8681 /* GetSendSettings.cpp */,
21AEF9FC2CAD3FD8000B8681 /* GetSendSettings.h */,
21D0BD8D2C8EE4490077E104 /* Send.cpp */, 21D0BD8D2C8EE4490077E104 /* Send.cpp */,
21D0BD8A2C8EE4490077E104 /* Send.h */, 21D0BD8A2C8EE4490077E104 /* Send.h */,
21D0BD5B2C89BFEA0077E104 /* SendBridge.cpp */, 21D0BD5B2C89BFEA0077E104 /* SendBridge.cpp */,
@@ -1219,6 +1183,7 @@
21F69F092C677BC0008B6A06 /* Event */, 21F69F092C677BC0008B6A06 /* Event */,
21F69F0E2C677BC0008B6A06 /* Interface */, 21F69F0E2C677BC0008B6A06 /* Interface */,
21D0BDD82C9387E60077E104 /* Record */, 21D0BDD82C9387E60077E104 /* Record */,
21AEF9F22CAC12D1000B8681 /* Serialise */,
21B67CBA2C774C6500FD64FC /* Version.h */, 21B67CBA2C774C6500FD64FC /* Version.h */,
); );
path = Connector; path = Connector;
@@ -1242,7 +1207,6 @@
21B67CAB2C77329800FD64FC /* Base */, 21B67CAB2C77329800FD64FC /* Base */,
21F69FB82C762EF0008B6A06 /* Config */, 21F69FB82C762EF0008B6A06 /* Config */,
21D0BD5D2C89BFEA0077E104 /* Send */, 21D0BD5D2C89BFEA0077E104 /* Send */,
21A890B92CC15C540087E732 /* Selection */,
21B67CD82C78C83800FD64FC /* Test */, 21B67CD82C78C83800FD64FC /* Test */,
); );
path = Bridge; path = Bridge;
@@ -1275,12 +1239,10 @@
21FF70482CA1A7F400AAD99A /* Collection */ = { 21FF70482CA1A7F400AAD99A /* Collection */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
21A0FB942CB723240023F24E /* FinishProxy.cpp */,
21A0FB972CB723240023F24E /* FinishProxy.h */,
21FF70462CA1A7F400AAD99A /* RecordCollection.cpp */, 21FF70462CA1A7F400AAD99A /* RecordCollection.cpp */,
21FF70472CA1A7F400AAD99A /* RecordCollection.h */, 21FF70472CA1A7F400AAD99A /* RecordCollection.h */,
2192460B2CA3469D00CF5703 /* ProjectCollection.cpp */, 2192460B2CA3469D00CF5703 /* RootCollection.cpp */,
2192460C2CA3469D00CF5703 /* ProjectCollection.h */, 2192460C2CA3469D00CF5703 /* RootCollection.h */,
); );
path = Collection; path = Collection;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1497,31 +1459,27 @@
215F08462C9633A800CD343B /* EverythingSendFilter.cpp in Sources */, 215F08462C9633A800CD343B /* EverythingSendFilter.cpp in Sources */,
21F69FBB2C762EF0008B6A06 /* ConfigBridge.cpp in Sources */, 21F69FBB2C762EF0008B6A06 /* ConfigBridge.cpp in Sources */,
21F69F8A2C70D2C4008B6A06 /* AccountBridge.cpp in Sources */, 21F69F8A2C70D2C4008B6A06 /* AccountBridge.cpp in Sources */,
21A890BE2CC15C540087E732 /* SelectionBridge.cpp in Sources */,
21D0BD8E2C8EE4490077E104 /* Send.cpp in Sources */, 21D0BD8E2C8EE4490077E104 /* Send.cpp in Sources */,
21D0BDCF2C92DAC60077E104 /* AddModel.cpp in Sources */, 21D0BDCF2C92DAC60077E104 /* AddModel.cpp in Sources */,
21B67CF72C78D4DE00FD64FC /* GetComplexType.cpp in Sources */, 21B67CF72C78D4DE00FD64FC /* GetComplexType.cpp in Sources */,
21D0BDDC2C93897B0077E104 /* SenderModelCard.cpp in Sources */, 21D0BDDC2C93897B0077E104 /* SenderModelCard.cpp in Sources */,
21B67CAE2C77329800FD64FC /* GetSourceApplicationVersion.cpp in Sources */, 21B67CAE2C77329800FD64FC /* GetSourceApplicationVersion.cpp in Sources */,
21A0FB982CB723240023F24E /* FinishProxy.cpp in Sources */,
21B67CC32C77649F00FD64FC /* GetDocumentState.cpp in Sources */, 21B67CC32C77649F00FD64FC /* GetDocumentState.cpp in Sources */,
21D0BD602C89BFEA0077E104 /* SendBridge.cpp in Sources */, 21D0BD602C89BFEA0077E104 /* SendBridge.cpp in Sources */,
21D0BD972C8F13F30077E104 /* GetSendFilters.cpp in Sources */, 21D0BD972C8F13F30077E104 /* GetSendFilters.cpp in Sources */,
21B67CAC2C77329800FD64FC /* BaseBridge.cpp in Sources */, 21B67CAC2C77329800FD64FC /* BaseBridge.cpp in Sources */,
2192460D2CA3469D00CF5703 /* ProjectCollection.cpp in Sources */, 2192460D2CA3469D00CF5703 /* RootCollection.cpp in Sources */,
21D0BD6A2C8A0DB40077E104 /* GetIsDevMode.cpp in Sources */, 21D0BD6A2C8A0DB40077E104 /* GetIsDevMode.cpp in Sources */,
21AEF9F32CAC12D1000B8681 /* SendManager.cpp in Sources */,
210CC8832C80E6A300610F58 /* TriggerEvent.cpp in Sources */, 210CC8832C80E6A300610F58 /* TriggerEvent.cpp in Sources */,
21B67CEB2C78D27200FD64FC /* DocumentInfo.cpp in Sources */, 21B67CEB2C78D27200FD64FC /* DocumentInfo.cpp in Sources */,
21B67CB92C774BFA00FD64FC /* GetConnectorVersion.cpp in Sources */, 21B67CB92C774BFA00FD64FC /* GetConnectorVersion.cpp in Sources */,
21B67CD92C78C83800FD64FC /* TestBridge.cpp in Sources */, 21B67CD92C78C83800FD64FC /* TestBridge.cpp in Sources */,
21AEF9FD2CAD3FD8000B8681 /* GetSendSettings.cpp in Sources */,
214B7A372C764BCD00D586C1 /* UpdateConfig.cpp in Sources */, 214B7A372C764BCD00D586C1 /* UpdateConfig.cpp in Sources */,
21AEF9EC2CAB56E5000B8681 /* SendViaBrowserArgs.cpp in Sources */, 21AEF9EC2CAB56E5000B8681 /* SendViaBrowserArgs.cpp in Sources */,
21FF70492CA1A7F400AAD99A /* RecordCollection.cpp in Sources */, 21FF70492CA1A7F400AAD99A /* RecordCollection.cpp in Sources */,
21A79EC92CCDA45C001754E4 /* HighlightModel.cpp in Sources */,
21B67CC02C775A0D00FD64FC /* GetDocumentInfo.cpp in Sources */, 21B67CC02C775A0D00FD64FC /* GetDocumentInfo.cpp in Sources */,
21D0BDD42C935D1A0077E104 /* UpdateModel.cpp in Sources */, 21D0BDD42C935D1A0077E104 /* UpdateModel.cpp in Sources */,
21A890BD2CC15C540087E732 /* GetSelection.cpp in Sources */,
21B67CE72C78D23B00FD64FC /* ConnectorConfig.cpp in Sources */, 21B67CE72C78D23B00FD64FC /* ConnectorConfig.cpp in Sources */,
21B67CAD2C77329800FD64FC /* GetSourceApplicationName.cpp in Sources */, 21B67CAD2C77329800FD64FC /* GetSourceApplicationName.cpp in Sources */,
21D0BDE02C9393980077E104 /* SendFilter.cpp in Sources */, 21D0BDE02C9393980077E104 /* SendFilter.cpp in Sources */,
@@ -1529,9 +1487,7 @@
215F082A2C947F4400CD343B /* CardMover.cpp in Sources */, 215F082A2C947F4400CD343B /* CardMover.cpp in Sources */,
215F08372C95808B00CD343B /* ReceiverModelCard.cpp in Sources */, 215F08372C95808B00CD343B /* ReceiverModelCard.cpp in Sources */,
21D0BDD72C935DAE0077E104 /* RemoveModel.cpp in Sources */, 21D0BDD72C935DAE0077E104 /* RemoveModel.cpp in Sources */,
21A890BC2CC15C540087E732 /* SelectionInfo.cpp in Sources */,
21AEF9EF2CAB5720000B8681 /* SendObject.cpp in Sources */, 21AEF9EF2CAB5720000B8681 /* SendObject.cpp in Sources */,
21384BCD2CD2EE7400D4602B /* OpenUrl.cpp in Sources */,
21B67CDC2C78C88000FD64FC /* SayHi.cpp in Sources */, 21B67CDC2C78C88000FD64FC /* SayHi.cpp in Sources */,
215F082E2C94C5C000CD343B /* FilterMover.cpp in Sources */, 215F082E2C94C5C000CD343B /* FilterMover.cpp in Sources */,
21F69F122C677BC0008B6A06 /* ConnectorMenu.cpp in Sources */, 21F69F122C677BC0008B6A06 /* ConnectorMenu.cpp in Sources */,
@@ -2077,7 +2033,7 @@
); );
LOCALISATION_SUFFIX = "EN-GB"; LOCALISATION_SUFFIX = "EN-GB";
MACH_O_TYPE = mh_bundle; MACH_O_TYPE = mh_bundle;
MACOSX_DEPLOYMENT_TARGET = 13.3; MACOSX_DEPLOYMENT_TARGET = 11.0;
NNA_WARNING_CPLUSPLUSFLAGS = "-Wno-deprecated"; NNA_WARNING_CPLUSPLUSFLAGS = "-Wno-deprecated";
OBJROOT = ""; OBJROOT = "";
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
@@ -2184,7 +2140,7 @@
); );
LOCALISATION_SUFFIX = "EN-GB"; LOCALISATION_SUFFIX = "EN-GB";
MACH_O_TYPE = mh_bundle; MACH_O_TYPE = mh_bundle;
MACOSX_DEPLOYMENT_TARGET = 13.3; MACOSX_DEPLOYMENT_TARGET = 11.0;
NNA_WARNING_CPLUSPLUSFLAGS = "-Wno-deprecated"; NNA_WARNING_CPLUSPLUSFLAGS = "-Wno-deprecated";
OBJROOT = ""; OBJROOT = "";
PLUGIN_FOLDER = ""; PLUGIN_FOLDER = "";
@@ -28,7 +28,6 @@ enum StringResource {
enum TitleString { enum TitleString {
addonNameID = 1, addonNameID = 1,
addonDescriptionID, addonDescriptionID,
noStoreyID,
}; };
@@ -1,8 +1,16 @@
#ifndef CONNECTOR_DATABASE_ID #ifndef CONNECTOR_DATABASE_ID
#define CONNECTOR_DATABASE_ID #define CONNECTOR_DATABASE_ID
#include "Speckle/Utility/Guid.h"
namespace connector::database { namespace connector::database {
//BIM element record identifier
using ElementID = speckle::utility::Guid;
//A list of element IDs
using ElementIDList = std::vector<ElementID>;
} }
#endif //CONNECTOR_DATABASE_ID #endif //CONNECTOR_DATABASE_ID
@@ -14,7 +14,7 @@ using namespace speckle::utility;
namespace { namespace {
using WrappedValue = CargoHold<ContainerWrap<Vector<Account>>, Vector<Account>>; using WrappedValue = active::serialise::CargoHold<ContainerWrap<Vector<Account>>, Vector<Account>>;
} }
@@ -6,7 +6,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
JS Function class to retrieve the user's account(s) JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class GetAccounts : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetAccounts : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -2,6 +2,7 @@
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
using namespace active::container; using namespace active::container;
using namespace active::serialise; using namespace active::serialise;
@@ -9,6 +10,12 @@ using namespace connector::record;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::utility; using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<PackageWrap, DocumentInfo>;
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
@@ -8,7 +8,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
///Argument parameter for a model card ///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>; using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method ///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>; using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
@@ -39,20 +39,20 @@ namespace connector::interfac::browser::bridge {
// MARK: - Serialisation // MARK: - Serialisation
/*! /*!
Fill an inventory with the package items Fill an inventory with the package items
@param inventory The inventory to receive the package items @param inventory The inventory to receive the package items
@return True if the package has added items to the inventory @return True if the package has added items to the inventory
*/ */
bool fillInventory(active::serialise::Inventory& inventory) const override; bool fillInventory(active::serialise::Inventory& inventory) const override;
/*! /*!
Get the specified cargo Get the specified cargo
@param item The inventory item to retrieve @param item The inventory item to retrieve
@return The requested cargo (nullptr on failure) @return The requested cargo (nullptr on failure)
*/ */
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*! /*!
Set to the default package content Set to the default package content
*/ */
void setDefault() override; void setDefault() override;
}; };
@@ -1,4 +1,5 @@
#include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h" #include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h"
#include "Connector/Interface/Browser/Bridge/Base/AddModel.h" #include "Connector/Interface/Browser/Bridge/Base/AddModel.h"
#include "Connector/Interface/Browser/Bridge/Base/GetConnectorVersion.h" #include "Connector/Interface/Browser/Bridge/Base/GetConnectorVersion.h"
#include "Connector/Interface/Browser/Bridge/Base/GetDocumentInfo.h" #include "Connector/Interface/Browser/Bridge/Base/GetDocumentInfo.h"
@@ -7,9 +8,6 @@
#include "Connector/Interface/Browser/Bridge/Base/GetSourceApplicationVersion.h" #include "Connector/Interface/Browser/Bridge/Base/GetSourceApplicationVersion.h"
#include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h" #include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h"
#include "Connector/Interface/Browser/Bridge/Base/UpdateModel.h" #include "Connector/Interface/Browser/Bridge/Base/UpdateModel.h"
#include "Connector/Interface/Browser/Bridge/Base/HighlightModel.h"
#include "Connector/Interface/Browser/Bridge/Base/OpenUrl.h"
#include "Speckle/Event/Type/ProjectEvent.h"
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
@@ -26,25 +24,4 @@ BaseBridge::BaseBridge() : BrowserBridge{"baseBinding"} {
addMethod<GetSourceApplicationVersion>(); addMethod<GetSourceApplicationVersion>();
addMethod<RemoveModel>(); addMethod<RemoveModel>();
addMethod<UpdateModel>(); addMethod<UpdateModel>();
addMethod<HighlightModel>();
addMethod<OpenUrl>();
} //BaseBridge::BaseBridge } //BaseBridge::BaseBridge
/*--------------------------------------------------------------------
Handle a project event
event: The project event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool BaseBridge::handle(const speckle::event::ProjectEvent& event) {
using enum speckle::event::ProjectEvent::Type;
switch (event.getType()) {
case open:
sendEvent("documentChanged");
break;
default:
break;
}
return false;
} //BaseBridge::handle
@@ -2,14 +2,13 @@
#define CONNECTOR_INTERFACE_BRIDGE_BASE_BRIDGE #define CONNECTOR_INTERFACE_BRIDGE_BASE_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h" #include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Event/Subscriber/ProjectSubscriber.h"
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
A browser bridge to manage document settings A browser bridge to provide configuration settings
*/ */
class BaseBridge : public speckle::interfac::browser::bridge::BrowserBridge, public speckle::event::ProjectSubscriber { class BaseBridge : public speckle::interfac::browser::bridge::BrowserBridge {
public: public:
// MARK: - Types // MARK: - Types
@@ -23,14 +22,6 @@ namespace connector::interfac::browser::bridge {
Default constructor Default constructor
*/ */
BaseBridge(); BaseBridge();
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;
}; };
} }
@@ -25,13 +25,13 @@ GetConnectorVersion::GetConnectorVersion() : BridgeMethod{"GetConnectorVersion",
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get the connector software version Get the host application version
return: The connector software version return: The application version
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetConnectorVersion::run() const { std::unique_ptr<Cargo> GetConnectorVersion::run() const {
//Implement other platforms as required //Implement other platforms as required
String result{String{connector::versionMajor} + "." + String{connector::versionMinor} + "." + String result{active::utility::String{connector::versionMajor} + "." + active::utility::String{connector::versionMinor} + "." +
String{connector::versionPatch}}; active::utility::String{connector::versionPatch}};
return std::make_unique<WrappedValue>(result); return std::make_unique<WrappedValue>(result);
} //GetConnectorVersion::run } //GetConnectorVersion::run
@@ -8,7 +8,7 @@ namespace connector::interfac::browser::bridge {
class ConnectorConfig; class ConnectorConfig;
/*! /*!
JS Function class to get the connector software version JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class GetConnectorVersion : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetConnectorVersion : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -23,8 +23,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Get the connector software version Get the host application version
@return The connector software version @return The application version
*/ */
std::unique_ptr<active::serialise::Cargo> run() const; std::unique_ptr<active::serialise::Cargo> run() const;
}; };
@@ -21,9 +21,9 @@ GetDocumentState::GetDocumentState() : BridgeMethod{"GetDocumentState", [&]() {
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get the document model cards Get the document info
return: The document model cards return: The document info
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetDocumentState::run() const { std::unique_ptr<Cargo> GetDocumentState::run() const {
if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr) { if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr) {
@@ -6,7 +6,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
JS Function class to retrieve model cards stored in the current document JS Function class to retrieve the information about the active document
*/ */
class GetDocumentState : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetDocumentState : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -21,8 +21,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Get the document model cards Get the document info
@return The document model cards @return The document info
*/ */
std::unique_ptr<active::serialise::Cargo> run() const; std::unique_ptr<active::serialise::Cargo> run() const;
}; };
@@ -1,55 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Base/HighlightModel.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendError.h"
#include "Connector/Record/Model/SenderModelCard.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Record/Element/Element.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Environment/Project.h"
using namespace speckle::record::element;
using namespace connector::interfac::browser::bridge;
using namespace connector::record;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
HighlightModel::HighlightModel() : BridgeMethod{"HighlightModel", [&](const SendArgs& args) {
run(args);
}} {}
/*--------------------------------------------------------------------
Highlight elements linked to the model card selection
modelCardID: The ID of the target model card
--------------------------------------------------------------------*/
void HighlightModel::run(const String& modelCardID) const {
// Find the specified model card
auto modelCardDatabase = connector()->getModelCardDatabase();
auto modelCard = modelCardDatabase->getCard(modelCardID);
if (!modelCard) {
getBridge()->sendEvent("setModelError",
std::make_unique<SendError>(connector()->getLocalString(errorString, modelCardNotFoundID), modelCardID));
return;
}
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get())) {
auto modelCardSelection = senderCard->getFilter().getElementIDs();
auto project = connector()->getActiveProject().lock();
if (!project) {
// TODO: is this OK? should this throw?
return;
}
auto elementDatabase = project->getElementDatabase();
elementDatabase->clearSelection();
elementDatabase->setSelection(modelCardSelection);
}
} //HighlightModel::run
@@ -1,42 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_HIGHLIGHT_MODEL
#define CONNECTOR_INTERFACE_BRIDGE_HIGHLIGHT_MODEL
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
class ConnectorConfig;
///Argument parameter for a string
using StringHold = active::serialise::CargoHold<active::serialise::ValueWrap<speckle::utility::String>, speckle::utility::String>;
///Argument type for this method
using SendArgs = speckle::interfac::browser::bridge::JSArgType<StringHold>;
/*!
JS Function class to highlight elements from the selected model card in the open document
*/
class HighlightModel : public speckle::interfac::browser::bridge::BridgeMethod<SendArgs, void> {
public:
// MARK: - Constructors
/*!
Constructor
*/
HighlightModel();
// MARK: - Functions (const)
/*!
Highlight elements linked to the model card selection
@param modelCardID The ID of the target model card
*/
void run(const speckle::utility::String& modelCardID) const;
};
}
#endif //CONNECTOR_INTERFACE_HIGHLIGHT_MODEL
@@ -1,24 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Base/OpenUrl.h"
#include "Speckle/Environment/Platform.h"
using namespace connector::interfac::browser::bridge;
using namespace speckle::environment;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
OpenUrl::OpenUrl() : BridgeMethod{"OpenUrl", [&](const SendArgs& args) {
run(args);
}} {}
/*--------------------------------------------------------------------
Opens an url
url: The URL to open
--------------------------------------------------------------------*/
void OpenUrl::run(const String& url) const {
platform()->openURL(url);
} //OpenUrl::run
@@ -1,41 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_OPEN_URL
#define CONNECTOR_INTERFACE_BRIDGE_OPEN_URL
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
class ConnectorConfig;
///Argument parameter for a string
using StringHold = active::serialise::CargoHold<active::serialise::ValueWrap<speckle::utility::String>, speckle::utility::String>;
///Argument type for this method
using SendArgs = speckle::interfac::browser::bridge::JSArgType<StringHold>;
/*!
JS Function class to highlight elements from the selected model card in the open document
*/
class OpenUrl : public speckle::interfac::browser::bridge::BridgeMethod<SendArgs, void> {
public:
// MARK: - Constructors
/*!
Constructor
*/
OpenUrl();
// MARK: - Functions (const)
/*!
Opens an url
@param url The URL to open
*/
void run(const speckle::utility::String& url) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_OPEN_URL
@@ -8,13 +8,13 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
///Argument parameter for a model card ///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>; using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method ///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>; using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
/*! /*!
JS Function class to remove a model card from the document storage JS Function class to add a model card to the document storage
*/ */
class RemoveModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> { class RemoveModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> {
public: public:
@@ -29,8 +29,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Remove a model card from document storage Add a model card to document storage
@param card The card to remove @param card The card to add
*/ */
void run(const connector::record::ModelCard& card) const; void run(const connector::record::ModelCard& card) const;
}; };
@@ -26,9 +26,9 @@ UpdateModel::UpdateModel() : BridgeMethod{"UpdateModel", [&](const ModelCardEven
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Update a model card in document storage Add a model card to document storage
card: The card to update card: The card to add
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void UpdateModel::run(const ModelCard& card) const { void UpdateModel::run(const ModelCard& card) const {
if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr) if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr)
@@ -8,13 +8,13 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
///Argument parameter for a model card ///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>; using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method ///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>; using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
/*! /*!
JS Function class to update a model card in document storage JS Function class to add a model card to the document storage
*/ */
class UpdateModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> { class UpdateModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> {
public: public:
@@ -29,8 +29,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Update a model card in document storage Add a model card to document storage
@param card The card to update @param card The card to add
*/ */
void run(const connector::record::ModelCard& card) const; void run(const connector::record::ModelCard& card) const;
}; };
@@ -6,7 +6,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
JS Function class to retrieve the current display configuration settings JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class GetConfig : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetConfig : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -9,11 +9,11 @@ namespace connector::interfac::browser::bridge {
class ConnectorConfig; class ConnectorConfig;
///Argument for a JS call to update the display configuration settings ///Argument for a JS call to update the configuration
using UpdateArgs = speckle::interfac::browser::bridge::JSArgType<ConnectorConfig>; using UpdateArgs = speckle::interfac::browser::bridge::JSArgType<ConnectorConfig>;
/*! /*!
JS Function class to update the display configuration settings JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class UpdateConfig : public speckle::interfac::browser::bridge::BridgeMethod<UpdateArgs, void> { class UpdateConfig : public speckle::interfac::browser::bridge::BridgeMethod<UpdateArgs, void> {
public: public:
@@ -22,6 +22,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
UpdateConfig(); UpdateConfig();
@@ -1,89 +0,0 @@
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Connector.h"
#include "Connector/Interface/Browser/Bridge/Selection/Arg/SelectionInfo.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Record/Element/Element.h"
#include <array>
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
using namespace speckle::record::element;
namespace {
///Serialisation fields
enum FieldIndex {
selectedObjectIdsID,
summaryID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"selectedObjectIds"},
Identity{"summary"},
};
}
SelectionInfo::SelectionInfo() {
auto project = connector()->getActiveProject().lock();
if (!project) {
// TODO: is this OK?
return;
}
auto elementDatabase = project->getElementDatabase();
auto selected = elementDatabase->getSelection();
active::utility::String summary(selected.size());
summary += " objects selected.";
m_summary = summary;
for (const auto& link : selected) {
m_selectedElementIds.push_back(link);
}
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool SelectionInfo::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[selectedObjectIdsID], selectedObjectIdsID, element },
{ fieldID[summaryID], summaryID, element },
},
}.withType(&typeid(SelectionInfo)));
return true;
} //SelectionInfo::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique SelectionInfo::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(SelectionInfo))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case selectedObjectIdsID:
return std::make_unique<ContainerWrap<std::vector<active::utility::Guid>>>(m_selectedElementIds, false, fieldID[selectedObjectIdsID].name);
case summaryID:
return std::make_unique<ValueWrap<active::utility::String>>(m_summary);
default:
return nullptr; //Requested an unknown index
}
} //SelectionInfo::getCargo
@@ -1,45 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SELECTION_INFO
#define CONNECTOR_INTERFACE_BRIDGE_SELECTION_INFO
#include "Active/Serialise/Package/Package.h"
namespace connector::interfac::browser::bridge {
/*!
Configuration settings class
*/
class SelectionInfo : public active::serialise::Package {
public:
// MARK: - Types
using base = active::serialise::Package;
// MARK: - Constructors
/*!
Default constructor
*/
SelectionInfo();
active::utility::String m_summary = "No objects selected";
std::vector<active::utility::Guid> m_selectedElementIds;
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SELECTION_INFO
@@ -1,23 +0,0 @@
#include "Active/Serialise/CargoHold.h"
#include "Connector/Interface/Browser/Bridge/Selection/GetSelection.h"
#include "Connector/Interface/Browser/Bridge/Selection/Arg/SelectionInfo.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetSelection::GetSelection() : BridgeMethod{"GetSelection", [&]() {
return run();
}} {}
/*--------------------------------------------------------------------
Get the current selection info
based on the ArchiCAD mdoel selection
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetSelection::run() const {
auto selectionInfo = std::make_unique<SelectionInfo>();
return std::make_unique<CargoHold<PackageWrap, SelectionInfo>>(std::move(selectionInfo));
} //GetSelection::run
@@ -1,29 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GETSELECTION
#define CONNECTOR_INTERFACE_BRIDGE_GETSELECTION
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
class GetSelection : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
/*!
Constructor
*/
GetSelection();
// MARK: - Functions (const)
/*!
Get the current selection info
based on the ArchiCAD mdoel selection
*/
std::unique_ptr<active::serialise::Cargo> run() const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_GETSELECTION
@@ -1,30 +0,0 @@
#include "Active/Serialise/CargoHold.h"
#include "Connector/Interface/Browser/Bridge/Selection/SelectionBridge.h"
#include "Connector/Interface/Browser/Bridge/Selection/GetSelection.h"
#include "Connector/Interface/Browser/Bridge/Selection/Arg/SelectionInfo.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
SelectionBridge::SelectionBridge() : BrowserBridge{"selectionBinding"} {
//Add bridge methods
addMethod<GetSelection>();
} //SelectionBridge::SelectionBridge
/*--------------------------------------------------------------------
Handle a selection change
event: The selection event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool SelectionBridge::handle(const speckle::event::SelectionEvent& event) {
auto selectionInfo = std::make_unique<SelectionInfo>();
auto wrapped = std::make_unique<CargoHold<PackageWrap, SelectionInfo>>(std::move(selectionInfo));
sendEvent("setSelection", std::move(wrapped));
return true;
} //SelectionBridge::handle
@@ -1,39 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SELECTION_BRIDGE
#define CONNECTOR_INTERFACE_BRIDGE_SELECTION_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Event/Subscriber/SelectionSubscriber.h"
#include "Speckle/Event/Type/SelectionEvent.h"
namespace connector::interfac::browser::bridge {
/*!
A browser bridge to manage element selection information passed between the JS UI and the BIM application
*/
class SelectionBridge : public speckle::interfac::browser::bridge::BrowserBridge, public speckle::event::SelectionSubscriber {
public:
// MARK: - Types
using base = speckle::interfac::browser::bridge::BrowserBridge;
// MARK: - Constructors
using base::base;
/*!
Default constructor
*/
SelectionBridge();
protected:
/*!
Handle a selection change
@param event The selection event
@return True if the event should be closed
*/
bool handle(const speckle::event::SelectionEvent& event) override;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SELECTION_BRIDGE
@@ -1,7 +1,6 @@
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendObject.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendObject.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h" #include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include <array> #include <array>
@@ -15,13 +14,15 @@ namespace {
///Serialisation fields ///Serialisation fields
enum FieldIndex { enum FieldIndex {
idID, idID,
rootObjID, totChildID,
batchesID,
}; };
///Serialisation field IDs ///Serialisation field IDs
static std::array fieldID = { static std::array fieldID = {
Identity{"id"}, Identity{"id"},
Identity{"rootObject"}, Identity{"totalChildrenCount"},
Identity{"batches"},
}; };
} }
@@ -38,7 +39,8 @@ bool SendObject::fillInventory(active::serialise::Inventory& inventory) const {
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ fieldID[idID], idID, element }, { fieldID[idID], idID, element },
{ fieldID[rootObjID], rootObjID, element }, { fieldID[totChildID], totChildID, element },
{ fieldID[batchesID], batchesID, element },
}, },
}.withType(&typeid(SendObject))); }.withType(&typeid(SendObject)));
return true; return true;
@@ -59,10 +61,10 @@ Cargo::Unique SendObject::getCargo(const active::serialise::Inventory::Item& ite
switch (item.index) { switch (item.index) {
case idID: case idID:
return std::make_unique<StringWrap>(id); return std::make_unique<StringWrap>(id);
case rootObjID: case totChildID:
if (m_object) return std::make_unique<Int32Wrap>(totalChildrenCount);
return std::make_unique<PackageWrap>(*m_object); case batchesID:
return std::make_unique<NullPackage>(); return std::make_unique<ContainerWrap<std::vector<speckle::utility::String>>>(batches);
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
@@ -2,8 +2,8 @@
#define CONNECTOR_INTERFACE_BRIDGE_SEND_OBJECT #define CONNECTOR_INTERFACE_BRIDGE_SEND_OBJECT
#include "Active/Serialise/CargoHold.h" #include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h" #include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h"
#include "Speckle/Database/Content/Record.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h" #include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
@@ -14,20 +14,23 @@ namespace connector::interfac::browser::bridge {
class SendObject final : public active::serialise::Package { class SendObject final : public active::serialise::Package {
public: public:
using base = std::reference_wrapper<active::serialise::Package>;
// MARK: - Constructors // MARK: - Constructors
/*! /*!
Default constructor Constructor
@param object The object to send @param errMess The error message
*/ @param card The ID of the model card associated with the wrror
SendObject(std::unique_ptr<speckle::database::Record> object) : m_object{std::move(object)} { id = m_object->getID(); } */
SendObject() {}
// MARK: - Public variables // MARK: - Public variables
///The root object id which should be used for creating the version ///The root object id which should be used for creating the version
speckle::utility::String id; speckle::utility::String id = "1234asdasdsadsadsa";
///The total number of children
int32_t totalChildrenCount = 0;
///JSON batches for the root object and child (detached) objects
std::vector<speckle::utility::String> batches = { "[{\"speckle_type\": \"Base\", \"id\" : \"1234asdasdsadsadsa\"}]" }; // NOTE to Ralph: it will be stringified but like array of objects as in example
// MARK: - Serialisation // MARK: - Serialisation
@@ -43,20 +46,6 @@ namespace connector::interfac::browser::bridge {
@return The requested cargo (nullptr on failure) @return The requested cargo (nullptr on failure)
*/ */
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Use a manager in (de)serialisation processes
@param management The management to use
*/
void useManagement(active::serialise::Management* management) const override { m_object->useManagement(management); }
/*!
Get the cargo management
@return The active management
*/
active::serialise::Management* management() const override { return m_object->management(); }
private:
///The object to send
std::unique_ptr<speckle::database::Record> m_object;
}; };
} }
@@ -46,11 +46,10 @@ namespace {
modelCard: The model card to populate into the send info for the browser modelCard: The model card to populate into the send info for the browser
account: The account linked to the send account: The account linked to the send
object: The object to be sent
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
SendViaBrowserArgs::SendViaBrowserArgs(const ModelCard& modelCard, const Account& account, SendObject&& object) : SendViaBrowserArgs::SendViaBrowserArgs(const ModelCard& modelCard, const Account& account) :
modelCardID(modelCard.getID()), projectID(modelCard.getProjectID()), modelID(modelCard.getModelID()), token{account.getToken()}, modelCardID(modelCard.getID()), projectID(modelCard.getProjectID()), modelID(modelCard.getModelID()), token{account.getToken()},
serverURL{account.getServerURL()}, accountID{account.getID()}, sendObject{std::move(object)} { serverURL{account.getServerURL()}, accountID{account.getID()} {
} //SendViaBrowserArgs::SendViaBrowserArgs } //SendViaBrowserArgs::SendViaBrowserArgs
@@ -33,9 +33,8 @@ namespace connector::interfac::browser::bridge {
Constructor Constructor
@param modelCard The model card to populate into the send info for the browser @param modelCard The model card to populate into the send info for the browser
@param account The account linked to the send @param account The account linked to the send
@param object The object to be sent
*/ */
SendViaBrowserArgs(const connector::record::ModelCard& modelCard, const speckle::record::cred::Account& account, SendObject&& object); SendViaBrowserArgs(const connector::record::ModelCard& modelCard, const speckle::record::cred::Account& account);
// MARK: - Public variables // MARK: - Public variables
@@ -72,16 +71,6 @@ namespace connector::interfac::browser::bridge {
@return The requested cargo (nullptr on failure) @return The requested cargo (nullptr on failure)
*/ */
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Use a manager in (de)serialisation processes
@param management The management to use
*/
void useManagement(active::serialise::Management* management) const override { sendObject.useManagement(management); }
/*!
Get the cargo management
@return The active management
*/
active::serialise::Management* management() const override { return sendObject.management(); }
}; };
} }
@@ -18,6 +18,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
GetSendFilters(); GetSendFilters();
@@ -13,7 +13,7 @@ using namespace speckle::utility;
namespace { namespace {
using WrappedValue = CargoHold<ContainerWrap<Vector<CardSetting>, PackageWrap>, Vector<CardSetting>>; using WrappedValue = active::serialise::CargoHold<ContainerWrap<Vector<CardSetting>, PackageWrap>, Vector<CardSetting>>;
} }
@@ -26,9 +26,9 @@ GetSendSettings::GetSendSettings() : BridgeMethod{"GetSendSettings", [&]() {
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get send settings relevant to the host BIM application Get the send filters
return: The send settings return: The send filters
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetSendSettings::run() const { std::unique_ptr<Cargo> GetSendSettings::run() const {
auto filters = std::make_unique<Vector<CardSetting>>(); auto filters = std::make_unique<Vector<CardSetting>>();
@@ -9,7 +9,7 @@ namespace connector::interfac::browser::bridge {
class ConnectorConfig; class ConnectorConfig;
/*! /*!
JS Function class to retrieve the send settings relevant to the host BIM application JS Function class to retrieve the send filters
*/ */
class GetSendSettings : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetSendSettings : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -18,14 +18,15 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
GetSendSettings(); GetSendSettings();
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Get send settings relevant to the host BIM application Get the send filters
@return The send settings @return The send filters
*/ */
std::unique_ptr<active::serialise::Cargo> run() const; std::unique_ptr<active::serialise::Cargo> run() const;
}; };
@@ -7,26 +7,22 @@
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendError.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendError.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendViaBrowserArgs.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendViaBrowserArgs.h"
#include "Connector/Record/Collection/ProjectCollection.h"
#include "Speckle/Database/AccountDatabase.h" #include "Speckle/Database/AccountDatabase.h"
#include "Speckle/Database/Content/BIMRecord.h"
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h" #include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Record/Credentials/Account.h" #include "Speckle/Record/Credentials/Account.h"
#include "Speckle/Serialise/Detached/Storage/DetachedMemoryStore.h" #include "Speckle/Serialise/Detached/Storage/DetachedMemoryStore.h"
#include "Speckle/Utility/Exception.h" #include "Speckle/Utility/Exception.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Record/Element/Element.h"
using namespace speckle::record::element;
using namespace active::serialise; using namespace active::serialise;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace connector::record;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::serialise; using namespace speckle::serialise;
using namespace speckle::utility; using namespace speckle::utility;
namespace {
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
@@ -38,7 +34,7 @@ Send::Send() : BridgeMethod{"Send", [&](const SendArgs& args) {
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Send a specified model Send a specified model
modelCardID: The ID of the model card identifying the objects to send modelCardID: The ID of the model to send
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void Send::run(const String& modelCardID) const { void Send::run(const String& modelCardID) const {
//Find the specified model card //Find the specified model card
@@ -49,7 +45,6 @@ void Send::run(const String& modelCardID) const {
std::make_unique<SendError>(connector()->getLocalString(errorString, modelCardNotFoundID), modelCardID)); std::make_unique<SendError>(connector()->getLocalString(errorString, modelCardNotFoundID), modelCardID));
return; return;
} }
//Get the user account
auto accountDatabase = connector()->getAccountDatabase(); auto accountDatabase = connector()->getAccountDatabase();
auto account = accountDatabase->getAccount(modelCard->getAccountID(), modelCard->getServerURL()); auto account = accountDatabase->getAccount(modelCard->getAccountID(), modelCard->getServerURL());
if (!account) { if (!account) {
@@ -64,21 +59,9 @@ void Send::run(const String& modelCardID) const {
std::make_unique<SendError>(connector()->getLocalString(errorString, noProjectOpenID), modelCardID)); std::make_unique<SendError>(connector()->getLocalString(errorString, noProjectOpenID), modelCardID));
return; return;
} }
//Get the selected elements //We currently collect all detached object serialised data into a memory-based store - in future may be able to batch send and cache locally
auto elementDatabase = project->getElementDatabase(); DetachedMemoryStore detachedObjects;
auto selected = elementDatabase->getSelection(); auto result = std::make_unique<SendViaBrowserArgs>(*modelCard, *account);
if (selected.empty()) {
getBridge()->sendEvent("setModelError",
std::make_unique<SendError>(connector()->getLocalString(errorString, noSelectedModelItemsID), modelCardID));
return;
}
//Build a collection from the selected elements
auto collection = std::make_unique<ProjectCollection>(project);
for (const auto& link : selected) {
if (auto element = elementDatabase->getElement(link); element)
collection->addElement(*element);
}
//Send the collected information
auto result = std::make_unique<SendViaBrowserArgs>(*modelCard, *account, SendObject{std::move(collection)});
getBridge()->sendEvent("sendByBrowser", std::move(result)); getBridge()->sendEvent("sendByBrowser", std::move(result));
} //Send::run } //Send::run
@@ -25,6 +25,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
Send(); Send();
@@ -32,7 +33,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Send a specified model Send a specified model
@param modelCardID The ID of the model card identifying the objects to send @param modelCardID The ID of the model to send
*/ */
void run(const speckle::utility::String& modelCardID) const; void run(const speckle::utility::String& modelCardID) const;
}; };
@@ -1,26 +1,10 @@
#include "Connector/Interface/Browser/Bridge/Send/SendBridge.h" #include "Connector/Interface/Browser/Bridge/Send/SendBridge.h"
#include "Connector/Interface/Browser/Bridge/Send/GetSendFilters.h" #include "Connector/Interface/Browser/Bridge/Send/GetSendFilters.h"
#include "Connector/Interface/Browser/Bridge/Send/GetSendSettings.h" #include "Connector/Interface/Browser/Bridge/Send/GetSendSettings.h"
#include "Connector/Interface/Browser/Bridge/Send/Send.h" #include "Connector/Interface/Browser/Bridge/Send/Send.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "Speckle/Event/Type/ElementEvent.h"
#include "Speckle/Record/Element/Element.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Record/Model/SenderModelCard.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
using namespace speckle::database;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
using namespace speckle::event;
using namespace active::serialise;
using namespace connector::record;
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
@@ -30,68 +14,4 @@ SendBridge::SendBridge() : BrowserBridge{"sendBinding"} {
addMethod<GetSendFilters>(); addMethod<GetSendFilters>();
addMethod<GetSendSettings>(); addMethod<GetSendSettings>();
addMethod<Send>(); 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 } //SendBridge::SendBridge
/*--------------------------------------------------------------------
Handle an element change
event: The selection event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool SendBridge::handle(const ElementEvent& event) {
using enum ElementEvent::Type;
auto eventType = event.getEventType();
switch (eventType) {
case begin:
m_changedElements.clear();
break;
case end: {
auto modelCardDatabase = connector()->getModelCardDatabase();
auto modelCards = modelCardDatabase->getCards();
// POC: this is probably not efficient, should test, review and refactor it
RecordIDList expiredModelCardIds;
for (const auto& modelCard : modelCards) {
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get())) {
auto modelCardSelection = senderCard->getFilter().getElementIDs();
for (const auto& elemId : modelCardSelection) {
if (std::find(m_changedElements.begin(), m_changedElements.end(), elemId) != m_changedElements.end()) {
expiredModelCardIds.push_back(modelCard->getID());
break;
}
}
}
}
if (!expiredModelCardIds.empty()) {
auto wrapped = std::make_unique<CargoHold<ContainerWrap<RecordIDList>, RecordIDList>>(std::move(expiredModelCardIds));
sendEvent("setModelsExpired", std::move(wrapped));
}
break;
}
case changeElem: case editElem: case deleteElem: {
if (event.getElmentID())
m_changedElements.push_back(*event.getElmentID());
break;
}
default:
break;
}
return true;
} //SendBridge::handle
@@ -2,14 +2,13 @@
#define CONNECTOR_INTERFACE_BRIDGE_SEND_BRIDGE #define CONNECTOR_INTERFACE_BRIDGE_SEND_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h" #include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Event/Subscriber/ElementSubscriber.h"
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
A browser bridge to support sending model data to a Speckle server A browser bridge to support sending model data to a Speckle server
*/ */
class SendBridge : public speckle::interfac::browser::bridge::BrowserBridge, public speckle::event::ElementSubscriber { class SendBridge : public speckle::interfac::browser::bridge::BrowserBridge {
public: public:
// MARK: - Types // MARK: - Types
@@ -23,14 +22,6 @@ namespace connector::interfac::browser::bridge {
Default constructor Default constructor
*/ */
SendBridge(); SendBridge();
protected:
/*!
Handle an element change
@param event The selection event
@return True if the event should be closed
*/
bool handle(const speckle::event::ElementEvent& event) override;
}; };
} }
@@ -1,5 +1,5 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_COMPLEX_TYPE #ifndef CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#define CONNECTOR_INTERFACE_BRIDGE_GET_COMPLEX_TYPE #define CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h" #include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
@@ -15,6 +15,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
GetComplexType(); GetComplexType();
@@ -29,4 +30,4 @@ namespace connector::interfac::browser::bridge {
} }
#endif //CONNECTOR_INTERFACE_BRIDGE_GET_COMPLEX_TYPE #endif //CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
@@ -1,9 +1,8 @@
#include "Connector/Interface/Browser/Bridge/Test/GoAway.h" #include "Connector/Interface/Browser/Bridge/Test/GoAway.h"
#include "Speckle/Environment/Platform.h"
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::environment;
#include <iostream>
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
@@ -17,5 +16,5 @@ GoAway::GoAway() : BridgeMethod{"GoAway", [&]() {
Write a message to the console Write a message to the console
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void GoAway::run() const { void GoAway::run() const {
platform()->writeToConsole("Okay, going away."); std::cout << "Okay, going away.";
} //GoAway::run } //GoAway::run
@@ -1,22 +1,25 @@
#include "Connector/Interface/ConnectorPalette.h" #include "Connector/Interface/ConnectorPalette.h"
#include "Active/Event/Event.h" #include "Active/Event/Event.h"
#include "Active/Utility/String.h"
#include "Active/Serialise/JSON/JSONTransport.h"
#include "Active/Utility/BufferOut.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h" #include "Connector/ConnectorResource.h"
#include "Connector/Event/ConnectorEventID.h" #include "Connector/Event/ConnectorEventID.h"
#include "Connector/Interface/Browser/Bridge/Account/AccountBridge.h" #include "Connector/Interface/Browser/Bridge/Account/AccountBridge.h"
#include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h" #include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h"
#include "Connector/Interface/Browser/Bridge/Config/ConfigBridge.h" #include "Connector/Interface/Browser/Bridge/Config/ConfigBridge.h"
#include "Connector/Interface/Browser/Bridge/Send/SendBridge.h" #include "Connector/Interface/Browser/Bridge/Send/SendBridge.h"
#include "Connector/Interface/Browser/Bridge/Selection/SelectionBridge.h"
#include "Connector/Interface/Browser/Bridge/Test/TestBridge.h" #include "Connector/Interface/Browser/Bridge/Test/TestBridge.h"
#include "Speckle/Environment/Addon.h" #include "Speckle/Environment/Addon.h"
#include "Speckle/Event/Type/MenuEvent.h" #include "Speckle/Event/Type/MenuEvent.h"
#include "Speckle/Interface/Browser/JSPortal.h" #include "Speckle/Interface/Browser/JSPortal.h"
#include "Speckle/Environment/Project.h"
#include "Connector/Connector.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include <ACAPinc.h> #include <ACAPinc.h>
#include <DGModule.hpp> #include <DGModule.hpp>
#include <DGBrowser.hpp> #include <DGBrowser.hpp>
@@ -78,6 +81,9 @@ namespace {
virtual void PanelResized(const DG::PanelResizeEvent& ev) override; virtual void PanelResized(const DG::PanelResizeEvent& ev) override;
virtual void PanelCloseRequested(const DG::PanelCloseRequestEvent& ev, bool* accepted) override; virtual void PanelCloseRequested(const DG::PanelCloseRequestEvent& ev, bool* accepted) override;
static GS::Array<BrowserPalette::ElementInfo> GetSelectedElements();
static void ModifySelection(const GS::UniString& elemGuidStr, SelectionModification modification);
static GSErrCode __ACENV_CALL PaletteControlCallBack(Int32 paletteId, API_PaletteMessageID messageID, GS::IntPtr param); static GSErrCode __ACENV_CALL PaletteControlCallBack(Int32 paletteId, API_PaletteMessageID messageID, GS::IntPtr param);
static GS::Ref<BrowserPalette> instance; static GS::Ref<BrowserPalette> instance;
@@ -166,29 +172,9 @@ BrowserPalette::BrowserPalette() :
BeginEventProcessing(); BeginEventProcessing();
//Install required connector bridges //Install required connector bridges
install<AccountBridge>(); install<AccountBridge>();
install<BaseBridge>();
if (auto ref = install<BaseBridge>(); ref) {
if (auto baseBridgeRef = std::dynamic_pointer_cast<BaseBridge>(ref); baseBridgeRef) {
connector::connector()->addWeak(baseBridgeRef);
}
}
install<ConfigBridge>(); install<ConfigBridge>();
install<SendBridge>();
if (auto ref = install<SendBridge>(); ref) {
if (auto sendBridgeRef = std::dynamic_pointer_cast<SendBridge>(ref); sendBridgeRef) {
connector::connector()->addWeak(sendBridgeRef);
sendBridgeRef->start();
}
}
if (auto ref = install<SelectionBridge>(); ref) {
if (auto selectionBridgeRef = std::dynamic_pointer_cast<SelectionBridge>(ref); selectionBridgeRef) {
connector::connector()->addWeak(selectionBridgeRef);
selectionBridgeRef->start();
}
}
install<TestBridge>(); install<TestBridge>();
InitBrowserControl(); InitBrowserControl();
} }
@@ -228,8 +214,7 @@ void BrowserPalette::Hide() {
void BrowserPalette::InitBrowserControl() { void BrowserPalette::InitBrowserControl() {
#ifdef TESTING_MODE #ifdef TESTING_MODE
browser->LoadURL("https://deploy-preview-3180--boisterous-douhua-e3cefb.netlify.app/"); browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/test");
//browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/test");
#else #else
browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/"); browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/");
#endif #endif
@@ -262,6 +247,31 @@ void BrowserPalette::PanelCloseRequested(const DG::PanelCloseRequestEvent&, bool
*accepted = true; *accepted = true;
} }
GS::Array<BrowserPalette::ElementInfo> BrowserPalette::GetSelectedElements() {
API_SelectionInfo selectionInfo;
GS::Array<API_Neig> selNeigs;
ACAPI_Selection_Get(&selectionInfo, &selNeigs, false, false);
BMKillHandle((GSHandle*)&selectionInfo.marquee.coords);
GS::Array<BrowserPalette::ElementInfo> selectedElements;
for(const API_Neig& neig : selNeigs) {
API_Elem_Head elemHead = {};
elemHead.guid = neig.guid;
ACAPI_Element_GetHeader(&elemHead);
ElementInfo elemInfo;
elemInfo.guidStr = APIGuidToString(elemHead.guid);
ACAPI_Element_GetElemTypeName(elemHead.type, elemInfo.typeName);
ACAPI_Element_GetElementInfoString(&elemHead.guid, &elemInfo.elemID);
selectedElements.Push(elemInfo);
}
return selectedElements;
}
void BrowserPalette::ModifySelection(const GS::UniString& elemGuidStr, BrowserPalette::SelectionModification modification) {
ACAPI_Selection_Select({ API_Neig(APIGuidFromString(elemGuidStr.ToCStr().Get())) }, modification == AddToSelection);
}
GSErrCode __ACENV_CALL BrowserPalette::PaletteControlCallBack(Int32, API_PaletteMessageID messageID, GS::IntPtr param) { GSErrCode __ACENV_CALL BrowserPalette::PaletteControlCallBack(Int32, API_PaletteMessageID messageID, GS::IntPtr param) {
switch(messageID) { switch(messageID) {
case APIPalMsg_OpenPalette: case APIPalMsg_OpenPalette:
@@ -1,68 +0,0 @@
#include "Connector/Record/Collection/FinishProxy.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include <array>
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
materialID,
linkedMeshID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"value"},
Identity{"objects"},
};
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool FinishProxy::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[materialID], materialID, element },
{ fieldID[linkedMeshID], linkedMeshID, element },
},
}.withType(&typeid(FinishProxy)));
return base::fillInventory(inventory);
} //FinishProxy::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique FinishProxy::getCargo(const active::serialise::Inventory::Item& item) const {
if (item.ownerType != &typeid(FinishProxy))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case materialID:
return std::make_unique<PackageWrap>(m_finish);
case linkedMeshID: {
auto result = new ContainerWrap(m_meshID);
return Cargo::Unique{result};
}
default:
return nullptr; //Requested an unknown index
}
} //FinishProxy::getCargo
@@ -1,60 +0,0 @@
#ifndef CONNECTOR_RECORD_COLLECTION_MATERIAL_PROXY
#define CONNECTOR_RECORD_COLLECTION_MATERIAL_PROXY
#include "Speckle/Database/Content/BIMRecord.h"
#include "Speckle/Record/Attribute/Finish.h"
#include "Speckle/Utility/String.h"
namespace connector::record {
/*!
A proxy record binding a surface finishes to meshes
*/
class FinishProxy : public speckle::database::BIMRecord {
public:
using base = speckle::database::BIMRecord;
// MARK: - Constructors
/*!
Constructor
@param finish The proxy surface finish
@param meshID The list of mesh IDs the finish is applied to
*/
FinishProxy(const speckle::record::attribute::Finish& finish, const std::unordered_set<active::utility::Guid>& meshID) :
base{speckle::utility::Guid{true}, speckle::utility::Guid{}, std::nullopt}, m_finish{finish} {
std::copy(meshID.begin(), meshID.end(), std::back_inserter(m_meshID));
}
/*!
Get the speckle type identifier
@return The speckle type (relevant objects should override as required, but "Base" is still considered a type on its own)
*/
speckle::utility::String getSpeckleType() const override { return "Objects.Other.RenderMaterialProxy"; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
private:
///The proxy surface finish
speckle::record::attribute::Finish m_finish;
///The list of mesh IDs the finish is applied to
std::vector<active::utility::Guid> m_meshID;
};
}
#endif //CONNECTOR_RECORD_COLLECTION_MATERIAL_PROXY
@@ -1,196 +0,0 @@
#include "Connector/Record/Collection/ProjectCollection.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Management/Management.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h"
#include "Connector/Record/Collection/FinishProxy.h"
#include "Speckle/Database/BIMAttributeDatabase.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Record/Attribute/Finish.h"
#include "Speckle/Record/Element/Element.h"
#ifdef ARCHICAD
#include <ACAPinc.h>
#include <ModelMaterial.hpp>
#endif
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::database;
using namespace speckle::record::attribute;
using namespace speckle::utility;
#ifdef ARCHICAD
namespace connector::record {
class ProjectCollection::FinishCache : public std::unordered_map<active::utility::Guid, Finish> {};
}
#endif
namespace {
///Serialisation fields
enum FieldIndex {
finishProxyID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"renderMaterialProxies"},
};
using WrappedProxy = CargoHold<PackageWrap, FinishProxy>;
}
/*--------------------------------------------------------------------
Constructor
project: The source project
--------------------------------------------------------------------*/
ProjectCollection::ProjectCollection(speckle::environment::Project::Shared project) : base{project->getInfo().name, project},
m_management{std::make_unique<Management>()} {
m_management->push_back(this);
m_finishes = std::make_unique<FinishCache>();
base::useManagement(m_management.get());
} //ProjectCollection::ProjectCollection
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
ProjectCollection::~ProjectCollection() {
} //ProjectCollection::~ProjectCollection
/*--------------------------------------------------------------------
Add an element to the collection hierarchy
index The index of the element to add
return: True if the element was added (false typically means the element already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addElement(const speckle::database::BIMIndex& index) {
//Lookup the element in the element database of the active project
auto elementDbase = m_project->getElementDatabase();
if (elementDbase == nullptr)
return false;
if (auto element = elementDbase->getElement(index); element) {
addElement(*element); //Add the element to the collection hierarchy
return true;
}
return false;
} //ProjectCollection::addElement
/*--------------------------------------------------------------------
Add an element to the collection hierarchy
element: The element to add
return: True if the element was added (false typically means the element already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addElement(const speckle::record::element::Element& element) {
std::vector<String> collectionNames;
//The first collection hierarchy level is the element storey/level
auto storey = element.getStorey();
collectionNames.emplace_back(storey ? storey->getName() : connector()->getLocalString(titleString, noStoreyID));
//The next level is the name of the element type
collectionNames.emplace_back(element.getTypeName());
//Add any future levels here as required
RecordCollection* collection = this;
for (const auto& childName : collectionNames)
collection = collection->getChild(childName);
return collection->addIndex(BIMIndex{element.getBIMID(), element.getTableID()});
} //ProjectCollection::addElement
/*--------------------------------------------------------------------
Add a material proxy record to the collection
materialIndex: The index of the material to add
objectID: The object the material is applied to
return: True if the material proxy was added (false typically means the record already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addMaterialProxy(const speckle::database::BIMIndex& materialIndex, const speckle::database::BIMRecordID& objectID) {
auto iter = m_finishProxies.find(materialIndex);
if (iter == m_finishProxies.end())
iter = m_finishProxies.insert({materialIndex, {}}).first;
return iter->second.insert(objectID).second;
} //ProjectCollection::addMaterialProxy
#ifdef ARCHICAD
/*--------------------------------------------------------------------
Add a ModelerAPI material to the collection (NB: These are not persistent so need to be captured by this method)
material: A material
objectID: The object the material is applied to
return: True if the material proxy was added (false typically means the record already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addMaterialProxy(const Finish& finish, const speckle::database::BIMRecordID& objectID) {
auto iter = m_finishes->find(finish.getBIMID());
if (iter == m_finishes->end())
iter = m_finishes->insert({finish.getBIMID(), finish}).first;
return addMaterialProxy(speckle::database::BIMIndex{finish.getBIMID()}, objectID);
} //ProjectCollection::addMaterialProxy
#endif
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool ProjectCollection::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type;
base::fillInventory(inventory);
inventory.merge(Inventory{
{
{ Identity{fieldID[finishProxyID]}, finishProxyID, 100, std::nullopt },
},
}.withType(&typeid(ProjectCollection)));
return true;
} //ProjectCollection::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique ProjectCollection::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(ProjectCollection))
return base::getCargo(item);
using namespace active::serialise;
//TODO: This is only currently coded to write collection content - reading can be added as required in future
switch (item.index) {
case finishProxyID: {
if (item.available < m_finishProxies.size()) {
auto iter = m_finishProxies.begin();
std::advance(iter, item.available);
const Finish* finish = nullptr;
if (auto fin = m_finishes->find(iter->first); fin != m_finishes->end())
finish = &fin->second;
else if (auto attribute = m_project->getAttributeDatabase()->getAttribute(iter->first, iter->first.tableID); attribute)
finish = dynamic_cast<const Finish*>(attribute.get());
if (finish != nullptr) {
auto proxy = std::make_unique<FinishProxy>(*finish, iter->second);
return std::make_unique<WrappedProxy>(std::move(proxy));
}
}
break;
}
default:
break;
}
return nullptr; //Requested an unknown index
} //ProjectCollection::getCargo
@@ -1,109 +0,0 @@
#ifndef CONNECTOR_RECORD_ROOT_COLLECTiON
#define CONNECTOR_RECORD_ROOT_COLLECTiON
#include "Connector/Record/Collection/RecordCollection.h"
#include "Speckle/Serialise/Collection/FinishCollector.h"
#include <stack>
namespace active::serialise {
class Management;
}
namespace speckle::record::element {
class Element;
}
namespace connector::record {
/*!
Root collection for sending a project model to a Speckle server
Additional information is anticipated at the root level that will not apply at any other level in the container hierarchy, e.g.:
- Classification hierarchy
- Layers
- Other attributes, e.g. materials
Add all this supplementary data to the root container as required
*/
class ProjectCollection : public RecordCollection, public speckle::serialise::FinishCollector {
public:
// MARK: - Types
using base = RecordCollection;
// MARK: - Constructors
/*!
Constructor
@param project The source project
*/
ProjectCollection(speckle::environment::Project::Shared project);
ProjectCollection(const ProjectCollection&) = delete;
/*!
Destructor
*/
~ProjectCollection();
using base::base;
// MARK: - Functions (const)
// MARK: - Functions (mutating)
/*!
Add an element to the collection hierarchy
@param index The index of the element to add
@return True if the element was added (false typically means the element already exists)
*/
bool addElement(const speckle::database::BIMIndex& index);
/*!
Add an element to the collection hierarchy
@param element The element to add
@return True if the element was added (false typically means the element already exists)
*/
bool addElement(const speckle::record::element::Element& element);
/*!
Add a material proxy record to the collection
@param materialIndex The index of the material to add
@param objectID The object the material is applied to
@return True if the material proxy was added (false typically means the record already exists)
*/
bool addMaterialProxy(const speckle::database::BIMIndex& materialIndex, const speckle::database::BIMRecordID& objectID) override;
/*!
Add a ModelerAPI material to the collection (NB: These are not persistent so need to be captured by this method)
@param finish A finish
@param objectID The object the material is applied to
@return True if the material proxy was added (false typically means the record already exists)
*/
bool addMaterialProxy(const speckle::record::attribute::Finish& finish, const speckle::database::BIMRecordID& objectID) override;
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
private:
using FinishProxies = std::unordered_map<speckle::database::BIMIndex, std::unordered_set<active::utility::Guid>>;
std::unique_ptr<active::serialise::Management> m_management;
///Finish proxies accumulated from meshes generated from the collection elements
FinishProxies m_finishProxies;
class FinishCache;
///Finishes cache
std::unique_ptr<FinishCache> m_finishes;
};
}
#endif //CONNECTOR_RECORD_ROOT_COLLECTiON
@@ -1,15 +1,11 @@
#include "Connector/Record/Collection/RecordCollection.h" #include "Connector/Record/Collection/RecordCollection.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h" #include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h" #include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Speckle/Database/BIMElementDatabase.h"
using namespace active::serialise; using namespace active::serialise;
using namespace connector::record; using namespace connector::record;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::record::element;
using namespace speckle::utility; using namespace speckle::utility;
#include <array> #include <array>
@@ -20,55 +16,18 @@ namespace {
enum FieldIndex { enum FieldIndex {
nameID, nameID,
elementID, elementID,
childrenID,
}; };
///Serialisation field IDs ///Serialisation field IDs
static std::array fieldID = { static std::array fieldID = {
Identity{"name"}, Identity{"name"},
Identity{"elements"}, Identity{"element"},
Identity{"child"},
}; };
using WrappedElement = CargoHold<PackageWrap, Element>;
} }
/*--------------------------------------------------------------------
Constructor
name: The collection name
project: The source project
--------------------------------------------------------------------*/
RecordCollection::RecordCollection(const speckle::utility::String& name, Project::Shared project) : m_name{name}, m_project{project} {
} //RecordCollection::RecordCollection
/*--------------------------------------------------------------------
Get a child collection by name (adding if missing)
name: The child name
return: A pointer to the requested child (nullptr on failure, caller does not take ownership)
--------------------------------------------------------------------*/
RecordCollection* RecordCollection::getChild(const speckle::utility::String& name) {
//Return an existing child if possible
if (auto iter = m_children.find(name); iter != m_children.end())
return &iter->second;
//Otherwise insert and return a new collection with the requested name
return &m_children.insert({name, RecordCollection{name, m_project}}).first->second;
} //RecordCollection::getChild
/*--------------------------------------------------------------------
Add an index to the collection
index: The index to add
return: True if the index was added (false typically means the index already exists)
--------------------------------------------------------------------*/
bool RecordCollection::addIndex(const speckle::database::BIMIndex& index) {
return m_indices.insert(index).second;
} //RecordCollection::addIndex
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Fill an inventory with the package items Fill an inventory with the package items
@@ -77,13 +36,13 @@ bool RecordCollection::addIndex(const speckle::database::BIMIndex& index) {
return: True if the package has added items to the inventory return: True if the package has added items to the inventory
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
bool RecordCollection::fillInventory(active::serialise::Inventory& inventory) const { bool RecordCollection::fillInventory(Inventory& inventory) const {
using enum Entry::Type; using enum Entry::Type;
base::fillInventory(inventory);
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ Identity{fieldID[nameID]}, nameID, element }, { fieldID[nameID], nameID, element },
{ Identity{fieldID[elementID]}, elementID, m_children.size() + m_indices.size(), std::nullopt }, { fieldID[elementID], elementID, base::size(), std::nullopt, !base::empty() },
{ fieldID[childrenID], childrenID, m_children.size(), std::nullopt, !m_children.empty() },
}, },
}.withType(&typeid(RecordCollection))); }.withType(&typeid(RecordCollection)));
return true; return true;
@@ -99,29 +58,18 @@ bool RecordCollection::fillInventory(active::serialise::Inventory& inventory) co
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
Cargo::Unique RecordCollection::getCargo(const Inventory::Item& item) const { Cargo::Unique RecordCollection::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(RecordCollection)) if (item.ownerType != &typeid(RecordCollection))
return base::getCargo(item); return nullptr;
using namespace active::serialise; using namespace active::serialise;
//TODO: This is only currently coded to write collection content - reading can be added as required in future
switch (item.index) { switch (item.index) {
case nameID: case nameID:
return std::make_unique<StringWrap>(m_name); return std::make_unique<StringWrap>(m_name);
case elementID: { case elementID:
if (item.available < m_children.size()) { return nullptr; //TODO: Implement - need to interrogate BIM database for element and return as cargo
auto iter = m_children.begin(); case childrenID:
std::advance(iter, item.available); if (item.available < m_children.size())
return std::make_unique<PackageWrap>(iter->second); return std::make_unique<PackageWrap>(m_children[item.available]);
} return nullptr;
auto index = item.available - m_children.size();
if (index < m_indices.size()) {
auto iter = m_indices.begin();
std::advance(iter, index);
if (auto element = m_project->getElementDatabase()->getElement(*iter, iter->tableID); element)
return std::make_unique<WrappedElement>(std::move(element));
}
break;
}
default: default:
break; return nullptr; //Requested an unknown index
} }
return nullptr; //Requested an unknown index
} //RecordCollection::getCargo } //RecordCollection::getCargo
@@ -1,18 +1,13 @@
#ifndef CONNECTOR_RECORD_RECORD_COLLECTiON #ifndef CONNECTOR_RECORD_RECORD_COLLECTiON
#define CONNECTOR_RECORD_RECORD_COLLECTiON #define CONNECTOR_RECORD_RECORD_COLLECTiON
#include "Speckle/Database/Content/Record.h" #include "Active/Container/Vector.h"
#include "Speckle/Database/Identity/BIMIndex.h" #include "Active/Serialise/Package/Package.h"
#include "Speckle/Environment/Project.h" #include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Utility/String.h" #include "Speckle/Utility/String.h"
#include <unordered_set>
#include <unordered_map>
namespace connector::record { namespace connector::record {
class ProjectCollection;
/*! /*!
Container for a collection of elements (and potentially tables of associated attributes) for Speckle commits Container for a collection of elements (and potentially tables of associated attributes) for Speckle commits
@@ -31,38 +26,43 @@ namespace connector::record {
Note that the serialisation is currently implemented for sending only. Receive can be added as required Note that the serialisation is currently implemented for sending only. Receive can be added as required
*/ */
class RecordCollection : public speckle::database::Record { class RecordCollection : public std::vector<speckle::database::RecordID>, public active::serialise::Package {
public: public:
// MARK: - Types // MARK: - Types
using base = speckle::database::Record; using base = std::vector<speckle::database::RecordID>;
using Children = std::vector<RecordCollection>;
// MARK: - Constructors // MARK: - Constructors
/*! using base::base;
Destructor
*/
~RecordCollection() {}
// MARK: - Functions (const) // MARK: - Functions (const)
/*!
Get the speckle type identifier
@return The speckle type (relevant objects should override as required, but "Base" is still considered a type on its own)
*/
speckle::utility::String getSpeckleType() const override { return "Speckle.Core.Models.Collections.Collection"; }
/*! /*!
Get the container name Get the container name
@return The container name @return The container name
*/ */
const speckle::utility::String& getName() const { return m_name; } const speckle::utility::String& getName() const { return m_name; }
/*! /*!
Find a child by name Get the child collections
@param name The required child name @return The child collections nested under this collection
@return A pointer to the requested child (nullptr if not found)
*/ */
RecordCollection* findChild(const speckle::utility::String& name) const; const Children& getChildren() const;
// MARK: - Functions (mutating)
/*!
Set the container name
@param name The container name
*/
void setName(const speckle::utility::String& name) { m_name = name; }
/*!
Add a child collection
@param child The child collection to add
*/
void addChild(RecordCollection&& child);
// MARK: - Serialisation // MARK: - Serialisation
@@ -70,51 +70,20 @@ namespace connector::record {
Fill an inventory with the package items Fill an inventory with the package items
@param inventory The inventory to receive the package items @param inventory The inventory to receive the package items
@return True if the package has added items to the inventory @return True if the package has added items to the inventory
*/ */
bool fillInventory(active::serialise::Inventory& inventory) const override; bool fillInventory(active::serialise::Inventory& inventory) const override;
/*! /*!
Get the specified cargo Get the specified cargo
@param item The inventory item to retrieve @param item The inventory item to retrieve
@return The requested cargo (nullptr on failure) @return The requested cargo (nullptr on failure)
*/ */
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
private: private:
friend ProjectCollection;
// MARK: - Types
using Indices = std::unordered_set<speckle::database::BIMIndex>;
using Children = std::unordered_map<speckle::utility::String, RecordCollection>;
/*!
Constructor
@param name The collection name
@param project The source project
*/
RecordCollection(const speckle::utility::String& name, speckle::environment::Project::Shared project);
/*!
Get a child collection by name (adding if missing)
@param name The child name
@return A pointer to the requested child (nullptr on failure, caller does not take ownership)
*/
RecordCollection* getChild(const speckle::utility::String& name);
/*!
Add an index to the collection
@param index The index to add
@return True if the index was added (false typically means the index already exists)
*/
bool addIndex(const speckle::database::BIMIndex& index);
///The source project for the collection
speckle::environment::Project::Shared m_project;
///The collection name
speckle::utility::String m_name;
///Child nodes of this collection ///Child nodes of this collection
Children m_children; Children m_children;
///Indices of records in this collection ///The collection name
Indices m_indices; speckle::utility::String m_name;
}; };
} }
@@ -0,0 +1,34 @@
#include "Connector/Record/Collection/RootCollection.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::database;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool RootCollection::fillInventory(Inventory& inventory) const {
//Extend with supplementary data as required
return base::fillInventory(inventory);
} //RootCollection::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique RootCollection::getCargo(const Inventory::Item& item) const {
//Extend with supplementary data as required
return base::getCargo(item);
} //RootCollection::getCargo
@@ -0,0 +1,52 @@
#ifndef CONNECTOR_RECORD_ROOT_COLLECTiON
#define CONNECTOR_RECORD_ROOT_COLLECTiON
#include "Connector/Record/Collection/RecordCollection.h"
namespace connector::record {
/*!
Root container for sending model data to a Speckle server
Additional information is anticipated at the root level that will not apply at any other level in the container hierarchy, e.g.:
- Classification hierarchy
- Layers
- Other attributes, e.g. materials
Add all this supplementary data to the root container as required
*/
class RootCollection : public RecordCollection {
public:
// MARK: - Types
using base = RecordCollection;
// MARK: - Constructors
using base::base;
// MARK: - Functions (const)
// MARK: - Functions (mutating)
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
};
}
#endif //CONNECTOR_RECORD_ROOT_COLLECTiON
@@ -1,9 +1,13 @@
/*!
Copyright 2024 Ralph Wessel and Hugh Wessel
Distributed under the MIT License (See accompanying file LICENSE.txt or copy at https://opensource.org/license/mit/)
*/
#include "Connector/Record/Model/CardMover.h" #include "Connector/Record/Model/CardMover.h"
#include "Connector/Record/Model/ReceiverModelCard.h" #include "Connector/Record/Model/ReceiverModelCard.h"
#include "Connector/Record/Model/SenderModelCard.h" #include "Connector/Record/Model/SenderModelCard.h"
using namespace active::serialise;
using namespace connector::record; using namespace connector::record;
namespace { namespace {
@@ -33,7 +37,7 @@ namespace {
} }
///The handler for model card packages ///The handler for model card packages
std::shared_ptr<Handler> CardMover::m_handler = std::make_shared<Handler>(attributeTag); std::shared_ptr<active::serialise::Handler> CardMover::m_handler = std::make_shared<active::serialise::Handler>(attributeTag);
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
@@ -6,10 +6,10 @@
namespace connector::record { namespace connector::record {
/*! /*!
Wrapper to box/unbox model cards during (de)serialisation Wrapper to box/unbox objects during (de)serialisation, including reading/writing a specified attribute to determine object type
Model cards are polymorphic - this class ensures the type information is included when a card is serialised Note that a derived class could also define the package handler, allowing the wrapper to be created via a default constructor that is
and the correct object type is constructed on deserialisation automatically bound to a set of internally defined object types
*/ */
class CardMover : public active::serialise::Mover { class CardMover : public active::serialise::Mover {
public: public:
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER #ifndef CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER
#define CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER #define CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/EverythingSendFilter.h" #include "Connector/Record/Model/Filter/EverythingSendFilter.h"
namespace connector::record { namespace connector::record {
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER #ifndef CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER
#define CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER #define CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/DirectSelectionSendFilter.h" #include "Connector/Record/Model/Filter/DirectSelectionSendFilter.h"
namespace connector::record { namespace connector::record {
@@ -7,7 +7,7 @@
#include <array> #include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace speckle::utility; using namespace speckle::utility;
@@ -56,7 +56,7 @@ Cargo::Unique DirectSelectionSendFilter::getCargo(const Inventory::Item& item) c
using namespace active::serialise; using namespace active::serialise;
switch (item.index) { switch (item.index) {
case selectedElemID: case selectedElemID:
return std::make_unique<ContainerWrap<ElementIDList>>(m_selectedElements, false, fieldID[selectedElemID].name); return std::make_unique<ContainerWrap<ElementIDList>>(m_selectedElements);
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER #ifndef CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER
#define CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER #define CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/SendFilter.h" #include "Connector/Record/Model/Filter/SendFilter.h"
namespace connector::record { namespace connector::record {
@@ -36,7 +36,7 @@ namespace connector::record {
Get the filtered element IDs Get the filtered element IDs
@return The filter elements @return The filter elements
*/ */
const speckle::database::ElementIDList& getElementIDs() const override { return m_selectedElements; } const database::ElementIDList& getElementIDs() const override { return m_selectedElements; }
// MARK: - Serialisation // MARK: - Serialisation
@@ -59,7 +59,7 @@ namespace connector::record {
private: private:
///A list of selected element IDs ///A list of selected element IDs
speckle::database::ElementIDList m_selectedElements; database::ElementIDList m_selectedElements;
}; };
} }
@@ -9,7 +9,7 @@
#include <array> #include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace speckle::utility; using namespace speckle::utility;
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_EVERYTHING_SEND_FILTER #ifndef CONNECTOR_RECORD_EVERYTHING_SEND_FILTER
#define CONNECTOR_RECORD_EVERYTHING_SEND_FILTER #define CONNECTOR_RECORD_EVERYTHING_SEND_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/SendFilter.h" #include "Connector/Record/Model/Filter/SendFilter.h"
namespace connector::record { namespace connector::record {
@@ -36,13 +36,13 @@ namespace connector::record {
Get the filtered element IDs Get the filtered element IDs
@return The filter elements @return The filter elements
*/ */
const speckle::database::ElementIDList& getElementIDs() const override { return m_emptyList; } const database::ElementIDList& getElementIDs() const override { return m_emptyList; }
/*! /*!
Determine if the filter has expired because an element in the selection has changed Determine if the filter has expired because an element in the selection has changed
@param changed The list of changed element IDs @param changed The list of changed element IDs
@return True if the one of the changed elements is in the selection @return True if the one of the changed elements is in the selection
*/ */
virtual bool checkExpiry(const speckle::database::ElementIDList& changed) const override { return true; } virtual bool checkExpiry(const database::ElementIDList& changed) const override { return true; }
// MARK: - Serialisation // MARK: - Serialisation
@@ -65,7 +65,7 @@ namespace connector::record {
private: private:
///Enables a const empty list to be returned ///Enables a const empty list to be returned
speckle::database::ElementIDList m_emptyList; database::ElementIDList m_emptyList;
}; };
} }
@@ -1,3 +1,8 @@
/*!
Copyright 2024 Ralph Wessel and Hugh Wessel
Distributed under the MIT License (See accompanying file LICENSE.txt or copy at https://opensource.org/license/mit/)
*/
#include "Connector/Record/Model/Filter/FilterMover.h" #include "Connector/Record/Model/Filter/FilterMover.h"
#include "Connector/Record/Model/Filter/ArchicadEverythingFilter.h" #include "Connector/Record/Model/Filter/ArchicadEverythingFilter.h"
@@ -5,7 +5,7 @@
#include <array> #include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace speckle::utility; using namespace speckle::utility;
@@ -3,7 +3,7 @@
#include "Active/Serialise/Package/Package.h" #include "Active/Serialise/Package/Package.h"
#include "Active/Utility/Cloner.h" #include "Active/Utility/Cloner.h"
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Speckle/Utility/String.h" #include "Speckle/Utility/String.h"
namespace connector::record { namespace connector::record {
@@ -59,13 +59,13 @@ namespace connector::record {
Get the filtered element IDs Get the filtered element IDs
@return The filter elements @return The filter elements
*/ */
virtual const speckle::database::ElementIDList& getElementIDs() const = 0; virtual const database::ElementIDList& getElementIDs() const = 0;
/*! /*!
Determine if the filter has expired because an element in the selection has changed Determine if the filter has expired because an element in the selection has changed
@param changed The list of changed element IDs @param changed The list of changed element IDs
@return True if the one of the changed elements is in the selection @return True if the one of the changed elements is in the selection
*/ */
virtual bool checkExpiry(const speckle::database::ElementIDList& changed) const; virtual bool checkExpiry(const database::ElementIDList& changed) const;
// MARK: - Serialisation // MARK: - Serialisation
@@ -11,10 +11,7 @@
namespace connector::record { namespace connector::record {
/*! /*!
Base class for a Speckle model card A connector send filter
A model card captures key information about a model submitted to a Speckle server, e.g. the model ID, the target server
and account, and any settings or filters applicable to the host BIM application and open document
*/ */
class ModelCard : public speckle::database::Record { class ModelCard : public speckle::database::Record {
public: public:
@@ -63,13 +60,13 @@ namespace connector::record {
*/ */
const speckle::utility::String& getModelID() const { return m_modelID; } const speckle::utility::String& getModelID() const { return m_modelID; }
/*! /*!
Get the ID of the active BIM project Get the setting type
@return The ID of the active BIM project @return The setting type
*/ */
const speckle::utility::String& getProjectID() const { return m_projectID; } const speckle::utility::String& getProjectID() const { return m_projectID; }
/*! /*!
Get the user account ID Get the setting type
@return The user account ID @return The setting type
*/ */
const speckle::utility::String& getAccountID() const { return m_accountID; } const speckle::utility::String& getAccountID() const { return m_accountID; }
/*! /*!
@@ -78,8 +75,8 @@ namespace connector::record {
*/ */
const speckle::utility::String& getMessage() const { return m_message; } const speckle::utility::String& getMessage() const { return m_message; }
/*! /*!
Get the server URL Get the setting type
@return The server URL @return The setting type
*/ */
const speckle::utility::String& getServerURL() const { return m_serverURL; } const speckle::utility::String& getServerURL() const { return m_serverURL; }
/*! /*!
@@ -6,7 +6,7 @@
#include <array> #include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::utility; using namespace speckle::utility;
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_RECEIVER_MODEL_CARD #ifndef CONNECTOR_RECORD_RECEIVER_MODEL_CARD
#define CONNECTOR_RECORD_RECEIVER_MODEL_CARD #define CONNECTOR_RECORD_RECEIVER_MODEL_CARD
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/ModelCard.h" #include "Connector/Record/Model/ModelCard.h"
namespace connector::record { namespace connector::record {
@@ -37,7 +37,7 @@ namespace connector::record {
const speckle::database::RecordID& modelID, const speckle::utility::String& modelName, const speckle::database::RecordID& modelID, const speckle::utility::String& modelName,
const speckle::database::RecordID& selectedVersion, const speckle::database::RecordID& latestVersion, const speckle::database::RecordID& selectedVersion, const speckle::database::RecordID& latestVersion,
const speckle::database::RecordID& accountID, const speckle::utility::String& serverURL, const speckle::database::RecordID& accountID, const speckle::utility::String& serverURL,
bool hasDimissedWarning, speckle::database::ElementIDList&& bakedObjects, const SettingList& settings) : bool hasDimissedWarning, database::ElementIDList&& bakedObjects, const SettingList& settings) :
ModelCard{modelID, projectID, accountID, serverURL, settings}, ModelCard{modelID, projectID, accountID, serverURL, settings},
m_projectName{projectName}, m_modelName{modelName}, m_selectedVersionID{selectedVersion}, m_latestVersionID{latestVersion}, m_projectName{projectName}, m_modelName{modelName}, m_selectedVersionID{selectedVersion}, m_latestVersionID{latestVersion},
m_hasDismissedUpdateWarning{hasDimissedWarning}, m_bakedObjectIDs{bakedObjects} {} m_hasDismissedUpdateWarning{hasDimissedWarning}, m_bakedObjectIDs{bakedObjects} {}
@@ -78,7 +78,7 @@ namespace connector::record {
Get the IDs of objects accepted in the receive Get the IDs of objects accepted in the receive
@return The accepted object IDs @return The accepted object IDs
*/ */
const speckle::database::ElementIDList& getBakedObjectIDs() const { return m_bakedObjectIDs; } const database::ElementIDList& getBakedObjectIDs() const { return m_bakedObjectIDs; }
// MARK: - Serialisation // MARK: - Serialisation
@@ -111,7 +111,7 @@ namespace connector::record {
///True if the user has already dismissed an alert to update ///True if the user has already dismissed an alert to update
bool m_hasDismissedUpdateWarning = false; bool m_hasDismissedUpdateWarning = false;
///IDs of objects accepted in the receive ///IDs of objects accepted in the receive
speckle::database::ElementIDList m_bakedObjectIDs; database::ElementIDList m_bakedObjectIDs;
}; };
} }
-1
View File
@@ -1,7 +1,6 @@
'STR#' 32600 "Title strings" { 'STR#' 32600 "Title strings" {
/* [ 1] */ "Speckle Connector" /* [ 1] */ "Speckle Connector"
/* [ 2] */ "Connector to share model content with Speckle" /* [ 2] */ "Connector to share model content with Speckle"
/* [ 3] */ "No level"
} }
'STR#' 32604 "Error strings" { 'STR#' 32604 "Error strings" {
+1 -1
View File
@@ -1,5 +1,5 @@
'STR#' 32500 "Connector Menu" { 'STR#' 32500 "Connector Menu" {
/*[ 1]*/ "Speckle Connector^E3^EL^ES^ED^EE^EI^EW^ET^" /*[ 1]*/ "Speckle Connector"
} }
+2 -2
View File
@@ -1,7 +1,7 @@
/* --- Dockable browser palette ----------------------------------------------*/ /* --- Dockable browser palette ----------------------------------------------*/
'GDLG' 32500 Palette | topCaption | close | grow 0 0 350 150 "Speckle Connector" { 'GDLG' 32500 Palette | topCaption | close | grow 0 0 450 150 "Speckle Connector" {
/* [ 1] */ Browser 0 0 350 150 /* [ 1] */ Browser 0 0 450 150
} }
'DLGH' 32500 DLG_32500_Browser_Palette { 'DLGH' 32500 DLG_32500_Browser_Palette {
-1
View File
@@ -1,4 +1,3 @@
'STR#' 32700 "Speckle Title strings" { 'STR#' 32700 "Speckle Title strings" {
/* [ 1] */ "Untitled" /* [ 1] */ "Untitled"
/* [ 2] */ "Unknown"
} }
@@ -1,155 +0,0 @@
#include "Speckle/Database/BIMAttributeDatabase.h"
#include "Active/Database/Storage/Storage.h"
#include "Active/Serialise/UnboxedTransport.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Database/Storage/ArchicadDBase/Attribute/ArchicadAttributeDBaseEngine.h"
#include "Speckle/Record/Attribute/Attribute.h"
#include <array>
using namespace active::container;
using namespace active::database;
using namespace active::event;
using namespace active::serialise;
using namespace speckle::database;
using namespace speckle::record;
using namespace speckle::record::attribute;
using namespace speckle::database;
using namespace speckle::utility;
namespace speckle::database {
///Define other platform engines here as required
#ifdef ARCHICAD
using AttributeDatabaseEngine = ArchicadAttributeDBaseEngine;
#endif
///Attribute database engine declaration
class BIMAttributeDatabase::Engine : public AttributeDatabaseEngine {
using base = ArchicadAttributeDBaseEngine;
using base::base;
};
///Attribute database storage declaration
class BIMAttributeDatabase::Store : public Storage<Attribute, UnboxedTransport, BIMRecordID, BIMRecordID, BIMRecordID, BIMRecordID> {
using base = Storage<Attribute, UnboxedTransport, BIMRecordID, BIMRecordID, BIMRecordID, BIMRecordID>;
using base::base;
};
}
namespace {
///The database storage identifier for attributes
const char* attributeDBaseName = "speckle::database::BIMAttributeDatabase";
///The primary model table, e.g. floor plan in Archicad
const char* modelTableName = "Model";
}
/*--------------------------------------------------------------------
Constructor
--------------------------------------------------------------------*/
BIMAttributeDatabase::BIMAttributeDatabase() {
m_engine = std::make_shared<Engine>(attributeDBaseName,
//Schema
DBaseSchema{active::utility::String{attributeDBaseName},
//Tables
{
//Model attribute table
{
modelTableName, 0, 0, {} //The primary model. Additonal tables could be linked to other drawings/layouts in future
}
}
}
);
m_store = std::make_shared<Store>(m_engine);
} //BIMAttributeDatabase::BIMAttributeDatabase
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
BIMAttributeDatabase::~BIMAttributeDatabase() {}
/*--------------------------------------------------------------------
Get a specified attribute
attributeID: The ID of the target attribute
return: The requested attribute (nullptr on failure)
--------------------------------------------------------------------*/
Attribute::Unique BIMAttributeDatabase::getAttribute(const BIMRecordID& attributeID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return m_engine->getObject(attributeID, tableID, documentID);
} //BIMAttributeDatabase::getAttribute
/*--------------------------------------------------------------------
Get all attributes
return: All the attributes
--------------------------------------------------------------------*/
Vector<Attribute> BIMAttributeDatabase::getAttributes() const {
return m_store->getObjects();
} //BIMAttributeDatabase::getAttributes
/*--------------------------------------------------------------------
Write an attribute to storage
attribute: The attribute to write
--------------------------------------------------------------------*/
void BIMAttributeDatabase::write(const Attribute& attribute) const {
m_store->write(attribute);
} //BIMAttributeDatabase::write
/*--------------------------------------------------------------------
Erase an attribute
attributeID: The ID of the attribute to erase
--------------------------------------------------------------------*/
void BIMAttributeDatabase::erase(const Guid& attributeID) const {
m_store->erase(attributeID);
} //BIMAttributeDatabase::erase
#ifdef ARCHICAD
/*--------------------------------------------------------------------
Get attribute data direct from the AC API. For internal use - avoid direct use
link: A link to the required attribute
return: The AC API attribute data
--------------------------------------------------------------------*/
std::optional<API_Attribute> BIMAttributeDatabase::getAPIData(const BIMLink& link) const {
return m_engine->getAPIData(link);
} //BIMAttributeDatabase::getAPIData
/*--------------------------------------------------------------------
Get storey data direct from the AC API. For internal use - avoid direct use
link: A link to the required storey
return: The AC API storey data
--------------------------------------------------------------------*/
std::optional<API_StoryType> BIMAttributeDatabase::getAPIStorey(const BIMLink& link) const {
return m_engine->getAPIStorey(link);
} //BIMAttributeDatabase::getAPIData
/*--------------------------------------------------------------------
Get the ID of a storey from a specified index
index: The storey index
return: The storey ID (nullopt on failure)
--------------------------------------------------------------------*/
std::optional<BIMRecordID> BIMAttributeDatabase::getStoreyID(short index) const {
return m_engine->getStoreyID(index);
} //BIMAttributeDatabase::getStoreyID
#endif
@@ -1,96 +0,0 @@
#ifndef CONNECTOR_DATABASE_BIM_ATTRIBUTE_DATABASE
#define CONNECTOR_DATABASE_BIM_ATTRIBUTE_DATABASE
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Record/Attribute/Attribute.h"
#include "Speckle/Utility/Guid.h"
namespace active::event {
class Subscriber;
}
namespace speckle::database {
/*!
Database of model attributes relating to a specific project
*/
class BIMAttributeDatabase {
public:
// MARK: - Constructors
/*!
Constructor
*/
BIMAttributeDatabase();
BIMAttributeDatabase(const BIMAttributeDatabase&) = delete;
/*!
Destructor
*/
~BIMAttributeDatabase();
// MARK: - Functions (const)
/*!
Get a specified attribute
@param attributeID The ID of the target attribute
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
@return The requested attribute (nullptr on failure)
*/
record::attribute::Attribute::Unique getAttribute(const BIMRecordID& attributeID, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const;
/*!
Get a specified attribute
@param link A link to the target attribute
@return The requested attribute (nullptr on failure)
*/
record::attribute::Attribute::Unique getAttribute(const BIMLink& link) const { return getAttribute(link, link.tableID, link.docID); }
/*!
Get all model attributes
@return All the attributes
*/
active::container::Vector<record::attribute::Attribute> getAttributes() const;
/*!
Write an attribute to storage
@param attribute The attribute to write
*/
void write(const record::attribute::Attribute& attribute) const;
/*!
Erase an attribute
@param attributeID The ID of the attribute to erase
*/
void erase(const speckle::utility::Guid& attributeID) const;
#ifdef ARCHICAD
/*!
Get attribute data direct from the AC API. For internal use - avoid direct use
@param link A link to the required attribute
@return The AC API attribute data
*/
std::optional<API_Attribute> getAPIData(const BIMLink& link) const;
/*!
Get storey data direct from the AC API. For internal use - avoid direct use
@param link A link to the required storey
@return The AC API storey data
*/
std::optional<API_StoryType> getAPIStorey(const BIMLink& link) const;
/*!
Get the ID of a storey from a specified index
@param index The storey index
@return The storey ID (nullopt on failure)
*/
std::optional<BIMRecordID> getStoreyID(short index) const;
#endif
private:
class Engine;
class Store;
///Model attribute database storage
std::shared_ptr<Engine> m_engine;
std::shared_ptr<Store> m_store;
};
}
#endif //CONNECTOR_DATABASE_BIM_ATTRIBUTE_DATABASE
@@ -5,7 +5,6 @@
#include "Speckle/Database/Identity/RecordID.h" #include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Database/Storage/ArchicadDBase/Element/ArchicadElementDBaseEngine.h" #include "Speckle/Database/Storage/ArchicadDBase/Element/ArchicadElementDBaseEngine.h"
#include "Speckle/Record/Element/Element.h" #include "Speckle/Record/Element/Element.h"
#include "Speckle/Record/Element/Memo.h"
#include <array> #include <array>
@@ -85,22 +84,6 @@ BIMLinkList BIMElementDatabase::getSelection() const {
} //BIMElementDatabase::getSelection } //BIMElementDatabase::getSelection
/*--------------------------------------------------------------------
Set the element selection
--------------------------------------------------------------------*/
void BIMElementDatabase::setSelection(const BIMLinkList& elementIDs) const {
m_engine->setSelection(elementIDs);
} //BIMElementDatabase::setSelection
/*--------------------------------------------------------------------
Clear the element selection
--------------------------------------------------------------------*/
void BIMElementDatabase::clearSelection() const {
m_engine->clearSelection();
} //BIMElementDatabase::clearSelection
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get a specified element Get a specified element
@@ -124,25 +107,6 @@ Vector<Element> BIMElementDatabase::getElements() const {
} //BIMElementDatabase::getElements } //BIMElementDatabase::getElements
/*--------------------------------------------------------------------
Get memo memo (supplementary) data for a specified element
elementID: The of the source element
filter: Filter for the required supplementary data
return: The requested element memo data (nullptr on failure)
--------------------------------------------------------------------*/
Memo::Unique BIMElementDatabase::getMemo(const BIMRecordID& elementID, Part::filter_bits filter) const {
//NB: The filter bits are passed as the source document ID
auto result = m_engine->getObject(elementID, ArchicadElementDBaseEngine::memoTable, Guid::fromInt(filter));
if (auto memo = dynamic_cast<Memo*>(result.get()); memo != nullptr) {
result.release();
return Memo::Unique{memo};
}
return nullptr;
} //BIMElementDatabase::getMemo
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Write an element to storage Write an element to storage
@@ -1,19 +1,14 @@
#ifndef CONNECTOR_DATABASE_BIM_ELEMENT_DATABASE #ifndef CONNECTOR_DATABASE_BIM_DATABASE
#define CONNECTOR_DATABASE_BIM_ELEMENT_DATABASE #define CONNECTOR_DATABASE_BIM_DATABASE
#include "Speckle/Database/Identity/BIMLink.h" #include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Record/Element/Element.h" #include "Speckle/Record/Element/Element.h"
#include "Speckle/Record/Element/Interface/Part.h"
#include "Speckle/Utility/Guid.h" #include "Speckle/Utility/Guid.h"
namespace active::event { namespace active::event {
class Subscriber; class Subscriber;
} }
namespace speckle::record::element {
class Memo;
}
namespace speckle::database { namespace speckle::database {
/*! /*!
@@ -41,14 +36,6 @@ namespace speckle::database {
@return A list of selected element IDs @return A list of selected element IDs
*/ */
BIMLinkList getSelection() const; BIMLinkList getSelection() const;
/*!
Set the element selection
*/
void setSelection(const BIMLinkList& elementIDs) const;
/*!
Clear the element selection
*/
void clearSelection() const;
/*! /*!
Get a specified element Get a specified element
@param elementID The ID of the target element @param elementID The ID of the target element
@@ -56,26 +43,19 @@ namespace speckle::database {
@param documentID Optional document ID (when the object is bound to a specific document) @param documentID Optional document ID (when the object is bound to a specific document)
@return The requested element (nullptr on failure) @return The requested element (nullptr on failure)
*/ */
std::unique_ptr<record::element::Element> getElement(const BIMRecordID& elementID, std::optional<BIMRecordID> tableID = std::nullopt, record::element::Element::Unique getElement(const BIMRecordID& elementID, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const; std::optional<BIMRecordID> documentID = std::nullopt) const;
/*! /*!
Get a specified element Get a specified element
@param link A link to the target element @param link A link to the target element
@return The requested element (nullptr on failure) @return The requested element (nullptr on failure)
*/ */
std::unique_ptr<record::element::Element> getElement(const BIMLink& link) const { return getElement(link, link.tableID, link.docID); } record::element::Element::Unique getElement(const BIMLink& link) const { return getElement(link, link.tableID, link.docID); }
/*! /*!
Get all model elements Get all model elements
@return All the elements @return All the elements
*/ */
active::container::Vector<record::element::Element> getElements() const; active::container::Vector<record::element::Element> getElements() const;
/*!
Get memo memo (supplementary) data for a specified element
@param elementID The of the source element
@param filter Filter for the required supplementary data
@return The requested element memo data (nullptr on failure)
*/
std::unique_ptr<record::element::Memo> getMemo(const BIMRecordID& elementID, record::element::Part::filter_bits filter) const;
/*! /*!
Write an element to storage Write an element to storage
@param element The element to write @param element The element to write
@@ -97,4 +77,4 @@ namespace speckle::database {
} }
#endif //CONNECTOR_DATABASE_BIM_ELEMENT_DATABASE #endif //CONNECTOR_DATABASE_BIM_DATABASE
@@ -1,129 +0,0 @@
#include "Speckle/Database/BIMGroupDatabase.h"
#include "Active/Database/Storage/Storage.h"
#include "Active/Serialise/UnboxedTransport.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Database/Storage/ArchicadDBase/Property/ArchicadGroupDBaseEngine.h"
#include "Speckle/Record/Property/Setting.h"
#include <array>
using namespace active::container;
using namespace active::database;
using namespace active::event;
using namespace active::serialise;
using namespace speckle::database;
using namespace speckle::record;
using namespace speckle::record::property;
using namespace speckle::database;
using namespace speckle::utility;
namespace speckle::database {
///Define other platform engines here as required
#ifdef ARCHICAD
using GroupDatabaseEngine = ArchicadGroupDBaseEngine;
#endif
///Group database engine declaration
class BIMGroupDatabase::Engine : public GroupDatabaseEngine {
using base = ArchicadGroupDBaseEngine;
using base::base;
};
///Group database storage declaration
class BIMGroupDatabase::Store : public Storage<Group, UnboxedTransport, BIMRecordID, BIMRecordID, BIMRecordID, BIMRecordID> {
using base = Storage<Group, UnboxedTransport, BIMRecordID, BIMRecordID, BIMRecordID, BIMRecordID>;
using base::base;
};
}
namespace {
///The database storage identifier for groups
const char* groupDBaseName = "speckle::database::BIMGroupDatabase";
///The primary groups table
const char* groupTableName = "Groups";
}
/*--------------------------------------------------------------------
Constructor
--------------------------------------------------------------------*/
BIMGroupDatabase::BIMGroupDatabase() {
m_engine = std::make_shared<Engine>(groupDBaseName,
//Schema
DBaseSchema{active::utility::String{groupDBaseName},
//Tables
{
//Model group table
{
groupTableName, 0, 0, {}
}
}
}
);
m_store = std::make_shared<Store>(m_engine);
} //BIMGroupDatabase::BIMGroupDatabase
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
BIMGroupDatabase::~BIMGroupDatabase() {}
/*--------------------------------------------------------------------
Get a specified group
groupID: The ID of the target group
return: The requested group (nullptr on failure)
--------------------------------------------------------------------*/
Group::Unique BIMGroupDatabase::getGroup(const BIMRecordID& groupID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return m_engine->getObject(groupID, tableID, documentID);
} //BIMGroupDatabase::getGroup
/*--------------------------------------------------------------------
Get a specified group
link: A link to the target group
return: The requested group (nullptr on failure)
--------------------------------------------------------------------*/
Group::Unique BIMGroupDatabase::getGroup(const BIMLink& link) const {
return getGroup(link, link.tableID, link.docID);
} //BIMGroupDatabase::getGroup
/*--------------------------------------------------------------------
Get all groups
return: All the groups
--------------------------------------------------------------------*/
Vector<Group> BIMGroupDatabase::getGroups() const {
return m_store->getObjects();
} //BIMGroupDatabase::getGroups
/*--------------------------------------------------------------------
Write an group to storage
group: The group to write
--------------------------------------------------------------------*/
void BIMGroupDatabase::write(const Group& group) const {
m_store->write(group);
} //BIMGroupDatabase::write
/*--------------------------------------------------------------------
Erase an group
groupID: The ID of the group to erase
--------------------------------------------------------------------*/
void BIMGroupDatabase::erase(const Guid& groupID) const {
m_store->erase(groupID);
} //BIMGroupDatabase::erase
@@ -1,77 +0,0 @@
#ifndef CONNECTOR_DATABASE_BIM_GROUP_DATABASE
#define CONNECTOR_DATABASE_BIM_GROUP_DATABASE
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Record/Property/Group.h"
#include "Speckle/Utility/Guid.h"
namespace active::event {
class Subscriber;
}
namespace speckle::database {
/*!
Database of group templates relating to a specific project
Note that this database manages just the group templates, not the values. Group values are attached to elements
*/
class BIMGroupDatabase {
public:
// MARK: - Constructors
/*!
Constructor
*/
BIMGroupDatabase();
BIMGroupDatabase(const BIMGroupDatabase&) = delete;
/*!
Destructor
*/
~BIMGroupDatabase();
// MARK: - Functions (const)
/*!
Get a specified group
@param groupID The ID of the target group
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
@return The requested group (nullptr on failure)
*/
record::property::Group::Unique getGroup(const BIMRecordID& groupID, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const;
/*!
Get a specified group
@param link A link to the target group
@return The requested group (nullptr on failure)
*/
record::property::Group::Unique getGroup(const BIMLink& link) const;
/*!
Get all model groups
@return All the groups
*/
active::container::Vector<record::property::Group> getGroups() const;
/*!
Write an group to storage
@param group The group to write
*/
void write(const record::property::Group& group) const;
/*!
Erase an group
@param groupID The ID of the group to erase
*/
void erase(const speckle::utility::Guid& groupID) const;
private:
class Engine;
class Store;
///Model group database storage
std::shared_ptr<Engine> m_engine;
std::shared_ptr<Store> m_store;
};
}
#endif //CONNECTOR_DATABASE_BIM_GROUP_DATABASE
@@ -1,141 +0,0 @@
#include "Speckle/Database/BIMPropertyDatabase.h"
#include "Active/Database/Storage/Storage.h"
#include "Active/Serialise/UnboxedTransport.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Database/Storage/ArchicadDBase/Property/ArchicadPropertyDBaseEngine.h"
#include "Speckle/Record/Property/Setting.h"
#include <array>
using namespace active::container;
using namespace active::database;
using namespace active::event;
using namespace active::serialise;
using namespace speckle::database;
using namespace speckle::record;
using namespace speckle::record::property;
using namespace speckle::database;
using namespace speckle::utility;
namespace speckle::database {
///Define other platform engines here as required
#ifdef ARCHICAD
using PropertyDatabaseEngine = ArchicadPropertyDBaseEngine;
#endif
///Property database engine declaration
class BIMPropertyDatabase::Engine : public PropertyDatabaseEngine {
using base = ArchicadPropertyDBaseEngine;
using base::base;
};
///Property database storage declaration
class BIMPropertyDatabase::Store : public Storage<Template, UnboxedTransport, BIMRecordID, BIMRecordID, BIMRecordID, BIMRecordID> {
using base = Storage<Template, UnboxedTransport, BIMRecordID, BIMRecordID, BIMRecordID, BIMRecordID>;
using base::base;
};
}
namespace {
///The database storage identifier for properties
const char* propertyDBaseName = "speckle::database::BIMPropertyDatabase";
///The primary properties table
const char* propertyTableName = "Properties";
}
/*--------------------------------------------------------------------
Constructor
--------------------------------------------------------------------*/
BIMPropertyDatabase::BIMPropertyDatabase() {
m_engine = std::make_shared<Engine>(propertyDBaseName,
//Schema
DBaseSchema{active::utility::String{propertyDBaseName},
//Tables
{
//Model property table
{
propertyTableName, 0, 0, {}
}
}
}
);
m_store = std::make_shared<Store>(m_engine);
} //BIMPropertyDatabase::BIMPropertyDatabase
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
BIMPropertyDatabase::~BIMPropertyDatabase() {}
/*--------------------------------------------------------------------
Get a specified property
propertyID: The ID of the target property
return: The requested property (nullptr on failure)
--------------------------------------------------------------------*/
Template::Unique BIMPropertyDatabase::getProperty(const BIMRecordID& propertyID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return m_engine->getObject(propertyID, tableID, documentID);
} //BIMPropertyDatabase::getProperty
/*--------------------------------------------------------------------
Get a specified property
link: A link to the target property
return: The requested property (nullptr on failure)
--------------------------------------------------------------------*/
Template::Unique BIMPropertyDatabase::getProperty(const BIMLink& link) const {
return getProperty(link, link.tableID, link.docID);
} //BIMPropertyDatabase::getProperty
/*--------------------------------------------------------------------
Get all properties
return: All the properties
--------------------------------------------------------------------*/
Vector<Template> BIMPropertyDatabase::getProperties() const {
return m_store->getObjects();
} //BIMPropertyDatabase::getPropertys
/*--------------------------------------------------------------------
Find all property templates linked to specified classifications
classifications: The classifications
return: A list of shared pointers to linked property templates
--------------------------------------------------------------------*/
std::vector<std::shared_ptr<Template>> BIMPropertyDatabase::findTemplatesByClassification(const BIMRecordIDList& classifications) const {
return m_engine->findTemplatesByClassification(classifications);
} //BIMPropertyDatabase::findTemplatesByClassification
/*--------------------------------------------------------------------
Write an property to storage
property: The property to write
--------------------------------------------------------------------*/
void BIMPropertyDatabase::write(const Template& property) const {
m_store->write(property);
} //BIMPropertyDatabase::write
/*--------------------------------------------------------------------
Erase an property
propertyID: The ID of the property to erase
--------------------------------------------------------------------*/
void BIMPropertyDatabase::erase(const Guid& propertyID) const {
m_store->erase(propertyID);
} //BIMPropertyDatabase::erase
@@ -1,83 +0,0 @@
#ifndef CONNECTOR_DATABASE_BIM_PROPERTY_DATABASE
#define CONNECTOR_DATABASE_BIM_PROPERTY_DATABASE
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Record/Property/Template.h"
#include "Speckle/Utility/Guid.h"
namespace active::event {
class Subscriber;
}
namespace speckle::database {
/*!
Database of property templates relating to a specific project
Note that this database manages just the property templates, not the values. Property values are attached to elements
*/
class BIMPropertyDatabase {
public:
// MARK: - Constructors
/*!
Constructor
*/
BIMPropertyDatabase();
BIMPropertyDatabase(const BIMPropertyDatabase&) = delete;
/*!
Destructor
*/
~BIMPropertyDatabase();
// MARK: - Functions (const)
/*!
Get a specified property
@param propertyID The ID of the target property
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
@return The requested property (nullptr on failure)
*/
record::property::Template::Unique getProperty(const BIMRecordID& propertyID, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const;
/*!
Get a specified property
@param link A link to the target property
@return The requested property (nullptr on failure)
*/
record::property::Template::Unique getProperty(const BIMLink& link) const;
/*!
Get all model properties
@return All the properties
*/
active::container::Vector<record::property::Template> getProperties() const;
/*!
Find all property templates linked to specified classifications
@param classifications The classifications
@return A list of shared pointers to linked property templates
*/
std::vector<std::shared_ptr<record::property::Template>> findTemplatesByClassification(const BIMRecordIDList& classifications) const;
/*!
Write an property to storage
@param property The property to write
*/
void write(const record::property::Template& property) const;
/*!
Erase an property
@param propertyID The ID of the property to erase
*/
void erase(const speckle::utility::Guid& propertyID) const;
private:
class Engine;
class Store;
///Model property database storage
std::shared_ptr<Engine> m_engine;
std::shared_ptr<Store> m_store;
};
}
#endif //CONNECTOR_DATABASE_BIM_PROPERTY_DATABASE
@@ -1,33 +1,11 @@
#include "Speckle/Database/Content/BIMRecord.h" #include "Speckle/Database/Content/Record.h"
#include "Active/Serialise/Item/Wrapper/ValueOptionWrap.h"
#include "Speckle/Serialise/Types/Units/LengthUnit.h"
#include "Speckle/Utility/Guid.h" #include "Speckle/Utility/Guid.h"
#include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::utility; using namespace speckle::utility;
using enum active::measure::LengthType;
namespace {
///Serialisation fields
enum FieldIndex {
applicID,
unitID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"applicationId"},
Identity{"units"},
};
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Fill an inventory with the package items Fill an inventory with the package items
@@ -35,44 +13,12 @@ namespace {
return: True if the package has added items to the inventory return: True if the package has added items to the inventory
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
bool BIMRecord::fillInventory(Inventory& inventory) const { bool Record::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type; using enum Entry::Type;
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ Identity{fieldID[applicID]}, applicID, element, !m_applicationID.empty() }, { Identity{"id"}, active::database::record::FieldIndex::idIndex, element },
{ Identity{fieldID[unitID]}, unitID, element, m_unit.operator bool() },
}, },
}.withType(&typeid(BIMRecord))); }.withType(&typeid(base)));
return base::fillInventory(inventory); return true;
} //BIMRecord::fillInventory } //Record::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique BIMRecord::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(BIMRecord))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case applicID:
return std::make_unique<ValueWrap<BIMRecordID>>(m_applicationID);
case unitID:
return std::make_unique<ValueOptionWrap<active::measure::LengthType>>(m_unit);
default:
return nullptr; //Requested an unknown index
}
} //BIMRecord::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void BIMRecord::setDefault() {
m_applicationID.clear();
m_unit.reset();
} //BIMRecord::setDefault
+15 -83
View File
@@ -1,10 +1,8 @@
#ifndef SPECKLE_DATABASE_BIM_RECORD #ifndef SPECKLE_DATABASE_RECORD
#define SPECKLE_DATABASE_BIM_RECORD #define SPECKLE_DATABASE_RECORD
#include "Active/Setting/Values/Measurement/Units/LengthUnit.h" #include "Active/Database/Content/Record.h"
#include "Speckle/Database/Content/Record.h" #include "Speckle/Database/Identity/Link.h"
#include "Speckle/Database/Identity/BIMIndex.h"
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Database/Identity/BIMRecordID.h" #include "Speckle/Database/Identity/BIMRecordID.h"
namespace speckle::database { namespace speckle::database {
@@ -12,12 +10,12 @@ namespace speckle::database {
/*! /*!
Base class for a database record Base class for a database record
*/ */
class BIMRecord : public Record { class BIMRecord : public active::database::BIMRecord<BIMRecordID> {
public: public:
// MARK: - Types // MARK: - Types
using base = Record; using base = active::database::BIMRecord<BIMRecordID>;
///Unique pointer ///Unique pointer
using Unique = std::unique_ptr<BIMRecord>; using Unique = std::unique_ptr<BIMRecord>;
///Shared pointer ///Shared pointer
@@ -29,18 +27,15 @@ namespace speckle::database {
/*! /*!
Default constructor Default constructor
@param unit The recordc unit type
*/ */
BIMRecord(active::measure::LengthType unit = active::measure::LengthType::metre) : base{}, m_unit{unit} {} BIMRecord() : base{active::utility::Guid{true}.operator active::utility::String(),
active::utility::Guid{true}.operator active::utility::String()} {} //TODO: Implement a better default for the ID
/*! /*!
Constructor Constructor
@param ID The record ID @param ID The record ID
@param tableID The parent table ID
@param unit The record unit type
*/ */
BIMRecord(const speckle::utility::Guid& ID, const speckle::utility::Guid& tableID, BIMRecord(speckle::utility::String ID, speckle::utility::String::Option globID = std::nullopt) :
std::optional<active::measure::LengthType> unit = active::measure::LengthType::metre) : base{ID, globID.value_or(active::utility::Guid{true}.operator active::utility::String())} {}
base{}, m_applicationID{ID}, m_applicationTableID{tableID}, m_unit{unit} {}
/*! /*!
Destructor Destructor
*/ */
@@ -48,83 +43,20 @@ namespace speckle::database {
// MARK: - Functions (const) // MARK: - Functions (const)
/*!
Get the BIM application ID
@return The BIM application ID
*/
BIMRecordID getBIMID() const { return m_applicationID; }
/*!
Get the BIM application parent table ID
@return The BIM table ID
*/
BIMRecordID getTableID() const { return m_applicationTableID; }
/*!
Get a link to the BIM record
@return The BIM record link
*/
BIMLink getBIMLink() const { return BIMLink{ BIMLink::base {m_applicationID, m_applicationTableID} }; }
/*!
Get the record unit type
@return The record unit type (nullopt if the record has no applicable unit type)
*/
std::optional<active::measure::LengthType> getUnit() const { return m_unit; }
// MARK: - Functions (mutating) // MARK: - Functions (mutating)
/*!
Set the BIM application ID
@param ID The BIM application ID
*/
void setBIMID(const BIMRecordID& ID) { m_applicationID = ID; }
/*!
Set the BIM application parent table ID
@param tableID The BIM table ID
*/
void setTableID(const BIMRecordID& tableID) { m_applicationTableID = tableID; }
/*!
Set the record unit type
@param unit The record unit type (nullopt if the record has no applicable unit type)
*/
void setUnit(std::optional<active::measure::LengthType> unit) { m_unit = unit; }
// MARK: - Serialisation // MARK: - Serialisation
/*! /*!
Fill an inventory with the package items Fill an inventory with the package items
@param inventory The inventory to receive the package items @param inventory The inventory to receive the package items
@return True if the package has added items to the inventory @return True if the package has added items to the inventory
*/ */
bool fillInventory(active::serialise::Inventory& inventory) const override; bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
protected:
/*!
Reset the BIM index (used in lazy loading contexts where the index cannot otherwise be established)
@param index The BIM application index
*/
void resetIndex(const BIMIndex& index) const {
m_applicationID = index;
m_applicationTableID = index.tableID;
}
private:
///The BIM application record ID
mutable BIMRecordID m_applicationID;
///The BIM application parent table ID
mutable BIMRecordID m_applicationTableID;
///The BIM record unit of length measurement
std::optional<active::measure::LengthType> m_unit = active::measure::LengthType::metre;
}; };
} }
#endif //SPECKLE_DATABASE_BIM_RECORD #endif //SPECKLE_DATABASE_RECORD
+1 -56
View File
@@ -2,28 +2,10 @@
#include "Speckle/Utility/Guid.h" #include "Speckle/Utility/Guid.h"
#include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::utility; using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
speckleIDID,
speckleTypeID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"id"},
Identity{"speckle_type"},
};
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Fill an inventory with the package items Fill an inventory with the package items
@@ -35,45 +17,8 @@ bool Record::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type; using enum Entry::Type;
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ Identity{fieldID[speckleIDID]}, active::database::record::FieldIndex::idIndex, element, !getID().empty() }, { Identity{"id"}, active::database::record::FieldIndex::idIndex, element },
}, },
}.withType(&typeid(base))); }.withType(&typeid(base)));
inventory.merge(Inventory{
{
{ Identity{fieldID[speckleTypeID]}, speckleTypeID, attribute },
},
}.withType(&typeid(Record)));
return true; return true;
} //Record::fillInventory } //Record::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique Record::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(Record))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case speckleTypeID:
//If the type is undefined, we're in a serialisation process and should populate it with whatever the object says it is
if (!m_type)
m_type = getSpeckleType();
return std::make_unique<StringWrap>(*m_type);
default:
return nullptr; //Requested an unknown index
}
} //Record::getCargo
/*--------------------------------------------------------------------
Set to the default package content
--------------------------------------------------------------------*/
void Record::setDefault() {
//Ensure the content starts with an empty (defined) string for deserialisation so we can discover the incoming type
m_type = String{};
} //Record::setDefault
+12 -27
View File
@@ -27,11 +27,15 @@ namespace speckle::database {
/*! /*!
Default constructor Default constructor
@param ID The record ID
@param globID The global ID
*/ */
Record(speckle::utility::String::Option ID = std::nullopt, speckle::utility::String::Option globID = std::nullopt) : Record() : base{active::utility::Guid{true}.operator active::utility::String(),
base{ID.value_or(speckle::utility::String{}), globID.value_or(speckle::utility::String{})} {} active::utility::Guid{true}.operator active::utility::String()} {} //TODO: Implement a better default for the ID
/*!
Constructor
@param ID The record ID
*/
Record(speckle::utility::String ID, speckle::utility::String::Option globID = std::nullopt) :
base{ID, globID.value_or(active::utility::Guid{true}.operator active::utility::String())} {}
/*! /*!
Destructor Destructor
*/ */
@@ -39,11 +43,6 @@ namespace speckle::database {
// MARK: - Functions (const) // MARK: - Functions (const)
/*!
Get the speckle type identifier
@return The speckle type (relevant objects should override as required, but "Base" is still considered a type on its own)
*/
virtual speckle::utility::String getSpeckleType() const { return "Base"; }
// MARK: - Functions (mutating) // MARK: - Functions (mutating)
@@ -51,25 +50,11 @@ namespace speckle::database {
// MARK: - Serialisation // MARK: - Serialisation
/*! /*!
Fill an inventory with the package items Fill an inventory with the package items
@param inventory The inventory to receive the package items @param inventory The inventory to receive the package items
@return True if the package has added items to the inventory @return True if the package has added items to the inventory
*/ */
bool fillInventory(active::serialise::Inventory& inventory) const override; bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Set to the default package content
*/
void setDefault() override;
private:
///Cache for the speckle type during serialisation operations
mutable speckle::utility::String::Option m_type;
}; };
} }
+10 -15
View File
@@ -2,7 +2,7 @@
#define SPECKLE_DATABASE_BIM_INDEX #define SPECKLE_DATABASE_BIM_INDEX
#include "Active/Database/Identity/Index.h" #include "Active/Database/Identity/Index.h"
#include "Speckle/Database/Identity/BIMRecordID.h" #include "Speckle/Database/Identity/RecordID.h"
namespace speckle::database { namespace speckle::database {
@@ -13,30 +13,25 @@ namespace speckle::database {
this is typically a guid, for Revit a string and for Vectorworks a handle. Note that this index is not necessarily persistent between this is typically a guid, for Revit a string and for Vectorworks a handle. Note that this index is not necessarily persistent between
sessions. sessions.
*/ */
class BIMIndex : public active::database::Index<BIMRecordID, BIMRecordID> { class BIMIndex : public active::database::Index<BIMRecordID> {
public: public:
// MARK: - Types // MARK: - Types
using base = active::database::Index<BIMRecordID, BIMRecordID>; using base = active::database::Index<BIMRecordID>;
// MARK: - Constructors // MARK: - Constructors
using base::base; using base::base;
// MARK: - Public variables
//The table identifier
BIMTableID table;
//The document identifier
BIMDocID document;
}; };
} }
///Hashing for BIMIndex class, e.g. to use as a key in unordered_map
template<>
struct std::hash<speckle::database::BIMIndex> {
std::size_t operator() (const speckle::database::BIMIndex& index) const {
std::size_t h1 = std::hash<active::utility::Guid>{}(index);
std::size_t h2 = std::hash<active::utility::Guid>{}(index.tableID);
return h1 ^ (h2 << 1);
}
};
#endif //SPECKLE_DATABASE_BIM_INDEX #endif //SPECKLE_DATABASE_BIM_INDEX
@@ -8,14 +8,10 @@ using namespace speckle::utility;
Constructor Constructor
selected: Information about a selected Archicad element selected: Information about a selected Archicad element
tableID: The ID of the parent table
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
BIMLink::BIMLink(const API_Neig& selected, const BIMRecordID& tableID) : base{Guid{selected.guid}, tableID} { BIMLink::BIMLink(const API_Neig& selected) : base{Guid{selected.guid}} {
//More info should be extracted from API_Neig in future (as required) - extract into link settings, e.g. selection target etc //More info should be extracted from API_Neig in future (as required) - extract into link settings, e.g. selection target etc
} //Link::Link } //Link::Link
BIMLinkList::BIMLinkList(const ElementIDList& elementIDList) {
for (const auto& id : elementIDList)
push_back(id);
}
#endif #endif
+2 -15
View File
@@ -4,7 +4,6 @@
#include "Active/Setting/SettingList.h" #include "Active/Setting/SettingList.h"
#include "Active/Database/Identity/Link.h" #include "Active/Database/Identity/Link.h"
#include "Speckle/Database/Identity/BIMRecordID.h" #include "Speckle/Database/Identity/BIMRecordID.h"
#include "Speckle/Database/Identity/RecordID.h"
namespace speckle::database { namespace speckle::database {
@@ -35,25 +34,13 @@ namespace speckle::database {
/*! /*!
Constructor Constructor
@param selected Information about a selected Archicad element @param selected Information about a selected Archicad element
@param tableID The ID of the parent table
*/ */
BIMLink(const API_Neig& selected, const BIMRecordID& tableID); BIMLink(const API_Neig& selected);
#endif #endif
}; };
//A list of links to BIM records //A list of links to BIM records
//using BIMLinkList = std::vector<BIMLink>; using BIMLinkList = std::vector<BIMLink>;
class BIMLinkList : public std::vector<BIMLink> {
public:
using base = std::vector<BIMLink>;
using base::base;
BIMLinkList() = default;
BIMLinkList(const ElementIDList& elementIDList);
};
} }
@@ -3,8 +3,6 @@
#include "Speckle/Utility/Guid.h" #include "Speckle/Utility/Guid.h"
#include <unordered_set>
namespace speckle::database { namespace speckle::database {
#ifdef ARCHICAD #ifdef ARCHICAD
@@ -16,14 +14,10 @@ namespace speckle::database {
using BIMDocID = speckle::utility::Guid; using BIMDocID = speckle::utility::Guid;
//Common BIM database identifier type (e.g. model database, library database, attribute database) //Common BIM database identifier type (e.g. model database, library database, attribute database)
using BIMDBaseID = speckle::utility::Guid; using BIMDBaseID = speckle::utility::Guid;
//Common BIM record identifier pair type (e.g. pairing a record with a parent)
using BIMRecordIDPair = std::pair<speckle::utility::Guid, speckle::utility::Guid>;
#endif #endif
//A list of BIM record IDs //A list of BIM record IDs
using BIMRecordIDList = std::unordered_set<BIMRecordID>; using BIMRecordIDList = std::vector<BIMRecordID>;
//A list of BIM record ID pairs
using BIMRecordIDPairList = std::unordered_set<BIMRecordIDPair>;
} }
@@ -2,7 +2,6 @@
#define SPECKLE_DATABASE_ID #define SPECKLE_DATABASE_ID
#include "Speckle/Utility/String.h" #include "Speckle/Utility/String.h"
#include "Speckle/Utility/Guid.h"
namespace speckle::database { namespace speckle::database {
@@ -16,12 +15,6 @@ namespace speckle::database {
//A list of record IDs //A list of record IDs
using RecordIDList = std::vector<RecordID>; using RecordIDList = std::vector<RecordID>;
//BIM element record identifier
using ElementID = speckle::utility::Guid;
//A list of element IDs
using ElementIDList = std::vector<ElementID>;
} }
#endif //SPECKLE_DATABASE_ID #endif //SPECKLE_DATABASE_ID
@@ -7,6 +7,7 @@
#include "Active/Setting/SettingList.h" #include "Active/Setting/SettingList.h"
#include "Active/Database/Storage/DBaseSchema.h" #include "Active/Database/Storage/DBaseSchema.h"
#include "Active/Utility/NameID.h" #include "Active/Utility/NameID.h"
#include "Speckle/Event/Subscriber/DocStoreSubscriber.h"
#include "Speckle/Event/Subscriber/ProjectSubscriber.h" #include "Speckle/Event/Subscriber/ProjectSubscriber.h"
namespace speckle::database { namespace speckle::database {
@@ -18,7 +19,7 @@ namespace speckle::database {
Currently implement for Archicad Add-On Objects Currently implement for Archicad Add-On Objects
*/ */
class ArchicadDBaseCore : public event::ProjectSubscriber { class ArchicadDBaseCore {
public: public:
// MARK: - Types // MARK: - Types
@@ -68,12 +69,8 @@ namespace speckle::database {
// MARK: - Functions (mutating) // MARK: - Functions (mutating)
/*! protected:
Handle a project event
@param event The project event
@return True if the event should be closed
*/
bool handle(const event::ProjectEvent& event) override { return false; }
private: private:
///The database schema ///The database schema
@@ -1,319 +0,0 @@
#include "Speckle/Database/Storage/ArchicadDBase/Attribute/ArchicadAttributeDBaseEngine.h"
#ifdef ARCHICAD
#include "Active/Utility/Defer.h"
#include "Active/Utility/Memory.h"
#include "Active/Utility/String.h"
#include "Speckle/Record/Attribute/Finish.h"
#include "Speckle/Record/Attribute/Storey.h"
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Environment/Addon.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Event/Type/DocStoreMergeEvent.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#include <ACAPinc.h>
#include <ACAPI_Database.h>
#include <BM.hpp>
using namespace active::event;
using namespace active::setting;
using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::event;
using namespace speckle::record::attribute;
using namespace speckle::utility;
using enum ArchicadDBaseCore::Status;
namespace speckle::database {
#ifdef ARCHICAD
/*!
A class to collect and manage a list of active Archicad storeys
NB: This list has to be rebuilt every time a storey has changed because Archicad reindexes storeys each time
This class also has to release memory used by the API to hold storey data
*/
class ArchicadAttributeDBaseEngine::StoreyCache : public std::vector<API_StoryType> {
public:
/*!
Constructor (NB: This automatically gathers information about the current storeys)
*/
StoreyCache() { rebuild(); }
/*!
Rebuild the current storey list
*/
void rebuild() {
clear();
API_StoryInfo storeyInfo;
active::utility::Memory::erase(storeyInfo);
ACAPI_ProjectSetting_GetStorySettings(&storeyInfo);
auto storeyCount = storeyInfo.lastStory - storeyInfo.firstStory + 1;
for (auto i = 0; i < storeyCount; ++i)
push_back((*storeyInfo.data)[i]);
BMKillHandle(reinterpret_cast<GSHandle*>(&storeyInfo.data));
}
/*!
Find a storey by unique ID
@param id The storey unique ID
@return An iterator pointing to the found storey (end() on failure)
*/
const_iterator find(const Guid& id) const {
auto floorID = static_cast<short>(Guid::toInt(id));
return std::find_if(begin(), end(), [&](auto storey){ return storey.floorId == floorID; });
}
/*!
Find a storey by index
@param index The storey index
@return An iterator pointing to the found storey (end() on failure)
*/
const_iterator find(short index) const {
return std::find_if(begin(), end(), [&](auto storey){ return storey.index == index; });
}
};
#endif
}
namespace {
///Attribute factory
std::unordered_map<active::utility::Guid, std::function<Attribute::Unique(API_Attribute, const active::utility::Guid&)>> attributeFactory;
#ifdef ARCHICAD
/*!
Make a new attribute object
@param attributeData The API attribute representation
@return A new attribute object (nullptr on failure)
*/
Attribute::Unique makeAttribute(const API_Attribute& attributeData) {
auto tableID = active::utility::Guid::fromInt(static_cast<uint64_t>(attributeData.header.typeID));
if (attributeFactory.empty()) {
attributeFactory[active::utility::Guid::fromInt(static_cast<uint64_t>(attributeData.header.typeID))] =
[](API_Attribute attrData, const active::utility::Guid& tableID){ return std::make_unique<Finish>(attrData, tableID); };
}
if (auto iter = attributeFactory.find(tableID); iter != attributeFactory.end())
return iter->second(attributeData, tableID);
return nullptr;
}
/*!
Get the AC API data for a specified attribute
@param ID The attribute ID
@param tableID The parent table ID
@return A new attribute object (nullptr on failure)
*/
std::optional<API_Attribute> getAPIData(const BIMRecordID& ID, std::optional<BIMRecordID> tableID) {
API_Attribute attribute;
active::utility::Memory::erase(attribute);
attribute.header.index = ACAPI_CreateAttributeIndex(static_cast<int32_t>(Guid::toInt(ID)));
attribute.header.typeID = static_cast<API_AttrTypeID>(Guid::toInt(*tableID));
if (ACAPI_Attribute_Get(&attribute) != NoError)
return std::nullopt;
return attribute;
}
#endif
}
/*--------------------------------------------------------------------
Constructor
id: The document storage identifier
schema: The document storage schema
--------------------------------------------------------------------*/
ArchicadAttributeDBaseEngine::ArchicadAttributeDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema) :
ArchicadDBaseCore{id, std::move(schema)} {
} //ArchicadAttributeDBaseEngine::ArchicadAttributeDBaseEngine
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
ArchicadAttributeDBaseEngine::~ArchicadAttributeDBaseEngine() {
} //ArchicadAttributeDBaseEngine::~ArchicadAttributeDBaseEngine
/*--------------------------------------------------------------------
Get an object by ID
objID: The object index
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested object (nullptr on failure)
--------------------------------------------------------------------*/
std::unique_ptr<Attribute> ArchicadAttributeDBaseEngine::getObject(const BIMRecordID& objID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
if (!tableID)
return nullptr;
if (auto attrData = ::getAPIData(objID, *tableID); attrData)
return makeAttribute(*attrData);
return nullptr;
} //ArchicadAttributeDBaseEngine::getObject
/*--------------------------------------------------------------------
Get an object in a transportable form, e.g. packaged for serialisation
index: The object index
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested wrapped cargo (nullptr on failure)
--------------------------------------------------------------------*/
active::serialise::Cargo::Unique ArchicadAttributeDBaseEngine::getObjectCargo(const BIMRecordID& ID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return nullptr; //TODO: Implement
} //ArchicadAttributeDBaseEngine::getObject
/*--------------------------------------------------------------------
Get all objects
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
active::container::Vector<Attribute> ArchicadAttributeDBaseEngine::getObjects(std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return {}; //TODO: Implement
} //ArchicadAttributeDBaseEngine::getObjects
/*--------------------------------------------------------------------
Get all objects
filter: The object filter
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
active::container::Vector<Attribute> ArchicadAttributeDBaseEngine::getObjects(const Filter& filter, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return {}; //TODO: Implement
} //ArchicadAttributeDBaseEngine::getObjects
/*--------------------------------------------------------------------
Write an object to the database
object: The object to write
objID: The object ID
objDocID: The object document-specific ID (unique within a specific document - nullopt if not document-bound)
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
--------------------------------------------------------------------*/
void ArchicadAttributeDBaseEngine::write(const Attribute& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadAttributeDBaseEngine::write
/*--------------------------------------------------------------------
Erase an object by index
objID: The object ID
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: True if the object was successfully erased
--------------------------------------------------------------------*/
void ArchicadAttributeDBaseEngine::erase(const BIMRecordID& ID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadAttributeDBaseEngine::erase
/*--------------------------------------------------------------------
Erase all objects
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
--------------------------------------------------------------------*/
void ArchicadAttributeDBaseEngine::erase(std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadAttributeDBaseEngine::erase
/*--------------------------------------------------------------------
Get the database outline
return: The database outline
--------------------------------------------------------------------*/
ArchicadAttributeDBaseEngine::Outline ArchicadAttributeDBaseEngine::getOutline() const {
return {}; //TODO: Implement
} //ArchicadAttributeDBaseEngine::getOutline
/*--------------------------------------------------------------------
Get attribute data direct from the AC API. For internal use - avoid direct use
link: A link to the required attribute
return: The AC API attribute data
--------------------------------------------------------------------*/
std::optional<API_Attribute> ArchicadAttributeDBaseEngine::getAPIData(const BIMLink& link) const {
return ::getAPIData(link, link.tableID);
} //ArchicadAttributeDBaseEngine::getAPIData
/*--------------------------------------------------------------------
Get storey data direct from the AC API. For internal use - avoid direct use
link: A link to the required storey
return: The AC API storey data
--------------------------------------------------------------------*/
std::optional<API_StoryType> ArchicadAttributeDBaseEngine::getAPIStorey(const BIMLink& link) const {
if (!m_storeyCache)
m_storeyCache = std::make_unique<StoreyCache>();
if (auto iter = m_storeyCache->find(link); iter != m_storeyCache->end())
return *iter;
return std::nullopt;
} //ArchicadAttributeDBaseEngine::getAPIStorey
/*--------------------------------------------------------------------
Get the ID of a storey from a specified index
index: The storey index
return: The storey ID (nullopt on failure)
--------------------------------------------------------------------*/
std::optional<BIMRecordID> ArchicadAttributeDBaseEngine::getStoreyID(short index) const {
if (!m_storeyCache)
m_storeyCache = std::make_unique<StoreyCache>();
if (auto iter = m_storeyCache->find(index); iter != m_storeyCache->end())
return Guid::fromInt(iter->floorId);
return std::nullopt;
} //ArchicadAttributeDBaseEngine::getStoreyID
#endif
/*--------------------------------------------------------------------
Handle a project event
event: The project event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool ArchicadAttributeDBaseEngine::handle(const event::ProjectEvent& event) {
using enum ProjectEvent::Type;
switch (event.getType()) {
case newDocument: case newAndReset: case open: case close: case quit:
//Reset the storey cache on any event that changes the active project
m_storeyCache.reset();
break;
default:
break;
}
return false;
} //ArchicadAttributeDBaseEngine::handle
@@ -1,158 +0,0 @@
#ifndef SPECKLE_DATABASE_ARCHICAD_ATTRIBUTE_DBASE_ENGINE
#define SPECKLE_DATABASE_ARCHICAD_ATTRIBUTE_DBASE_ENGINE
#include "Active/Database/Storage/DBaseEngine.h"
#include "Active/Serialise/UnboxedTransport.h"
#include "Speckle/Database/Storage/ArchicadDBase/ArchicadDBaseCore.h"
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Record/Attribute/Attribute.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#include <algorithm>
#include <ranges>
namespace speckle::database {
/*!
A database engine to read/write elements in an Archicad project database (local file or cloud-based)
For attribute indices:
- Each attribute type is considered to be stored in a dedicated table
- For Archicad:
- The table ID is typically the attribute type ID
- The record ID is the attribute index
- Storeys are also treated as an attribute (the API treats them separately, although application to elements is virtually the identical)
*/
class ArchicadAttributeDBaseEngine : public ArchicadDBaseCore,
public active::database::DBaseEngine<record::attribute::Attribute, BIMRecordID, BIMRecordID, BIMRecordID> {
public:
// MARK: - Types
using base = active::database::DBaseEngine<record::attribute::Attribute, BIMRecordID, BIMRecordID, BIMRecordID>;
using Attribute = record::attribute::Attribute;
using Filter = base::Filter;
using Outline = base::Outline;
// MARK: - Constructors
/*!
Constructor
@param id The document storage identifier
@param schema The document storage schema
*/
ArchicadAttributeDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema);
ArchicadAttributeDBaseEngine(const ArchicadAttributeDBaseEngine&) = delete;
/*!
Destructor
*/
~ArchicadAttributeDBaseEngine();
// MARK: - Functions (const)
/*!
Get an object by ID
@param objID The object ID
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
@return The requested object (nullptr on failure)
*/
std::unique_ptr<Attribute> getObject(const BIMRecordID& objID, std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get an object in a transportable form, e.g. packaged for serialisation
@param objID The object ID
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
@return: The requested wrapped cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getObjectCargo(const BIMRecordID& objID, std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get all objects
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The requested objects (nullptr on failure)
*/
active::container::Vector<Attribute> getObjects(std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get a filtered list of objects
@param filter The object filter
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The filtered objects (nullptr on failure)
*/
active::container::Vector<Attribute> getObjects(const Filter& filter, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Write an object to the database
@param object The object to write
@param objID The object ID
@param objDocID The object document-specific ID (unique within a specific document - nullopt if not document-bound)
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
*/
void write(const Attribute& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID = std::nullopt,
std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Erase an object by index
@param ID The object ID
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(const BIMRecordID& ID, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Erase all objects
@param tableID Optional table ID (defaults to the floor plan)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get the database outline
@return The database outline
*/
Outline getOutline() const override;
#ifdef ARCHICAD
/*!
Get attribute data direct from the AC API. For internal use - avoid direct use
@param link A link to the required attribute
@return The AC API attribute data
*/
std::optional<API_Attribute> getAPIData(const BIMLink& link) const;
/*!
Get storey data direct from the AC API. For internal use - avoid direct use
@param link A link to the required storey
@return The AC API storey data
*/
std::optional<API_StoryType> getAPIStorey(const BIMLink& link) const;
/*!
Get the ID of a storey from a specified index
@param index The storey index
@return The storey ID (nullopt on failure)
*/
std::optional<BIMRecordID> getStoreyID(short index) const;
#endif
// MARK: - Functions (mutating)
/*!
Handle a project event
@param event The project event
@return True if the event should be closed
*/
bool handle(const event::ProjectEvent& event) override;
private:
void setTable(std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt);
class StoreyCache;
///Cache of storeys in the database (saves repeated lookups)
mutable std::unique_ptr<StoreyCache> m_storeyCache;
};
}
#endif //SPECKLE_DATABASE_ARCHICAD_ATTRIBUTE_DBASE_ENGINE
@@ -10,12 +10,6 @@
#include "Speckle/Environment/Project.h" #include "Speckle/Environment/Project.h"
#include "Speckle/Event/Type/DocStoreMergeEvent.h" #include "Speckle/Event/Type/DocStoreMergeEvent.h"
#include "Speckle/Event/Type/ProjectEvent.h" #include "Speckle/Event/Type/ProjectEvent.h"
#include "Speckle/Record/Element/Column.h"
#include "Speckle/Record/Element/ColumnSegment.h"
#include "Speckle/Record/Element/GenericModelElement.h"
#include "Speckle/Record/Element/Beam.h"
#include "Speckle/Record/Element/BeamSegment.h"
#include "Speckle/Record/Element/Memo.h"
#include "Speckle/Utility/Guid.h" #include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h" #include "Speckle/Utility/String.h"
@@ -49,6 +43,19 @@ namespace {
} //getTableInfo } //getTableInfo
/*!
Get the ID of the active Archicad table
@return The active table ID (nullopt on failure)
*/
std::optional<BIMRecordID> getActiveTable() {
API_WindowInfo dbaseInfo;
active::utility::Memory::erase(dbaseInfo);
if (auto err = ACAPI_Database_GetCurrentDatabase(&dbaseInfo); err == NoError)
return dbaseInfo.databaseUnId.elemSetId;
return std::nullopt;
} //getActiveTable
/*! /*!
Set the active Archicad table Set the active Archicad table
@param tableID The target table ID @param tableID The target table ID
@@ -57,7 +64,7 @@ namespace {
bool setActiveTable(const BIMRecordID& tableID) { bool setActiveTable(const BIMRecordID& tableID) {
if (!tableID) if (!tableID)
return false; //Null guid doens't point to anything return false; //Null guid doens't point to anything
if (auto activeTable = ArchicadElementDBaseEngine::getActiveTable(); activeTable && *activeTable == tableID) if (auto activeTable = getActiveTable(); activeTable && *activeTable == tableID)
return true; return true;
auto dbaseInfo = getTableInfo(tableID); auto dbaseInfo = getTableInfo(tableID);
if (!dbaseInfo) if (!dbaseInfo)
@@ -69,81 +76,34 @@ namespace {
/*! /*!
Make a new element object Make a new element object
@param elementData The API element representation @param elementData The API element representation
@param tableID The ID of the parent table (defaults to the active drawing)
@return A new element object (nullptr on failure) @return A new element object (nullptr on failure)
*/ */
Element::Unique makeElement(const API_Element& elementData, const BIMRecordID& tableID) { Element::Unique makeElement(const API_Element& elementData) {
switch (elementData.header.type.typeID) { //Implement an object factory in future as classes for specific element types are implemented, e.g. Wall, Roof etc. using hash map
case API_ColumnID: //The fallback for undefined element types will always be the base Element class
return std::make_unique<Column>(elementData, tableID); return std::make_unique<Element>(elementData);
case API_ColumnSegmentID:
return std::make_unique<ColumnSegment>(elementData, tableID);
case API_BeamID:
return std::make_unique<Beam>(elementData, tableID);
case API_BeamSegmentID:
return std::make_unique<BeamSegment>(elementData, tableID);
default:
return std::make_unique<GenericModelElement>(elementData, tableID);
}
} }
} }
/*--------------------------------------------------------------------
Get the ID of the active Archicad table
return; The active table ID (nullopt on failure)
--------------------------------------------------------------------*/
std::optional<BIMRecordID> ArchicadElementDBaseEngine::getActiveTable() {
API_WindowInfo dbaseInfo;
active::utility::Memory::erase(dbaseInfo);
if (auto err = ACAPI_Database_GetCurrentDatabase(&dbaseInfo); err == NoError)
return dbaseInfo.databaseUnId.elemSetId;
return std::nullopt;
} //ArchicadElementDBaseEngine::getActiveTable
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get the current user element selection Get the current user element selection
return: A list of selected element IDs return: A list of selected element IDs
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
BIMLinkList ArchicadElementDBaseEngine::getSelection() const { BIMLinkList ArchicadElementDBaseEngine::getSelection() const {
auto tableID = getActiveTable();
if (!tableID)
return {};
BIMLinkList result; BIMLinkList result;
API_SelectionInfo selectionInfo; API_SelectionInfo selectionInfo;
active::utility::Memory::erase(selectionInfo); active::utility::Memory::erase(selectionInfo);
GS::Array<API_Neig> selection; GS::Array<API_Neig> selection;
if (auto err = ACAPI_Selection_Get(&selectionInfo, &selection, true); err == NoError) { if (auto err = ACAPI_Selection_Get(&selectionInfo, &selection, true); err == NoError) {
for (const auto& item : selection) for (const auto& item : selection)
result.push_back(BIMLink{item, *tableID}); result.push_back(BIMLink{item});
} }
return result; return result;
} //ArchicadElementDBaseEngine::getSelection } //ArchicadElementDBaseEngine::getSelection
/*--------------------------------------------------------------------
Set the element selection
--------------------------------------------------------------------*/
void ArchicadElementDBaseEngine::setSelection(const BIMLinkList& elementIDs) const {
GS::Array<API_Neig> selNeigs;
for (const auto& elemID : elementIDs) {
API_Neig neig(elemID);
selNeigs.Push(neig);
}
ACAPI_Selection_Select(selNeigs, true);
} //ArchicadElementDBaseEngine::setSelection
/*--------------------------------------------------------------------
Clear the element selection
--------------------------------------------------------------------*/
void ArchicadElementDBaseEngine::clearSelection() const {
ACAPI_Selection_DeselectAll();
} //ArchicadElementDBaseEngine::clearSelection
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get an object by index Get an object by index
@@ -155,32 +115,12 @@ void ArchicadElementDBaseEngine::clearSelection() const {
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Element> ArchicadElementDBaseEngine::getObject(const BIMRecordID& ID, std::optional<BIMRecordID> tableID, std::unique_ptr<Element> ArchicadElementDBaseEngine::getObject(const BIMRecordID& ID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const { std::optional<BIMRecordID> documentID) const {
//Check for memo table requests
if (tableID == memoTable) {
auto memo = std::make_unique<API_ElementMemo>();
active::utility::Memory::erase(*memo);
//Use memo filtering when requested
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 {
auto result = std::make_unique<Memo>();
result->set(std::move(memo));
return result;
}
}
if (!tableID) {
//Use the active table if none is specified
tableID = getActiveTable();
if (!tableID)
return nullptr;
}
API_Element element; API_Element element;
active::utility::Memory::erase(element); active::utility::Memory::erase(element);
API_Guid guid{ID.operator API_Guid()}; API_Guid guid{ID.operator API_Guid()};
if (ACAPI_Element_GetElementFromAnywhere(&guid, &element) != NoError) if (ACAPI_Element_GetElementFromAnywhere(&guid, &element) != NoError)
return nullptr; return nullptr;
return makeElement(element, *tableID); return makeElement(element);
} //ArchicadElementDBaseEngine::getObject } //ArchicadElementDBaseEngine::getObject
@@ -18,35 +18,21 @@ namespace speckle::database {
A database engine to read/write elements in an Archicad project database (local file or cloud-based) A database engine to read/write elements in an Archicad project database (local file or cloud-based)
*/ */
class ArchicadElementDBaseEngine : public ArchicadDBaseCore, class ArchicadElementDBaseEngine : public ArchicadDBaseCore,
public active::database::DBaseEngine<record::element::Element, BIMRecordID, BIMRecordID, BIMRecordID> { public active::database::DBaseEngine<record::element::Element,BIMRecordID, BIMRecordID, BIMRecordID> {
public: public:
// MARK: - Types // MARK: - Types
using base = active::database::DBaseEngine<record::element::Element, BIMRecordID, BIMRecordID, BIMRecordID>; using base = active::database::DBaseEngine<record::element::Element,BIMRecordID, BIMRecordID, BIMRecordID>;
using Element = record::element::Element; using Element = record::element::Element;
using Filter = base::Filter; using Filter = base::Filter;
using Outline = base::Outline; using Outline = base::Outline;
// MARK: - Constants
///The memo table ID (supplementary element data)
static const inline utility::Guid memoTable{utility::String{"fdff96d2-8c34-4f8b-8a76-a96a2b242758"}};
// MARK: - Static functions
/*!
Get the ID of the active Archicad table
@return The active table ID (nullopt on failure)
*/
static std::optional<BIMRecordID> getActiveTable();
// MARK: - Constructors // MARK: - Constructors
/*! /*!
Constructor Constructor
@param id The document storage identifier @param id The document storage identifier
@param schema The document storage schema
*/ */
ArchicadElementDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema) : ArchicadDBaseCore{id, std::move(schema)} {} ArchicadElementDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema) : ArchicadDBaseCore{id, std::move(schema)} {}
ArchicadElementDBaseEngine(const ArchicadElementDBaseEngine&) = delete; ArchicadElementDBaseEngine(const ArchicadElementDBaseEngine&) = delete;
@@ -58,14 +44,6 @@ namespace speckle::database {
@return A list of selected element IDs @return A list of selected element IDs
*/ */
BIMLinkList getSelection() const; BIMLinkList getSelection() const;
/*!
Set the element selection
*/
void setSelection(const BIMLinkList& elementIDs) const;
/*!
Clear the element selection
*/
void clearSelection() const;
/*! /*!
Get an object by index Get an object by index
@param objID The object ID @param objID The object ID
@@ -1,232 +0,0 @@
#include "Speckle/Database/Storage/ArchicadDBase/Property/ArchicadGroupDBaseEngine.h"
#ifdef ARCHICAD
#include "Active/Utility/Memory.h"
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Environment/Addon.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include "Speckle/Record/Property/Setting.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#include <ACAPinc.h>
#include <ACAPI_Database.h>
using namespace active::event;
using namespace active::setting;
using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::event;
using namespace speckle::record::property;
using namespace speckle::utility;
using enum ArchicadDBaseCore::Status;
namespace {
/*!
Make a new group object
@param groupData The API group representation
@return A new group object (nullptr on failure)
*/
Group::Shared makeGroup(const API_PropertyGroup& groupData) {
//NB: This function has been written to allow for the future possibility of different methods for constructing a group and/or
//failure to make one
return std::make_shared<Group>(groupData);
}
}
namespace speckle::database {
class ArchicadGroupDBaseEngine::Cache : public std::unordered_map<Guid, std::shared_ptr<Group>> {
public:
/*!
Default constructor
*/
Cache() { rebuild(); }
/*!
Rebuild the property group cache
*/
void rebuild() {
//Request all Archicad group groups
GS::Array<API_PropertyGroup> groups;
if (auto err = ACAPI_Property_GetPropertyGroups(groups); err != NoError)
return;
//Populate the group cache from the collected groups
for (auto iter = groups.Begin(); iter != groups.End(); ++iter)
if (auto propGroup = makeGroup(*iter); propGroup)
insert({propGroup->getBIMID(), propGroup});
}
};
}
/*--------------------------------------------------------------------
Constructor
id: The document storage identifier
schema: The document storage schema
--------------------------------------------------------------------*/
ArchicadGroupDBaseEngine::ArchicadGroupDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema) :
ArchicadDBaseCore{id, std::move(schema)} {
} //ArchicadGroupDBaseEngine::ArchicadGroupDBaseEngine
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
ArchicadGroupDBaseEngine::~ArchicadGroupDBaseEngine() {
} //ArchicadGroupDBaseEngine::~ArchicadGroupDBaseEngine
/*--------------------------------------------------------------------
Get an object by ID
objID: The object index
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested object (nullptr on failure)
--------------------------------------------------------------------*/
std::unique_ptr<Group> ArchicadGroupDBaseEngine::getObject(const BIMRecordID& objID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
if (!validateCache() || (tableID && (tableID != Group::propertyGroupTableID)))
return nullptr;
if (auto found = m_cache->find(objID); found != m_cache->end())
return std::make_unique<Group>(*found->second);
return nullptr;
} //ArchicadGroupDBaseEngine::getObject
/*--------------------------------------------------------------------
Get an object in a transportable form, e.g. packaged for serialisation
index: The object index
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested wrapped cargo (nullptr on failure)
--------------------------------------------------------------------*/
active::serialise::Cargo::Unique ArchicadGroupDBaseEngine::getObjectCargo(const BIMRecordID& ID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return nullptr; //TODO: Implement
} //ArchicadGroupDBaseEngine::getObject
/*--------------------------------------------------------------------
Get all objects
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
active::container::Vector<Group> ArchicadGroupDBaseEngine::getObjects(std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return {}; //TODO: Implement
} //ArchicadGroupDBaseEngine::getObjects
/*--------------------------------------------------------------------
Get all objects
filter: The object filter
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
active::container::Vector<Group> ArchicadGroupDBaseEngine::getObjects(const Filter& filter, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return {}; //TODO: Implement
} //ArchicadGroupDBaseEngine::getObjects
/*--------------------------------------------------------------------
Write an object to the database
object: The object to write
objID: The object ID
objDocID: The object document-specific ID (unique within a specific document - nullopt if not document-bound)
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
--------------------------------------------------------------------*/
void ArchicadGroupDBaseEngine::write(const Group& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadGroupDBaseEngine::write
/*--------------------------------------------------------------------
Erase an object by index
objID: The object ID
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: True if the object was successfully erased
--------------------------------------------------------------------*/
void ArchicadGroupDBaseEngine::erase(const BIMRecordID& ID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadGroupDBaseEngine::erase
/*--------------------------------------------------------------------
Erase all objects
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
--------------------------------------------------------------------*/
void ArchicadGroupDBaseEngine::erase(std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadGroupDBaseEngine::erase
/*--------------------------------------------------------------------
Get the database outline
return: The database outline
--------------------------------------------------------------------*/
ArchicadGroupDBaseEngine::Outline ArchicadGroupDBaseEngine::getOutline() const {
return {}; //TODO: Implement
} //ArchicadGroupDBaseEngine::getOutline
/*--------------------------------------------------------------------
Handle a project event
event: The project event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool ArchicadGroupDBaseEngine::handle(const event::ProjectEvent& event) {
using enum ProjectEvent::Type;
switch (event.getType()) {
case newDocument: case newAndReset: case open: case close: case quit:
//Reset the group cache on any event that changes the active project
m_cache.reset();
break;
default:
break;
}
return false;
} //ArchicadGroupDBaseEngine::handle
/*--------------------------------------------------------------------
Ensure the cache is current
return: True if the cache contains valid te groups
--------------------------------------------------------------------*/
bool ArchicadGroupDBaseEngine::validateCache() const {
if (!m_cache)
m_cache = std::make_unique<Cache>();
return !m_cache->empty();
} //ArchicadGroupDBaseEngine::validateCache
#endif //ARCHICAD
@@ -1,136 +0,0 @@
#ifndef SPECKLE_DATABASE_ARCHICAD_GROUP_DBASE_ENGINE
#define SPECKLE_DATABASE_ARCHICAD_GROUP_DBASE_ENGINE
#include "Active/Database/Storage/DBaseEngine.h"
#include "Active/Serialise/UnboxedTransport.h"
#include "Speckle/Database/Storage/ArchicadDBase/ArchicadDBaseCore.h"
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Record/Property/Group.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#include <algorithm>
#include <ranges>
namespace speckle::database {
/*!
A database engine to read/write property groups in an Archicad project database (local file or cloud-based)
Property groups can be attached to property templates to support collections of types linked to a specific role
*/
class ArchicadGroupDBaseEngine : public ArchicadDBaseCore,
public active::database::DBaseEngine<record::property::Group, BIMRecordID, BIMRecordID, BIMRecordID> {
public:
// MARK: - Types
using base = active::database::DBaseEngine<record::property::Group, BIMRecordID, BIMRecordID, BIMRecordID>;
using Group = record::property::Group;
using Filter = base::Filter;
using Outline = base::Outline;
// MARK: - Constructors
/*!
Constructor
@param id The document storage identifier
@param schema The document storage schema
*/
ArchicadGroupDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema);
ArchicadGroupDBaseEngine(const ArchicadGroupDBaseEngine&) = delete;
/*!
Destructor
*/
~ArchicadGroupDBaseEngine();
// MARK: - Functions (const)
/*!
Get an object by ID
@param objID The object ID
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@return The requested object (nullptr on failure)
*/
std::unique_ptr<Group> getObject(const BIMRecordID& objID, std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get an object in a transportable form, e.g. packaged for serialisation
@param objID The object ID
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@return: The requested wrapped cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getObjectCargo(const BIMRecordID& objID, std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get all objects
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The requested objects (nullptr on failure)
*/
active::container::Vector<Group> getObjects(std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get a filtered list of objects
@param filter The object filter
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The filtered objects (nullptr on failure)
*/
active::container::Vector<Group> getObjects(const Filter& filter, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Write an object to the database
@param object The object to write
@param objID The object ID
@param objDocID The object document-specific ID (unique within a specific document - nullopt if not document-bound)
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
*/
void write(const Group& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID = std::nullopt,
std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Erase an object by index
@param ID The object ID
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(const BIMRecordID& ID, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Erase all objects
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get the database outline
@return The database outline
*/
Outline getOutline() const override;
// MARK: - Functions (mutating)
/*!
Handle a project event
@param event The project event
@return True if the event should be closed
*/
bool handle(const event::ProjectEvent& event) override;
private:
/*!
Ensure the cache is current
@return True if the cache contains valid te templates
*/
bool validateCache() const;
//Cached templates
class Cache;
mutable std::unique_ptr<Cache> m_cache;
};
}
#endif //SPECKLE_DATABASE_ARCHICAD_GROUP_DBASE_ENGINE
@@ -1,256 +0,0 @@
#include "Speckle/Database/Storage/ArchicadDBase/Property/ArchicadPropertyDBaseEngine.h"
#ifdef ARCHICAD
#include "Active/Utility/Memory.h"
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Environment/Addon.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include "Speckle/Record/Property/Setting.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#include <ACAPinc.h>
#include <ACAPI_Database.h>
#include <BM.hpp>
using namespace active::event;
using namespace active::setting;
using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::event;
using namespace speckle::record::property;
using namespace speckle::utility;
using enum ArchicadDBaseCore::Status;
namespace {
/*!
Make a new template object
@param templateData The API template representation
@return A new template object (nullptr on failure)
*/
Template::Shared makeTemplate(const API_PropertyDefinition& templateData) {
//NB: This function has been written to allow for the future possibility of different methods for constructing a template and/or
//failure to make one
return std::make_shared<Template>(templateData);
}
}
namespace speckle::database {
class ArchicadPropertyDBaseEngine::Cache : public std::unordered_map<Guid, std::shared_ptr<Template>> {
public:
/*!
Default constructor
*/
Cache() { rebuild(); }
/*!
Rebuild the property template cache
*/
void rebuild() {
//Request all Archicad template definitions
GS::Array<API_PropertyDefinition> definitions;
if (auto err = ACAPI_Property_GetPropertyDefinitions(APINULLGuid, definitions); err != NoError)
return;
//Populate the template cache from the collected definitions
for (auto iter = definitions.Begin(); iter != definitions.End(); ++iter)
if (auto propTemplate = makeTemplate(*iter); propTemplate)
insert({propTemplate->getBIMID(), propTemplate});
}
};
}
/*--------------------------------------------------------------------
Constructor
id: The document storage identifier
schema: The document storage schema
--------------------------------------------------------------------*/
ArchicadPropertyDBaseEngine::ArchicadPropertyDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema) :
ArchicadDBaseCore{id, std::move(schema)} {
} //ArchicadPropertyDBaseEngine::ArchicadPropertyDBaseEngine
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
ArchicadPropertyDBaseEngine::~ArchicadPropertyDBaseEngine() {
} //ArchicadPropertyDBaseEngine::~ArchicadPropertyDBaseEngine
/*--------------------------------------------------------------------
Find all property templates linked to specified classifications
classifications: The classifications
return: A list of shared pointers to linked property templates
--------------------------------------------------------------------*/
std::vector<std::shared_ptr<Template>> ArchicadPropertyDBaseEngine::findTemplatesByClassification(const BIMRecordIDList& classifications) const {
std::vector<std::shared_ptr<Template>> result;
if (validateCache()) {
for (const auto& templ : *m_cache) {
for (const auto& classID : classifications) {
if (templ.second->linksToClassification(classID)) {
result.push_back(templ.second);
break;
}
}
}
}
return result;
} //ArchicadPropertyDBaseEngine::findTemplatesByClassification
/*--------------------------------------------------------------------
Get an object by ID
objID: The object index
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested object (nullptr on failure)
--------------------------------------------------------------------*/
std::unique_ptr<Template> ArchicadPropertyDBaseEngine::getObject(const BIMRecordID& objID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
if (!validateCache() || (tableID && (tableID != Template::propertyTemplateTableID)))
return nullptr;
if (auto found = m_cache->find(objID); found != m_cache->end())
return std::make_unique<Template>(*found->second);
return nullptr;
} //ArchicadPropertyDBaseEngine::getObject
/*--------------------------------------------------------------------
Get an object in a transportable form, e.g. packaged for serialisation
index: The object index
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: The requested wrapped cargo (nullptr on failure)
--------------------------------------------------------------------*/
active::serialise::Cargo::Unique ArchicadPropertyDBaseEngine::getObjectCargo(const BIMRecordID& ID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return nullptr; //TODO: Implement
} //ArchicadPropertyDBaseEngine::getObject
/*--------------------------------------------------------------------
Get all objects
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
active::container::Vector<Template> ArchicadPropertyDBaseEngine::getObjects(std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return {}; //TODO: Implement
} //ArchicadPropertyDBaseEngine::getObjects
/*--------------------------------------------------------------------
Get all objects
filter: The object filter
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
return: The requested objects (nullptr on failure)
--------------------------------------------------------------------*/
active::container::Vector<Template> ArchicadPropertyDBaseEngine::getObjects(const Filter& filter, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
return {}; //TODO: Implement
} //ArchicadPropertyDBaseEngine::getObjects
/*--------------------------------------------------------------------
Write an object to the database
object: The object to write
objID: The object ID
objDocID: The object document-specific ID (unique within a specific document - nullopt if not document-bound)
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
--------------------------------------------------------------------*/
void ArchicadPropertyDBaseEngine::write(const Template& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadPropertyDBaseEngine::write
/*--------------------------------------------------------------------
Erase an object by index
objID: The object ID
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (when the object is bound to a specific document)
return: True if the object was successfully erased
--------------------------------------------------------------------*/
void ArchicadPropertyDBaseEngine::erase(const BIMRecordID& ID, std::optional<BIMRecordID> tableID,
std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadPropertyDBaseEngine::erase
/*--------------------------------------------------------------------
Erase all objects
tableID: Optional table ID (defaults to the floor plan)
documentID: Optional document ID (filter for this document only - nullopt = all objects)
--------------------------------------------------------------------*/
void ArchicadPropertyDBaseEngine::erase(std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
//TODO: Implement
} //ArchicadPropertyDBaseEngine::erase
/*--------------------------------------------------------------------
Get the database outline
return: The database outline
--------------------------------------------------------------------*/
ArchicadPropertyDBaseEngine::Outline ArchicadPropertyDBaseEngine::getOutline() const {
return {}; //TODO: Implement
} //ArchicadPropertyDBaseEngine::getOutline
/*--------------------------------------------------------------------
Handle a project event
event: The project event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool ArchicadPropertyDBaseEngine::handle(const event::ProjectEvent& event) {
using enum ProjectEvent::Type;
switch (event.getType()) {
case newDocument: case newAndReset: case open: case close: case quit:
//Reset the template cache on any event that changes the active project
m_cache.reset();
break;
default:
break;
}
return false;
} //ArchicadPropertyDBaseEngine::handle
/*--------------------------------------------------------------------
Ensure the cache is current
return: True if the cache contains valid te templates
--------------------------------------------------------------------*/
bool ArchicadPropertyDBaseEngine::validateCache() const {
if (!m_cache)
m_cache = std::make_unique<Cache>();
return !m_cache->empty();
} //ArchicadPropertyDBaseEngine::validateCache
#endif //ARCHICAD
@@ -1,143 +0,0 @@
#ifndef SPECKLE_DATABASE_ARCHICAD_PROPERTY_DBASE_ENGINE
#define SPECKLE_DATABASE_ARCHICAD_PROPERTY_DBASE_ENGINE
#include "Active/Database/Storage/DBaseEngine.h"
#include "Active/Serialise/UnboxedTransport.h"
#include "Speckle/Database/Storage/ArchicadDBase/ArchicadDBaseCore.h"
#include "Speckle/Database/Identity/BIMLink.h"
#include "Speckle/Record/Property/Template.h"
#include "Speckle/Utility/Guid.h"
#include "Speckle/Utility/String.h"
#include <algorithm>
#include <ranges>
namespace speckle::database {
/*!
A database engine to read/write property templates in an Archicad project database (local file or cloud-based)
Property templates describe the characteristics and metadate attached to element property values. As such the templates may be shared
amongst any number of Property objects
*/
class ArchicadPropertyDBaseEngine : public ArchicadDBaseCore,
public active::database::DBaseEngine<record::property::Template, BIMRecordID, BIMRecordID, BIMRecordID> {
public:
// MARK: - Types
using base = active::database::DBaseEngine<record::property::Template, BIMRecordID, BIMRecordID, BIMRecordID>;
using Template = record::property::Template;
using Filter = base::Filter;
using Outline = base::Outline;
// MARK: - Constructors
/*!
Constructor
@param id The document storage identifier
@param schema The document storage schema
*/
ArchicadPropertyDBaseEngine(const active::utility::NameID& id, ArchicadDBaseSchema&& schema);
ArchicadPropertyDBaseEngine(const ArchicadPropertyDBaseEngine&) = delete;
/*!
Destructor
*/
~ArchicadPropertyDBaseEngine();
// MARK: - Functions (const)
/*!
Find all property templates linked to specified classifications
@param classifications The classifications
@return A list of shared pointers to linked property templates
*/
std::vector<std::shared_ptr<Template>> findTemplatesByClassification(const BIMRecordIDList& classifications) const;
/*!
Get an object by ID
@param objID The object ID
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@return The requested object (nullptr on failure)
*/
std::unique_ptr<Template> getObject(const BIMRecordID& objID, std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get an object in a transportable form, e.g. packaged for serialisation
@param objID The object ID
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@return: The requested wrapped cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getObjectCargo(const BIMRecordID& objID, std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get all objects
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The requested objects (nullptr on failure)
*/
active::container::Vector<Template> getObjects(std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get a filtered list of objects
@param filter The object filter
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
@return The filtered objects (nullptr on failure)
*/
active::container::Vector<Template> getObjects(const Filter& filter, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Write an object to the database
@param object The object to write
@param objID The object ID
@param objDocID The object document-specific ID (unique within a specific document - nullopt if not document-bound)
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
*/
void write(const Template& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID = std::nullopt,
std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Erase an object by index
@param ID The object ID
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(const BIMRecordID& ID, std::optional<BIMRecordID> tableID = std::nullopt,
std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Erase all objects
@param tableID Optional table ID (default selected based on record type)
@param documentID Optional document ID (when the object is bound to a specific document)
@throw Exception thrown on SQL error
*/
void erase(std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const override;
/*!
Get the database outline
@return The database outline
*/
Outline getOutline() const override;
// MARK: - Functions (mutating)
/*!
Handle a project event
@param event The project event
@return True if the event should be closed
*/
bool handle(const event::ProjectEvent& event) override;
private:
/*!
Ensure the cache is current
@return True if the cache contains valid te templates
*/
bool validateCache() const;
//Cached templates
class Cache;
mutable std::unique_ptr<Cache> m_cache;
};
}
#endif //SPECKLE_DATABASE_ARCHICAD_PROPERTY_DBASE_ENGINE
@@ -239,7 +239,7 @@ void DocumentStoreCore::writeStore() {
GS::HashTable<API_Guid, short> conflicts; GS::HashTable<API_Guid, short> conflicts;
if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_ReserveObjects({Guid{m_id.id}}, &conflicts)); statusCode != nominal) if (auto statusCode = convertArchicadError(ACAPI_AddOnObject_ReserveObjects({Guid{m_id.id}}, &conflicts)); statusCode != nominal)
throw std::system_error(makeError(statusCode)); throw std::system_error(makeError(statusCode));
//TODO: Implement handling for conflicts //TODO: Implamenent handling for conflicts
} }
auto toWrite = buildStore(); auto toWrite = buildStore();
//Write the new data //Write the new data
+1 -2
View File
@@ -77,7 +77,6 @@ std::weak_ptr<Project> Addon::getActiveProject() const {
void Addon::publishExternal(const active::event::Event& event) { void Addon::publishExternal(const active::event::Event& event) {
if (!logCallback()) if (!logCallback())
return; return;
++m_sessionCount;
try { try {
preprocessEvent(event); preprocessEvent(event);
publish(event); publish(event);
@@ -166,7 +165,7 @@ bool Addon::logCallback(bool initialise) {
return false; return false;
} }
return true; return true;
} //Addon::logCallback } //Addon::publishExternalEvent
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
-7
View File
@@ -41,11 +41,6 @@ namespace speckle::environment {
@return The active project (nullptr = no open project) @return The active project (nullptr = no open project)
*/ */
std::weak_ptr<Project> getActiveProject() const; std::weak_ptr<Project> getActiveProject() const;
/*!
Get the session index
@return The session index (non-recursive entries into the add-on)
*/
uint32_t getSession() const { return m_sessionCount; }
// MARK: - Functions (mutating) // MARK: - Functions (mutating)
@@ -108,8 +103,6 @@ namespace speckle::environment {
std::shared_ptr<Project> m_activeProject; std::shared_ptr<Project> m_activeProject;
///The depth of nested callbacks - the root call starts at depth 0 (important for some entry-point initialisation) ///The depth of nested callbacks - the root call starts at depth 0 (important for some entry-point initialisation)
uint32_t m_callDepth = 0; uint32_t m_callDepth = 0;
///The index of the active session (non-recursive entries into the add-on)
uint32_t m_sessionCount = 0;
}; };

Some files were not shown because too many files have changed in this diff Show More