Merge branch 'feature/CNX_783_Create_receive_bridge' into develop
This commit is contained in:
@@ -175,6 +175,8 @@
|
||||
<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\UpdateConfig.cpp" />
|
||||
<ClCompile Include="Connector\Interface\Browser\Bridge\Receive\Receive.cpp" />
|
||||
<ClCompile Include="Connector\Interface\Browser\Bridge\Receive\ReceiveBridge.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" />
|
||||
@@ -206,6 +208,7 @@
|
||||
<ClCompile Include="Connector\Record\Model\ModelCard.cpp" />
|
||||
<ClCompile Include="Connector\Record\Model\ReceiverModelCard.cpp" />
|
||||
<ClCompile Include="Connector\Record\Model\SenderModelCard.cpp" />
|
||||
<ClCompile Include="Connector\Tool\ElementHighlighter.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Connector\Connector.h" />
|
||||
@@ -234,6 +237,8 @@
|
||||
<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\UpdateConfig.h" />
|
||||
<ClInclude Include="Connector\Interface\Browser\Bridge\Receive\Receive.h" />
|
||||
<ClInclude Include="Connector\Interface\Browser\Bridge\Receive\ReceiveBridge.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" />
|
||||
@@ -268,6 +273,7 @@
|
||||
<ClInclude Include="Connector\Record\Model\ModelCard.h" />
|
||||
<ClInclude Include="Connector\Record\Model\ReceiverModelCard.h" />
|
||||
<ClInclude Include="Connector\Record\Model\SenderModelCard.h" />
|
||||
<ClInclude Include="Connector\Tool\ElementHighlighter.h" />
|
||||
<ClInclude Include="Connector\Version.h" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
|
||||
@@ -74,6 +74,12 @@
|
||||
<Filter Include="Connector\Environment">
|
||||
<UniqueIdentifier>{1d9a10c3-cac6-4b15-afb9-f117b99b3a24}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Connector\Interface\Browser\Bridge\Receive">
|
||||
<UniqueIdentifier>{896b7b9b-61d8-46e7-8432-cfbdab4918fb}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Connector\Tool">
|
||||
<UniqueIdentifier>{f9330e8f-8242-4605-b25c-b1ba24451825}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="RFIX.win\Connector.rc2">
|
||||
@@ -98,9 +104,6 @@
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Connector\Connector.cpp">
|
||||
<Filter>Connector</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Connector\Interface\ConnectorMenu.cpp">
|
||||
<Filter>Connector\Interface</Filter>
|
||||
</ClCompile>
|
||||
@@ -260,6 +263,18 @@
|
||||
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.cpp">
|
||||
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Connector\Interface\Browser\Bridge\Receive\Receive.cpp">
|
||||
<Filter>Connector\Interface\Browser\Bridge\Receive</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Connector\Interface\Browser\Bridge\Receive\ReceiveBridge.cpp">
|
||||
<Filter>Connector\Interface\Browser\Bridge\Receive</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Connector\Tool\ElementHighlighter.cpp">
|
||||
<Filter>Connector\Tool</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Connector\Connector.cpp">
|
||||
<Filter>Connector</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Connector\ConnectorResource.h">
|
||||
@@ -445,5 +460,14 @@
|
||||
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.h">
|
||||
<Filter>Connector\Interface\Browser\Bridge\Config</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Connector\Interface\Browser\Bridge\Receive\Receive.h">
|
||||
<Filter>Connector\Interface\Browser\Bridge\Receive</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Connector\Interface\Browser\Bridge\Receive\ReceiveBridge.h">
|
||||
<Filter>Connector\Interface\Browser\Bridge\Receive</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Connector\Tool\ElementHighlighter.h">
|
||||
<Filter>Connector\Tool</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -726,6 +726,18 @@
|
||||
21CE9B7B2CE627640076522F /* GSProfiler.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CE9AEE2CE627640076522F /* GSProfiler.framework */; };
|
||||
21CE9B7C2CE627640076522F /* VBAttributeList.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CE9AEF2CE627640076522F /* VBAttributeList.framework */; };
|
||||
21CE9B7D2CE627640076522F /* Property.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 21CE9AF02CE627640076522F /* Property.framework */; };
|
||||
21CE9B832CE69A230076522F /* Receive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B7E2CE69A230076522F /* Receive.cpp */; };
|
||||
21CE9B842CE69A230076522F /* Receive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B7E2CE69A230076522F /* Receive.cpp */; };
|
||||
21CE9B852CE69A230076522F /* Receive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B7E2CE69A230076522F /* Receive.cpp */; };
|
||||
21CE9B862CE69A230076522F /* Receive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B7E2CE69A230076522F /* Receive.cpp */; };
|
||||
21CE9B872CE69A230076522F /* ReceiveBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B802CE69A230076522F /* ReceiveBridge.cpp */; };
|
||||
21CE9B882CE69A230076522F /* ReceiveBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B802CE69A230076522F /* ReceiveBridge.cpp */; };
|
||||
21CE9B892CE69A230076522F /* ReceiveBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B802CE69A230076522F /* ReceiveBridge.cpp */; };
|
||||
21CE9B8A2CE69A230076522F /* ReceiveBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B802CE69A230076522F /* ReceiveBridge.cpp */; };
|
||||
21CE9B8E2CE75CFC0076522F /* ElementHighlighter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B8B2CE75CFC0076522F /* ElementHighlighter.cpp */; };
|
||||
21CE9B8F2CE75CFC0076522F /* ElementHighlighter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B8B2CE75CFC0076522F /* ElementHighlighter.cpp */; };
|
||||
21CE9B902CE75CFC0076522F /* ElementHighlighter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B8B2CE75CFC0076522F /* ElementHighlighter.cpp */; };
|
||||
21CE9B912CE75CFC0076522F /* ElementHighlighter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21CE9B8B2CE75CFC0076522F /* ElementHighlighter.cpp */; };
|
||||
21D0BD602C89BFEA0077E104 /* SendBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD5B2C89BFEA0077E104 /* SendBridge.cpp */; };
|
||||
21D0BD672C89D7410077E104 /* AccountTests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD642C89D7400077E104 /* AccountTests.cpp */; };
|
||||
21D0BD6A2C8A0DB40077E104 /* GetIsDevMode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BD682C8A0DB40077E104 /* GetIsDevMode.cpp */; };
|
||||
@@ -1445,6 +1457,12 @@
|
||||
21CE9AEE2CE627640076522F /* GSProfiler.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GSProfiler.framework; path = "../../Archicad 26/Support/Frameworks/GSProfiler.framework"; sourceTree = "<group>"; };
|
||||
21CE9AEF2CE627640076522F /* VBAttributeList.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = VBAttributeList.framework; path = "../../Archicad 26/Support/Frameworks/VBAttributeList.framework"; sourceTree = "<group>"; };
|
||||
21CE9AF02CE627640076522F /* Property.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Property.framework; path = "../../Archicad 26/Support/Frameworks/Property.framework"; sourceTree = "<group>"; };
|
||||
21CE9B7E2CE69A230076522F /* Receive.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Receive.cpp; sourceTree = "<group>"; };
|
||||
21CE9B7F2CE69A230076522F /* Receive.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Receive.h; sourceTree = "<group>"; };
|
||||
21CE9B802CE69A230076522F /* ReceiveBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ReceiveBridge.cpp; sourceTree = "<group>"; };
|
||||
21CE9B812CE69A230076522F /* ReceiveBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReceiveBridge.h; sourceTree = "<group>"; };
|
||||
21CE9B8B2CE75CFC0076522F /* ElementHighlighter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ElementHighlighter.cpp; sourceTree = "<group>"; };
|
||||
21CE9B8C2CE75CFC0076522F /* ElementHighlighter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ElementHighlighter.h; sourceTree = "<group>"; };
|
||||
21D0BD5B2C89BFEA0077E104 /* SendBridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SendBridge.cpp; sourceTree = "<group>"; };
|
||||
21D0BD5C2C89BFEA0077E104 /* SendBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SendBridge.h; sourceTree = "<group>"; };
|
||||
21D0BD642C89D7400077E104 /* AccountTests.cpp */ = {isa = PBXFileReference; explicitFileType = sourcecode.cpp.objcpp; fileEncoding = 4; path = AccountTests.cpp; sourceTree = "<group>"; };
|
||||
@@ -2785,6 +2803,26 @@
|
||||
name = Archicad28;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
21CE9B822CE69A230076522F /* Receive */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
21CE9B7E2CE69A230076522F /* Receive.cpp */,
|
||||
21CE9B7F2CE69A230076522F /* Receive.h */,
|
||||
21CE9B802CE69A230076522F /* ReceiveBridge.cpp */,
|
||||
21CE9B812CE69A230076522F /* ReceiveBridge.h */,
|
||||
);
|
||||
path = Receive;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
21CE9B8D2CE75CFC0076522F /* Tool */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
21CE9B8B2CE75CFC0076522F /* ElementHighlighter.cpp */,
|
||||
21CE9B8C2CE75CFC0076522F /* ElementHighlighter.h */,
|
||||
);
|
||||
path = Tool;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
21D0BD5D2C89BFEA0077E104 /* Send */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -2907,6 +2945,7 @@
|
||||
21F69F092C677BC0008B6A06 /* Event */,
|
||||
21F69F0E2C677BC0008B6A06 /* Interface */,
|
||||
21D0BDD82C9387E60077E104 /* Record */,
|
||||
21CE9B8D2CE75CFC0076522F /* Tool */,
|
||||
21B67CBA2C774C6500FD64FC /* Version.h */,
|
||||
);
|
||||
path = Connector;
|
||||
@@ -2929,6 +2968,7 @@
|
||||
21F69F852C70D2C4008B6A06 /* Account */,
|
||||
21B67CAB2C77329800FD64FC /* Base */,
|
||||
21F69FB82C762EF0008B6A06 /* Config */,
|
||||
21CE9B822CE69A230076522F /* Receive */,
|
||||
21D0BD5D2C89BFEA0077E104 /* Send */,
|
||||
21A890B92CC15C540087E732 /* Selection */,
|
||||
21B67CD82C78C83800FD64FC /* Test */,
|
||||
@@ -3098,7 +3138,7 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = YES;
|
||||
LastUpgradeCheck = 1530;
|
||||
LastUpgradeCheck = 1610;
|
||||
TargetAttributes = {
|
||||
219F30342C768F0A009834E9 = {
|
||||
CreatedOnToolsVersion = 15.3;
|
||||
@@ -3376,6 +3416,7 @@
|
||||
2199BB7E2CDD3FA800A4BEEC /* HighlightObjects.cpp in Sources */,
|
||||
21D0BD602C89BFEA0077E104 /* SendBridge.cpp in Sources */,
|
||||
21D0BD972C8F13F30077E104 /* GetSendFilters.cpp in Sources */,
|
||||
21CE9B882CE69A230076522F /* ReceiveBridge.cpp in Sources */,
|
||||
21B67CAC2C77329800FD64FC /* BaseBridge.cpp in Sources */,
|
||||
2192460D2CA3469D00CF5703 /* ProjectCollection.cpp in Sources */,
|
||||
21D0BD6A2C8A0DB40077E104 /* GetIsDevMode.cpp in Sources */,
|
||||
@@ -3402,7 +3443,9 @@
|
||||
2199BB552CDA4B1700A4BEEC /* ConnectorProject.cpp in Sources */,
|
||||
21AEF9EF2CAB5720000B8681 /* SendObject.cpp in Sources */,
|
||||
21384BCD2CD2EE7400D4602B /* OpenUrl.cpp in Sources */,
|
||||
21CE9B842CE69A230076522F /* Receive.cpp in Sources */,
|
||||
21B67CDC2C78C88000FD64FC /* SayHi.cpp in Sources */,
|
||||
21CE9B8F2CE75CFC0076522F /* ElementHighlighter.cpp in Sources */,
|
||||
215F082E2C94C5C000CD343B /* FilterMover.cpp in Sources */,
|
||||
21F69F122C677BC0008B6A06 /* ConnectorMenu.cpp in Sources */,
|
||||
21F69F8D2C70D7EE008B6A06 /* GetAccounts.cpp in Sources */,
|
||||
@@ -3446,6 +3489,7 @@
|
||||
21BD79952CE23E4D00526AD1 /* HighlightObjects.cpp in Sources */,
|
||||
21BD79962CE23E4D00526AD1 /* SendBridge.cpp in Sources */,
|
||||
21BD79972CE23E4D00526AD1 /* GetSendFilters.cpp in Sources */,
|
||||
21CE9B8A2CE69A230076522F /* ReceiveBridge.cpp in Sources */,
|
||||
21BD79982CE23E4D00526AD1 /* BaseBridge.cpp in Sources */,
|
||||
21BD79992CE23E4D00526AD1 /* ProjectCollection.cpp in Sources */,
|
||||
21BD799A2CE23E4D00526AD1 /* GetIsDevMode.cpp in Sources */,
|
||||
@@ -3472,7 +3516,9 @@
|
||||
21BD79AF2CE23E4D00526AD1 /* ConnectorProject.cpp in Sources */,
|
||||
21BD79B02CE23E4D00526AD1 /* SendObject.cpp in Sources */,
|
||||
21BD79B12CE23E4D00526AD1 /* OpenUrl.cpp in Sources */,
|
||||
21CE9B862CE69A230076522F /* Receive.cpp in Sources */,
|
||||
21BD79B22CE23E4D00526AD1 /* SayHi.cpp in Sources */,
|
||||
21CE9B912CE75CFC0076522F /* ElementHighlighter.cpp in Sources */,
|
||||
21BD79B32CE23E4D00526AD1 /* FilterMover.cpp in Sources */,
|
||||
21BD79B42CE23E4D00526AD1 /* ConnectorMenu.cpp in Sources */,
|
||||
21BD79B52CE23E4D00526AD1 /* GetAccounts.cpp in Sources */,
|
||||
@@ -3507,6 +3553,7 @@
|
||||
21CE8AA72CE4F3370076522F /* HighlightObjects.cpp in Sources */,
|
||||
21CE8AA82CE4F3370076522F /* SendBridge.cpp in Sources */,
|
||||
21CE8AA92CE4F3370076522F /* GetSendFilters.cpp in Sources */,
|
||||
21CE9B892CE69A230076522F /* ReceiveBridge.cpp in Sources */,
|
||||
21CE8AAA2CE4F3370076522F /* BaseBridge.cpp in Sources */,
|
||||
21CE8AAB2CE4F3370076522F /* ProjectCollection.cpp in Sources */,
|
||||
21CE8AAC2CE4F3370076522F /* GetIsDevMode.cpp in Sources */,
|
||||
@@ -3533,7 +3580,9 @@
|
||||
21CE8AC12CE4F3370076522F /* ConnectorProject.cpp in Sources */,
|
||||
21CE8AC22CE4F3370076522F /* SendObject.cpp in Sources */,
|
||||
21CE8AC32CE4F3370076522F /* OpenUrl.cpp in Sources */,
|
||||
21CE9B852CE69A230076522F /* Receive.cpp in Sources */,
|
||||
21CE8AC42CE4F3370076522F /* SayHi.cpp in Sources */,
|
||||
21CE9B902CE75CFC0076522F /* ElementHighlighter.cpp in Sources */,
|
||||
21CE8AC52CE4F3370076522F /* FilterMover.cpp in Sources */,
|
||||
21CE8AC62CE4F3370076522F /* ConnectorMenu.cpp in Sources */,
|
||||
21CE8AC72CE4F3370076522F /* GetAccounts.cpp in Sources */,
|
||||
@@ -3568,6 +3617,7 @@
|
||||
21CE8DE72CE5137C0076522F /* HighlightObjects.cpp in Sources */,
|
||||
21CE8DE82CE5137C0076522F /* SendBridge.cpp in Sources */,
|
||||
21CE8DE92CE5137C0076522F /* GetSendFilters.cpp in Sources */,
|
||||
21CE9B872CE69A230076522F /* ReceiveBridge.cpp in Sources */,
|
||||
21CE8DEA2CE5137C0076522F /* BaseBridge.cpp in Sources */,
|
||||
21CE8DEB2CE5137C0076522F /* ProjectCollection.cpp in Sources */,
|
||||
21CE8DEC2CE5137C0076522F /* GetIsDevMode.cpp in Sources */,
|
||||
@@ -3594,7 +3644,9 @@
|
||||
21CE8E012CE5137C0076522F /* ConnectorProject.cpp in Sources */,
|
||||
21CE8E022CE5137C0076522F /* SendObject.cpp in Sources */,
|
||||
21CE8E032CE5137C0076522F /* OpenUrl.cpp in Sources */,
|
||||
21CE9B832CE69A230076522F /* Receive.cpp in Sources */,
|
||||
21CE8E042CE5137C0076522F /* SayHi.cpp in Sources */,
|
||||
21CE9B8E2CE75CFC0076522F /* ElementHighlighter.cpp in Sources */,
|
||||
21CE8E052CE5137C0076522F /* FilterMover.cpp in Sources */,
|
||||
21CE8E062CE5137C0076522F /* ConnectorMenu.cpp in Sources */,
|
||||
21CE8E072CE5137C0076522F /* GetAccounts.cpp in Sources */,
|
||||
@@ -3689,6 +3741,7 @@
|
||||
"\"$(HEADER_PATH_5)/Frameworks\"",
|
||||
"\"$(HEADER_PATH_5)/Lib\"",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"-Wno-multichar",
|
||||
"-Wno-ctor-dtor-privacy",
|
||||
@@ -3753,6 +3806,7 @@
|
||||
"\"$(HEADER_PATH_5)/Frameworks\"",
|
||||
"\"$(HEADER_PATH_5)/Lib\"",
|
||||
);
|
||||
MACOSX_DEPLOYMENT_TARGET = 11.0;
|
||||
OTHER_CPLUSPLUSFLAGS = (
|
||||
"-Wno-multichar",
|
||||
"-Wno-ctor-dtor-privacy",
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+3
-3
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -16,7 +16,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "21CE8DD22CE5137C0076522F"
|
||||
BuildableName = "Connector-AC28-EN-GB.bundle"
|
||||
BuildableName = "Speckle Connector.bundle"
|
||||
BlueprintName = "Connector-AC28-EN-GB"
|
||||
ReferencedContainer = "container:Connector.xcodeproj">
|
||||
</BuildableReference>
|
||||
@@ -55,7 +55,7 @@
|
||||
<BuildableReference
|
||||
BuildableIdentifier = "primary"
|
||||
BlueprintIdentifier = "21CE8DD22CE5137C0076522F"
|
||||
BuildableName = "Connector-AC28-EN-GB.bundle"
|
||||
BuildableName = "Speckle Connector.bundle"
|
||||
BlueprintName = "Connector-AC28-EN-GB"
|
||||
ReferencedContainer = "container:Connector.xcodeproj">
|
||||
</BuildableReference>
|
||||
|
||||
@@ -4,12 +4,21 @@
|
||||
#include "Connector/Environment/ConnectorProject.h"
|
||||
#include "Connector/Interface/ConnectorMenu.h"
|
||||
#include "Connector/Interface/ConnectorPalette.h"
|
||||
#include "Connector/Tool/ElementHighlighter.h"
|
||||
#include "Speckle/Database/AccountDatabase.h"
|
||||
#include "Speckle/Environment/Addon.h"
|
||||
#include "Speckle/Utility/String.h"
|
||||
|
||||
#include <mutex>
|
||||
|
||||
#ifdef WINDOWS
|
||||
//NB: VS is ignoring template specialisations unless they are explicitly used in the top-level project
|
||||
#include "Active/Setting/Values/GuidValue.h"
|
||||
#include "Active/Setting/Values/TimeValue.h"
|
||||
#include "Active/Setting/Values/StringValue.h"
|
||||
using namespace active::setting;
|
||||
#endif
|
||||
|
||||
using namespace active::file;
|
||||
using namespace active::environment;
|
||||
using namespace connector;
|
||||
@@ -42,6 +51,7 @@ namespace {
|
||||
//Define the connector UI components
|
||||
add<ConnectorMenu>();
|
||||
add<ConnectorPalette>();
|
||||
add<ElementHighlighter>();
|
||||
}
|
||||
|
||||
// MARK: Functions (const)
|
||||
@@ -84,6 +94,18 @@ namespace {
|
||||
return std::nullopt;
|
||||
return Directory{*appData, speckleDataDirName, true};
|
||||
} //getAppDataDirectory
|
||||
|
||||
#ifdef WINDOWS
|
||||
//NB: VS is ignoring template specialisations unless they are explicitly used in the top-level project
|
||||
void invokeSpecialisation() {
|
||||
StringValue stringValue;
|
||||
active::utility::String unusedString = stringValue;
|
||||
GuidValue guidValue;
|
||||
active::utility::Guid unusedGuid = guidValue;
|
||||
TimeValue timeValue;
|
||||
active::utility::Time unusedTime = timeValue;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
@@ -93,6 +115,9 @@ namespace {
|
||||
name: The add-on name
|
||||
--------------------------------------------------------------------*/
|
||||
ConnectorAddon::ConnectorAddon(const speckle::utility::String& name) : Addon{name} {
|
||||
#ifdef WINDOWS
|
||||
invokeSpecialisation();
|
||||
#endif
|
||||
} //ConnectorAddon::ConnectorAddon
|
||||
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@ enum TitleString {
|
||||
addonNameID = 1,
|
||||
addonDescriptionID,
|
||||
noStoreyID,
|
||||
showLayersID,
|
||||
};
|
||||
|
||||
|
||||
@@ -44,6 +45,7 @@ enum GeneralString {
|
||||
|
||||
//Notification strings (advice displayed in alerts)
|
||||
enum NotifyString {
|
||||
showHiddenLayersID = 1,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ Vector<ModelCard> ModelCardDatabase::getCards() const {
|
||||
|
||||
card: The card to write
|
||||
--------------------------------------------------------------------*/
|
||||
void ModelCardDatabase::write(const ModelCard& card) const {
|
||||
void ModelCardDatabase::write(ModelCard& card) const {
|
||||
m_store->write(card);
|
||||
} //ModelCardDatabase::write
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ namespace connector::database {
|
||||
Write a card to storage
|
||||
@param card The card to write
|
||||
*/
|
||||
void write(const record::ModelCard& card) const;
|
||||
void write(record::ModelCard& card) const;
|
||||
/*!
|
||||
Erase a card
|
||||
@param cardID The ID of the card to erase
|
||||
|
||||
@@ -9,10 +9,14 @@
|
||||
inline const active::utility::NameID toggleConnectorPaletteID{"toggleConnectorPalette"};
|
||||
//Identifier for event signalling the connector palette has changed (state carried with event)
|
||||
inline const active::utility::NameID reflectPaletteVisibilityID{"setConnectorMenuCheck"};
|
||||
//Identifier for event signalling the that an attached list of elements should be highlighted
|
||||
inline const active::utility::NameID setElementHighlight{"setElementHighlight"};
|
||||
|
||||
// MARK: - Event setting identities
|
||||
|
||||
//Identifier for event signalling the connector palette visibility state
|
||||
//Identifier for setting carrying a menu state
|
||||
inline const active::utility::NameID paletteVisibilityStateID{"menuCheckState"};
|
||||
//Identifier for setting carrying a list of element links
|
||||
inline const active::utility::NameID recordLinks{"recordLinks"};
|
||||
|
||||
#endif //CONNECTOR_EVENT_ID
|
||||
|
||||
@@ -29,6 +29,8 @@ void AddModel::run(const ModelCard& card) const {
|
||||
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
|
||||
if (!connectorProject)
|
||||
return;
|
||||
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr)
|
||||
modelCardDBase->write(card);
|
||||
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr) {
|
||||
auto newCard = clone(card);
|
||||
modelCardDBase->write(*newCard);
|
||||
}
|
||||
} //AddModel::run
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
#include "Active/Setting/ValueSetting.h"
|
||||
#include "Active/Setting/Values/GuidValue.h"
|
||||
#include "Active/Event/Event.h"
|
||||
#include "Connector/Interface/Browser/Bridge/Base/HighlightModel.h"
|
||||
#include "Connector/Connector.h"
|
||||
#include "Connector/ConnectorResource.h"
|
||||
#include "Connector/Environment/ConnectorProject.h"
|
||||
#include "Connector/Event/ConnectorEventID.h"
|
||||
#include "Connector/Database/ModelCardDatabase.h"
|
||||
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendError.h"
|
||||
#include "Connector/Record/Model/SenderModelCard.h"
|
||||
@@ -12,6 +16,8 @@
|
||||
#include "Speckle/Environment/Host.h"
|
||||
#include "Speckle/Environment/Project.h"
|
||||
|
||||
using namespace active::event;
|
||||
using namespace active::setting;
|
||||
using namespace connector::environment;
|
||||
using namespace connector::interfac::browser::bridge;
|
||||
using namespace connector::record;
|
||||
@@ -46,13 +52,9 @@ void HighlightModel::run(const String& modelCardID) const {
|
||||
return;
|
||||
}
|
||||
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get())) {
|
||||
auto modelCardSelection = senderCard->getFilter().getElementIDs();
|
||||
auto project = connector()->getActiveProject().lock();
|
||||
if (!project)
|
||||
return; // TODO: is this OK? should this throw?
|
||||
auto elementDatabase = project->getElementDatabase();
|
||||
elementDatabase->clearSelection();
|
||||
elementDatabase->setSelection(modelCardSelection);
|
||||
host()->zoomToFit(true);
|
||||
ValueSetting elementIDs{recordLinks};
|
||||
for (const auto& elementID : senderCard->getFilter().getElementIDs())
|
||||
elementIDs.emplace_back(GuidValue{elementID});
|
||||
connector()->publish(Event{setElementHighlight, { elementIDs }});
|
||||
}
|
||||
} //HighlightModel::run
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
#include "Connector/Interface/Browser/Bridge/Base/HighlightObjects.h"
|
||||
|
||||
#include "Active/Setting/ValueSetting.h"
|
||||
#include "Active/Event/Event.h"
|
||||
#include "Connector/Connector.h"
|
||||
#include "Connector/Environment/ConnectorProject.h"
|
||||
#include "Speckle/Database/BIMElementDatabase.h"
|
||||
#include "Speckle/Environment/Host.h"
|
||||
#include "Speckle/Environment/Project.h"
|
||||
#include "Connector/Event/ConnectorEventID.h"
|
||||
|
||||
using namespace connector::environment;
|
||||
using namespace active::event;
|
||||
using namespace active::setting;
|
||||
using namespace connector;
|
||||
using namespace connector::interfac::browser::bridge;
|
||||
using namespace speckle::database;
|
||||
using namespace speckle::environment;
|
||||
@@ -26,18 +27,5 @@ HighlightObjects::HighlightObjects() : BridgeMethod{"HighlightObjects", [&](cons
|
||||
objectIDs: List of object IDs to be highlighted
|
||||
--------------------------------------------------------------------*/
|
||||
void HighlightObjects::run(const StringList& objectIDs) const {
|
||||
BIMLinkList objectSelection;
|
||||
for (const auto& text : objectIDs)
|
||||
if (Guid guid{text}; !guid.empty())
|
||||
objectSelection.emplace_back(guid);
|
||||
if (objectSelection.empty())
|
||||
return;
|
||||
auto project = connector()->getActiveProject().lock();
|
||||
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
|
||||
if (!connectorProject)
|
||||
return;
|
||||
auto elementDatabase = project->getElementDatabase();
|
||||
elementDatabase->clearSelection();
|
||||
elementDatabase->setSelection(objectSelection);
|
||||
host()->zoomToFit(true);
|
||||
connector()->publish(Event{setElementHighlight, { ValueSetting{objectIDs, recordLinks} }});
|
||||
} //HighlightObjects::run
|
||||
|
||||
@@ -36,6 +36,8 @@ void UpdateModel::run(const ModelCard& card) const {
|
||||
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
|
||||
if (!connectorProject)
|
||||
return;
|
||||
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr)
|
||||
modelCardDBase->write(card);
|
||||
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr) {
|
||||
auto newCard = clone(card);
|
||||
modelCardDBase->write(*newCard);
|
||||
}
|
||||
} //UpdateModel::run
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
#include "Connector/Interface/Browser/Bridge/Receive/Receive.h"
|
||||
|
||||
#include "Active/Serialise/CargoHold.h"
|
||||
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
|
||||
#include "Connector/Connector.h"
|
||||
#include "Connector/ConnectorResource.h"
|
||||
#include "Connector/Database/ModelCardDatabase.h"
|
||||
#include "Connector/Environment/ConnectorProject.h"
|
||||
#include "Connector/Record/Collection/ProjectCollection.h"
|
||||
#include "Connector/Record/Model/ReceiverModelCard.h"
|
||||
#include "Speckle/Database/AccountDatabase.h"
|
||||
#include "Speckle/Database/BIMElementDatabase.h"
|
||||
#include "Speckle/Database/Content/BIMRecord.h"
|
||||
#include "Speckle/Environment/Project.h"
|
||||
#include "Speckle/Environment/Host.h"
|
||||
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
|
||||
#include "Speckle/Record/Credentials/Account.h"
|
||||
#include "Speckle/Record/Element/Element.h"
|
||||
#include "Speckle/Serialise/Detached/Storage/DetachedMemoryStore.h"
|
||||
#include "Speckle/Utility/Exception.h"
|
||||
|
||||
using namespace active::serialise;
|
||||
using namespace connector::environment;
|
||||
using namespace connector::interfac::browser::bridge;
|
||||
using namespace connector::record;
|
||||
using namespace speckle::database;
|
||||
using namespace speckle::environment;
|
||||
using namespace speckle::record::element;
|
||||
using namespace speckle::serialise;
|
||||
using namespace speckle::utility;
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Default constructor
|
||||
--------------------------------------------------------------------*/
|
||||
Receive::Receive() : BridgeMethod{"Receive", [&](const ReceiveArgs& args) {
|
||||
run(args);
|
||||
}} {}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Receive a specified model
|
||||
|
||||
modelCardID: The ID of the model card identifying the objects to receive
|
||||
--------------------------------------------------------------------*/
|
||||
void Receive::run(const String& modelCardID) const {
|
||||
} //Receive::run
|
||||
@@ -0,0 +1,39 @@
|
||||
#ifndef CONNECTOR_INTERFACE_BRIDGE_RECEIVE
|
||||
#define CONNECTOR_INTERFACE_BRIDGE_RECEIVE
|
||||
|
||||
#include "Active/Serialise/CargoHold.h"
|
||||
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
|
||||
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
|
||||
|
||||
namespace connector::interfac::browser::bridge {
|
||||
|
||||
///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 ReceiveArgs = speckle::interfac::browser::bridge::JSArgType<StringHold>;
|
||||
|
||||
/*!
|
||||
JS Function class to receive a specified model
|
||||
*/
|
||||
class Receive : public speckle::interfac::browser::bridge::BridgeMethod<ReceiveArgs, void> {
|
||||
public:
|
||||
|
||||
// MARK: - Constructors
|
||||
|
||||
/*!
|
||||
Constructor
|
||||
*/
|
||||
Receive();
|
||||
|
||||
// MARK: - Functions (const)
|
||||
|
||||
/*!
|
||||
Receive a specified model
|
||||
@param modelCardID The ID of the model card identifying the objects to receive
|
||||
*/
|
||||
void run(const speckle::utility::String& modelCardID) const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //CONNECTOR_INTERFACE_BRIDGE_RECEIVE
|
||||
@@ -0,0 +1,30 @@
|
||||
#include "Connector/Interface/Browser/Bridge/Receive/ReceiveBridge.h"
|
||||
#include "Connector/Interface/Browser/Bridge/Receive/Receive.h"
|
||||
#include "Connector/Connector.h"
|
||||
#include "Connector/ConnectorResource.h"
|
||||
#include "Connector/Database/ModelCardDatabase.h"
|
||||
#include "Connector/Environment/ConnectorProject.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/ReceiverModelCard.h"
|
||||
|
||||
using namespace speckle::database;
|
||||
using namespace connector::environment;
|
||||
using namespace connector::interfac::browser::bridge;
|
||||
using namespace speckle::utility;
|
||||
using namespace speckle::event;
|
||||
using namespace active::serialise;
|
||||
using namespace connector::record;
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Default constructor
|
||||
--------------------------------------------------------------------*/
|
||||
ReceiveBridge::ReceiveBridge() : BrowserBridge{"receiveBinding"} {
|
||||
//Add bridge methods
|
||||
addMethod<Receive>();
|
||||
} //ReceiveBridge::ReceiveBridge
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef CONNECTOR_INTERFACE_BRIDGE_RECEIVE_BRIDGE
|
||||
#define CONNECTOR_INTERFACE_BRIDGE_RECEIVE_BRIDGE
|
||||
|
||||
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
|
||||
|
||||
namespace connector::interfac::browser::bridge {
|
||||
|
||||
/*!
|
||||
A browser bridge to support receiving model data from a Speckle server
|
||||
*/
|
||||
class ReceiveBridge : public speckle::interfac::browser::bridge::BrowserBridge {
|
||||
public:
|
||||
|
||||
// MARK: - Types
|
||||
|
||||
using base = speckle::interfac::browser::bridge::BrowserBridge;
|
||||
|
||||
// MARK: - Constructors
|
||||
|
||||
using base::base;
|
||||
/*!
|
||||
Default constructor
|
||||
*/
|
||||
ReceiveBridge();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //CONNECTOR_INTERFACE_BRIDGE_RECEIVE_BRIDGE
|
||||
@@ -24,7 +24,7 @@ SelectionBridge::SelectionBridge() : BrowserBridge{"selectionBinding"} {
|
||||
--------------------------------------------------------------------*/
|
||||
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));
|
||||
auto wrapped = std::make_unique<CargoHold<PackageWrap, SelectionInfo>>(std::move(selectionInfo));
|
||||
sendEvent("setSelection", std::move(wrapped));
|
||||
return true;
|
||||
} //SelectionBridge::handle
|
||||
|
||||
@@ -76,7 +76,7 @@ void Send::run(const String& modelCardID) const {
|
||||
}
|
||||
//Get the selected elements from the modelcard
|
||||
auto elementDatabase = project->getElementDatabase();
|
||||
ElementIDList selected{};
|
||||
BIMRecordIDList selected{};
|
||||
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get()))
|
||||
selected = senderCard->getFilter().getElementIDs();
|
||||
//Build a collection from the selected elements
|
||||
|
||||
@@ -59,10 +59,9 @@ bool SendBridge::handle(const ElementEvent& event) {
|
||||
// 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()) {
|
||||
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get()); senderCard) {
|
||||
for (const auto& recordID : m_changedElements) {
|
||||
if (senderCard->contains(recordID)) {
|
||||
expiredModelCardIds.push_back(modelCard->getID());
|
||||
break;
|
||||
}
|
||||
@@ -76,8 +75,8 @@ bool SendBridge::handle(const ElementEvent& event) {
|
||||
break;
|
||||
}
|
||||
case changeElem: case editElem: case deleteElem: {
|
||||
if (event.getElmentID())
|
||||
m_changedElements.push_back(*event.getElmentID());
|
||||
if (event.getElementID())
|
||||
m_changedElements.insert(*event.getElementID());
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
||||
@@ -31,6 +31,10 @@ namespace connector::interfac::browser::bridge {
|
||||
@return True if the event should be closed
|
||||
*/
|
||||
bool handle(const speckle::event::ElementEvent& event) override;
|
||||
|
||||
private:
|
||||
///List of changed element IDs
|
||||
speckle::database::BIMRecordIDList m_changedElements;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#include "Connector/Interface/Browser/Bridge/Account/AccountBridge.h"
|
||||
#include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h"
|
||||
#include "Connector/Interface/Browser/Bridge/Config/ConfigBridge.h"
|
||||
#include "Connector/Interface/Browser/Bridge/Receive/ReceiveBridge.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"
|
||||
@@ -213,6 +214,7 @@ BrowserPalette::BrowserPalette() :
|
||||
}
|
||||
}
|
||||
install<ConfigBridge>();
|
||||
install<ReceiveBridge>();
|
||||
if (auto ref = install<SendBridge>(); ref) {
|
||||
if (auto sendBridgeRef = std::dynamic_pointer_cast<SendBridge>(ref); sendBridgeRef) {
|
||||
connector::connector()->addWeak(sendBridgeRef);
|
||||
|
||||
@@ -56,7 +56,7 @@ Cargo::Unique DirectSelectionSendFilter::getCargo(const Inventory::Item& item) c
|
||||
using namespace active::serialise;
|
||||
switch (item.index) {
|
||||
case selectedElemID:
|
||||
return std::make_unique<ContainerWrap<ElementIDList>>(m_selectedElements, false, fieldID[selectedElemID].name);
|
||||
return std::make_unique<ContainerWrap<BIMRecordIDList>>(m_selectedElements, false, fieldID[selectedElemID].name);
|
||||
default:
|
||||
return nullptr; //Requested an unknown index
|
||||
}
|
||||
|
||||
@@ -32,11 +32,17 @@ namespace connector::record {
|
||||
|
||||
// MARK: - Functions (const)
|
||||
|
||||
/*!
|
||||
Determine if the send filter contains a specified record ID
|
||||
@param recordID The record ID to search for
|
||||
@return True if the filter contains the record ID
|
||||
*/
|
||||
virtual bool contains(const speckle::database::BIMRecordID& recordID) const override { return m_selectedElements.contains(recordID); }
|
||||
/*!
|
||||
Get the filtered element IDs
|
||||
@return The filter elements
|
||||
*/
|
||||
const speckle::database::ElementIDList& getElementIDs() const override { return m_selectedElements; }
|
||||
const speckle::database::BIMRecordIDList& getElementIDs() const override { return m_selectedElements; }
|
||||
|
||||
// MARK: - Serialisation
|
||||
|
||||
@@ -59,7 +65,7 @@ namespace connector::record {
|
||||
|
||||
private:
|
||||
///A list of selected element IDs
|
||||
speckle::database::ElementIDList m_selectedElements;
|
||||
speckle::database::BIMRecordIDList m_selectedElements;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -58,7 +58,7 @@ Cargo::Unique EverythingSendFilter::getCargo(const Inventory::Item& item) const
|
||||
using namespace active::serialise;
|
||||
switch (item.index) {
|
||||
case selectedElemID:
|
||||
return std::make_unique<ContainerWrap<ElementIDList>>(m_emptyList);
|
||||
return std::make_unique<ContainerWrap<BIMRecordIDList>>(m_emptyList);
|
||||
default:
|
||||
return nullptr; //Requested an unknown index
|
||||
}
|
||||
|
||||
@@ -32,17 +32,23 @@ namespace connector::record {
|
||||
|
||||
// MARK: - Functions (const)
|
||||
|
||||
/*!
|
||||
Determine if the send filter contains a specified record ID
|
||||
@param recordID The record ID to search for
|
||||
@return True if the filter contains the record ID
|
||||
*/
|
||||
virtual bool contains(const speckle::database::BIMRecordID& recordID) const override { return true; }
|
||||
/*!
|
||||
Get the filtered element IDs
|
||||
@return The filter elements
|
||||
*/
|
||||
const speckle::database::ElementIDList& getElementIDs() const override { return m_emptyList; }
|
||||
const speckle::database::BIMRecordIDList& getElementIDs() const override { return m_emptyList; }
|
||||
/*!
|
||||
Determine if the filter has expired because an element in the selection has changed
|
||||
@param changed The list of changed element IDs
|
||||
@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 speckle::database::BIMRecordIDList& changed) const override { return true; }
|
||||
|
||||
// MARK: - Serialisation
|
||||
|
||||
@@ -65,7 +71,7 @@ namespace connector::record {
|
||||
|
||||
private:
|
||||
///Enables a const empty list to be returned
|
||||
speckle::database::ElementIDList m_emptyList;
|
||||
speckle::database::BIMRecordIDList m_emptyList;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -34,12 +34,10 @@ namespace {
|
||||
|
||||
return: True if the one of the changed elements is in the selection
|
||||
--------------------------------------------------------------------*/
|
||||
bool SendFilter::checkExpiry(const ElementIDList& changed) const {
|
||||
ElementIDList intersect;
|
||||
ElementIDList mine{getElementIDs()}, theirs{changed};
|
||||
std::sort(mine.begin(), mine.end());
|
||||
std::sort(theirs.begin(), theirs.end());
|
||||
std::set_intersection (mine.begin(), mine.end(), theirs.begin(), theirs.end(), std::back_inserter(intersect));
|
||||
bool SendFilter::checkExpiry(const BIMRecordIDList& changed) const {
|
||||
BIMRecordIDList intersect;
|
||||
BIMRecordIDList mine{getElementIDs()}, theirs{changed};
|
||||
std::set_intersection(mine.begin(), mine.end(), theirs.begin(), theirs.end(), std::inserter(intersect, intersect.begin()));
|
||||
return !intersect.empty();
|
||||
} //SendFilter::checkExpiry
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "Active/Serialise/Package/Package.h"
|
||||
#include "Active/Utility/Cloner.h"
|
||||
#include "Speckle/Database/Identity/RecordID.h"
|
||||
#include "Speckle/Database/Identity/BIMRecordID.h"
|
||||
#include "Speckle/Utility/String.h"
|
||||
|
||||
namespace connector::record {
|
||||
@@ -55,17 +56,23 @@ namespace connector::record {
|
||||
@return True if this is the default filter
|
||||
*/
|
||||
bool isDefault() const { return m_isDefault; };
|
||||
/*!
|
||||
Determine if the send filter contains a specified record ID
|
||||
@param recordID The record ID to search for
|
||||
@return True if the filter contains the record ID
|
||||
*/
|
||||
virtual bool contains(const speckle::database::BIMRecordID& recordID) const = 0;
|
||||
/*!
|
||||
Get the filtered element IDs
|
||||
@return The filter elements
|
||||
*/
|
||||
virtual const speckle::database::ElementIDList& getElementIDs() const = 0;
|
||||
virtual const speckle::database::BIMRecordIDList& getElementIDs() const = 0;
|
||||
/*!
|
||||
Determine if the filter has expired because an element in the selection has changed
|
||||
@param changed The list of changed element IDs
|
||||
@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 speckle::database::BIMRecordIDList& changed) const;
|
||||
|
||||
// MARK: - Serialisation
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
|
||||
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
|
||||
#include "Speckle/Database/Identity/BIMRecordID.h"
|
||||
|
||||
#include <array>
|
||||
|
||||
@@ -81,7 +82,7 @@ Cargo::Unique ReceiverModelCard::getCargo(const Inventory::Item& item) const {
|
||||
case warningDismissedID:
|
||||
return std::make_unique<BoolWrap>(m_hasDismissedUpdateWarning);
|
||||
case bakedObjectsID:
|
||||
return std::make_unique<ContainerWrap<ElementIDList>>(m_bakedObjectIDs);
|
||||
return std::make_unique<ContainerWrap<BIMRecordIDList>>(m_bakedObjectIDs);
|
||||
default:
|
||||
return nullptr; //Requested an unknown index
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#ifndef CONNECTOR_RECORD_RECEIVER_MODEL_CARD
|
||||
#define CONNECTOR_RECORD_RECEIVER_MODEL_CARD
|
||||
|
||||
#include "Speckle/Database/Identity/RecordID.h"
|
||||
#include "Speckle/Database/Identity/BIMRecordID.h"
|
||||
#include "Connector/Record/Model/ModelCard.h"
|
||||
|
||||
namespace connector::record {
|
||||
@@ -37,7 +37,7 @@ namespace connector::record {
|
||||
const speckle::database::RecordID& modelID, const speckle::utility::String& modelName,
|
||||
const speckle::database::RecordID& selectedVersion, const speckle::database::RecordID& latestVersion,
|
||||
const speckle::database::RecordID& accountID, const speckle::utility::String& serverURL,
|
||||
bool hasDimissedWarning, speckle::database::ElementIDList&& bakedObjects, const SettingList& settings) :
|
||||
bool hasDimissedWarning, speckle::database::BIMRecordIDList&& bakedObjects, const SettingList& settings) :
|
||||
ModelCard{modelID, projectID, accountID, serverURL, settings},
|
||||
m_projectName{projectName}, m_modelName{modelName}, m_selectedVersionID{selectedVersion}, m_latestVersionID{latestVersion},
|
||||
m_hasDismissedUpdateWarning{hasDimissedWarning}, m_bakedObjectIDs{bakedObjects} {}
|
||||
@@ -78,7 +78,7 @@ namespace connector::record {
|
||||
Get the IDs of objects accepted in the receive
|
||||
@return The accepted object IDs
|
||||
*/
|
||||
const speckle::database::ElementIDList& getBakedObjectIDs() const { return m_bakedObjectIDs; }
|
||||
const speckle::database::BIMRecordIDList& getBakedObjectIDs() const { return m_bakedObjectIDs; }
|
||||
|
||||
// MARK: - Serialisation
|
||||
|
||||
@@ -111,7 +111,7 @@ namespace connector::record {
|
||||
///True if the user has already dismissed an alert to update
|
||||
bool m_hasDismissedUpdateWarning = false;
|
||||
///IDs of objects accepted in the receive
|
||||
speckle::database::ElementIDList m_bakedObjectIDs;
|
||||
speckle::database::BIMRecordIDList m_bakedObjectIDs;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -61,6 +61,18 @@ SenderModelCard::~SenderModelCard() {
|
||||
} //SenderModelCard::~SenderModelCard
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Determine if the send filter contains a specified record ID
|
||||
|
||||
recordID: The record ID to search for
|
||||
|
||||
return: True if the filter contains the record ID
|
||||
--------------------------------------------------------------------*/
|
||||
bool SenderModelCard::contains(const speckle::database::BIMRecordID& recordID) const {
|
||||
return m_filter->contains(recordID);
|
||||
} //SenderModelCard::contains
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Fill an inventory with the package items
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#define CONNECTOR_RECORD_SENDER_MODEL_CARD
|
||||
|
||||
#include "Connector/Record/Model/ModelCard.h"
|
||||
#include "Speckle/Database/Identity/BIMRecordID.h"
|
||||
|
||||
namespace connector::record {
|
||||
|
||||
@@ -46,6 +47,12 @@ namespace connector::record {
|
||||
|
||||
// MARK: - Functions (const)
|
||||
|
||||
/*!
|
||||
Determine if the send filter contains a specified record ID
|
||||
@param recordID The record ID to search for
|
||||
@return True if the filter contains the record ID
|
||||
*/
|
||||
bool contains(const speckle::database::BIMRecordID& recordID) const;
|
||||
/*!
|
||||
Get the filter applied when the model was sent
|
||||
@return The model filter
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
#include "Connector/Tool/ElementHighlighter.h"
|
||||
|
||||
#include "Active/Database/Transaction.h"
|
||||
#include "Active/Event/Event.h"
|
||||
#include "Connector/Connector.h"
|
||||
#include "Connector/ConnectorResource.h"
|
||||
#include "Connector/Environment/ConnectorProject.h"
|
||||
#include "Connector/Event/ConnectorEventID.h"
|
||||
#include "Speckle/Database/BIMAttributeDatabase.h"
|
||||
#include "Speckle/Database/BIMElementDatabase.h"
|
||||
#include "Speckle/Database/Identity/BIMLink.h"
|
||||
#include "Speckle/Environment/Host.h"
|
||||
#include "Speckle/Record/Filter/ElementVisibilityCollector.h"
|
||||
#include "Speckle/Utility/Guid.h"
|
||||
|
||||
using namespace active::database;
|
||||
using namespace active::event;
|
||||
using namespace active::setting;
|
||||
using namespace connector;
|
||||
using namespace connector::environment;
|
||||
using namespace speckle::database;
|
||||
using namespace speckle::environment;
|
||||
using namespace speckle::record;
|
||||
using namespace speckle::utility;
|
||||
|
||||
namespace {
|
||||
|
||||
/*!
|
||||
Transaction to make a selection of layers visible
|
||||
*/
|
||||
class ShowLayers : public Transaction {
|
||||
public:
|
||||
/*!
|
||||
Constructor
|
||||
@param project The target project
|
||||
@param layers The layers in the project to be made visible
|
||||
*/
|
||||
ShowLayers(Project::Shared project, ElementVisibilityCollector::Layers& layers) :
|
||||
Transaction{connector::connector()->getLocalString(titleString, showLayersID)}, m_project{project}, m_layers{layers} {}
|
||||
|
||||
protected:
|
||||
|
||||
//MARK: - Functions (App management)
|
||||
|
||||
/*!
|
||||
Perform the transaction. Database writes can be performed. NB: this function is not called if the prepare phase was unsuccessful)
|
||||
@return True if the transaction was successfully performed
|
||||
*/
|
||||
bool perform() override {
|
||||
auto attributeDatabase = m_project->getAttributeDatabase();
|
||||
for (auto& layer : m_layers) {
|
||||
if (layer.second.isHidden()) {
|
||||
layer.second.setHidden(false);
|
||||
attributeDatabase->write(layer.second);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private:
|
||||
///The target project for showing layers
|
||||
Project::Shared m_project;
|
||||
///The layers to be made visible
|
||||
ElementVisibilityCollector::Layers& m_layers;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the event subscription list
|
||||
|
||||
return: The subscription list (an empty list will put the subscriber into a suspended state)
|
||||
--------------------------------------------------------------------*/
|
||||
Subscriber::Subscription ElementHighlighter::subscription() const {
|
||||
return Subscription{setElementHighlight};
|
||||
} //ElementHighlighter::subscription
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Receive a subscribed event
|
||||
|
||||
event: The incoming event
|
||||
|
||||
return: True if the event should be closed
|
||||
--------------------------------------------------------------------*/
|
||||
bool ElementHighlighter::receive(const active::event::Event& event) {
|
||||
//Collect the IDs of elements to be highlighted
|
||||
ValueSetting* elementIDs = nullptr;
|
||||
if (elementIDs = event.findValue(recordLinks); elementIDs == nullptr)
|
||||
return false;
|
||||
BIMLinkList elementSelection;
|
||||
for (const auto& value : *elementIDs)
|
||||
if (Guid guid{value->operator active::utility::Guid()}; guid)
|
||||
elementSelection.emplace_back(guid);
|
||||
if (elementSelection.empty())
|
||||
return false;
|
||||
auto project = connector()->getActiveProject().lock();
|
||||
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
|
||||
if (!connectorProject)
|
||||
return false;
|
||||
auto elementDatabase = project->getElementDatabase();
|
||||
//Collect the layers assigned to the model card elements
|
||||
ElementVisibilityCollector collector;
|
||||
BIMElementDatabase::Filter filter = [&collector](const speckle::record::element::Element& elem) { return collector(elem); };
|
||||
elementDatabase->findElements(&filter, elementSelection);
|
||||
//If any collected layers are hidden, the useer is prompted to show them (otherwise they may see nothing happen when a model card is clicked)
|
||||
for (const auto& layer : collector.getLayers()) {
|
||||
if (layer.second.isHidden()) {
|
||||
//If a hidden layer is found, ask the user before taking any action
|
||||
if (host()->displayConfirmation(addon()->getLocalString(notifyString, showHiddenLayersID))) {
|
||||
//Run a transaction to ensure all layers are visible
|
||||
ShowLayers showLayers{project, collector.getLayers()};
|
||||
connector()->makeTransaction(showLayers);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
host()->makeModelViewActive();
|
||||
elementDatabase->clearSelection();
|
||||
elementDatabase->setSelection(elementSelection);
|
||||
host()->zoomToFit(true);
|
||||
return false;
|
||||
} //ElementHighlighter::receive
|
||||
@@ -0,0 +1,28 @@
|
||||
#ifndef CONNECTOR_ELEMENT_HIGHLIGHTER
|
||||
#define CONNECTOR_ELEMENT_HIGHLIGHTER
|
||||
|
||||
#include "Active/Event/Subscriber.h"
|
||||
|
||||
namespace connector {
|
||||
|
||||
class ElementHighlighter : public active::event::Subscriber {
|
||||
public:
|
||||
/*!
|
||||
Get the event subscription list
|
||||
@return The subscription list (an empty list will put the subscriber into a suspended state)
|
||||
*/
|
||||
Subscription subscription() const override;
|
||||
|
||||
// MARK: - Functions (mutating)
|
||||
|
||||
/*!
|
||||
Receive a subscribed event
|
||||
@param event The incoming event
|
||||
@return True if the event should be closed
|
||||
*/
|
||||
bool receive(const active::event::Event& event) override;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //CONNECTOR_ELEMENT_HIGHLIGHTER
|
||||
@@ -2,8 +2,15 @@
|
||||
/* [ 1] */ "Speckle Connector"
|
||||
/* [ 2] */ "Connector to share model content with Speckle"
|
||||
/* [ 3] */ "No level"
|
||||
/* [ 4] */ "Show Layers"
|
||||
}
|
||||
|
||||
|
||||
'STR#' 32602 "Notify strings" {
|
||||
/* [ 1] */ "Some elements published with the selected model card are on hidden layers - do you wish to make these layers visible?"
|
||||
}
|
||||
|
||||
|
||||
'STR#' 32604 "Error strings" {
|
||||
/* [ 1] */ "No objects were found to convert. Please update your publish filter!"
|
||||
/* [ 2] */ "The specified model card cannot be found. Try another card or create a new one"
|
||||
|
||||
@@ -2,4 +2,9 @@
|
||||
/* [ 1] */ "Untitled"
|
||||
/* [ 2] */ "Unknown"
|
||||
/* [ 3] */ "Converting elements"
|
||||
/* [ 4] */ "Notification"
|
||||
/* [ 5] */ "Confirm"
|
||||
/* [ 6] */ "Yes"
|
||||
/* [ 7] */ "No"
|
||||
/* [ 8] */ "OK"
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ namespace speckle::database {
|
||||
|
||||
///Attribute database engine declaration
|
||||
class BIMAttributeDatabase::Engine : public AttributeDatabaseEngine {
|
||||
using base = ArchicadAttributeDBaseEngine;
|
||||
using base = AttributeDatabaseEngine;
|
||||
using base::base;
|
||||
};
|
||||
|
||||
@@ -102,7 +102,7 @@ Vector<Attribute> BIMAttributeDatabase::getAttributes() const {
|
||||
|
||||
attribute: The attribute to write
|
||||
--------------------------------------------------------------------*/
|
||||
void BIMAttributeDatabase::write(const Attribute& attribute) const {
|
||||
void BIMAttributeDatabase::write(Attribute& attribute) const {
|
||||
m_store->write(attribute);
|
||||
} //BIMAttributeDatabase::write
|
||||
|
||||
|
||||
@@ -55,7 +55,7 @@ namespace speckle::database {
|
||||
Write an attribute to storage
|
||||
@param attribute The attribute to write
|
||||
*/
|
||||
void write(const record::attribute::Attribute& attribute) const;
|
||||
void write(record::attribute::Attribute& attribute) const;
|
||||
/*!
|
||||
Erase an attribute
|
||||
@param attributeID The ID of the attribute to erase
|
||||
|
||||
@@ -148,14 +148,15 @@ void BIMElementDatabase::clearSelection() const {
|
||||
Find a filtered list of objects
|
||||
|
||||
filter: The object filter (nullptr = find all objects)
|
||||
subset: A subset of the database content to search (specified by record ID)
|
||||
tableID: Optional table ID (defaults to the first table)
|
||||
documentID: Optional document ID (filter for this document only - nullopt = all objects)
|
||||
|
||||
return: A list containing IDs of found elements (empty if none found)
|
||||
--------------------------------------------------------------------*/
|
||||
BIMRecordIDList BIMElementDatabase::findElements(const Filter& filter, std::optional<BIMRecordID> tableID,
|
||||
std::optional<BIMRecordID> documentID) const {
|
||||
return m_engine->findObjects(filter, tableID, documentID);
|
||||
BIMRecordIDList BIMElementDatabase::findElements(const Filter* filter, const BIMRecordIDList& subset, std::optional<BIMRecordID> tableID,
|
||||
std::optional<BIMRecordID> documentID) const {
|
||||
return m_engine->findObjects(filter, subset, tableID, documentID);
|
||||
} //BIMElementDatabase::findElements
|
||||
|
||||
|
||||
@@ -212,7 +213,7 @@ Memo::Unique BIMElementDatabase::getMemo(const BIMRecordID& elementID, Part::fil
|
||||
|
||||
element: The element to write
|
||||
--------------------------------------------------------------------*/
|
||||
void BIMElementDatabase::write(const Element& element) const {
|
||||
void BIMElementDatabase::write(Element& element) const {
|
||||
m_store->write(element);
|
||||
} //BIMElementDatabase::write
|
||||
|
||||
|
||||
@@ -74,12 +74,13 @@ namespace speckle::database {
|
||||
/*!
|
||||
Find a filtered list of objects
|
||||
@param filter The object filter (nullptr = find all objects)
|
||||
@param subset A subset of the database content to search (specified by record ID)
|
||||
@param tableID Optional table ID (defaults to the first table)
|
||||
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
|
||||
@return A list containing IDs of found elements (empty if none found)
|
||||
*/
|
||||
BIMRecordIDList findElements(const Filter& filter = nullptr, std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
std::optional<BIMRecordID> documentID = std::nullopt) const;
|
||||
BIMRecordIDList findElements(const Filter* filter = nullptr, const BIMRecordIDList& subset = {},
|
||||
std::optional<BIMRecordID> tableID = std::nullopt, std::optional<BIMRecordID> documentID = std::nullopt) const;
|
||||
/*!
|
||||
Get a specified element
|
||||
@param elementID The ID of the target element
|
||||
@@ -114,7 +115,7 @@ namespace speckle::database {
|
||||
Write an element to storage
|
||||
@param element The element to write
|
||||
*/
|
||||
void write(const record::element::Element& element) const;
|
||||
void write(record::element::Element& element) const;
|
||||
/*!
|
||||
Erase an element
|
||||
@param elementID The ID of the element to erase
|
||||
|
||||
@@ -114,7 +114,7 @@ Vector<Group> BIMGroupDatabase::getGroups() const {
|
||||
|
||||
group: The group to write
|
||||
--------------------------------------------------------------------*/
|
||||
void BIMGroupDatabase::write(const Group& group) const {
|
||||
void BIMGroupDatabase::write(Group& group) const {
|
||||
m_store->write(group);
|
||||
} //BIMGroupDatabase::write
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ namespace speckle::database {
|
||||
Write an group to storage
|
||||
@param group The group to write
|
||||
*/
|
||||
void write(const record::property::Group& group) const;
|
||||
void write(record::property::Group& group) const;
|
||||
/*!
|
||||
Erase an group
|
||||
@param groupID The ID of the group to erase
|
||||
|
||||
@@ -126,7 +126,7 @@ std::vector<std::shared_ptr<Template>> BIMPropertyDatabase::findTemplatesByClass
|
||||
|
||||
property: The property to write
|
||||
--------------------------------------------------------------------*/
|
||||
void BIMPropertyDatabase::write(const Template& property) const {
|
||||
void BIMPropertyDatabase::write(Template& property) const {
|
||||
m_store->write(property);
|
||||
} //BIMPropertyDatabase::write
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ namespace speckle::database {
|
||||
Write an property to storage
|
||||
@param property The property to write
|
||||
*/
|
||||
void write(const record::property::Template& property) const;
|
||||
void write(record::property::Template& property) const;
|
||||
/*!
|
||||
Erase an property
|
||||
@param propertyID The ID of the property to erase
|
||||
|
||||
@@ -13,9 +13,28 @@ using namespace speckle::utility;
|
||||
BIMLink::BIMLink(const API_Neig& selected, const BIMRecordID& tableID) : base{Guid{selected.guid}, tableID} {
|
||||
//More info should be extracted from API_Neig in future (as required) - extract into link settings, e.g. selection target etc
|
||||
} //Link::Link
|
||||
#endif
|
||||
|
||||
BIMLinkList::BIMLinkList(const ElementIDList& elementIDList) {
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Constructor
|
||||
|
||||
elementIDList: BIM record IDs to populate the links
|
||||
--------------------------------------------------------------------*/
|
||||
BIMLinkList::BIMLinkList(const BIMRecordIDList& elementIDList) {
|
||||
for (const auto& id : elementIDList)
|
||||
push_back(id);
|
||||
}
|
||||
#endif
|
||||
} //BIMLinkList::BIMLinkList
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Conversion operator
|
||||
|
||||
return: A list of BIM record IDs from this list
|
||||
--------------------------------------------------------------------*/
|
||||
BIMLinkList::operator BIMRecordIDList() const {
|
||||
BIMRecordIDList result;
|
||||
for (const auto& link : *this)
|
||||
result.insert(BIMRecordID{link});
|
||||
return result;
|
||||
} //BIMLinkList::operator BIMRecordIDList
|
||||
|
||||
@@ -41,18 +41,35 @@ namespace speckle::database {
|
||||
#endif
|
||||
};
|
||||
|
||||
//A list of links to BIM records
|
||||
//using BIMLinkList = std::vector<BIMLink>;
|
||||
/*!
|
||||
A list of links to BIM records
|
||||
*/
|
||||
class BIMLinkList : public std::vector<BIMLink> {
|
||||
public:
|
||||
|
||||
|
||||
// MARK: - Types
|
||||
|
||||
using base = std::vector<BIMLink>;
|
||||
|
||||
|
||||
// MARK: - Constructors
|
||||
|
||||
using base::base;
|
||||
|
||||
BIMLinkList() = default;
|
||||
|
||||
BIMLinkList(const ElementIDList& elementIDList);
|
||||
/*!
|
||||
Constructor
|
||||
@param elementIDList BIM record IDs to populate the links
|
||||
*/
|
||||
BIMLinkList(const BIMRecordIDList& elementIDList);
|
||||
|
||||
// MARK: - Operators
|
||||
|
||||
/*!
|
||||
Conversion operator
|
||||
@return A list of BIM record IDs from this list
|
||||
*/
|
||||
operator BIMRecordIDList() const;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -15,12 +15,6 @@ namespace speckle::database {
|
||||
|
||||
//A list of record IDs
|
||||
using RecordIDList = std::vector<RecordID>;
|
||||
|
||||
//BIM element record identifier
|
||||
using ElementID = speckle::utility::Guid;
|
||||
|
||||
//A list of element IDs
|
||||
using ElementIDList = std::vector<ElementID>;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace {
|
||||
|
||||
return: An equivalent status code
|
||||
--------------------------------------------------------------------*/
|
||||
ArchicadDBaseCore::Status convertArchicadError(long acErrorCode) {
|
||||
ArchicadDBaseCore::Status convertArchicadError(GSErrCode acErrorCode) {
|
||||
using enum ArchicadDBaseCore::Status;
|
||||
switch (acErrorCode) {
|
||||
case NoError:
|
||||
@@ -92,4 +92,16 @@ std::error_code ArchicadDBaseCore::makeError(ArchicadDBaseCore::Status code) {
|
||||
return std::error_code(static_cast<int>(code), instance);
|
||||
} //ArchicadDBaseCore::makeError
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Make an error code for ArchicadElementDBase processing
|
||||
|
||||
code: An Archicad API error code
|
||||
|
||||
return: An STL error code
|
||||
--------------------------------------------------------------------*/
|
||||
std::error_code ArchicadDBaseCore::makeError(GSErrCode code) {
|
||||
return makeError(convertArchicadError(code));
|
||||
} //ArchicadDBaseCore::makeError
|
||||
|
||||
#endif
|
||||
|
||||
@@ -9,6 +9,8 @@
|
||||
#include "Active/Utility/NameID.h"
|
||||
#include "Speckle/Event/Subscriber/ProjectSubscriber.h"
|
||||
|
||||
#include <Definitions.hpp>
|
||||
|
||||
namespace speckle::database {
|
||||
|
||||
using ArchicadDBaseSchema = active::database::DBaseSchema<>;
|
||||
@@ -35,9 +37,16 @@ namespace speckle::database {
|
||||
|
||||
/*!
|
||||
Make an error code for ArchicadElementDBase processing
|
||||
@param code An ArchicadDBaseCore status code
|
||||
@return An STL error code
|
||||
*/
|
||||
static std::error_code makeError(ArchicadDBaseCore::Status code);
|
||||
/*!
|
||||
Make an error code for ArchicadElementDBase processing
|
||||
@param code An Archicad API error code
|
||||
@return An STL error code
|
||||
*/
|
||||
static std::error_code makeError(GSErrCode code);
|
||||
|
||||
// MARK: - Constructors
|
||||
|
||||
|
||||
+20
-3
@@ -221,9 +221,26 @@ active::container::Vector<Attribute> ArchicadAttributeDBaseEngine::getObjects(co
|
||||
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
|
||||
void ArchicadAttributeDBaseEngine::write(Attribute& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
|
||||
std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
|
||||
auto attributeData = object.getDataOut();
|
||||
//An record with no index has not been written (and needs to be created in the dbase)
|
||||
GSErrCode status = NoError;
|
||||
#ifdef ServerMainVers_2700
|
||||
if (attributeData.header.index.GenerateHashValue() == 0)
|
||||
#else
|
||||
if (attributeData.header.index == 0)
|
||||
#endif
|
||||
{
|
||||
status = ACAPI_Attribute_CreateExt(&attributeData, nullptr); //TODO: Handle attribute extended definition
|
||||
//Archicad assigns record guids - we need to capture this for the caller
|
||||
object.setBIMID(attributeData.header.guid);
|
||||
} else
|
||||
status = ACAPI_Attribute_ModifyExt(&attributeData, nullptr);
|
||||
if (status != NoError)
|
||||
throw std::system_error(makeError(status));
|
||||
//Archicad modifies record headers on write - need to capture this data for the caller
|
||||
object.getHead() = attributeData.header;
|
||||
} //ArchicadAttributeDBaseEngine::write
|
||||
|
||||
|
||||
|
||||
+4
-2
@@ -55,11 +55,13 @@ namespace speckle::database {
|
||||
/*!
|
||||
Find a filtered list of objects
|
||||
@param filter The object filter (nullptr = find all objects)
|
||||
@param subset A subset of the database content to search (specified by record ID)
|
||||
@param tableID Optional table ID (defaults to the first table)
|
||||
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
|
||||
@return A list containing IDs of found elements (empty if none found)
|
||||
*/
|
||||
virtual ObjIDList findObjects(const Filter& filter = nullptr, std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
virtual ObjIDList findObjects(const Filter* filter = nullptr, const ObjIDList& subset = {},
|
||||
std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
std::optional<BIMRecordID> documentID = std::nullopt) const override { return {}; } //Implement when required
|
||||
/*!
|
||||
Get an object by ID
|
||||
@@ -101,7 +103,7 @@ namespace speckle::database {
|
||||
@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,
|
||||
void write(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
|
||||
|
||||
+37
-12
@@ -96,6 +96,21 @@ namespace {
|
||||
} //setActiveTable
|
||||
|
||||
|
||||
/*!
|
||||
Find indices of all elements in an Archicad database. NB: It is assumed that the active database has already been set
|
||||
@return A list of all element IDs in the active database
|
||||
*/
|
||||
BIMRecordIDList getAllElementIDs() {
|
||||
GS::Array<API_Guid> found;
|
||||
if ((ACAPI_Element_GetElemList({}, &found) != NoError) || found.IsEmpty())
|
||||
return {};
|
||||
BIMRecordIDList result;
|
||||
for (const auto& item : found)
|
||||
result.insert(item);
|
||||
return result;
|
||||
} //getAllElementIDs
|
||||
|
||||
|
||||
/*!
|
||||
Make a new element object
|
||||
@param elementData The API element representation
|
||||
@@ -287,28 +302,38 @@ void ArchicadElementDBaseEngine::setDefaultTable(const BIMRecordID& tableID) con
|
||||
Find a filtered list of objects
|
||||
|
||||
filter: The object filter (nullptr = find all objects)
|
||||
subset: A subset of the database content to search (specified by record ID)
|
||||
tableID: Optional table ID (defaults to the first table)
|
||||
documentID: Optional document ID (filter for this document only - nullopt = all objects)
|
||||
|
||||
return: A list containing IDs of found elements (empty if none found)
|
||||
--------------------------------------------------------------------*/
|
||||
BIMRecordIDList ArchicadElementDBaseEngine::findObjects(const Filter& filter, std::optional<BIMRecordID> tableID,
|
||||
std::optional<BIMRecordID> documentID) const {
|
||||
BIMRecordIDList ArchicadElementDBaseEngine::findObjects(const Filter* filter, const BIMRecordIDList& subset, std::optional<BIMRecordID> tableID,
|
||||
std::optional<BIMRecordID> documentID) const {
|
||||
//Switch to the target table (when specified). Otherwise the currently active table will be used
|
||||
if (tableID)
|
||||
setActiveTable(*tableID);
|
||||
//First check for no filter (in which case we return all objects)
|
||||
if (filter == nullptr) {
|
||||
GS::Array<API_Guid> found;
|
||||
if ((ACAPI_Element_GetElemList({}, &found) != NoError) || found.IsEmpty())
|
||||
return {};
|
||||
BIMRecordIDList result;
|
||||
for (const auto& item : found)
|
||||
result.insert(item);
|
||||
return result;
|
||||
if (!subset.empty())
|
||||
return subset;
|
||||
return getAllElementIDs();
|
||||
}
|
||||
//Implement other filtering as required - ideally identify characteristics supported by API, e.g. filter by type/renovation etc
|
||||
return {};
|
||||
BIMRecordIDList buffer, result;
|
||||
//Pick either all records or the specified subset
|
||||
auto source = ⊂
|
||||
if (subset.empty()) {
|
||||
buffer = getAllElementIDs();
|
||||
source = &buffer;
|
||||
}
|
||||
//Run the filter on the specified elements
|
||||
for (const auto& elemID : *source) {
|
||||
if (auto element = getObject(elemID); element) {
|
||||
if ((*filter)(*element))
|
||||
result.insert(elemID);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
} //ArchicadElementDBaseEngine::findObjects
|
||||
|
||||
|
||||
@@ -423,7 +448,7 @@ active::container::Vector<Element> ArchicadElementDBaseEngine::getObjects(const
|
||||
tableID: Optional table ID (defaults to the floor plan)
|
||||
documentID: Optional document ID (when the object is bound to a specific document)
|
||||
--------------------------------------------------------------------*/
|
||||
void ArchicadElementDBaseEngine::write(const Element& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
|
||||
void ArchicadElementDBaseEngine::write(Element& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
|
||||
std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
|
||||
|
||||
} //ArchicadElementDBaseEngine::write
|
||||
|
||||
+5
-3
@@ -92,12 +92,14 @@ namespace speckle::database {
|
||||
/*!
|
||||
Find a filtered list of objects
|
||||
@param filter The object filter (nullptr = find all objects)
|
||||
@param subset A subset of the database content to search (specified by record ID)
|
||||
@param tableID Optional table ID (defaults to the first table)
|
||||
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
|
||||
@return A list containing IDs of found elements (empty if none found)
|
||||
*/
|
||||
virtual BIMRecordIDList findObjects(const Filter& filter = nullptr, std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
std::optional<BIMRecordID> documentID = std::nullopt) const override;
|
||||
virtual BIMRecordIDList findObjects(const Filter* filter = nullptr, const BIMRecordIDList& subset = {},
|
||||
std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
std::optional<BIMRecordID> documentID = std::nullopt) const override;
|
||||
/*!
|
||||
Get an object by index
|
||||
@param objID The object ID
|
||||
@@ -138,7 +140,7 @@ namespace speckle::database {
|
||||
@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 Element& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID = std::nullopt,
|
||||
void write(Element& 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
|
||||
|
||||
+1
-1
@@ -154,7 +154,7 @@ active::container::Vector<Group> ArchicadGroupDBaseEngine::getObjects(const Filt
|
||||
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,
|
||||
void ArchicadGroupDBaseEngine::write(Group& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
|
||||
std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
|
||||
//TODO: Implement
|
||||
} //ArchicadGroupDBaseEngine::write
|
||||
|
||||
+4
-2
@@ -50,11 +50,13 @@ namespace speckle::database {
|
||||
/*!
|
||||
Find a filtered list of objects
|
||||
@param filter The object filter (nullptr = find all objects)
|
||||
@param subset A subset of the database content to search (specified by record ID)
|
||||
@param tableID Optional table ID (defaults to the first table)
|
||||
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
|
||||
@return A list containing IDs of found elements (empty if none found)
|
||||
*/
|
||||
virtual ObjIDList findObjects(const Filter& filter = nullptr, std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
virtual ObjIDList findObjects(const Filter* filter = nullptr, const ObjIDList& subset = {},
|
||||
std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
std::optional<BIMRecordID> documentID = std::nullopt) const override { return {}; } //Implement when required
|
||||
/*!
|
||||
Get an object by ID
|
||||
@@ -96,7 +98,7 @@ namespace speckle::database {
|
||||
@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,
|
||||
void write(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
|
||||
|
||||
+1
-1
@@ -178,7 +178,7 @@ active::container::Vector<Template> ArchicadPropertyDBaseEngine::getObjects(cons
|
||||
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,
|
||||
void ArchicadPropertyDBaseEngine::write(Template& object, const BIMRecordID& objID, std::optional<BIMRecordID> objDocID,
|
||||
std::optional<BIMRecordID> tableID, std::optional<BIMRecordID> documentID) const {
|
||||
//TODO: Implement
|
||||
} //ArchicadPropertyDBaseEngine::write
|
||||
|
||||
+3
-2
@@ -51,11 +51,12 @@ namespace speckle::database {
|
||||
/*!
|
||||
Find a filtered list of objects
|
||||
@param filter The object filter (nullptr = find all objects)
|
||||
@param subset A subset of the database content to search (specified by record ID)
|
||||
@param tableID Optional table ID (defaults to the first table)
|
||||
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
|
||||
@return A list containing IDs of found elements (empty if none found)
|
||||
*/
|
||||
virtual ObjIDList findObjects(const Filter& filter = nullptr, std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
virtual ObjIDList findObjects(const Filter* filter = nullptr, const ObjIDList& subset = {}, std::optional<BIMRecordID> tableID = std::nullopt,
|
||||
std::optional<BIMRecordID> documentID = std::nullopt) const override { return {}; } //Implement when required
|
||||
/*!
|
||||
Find all property templates linked to specified classifications
|
||||
@@ -103,7 +104,7 @@ namespace speckle::database {
|
||||
@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,
|
||||
void write(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
|
||||
|
||||
@@ -63,11 +63,12 @@ namespace speckle::database {
|
||||
/*!
|
||||
Find a filtered list of objects
|
||||
@param filter The object filter (nullptr = find all objects)
|
||||
@param subset A subset of the database content to search (specified by record ID)
|
||||
@param tableID Optional table ID (defaults to the first table)
|
||||
@param documentID Optional document ID (filter for this document only - nullopt = all objects)
|
||||
@return A list containing IDs of found elements (empty if none found)
|
||||
*/
|
||||
virtual ObjIDList findObjects(const Filter& filter = nullptr, std::optional<RecordID> tableID = std::nullopt,
|
||||
virtual ObjIDList findObjects(const Filter* filter = nullptr, const ObjIDList& subset = {}, std::optional<RecordID> tableID = std::nullopt,
|
||||
std::optional<RecordID> documentID = std::nullopt) const override { return {}; } //Implement when required
|
||||
/*!
|
||||
Get an object by index
|
||||
@@ -109,7 +110,7 @@ namespace speckle::database {
|
||||
@param tableID Optional table ID (defaults to the first table)
|
||||
@param documentID Optional document ID (when the object is bound to a specific document)
|
||||
*/
|
||||
void write(const Obj& object, const ObjID& objID, std::optional<ObjID> objDocID = std::nullopt,
|
||||
void write(Obj& object, const ObjID& objID, std::optional<ObjID> objDocID = std::nullopt,
|
||||
std::optional<RecordID> tableID = std::nullopt, std::optional<RecordID> documentID = std::nullopt) const override;
|
||||
/*!
|
||||
Erase an object by index
|
||||
@@ -274,7 +275,7 @@ namespace speckle::database {
|
||||
--------------------------------------------------------------------*/
|
||||
template<typename Obj, typename ObjWrapper, typename Transport, typename ObjID>
|
||||
requires DocumentStorable<Obj, ObjWrapper, Transport>
|
||||
void DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::write(const Obj& object, const ObjID& objID, std::optional<ObjID> objDocID,
|
||||
void DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::write(Obj& object, const ObjID& objID, std::optional<ObjID> objDocID,
|
||||
std::optional<RecordID> tableID, std::optional<RecordID> documentID) const {
|
||||
getCache()->write(object); //NB: In future we might support duplicating records if objID != obj.id
|
||||
} //DocumentStoreEngine<Obj, ObjWrapper, Transport, ObjID>::write
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "Speckle/Environment/Addon.h"
|
||||
|
||||
#include "Active/Database/Transaction.h"
|
||||
#include "Speckle/Environment/Project.h"
|
||||
#include "Speckle/Event/Type/ProjectEvent.h"
|
||||
#include "Speckle/Event/Subscriber/ProjectSubscriber.h"
|
||||
@@ -10,6 +11,7 @@
|
||||
#include <ACAPinc.h>
|
||||
#endif
|
||||
|
||||
using namespace active::database;
|
||||
using namespace speckle::environment;
|
||||
using namespace speckle::event;
|
||||
using namespace speckle::utility;
|
||||
@@ -228,3 +230,46 @@ std::shared_ptr<Project> Addon::makeProject() const {
|
||||
auto project = new Project; //make_shared can't use protected constructor
|
||||
return std::shared_ptr<Project>{project};
|
||||
} //Addon::makeProject
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Determine if a transaction can be started
|
||||
|
||||
return: True if a transaction can be started
|
||||
--------------------------------------------------------------------*/
|
||||
bool Addon::canTransactionStart() const {
|
||||
return true; //TODO: There are some situations where Archicad cannot accept perform a new transaction - add when determine essential
|
||||
} //Addon::canTransactionStart
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Perform a transaction
|
||||
|
||||
transaction: The transaction to perform
|
||||
|
||||
return: True if the transaction was successfully performed
|
||||
--------------------------------------------------------------------*/
|
||||
bool Addon::performTransaction(Transaction& transaction) const {
|
||||
//If this is the opening transaction, we need to enclose it in a host undo session
|
||||
if (isPerforming(transaction)) {
|
||||
#ifdef ARCHICAD
|
||||
return ACAPI_CallUndoableCommand(String{transaction.getName()}, [&]() -> GSErrCode {
|
||||
if (App::performTransaction(transaction))
|
||||
return NoError;
|
||||
return APIERR_COMMANDFAILED;
|
||||
});
|
||||
#endif
|
||||
}
|
||||
return App::performTransaction(transaction);
|
||||
} //Addon::performTransaction
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Finalise a transaction
|
||||
|
||||
transaction: The transaction to be finalised
|
||||
wasPerformedSuccessfully: True if the transaction was successfully performed
|
||||
--------------------------------------------------------------------*/
|
||||
void Addon::finaliseTransaction(Transaction& transaction, bool wasPerformedSuccessfully) const {
|
||||
|
||||
} //Addon::finaliseTransaction
|
||||
|
||||
@@ -103,6 +103,26 @@ namespace speckle::environment {
|
||||
*/
|
||||
virtual std::shared_ptr<Project> makeProject() const;
|
||||
|
||||
// MARK: - Functions (transactions)
|
||||
|
||||
/*!
|
||||
Determine if a transaction can be started
|
||||
@return True if a transaction can be started
|
||||
*/
|
||||
bool canTransactionStart() const override;
|
||||
/*!
|
||||
Perform a transaction
|
||||
@param transaction The transaction to perform
|
||||
@return True if the transaction was successfully performed
|
||||
*/
|
||||
bool performTransaction(active::database::Transaction& transaction) const override;
|
||||
/*!
|
||||
Finalise a transaction
|
||||
@param transaction The transaction to be finalised
|
||||
@param wasPerformedSuccessfully True if the transaction was successfully performed
|
||||
*/
|
||||
void finaliseTransaction(active::database::Transaction& transaction, bool wasPerformedSuccessfully) const override;
|
||||
|
||||
private:
|
||||
///The active project
|
||||
std::shared_ptr<Project> m_activeProject;
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#include "Speckle/Environment/Host.h"
|
||||
|
||||
#include "Active/Utility/Memory.h"
|
||||
#include "Speckle/Environment/Addon.h"
|
||||
#include "Speckle/SpeckleResource.h"
|
||||
|
||||
#ifdef ARCHICAD
|
||||
#include "DG.h"
|
||||
@@ -84,11 +87,32 @@ void Host::zoomToFit(bool isSelectionOnly) const {
|
||||
--------------------------------------------------------------------*/
|
||||
void Host::displayAlert(const String& message) const {
|
||||
#ifdef ARCHICAD
|
||||
DGAlert(DG_INFORMATION, "Notification", message.data(), "", "OK");
|
||||
DGAlert(DG_INFORMATION, addon()->getLocalString(titleStringLib, notifyDialogTitleID), message, "",
|
||||
addon()->getLocalString(titleStringLib, okButtonTitleID));
|
||||
#endif
|
||||
} //Host::displayAlert
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Display a confirmation dialog (prompting the user to pick one of two options)
|
||||
|
||||
question: The question text, e.g. "Do you wish to continue?"
|
||||
positiveOption: The positive option text (nullopt = "Yes")
|
||||
negativeOption: The negative option text (nullopt = "No")
|
||||
|
||||
return: True if the user picked the positive option
|
||||
--------------------------------------------------------------------*/
|
||||
bool Host::displayConfirmation(const speckle::utility::String& question,
|
||||
const speckle::utility::String::Option positiveOption,
|
||||
const speckle::utility::String::Option negativeOption) const {
|
||||
#ifdef ARCHICAD
|
||||
String positivePrompt{positiveOption.value_or(addon()->getLocalString(titleStringLib, positiveResponseTitleID))},
|
||||
negativePrompt{positiveOption.value_or(addon()->getLocalString(titleStringLib, negativeResponseTitleID))};
|
||||
return (DGAlert(DG_WARNING, addon()->getLocalString(titleStringLib, confirmDialogTitleID), question, String{}, positivePrompt, negativePrompt) == 1);
|
||||
#endif
|
||||
} //Host::displayConfirmation
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get an object representing the parent process/application
|
||||
|
||||
|
||||
@@ -36,6 +36,17 @@ namespace speckle::environment {
|
||||
@param message The alert message
|
||||
*/
|
||||
void displayAlert(const speckle::utility::String& message) const;
|
||||
/*!
|
||||
Display a confirmation dialog (prompting the user to pick one of two options)
|
||||
@param question The question text, e.g. "Do you wish to continue?"
|
||||
@param positiveOption The positive option text (nullopt = "Yes")
|
||||
@param negativeOption The negative option text (nullopt = "No")
|
||||
|
||||
@return True if the user picked the positive option
|
||||
*/
|
||||
bool displayConfirmation(const speckle::utility::String& question,
|
||||
const speckle::utility::String::Option positiveOption = std::nullopt,
|
||||
const speckle::utility::String::Option negativeOption = std::nullopt) const;
|
||||
|
||||
// MARK: Functions (mutating)
|
||||
|
||||
|
||||
@@ -33,16 +33,16 @@ namespace {
|
||||
case APINotifyElement_New: {
|
||||
// POC: Put this back once we decide to use Object Tracking
|
||||
// ACAPI_Element_AttachObserver(elemType->elemHead.guid);
|
||||
addon()->publishExternal(ElementEvent{newElem, ElementID{elemType->elemHead.guid}});
|
||||
addon()->publishExternal(ElementEvent{newElem, BIMRecordID{elemType->elemHead.guid}});
|
||||
} break;
|
||||
case APINotifyElement_Change: {
|
||||
addon()->publishExternal(ElementEvent{changeElem, ElementID{elemType->elemHead.guid}});
|
||||
addon()->publishExternal(ElementEvent{changeElem, BIMRecordID{elemType->elemHead.guid}});
|
||||
} break;
|
||||
case APINotifyElement_Edit: {
|
||||
addon()->publishExternal(ElementEvent{editElem, ElementID{elemType->elemHead.guid}});
|
||||
addon()->publishExternal(ElementEvent{editElem, BIMRecordID{elemType->elemHead.guid}});
|
||||
} break;
|
||||
case APINotifyElement_Delete: {
|
||||
addon()->publishExternal(ElementEvent{deleteElem, ElementID{ elemType->elemHead.guid}});
|
||||
addon()->publishExternal(ElementEvent{deleteElem, BIMRecordID{ elemType->elemHead.guid}});
|
||||
} break;
|
||||
case APINotifyElement_BeginEvents:
|
||||
addon()->publishExternal(ElementEvent{begin});
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#define SPECKLE_EVENT_ELEMENT_CHANGED_SUBSCRIBER
|
||||
|
||||
#include "Active/Event/Subscriber.h"
|
||||
#include "Speckle/Database/Identity/RecordID.h"
|
||||
#include "Speckle/Database/Identity/BIMRecordID.h"
|
||||
|
||||
namespace speckle::event {
|
||||
|
||||
@@ -60,8 +60,6 @@ namespace speckle::event {
|
||||
@return True if the event should be closed
|
||||
*/
|
||||
virtual bool handle(const ElementEvent& event) = 0;
|
||||
|
||||
speckle::database::ElementIDList m_changedElements;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
|
||||
#include "Active/Utility/Guid.h"
|
||||
#include "Active/Utility/String.h"
|
||||
#include "Speckle/Database/Identity/BIMRecordID.h"
|
||||
|
||||
namespace speckle::event {
|
||||
|
||||
@@ -33,7 +34,7 @@ namespace speckle::event {
|
||||
@param eventType An event type identifier
|
||||
@param targetID The ID of the element targeted by the database transaction (nullopt = undefined, e.g. for a begin/end event)
|
||||
*/
|
||||
ElementEvent(Type eventType, database::ElementID::Option targetID = std::nullopt) : Event{ID}, m_elementID{targetID}, m_eventType{eventType} {}
|
||||
ElementEvent(Type eventType, database::BIMRecordID::Option targetID = std::nullopt) : Event{ID}, m_elementID{targetID}, m_eventType{eventType} {}
|
||||
/*!
|
||||
Copy constructor
|
||||
@param source The object to copy
|
||||
@@ -50,12 +51,12 @@ namespace speckle::event {
|
||||
Get the ID of the database transaction target element
|
||||
@return The target element ID (nullopt = no target, e.g. a begin/end event)
|
||||
*/
|
||||
database::ElementID::Option getElmentID() const { return m_elementID; }
|
||||
database::BIMRecordID::Option getElementID() const { return m_elementID; }
|
||||
Type getEventType() const { return m_eventType; }
|
||||
|
||||
private:
|
||||
///The ID of the target element (nullopt = undefined)
|
||||
database::ElementID::Option m_elementID;
|
||||
database::BIMRecordID::Option m_elementID;
|
||||
///The specific database operation performed
|
||||
Type m_eventType;
|
||||
};
|
||||
|
||||
@@ -95,7 +95,7 @@ namespace speckle::interfac::browser::bridge {
|
||||
}
|
||||
|
||||
private:
|
||||
///List of methods supported by the bridge
|
||||
///Definition of a bridge method container
|
||||
using BridgedMethods = std::vector<std::shared_ptr<Functional<>>>;
|
||||
///Methods supported by the bridge
|
||||
std::unique_ptr<BridgedMethods> m_methods = std::make_unique<BridgedMethods>();
|
||||
|
||||
@@ -74,6 +74,8 @@ namespace speckle::interfac::browser {
|
||||
//Process any returned result into the binding value type
|
||||
auto processResult = [&, transport](Return* outgoing) -> typename Binding::ValueType {
|
||||
if constexpr(!std::is_same<Return, void>::value) {
|
||||
if (outgoing == nullptr)
|
||||
throw; //NB: Throw a system exception here in future with a defined error
|
||||
typename Binding::ValueType result;
|
||||
transport.send(std::move(*outgoing), active::serialise::Identity{}, result);
|
||||
return result;
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
#include "Speckle/Database/Content/BIMRecord.h"
|
||||
#include "Speckle/Utility/String.h"
|
||||
|
||||
namespace speckle::database {
|
||||
class ArchicadAttributeDBaseEngine;
|
||||
}
|
||||
|
||||
namespace speckle::record::attribute {
|
||||
|
||||
/*!
|
||||
@@ -106,11 +110,18 @@ namespace speckle::record::attribute {
|
||||
|
||||
protected:
|
||||
#ifdef ARCHICAD
|
||||
friend class speckle::database::ArchicadAttributeDBaseEngine;
|
||||
|
||||
/*!
|
||||
Get the attribute data from the host BIM application
|
||||
@return The attribute data (for internal use to populate derived classes)
|
||||
*/
|
||||
API_Attribute getData() const;
|
||||
/*!
|
||||
Get the attribute data to be written to the database
|
||||
@return The attribute data (for internal use to write to the database)
|
||||
*/
|
||||
virtual API_Attribute getDataOut() const = 0;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
@@ -275,6 +275,20 @@ bool Finish::validate() {
|
||||
} //Finish::validate
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the attribute data to be written to the database
|
||||
|
||||
return: The attribute data (for internal use to write to the database)
|
||||
--------------------------------------------------------------------*/
|
||||
API_Attribute Finish::getDataOut() const {
|
||||
confirmData();
|
||||
API_Attribute result;
|
||||
active::utility::Memory::erase(result);
|
||||
result.material = m_data->root;
|
||||
return result;
|
||||
} //Finish::getDataOut
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
--------------------------------------------------------------------*/
|
||||
|
||||
@@ -135,7 +135,14 @@ namespace speckle::record::attribute {
|
||||
@return True if the data has been validated
|
||||
*/
|
||||
bool validate() override;
|
||||
|
||||
|
||||
protected:
|
||||
/*!
|
||||
Get the attribute data to be written to the database
|
||||
@return The attribute data (for internal use to write to the database)
|
||||
*/
|
||||
API_Attribute getDataOut() const override;
|
||||
|
||||
private:
|
||||
/*!
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
|
||||
@@ -0,0 +1,293 @@
|
||||
#include "Speckle/Record/Attribute/Layer.h"
|
||||
|
||||
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
|
||||
#include "Active/Serialise/Management/Management.h"
|
||||
#include "Active/Serialise/CargoHold.h"
|
||||
#include "Active/Utility/BufferOut.h"
|
||||
#include "Speckle/Serialise/Types/ArchicadRGB.h"
|
||||
#include "Speckle/Utility/Guid.h"
|
||||
|
||||
using namespace active::serialise;
|
||||
using namespace speckle::database;
|
||||
using namespace speckle::record::attribute;
|
||||
using namespace speckle::utility;
|
||||
|
||||
#include <array>
|
||||
#include <memory>
|
||||
|
||||
namespace speckle::record::attribute {
|
||||
|
||||
///Internal representation of a rendered layer on a 3D body, i.e. the surface colour/texture etc.
|
||||
class Layer::Data {
|
||||
public:
|
||||
#ifdef ARCHICAD
|
||||
/*!
|
||||
Constructor from Archicad surface material
|
||||
@param attr An Archicad attribute
|
||||
*/
|
||||
Data(const API_Attribute& attr) : root{attr.layer} {
|
||||
isHidden = root.head.flags & APILay_Hidden;
|
||||
isLocked = root.head.flags & APILay_Locked;
|
||||
}
|
||||
|
||||
///Archicad representation of a layer
|
||||
API_LayerType root;
|
||||
#endif
|
||||
///True if the layer is hidden
|
||||
bool isHidden = false;
|
||||
///True if the layer is locked
|
||||
bool isLocked = false;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
///Serialisation fields
|
||||
enum FieldIndex {
|
||||
hiddenID,
|
||||
lockedID,
|
||||
};
|
||||
|
||||
///Serialisation field IDs
|
||||
static std::array fieldID = {
|
||||
Identity{"hidden"},
|
||||
Identity{"locked"},
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Default constructor
|
||||
--------------------------------------------------------------------*/
|
||||
Layer::Layer() {
|
||||
} //Layer::Layer
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Constructor
|
||||
|
||||
ID: The attribute ID
|
||||
--------------------------------------------------------------------*/
|
||||
Layer::Layer(const database::BIMRecordID& ID) : base{ID, Layer::table} {
|
||||
} //Layer::Layer
|
||||
|
||||
|
||||
#ifdef ARCHICAD
|
||||
/*--------------------------------------------------------------------
|
||||
Constructor
|
||||
|
||||
attrData: Archicad attribute data
|
||||
tableID: The ID of the parent table
|
||||
--------------------------------------------------------------------*/
|
||||
Layer::Layer(const API_Attribute& attrData, const BIMRecordID& tableID) : base{attrData.header.guid, Layer::table} {
|
||||
m_data = std::make_unique<Data>(attrData);
|
||||
setUnit(std::nullopt); //Layeres have no unit
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Copy constructor
|
||||
|
||||
source: The object to copy
|
||||
--------------------------------------------------------------------*/
|
||||
Layer::Layer(const Layer& source) : base{source} {
|
||||
m_data = source.m_data ? std::make_unique<Data>(*source.m_data) : nullptr;
|
||||
} //Layer::Layer
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Destructor
|
||||
--------------------------------------------------------------------*/
|
||||
Layer::~Layer() {}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Assignment operator
|
||||
|
||||
source: The object to assign
|
||||
|
||||
return: A reference to this
|
||||
--------------------------------------------------------------------*/
|
||||
Layer& Layer::operator=(const Layer& source) {
|
||||
if (this != &source) {
|
||||
base::operator=(source);
|
||||
m_data = source.m_data ? std::make_unique<Data>(*source.m_data) : nullptr;
|
||||
}
|
||||
return *this;
|
||||
} //Layer::operator=
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Determine if the layer is hidden
|
||||
|
||||
return: True if the layer is hidden
|
||||
--------------------------------------------------------------------*/
|
||||
bool Layer::isHidden() const {
|
||||
confirmData();
|
||||
return m_data->isHidden;
|
||||
} //Layer::isHidden
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Determine if the layer is locked
|
||||
|
||||
return: True if the layer is locked
|
||||
--------------------------------------------------------------------*/
|
||||
bool Layer::isLocked() const {
|
||||
confirmData();
|
||||
return m_data->isLocked;
|
||||
} //Layer::isLocked
|
||||
|
||||
|
||||
#ifdef ARCHICAD
|
||||
/*--------------------------------------------------------------------
|
||||
Get the (immutable) API attribute header data
|
||||
|
||||
return: The attribute header data (only use this data for low-level operations - for normal code, call getters/setters)
|
||||
--------------------------------------------------------------------*/
|
||||
const API_Attr_Head& Layer::getHead() const {
|
||||
confirmData();
|
||||
return m_data->root.head;
|
||||
} //Layer::getHead
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Set whether the layer is hidden
|
||||
|
||||
state: True if the layer is hidden
|
||||
--------------------------------------------------------------------*/
|
||||
void Layer::setHidden(bool state) {
|
||||
confirmData();
|
||||
m_data->isHidden = state;
|
||||
#ifdef ARCHICAD
|
||||
if (state)
|
||||
m_data->root.head.flags |= APILay_Hidden;
|
||||
else
|
||||
m_data->root.head.flags &= ~APILay_Hidden;
|
||||
#endif
|
||||
} //Layer::setHidden
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Set whether the layer is locked
|
||||
|
||||
state: True if the layer is locked
|
||||
--------------------------------------------------------------------*/
|
||||
void Layer::setLocked(bool state) {
|
||||
confirmData();
|
||||
m_data->isLocked = state;
|
||||
#ifdef ARCHICAD
|
||||
if (state)
|
||||
m_data->root.head.flags |= APILay_Locked;
|
||||
else
|
||||
m_data->root.head.flags &= ~APILay_Locked;
|
||||
#endif
|
||||
} //Layer::setLocked
|
||||
|
||||
|
||||
#ifdef ARCHICAD
|
||||
/*--------------------------------------------------------------------
|
||||
Get the (mutable) API attribute header data
|
||||
|
||||
return: The attribute header data (only use this data for low-level operations - for normal code, call getters/setters)
|
||||
--------------------------------------------------------------------*/
|
||||
API_Attr_Head& Layer::getHead() {
|
||||
confirmData();
|
||||
return m_data->root.head;
|
||||
} //Layer::getHead
|
||||
#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 Layer::fillInventory(Inventory& inventory) const {
|
||||
using enum Entry::Type;
|
||||
inventory.merge(Inventory{
|
||||
{
|
||||
{ fieldID[hiddenID], hiddenID, element },
|
||||
{ fieldID[lockedID], lockedID, element },
|
||||
},
|
||||
}.withType(&typeid(Layer)));
|
||||
return base::fillInventory(inventory);
|
||||
} //Layer::fillInventory
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the specified cargo
|
||||
|
||||
item: The inventory item to retrieve
|
||||
|
||||
return: The requested cargo (nullptr on failure)
|
||||
--------------------------------------------------------------------*/
|
||||
Cargo::Unique Layer::getCargo(const Inventory::Item& item) const {
|
||||
if (item.ownerType != &typeid(Layer))
|
||||
return base::getCargo(item);
|
||||
confirmData();
|
||||
using namespace active::serialise;
|
||||
switch (item.index) {
|
||||
case hiddenID:
|
||||
return std::make_unique<BoolWrap>(m_data->isHidden);
|
||||
case lockedID:
|
||||
return std::make_unique<BoolWrap>(m_data->isLocked);
|
||||
default:
|
||||
return nullptr; //Requested an unknown index
|
||||
}
|
||||
} //Layer::getCargo
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Set to the default package content
|
||||
--------------------------------------------------------------------*/
|
||||
void Layer::setDefault() {
|
||||
m_data->root = {};
|
||||
m_data->isHidden = false;
|
||||
m_data->isLocked = false;
|
||||
} //Layer::setDefault
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Validate the cargo data
|
||||
|
||||
return: True if the data has been validated
|
||||
--------------------------------------------------------------------*/
|
||||
bool Layer::validate() {
|
||||
#ifdef ARCHICAD
|
||||
if (m_data->isHidden)
|
||||
m_data->root.head.flags |= APILay_Hidden;
|
||||
if (m_data->isLocked)
|
||||
m_data->root.head.flags |= APILay_Locked;
|
||||
#endif
|
||||
return true;
|
||||
} //Layer::validate
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the attribute data to be written to the database
|
||||
|
||||
return: The attribute data (for internal use to write to the database)
|
||||
--------------------------------------------------------------------*/
|
||||
API_Attribute Layer::getDataOut() const {
|
||||
confirmData();
|
||||
API_Attribute result;
|
||||
active::utility::Memory::erase(result);
|
||||
result.layer = m_data->root;
|
||||
return result;
|
||||
} //Layer::getDataOut
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
--------------------------------------------------------------------*/
|
||||
void Layer::confirmData() const {
|
||||
if (m_data)
|
||||
return;
|
||||
m_data = std::make_unique<Data>(getData());
|
||||
} //Layer::confirmData
|
||||
@@ -0,0 +1,174 @@
|
||||
#ifndef SPECKLE_RECORD_ATTRIBUTE_LAYER
|
||||
#define SPECKLE_RECORD_ATTRIBUTE_LAYER
|
||||
|
||||
#include "Speckle/Record/Attribute/Attribute.h"
|
||||
|
||||
#ifdef ARCHICAD
|
||||
namespace ModelerAPI {
|
||||
class Layer;
|
||||
}
|
||||
#endif
|
||||
|
||||
namespace speckle::record::attribute {
|
||||
|
||||
/*!
|
||||
Class to represent the rendered layer on a 3D body, i.e. the surface colour/texture etc.
|
||||
|
||||
In Archicad this attribute is represented by `API_LayerType`
|
||||
*/
|
||||
class Layer : public Attribute {
|
||||
public:
|
||||
|
||||
// MARK: - Types
|
||||
|
||||
using base = Attribute;
|
||||
///Unique pointer
|
||||
using Unique = std::unique_ptr<Layer>;
|
||||
///Shared pointer
|
||||
using Shared = std::shared_ptr<Layer>;
|
||||
///Optional
|
||||
using Option = std::optional<Layer>;
|
||||
|
||||
// MARK: - Constants
|
||||
|
||||
#ifdef ARCHICAD
|
||||
///The layeres table identifier
|
||||
static constexpr active::utility::Guid table{active::utility::Guid::fromInt(API_LayerID)};
|
||||
#endif
|
||||
|
||||
// MARK: - Constructors
|
||||
|
||||
using base::base;
|
||||
|
||||
/*!
|
||||
Default constructor
|
||||
*/
|
||||
Layer();
|
||||
/*!
|
||||
Constructor
|
||||
@param ID The attribute ID
|
||||
*/
|
||||
Layer(const database::BIMRecordID& ID);
|
||||
#ifdef ARCHICAD
|
||||
/*!
|
||||
Constructor
|
||||
@param attrData Archicad attribute data
|
||||
@param tableID The ID of the parent table
|
||||
*/
|
||||
Layer(const API_Attribute& attrData, const database::BIMRecordID& tableID);
|
||||
#endif
|
||||
/*!
|
||||
Copy constructor
|
||||
@param source The object to copy
|
||||
*/
|
||||
Layer(const Layer& source);
|
||||
/*!
|
||||
Destructor
|
||||
*/
|
||||
~Layer();
|
||||
|
||||
/*!
|
||||
Object cloning
|
||||
@return A clone of this object
|
||||
*/
|
||||
Layer* clonePtr() const override { return new Layer{*this}; }
|
||||
|
||||
// MARK: - Operators
|
||||
|
||||
/*!
|
||||
Assignment operator
|
||||
@param source The object to assign
|
||||
@return A reference to this
|
||||
*/
|
||||
Layer& operator=(const Layer& source);
|
||||
|
||||
// MARK: - Functions (const)
|
||||
|
||||
/*!
|
||||
Determine if the layer is hidden
|
||||
@return True if the layer is hidden
|
||||
*/
|
||||
bool isHidden() const;
|
||||
/*!
|
||||
Determine if the layer is locked
|
||||
@return True if the layer is locked
|
||||
*/
|
||||
bool isLocked() const;
|
||||
/*!
|
||||
Get the speckle type identifier
|
||||
@return The speckle type (relevant objects should override as required)
|
||||
*/
|
||||
speckle::utility::String getSpeckleType() const override { return "Objects.Other.Layer"; }
|
||||
#ifdef ARCHICAD
|
||||
/*!
|
||||
Get the (immutable) API attribute header data
|
||||
@return The attribute header data (only use this data for low-level operations - for normal code, call getters/setters)
|
||||
*/
|
||||
const API_Attr_Head& getHead() const override;
|
||||
#endif
|
||||
|
||||
// MARK: - Functions (mutating)
|
||||
|
||||
/*!
|
||||
Set whether the layer is hidden
|
||||
@param state True if the layer is hidden
|
||||
*/
|
||||
void setHidden(bool state);
|
||||
/*!
|
||||
Set whether the layer is locked
|
||||
@param state True if the layer is locked
|
||||
*/
|
||||
void setLocked(bool state);
|
||||
#ifdef ARCHICAD
|
||||
/*!
|
||||
Get the (mutable) API attribute header data
|
||||
@return The attribute header data (only use this data for low-level operations - for normal code, call getters/setters)
|
||||
*/
|
||||
API_Attr_Head& getHead() override;
|
||||
#endif
|
||||
|
||||
// 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;
|
||||
/*!
|
||||
Set to the default package content
|
||||
*/
|
||||
void setDefault() override;
|
||||
/*!
|
||||
Validate the cargo data
|
||||
@return True if the data has been validated
|
||||
*/
|
||||
bool validate() override;
|
||||
|
||||
protected:
|
||||
/*!
|
||||
Get the attribute data to be written to the database
|
||||
@return The attribute data (for internal use to write to the database)
|
||||
*/
|
||||
API_Attribute getDataOut() const override;
|
||||
|
||||
private:
|
||||
/*!
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
*/
|
||||
void confirmData() const;
|
||||
|
||||
class Data;
|
||||
///The attribute data - mutable to support lazy loading
|
||||
mutable std::unique_ptr<Data> m_data;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //SPECKLE_RECORD_ATTRIBUTE_LAYER
|
||||
@@ -186,6 +186,20 @@ void Material::setDefault() {
|
||||
} //Material::setDefault
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the attribute data to be written to the database
|
||||
|
||||
return: The attribute data (for internal use to write to the database)
|
||||
--------------------------------------------------------------------*/
|
||||
API_Attribute Material::getDataOut() const {
|
||||
confirmData();
|
||||
API_Attribute result;
|
||||
active::utility::Memory::erase(result);
|
||||
result.buildingMaterial = m_data->root;
|
||||
return result;
|
||||
} //Material::getDataOut
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
--------------------------------------------------------------------*/
|
||||
|
||||
@@ -126,7 +126,14 @@ namespace speckle::record::attribute {
|
||||
Set to the default package content
|
||||
*/
|
||||
void setDefault() override;
|
||||
|
||||
|
||||
protected:
|
||||
/*!
|
||||
Get the attribute data to be written to the database
|
||||
@return The attribute data (for internal use to write to the database)
|
||||
*/
|
||||
API_Attribute getDataOut() const override;
|
||||
|
||||
private:
|
||||
/*!
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
|
||||
@@ -185,6 +185,18 @@ void Storey::setDefault() {
|
||||
} //Storey::setDefault
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the attribute data to be written to the database
|
||||
|
||||
return: The attribute data (for internal use to write to the database)
|
||||
--------------------------------------------------------------------*/
|
||||
API_Attribute Storey::getDataOut() const {
|
||||
API_Attribute result;
|
||||
active::utility::Memory::erase(result);
|
||||
return result;
|
||||
} //Storey::getDataOut
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
--------------------------------------------------------------------*/
|
||||
|
||||
@@ -104,6 +104,13 @@ namespace speckle::record::attribute {
|
||||
*/
|
||||
void setDefault() override;
|
||||
|
||||
protected:
|
||||
/*!
|
||||
Get the attribute data to be written to the database
|
||||
@return The attribute data (for internal use to write to the database)
|
||||
*/
|
||||
API_Attribute getDataOut() const override;
|
||||
|
||||
private:
|
||||
/*!
|
||||
Confirm the internal data, either loading from the BIM application or setting a default
|
||||
|
||||
@@ -160,6 +160,22 @@ Element::Element(Element&& source) : base{source} {
|
||||
Element::~Element() {}
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the element layer
|
||||
|
||||
return: The element layer (nullopt if not applicable to the element)
|
||||
--------------------------------------------------------------------*/
|
||||
Layer::Option Element::getLayer() const {
|
||||
#ifdef ARCHICAD
|
||||
#ifdef ServerMainVers_2700
|
||||
return Layer{ Guid::fromInt(getHead().layer.GenerateHashValue()) };
|
||||
#else
|
||||
return Layer{ Guid::fromInt(getHead().layer) };
|
||||
#endif
|
||||
#endif
|
||||
} //Element::getLayer
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Get the element storey
|
||||
|
||||
|
||||
@@ -2,8 +2,9 @@
|
||||
#define SPECKLE_RECORD_ELEMENT
|
||||
|
||||
#include "Speckle/Database/Content/BIMRecord.h"
|
||||
#include "Speckle/Record/Element/Interface/Part.h"
|
||||
#include "Speckle/Record/Attribute/Layer.h"
|
||||
#include "Speckle/Record/Attribute/Storey.h"
|
||||
#include "Speckle/Record/Element/Interface/Part.h"
|
||||
#include "Speckle/Utility/String.h"
|
||||
|
||||
namespace speckle::primitive {
|
||||
@@ -71,6 +72,11 @@ namespace speckle::record::element {
|
||||
@return The type name
|
||||
*/
|
||||
virtual speckle::utility::String getTypeName() const;
|
||||
/*!
|
||||
Get the element layer
|
||||
@return The element layer (nullopt if not applicable to the element)
|
||||
*/
|
||||
record::attribute::Layer::Option getLayer() const;
|
||||
/*!
|
||||
Get the element storey
|
||||
@return The element storey (nullopt if the element isn't linked to a storey)
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
#include "Speckle/Record/Filter/ElementVisibilityCollector.h"
|
||||
|
||||
using namespace speckle::record;
|
||||
using namespace speckle::utility;
|
||||
|
||||
/*--------------------------------------------------------------------
|
||||
Apply the filter to a specified element
|
||||
|
||||
element: The target element
|
||||
|
||||
return: True if the element passed the filter. NB: Always false in this case - its role is data collection using a filter interface
|
||||
--------------------------------------------------------------------*/
|
||||
bool ElementVisibilityCollector::operator()(const speckle::record::element::Element& element) const {
|
||||
auto layer = element.getLayer();
|
||||
if (layer)
|
||||
m_layers.insert({layer->getBIMID(), *layer});
|
||||
auto storey = element.getStorey();
|
||||
if (storey)
|
||||
m_storeys.insert({storey->getBIMID(), *storey});
|
||||
return false;
|
||||
} //ElementVisibilityCollector::operator()
|
||||
@@ -0,0 +1,56 @@
|
||||
#ifndef CONNECTOR_ELEMENT_VISIBILTITY_COLLECTOR
|
||||
#define CONNECTOR_ELEMENT_VISIBILTITY_COLLECTOR
|
||||
|
||||
#include "Speckle/Record/Attribute/Layer.h"
|
||||
#include "Speckle/Record/Attribute/Storey.h"
|
||||
#include "Speckle/Database/Storage/Element/ElementStorage.h"
|
||||
|
||||
namespace speckle::record {
|
||||
|
||||
/*!
|
||||
Element layer/storey collector
|
||||
|
||||
The collector uses a filter interface for easy integration with an element database, but does not actually provide any filtering behaviour
|
||||
*/
|
||||
class ElementVisibilityCollector : public speckle::database::ElementStorage::Filter {
|
||||
public:
|
||||
|
||||
// MARK: - Types
|
||||
|
||||
///A set of layers
|
||||
using Layers = std::unordered_map<database::BIMRecordID, speckle::record::attribute::Layer>;
|
||||
///A set of storeys
|
||||
using Storeys = std::unordered_map<database::BIMRecordID, speckle::record::attribute::Storey>;
|
||||
|
||||
// MARK: - Operators
|
||||
|
||||
/*!
|
||||
Apply the filter to a specified element
|
||||
@param element The target element
|
||||
@return True if the element passed the filter. NB: Always false in this case - its role is data collection using a filter interface
|
||||
*/
|
||||
bool operator()(const speckle::record::element::Element& element) const;
|
||||
|
||||
// MARK: - Functions (const)
|
||||
|
||||
/*!
|
||||
Get the layers collection from filtered elements
|
||||
@return The collected layers
|
||||
*/
|
||||
Layers& getLayers() const { return m_layers; }
|
||||
/*!
|
||||
Get the storeys collection from filtered elements
|
||||
@return The collected storeys
|
||||
*/
|
||||
Storeys& getStoreys() const { return m_storeys; }
|
||||
|
||||
private:
|
||||
///Layers collected from elements
|
||||
mutable Layers m_layers;
|
||||
///Storeys collected from elements
|
||||
mutable Storeys m_storeys;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif //CONNECTOR_ELEMENT_VISIBILTITY_COLLECTOR
|
||||
@@ -397,7 +397,7 @@ namespace {
|
||||
isWrapperTag = !identity.name.empty() && !inventory.begin()->identity().name.empty() && (inventory.begin()->identity() != identity);
|
||||
}
|
||||
auto sequence = inventory.sequence();
|
||||
auto container = destination;
|
||||
auto container{destination};
|
||||
if (isWrapperTag) {
|
||||
auto containerType = cargo.entryType().value_or((inventory.size() == 1) && !(inventory.begin()->maximum() == 1) ?
|
||||
Entry::Type::array : Entry::Type::element);
|
||||
@@ -411,7 +411,7 @@ namespace {
|
||||
destination = container;
|
||||
}
|
||||
for (auto& entry : sequence) {
|
||||
auto item = *entry.second;
|
||||
auto item{*entry.second};
|
||||
if (!item.required)
|
||||
continue;
|
||||
//Each cargo container may contain multiple export items
|
||||
|
||||
@@ -16,6 +16,11 @@ enum SpeckleTitleString {
|
||||
untitledProjectID = 1,
|
||||
unknownElementTypeID,
|
||||
conversionProgressID,
|
||||
notifyDialogTitleID,
|
||||
confirmDialogTitleID,
|
||||
positiveResponseTitleID,
|
||||
negativeResponseTitleID,
|
||||
okButtonTitleID,
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -722,6 +722,22 @@
|
||||
21D0BDC42C9241940077E104 /* ProjectSubscriber.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21D0BDC22C9241940077E104 /* ProjectSubscriber.cpp */; };
|
||||
21D0BDC52C9241940077E104 /* ProjectSubscriber.h in Headers */ = {isa = PBXBuildFile; fileRef = 21D0BDC32C9241940077E104 /* ProjectSubscriber.h */; };
|
||||
21D0BDE72C943D3F0077E104 /* RecordID.h in Headers */ = {isa = PBXBuildFile; fileRef = 21D0BDE42C943D3F0077E104 /* RecordID.h */; };
|
||||
21F0AE312CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE2E2CEB7045003AD722 /* ElementVisibilityCollector.h */; };
|
||||
21F0AE322CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE2F2CEB7045003AD722 /* ElementVisibilityCollector.cpp */; };
|
||||
21F0AE332CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE2E2CEB7045003AD722 /* ElementVisibilityCollector.h */; };
|
||||
21F0AE342CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE2F2CEB7045003AD722 /* ElementVisibilityCollector.cpp */; };
|
||||
21F0AE352CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE2F2CEB7045003AD722 /* ElementVisibilityCollector.cpp */; };
|
||||
21F0AE362CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE2E2CEB7045003AD722 /* ElementVisibilityCollector.h */; };
|
||||
21F0AE372CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE2E2CEB7045003AD722 /* ElementVisibilityCollector.h */; };
|
||||
21F0AE382CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE2F2CEB7045003AD722 /* ElementVisibilityCollector.cpp */; };
|
||||
21F0AE3D2CEB91F9003AD722 /* Layer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE3C2CEB91F9003AD722 /* Layer.cpp */; };
|
||||
21F0AE3E2CEB91F9003AD722 /* Layer.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE3B2CEB91F9003AD722 /* Layer.h */; };
|
||||
21F0AE3F2CEB91F9003AD722 /* Layer.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE3B2CEB91F9003AD722 /* Layer.h */; };
|
||||
21F0AE402CEB91F9003AD722 /* Layer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE3C2CEB91F9003AD722 /* Layer.cpp */; };
|
||||
21F0AE412CEB91F9003AD722 /* Layer.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE3B2CEB91F9003AD722 /* Layer.h */; };
|
||||
21F0AE422CEB91F9003AD722 /* Layer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE3C2CEB91F9003AD722 /* Layer.cpp */; };
|
||||
21F0AE432CEB91F9003AD722 /* Layer.h in Headers */ = {isa = PBXBuildFile; fileRef = 21F0AE3B2CEB91F9003AD722 /* Layer.h */; };
|
||||
21F0AE442CEB91F9003AD722 /* Layer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F0AE3C2CEB91F9003AD722 /* Layer.cpp */; };
|
||||
21F69F3B2C6B880C008B6A06 /* JSBaseTransport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69F382C6B880B008B6A06 /* JSBaseTransport.cpp */; };
|
||||
21F69F512C6CCC25008B6A06 /* BrowserBridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69F4A2C6CCC25008B6A06 /* BrowserBridge.cpp */; };
|
||||
21F69F612C6D0286008B6A06 /* GetBindingsMethodNames.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 21F69F602C6D0286008B6A06 /* GetBindingsMethodNames.cpp */; };
|
||||
@@ -965,6 +981,10 @@
|
||||
21D0BDC32C9241940077E104 /* ProjectSubscriber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectSubscriber.h; sourceTree = "<group>"; };
|
||||
21D0BDC62C9245E40077E104 /* ProjectEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProjectEvent.h; sourceTree = "<group>"; };
|
||||
21D0BDE42C943D3F0077E104 /* RecordID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RecordID.h; sourceTree = "<group>"; };
|
||||
21F0AE2E2CEB7045003AD722 /* ElementVisibilityCollector.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ElementVisibilityCollector.h; sourceTree = "<group>"; };
|
||||
21F0AE2F2CEB7045003AD722 /* ElementVisibilityCollector.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ElementVisibilityCollector.cpp; sourceTree = "<group>"; };
|
||||
21F0AE3B2CEB91F9003AD722 /* Layer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Layer.h; sourceTree = "<group>"; };
|
||||
21F0AE3C2CEB91F9003AD722 /* Layer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = Layer.cpp; sourceTree = "<group>"; };
|
||||
21F69F012C66C229008B6A06 /* Doxyfile */ = {isa = PBXFileReference; lastKnownFileType = text; name = Doxyfile; path = Documentation/Doxyfile; sourceTree = "<group>"; };
|
||||
21F69F192C6A0FE2008B6A06 /* JSBinding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSBinding.h; sourceTree = "<group>"; };
|
||||
21F69F352C6AA9B3008B6A06 /* JSFunction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSFunction.h; sourceTree = "<group>"; };
|
||||
@@ -1180,8 +1200,8 @@
|
||||
215F088A2CA195EC00CD343B /* ArchicadDBase */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
215F08872CA195EC00CD343B /* ArchicadDBaseCore.cpp */,
|
||||
215F08882CA195EC00CD343B /* ArchicadDBaseCore.h */,
|
||||
215F08872CA195EC00CD343B /* ArchicadDBaseCore.cpp */,
|
||||
2196F2EA2CB4816B00450DFC /* Attribute */,
|
||||
219246062CA2D22D00CF5703 /* Element */,
|
||||
21A890C12CC171D80087E732 /* Property */,
|
||||
@@ -1297,6 +1317,8 @@
|
||||
2196F2EE2CB4823C00450DFC /* Attribute.h */,
|
||||
2196F2F32CB483D600450DFC /* Finish.cpp */,
|
||||
2196F2F22CB483D600450DFC /* Finish.h */,
|
||||
21F0AE3C2CEB91F9003AD722 /* Layer.cpp */,
|
||||
21F0AE3B2CEB91F9003AD722 /* Layer.h */,
|
||||
21384BEB2CD3EBE200D4602B /* Material.cpp */,
|
||||
21384BEA2CD3EBE200D4602B /* Material.h */,
|
||||
2196F3032CB57E7F00450DFC /* Storey.cpp */,
|
||||
@@ -1531,6 +1553,15 @@
|
||||
path = Storage;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
21F0AE302CEB7045003AD722 /* Filter */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
21F0AE2F2CEB7045003AD722 /* ElementVisibilityCollector.cpp */,
|
||||
21F0AE2E2CEB7045003AD722 /* ElementVisibilityCollector.h */,
|
||||
);
|
||||
path = Filter;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
21F69F1A2C6A0FE2008B6A06 /* Browser */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@@ -1619,6 +1650,7 @@
|
||||
21AE196D2CC64D37004DBCFC /* Classification */,
|
||||
21F69F942C71087A008B6A06 /* Credentials */,
|
||||
215F087A2CA18E1400CD343B /* Element */,
|
||||
21F0AE302CEB7045003AD722 /* Filter */,
|
||||
21AE194E2CC273F1004DBCFC /* Property */,
|
||||
);
|
||||
path = Record;
|
||||
@@ -1695,6 +1727,7 @@
|
||||
21A0FBA42CB880690023F24E /* FinishCollector.h in Headers */,
|
||||
21384C192CD585A600D4602B /* Roof.h in Headers */,
|
||||
21AE19802CC7D265004DBCFC /* PropertiedWrapper.h in Headers */,
|
||||
21F0AE3F2CEB91F9003AD722 /* Layer.h in Headers */,
|
||||
21CE99132CE5EF670076522F /* StructuredStair.h in Headers */,
|
||||
2199BB842CDE508800A4BEEC /* UserCancel.h in Headers */,
|
||||
21A0FC0B2CBE5E220023F24E /* Segment.h in Headers */,
|
||||
@@ -1729,6 +1762,7 @@
|
||||
21A0FBBC2CBBC04C0023F24E /* ArchicadRGB.h in Headers */,
|
||||
21384BFC2CD52C7500D4602B /* Conversion.h in Headers */,
|
||||
21CE99092CE563C60076522F /* Treads.h in Headers */,
|
||||
21F0AE372CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */,
|
||||
21AE19842CC7D517004DBCFC /* PropertyWrapper.h in Headers */,
|
||||
21A0FC052CBE59A80023F24E /* SegmentedColumn.h in Headers */,
|
||||
21A0FC0F2CBE92F10023F24E /* ModelElement.h in Headers */,
|
||||
@@ -1790,6 +1824,7 @@
|
||||
21BD7A812CE23FA800526AD1 /* FinishCollector.h in Headers */,
|
||||
21BD7A822CE23FA800526AD1 /* Roof.h in Headers */,
|
||||
21BD7A832CE23FA800526AD1 /* PropertiedWrapper.h in Headers */,
|
||||
21F0AE3E2CEB91F9003AD722 /* Layer.h in Headers */,
|
||||
21CE99152CE5EF670076522F /* StructuredStair.h in Headers */,
|
||||
21BD7A842CE23FA800526AD1 /* UserCancel.h in Headers */,
|
||||
21BD7A852CE23FA800526AD1 /* Segment.h in Headers */,
|
||||
@@ -1824,6 +1859,7 @@
|
||||
21BD7AA22CE23FA800526AD1 /* ArchicadRGB.h in Headers */,
|
||||
21BD7AA32CE23FA800526AD1 /* Conversion.h in Headers */,
|
||||
21CE990B2CE563C60076522F /* Treads.h in Headers */,
|
||||
21F0AE362CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */,
|
||||
21BD7AA42CE23FA800526AD1 /* PropertyWrapper.h in Headers */,
|
||||
21BD7AA52CE23FA800526AD1 /* SegmentedColumn.h in Headers */,
|
||||
21BD7AA62CE23FA800526AD1 /* ModelElement.h in Headers */,
|
||||
@@ -1885,6 +1921,7 @@
|
||||
21CE8A012CE4F2860076522F /* FinishCollector.h in Headers */,
|
||||
21CE8A022CE4F2860076522F /* Roof.h in Headers */,
|
||||
21CE8A032CE4F2860076522F /* PropertiedWrapper.h in Headers */,
|
||||
21F0AE432CEB91F9003AD722 /* Layer.h in Headers */,
|
||||
21CE99142CE5EF670076522F /* StructuredStair.h in Headers */,
|
||||
21CE8A042CE4F2860076522F /* UserCancel.h in Headers */,
|
||||
21CE8A052CE4F2860076522F /* Segment.h in Headers */,
|
||||
@@ -1919,6 +1956,7 @@
|
||||
21CE8A222CE4F2860076522F /* ArchicadRGB.h in Headers */,
|
||||
21CE8A232CE4F2860076522F /* Conversion.h in Headers */,
|
||||
21CE990A2CE563C60076522F /* Treads.h in Headers */,
|
||||
21F0AE332CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */,
|
||||
21CE8A242CE4F2860076522F /* PropertyWrapper.h in Headers */,
|
||||
21CE8A252CE4F2860076522F /* SegmentedColumn.h in Headers */,
|
||||
21CE8A262CE4F2860076522F /* ModelElement.h in Headers */,
|
||||
@@ -1980,6 +2018,7 @@
|
||||
21CE8D432CE5134E0076522F /* FinishCollector.h in Headers */,
|
||||
21CE8D442CE5134E0076522F /* Roof.h in Headers */,
|
||||
21CE8D452CE5134E0076522F /* PropertiedWrapper.h in Headers */,
|
||||
21F0AE412CEB91F9003AD722 /* Layer.h in Headers */,
|
||||
21CE99122CE5EF670076522F /* StructuredStair.h in Headers */,
|
||||
21CE8D462CE5134E0076522F /* UserCancel.h in Headers */,
|
||||
21CE8D472CE5134E0076522F /* Segment.h in Headers */,
|
||||
@@ -2014,6 +2053,7 @@
|
||||
21CE8D642CE5134E0076522F /* ArchicadRGB.h in Headers */,
|
||||
21CE8D652CE5134E0076522F /* Conversion.h in Headers */,
|
||||
21CE99082CE563C60076522F /* Treads.h in Headers */,
|
||||
21F0AE312CEB7045003AD722 /* ElementVisibilityCollector.h in Headers */,
|
||||
21CE8D662CE5134E0076522F /* PropertyWrapper.h in Headers */,
|
||||
21CE8D672CE5134E0076522F /* SegmentedColumn.h in Headers */,
|
||||
21CE8D682CE5134E0076522F /* ModelElement.h in Headers */,
|
||||
@@ -2113,7 +2153,7 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
BuildIndependentTargetsInParallel = 1;
|
||||
LastUpgradeCheck = 1510;
|
||||
LastUpgradeCheck = 1610;
|
||||
TargetAttributes = {
|
||||
21379E072AE47A6400A1584C = {
|
||||
CreatedOnToolsVersion = 15.0;
|
||||
@@ -2179,6 +2219,7 @@
|
||||
2193517B2C624FC100E5A69C /* MenuSubscriber.cpp in Sources */,
|
||||
2196F2F02CB4823C00450DFC /* Attribute.cpp in Sources */,
|
||||
21CE992D2CE622FC0076522F /* StairStructure.cpp in Sources */,
|
||||
21F0AE382CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */,
|
||||
21384C032CD57CA500D4602B /* Wall.cpp in Sources */,
|
||||
21F69F612C6D0286008B6A06 /* GetBindingsMethodNames.cpp in Sources */,
|
||||
21CE98F12CE5539B0076522F /* StairRiser.cpp in Sources */,
|
||||
@@ -2237,6 +2278,7 @@
|
||||
21384BE82CD3DD6200D4602B /* MaterialQuantity.cpp in Sources */,
|
||||
21AE19622CC2D358004DBCFC /* Setting.cpp in Sources */,
|
||||
219351B32C62CC1A00E5A69C /* String.cpp in Sources */,
|
||||
21F0AE402CEB91F9003AD722 /* Layer.cpp in Sources */,
|
||||
219351B12C62CC1A00E5A69C /* Guid.cpp in Sources */,
|
||||
21F69F512C6CCC25008B6A06 /* BrowserBridge.cpp in Sources */,
|
||||
21A0FC112CBEE5C30023F24E /* Part.cpp in Sources */,
|
||||
@@ -2279,6 +2321,7 @@
|
||||
21BD7ABC2CE23FA800526AD1 /* MenuSubscriber.cpp in Sources */,
|
||||
21BD7ABD2CE23FA800526AD1 /* Attribute.cpp in Sources */,
|
||||
21CE992F2CE622FC0076522F /* StairStructure.cpp in Sources */,
|
||||
21F0AE352CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */,
|
||||
21BD7ABE2CE23FA800526AD1 /* Wall.cpp in Sources */,
|
||||
21BD7ABF2CE23FA800526AD1 /* GetBindingsMethodNames.cpp in Sources */,
|
||||
21CE98F32CE5539B0076522F /* StairRiser.cpp in Sources */,
|
||||
@@ -2337,6 +2380,7 @@
|
||||
21BD7AEF2CE23FA800526AD1 /* MaterialQuantity.cpp in Sources */,
|
||||
21BD7AF02CE23FA800526AD1 /* Setting.cpp in Sources */,
|
||||
21BD7AF12CE23FA800526AD1 /* String.cpp in Sources */,
|
||||
21F0AE3D2CEB91F9003AD722 /* Layer.cpp in Sources */,
|
||||
21BD7AF22CE23FA800526AD1 /* Guid.cpp in Sources */,
|
||||
21BD7AF32CE23FA800526AD1 /* BrowserBridge.cpp in Sources */,
|
||||
21BD7AF42CE23FA800526AD1 /* Part.cpp in Sources */,
|
||||
@@ -2379,6 +2423,7 @@
|
||||
21CE8A3C2CE4F2860076522F /* MenuSubscriber.cpp in Sources */,
|
||||
21CE8A3D2CE4F2860076522F /* Attribute.cpp in Sources */,
|
||||
21CE992E2CE622FC0076522F /* StairStructure.cpp in Sources */,
|
||||
21F0AE342CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */,
|
||||
21CE8A3E2CE4F2860076522F /* Wall.cpp in Sources */,
|
||||
21CE8A3F2CE4F2860076522F /* GetBindingsMethodNames.cpp in Sources */,
|
||||
21CE98F22CE5539B0076522F /* StairRiser.cpp in Sources */,
|
||||
@@ -2437,6 +2482,7 @@
|
||||
21CE8A6F2CE4F2860076522F /* MaterialQuantity.cpp in Sources */,
|
||||
21CE8A702CE4F2860076522F /* Setting.cpp in Sources */,
|
||||
21CE8A712CE4F2860076522F /* String.cpp in Sources */,
|
||||
21F0AE442CEB91F9003AD722 /* Layer.cpp in Sources */,
|
||||
21CE8A722CE4F2860076522F /* Guid.cpp in Sources */,
|
||||
21CE8A732CE4F2860076522F /* BrowserBridge.cpp in Sources */,
|
||||
21CE8A742CE4F2860076522F /* Part.cpp in Sources */,
|
||||
@@ -2479,6 +2525,7 @@
|
||||
21CE8D7E2CE5134E0076522F /* MenuSubscriber.cpp in Sources */,
|
||||
21CE8D7F2CE5134E0076522F /* Attribute.cpp in Sources */,
|
||||
21CE992C2CE622FC0076522F /* StairStructure.cpp in Sources */,
|
||||
21F0AE322CEB7045003AD722 /* ElementVisibilityCollector.cpp in Sources */,
|
||||
21CE8D802CE5134E0076522F /* Wall.cpp in Sources */,
|
||||
21CE8D812CE5134E0076522F /* GetBindingsMethodNames.cpp in Sources */,
|
||||
21CE98F02CE5539B0076522F /* StairRiser.cpp in Sources */,
|
||||
@@ -2537,6 +2584,7 @@
|
||||
21CE8DB12CE5134E0076522F /* MaterialQuantity.cpp in Sources */,
|
||||
21CE8DB22CE5134E0076522F /* Setting.cpp in Sources */,
|
||||
21CE8DB32CE5134E0076522F /* String.cpp in Sources */,
|
||||
21F0AE422CEB91F9003AD722 /* Layer.cpp in Sources */,
|
||||
21CE8DB42CE5134E0076522F /* Guid.cpp in Sources */,
|
||||
21CE8DB52CE5134E0076522F /* BrowserBridge.cpp in Sources */,
|
||||
21CE8DB62CE5134E0076522F /* Part.cpp in Sources */,
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "1530"
|
||||
LastUpgradeVersion = "1610"
|
||||
version = "1.7">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user