Compare commits

..

1 Commits

Author SHA1 Message Date
oguzhankoral 77645fbea4 Batch sample 2024-10-02 18:17:13 +03:00
326 changed files with 1666 additions and 29881 deletions
-11
View File
@@ -1,11 +0,0 @@
{
"version": 1,
"isRoot": true,
"tools": {
"gitversion.tool": {
"version": "6.0.2",
"commands": ["dotnet-gitversion"],
"rollForward": false
}
}
}
-91
View File
@@ -1,91 +0,0 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
name: MSBuild
on:
push:
branches: ["main", "develop", "release/*", "alan/*"] # Continuous delivery on every long-lived branch
tags: ["v3.*"] # Manual delivery on every 3.x tag
permissions:
contents: read
jobs:
build:
runs-on: windows-latest
outputs:
version: ${{ steps.set-version.outputs.version }}
file_version: ${{ steps.set-info-version.outputs.file_version }}
steps:
- uses: actions/checkout@v4
with:
path: speckle-cpp-connectors
fetch-depth: 0
- uses: actions/checkout@v4
with:
repository: r-wessel/ActiveLib
path: ActiveLib
ref: develop
- name: Download zip file
run: |
New-Item -ItemType Directory -Path "Archicad 27" -Force
Invoke-WebRequest -Uri "https://github.com/GRAPHISOFT/archicad-api-devkit/releases/download/27.3001/API.Development.Kit.WIN.27.3001.zip" -OutFile "file.zip"
- name: Extract zip file to Archicad 27 folder
run: |
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory("file.zip", "Archicad 27")
- name: Add MSBuild to PATH
uses: microsoft/setup-msbuild@v2
- name: ⚒️ Run GitVersion
working-directory: speckle-cpp-connectors
run: ./build.ps1 build-server-version
- name: Build
working-directory: speckle-cpp-connectors
run: ./build.ps1
- uses: actions/upload-artifact@v4
with:
name: output-${{ env.GitVersion_FullSemVer }}
path: speckle-cpp-connectors/output/*.zip
retention-days: 1
- id: set-version
name: Set version to output
run: echo "version=${{ env.GitVersion_FullSemVer }}" >> "$Env:GITHUB_OUTPUT"
- id: set-info-version
name: Set file version to output
run: echo "file_version=${{ env.GitVersion_AssemblySemVer}}" >> "$Env:GITHUB_OUTPUT" # version will be retrieved from tag?
deploy-installers:
runs-on: ubuntu-latest
needs: build
env:
IS_TAG_BUILD: ${{ github.ref_type == 'tag' }}
IS_RELEASE_BRANCH: true
steps:
- name: 🔫 Trigger Build Installers
uses: ALEEF02/workflow-dispatch@v3.0.0
continue-on-error: true
with:
workflow: build-cpp-installers
repo: specklesystems/connector-installers
token: ${{ secrets.CONNECTORS_GH_TOKEN }}
inputs: '{ "run_id": "${{ github.run_id }}", "version": "${{ needs.build.outputs.version }}", "file_version": "${{needs.build.outputs.file_version}}", "public_release": ${{ env.IS_TAG_BUILD }}, "store_artifacts": ${{ env.IS_RELEASE_BRANCH }} }'
ref: main
wait-for-completion: true
wait-for-completion-interval: 10s
wait-for-completion-timeout: 10m
display-workflow-run-url: true
display-workflow-run-url-interval: 10s
- uses: geekyeggo/delete-artifact@v5
with:
name: output-*
-4
View File
@@ -3,7 +3,6 @@ build/
Documents/ Documents/
ResourceObjects/ ResourceObjects/
Install/ Install/
enc_temp_folder/
.vs/ .vs/
.vscode/ .vscode/
xcuserdata/ xcuserdata/
@@ -27,6 +26,3 @@ XCBuildData/
.idea .idea
*.mui *.mui
*.aps *.aps
**/obj
**/bin
output/
-6
View File
@@ -1,6 +0,0 @@
workflow: GitFlow/v1
next-version: 3.0.0
branches:
release:
prevent-increment:
when-current-commit-tagged: true
-138
View File
@@ -13,36 +13,22 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ActiveLib17", "..\..\Active
EndProject EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SpeckleLib17", "..\SpeckleLib\SpeckleLib17.vcxproj", "{942743B7-B3CB-4F91-BE46-28937F5E3FD1}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SpeckleLib17", "..\SpeckleLib\SpeckleLib17.vcxproj", "{942743B7-B3CB-4F91-BE46-28937F5E3FD1}"
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Build", "..\ci-build\Build.csproj", "{702DE13A-1CCF-485D-A50D-846F645F07D3}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug16|x64 = Debug16|x64 Debug16|x64 = Debug16|x64
Debug16|x86 = Debug16|x86 Debug16|x86 = Debug16|x86
Debug17|x64 = Debug17|x64 Debug17|x64 = Debug17|x64
Debug17|x86 = Debug17|x86 Debug17|x86 = Debug17|x86
DebugAC25|x64 = DebugAC25|x64
DebugAC25|x86 = DebugAC25|x86
DebugAC26|x64 = DebugAC26|x64
DebugAC26|x86 = DebugAC26|x86
DebugAC27|x64 = DebugAC27|x64 DebugAC27|x64 = DebugAC27|x64
DebugAC27|x86 = DebugAC27|x86 DebugAC27|x86 = DebugAC27|x86
DebugAC28|x64 = DebugAC28|x64
DebugAC28|x86 = DebugAC28|x86
DebugVS2022|x64 = DebugVS2022|x64 DebugVS2022|x64 = DebugVS2022|x64
DebugVS2022|x86 = DebugVS2022|x86 DebugVS2022|x86 = DebugVS2022|x86
Release16|x64 = Release16|x64 Release16|x64 = Release16|x64
Release16|x86 = Release16|x86 Release16|x86 = Release16|x86
Release17|x64 = Release17|x64 Release17|x64 = Release17|x64
Release17|x86 = Release17|x86 Release17|x86 = Release17|x86
ReleaseAC25|x64 = ReleaseAC25|x64
ReleaseAC25|x86 = ReleaseAC25|x86
ReleaseAC26|x64 = ReleaseAC26|x64
ReleaseAC26|x86 = ReleaseAC26|x86
ReleaseAC27|x64 = ReleaseAC27|x64 ReleaseAC27|x64 = ReleaseAC27|x64
ReleaseAC27|x86 = ReleaseAC27|x86 ReleaseAC27|x86 = ReleaseAC27|x86
ReleaseAC28|x64 = ReleaseAC28|x64
ReleaseAC28|x86 = ReleaseAC28|x86
ReleaseVS2019|x64 = ReleaseVS2019|x64 ReleaseVS2019|x64 = ReleaseVS2019|x64
ReleaseVS2019|x86 = ReleaseVS2019|x86 ReleaseVS2019|x86 = ReleaseVS2019|x86
ReleaseVS2022|x64 = ReleaseVS2022|x64 ReleaseVS2022|x64 = ReleaseVS2022|x64
@@ -57,22 +43,10 @@ Global
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Debug17|x64.Build.0 = DebugVW2024|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Debug17|x64.Build.0 = DebugVW2024|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Debug17|x86.ActiveCfg = DebugAC27|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Debug17|x86.ActiveCfg = DebugAC27|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Debug17|x86.Build.0 = DebugAC27|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Debug17|x86.Build.0 = DebugAC27|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC25|x64.ActiveCfg = DebugAC25|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC25|x64.Build.0 = DebugAC25|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC25|x86.ActiveCfg = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC25|x86.Build.0 = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC26|x64.ActiveCfg = DebugAC26|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC26|x64.Build.0 = DebugAC26|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC26|x86.ActiveCfg = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC26|x86.Build.0 = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x64.ActiveCfg = DebugAC27|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x64.ActiveCfg = DebugAC27|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x64.Build.0 = DebugAC27|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x64.Build.0 = DebugAC27|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x86.ActiveCfg = DebugVW2024|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x86.ActiveCfg = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x86.Build.0 = DebugVW2024|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC27|x86.Build.0 = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC28|x64.ActiveCfg = DebugAC28|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC28|x64.Build.0 = DebugAC28|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC28|x86.ActiveCfg = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugAC28|x86.Build.0 = DebugVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugVS2022|x64.ActiveCfg = DebugVW2024|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugVS2022|x64.ActiveCfg = DebugVW2024|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugVS2022|x64.Build.0 = DebugVW2024|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugVS2022|x64.Build.0 = DebugVW2024|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugVS2022|x86.ActiveCfg = DebugRV2024|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.DebugVS2022|x86.ActiveCfg = DebugRV2024|Win32
@@ -85,22 +59,10 @@ Global
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Release17|x64.Build.0 = ReleaseVW2024|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Release17|x64.Build.0 = ReleaseVW2024|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Release17|x86.ActiveCfg = ReleaseAC27|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Release17|x86.ActiveCfg = ReleaseAC27|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Release17|x86.Build.0 = ReleaseAC27|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.Release17|x86.Build.0 = ReleaseAC27|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC25|x64.ActiveCfg = ReleaseAC25|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC25|x64.Build.0 = ReleaseAC25|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC25|x86.ActiveCfg = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC25|x86.Build.0 = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC26|x64.ActiveCfg = ReleaseAC26|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC26|x64.Build.0 = ReleaseAC26|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC26|x86.ActiveCfg = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC26|x86.Build.0 = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x64.ActiveCfg = ReleaseAC27|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x64.ActiveCfg = ReleaseAC27|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x64.Build.0 = ReleaseAC27|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x64.Build.0 = ReleaseAC27|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x86.ActiveCfg = ReleaseVW2024|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x86.ActiveCfg = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x86.Build.0 = ReleaseVW2024|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC27|x86.Build.0 = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC28|x64.ActiveCfg = ReleaseAC28|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC28|x64.Build.0 = ReleaseAC28|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC28|x86.ActiveCfg = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseAC28|x86.Build.0 = ReleaseVW2024|Win32
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseVS2019|x64.ActiveCfg = ReleaseVW2024|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseVS2019|x64.ActiveCfg = ReleaseVW2024|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseVS2019|x64.Build.0 = ReleaseVW2024|x64 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseVS2019|x64.Build.0 = ReleaseVW2024|x64
{CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseVS2019|x86.ActiveCfg = ReleaseRV2024|Win32 {CB120C04-054F-485B-BB5F-1EDE23F7FACB}.ReleaseVS2019|x86.ActiveCfg = ReleaseRV2024|Win32
@@ -117,22 +79,10 @@ Global
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Debug17|x64.Build.0 = Debug17|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Debug17|x64.Build.0 = Debug17|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Debug17|x86.ActiveCfg = Debug17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Debug17|x86.ActiveCfg = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Debug17|x86.Build.0 = Debug17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Debug17|x86.Build.0 = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC25|x64.ActiveCfg = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC25|x64.Build.0 = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC25|x86.ActiveCfg = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC25|x86.Build.0 = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC26|x64.ActiveCfg = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC26|x64.Build.0 = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC26|x86.ActiveCfg = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC26|x86.Build.0 = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x64.ActiveCfg = Debug16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x64.ActiveCfg = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x64.Build.0 = Debug16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x64.Build.0 = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x86.ActiveCfg = Debug17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x86.ActiveCfg = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x86.Build.0 = Debug17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC27|x86.Build.0 = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC28|x64.ActiveCfg = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC28|x64.Build.0 = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC28|x86.ActiveCfg = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugAC28|x86.Build.0 = Debug17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugVS2022|x64.ActiveCfg = Debug16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugVS2022|x64.ActiveCfg = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugVS2022|x64.Build.0 = Debug16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugVS2022|x64.Build.0 = Debug16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugVS2022|x86.ActiveCfg = Debug17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.DebugVS2022|x86.ActiveCfg = Debug17|Win32
@@ -145,22 +95,10 @@ Global
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Release17|x64.Build.0 = Release17|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Release17|x64.Build.0 = Release17|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Release17|x86.ActiveCfg = Release17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Release17|x86.ActiveCfg = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Release17|x86.Build.0 = Release17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.Release17|x86.Build.0 = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC25|x64.ActiveCfg = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC25|x64.Build.0 = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC25|x86.ActiveCfg = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC25|x86.Build.0 = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC26|x64.ActiveCfg = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC26|x64.Build.0 = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC26|x86.ActiveCfg = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC26|x86.Build.0 = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x64.ActiveCfg = Release16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x64.ActiveCfg = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x64.Build.0 = Release16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x64.Build.0 = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x86.ActiveCfg = Release17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x86.ActiveCfg = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x86.Build.0 = Release17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC27|x86.Build.0 = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC28|x64.ActiveCfg = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC28|x64.Build.0 = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC28|x86.ActiveCfg = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseAC28|x86.Build.0 = Release17|Win32
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseVS2019|x64.ActiveCfg = Release16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseVS2019|x64.ActiveCfg = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseVS2019|x64.Build.0 = Release16|x64 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseVS2019|x64.Build.0 = Release16|x64
{64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseVS2019|x86.ActiveCfg = Release17|Win32 {64EBDBC7-AB2D-4AE1-8E54-922B6FA6E1CC}.ReleaseVS2019|x86.ActiveCfg = Release17|Win32
@@ -177,22 +115,10 @@ Global
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Debug17|x64.Build.0 = DebugAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Debug17|x64.Build.0 = DebugAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Debug17|x86.ActiveCfg = DebugAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Debug17|x86.ActiveCfg = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Debug17|x86.Build.0 = DebugAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Debug17|x86.Build.0 = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC25|x64.ActiveCfg = DebugAC25|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC25|x64.Build.0 = DebugAC25|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC25|x86.ActiveCfg = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC25|x86.Build.0 = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC26|x64.ActiveCfg = DebugAC26|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC26|x64.Build.0 = DebugAC26|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC26|x86.ActiveCfg = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC26|x86.Build.0 = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x64.ActiveCfg = DebugAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x64.ActiveCfg = DebugAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x64.Build.0 = DebugAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x64.Build.0 = DebugAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x86.ActiveCfg = DebugAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x86.ActiveCfg = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x86.Build.0 = DebugAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC27|x86.Build.0 = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC28|x64.ActiveCfg = DebugAC28|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC28|x64.Build.0 = DebugAC28|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC28|x86.ActiveCfg = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugAC28|x86.Build.0 = DebugAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugVS2022|x64.ActiveCfg = DebugAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugVS2022|x64.ActiveCfg = DebugAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugVS2022|x64.Build.0 = DebugAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugVS2022|x64.Build.0 = DebugAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugVS2022|x86.ActiveCfg = DebugAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.DebugVS2022|x86.ActiveCfg = DebugAC27|Win32
@@ -205,22 +131,10 @@ Global
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Release17|x64.Build.0 = ReleaseAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Release17|x64.Build.0 = ReleaseAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Release17|x86.ActiveCfg = ReleaseAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Release17|x86.ActiveCfg = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Release17|x86.Build.0 = ReleaseAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.Release17|x86.Build.0 = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC25|x64.ActiveCfg = ReleaseAC25|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC25|x64.Build.0 = ReleaseAC25|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC25|x86.ActiveCfg = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC25|x86.Build.0 = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC26|x64.ActiveCfg = ReleaseAC26|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC26|x64.Build.0 = ReleaseAC26|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC26|x86.ActiveCfg = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC26|x86.Build.0 = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x64.ActiveCfg = ReleaseAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x64.ActiveCfg = ReleaseAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x64.Build.0 = ReleaseAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x64.Build.0 = ReleaseAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x86.ActiveCfg = ReleaseAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x86.ActiveCfg = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x86.Build.0 = ReleaseAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC27|x86.Build.0 = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC28|x64.ActiveCfg = ReleaseAC28|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC28|x64.Build.0 = ReleaseAC28|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC28|x86.ActiveCfg = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseAC28|x86.Build.0 = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2019|x64.ActiveCfg = ReleaseAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2019|x64.ActiveCfg = ReleaseAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2019|x64.Build.0 = ReleaseAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2019|x64.Build.0 = ReleaseAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2019|x86.ActiveCfg = ReleaseAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2019|x86.ActiveCfg = ReleaseAC27|Win32
@@ -229,58 +143,6 @@ Global
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2022|x64.Build.0 = ReleaseAC27|x64 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2022|x64.Build.0 = ReleaseAC27|x64
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2022|x86.ActiveCfg = ReleaseAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2022|x86.ActiveCfg = ReleaseAC27|Win32
{942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2022|x86.Build.0 = ReleaseAC27|Win32 {942743B7-B3CB-4F91-BE46-28937F5E3FD1}.ReleaseVS2022|x86.Build.0 = ReleaseAC27|Win32
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug16|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug16|x64.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug16|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug16|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug17|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug17|x64.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug17|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Debug17|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC25|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC25|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC25|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC26|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC26|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC26|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC27|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC27|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC27|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC28|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC28|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugAC28|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugVS2022|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugVS2022|x64.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugVS2022|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.DebugVS2022|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release16|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release16|x64.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release16|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release16|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release17|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release17|x64.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release17|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.Release17|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC25|x64.ActiveCfg = Release|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC25|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC25|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC26|x64.ActiveCfg = Release|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC26|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC26|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC27|x64.ActiveCfg = Release|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC27|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC27|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC28|x64.ActiveCfg = Release|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC28|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseAC28|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2019|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2019|x64.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2019|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2019|x86.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2022|x64.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2022|x64.Build.0 = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2022|x86.ActiveCfg = Debug|Any CPU
{702DE13A-1CCF-485D-A50D-846F645F07D3}.ReleaseVS2022|x86.Build.0 = Debug|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
File diff suppressed because it is too large Load Diff
+11 -99
View File
@@ -65,21 +65,6 @@
<Filter Include="Connector\Interface\Browser\Bridge\Send\Arg"> <Filter Include="Connector\Interface\Browser\Bridge\Send\Arg">
<UniqueIdentifier>{6693f9a9-5ece-4853-b008-4064d1c551ab}</UniqueIdentifier> <UniqueIdentifier>{6693f9a9-5ece-4853-b008-4064d1c551ab}</UniqueIdentifier>
</Filter> </Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Selection">
<UniqueIdentifier>{806f4af5-fa02-49b8-ac01-297991fe90ea}</UniqueIdentifier>
</Filter>
<Filter Include="Connector\Interface\Browser\Bridge\Selection\Arg">
<UniqueIdentifier>{8bb3df60-affe-4b66-8d78-f1b98e6ba8df}</UniqueIdentifier>
</Filter>
<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>
<ItemGroup> <ItemGroup>
<None Include="RFIX.win\Connector.rc2"> <None Include="RFIX.win\Connector.rc2">
@@ -104,6 +89,9 @@
</ResourceCompile> </ResourceCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Connector\Connector.cpp">
<Filter>Connector</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\ConnectorMenu.cpp"> <ClCompile Include="Connector\Interface\ConnectorMenu.cpp">
<Filter>Connector\Interface</Filter> <Filter>Connector\Interface</Filter>
</ClCompile> </ClCompile>
@@ -170,6 +158,7 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\SendBridge.cpp"> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\SendBridge.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.cpp" />
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Send.cpp"> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\Send.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClCompile> </ClCompile>
@@ -218,6 +207,9 @@
<ClCompile Include="Connector\Record\Collection\RecordCollection.cpp"> <ClCompile Include="Connector\Record\Collection\RecordCollection.cpp">
<Filter>Connector\Record\Collection</Filter> <Filter>Connector\Record\Collection</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Connector\Record\Collection\RootCollection.cpp">
<Filter>Connector\Record\Collection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.cpp"> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter> <Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter>
</ClCompile> </ClCompile>
@@ -233,48 +225,6 @@
<ClCompile Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.cpp"> <ClCompile Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.cpp">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Connector\Record\Collection\FinishProxy.cpp">
<Filter>Connector\Record\Collection</Filter>
</ClCompile>
<ClCompile Include="Connector\Record\Collection\ProjectCollection.cpp">
<Filter>Connector\Record\Collection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\GetSelection.cpp">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\SelectionBridge.cpp">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Selection\Arg\SelectionInfo.cpp">
<Filter>Connector\Interface\Browser\Bridge\Selection\Arg</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\HighlightModel.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\OpenUrl.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<ClCompile Include="Connector\Environment\ConnectorProject.cpp">
<Filter>Connector\Environment</Filter>
</ClCompile>
<ClCompile Include="Connector\Interface\Browser\Bridge\Base\HighlightObjects.cpp">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClCompile>
<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>
<ItemGroup> <ItemGroup>
<ClInclude Include="Connector\ConnectorResource.h"> <ClInclude Include="Connector\ConnectorResource.h">
@@ -355,6 +305,7 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\SendBridge.h"> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\SendBridge.h">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Config\GetIsDevMode.h" />
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Send.h"> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\Send.h">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClInclude> </ClInclude>
@@ -412,6 +363,9 @@
<ClInclude Include="Connector\Record\Collection\RecordCollection.h"> <ClInclude Include="Connector\Record\Collection\RecordCollection.h">
<Filter>Connector\Record\Collection</Filter> <Filter>Connector\Record\Collection</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Connector\Record\Collection\RootCollection.h">
<Filter>Connector\Record\Collection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.h"> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\ConversionResult.h">
<Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter> <Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter>
</ClInclude> </ClInclude>
@@ -427,47 +381,5 @@
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.h"> <ClInclude Include="Connector\Interface\Browser\Bridge\Send\GetSendSettings.h">
<Filter>Connector\Interface\Browser\Bridge\Send</Filter> <Filter>Connector\Interface\Browser\Bridge\Send</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Connector\Record\Collection\FinishProxy.h">
<Filter>Connector\Record\Collection</Filter>
</ClInclude>
<ClInclude Include="Connector\Record\Collection\ProjectCollection.h">
<Filter>Connector\Record\Collection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\GetSelection.h">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\SelectionBridge.h">
<Filter>Connector\Interface\Browser\Bridge\Selection</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Selection\Arg\SelectionInfo.h">
<Filter>Connector\Interface\Browser\Bridge\Selection\Arg</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\HighlightModel.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\OpenUrl.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<ClInclude Include="Connector\Environment\ConnectorProject.h">
<Filter>Connector\Environment</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Send\Arg\SendConversionResult.h">
<Filter>Connector\Interface\Browser\Bridge\Send\Arg</Filter>
</ClInclude>
<ClInclude Include="Connector\Interface\Browser\Bridge\Base\HighlightObjects.h">
<Filter>Connector\Interface\Browser\Bridge\Base</Filter>
</ClInclude>
<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> </ItemGroup>
</Project> </Project>
-30
View File
@@ -15,21 +15,6 @@
<LocalDebuggerAttach>false</LocalDebuggerAttach> <LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugAC28|x64'">
<LocalDebuggerCommand>C:\Program Files\Graphisoft\Archicad 28\Archicad.exe</LocalDebuggerCommand>
<LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugAC26|x64'">
<LocalDebuggerCommand>C:\Program Files\Graphisoft\Archicad 26\Archicad.exe</LocalDebuggerCommand>
<LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugAC25|x64'">
<LocalDebuggerCommand>C:\Program Files\Graphisoft\ARCHICAD 25\Archicad.exe</LocalDebuggerCommand>
<LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVW2024|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVW2024|x64'">
<LocalDebuggerCommand>C:\Program Files\Vectorworks 2024\Vectorworks2024.exe</LocalDebuggerCommand> <LocalDebuggerCommand>C:\Program Files\Vectorworks 2024\Vectorworks2024.exe</LocalDebuggerCommand>
<LocalDebuggerAttach>false</LocalDebuggerAttach> <LocalDebuggerAttach>false</LocalDebuggerAttach>
@@ -45,19 +30,4 @@
<LocalDebuggerAttach>false</LocalDebuggerAttach> <LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor> <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseAC28|x64'">
<LocalDebuggerCommand>C:\Program Files\Graphisoft\Archicad 28\Archicad.exe</LocalDebuggerCommand>
<LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseAC26|x64'">
<LocalDebuggerCommand>C:\Program Files\Graphisoft\Archicad 26\Archicad.exe</LocalDebuggerCommand>
<LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseAC25|x64'">
<LocalDebuggerCommand>C:\Program Files\Graphisoft\ARCHICAD 25\Archicad.exe</LocalDebuggerCommand>
<LocalDebuggerAttach>false</LocalDebuggerAttach>
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
</PropertyGroup>
</Project> </Project>
File diff suppressed because it is too large Load Diff
@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1610"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21BD79802CE23E4D00526AD1"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC25-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
FilePath = "/Applications/Graphisoft/ARCHICAD 25/ARCHICAD 25.app">
</PathRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21BD79802CE23E4D00526AD1"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC25-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1610"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21BD79802CE23E4D00526AD1"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC25-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
FilePath = "/Applications/Graphisoft/ARCHICAD 25/ARCHICAD 25.app">
</PathRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21BD79802CE23E4D00526AD1"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC25-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Release">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,72 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1610"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8A922CE4F3370076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC26-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
BundleIdentifier = "com.graphisoft.archicad26"
FilePath = "/Applications/Graphisoft/Archicad 26/Archicad 26.app">
</PathRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8A922CE4F3370076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC26-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1610"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8A922CE4F3370076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC26-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
FilePath = "/Applications/Graphisoft/Archicad 26/Archicad 26.app">
</PathRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8A922CE4F3370076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC26-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Release">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1610" LastUpgradeVersion = "1530"
version = "1.7"> version = "1.7">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1610" LastUpgradeVersion = "1530"
version = "1.7"> version = "1.7">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1610" LastUpgradeVersion = "1530"
version = "1.7"> version = "1.7">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -39,10 +39,6 @@
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
FilePath = "/Applications/Graphisoft/Archicad 27/Archicad 27.app">
</PathRunnable>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release" buildConfiguration = "Release"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1610" LastUpgradeVersion = "1530"
version = "1.7"> version = "1.7">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1610"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8DD22CE5137C0076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC28-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
FilePath = "/Applications/Graphisoft/Archicad 28/Archicad 28.app">
</PathRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8DD22CE5137C0076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC28-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1610"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8DD22CE5137C0076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC28-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = ""
selectedLauncherIdentifier = "Xcode.IDEFoundation.Launcher.PosixSpawn"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Release"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<PathRunnable
runnableDebuggingMode = "0"
FilePath = "/Applications/Graphisoft/Archicad 28/Archicad 28.app">
</PathRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "21CE8DD22CE5137C0076522F"
BuildableName = "Speckle Connector.bundle"
BlueprintName = "Connector-AC28-EN-GB"
ReferencedContainer = "container:Connector.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Release">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
+9 -53
View File
@@ -1,28 +1,17 @@
#include "Active/File/Directory.h" #include "Active/File/Directory.h"
#include "ConnectorResource.h" #include "ConnectorResource.h"
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/Environment/ConnectorProject.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/ConnectorMenu.h" #include "Connector/Interface/ConnectorMenu.h"
#include "Connector/Interface/ConnectorPalette.h" #include "Connector/Interface/ConnectorPalette.h"
#include "Connector/Tool/ElementHighlighter.h"
#include "Speckle/Database/AccountDatabase.h" #include "Speckle/Database/AccountDatabase.h"
#include "Speckle/Environment/Addon.h" #include "Speckle/Environment/Addon.h"
#include "Speckle/Utility/String.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::file;
using namespace active::environment; using namespace active::environment;
using namespace connector; using namespace connector;
using namespace connector::environment; using namespace connector::database;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::environment; using namespace speckle::environment;
using namespace speckle::utility; using namespace speckle::utility;
@@ -34,24 +23,14 @@ namespace {
//The account database name //The account database name
const char* accountDBaseName = "Accounts.db"; const char* accountDBaseName = "Accounts.db";
///The Connector addon class
/*!
Class for a concrete instance of an add-on
This class is private to prevent ad-hoc construction of instances while fulfilling the requirements of the public interface. Essentially
this should behave as a singleton, representing the sole instance of the running add-on
*/
class ConnectorInstance : public ConnectorAddon { class ConnectorInstance : public ConnectorAddon {
public: public:
/*!
Constructor
@param name The connector add-on name
*/
ConnectorInstance(const String& name) : ConnectorAddon{name} { ConnectorInstance(const String& name) : ConnectorAddon{name} {
//Define the connector UI components
add<ConnectorMenu>(); add<ConnectorMenu>();
add<ConnectorPalette>(); add<ConnectorPalette>();
add<ElementHighlighter>(); //The connector 'owns' the model card database, so the publisher list should only hold a weak reference
addWeak(m_modelCards.getSubscription());
} }
// MARK: Functions (const) // MARK: Functions (const)
@@ -61,24 +40,17 @@ namespace {
@return The account database @return The account database
*/ */
const AccountDatabase* getAccountDatabase() const override; const AccountDatabase* getAccountDatabase() const override;
protected:
/*! /*!
Make a new new project. Allows Addon subclasses to define a Project subclass with additional functions/databases Get the model card database
@return A new project instance @return The model card database
*/ */
virtual std::shared_ptr<Project> makeProject() const override { const ModelCardDatabase* getModelCardDatabase() const override { return &m_modelCards; }
return std::dynamic_pointer_cast<Project>(std::make_shared<ConnectorProject>());
}
private: private:
///The accounts database - always a single instance for the active user
mutable std::unique_ptr<AccountDatabase> m_account; mutable std::unique_ptr<AccountDatabase> m_account;
///Mutex to control access to the accounts database ModelCardDatabase m_modelCards;
mutable std::mutex m_accountMutex;
}; };
///The active addon instance ///The active addon instance
std::unique_ptr<ConnectorAddon> m_addonInstance; std::unique_ptr<ConnectorAddon> m_addonInstance;
@@ -95,18 +67,6 @@ namespace {
return Directory{*appData, speckleDataDirName, true}; return Directory{*appData, speckleDataDirName, true};
} //getAppDataDirectory } //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
} }
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
@@ -115,9 +75,6 @@ namespace {
name: The add-on name name: The add-on name
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
ConnectorAddon::ConnectorAddon(const speckle::utility::String& name) : Addon{name} { ConnectorAddon::ConnectorAddon(const speckle::utility::String& name) : Addon{name} {
#ifdef WINDOWS
invokeSpecialisation();
#endif
} //ConnectorAddon::ConnectorAddon } //ConnectorAddon::ConnectorAddon
@@ -127,7 +84,6 @@ ConnectorAddon::ConnectorAddon(const speckle::utility::String& name) : Addon{nam
return: The account database return: The account database
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
const AccountDatabase* ConnectorInstance::getAccountDatabase() const { const AccountDatabase* ConnectorInstance::getAccountDatabase() const {
const std::lock_guard<std::mutex> lock{m_accountMutex};
if (!m_account) { if (!m_account) {
auto speckleDirectory = getAppDataDirectory(); auto speckleDirectory = getAppDataDirectory();
if (!speckleDirectory) if (!speckleDirectory)
+10
View File
@@ -1,7 +1,12 @@
#include "Speckle/Environment/Addon.h" #include "Speckle/Environment/Addon.h"
#include "Speckle/Utility/String.h"
namespace speckle::database { namespace speckle::database {
class AccountDatabase; class AccountDatabase;
class BIMElementDatabase;
}
namespace connector::database {
class ModelCardDatabase;
} }
namespace connector { namespace connector {
@@ -17,6 +22,11 @@ namespace connector {
@return The account database @return The account database
*/ */
const virtual speckle::database::AccountDatabase* getAccountDatabase() const = 0; const virtual speckle::database::AccountDatabase* getAccountDatabase() const = 0;
/*!
Get the model card database
@return The model card database
*/
const virtual database::ModelCardDatabase* getModelCardDatabase() const = 0;
protected: protected:
/*! /*!
@@ -28,8 +28,6 @@ enum StringResource {
enum TitleString { enum TitleString {
addonNameID = 1, addonNameID = 1,
addonDescriptionID, addonDescriptionID,
noStoreyID,
showLayersID,
}; };
@@ -45,7 +43,6 @@ enum GeneralString {
//Notification strings (advice displayed in alerts) //Notification strings (advice displayed in alerts)
enum NotifyString { enum NotifyString {
showHiddenLayersID = 1,
}; };
@@ -60,7 +57,6 @@ enum ErrorString {
modelCardNotFoundID, modelCardNotFoundID,
noProjectOpenID, noProjectOpenID,
accountNotFoundID, accountNotFoundID,
elementTypeNotConvertedID,
}; };
#endif //CONNECTOR_RESOURCE #endif //CONNECTOR_RESOURCE
@@ -1,8 +1,16 @@
#ifndef CONNECTOR_DATABASE_ID #ifndef CONNECTOR_DATABASE_ID
#define CONNECTOR_DATABASE_ID #define CONNECTOR_DATABASE_ID
#include "Speckle/Utility/Guid.h"
namespace connector::database { namespace connector::database {
//BIM element record identifier
using ElementID = speckle::utility::Guid;
//A list of element IDs
using ElementIDList = std::vector<ElementID>;
} }
#endif //CONNECTOR_DATABASE_ID #endif //CONNECTOR_DATABASE_ID
@@ -96,7 +96,7 @@ Vector<ModelCard> ModelCardDatabase::getCards() const {
card: The card to write card: The card to write
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void ModelCardDatabase::write(ModelCard& card) const { void ModelCardDatabase::write(const ModelCard& card) const {
m_store->write(card); m_store->write(card);
} //ModelCardDatabase::write } //ModelCardDatabase::write
@@ -43,7 +43,7 @@ namespace connector::database {
Write a card to storage Write a card to storage
@param card The card to write @param card The card to write
*/ */
void write(record::ModelCard& card) const; void write(const record::ModelCard& card) const;
/*! /*!
Erase a card Erase a card
@param cardID The ID of the card to erase @param cardID The ID of the card to erase
@@ -1,33 +0,0 @@
#include "Connector/Environment/ConnectorProject.h"
#include "Connector/Connector.h"
#include "Connector/Database/ModelCardDatabase.h"
using namespace active::event;
using namespace connector::database;
using namespace connector::environment;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
ConnectorProject::ConnectorProject() {
m_modelCards = std::make_shared<ModelCardDatabase>();
connector()->addWeak(m_modelCards->getSubscription());
}
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
ConnectorProject::~ConnectorProject() {}
/*--------------------------------------------------------------------
Get the model card database
return; The model card database
--------------------------------------------------------------------*/
const ModelCardDatabase* ConnectorProject::getModelCardDatabase() const {
return m_modelCards.get();
} //ConnectorProject::getModelCardDatabase
@@ -1,53 +0,0 @@
#ifndef CONNECTOR_ENVIRONMENT_CONNECTOR_PROJECT
#define CONNECTOR_ENVIRONMENT_CONNECTOR_PROJECT
#include "Speckle/Environment/Project.h"
namespace connector::database {
class ModelCardDatabase;
}
namespace connector::environment {
/*!
A BIM project contained Speckle connector data, e.g. a model card database
*/
class ConnectorProject : public speckle::environment::Project {
public:
// MARK: - Types
///Shared pointer
using Shared = std::shared_ptr<ConnectorProject>;
///Weak pointer
using Weak = std::weak_ptr<ConnectorProject>;
// MARK: - Constructors
/*!
Default constructor
*/
ConnectorProject();
ConnectorProject(const ConnectorProject&) = delete;
/*!
Destructor
*/
~ConnectorProject();
// MARK: - Functions (const)
/*!
Get the model card database
@return The model card database
*/
const connector::database::ModelCardDatabase* getModelCardDatabase() const;
private:
///The model card database
std::shared_ptr<connector::database::ModelCardDatabase> m_modelCards;
};
}
#endif //CONNECTOR_ENVIRONMENT_CONNECTOR_PROJECT
@@ -3,20 +3,6 @@
#include "Active/Utility/NameID.h" #include "Active/Utility/NameID.h"
// MARK: - Event identities
//Identifier for event signalling the connector palette visibility should be toggled
inline const active::utility::NameID toggleConnectorPaletteID{"toggleConnectorPalette"}; 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 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 #endif //CONNECTOR_EVENT_ID
@@ -14,7 +14,7 @@ using namespace speckle::utility;
namespace { namespace {
using WrappedValue = CargoHold<ContainerWrap<Vector<Account>>, Vector<Account>>; using WrappedValue = active::serialise::CargoHold<ContainerWrap<Vector<Account>>, Vector<Account>>;
} }
@@ -6,7 +6,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
JS Function class to retrieve the user's account(s) JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class GetAccounts : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetAccounts : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -1,16 +1,21 @@
#include "Connector/Interface/Browser/Bridge/Base/AddModel.h" #include "Connector/Interface/Browser/Bridge/Base/AddModel.h"
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/Environment/ConnectorProject.h"
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
using namespace active::container; using namespace active::container;
using namespace active::serialise; using namespace active::serialise;
using namespace connector::environment;
using namespace connector::record; using namespace connector::record;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::utility; using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<PackageWrap, DocumentInfo>;
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
@@ -25,12 +30,6 @@ AddModel::AddModel() : BridgeMethod{"AddModel", [&](const ModelCardEventWrapper&
card: The card to add card: The card to add
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void AddModel::run(const ModelCard& card) const { void AddModel::run(const ModelCard& card) const {
auto project = connector()->getActiveProject().lock(); if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr)
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get()); modelCardDBase->write(card);
if (!connectorProject)
return;
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr) {
auto newCard = clone(card);
modelCardDBase->write(*newCard);
}
} //AddModel::run } //AddModel::run
@@ -8,7 +8,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
///Argument parameter for a model card ///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>; using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method ///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>; using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
@@ -1,4 +1,5 @@
#include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h" #include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h"
#include "Connector/Interface/Browser/Bridge/Base/AddModel.h" #include "Connector/Interface/Browser/Bridge/Base/AddModel.h"
#include "Connector/Interface/Browser/Bridge/Base/GetConnectorVersion.h" #include "Connector/Interface/Browser/Bridge/Base/GetConnectorVersion.h"
#include "Connector/Interface/Browser/Bridge/Base/GetDocumentInfo.h" #include "Connector/Interface/Browser/Bridge/Base/GetDocumentInfo.h"
@@ -7,20 +8,6 @@
#include "Connector/Interface/Browser/Bridge/Base/GetSourceApplicationVersion.h" #include "Connector/Interface/Browser/Bridge/Base/GetSourceApplicationVersion.h"
#include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h" #include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h"
#include "Connector/Interface/Browser/Bridge/Base/UpdateModel.h" #include "Connector/Interface/Browser/Bridge/Base/UpdateModel.h"
#include "Connector/Interface/Browser/Bridge/Base/HighlightModel.h"
#include "Connector/Interface/Browser/Bridge/Base/HighlightObjects.h"
#include "Connector/Interface/Browser/Bridge/Base/OpenUrl.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Record/Element/Element.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h"
#include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Connector/Record/Model/SenderModelCard.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
#include "Connector/Database/ModelCardDatabase.h"
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
@@ -35,28 +22,6 @@ BaseBridge::BaseBridge() : BrowserBridge{"baseBinding"} {
addMethod<GetDocumentState>(); addMethod<GetDocumentState>();
addMethod<GetSourceApplicationName>(); addMethod<GetSourceApplicationName>();
addMethod<GetSourceApplicationVersion>(); addMethod<GetSourceApplicationVersion>();
addMethod<HighlightModel>();
addMethod<HighlightObjects>();
addMethod<OpenUrl>();
addMethod<RemoveModel>(); addMethod<RemoveModel>();
addMethod<UpdateModel>(); addMethod<UpdateModel>();
} //BaseBridge::BaseBridge } //BaseBridge::BaseBridge
/*--------------------------------------------------------------------
Handle a project event
event: The project event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool BaseBridge::handle(const speckle::event::ProjectEvent& event) {
using enum speckle::event::ProjectEvent::Type;
switch (event.getType()) {
case open:
sendEvent("documentChanged");
break;
default:
break;
}
return false;
} //BaseBridge::handle
@@ -2,14 +2,13 @@
#define CONNECTOR_INTERFACE_BRIDGE_BASE_BRIDGE #define CONNECTOR_INTERFACE_BRIDGE_BASE_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h" #include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Event/Subscriber/ProjectSubscriber.h"
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
A browser bridge to manage document settings A browser bridge to provide configuration settings
*/ */
class BaseBridge : public speckle::interfac::browser::bridge::BrowserBridge, public speckle::event::ProjectSubscriber { class BaseBridge : public speckle::interfac::browser::bridge::BrowserBridge {
public: public:
// MARK: - Types // MARK: - Types
@@ -23,14 +22,6 @@ namespace connector::interfac::browser::bridge {
Default constructor Default constructor
*/ */
BaseBridge(); BaseBridge();
protected:
/*!
Handle the project events
@param event The project event
@return True if the event should be closed
*/
bool handle(const speckle::event::ProjectEvent& event) override;
}; };
} }
@@ -25,13 +25,13 @@ GetConnectorVersion::GetConnectorVersion() : BridgeMethod{"GetConnectorVersion",
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get the connector software version Get the host application version
return: The connector software version return: The application version
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetConnectorVersion::run() const { std::unique_ptr<Cargo> GetConnectorVersion::run() const {
//Implement other platforms as required //Implement other platforms as required
String result{String{connector::versionMajor} + "." + String{connector::versionMinor} + "." + String result{active::utility::String{connector::versionMajor} + "." + active::utility::String{connector::versionMinor} + "." +
String{connector::versionPatch}}; active::utility::String{connector::versionPatch}};
return std::make_unique<WrappedValue>(result); return std::make_unique<WrappedValue>(result);
} //GetConnectorVersion::run } //GetConnectorVersion::run
@@ -8,7 +8,7 @@ namespace connector::interfac::browser::bridge {
class ConnectorConfig; class ConnectorConfig;
/*! /*!
JS Function class to get the connector software version JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class GetConnectorVersion : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetConnectorVersion : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -23,8 +23,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Get the connector software version Get the host application version
@return The connector software version @return The application version
*/ */
std::unique_ptr<active::serialise::Cargo> run() const; std::unique_ptr<active::serialise::Cargo> run() const;
}; };
@@ -2,7 +2,6 @@
#include "Active/Serialise/CargoHold.h" #include "Active/Serialise/CargoHold.h"
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/Environment/ConnectorProject.h"
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h" #include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
#include "Speckle/Environment/Project.h" #include "Speckle/Environment/Project.h"
@@ -10,7 +9,6 @@
using namespace active::container; using namespace active::container;
using namespace active::serialise; using namespace active::serialise;
using namespace connector::environment;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::utility; using namespace speckle::utility;
@@ -35,17 +33,14 @@ GetDocumentInfo::GetDocumentInfo() : BridgeMethod{"GetDocumentInfo", [&]() {
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetDocumentInfo::run() const { std::unique_ptr<Cargo> GetDocumentInfo::run() const {
auto docInfo = std::make_unique<DocumentInfo>(); auto docInfo = std::make_unique<DocumentInfo>();
auto project = connector()->getActiveProject().lock(); if (auto project = connector()->getActiveProject().lock(); project) {
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get()); auto info = project->getInfo();
if (!connectorProject)
return nullptr;
auto info = connectorProject->getInfo();
docInfo->name = info.name; docInfo->name = info.name;
if (info.path) if (info.path)
docInfo->location = *info.path; docInfo->location = *info.path;
if (auto cardDatabase = connectorProject->getModelCardDatabase(); cardDatabase != nullptr) if (auto cardDatabase = connector()->getModelCardDatabase(); cardDatabase != nullptr)
docInfo->ID = cardDatabase->getStoreID(); docInfo->ID = cardDatabase->getStoreID();
else
docInfo->ID = Guid{true}.operator String(); docInfo->ID = Guid{true}.operator String();
}
return std::make_unique<WrappedValue>(std::move(docInfo)); return std::make_unique<WrappedValue>(std::move(docInfo));
} //GetDocumentInfo::run } //GetDocumentInfo::run
@@ -1,13 +1,15 @@
#include "Connector/Interface/Browser/Bridge/Base/GetDocumentState.h" #include "Connector/Interface/Browser/Bridge/Base/GetDocumentState.h"
#include "Active/Serialise/CargoHold.h"
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/Environment/ConnectorProject.h" #include "Connector/Record/Model/ModelCard.h"
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
using namespace active::container; using namespace active::container;
using namespace active::serialise; using namespace active::serialise;
using namespace connector::environment;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace connector::database;
using namespace connector::record;
using namespace speckle::utility; using namespace speckle::utility;
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
@@ -19,16 +21,12 @@ GetDocumentState::GetDocumentState() : BridgeMethod{"GetDocumentState", [&]() {
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get the document model cards Get the document info
return: The document model cards return: The document info
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetDocumentState::run() const { std::unique_ptr<Cargo> GetDocumentState::run() const {
auto project = connector()->getActiveProject().lock(); if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr) {
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
if (!connectorProject)
return nullptr;
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr) {
return modelCardDBase->wrapper(); return modelCardDBase->wrapper();
} }
return nullptr; return nullptr;
@@ -6,7 +6,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
JS Function class to retrieve model cards stored in the current document JS Function class to retrieve the information about the active document
*/ */
class GetDocumentState : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetDocumentState : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -21,8 +21,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Get the document model cards Get the document info
@return The document model cards @return The document info
*/ */
std::unique_ptr<active::serialise::Cargo> run() const; std::unique_ptr<active::serialise::Cargo> run() const;
}; };
@@ -1,60 +0,0 @@
#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"
#include "Connector/Record/Model/Filter/SendFilter.h"
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Record/Element/Element.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Environment/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;
using namespace speckle::environment;
using namespace speckle::record::element;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
HighlightModel::HighlightModel() : BridgeMethod{"HighlightModel", [&](const HighlightModelArgs& args) {
run(args);
}} {}
/*--------------------------------------------------------------------
Highlight elements linked to the model card selection
modelCardID: The ID of the target model card
--------------------------------------------------------------------*/
void HighlightModel::run(const String& modelCardID) const {
auto project = connector()->getActiveProject().lock();
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
if (!connectorProject)
return;
//Find the specified model card
auto modelCardDatabase = connectorProject->getModelCardDatabase();
auto modelCard = modelCardDatabase->getCard(modelCardID);
if (!modelCard) {
getBridge()->sendEvent("setModelError",
std::make_unique<SendError>(connector()->getLocalString(errorString, modelCardNotFoundID), modelCardID));
return;
}
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get())) {
ValueSetting elementIDs{recordLinks};
for (const auto& elementID : senderCard->getFilter().getElementIDs())
elementIDs.emplace_back(GuidValue{elementID});
connector()->publish(Event{setElementHighlight, { elementIDs }});
}
} //HighlightModel::run
@@ -1,39 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_HIGHLIGHT_MODEL
#define CONNECTOR_INTERFACE_BRIDGE_HIGHLIGHT_MODEL
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "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 HighlightModelArgs = speckle::interfac::browser::bridge::JSArgType<StringHold>;
/*!
JS Function class to highlight elements from the selected model card in the open document
*/
class HighlightModel : public speckle::interfac::browser::bridge::BridgeMethod<HighlightModelArgs, void> {
public:
// MARK: - Constructors
/*!
Constructor
*/
HighlightModel();
// MARK: - Functions (const)
/*!
Highlight elements linked to the model card selection
@param modelCardID The ID of the target model card
*/
void run(const speckle::utility::String& modelCardID) const;
};
}
#endif //CONNECTOR_INTERFACE_HIGHLIGHT_MODEL
@@ -1,31 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Base/HighlightObjects.h"
#include "Active/Setting/ValueSetting.h"
#include "Active/Event/Event.h"
#include "Connector/Connector.h"
#include "Connector/Event/ConnectorEventID.h"
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;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
HighlightObjects::HighlightObjects() : BridgeMethod{"HighlightObjects", [&](const HighlightObjectArgs& args) {
run(args);
}} {}
/*--------------------------------------------------------------------
Highlight specified objects
objectIDs: List of object IDs to be highlighted
--------------------------------------------------------------------*/
void HighlightObjects::run(const StringList& objectIDs) const {
connector()->publish(Event{setElementHighlight, { ValueSetting{objectIDs, recordLinks} }});
} //HighlightObjects::run
@@ -1,42 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_HIGHLIGHT_OBJECTS
#define CONNECTOR_INTERFACE_BRIDGE_HIGHLIGHT_OBJECTS
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
///List of strings
using StringList = std::vector<active::utility::String>;
///Argument parameter for a string
using StringListHold = active::serialise::CargoHold<active::serialise::ContainerWrap<StringList>, StringList>;
///Argument type for this method
using HighlightObjectArgs = speckle::interfac::browser::bridge::JSArgType<StringListHold>;
/*!
JS Function class to highlight objects using passed application IDs
*/
class HighlightObjects : public speckle::interfac::browser::bridge::BridgeMethod<HighlightObjectArgs, void> {
public:
// MARK: - Constructors
/*!
Constructor
*/
HighlightObjects();
// MARK: - Functions (const)
/*!
Highlight specified objects
@param objectIDs List of object IDs to be highlighted
*/
void run(const StringList& objectIDs) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_HIGHLIGHT_OBJECTS
@@ -1,24 +0,0 @@
#include "Connector/Interface/Browser/Bridge/Base/OpenUrl.h"
#include "Speckle/Environment/Platform.h"
using namespace connector::interfac::browser::bridge;
using namespace speckle::environment;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
OpenUrl::OpenUrl() : BridgeMethod{"OpenUrl", [&](const SendArgs& args) {
run(args);
}} {}
/*--------------------------------------------------------------------
Opens an url
url: The URL to open
--------------------------------------------------------------------*/
void OpenUrl::run(const String& url) const {
platform()->openURL(url);
} //OpenUrl::run
@@ -1,41 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_OPEN_URL
#define CONNECTOR_INTERFACE_BRIDGE_OPEN_URL
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
class ConnectorConfig;
///Argument parameter for a string
using StringHold = active::serialise::CargoHold<active::serialise::ValueWrap<speckle::utility::String>, speckle::utility::String>;
///Argument type for this method
using SendArgs = speckle::interfac::browser::bridge::JSArgType<StringHold>;
/*!
JS Function class to highlight elements from the selected model card in the open document
*/
class OpenUrl : public speckle::interfac::browser::bridge::BridgeMethod<SendArgs, void> {
public:
// MARK: - Constructors
/*!
Constructor
*/
OpenUrl();
// MARK: - Functions (const)
/*!
Opens an url
@param url The URL to open
*/
void run(const speckle::utility::String& url) const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_OPEN_URL
@@ -1,16 +1,22 @@
#include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h" #include "Connector/Interface/Browser/Bridge/Base/RemoveModel.h"
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/Environment/ConnectorProject.h"
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
using namespace active::container; using namespace active::container;
using namespace active::serialise; using namespace active::serialise;
using namespace connector::environment; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::utility; using namespace speckle::utility;
namespace {
using WrappedValue = active::serialise::CargoHold<PackageWrap, DocumentInfo>;
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
@@ -25,10 +31,6 @@ RemoveModel::RemoveModel() : BridgeMethod{"RemoveModel", [&](const ModelCardEven
card: The card to add card: The card to add
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void RemoveModel::run(const ModelCard& card) const { void RemoveModel::run(const ModelCard& card) const {
auto project = connector()->getActiveProject().lock(); if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr)
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
if (!connectorProject)
return;
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr)
modelCardDBase->erase(card.getID()); modelCardDBase->erase(card.getID());
} //RemoveModel::run } //RemoveModel::run
@@ -8,13 +8,13 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
///Argument parameter for a model card ///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>; using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method ///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>; using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
/*! /*!
JS Function class to remove a model card from the document storage JS Function class to add a model card to the document storage
*/ */
class RemoveModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> { class RemoveModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> {
public: public:
@@ -29,8 +29,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Remove a model card from document storage Add a model card to document storage
@param card The card to remove @param card The card to add
*/ */
void run(const connector::record::ModelCard& card) const; void run(const connector::record::ModelCard& card) const;
}; };
@@ -2,12 +2,11 @@
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Environment/ConnectorProject.h"
#include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h" #include "Connector/Interface/Browser/Bridge/Base/Arg/DocumentInfo.h"
using namespace active::container; using namespace active::container;
using namespace active::serialise; using namespace active::serialise;
using namespace connector::environment; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::utility; using namespace speckle::utility;
@@ -27,17 +26,11 @@ UpdateModel::UpdateModel() : BridgeMethod{"UpdateModel", [&](const ModelCardEven
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Update a model card in document storage Add a model card to document storage
card: The card to update card: The card to add
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void UpdateModel::run(const ModelCard& card) const { void UpdateModel::run(const ModelCard& card) const {
auto project = connector()->getActiveProject().lock(); if (auto modelCardDBase = connector()->getModelCardDatabase(); modelCardDBase != nullptr)
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get()); modelCardDBase->write(card);
if (!connectorProject)
return;
if (auto modelCardDBase = connectorProject->getModelCardDatabase(); modelCardDBase != nullptr) {
auto newCard = clone(card);
modelCardDBase->write(*newCard);
}
} //UpdateModel::run } //UpdateModel::run
@@ -8,13 +8,13 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
///Argument parameter for a model card ///Argument parameter for a string
using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>; using CardHold = active::serialise::CargoHold<connector::record::CardMover, connector::record::ModelCard>;
///Argument type for this method ///Argument type for this method
using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>; using ModelCardEventWrapper = speckle::interfac::browser::bridge::JSArgType<CardHold>;
/*! /*!
JS Function class to update a model card in document storage JS Function class to add a model card to the document storage
*/ */
class UpdateModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> { class UpdateModel : public speckle::interfac::browser::bridge::BridgeMethod<ModelCardEventWrapper, void> {
public: public:
@@ -29,8 +29,8 @@ namespace connector::interfac::browser::bridge {
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Update a model card in document storage Add a model card to document storage
@param card The card to update @param card The card to add
*/ */
void run(const connector::record::ModelCard& card) const; void run(const connector::record::ModelCard& card) const;
}; };
@@ -6,7 +6,7 @@
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
JS Function class to retrieve the current display configuration settings JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class GetConfig : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetConfig : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -9,11 +9,11 @@ namespace connector::interfac::browser::bridge {
class ConnectorConfig; class ConnectorConfig;
///Argument for a JS call to update the display configuration settings ///Argument for a JS call to update the configuration
using UpdateArgs = speckle::interfac::browser::bridge::JSArgType<ConnectorConfig>; using UpdateArgs = speckle::interfac::browser::bridge::JSArgType<ConnectorConfig>;
/*! /*!
JS Function class to update the display configuration settings JS Function class to retrieve the names of the methods supported by the bridge
*/ */
class UpdateConfig : public speckle::interfac::browser::bridge::BridgeMethod<UpdateArgs, void> { class UpdateConfig : public speckle::interfac::browser::bridge::BridgeMethod<UpdateArgs, void> {
public: public:
@@ -22,6 +22,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
UpdateConfig(); UpdateConfig();
@@ -1,46 +0,0 @@
#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
@@ -1,39 +0,0 @@
#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
@@ -1,30 +0,0 @@
#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
@@ -1,29 +0,0 @@
#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
@@ -1,89 +0,0 @@
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Connector.h"
#include "Connector/Interface/Browser/Bridge/Selection/Arg/SelectionInfo.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Environment/Project.h"
#include "Speckle/Record/Element/Element.h"
#include <array>
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
using namespace speckle::record::element;
namespace {
///Serialisation fields
enum FieldIndex {
selectedObjectIdsID,
summaryID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"selectedObjectIds"},
Identity{"summary"},
};
}
SelectionInfo::SelectionInfo() {
auto project = connector()->getActiveProject().lock();
if (!project) {
// TODO: is this OK?
return;
}
auto elementDatabase = project->getElementDatabase();
auto selected = elementDatabase->getSelection();
active::utility::String summary(selected.size());
summary += " objects selected.";
m_summary = summary;
for (const auto& link : selected) {
m_selectedElementIds.push_back(link);
}
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool SelectionInfo::fillInventory(Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[selectedObjectIdsID], selectedObjectIdsID, element },
{ fieldID[summaryID], summaryID, element },
},
}.withType(&typeid(SelectionInfo)));
return true;
} //SelectionInfo::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique SelectionInfo::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(SelectionInfo))
return nullptr;
using namespace active::serialise;
switch (item.index) {
case selectedObjectIdsID:
return std::make_unique<ContainerWrap<std::vector<active::utility::Guid>>>(m_selectedElementIds, false, fieldID[selectedObjectIdsID].name);
case summaryID:
return std::make_unique<ValueWrap<active::utility::String>>(m_summary);
default:
return nullptr; //Requested an unknown index
}
} //SelectionInfo::getCargo
@@ -1,45 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SELECTION_INFO
#define CONNECTOR_INTERFACE_BRIDGE_SELECTION_INFO
#include "Active/Serialise/Package/Package.h"
namespace connector::interfac::browser::bridge {
/*!
Configuration settings class
*/
class SelectionInfo : public active::serialise::Package {
public:
// MARK: - Types
using base = active::serialise::Package;
// MARK: - Constructors
/*!
Default constructor
*/
SelectionInfo();
active::utility::String m_summary = "No objects selected";
std::vector<active::utility::Guid> m_selectedElementIds;
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SELECTION_INFO
@@ -1,23 +0,0 @@
#include "Active/Serialise/CargoHold.h"
#include "Connector/Interface/Browser/Bridge/Selection/GetSelection.h"
#include "Connector/Interface/Browser/Bridge/Selection/Arg/SelectionInfo.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
GetSelection::GetSelection() : BridgeMethod{"GetSelection", [&]() {
return run();
}} {}
/*--------------------------------------------------------------------
Get the current selection info
based on the ArchiCAD mdoel selection
--------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetSelection::run() const {
auto selectionInfo = std::make_unique<SelectionInfo>();
return std::make_unique<CargoHold<PackageWrap, SelectionInfo>>(std::move(selectionInfo));
} //GetSelection::run
@@ -1,29 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GETSELECTION
#define CONNECTOR_INTERFACE_BRIDGE_GETSELECTION
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge {
class GetSelection : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public:
// MARK: - Constructors
/*!
Constructor
*/
GetSelection();
// MARK: - Functions (const)
/*!
Get the current selection info
based on the ArchiCAD mdoel selection
*/
std::unique_ptr<active::serialise::Cargo> run() const;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_GETSELECTION
@@ -1,30 +0,0 @@
#include "Active/Serialise/CargoHold.h"
#include "Connector/Interface/Browser/Bridge/Selection/SelectionBridge.h"
#include "Connector/Interface/Browser/Bridge/Selection/GetSelection.h"
#include "Connector/Interface/Browser/Bridge/Selection/Arg/SelectionInfo.h"
using namespace active::serialise;
using namespace connector::interfac::browser::bridge;
/*--------------------------------------------------------------------
Default constructor
--------------------------------------------------------------------*/
SelectionBridge::SelectionBridge() : BrowserBridge{"selectionBinding"} {
//Add bridge methods
addMethod<GetSelection>();
} //SelectionBridge::SelectionBridge
/*--------------------------------------------------------------------
Handle a selection change
event: The selection event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool SelectionBridge::handle(const speckle::event::SelectionEvent& event) {
auto selectionInfo = std::make_unique<SelectionInfo>();
auto wrapped = std::make_unique<CargoHold<PackageWrap, SelectionInfo>>(std::move(selectionInfo));
sendEvent("setSelection", std::move(wrapped));
return true;
} //SelectionBridge::handle
@@ -1,39 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SELECTION_BRIDGE
#define CONNECTOR_INTERFACE_BRIDGE_SELECTION_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Event/Subscriber/SelectionSubscriber.h"
#include "Speckle/Event/Type/SelectionEvent.h"
namespace connector::interfac::browser::bridge {
/*!
A browser bridge to manage element selection information passed between the JS UI and the BIM application
*/
class SelectionBridge : public speckle::interfac::browser::bridge::BrowserBridge, public speckle::event::SelectionSubscriber {
public:
// MARK: - Types
using base = speckle::interfac::browser::bridge::BrowserBridge;
// MARK: - Constructors
using base::base;
/*!
Default constructor
*/
SelectionBridge();
protected:
/*!
Handle a selection change
@param event The selection event
@return True if the event should be closed
*/
bool handle(const speckle::event::SelectionEvent& event) override;
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SELECTION_BRIDGE
@@ -1,6 +1,5 @@
#include "Connector/Interface/Browser/Bridge/Send/Arg/ConversionResult.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/ConversionResult.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h" #include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include <array> #include <array>
@@ -13,30 +12,14 @@ namespace {
///Serialisation fields ///Serialisation fields
enum FieldIndex { enum FieldIndex {
statusID,
srcID,
srcTypeID,
resID,
resTypeID,
errorID, errorID,
cardID,
}; };
///Serialisation field IDs ///Serialisation field IDs
static std::array fieldID = { static std::array fieldID = {
Identity{"status"},
Identity{"sourceId"},
Identity{"sourceType"},
Identity{"resultId"},
Identity{"resultType"},
Identity{"error"}, Identity{"error"},
}; Identity{"modelCardId"},
///Conversion status enumerator names
std::array statusName{
"success",
"warning",
"info",
"error",
}; };
} }
@@ -52,12 +35,8 @@ bool ConversionResult::fillInventory(active::serialise::Inventory& inventory) co
using enum Entry::Type; using enum Entry::Type;
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ fieldID[statusID], statusID, element }, { fieldID[errorID], errorID, element },
{ fieldID[srcID], srcID, element, !sourceID.empty() }, { fieldID[cardID], cardID, element },
{ fieldID[srcTypeID], srcTypeID, element, !sourceType.empty() },
{ fieldID[resID], resID, element, !resultID.empty() },
{ fieldID[resTypeID], resTypeID, element, !resultType.empty() },
{ fieldID[errorID], errorID, element, error.operator bool() },
}, },
}.withType(&typeid(ConversionResult))); }.withType(&typeid(ConversionResult)));
return true; return true;
@@ -76,46 +55,11 @@ Cargo::Unique ConversionResult::getCargo(const active::serialise::Inventory::Ite
return nullptr; return nullptr;
using namespace active::serialise; using namespace active::serialise;
switch (item.index) { switch (item.index) {
case statusID:
return Cargo::Unique{new CargoHold<ValueWrap<uint16_t>, uint16_t>(static_cast<uint16_t>(status))};
case srcID:
return std::make_unique<ValueWrap<String>>(sourceID);
case srcTypeID:
return std::make_unique<ValueWrap<String>>(sourceType);
case resID:
return std::make_unique<ValueWrap<String>>(resultID);
case resTypeID:
return std::make_unique<ValueWrap<String>>(resultType);
case errorID: case errorID:
return std::make_unique<PackageWrap>(*error); return std::make_unique<ValueWrap<String>>(message);
case cardID:
return std::make_unique<ValueWrap<String>>(modelCardID);
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
} //ConversionResult::getCargo } //ConversionResult::getCargo
/*--------------------------------------------------------------------
Get a conversion status enumerator from text
text; The incoming text
return: The equivalent conversion status (nullopt on failure)
--------------------------------------------------------------------*/
std::optional<ConversionResult::Status> connector::interfac::browser::bridge::toConversionStatus(const String& text) {
for (auto i = 0; i < statusName.size(); ++i)
if (text == statusName[i])
return static_cast<ConversionResult::Status>(i + 1);
return std::nullopt;
} //active::geometry::toAnchor2D
/*--------------------------------------------------------------------
Get the text for a conversion status value
status: The incoming status
return: The conversion status as text
--------------------------------------------------------------------*/
String connector::interfac::browser::bridge::fromConversionStatus(ConversionResult::Status status) {
return statusName.at(static_cast<size_t>(status) - 1);
} //active::geometry::fromAnchor2D
@@ -1,42 +1,47 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_CONVERSION_RESULT #ifndef CONNECTOR_INTERFACE_BRIDGE_SEND_CONVERSION_RESULT
#define CONNECTOR_INTERFACE_BRIDGE_CONVERSION_RESULT #define CONNECTOR_INTERFACE_BRIDGE_SEND_CONVERSION_RESULT
#include "Active/Serialise/Package/Package.h" #include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendError.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendError.h"
#include "Speckle/Utility/String.h" #include "Speckle/Utility/String.h"
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
The result of a conversion process (BIM records to/from Speckle) A send error to return to the JS in the event of an error
*/ */
class ConversionResult : public active::serialise::Package { class ConversionResult final : public active::serialise::Package {
public: public:
enum class Status : uint16_t { enum class Status {
success = 1, ///<The conversion was successful success = 1,
info, ///<Not in use yet, maybe later as discussed info,
warning, ///<Not in use yet, maybe later as discussed warning,
error, ///<An error occurred during conversion error,
}; };
// MARK: - Constructors // MARK: - Constructors
/*! /*!
Default constructor Constructor
@param errMess The error message
@param card The ID of the model card associated with the wrror
*/ */
ConversionResult() {} ConversionResult(const speckle::utility::String& errMess, const speckle::utility::String& card) : message{errMess}, modelCardID{card} {}
// MARK: - Public variables // MARK: - Public variables
///The error message
speckle::utility::String message;
///The ID of the model card associated with the data
speckle::utility::String modelCardID;
///The element conversion status ///The element conversion status
Status status = Status::info; Status status = Status::info;
///For receive conversion reports, this is the id of the speckle object. For send, it's the host app object id. ///For receive conversion reports, this is the id of the speckle object. For send, it's the host app object id.
speckle::utility::String sourceID; speckle::utility::String sourceId;
///For receive conversion reports, this is the type of the speckle object. For send, it's the host app object type. ///For receive conversion reports, this is the type of the speckle object. For send, it's the host app object type.
speckle::utility::String sourceType; speckle::utility::String sourceType;
///For receive conversion reports, this is the id of the host app object. For send, it's the speckle object id. ///For receive conversion reports, this is the id of the host app object. For send, it's the speckle object id.
speckle::utility::String resultID; speckle::utility::String resultId;
///For receive conversion reports, this is the type of the host app object. For send, it's the speckle object type. ///For receive conversion reports, this is the type of the host app object. For send, it's the speckle object type.
speckle::utility::String resultType; speckle::utility::String resultType;
///The exception (nullopt = no exception) ///The exception (nullopt = no exception)
@@ -58,60 +63,6 @@ namespace connector::interfac::browser::bridge {
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
}; };
/*!
Get a conversion status enumerator from text
@param text The incoming text
@return The equivalent conversion status (nullopt on failure)
*/
std::optional<ConversionResult::Status> toConversionStatus(const speckle::utility::String& text);
/*!
Get the text for a conversion status value
@param status The incoming status
@return The conversion status as text
*/
speckle::utility::String fromConversionStatus(ConversionResult::Status status);
} }
namespace active::serialise { #endif //CONNECTOR_INTERFACE_BRIDGE_SEND_CONVERSION_RESULT
/*!
Import the object from the specified string (specialisation for bool)
@param source The string to read
@return True if the data was successfully read
*/
template<> inline
bool ValueWrap<connector::interfac::browser::bridge::ConversionResult::Status>::read(const utility::String& source) {
auto converted = connector::interfac::browser::bridge::toConversionStatus(source);
if (!converted)
return false;
base::get() = *converted;
return true;
} //ValueWrap<bool>::read
/*!
Import the object from the specified string (specialisation for bool)
@param source The string to read
@return True if the data was successfully read
*/
template<> inline
bool ValueWrap<std::optional<connector::interfac::browser::bridge::ConversionResult::Status>>::read(const utility::String& source) {
auto converted = connector::interfac::browser::bridge::toConversionStatus(source);
base::get() = converted;
return converted.operator bool();
} //ValueWrap<bool>::read
/*!
Export the object to the specified string (specialisation for bool)
@param dest The string to write the data to
@return True if the data was successfully written
*/
template<> inline
bool ValueWrap<connector::interfac::browser::bridge::ConversionResult::Status>::write(utility::String& dest) const {
dest = connector::interfac::browser::bridge::fromConversionStatus(get());
return true;
} //ValueWrap<bool>::write
}
#endif //CONNECTOR_INTERFACE_BRIDGE_CONVERSION_RESULT
@@ -1,49 +0,0 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_SEND_CONVERSION_RESULT
#define CONNECTOR_INTERFACE_BRIDGE_SEND_CONVERSION_RESULT
#include "Connector/Interface/Browser/Bridge/Send/Arg/ConversionResult.h"
#include "Speckle/Serialise/Collection/ConversionReporter.h"
namespace connector::interfac::browser::bridge {
/*!
A result from converting a record to Speckle
*/
class SendConversionResult : public ConversionResult {
public:
// MARK: - Constructors
/*!
Constructor
@param stat The send/conversion status of the target record
@param srcID The record application ID
@param srcType The record application type name
@param err An optional error report
*/
SendConversionResult(Status stat, speckle::utility::String srcID, speckle::utility::String srcType, SendError::Option err = std::nullopt) {
status = stat;
sourceID = srcID;
sourceType = srcType;
error = err;
}
/*!
Constructor
@param stat The send/conversion status of the target record
@param srcID The record application ID
@param srcType The record application type name
@param err An optional error report
*/
SendConversionResult(const speckle::database::BIMRecordID& srcID, const speckle::serialise::ConversionReporter::Data& data) {
status = data.status == speckle::serialise::ConversionReporter::Data::Status::success ?
ConversionResult::Status::success : ConversionResult::Status::error;
sourceID = srcID.operator speckle::utility::String();
sourceType = data.typeName;
if (!data.message.empty())
error = SendError{data.message};
}
};
}
#endif //CONNECTOR_INTERFACE_BRIDGE_SEND_CONVERSION_RESULT
@@ -12,16 +12,14 @@ namespace {
///Serialisation fields ///Serialisation fields
enum FieldIndex { enum FieldIndex {
messageID, errorID,
cardID, cardID,
stackID,
}; };
///Serialisation field IDs ///Serialisation field IDs
static std::array fieldID = { static std::array fieldID = {
Identity{"message"}, Identity{"error"},
Identity{"modelCardId"}, Identity{"modelCardId"},
Identity{"stackTrace"},
}; };
} }
@@ -37,9 +35,8 @@ bool SendError::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type; using enum Entry::Type;
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ fieldID[messageID], messageID, element }, { fieldID[errorID], errorID, element },
{ fieldID[cardID], cardID, element, !modelCardID.empty() }, { fieldID[cardID], cardID, element },
{ fieldID[stackID], stackID, element, modelCardID.empty() }, //Field not included when a model card is sent
}, },
}.withType(&typeid(SendError))); }.withType(&typeid(SendError)));
return true; return true;
@@ -58,12 +55,10 @@ Cargo::Unique SendError::getCargo(const active::serialise::Inventory::Item& item
return nullptr; return nullptr;
using namespace active::serialise; using namespace active::serialise;
switch (item.index) { switch (item.index) {
case messageID: case errorID:
return std::make_unique<ValueWrap<String>>(message); return std::make_unique<ValueWrap<String>>(message);
case cardID: case cardID:
return std::make_unique<ValueWrap<String>>(modelCardID); return std::make_unique<ValueWrap<String>>(modelCardID);
case stackID:
return std::make_unique<ValueWrap<String>>(stackTrace);
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
@@ -24,7 +24,7 @@ namespace connector::interfac::browser::bridge {
@param errMess The error message @param errMess The error message
@param card The ID of the model card associated with the wrror @param card The ID of the model card associated with the wrror
*/ */
SendError(const speckle::utility::String& errMess, const speckle::utility::String& card = {}) : message{errMess}, modelCardID{card} {} SendError(const speckle::utility::String& errMess, const speckle::utility::String& card) : message{errMess}, modelCardID{card} {}
// MARK: - Public variables // MARK: - Public variables
@@ -32,8 +32,6 @@ namespace connector::interfac::browser::bridge {
speckle::utility::String message; speckle::utility::String message;
///The ID of the model card associated with the data ///The ID of the model card associated with the data
speckle::utility::String modelCardID; speckle::utility::String modelCardID;
///The error stack trace
speckle::utility::String stackTrace;
// MARK: - Serialisation // MARK: - Serialisation
@@ -1,14 +1,11 @@
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendObject.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendObject.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h" #include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Record/Collection/ProjectCollection.h"
#include <array> #include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace connector::record;
using namespace speckle::serialise; using namespace speckle::serialise;
using namespace speckle::utility; using namespace speckle::utility;
@@ -17,13 +14,15 @@ namespace {
///Serialisation fields ///Serialisation fields
enum FieldIndex { enum FieldIndex {
idID, idID,
rootObjID, totChildID,
batchesID,
}; };
///Serialisation field IDs ///Serialisation field IDs
static std::array fieldID = { static std::array fieldID = {
Identity{"id"}, Identity{"id"},
Identity{"rootObject"}, Identity{"totalChildrenCount"},
Identity{"batches"},
}; };
} }
@@ -40,7 +39,8 @@ bool SendObject::fillInventory(active::serialise::Inventory& inventory) const {
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ fieldID[idID], idID, element }, { fieldID[idID], idID, element },
{ fieldID[rootObjID], rootObjID, element }, { fieldID[totChildID], totChildID, element },
{ fieldID[batchesID], batchesID, element },
}, },
}.withType(&typeid(SendObject))); }.withType(&typeid(SendObject)));
return true; return true;
@@ -61,27 +61,11 @@ Cargo::Unique SendObject::getCargo(const active::serialise::Inventory::Item& ite
switch (item.index) { switch (item.index) {
case idID: case idID:
return std::make_unique<StringWrap>(id); return std::make_unique<StringWrap>(id);
case rootObjID: case totChildID:
if (m_object) return std::make_unique<Int32Wrap>(totalChildrenCount);
return std::make_unique<PackageWrap>(*m_object); case batchesID:
return std::make_unique<NullPackage>(); return std::make_unique<ContainerWrap<std::vector<speckle::utility::String>>>(batches);
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
} //SendObject::getCargo } //SendObject::getCargo
/*--------------------------------------------------------------------
Get the conversion results from the send object serialisation
return: The serialisation conversion results
--------------------------------------------------------------------*/
std::vector<SendConversionResult> SendObject::getConversionResults() const {
std::vector<SendConversionResult> convertResults;
auto collection = dynamic_cast<const ProjectCollection*>(m_object.get());
if (collection == nullptr)
return convertResults;
for (const auto& item : collection->getLog())
convertResults.emplace_back(SendConversionResult{item.first, item.second});
return convertResults;
} //SendObject::getConversionResults
@@ -2,9 +2,8 @@
#define CONNECTOR_INTERFACE_BRIDGE_SEND_OBJECT #define CONNECTOR_INTERFACE_BRIDGE_SEND_OBJECT
#include "Active/Serialise/CargoHold.h" #include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h" #include "Connector/Interface/Browser/Bridge/Config/Arg/ConnectorConfig.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendConversionResult.h"
#include "Speckle/Database/Content/Record.h"
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h" #include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
@@ -15,20 +14,23 @@ namespace connector::interfac::browser::bridge {
class SendObject final : public active::serialise::Package { class SendObject final : public active::serialise::Package {
public: public:
using base = std::reference_wrapper<active::serialise::Package>;
// MARK: - Constructors // MARK: - Constructors
/*! /*!
Default constructor Constructor
@param object The object to send @param errMess The error message
@param card The ID of the model card associated with the wrror
*/ */
SendObject(std::unique_ptr<speckle::database::Record> object) : m_object{std::move(object)} { id = m_object->getID(); } SendObject() {}
// MARK: - Public variables // MARK: - Public variables
///The root object id which should be used for creating the version ///The root object id which should be used for creating the version
speckle::utility::String id; speckle::utility::String id = "1234asdasdsadsadsa";
///The total number of children
int32_t totalChildrenCount = 0;
///JSON batches for the root object and child (detached) objects
std::vector<speckle::utility::String> batches = { "[{\"speckle_type\": \"Base\", \"id\" : \"1234asdasdsadsadsa\"}]" }; // NOTE to Ralph: it will be stringified but like array of objects as in example
// MARK: - Serialisation // MARK: - Serialisation
@@ -44,25 +46,6 @@ namespace connector::interfac::browser::bridge {
@return The requested cargo (nullptr on failure) @return The requested cargo (nullptr on failure)
*/ */
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Use a manager in (de)serialisation processes
@param management The management to use
*/
void useManagement(active::serialise::Management* management) const override { m_object->useManagement(management); }
/*!
Get the cargo management
@return The active management
*/
active::serialise::Management* management() const override { return m_object->management(); }
/*!
Get the conversion results from the send object serialisation
@return The serialisation conversion results
*/
std::vector<SendConversionResult> getConversionResults() const;
private:
///The object to send
std::unique_ptr<speckle::database::Record> m_object;
}; };
} }
@@ -1,6 +1,5 @@
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendViaBrowserArgs.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendViaBrowserArgs.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Connector/Record/Model/ModelCard.h" #include "Connector/Record/Model/ModelCard.h"
#include "Speckle/Record/Credentials/Account.h" #include "Speckle/Record/Credentials/Account.h"
@@ -26,7 +25,6 @@ namespace {
accID, accID,
messageID, messageID,
sendObjectID, sendObjectID,
convResultID,
}; };
///Serialisation field IDs ///Serialisation field IDs
@@ -39,7 +37,6 @@ namespace {
Identity{"accountId"}, Identity{"accountId"},
Identity{"message"}, Identity{"message"},
Identity{"sendObject"}, Identity{"sendObject"},
Identity{"sendConversionResults"},
}; };
} }
@@ -49,12 +46,11 @@ namespace {
modelCard: The model card to populate into the send info for the browser modelCard: The model card to populate into the send info for the browser
account: The account linked to the send account: The account linked to the send
object: The object to be sent
results: The conversion results (reporting any conversion errors etc)
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
SendViaBrowserArgs::SendViaBrowserArgs(const ModelCard& modelCard, const Account& account, SendObject&& object) : SendViaBrowserArgs::SendViaBrowserArgs(const ModelCard& modelCard, const Account& account) :
modelCardID(modelCard.getID()), projectID(modelCard.getProjectID()), modelID(modelCard.getModelID()), token{account.getToken()}, modelCardID(modelCard.getID()), projectID(modelCard.getProjectID()), modelID(modelCard.getModelID()), token{account.getToken()},
serverURL{account.getServerURL()}, accountID{account.getID()}, sendObject{std::move(object)} { serverURL{account.getServerURL()}, accountID{account.getID()} {
} //SendViaBrowserArgs::SendViaBrowserArgs } //SendViaBrowserArgs::SendViaBrowserArgs
@@ -77,7 +73,6 @@ bool SendViaBrowserArgs::fillInventory(active::serialise::Inventory& inventory)
{ fieldID[accID], accID, element }, { fieldID[accID], accID, element },
{ fieldID[messageID], messageID, element }, { fieldID[messageID], messageID, element },
{ fieldID[sendObjectID], sendObjectID, element }, { fieldID[sendObjectID], sendObjectID, element },
{ fieldID[convResultID], convResultID, element },
}, },
}.withType(&typeid(SendViaBrowserArgs))); }.withType(&typeid(SendViaBrowserArgs)));
return true; return true;
@@ -112,9 +107,6 @@ Cargo::Unique SendViaBrowserArgs::getCargo(const active::serialise::Inventory::I
return std::make_unique<StringWrap>(message); return std::make_unique<StringWrap>(message);
case sendObjectID: case sendObjectID:
return std::make_unique<PackageWrap>(sendObject); return std::make_unique<PackageWrap>(sendObject);
case convResultID:
sendConversionResults = sendObject.getConversionResults();
return Cargo::Unique{new ContainerWrap{sendConversionResults}};
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
@@ -3,7 +3,7 @@
#include "Active/Serialise/Package/Package.h" #include "Active/Serialise/Package/Package.h"
#include "Active/Utility/String.h" #include "Active/Utility/String.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendConversionResult.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/ConversionResult.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendObject.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendObject.h"
#include "Speckle/Database/Identity/RecordID.h" #include "Speckle/Database/Identity/RecordID.h"
@@ -33,9 +33,8 @@ namespace connector::interfac::browser::bridge {
Constructor Constructor
@param modelCard The model card to populate into the send info for the browser @param modelCard The model card to populate into the send info for the browser
@param account The account linked to the send @param account The account linked to the send
@param object The object to be sent
*/ */
SendViaBrowserArgs(const connector::record::ModelCard& modelCard, const speckle::record::cred::Account& account, SendObject&& object); SendViaBrowserArgs(const connector::record::ModelCard& modelCard, const speckle::record::cred::Account& account);
// MARK: - Public variables // MARK: - Public variables
@@ -54,7 +53,7 @@ namespace connector::interfac::browser::bridge {
///The send message ///The send message
speckle::utility::String message; //TODO: Clarify what this is used for speckle::utility::String message; //TODO: Clarify what this is used for
///The conversion report (summarising the conversion results on an element-by-element basis) ///The conversion report (summarising the conversion results on an element-by-element basis)
mutable std::vector<SendConversionResult> sendConversionResults; std::vector<ConversionResult> sendConversionResults;
///The commit content ///The commit content
SendObject sendObject; SendObject sendObject;
@@ -72,16 +71,6 @@ namespace connector::interfac::browser::bridge {
@return The requested cargo (nullptr on failure) @return The requested cargo (nullptr on failure)
*/ */
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
/*!
Use a manager in (de)serialisation processes
@param management The management to use
*/
void useManagement(active::serialise::Management* management) const override { sendObject.useManagement(management); }
/*!
Get the cargo management
@return The active management
*/
active::serialise::Management* management() const override { return sendObject.management(); }
}; };
} }
@@ -18,6 +18,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
GetSendFilters(); GetSendFilters();
@@ -13,7 +13,7 @@ using namespace speckle::utility;
namespace { namespace {
using WrappedValue = CargoHold<ContainerWrap<Vector<CardSetting>, PackageWrap>, Vector<CardSetting>>; using WrappedValue = active::serialise::CargoHold<ContainerWrap<Vector<CardSetting>, PackageWrap>, Vector<CardSetting>>;
} }
@@ -26,9 +26,9 @@ GetSendSettings::GetSendSettings() : BridgeMethod{"GetSendSettings", [&]() {
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Get send settings relevant to the host BIM application Get the send filters
return: The send settings return: The send filters
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
std::unique_ptr<Cargo> GetSendSettings::run() const { std::unique_ptr<Cargo> GetSendSettings::run() const {
auto filters = std::make_unique<Vector<CardSetting>>(); auto filters = std::make_unique<Vector<CardSetting>>();
@@ -9,7 +9,7 @@ namespace connector::interfac::browser::bridge {
class ConnectorConfig; class ConnectorConfig;
/*! /*!
JS Function class to retrieve the send settings relevant to the host BIM application JS Function class to retrieve the send filters
*/ */
class GetSendSettings : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> { class GetSendSettings : public speckle::interfac::browser::bridge::BridgeMethod<void, active::serialise::Cargo> {
public: public:
@@ -18,14 +18,15 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
GetSendSettings(); GetSendSettings();
// MARK: - Functions (const) // MARK: - Functions (const)
/*! /*!
Get send settings relevant to the host BIM application Get the send filters
@return The send settings @return The send filters
*/ */
std::unique_ptr<active::serialise::Cargo> run() const; std::unique_ptr<active::serialise::Cargo> run() const;
}; };
@@ -5,33 +5,24 @@
#include "Connector/Connector.h" #include "Connector/Connector.h"
#include "Connector/ConnectorResource.h" #include "Connector/ConnectorResource.h"
#include "Connector/Database/ModelCardDatabase.h" #include "Connector/Database/ModelCardDatabase.h"
#include "Connector/Environment/ConnectorProject.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendError.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendConversionResult.h"
#include "Connector/Interface/Browser/Bridge/Send/Arg/SendViaBrowserArgs.h" #include "Connector/Interface/Browser/Bridge/Send/Arg/SendViaBrowserArgs.h"
#include "Connector/Record/Collection/ProjectCollection.h"
#include "Connector/Record/Model/SenderModelCard.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
#include "Speckle/Database/AccountDatabase.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/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Record/Credentials/Account.h" #include "Speckle/Record/Credentials/Account.h"
#include "Speckle/Record/Element/Element.h"
#include "Speckle/Serialise/Detached/Storage/DetachedMemoryStore.h" #include "Speckle/Serialise/Detached/Storage/DetachedMemoryStore.h"
#include "Speckle/Utility/Exception.h" #include "Speckle/Utility/Exception.h"
using namespace active::serialise; using namespace active::serialise;
using namespace connector::environment;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace connector::record;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::record::element;
using namespace speckle::serialise; using namespace speckle::serialise;
using namespace speckle::utility; using namespace speckle::utility;
namespace {
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
@@ -43,30 +34,17 @@ Send::Send() : BridgeMethod{"Send", [&](const SendArgs& args) {
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Send a specified model Send a specified model
modelCardID: The ID of the model card identifying the objects to send modelCardID: The ID of the model to send
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void Send::run(const String& modelCardID) const { void Send::run(const String& modelCardID) const {
//We can currently only send from the 3D model view
host()->makeModelViewActive(true);
//Get the active project
auto project = connector()->getActiveProject().lock();
if (!project) {
getBridge()->sendEvent("setModelError",
std::make_unique<SendError>(connector()->getLocalString(errorString, noProjectOpenID), modelCardID));
return;
}
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
if (!connectorProject)
return;
//Find the specified model card //Find the specified model card
auto modelCardDatabase = connectorProject->getModelCardDatabase(); auto modelCardDatabase = connector()->getModelCardDatabase();
auto modelCard = modelCardDatabase->getCard(modelCardID); auto modelCard = modelCardDatabase->getCard(modelCardID);
if (!modelCard) { if (!modelCard) {
getBridge()->sendEvent("setModelError", getBridge()->sendEvent("setModelError",
std::make_unique<SendError>(connector()->getLocalString(errorString, modelCardNotFoundID), modelCardID)); std::make_unique<SendError>(connector()->getLocalString(errorString, modelCardNotFoundID), modelCardID));
return; return;
} }
//Get the user account
auto accountDatabase = connector()->getAccountDatabase(); auto accountDatabase = connector()->getAccountDatabase();
auto account = accountDatabase->getAccount(modelCard->getAccountID(), modelCard->getServerURL()); auto account = accountDatabase->getAccount(modelCard->getAccountID(), modelCard->getServerURL());
if (!account) { if (!account) {
@@ -74,24 +52,16 @@ void Send::run(const String& modelCardID) const {
std::make_unique<SendError>(connector()->getLocalString(errorString, accountNotFoundID), modelCardID)); std::make_unique<SendError>(connector()->getLocalString(errorString, accountNotFoundID), modelCardID));
return; return;
} }
//Get the selected elements from the modelcard //Get the active project
auto elementDatabase = project->getElementDatabase(); auto project = connector()->getActiveProject().lock();
BIMRecordIDList selected{}; if (!project) {
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get())) getBridge()->sendEvent("setModelError",
selected = senderCard->getFilter().getElementIDs(); std::make_unique<SendError>(connector()->getLocalString(errorString, noProjectOpenID), modelCardID));
//Build a collection from the selected elements return;
auto collection = std::make_unique<ProjectCollection>(project, modelCard->getID());
for (const auto& link : selected) {
if (auto element = elementDatabase->getElement(link); element)
collection->addElement(*element);
else {
//Report failure to convert element
collection->logRecord(link, {ConversionReporter::Data::Status::failure, String{}, String{},
connector()->getLocalString(errorString, elementTypeNotConvertedID)}, false);
collection->incrementSkippedRecords();
} }
} //We currently collect all detached object serialised data into a memory-based store - in future may be able to batch send and cache locally
//Send the collected information DetachedMemoryStore detachedObjects;
auto result = std::make_unique<SendViaBrowserArgs>(*modelCard, *account, SendObject{std::move(collection)}); auto result = std::make_unique<SendViaBrowserArgs>(*modelCard, *account);
getBridge()->sendEvent("sendByBrowser", std::move(result)); getBridge()->sendEvent("sendByBrowser", std::move(result));
} //Send::run } //Send::run
@@ -25,6 +25,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
Send(); Send();
@@ -32,7 +33,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Send a specified model Send a specified model
@param modelCardID The ID of the model card identifying the objects to send @param modelCardID The ID of the model to send
*/ */
void run(const speckle::utility::String& modelCardID) const; void run(const speckle::utility::String& modelCardID) const;
}; };
@@ -1,28 +1,10 @@
#include "Connector/Interface/Browser/Bridge/Send/SendBridge.h" #include "Connector/Interface/Browser/Bridge/Send/SendBridge.h"
#include "Connector/Interface/Browser/Bridge/Send/GetSendFilters.h" #include "Connector/Interface/Browser/Bridge/Send/GetSendFilters.h"
#include "Connector/Interface/Browser/Bridge/Send/GetSendSettings.h" #include "Connector/Interface/Browser/Bridge/Send/GetSendSettings.h"
#include "Connector/Interface/Browser/Bridge/Send/Send.h" #include "Connector/Interface/Browser/Bridge/Send/Send.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h"
#include "Connector/Database/ModelCardDatabase.h"
#include "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/SenderModelCard.h"
#include "Connector/Record/Model/Filter/SendFilter.h"
using namespace speckle::database;
using namespace connector::environment;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::utility;
using namespace speckle::event;
using namespace active::serialise;
using namespace connector::record;
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
@@ -33,54 +15,3 @@ SendBridge::SendBridge() : BrowserBridge{"sendBinding"} {
addMethod<GetSendSettings>(); addMethod<GetSendSettings>();
addMethod<Send>(); addMethod<Send>();
} //SendBridge::SendBridge } //SendBridge::SendBridge
/*--------------------------------------------------------------------
Handle an element change
event: The selection event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool SendBridge::handle(const ElementEvent& event) {
using enum ElementEvent::Type;
auto eventType = event.getEventType();
switch (eventType) {
case begin:
m_changedElements.clear();
break;
case end: {
auto project = connector()->getActiveProject().lock();
auto connectorProject = dynamic_cast<ConnectorProject*>(project.get());
if (!connectorProject)
return false;
auto modelCardDatabase = connectorProject->getModelCardDatabase();
auto modelCards = modelCardDatabase->getCards();
// POC: this is probably not efficient, should test, review and refactor it
RecordIDList expiredModelCardIds;
for (const auto& modelCard : modelCards) {
if (auto senderCard = dynamic_cast<SenderModelCard*>(modelCard.get()); senderCard) {
for (const auto& recordID : m_changedElements) {
if (senderCard->contains(recordID)) {
expiredModelCardIds.push_back(modelCard->getID());
break;
}
}
}
}
if (!expiredModelCardIds.empty()) {
auto wrapped = std::make_unique<CargoHold<ContainerWrap<RecordIDList>, RecordIDList>>(std::move(expiredModelCardIds));
sendEvent("setModelsExpired", std::move(wrapped));
}
break;
}
case changeElem: case editElem: case deleteElem: {
if (event.getElementID())
m_changedElements.insert(*event.getElementID());
break;
}
default:
break;
}
return false;
} //SendBridge::handle
@@ -2,14 +2,13 @@
#define CONNECTOR_INTERFACE_BRIDGE_SEND_BRIDGE #define CONNECTOR_INTERFACE_BRIDGE_SEND_BRIDGE
#include "Speckle/Interface/Browser/Bridge/BrowserBridge.h" #include "Speckle/Interface/Browser/Bridge/BrowserBridge.h"
#include "Speckle/Event/Subscriber/ElementSubscriber.h"
namespace connector::interfac::browser::bridge { namespace connector::interfac::browser::bridge {
/*! /*!
A browser bridge to support sending model data to a Speckle server A browser bridge to support sending model data to a Speckle server
*/ */
class SendBridge : public speckle::interfac::browser::bridge::BrowserBridge, public speckle::event::ElementSubscriber { class SendBridge : public speckle::interfac::browser::bridge::BrowserBridge {
public: public:
// MARK: - Types // MARK: - Types
@@ -23,18 +22,6 @@ namespace connector::interfac::browser::bridge {
Default constructor Default constructor
*/ */
SendBridge(); SendBridge();
protected:
/*!
Handle an element change
@param event The selection event
@return True if the event should be closed
*/
bool handle(const speckle::event::ElementEvent& event) override;
private:
///List of changed element IDs
speckle::database::BIMRecordIDList m_changedElements;
}; };
} }
@@ -1,5 +1,5 @@
#ifndef CONNECTOR_INTERFACE_BRIDGE_GET_COMPLEX_TYPE #ifndef CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#define CONNECTOR_INTERFACE_BRIDGE_GET_COMPLEX_TYPE #define CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
#include "Speckle/Interface/Browser/Bridge/BridgeMethod.h" #include "Speckle/Interface/Browser/Bridge/BridgeMethod.h"
@@ -15,6 +15,7 @@ namespace connector::interfac::browser::bridge {
/*! /*!
Constructor Constructor
@param bridge The parent bridge object (provides access to bridge methods)
*/ */
GetComplexType(); GetComplexType();
@@ -29,4 +30,4 @@ namespace connector::interfac::browser::bridge {
} }
#endif //CONNECTOR_INTERFACE_BRIDGE_GET_COMPLEX_TYPE #endif //CONNECTOR_INTERFACE_BRIDGE_GET_CONFIG
@@ -1,9 +1,8 @@
#include "Connector/Interface/Browser/Bridge/Test/GoAway.h" #include "Connector/Interface/Browser/Bridge/Test/GoAway.h"
#include "Speckle/Environment/Platform.h"
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
using namespace speckle::environment;
#include <iostream>
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
@@ -17,5 +16,5 @@ GoAway::GoAway() : BridgeMethod{"GoAway", [&]() {
Write a message to the console Write a message to the console
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
void GoAway::run() const { void GoAway::run() const {
platform()->writeToConsole("Okay, going away."); std::cout << "Okay, going away.";
} //GoAway::run } //GoAway::run
@@ -11,12 +11,6 @@ using namespace active::event;
using namespace connector; using namespace connector;
using namespace speckle::event; using namespace speckle::event;
namespace {
auto connectorMenuItem = 1;
}
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Default constructor Default constructor
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
@@ -28,35 +22,6 @@ ConnectorMenu::ConnectorMenu()
} //ConnectorMenu::ConnectorMenu } //ConnectorMenu::ConnectorMenu
/*--------------------------------------------------------------------
Get the event subscription list
return: The subscription list (an empty list will put the subscriber into a suspended state)
--------------------------------------------------------------------*/
Subscriber::Subscription ConnectorMenu::subscription() const {
auto result = MenuSubscriber::subscription();
result.insert(reflectPaletteVisibilityID);
return result;
} //ConnectorMenu::subscription
/*--------------------------------------------------------------------
Receive a subscribed event
event: The incoming event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool ConnectorMenu::receive(const active::event::Event& event) {
if (event != reflectPaletteVisibilityID)
return MenuSubscriber::receive(event);
//Set the menu checked state based on the palette visibility from the event
if (auto menuState = event.findValue(paletteVisibilityStateID); menuState != nullptr)
setMenuChecked(connectorMenuItem, menuState->boolVal());
return false;
} //ConnectorMenu::receive
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Handle the menu selection Handle the menu selection
@@ -12,21 +12,6 @@ namespace connector {
*/ */
ConnectorMenu(); ConnectorMenu();
/*!
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;
protected: protected:
/*! /*!
Handle the menu selection Handle the menu selection
@@ -1,32 +1,31 @@
#include "Connector/Interface/ConnectorPalette.h" #include "Connector/Interface/ConnectorPalette.h"
#include "Active/Event/Event.h" #include "Active/Event/Event.h"
#include "Active/Setting/ValueSetting.h"
#include "Active/Serialise/JSON/JSONTransport.h"
#include "Active/Utility/BufferOut.h"
#include "Active/Utility/String.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h" #include "Connector/ConnectorResource.h"
#include "Connector/Event/ConnectorEventID.h" #include "Connector/Event/ConnectorEventID.h"
#include "Connector/Interface/Browser/Bridge/Account/AccountBridge.h" #include "Connector/Interface/Browser/Bridge/Account/AccountBridge.h"
#include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h" #include "Connector/Interface/Browser/Bridge/Base/BaseBridge.h"
#include "Connector/Interface/Browser/Bridge/Config/ConfigBridge.h" #include "Connector/Interface/Browser/Bridge/Config/ConfigBridge.h"
#include "Connector/Interface/Browser/Bridge/Receive/ReceiveBridge.h"
#include "Connector/Interface/Browser/Bridge/Send/SendBridge.h" #include "Connector/Interface/Browser/Bridge/Send/SendBridge.h"
#include "Connector/Interface/Browser/Bridge/Selection/SelectionBridge.h"
#include "Connector/Interface/Browser/Bridge/Test/TestBridge.h" #include "Connector/Interface/Browser/Bridge/Test/TestBridge.h"
#include "Speckle/Environment/Addon.h" #include "Speckle/Environment/Addon.h"
#include "Speckle/Event/Type/MenuEvent.h" #include "Speckle/Event/Type/MenuEvent.h"
#include "Speckle/Event/Type/ProjectEvent.h"
#include "Speckle/Interface/Browser/JSPortal.h" #include "Speckle/Interface/Browser/JSPortal.h"
#include "Speckle/Environment/Project.h"
#include "Connector/Connector.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include <ACAPinc.h> #include <ACAPinc.h>
#include <DGModule.hpp> #include <DGModule.hpp>
#include <DGBrowser.hpp> #include <DGBrowser.hpp>
using namespace active::environment; using namespace active::environment;
using namespace active::event; using namespace active::event;
using namespace active::setting;
using namespace connector; using namespace connector;
using namespace speckle::interfac::browser; using namespace speckle::interfac::browser;
using namespace connector::interfac::browser::bridge; using namespace connector::interfac::browser::bridge;
@@ -77,11 +76,14 @@ namespace {
std::shared_ptr<DG::Browser> browser; std::shared_ptr<DG::Browser> browser;
void InitBrowserControl(); void InitBrowserControl();
void publshVisibilityChange(bool); void SetMenuItemCheckedState(bool);
virtual void PanelResized(const DG::PanelResizeEvent& ev) override; virtual void PanelResized(const DG::PanelResizeEvent& ev) override;
virtual void PanelCloseRequested(const DG::PanelCloseRequestEvent& ev, bool* accepted) override; virtual void PanelCloseRequested(const DG::PanelCloseRequestEvent& ev, bool* accepted) override;
static GS::Array<BrowserPalette::ElementInfo> GetSelectedElements();
static void ModifySelection(const GS::UniString& elemGuidStr, SelectionModification modification);
static GSErrCode __ACENV_CALL PaletteControlCallBack(Int32 paletteId, API_PaletteMessageID messageID, GS::IntPtr param); static GSErrCode __ACENV_CALL PaletteControlCallBack(Int32 paletteId, API_PaletteMessageID messageID, GS::IntPtr param);
static GS::Ref<BrowserPalette> instance; static GS::Ref<BrowserPalette> instance;
@@ -112,9 +114,7 @@ ConnectorPalette::ConnectorPalette() {
return: The subscription list (an empty list will put the subscriber into a suspended state) return: The subscription list (an empty list will put the subscriber into a suspended state)
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
ConnectorPalette::Subscription ConnectorPalette::subscription() const { ConnectorPalette::Subscription ConnectorPalette::subscription() const {
auto result = ProjectSubscriber::subscription(); return { {toggleConnectorPaletteID} };
result.insert(toggleConnectorPaletteID);
return result;
} //ConnectorPalette::subscription } //ConnectorPalette::subscription
@@ -136,48 +136,16 @@ bool ConnectorPalette::start() {
return: True if the event should be closed return: True if the event should be closed
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
bool ConnectorPalette::receive(const active::event::Event& event) { bool ConnectorPalette::receive(const active::event::Event& event) {
if (event == toggleConnectorPaletteID) {
if (BrowserPalette::HasInstance() && BrowserPalette::GetInstance().IsVisible()) { if (BrowserPalette::HasInstance() && BrowserPalette::GetInstance().IsVisible()) {
BrowserPalette::GetInstance().Hide (); BrowserPalette::GetInstance().Hide ();
} } else {
else {
if (!BrowserPalette::HasInstance()) if (!BrowserPalette::HasInstance())
BrowserPalette::CreateInstance(); BrowserPalette::CreateInstance();
BrowserPalette::GetInstance().Show(); BrowserPalette::GetInstance().Show();
} }
return true; return true;
}
return ProjectSubscriber::receive(event);
} //ConnectorPalette::receive } //ConnectorPalette::receive
/*--------------------------------------------------------------------
Handle a project event
event: The project event
return: True if the event should be closed
--------------------------------------------------------------------*/
bool ConnectorPalette::handle(const speckle::event::ProjectEvent& event) {
using enum speckle::event::ProjectEvent::Type;
switch (event.getType()) {
case open: {
if (BrowserPalette::HasInstance() && !BrowserPalette::GetInstance().IsVisible()) {
BrowserPalette::GetInstance().Show();
BrowserPalette::GetInstance().EnableItems();
}
} break;
case close: {
if (BrowserPalette::HasInstance() && BrowserPalette::GetInstance().IsVisible()) {
BrowserPalette::GetInstance().Hide();
}
} break;
default:
break;
}
return false;
} //ConnectorPalette::handle
//NB: Following is placeholder from GS example code - will be refactored to better suit our purposes //NB: Following is placeholder from GS example code - will be refactored to better suit our purposes
@@ -199,34 +167,14 @@ static GSErrCode __ACENV_CALL NotificationHandler(API_NotifyEventID notifID, Int
BrowserPalette::BrowserPalette() : BrowserPalette::BrowserPalette() :
DG::Palette(ACAPI_GetOwnResModule(), BrowserPaletteResId, ACAPI_GetOwnResModule(), paletteGuid) { DG::Palette(ACAPI_GetOwnResModule(), BrowserPaletteResId, ACAPI_GetOwnResModule(), paletteGuid) {
browser = std::make_shared<DG::Browser>(GetReference(), BrowserId); browser = std::make_shared<DG::Browser>(GetReference(), BrowserId);
#ifdef ServerMainVers_2700
ACAPI_ProjectOperation_CatchProjectEvent(APINotify_Quit, NotificationHandler); ACAPI_ProjectOperation_CatchProjectEvent(APINotify_Quit, NotificationHandler);
#else
ACAPI_Notify_CatchProjectEvent(APINotify_Quit, NotificationHandler);
#endif
Attach(*this); Attach(*this);
BeginEventProcessing(); BeginEventProcessing();
//Install required connector bridges //Install required connector bridges
install<AccountBridge>(); install<AccountBridge>();
if (auto ref = install<BaseBridge>(); ref) { install<BaseBridge>();
if (auto baseBridgeRef = std::dynamic_pointer_cast<BaseBridge>(ref); baseBridgeRef) {
connector::connector()->addWeak(baseBridgeRef);
}
}
install<ConfigBridge>(); install<ConfigBridge>();
install<ReceiveBridge>(); install<SendBridge>();
if (auto ref = install<SendBridge>(); ref) {
if (auto sendBridgeRef = std::dynamic_pointer_cast<SendBridge>(ref); sendBridgeRef) {
connector::connector()->addWeak(sendBridgeRef);
sendBridgeRef->start();
}
}
if (auto ref = install<SelectionBridge>(); ref) {
if (auto selectionBridgeRef = std::dynamic_pointer_cast<SelectionBridge>(ref); selectionBridgeRef) {
connector::connector()->addWeak(selectionBridgeRef);
selectionBridgeRef->start();
}
}
install<TestBridge>(); install<TestBridge>();
InitBrowserControl(); InitBrowserControl();
} }
@@ -256,27 +204,36 @@ void BrowserPalette::DestroyInstance() {
void BrowserPalette::Show() { void BrowserPalette::Show() {
DG::Palette::Show(); DG::Palette::Show();
publshVisibilityChange(true); SetMenuItemCheckedState(true);
} }
void BrowserPalette::Hide() { void BrowserPalette::Hide() {
DG::Palette::Hide(); DG::Palette::Hide();
publshVisibilityChange(false); SetMenuItemCheckedState(false);
} }
void BrowserPalette::InitBrowserControl() { void BrowserPalette::InitBrowserControl() {
#ifdef TESTING_MODE #ifdef TESTING_MODE
//browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/test"); browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/test");
browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app");
#else #else
browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/"); browser->LoadURL("https://boisterous-douhua-e3cefb.netlify.app/");
#endif #endif
} }
void BrowserPalette::publshVisibilityChange(bool isChecked) { void BrowserPalette::SetMenuItemCheckedState(bool isChecked) {
//Signal that the palette visibility has changed API_MenuItemRef itemRef = {};
app()->publish(Event{reflectPaletteVisibilityID, { ValueSetting{isChecked, paletteVisibilityStateID} }}); GSFlags itemFlags = {};
itemRef.menuResID = BrowserPaletteMenuResId;
itemRef.itemIndex = BrowserPaletteMenuItemIndex;
ACAPI_MenuItem_GetMenuItemFlags(&itemRef, &itemFlags);
if(isChecked)
itemFlags |= API_MenuItemChecked;
else
itemFlags &= ~API_MenuItemChecked;
ACAPI_MenuItem_SetMenuItemFlags(&itemRef, &itemFlags);
} }
void BrowserPalette::PanelResized(const DG::PanelResizeEvent& ev) { void BrowserPalette::PanelResized(const DG::PanelResizeEvent& ev) {
@@ -290,6 +247,31 @@ void BrowserPalette::PanelCloseRequested(const DG::PanelCloseRequestEvent&, bool
*accepted = true; *accepted = true;
} }
GS::Array<BrowserPalette::ElementInfo> BrowserPalette::GetSelectedElements() {
API_SelectionInfo selectionInfo;
GS::Array<API_Neig> selNeigs;
ACAPI_Selection_Get(&selectionInfo, &selNeigs, false, false);
BMKillHandle((GSHandle*)&selectionInfo.marquee.coords);
GS::Array<BrowserPalette::ElementInfo> selectedElements;
for(const API_Neig& neig : selNeigs) {
API_Elem_Head elemHead = {};
elemHead.guid = neig.guid;
ACAPI_Element_GetHeader(&elemHead);
ElementInfo elemInfo;
elemInfo.guidStr = APIGuidToString(elemHead.guid);
ACAPI_Element_GetElemTypeName(elemHead.type, elemInfo.typeName);
ACAPI_Element_GetElementInfoString(&elemHead.guid, &elemInfo.elemID);
selectedElements.Push(elemInfo);
}
return selectedElements;
}
void BrowserPalette::ModifySelection(const GS::UniString& elemGuidStr, BrowserPalette::SelectionModification modification) {
ACAPI_Selection_Select({ API_Neig(APIGuidFromString(elemGuidStr.ToCStr().Get())) }, modification == AddToSelection);
}
GSErrCode __ACENV_CALL BrowserPalette::PaletteControlCallBack(Int32, API_PaletteMessageID messageID, GS::IntPtr param) { GSErrCode __ACENV_CALL BrowserPalette::PaletteControlCallBack(Int32, API_PaletteMessageID messageID, GS::IntPtr param) {
switch(messageID) { switch(messageID) {
case APIPalMsg_OpenPalette: case APIPalMsg_OpenPalette:
@@ -311,9 +293,17 @@ GSErrCode __ACENV_CALL BrowserPalette::PaletteControlCallBack(Int32, API_Palette
case APIPalMsg_HidePalette_End: case APIPalMsg_HidePalette_End:
if(HasInstance() && !GetInstance().IsVisible()) if(HasInstance() && !GetInstance().IsVisible())
{
GetInstance().Show(); GetInstance().Show();
} break;
case APIPalMsg_DisableItems_Begin:
if(HasInstance() && GetInstance().IsVisible())
GetInstance().DisableItems();
break;
case APIPalMsg_DisableItems_End:
if(HasInstance() && GetInstance().IsVisible())
GetInstance().EnableItems();
break; break;
case APIPalMsg_IsPaletteVisible: case APIPalMsg_IsPaletteVisible:
@@ -2,11 +2,10 @@
#define CONNECTOR_CONNECTOR_PALETTE #define CONNECTOR_CONNECTOR_PALETTE
#include "Active/Event/Subscriber.h" #include "Active/Event/Subscriber.h"
#include "Speckle/Event/Subscriber/ProjectSubscriber.h"
namespace connector { namespace connector {
class ConnectorPalette : public speckle::event::ProjectSubscriber { class ConnectorPalette : public active::event::Subscriber {
public: public:
/*! /*!
Default constructor Default constructor
@@ -33,13 +32,6 @@ namespace connector {
@return True if the event should be closed @return True if the event should be closed
*/ */
bool receive(const active::event::Event& event) override; bool receive(const active::event::Event& event) override;
protected:
/*!
Handle the project events
@param event The project event
@return True if the event should be closed
*/
bool handle(const speckle::event::ProjectEvent& event) override;
}; };
} }
@@ -1,68 +0,0 @@
#include "Connector/Record/Collection/FinishProxy.h"
#include "Active/Serialise/Package/Wrapper/ContainerWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include <array>
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::utility;
namespace {
///Serialisation fields
enum FieldIndex {
materialID,
linkedMeshID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"value"},
Identity{"objects"},
};
}
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool FinishProxy::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type;
inventory.merge(Inventory{
{
{ fieldID[materialID], materialID, element },
{ fieldID[linkedMeshID], linkedMeshID, element },
},
}.withType(&typeid(FinishProxy)));
return base::fillInventory(inventory);
} //FinishProxy::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique FinishProxy::getCargo(const active::serialise::Inventory::Item& item) const {
if (item.ownerType != &typeid(FinishProxy))
return base::getCargo(item);
using namespace active::serialise;
switch (item.index) {
case materialID:
return std::make_unique<PackageWrap>(m_finish);
case linkedMeshID: {
auto result = new ContainerWrap(m_meshID);
return Cargo::Unique{result};
}
default:
return nullptr; //Requested an unknown index
}
} //FinishProxy::getCargo
@@ -1,60 +0,0 @@
#ifndef CONNECTOR_RECORD_COLLECTION_MATERIAL_PROXY
#define CONNECTOR_RECORD_COLLECTION_MATERIAL_PROXY
#include "Speckle/Database/Content/BIMRecord.h"
#include "Speckle/Record/Attribute/Finish.h"
#include "Speckle/Utility/String.h"
namespace connector::record {
/*!
A proxy record binding a surface finishes to meshes
*/
class FinishProxy : public speckle::database::BIMRecord {
public:
using base = speckle::database::BIMRecord;
// MARK: - Constructors
/*!
Constructor
@param finish The proxy surface finish
@param meshID The list of mesh IDs the finish is applied to
*/
FinishProxy(const speckle::record::attribute::Finish& finish, const std::unordered_set<active::utility::Guid>& meshID) :
base{speckle::utility::Guid{true}, speckle::utility::Guid{}, std::nullopt}, m_finish{finish} {
std::copy(meshID.begin(), meshID.end(), std::back_inserter(m_meshID));
}
/*!
Get the speckle type identifier
@return The speckle type (relevant objects should override as required, but "Base" is still considered a type on its own)
*/
speckle::utility::String getSpeckleType() const override { return "Objects.Other.RenderMaterialProxy"; }
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
private:
///The proxy surface finish
speckle::record::attribute::Finish m_finish;
///The list of mesh IDs the finish is applied to
std::vector<active::utility::Guid> m_meshID;
};
}
#endif //CONNECTOR_RECORD_COLLECTION_MATERIAL_PROXY
@@ -1,202 +0,0 @@
#include "Connector/Record/Collection/ProjectCollection.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Management/Management.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Connector/Connector.h"
#include "Connector/ConnectorResource.h"
#include "Connector/Record/Collection/FinishProxy.h"
#include "Speckle/Database/BIMAttributeDatabase.h"
#include "Speckle/Database/BIMElementDatabase.h"
#include "Speckle/Record/Attribute/Finish.h"
#include "Speckle/Record/Element/Element.h"
#include <limits>
#ifdef ARCHICAD
#include <ACAPinc.h>
#include <ModelMaterial.hpp>
#endif
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::database;
using namespace speckle::record::attribute;
using namespace speckle::utility;
#ifdef ARCHICAD
namespace connector::record {
class ProjectCollection::FinishCache : public std::unordered_map<active::utility::Guid, Finish> {};
}
#endif
namespace {
///Serialisation fields
enum FieldIndex {
finishProxyID,
};
///Serialisation field IDs
static std::array fieldID = {
Identity{"renderMaterialProxies"},
};
using WrappedProxy = CargoHold<PackageWrap, FinishProxy>;
}
/*--------------------------------------------------------------------
Constructor
project: The source project
modelCardID: The model card ID for the send operation
--------------------------------------------------------------------*/
ProjectCollection::ProjectCollection(speckle::environment::Project::Shared project, const RecordID& modelCardID) :
base{project->getInfo().name, project}, ConversionReporter{modelCardID}, m_management {
std::make_unique<Management>()
} {
m_management->push_back(this);
m_finishes = std::make_unique<FinishCache>();
base::useManagement(m_management.get());
} //ProjectCollection::ProjectCollection
/*--------------------------------------------------------------------
Destructor
--------------------------------------------------------------------*/
ProjectCollection::~ProjectCollection() {
} //ProjectCollection::~ProjectCollection
/*--------------------------------------------------------------------
Add an element to the collection hierarchy
index The index of the element to add
return: True if the element was added (false typically means the element already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addElement(const speckle::database::BIMIndex& index) {
//Lookup the element in the element database of the active project
auto elementDbase = m_project->getElementDatabase();
if (elementDbase == nullptr)
return false;
if (auto element = elementDbase->getElement(index); element) {
addElement(*element); //Add the element to the collection hierarchy
return true;
}
return false;
} //ProjectCollection::addElement
/*--------------------------------------------------------------------
Add an element to the collection hierarchy
element: The element to add
return: True if the element was added (false typically means the element already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addElement(const speckle::record::element::Element& element) {
std::vector<String> collectionNames;
//The first collection hierarchy level is the element storey/level
auto storey = element.getStorey();
collectionNames.emplace_back(storey ? storey->getName() : connector()->getLocalString(titleString, noStoreyID));
//The next level is the name of the element type
collectionNames.emplace_back(element.getTypeName());
//Add any future levels here as required
RecordCollection* collection = this;
for (const auto& childName : collectionNames)
collection = collection->getChild(childName);
if (!collection->addIndex(BIMIndex{element.getBIMID(), element.getTableID()}))
return false;
incrementProjectedRecords();
return true;
} //ProjectCollection::addElement
/*--------------------------------------------------------------------
Add a material proxy record to the collection
materialIndex: The index of the material to add
objectID: The object the material is applied to
return: True if the material proxy was added (false typically means the record already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addFinishProxy(const speckle::database::BIMIndex& materialIndex, const speckle::database::BIMRecordID& objectID) {
auto iter = m_finishProxies.find(materialIndex);
if (iter == m_finishProxies.end())
iter = m_finishProxies.insert({materialIndex, {}}).first;
return iter->second.insert(objectID).second;
} //ProjectCollection::addFinishProxy
/*--------------------------------------------------------------------
Add a ModelerAPI material to the collection (NB: These are not persistent so need to be captured by this method)
material: A material
objectID: The object the material is applied to
return: True if the material proxy was added (false typically means the record already exists)
--------------------------------------------------------------------*/
bool ProjectCollection::addFinishProxy(const Finish& finish, const speckle::database::BIMRecordID& objectID) {
auto iter = m_finishes->find(finish.getBIMID());
if (iter == m_finishes->end())
iter = m_finishes->insert({finish.getBIMID(), finish}).first;
return addFinishProxy(speckle::database::BIMIndex{finish.getBIMID()}, objectID);
} //ProjectCollection::addFinishProxy
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool ProjectCollection::fillInventory(active::serialise::Inventory& inventory) const {
using enum Entry::Type;
base::fillInventory(inventory);
inventory.merge(Inventory{
{
{ Identity{fieldID[finishProxyID]}, finishProxyID, std::numeric_limits<size_t>::max(), std::nullopt },
},
}.withType(&typeid(ProjectCollection)));
return true;
} //ProjectCollection::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique ProjectCollection::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(ProjectCollection))
return base::getCargo(item);
using namespace active::serialise;
//TODO: This is only currently coded to write collection content - reading can be added as required in future
switch (item.index) {
case finishProxyID: {
if (item.available < m_finishProxies.size()) {
auto iter = m_finishProxies.begin();
std::advance(iter, item.available);
const Finish* finish = nullptr;
if (auto fin = m_finishes->find(iter->first); fin != m_finishes->end())
finish = &fin->second;
else if (auto attribute = m_project->getAttributeDatabase()->getAttribute(iter->first, iter->first.tableID); attribute)
finish = dynamic_cast<const Finish*>(attribute.get());
if (finish != nullptr) {
auto proxy = std::make_unique<FinishProxy>(*finish, iter->second);
return std::make_unique<WrappedProxy>(std::move(proxy));
}
}
break;
}
default:
break;
}
return nullptr; //Requested an unknown index
} //ProjectCollection::getCargo
@@ -1,111 +0,0 @@
#ifndef CONNECTOR_RECORD_ROOT_COLLECTiON
#define CONNECTOR_RECORD_ROOT_COLLECTiON
#include "Connector/Record/Collection/RecordCollection.h"
#include "Speckle/Serialise/Collection/FinishCollector.h"
#include "Speckle/Serialise/Collection/ConversionReporter.h"
#include <stack>
namespace active::serialise {
class Management;
}
namespace speckle::record::element {
class Element;
}
namespace connector::record {
/*!
Root collection for sending a project model to a Speckle server
Additional information is anticipated at the root level that will not apply at any other level in the container hierarchy, e.g.:
- Classification hierarchy
- Layers
- Other attributes, e.g. materials
Add all this supplementary data to the root container as required
*/
class ProjectCollection : public RecordCollection, public speckle::serialise::FinishCollector, public speckle::serialise::ConversionReporter {
public:
// MARK: - Types
using base = RecordCollection;
// MARK: - Constructors
/*!
Constructor
@param project The source project
@param modelCardID The model card ID for the send operation
*/
ProjectCollection(speckle::environment::Project::Shared project, const speckle::database::RecordID& modelCardID);
ProjectCollection(const ProjectCollection&) = delete;
/*!
Destructor
*/
~ProjectCollection();
using base::base;
// MARK: - Functions (const)
// MARK: - Functions (mutating)
/*!
Add an element to the collection hierarchy
@param index The index of the element to add
@return True if the element was added (false typically means the element already exists)
*/
bool addElement(const speckle::database::BIMIndex& index);
/*!
Add an element to the collection hierarchy
@param element The element to add
@return True if the element was added (false typically means the element already exists)
*/
bool addElement(const speckle::record::element::Element& element);
/*!
Add a material proxy record to the collection
@param materialIndex The index of the material to add
@param objectID The object the material is applied to
@return True if the material proxy was added (false typically means the record already exists)
*/
bool addFinishProxy(const speckle::database::BIMIndex& materialIndex, const speckle::database::BIMRecordID& objectID) override;
/*!
Add a ModelerAPI material to the collection (NB: These are not persistent so need to be captured by this method)
@param finish A finish
@param objectID The object the material is applied to
@return True if the material proxy was added (false typically means the record already exists)
*/
bool addFinishProxy(const speckle::record::attribute::Finish& finish, const speckle::database::BIMRecordID& objectID) override;
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
private:
using FinishProxies = std::unordered_map<speckle::database::BIMIndex, std::unordered_set<active::utility::Guid>>;
std::unique_ptr<active::serialise::Management> m_management;
///Finish proxies accumulated from meshes generated from the collection elements
FinishProxies m_finishProxies;
class FinishCache;
///Finishes cache
std::unique_ptr<FinishCache> m_finishes;
};
}
#endif //CONNECTOR_RECORD_ROOT_COLLECTiON
@@ -1,15 +1,11 @@
#include "Connector/Record/Collection/RecordCollection.h" #include "Connector/Record/Collection/RecordCollection.h"
#include "Active/Serialise/CargoHold.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h" #include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h" #include "Active/Serialise/Package/Wrapper/PackageWrap.h"
#include "Speckle/Database/BIMElementDatabase.h"
using namespace active::serialise; using namespace active::serialise;
using namespace connector::record; using namespace connector::record;
using namespace speckle::database; using namespace speckle::database;
using namespace speckle::environment;
using namespace speckle::record::element;
using namespace speckle::utility; using namespace speckle::utility;
#include <array> #include <array>
@@ -20,55 +16,18 @@ namespace {
enum FieldIndex { enum FieldIndex {
nameID, nameID,
elementID, elementID,
childrenID,
}; };
///Serialisation field IDs ///Serialisation field IDs
static std::array fieldID = { static std::array fieldID = {
Identity{"name"}, Identity{"name"},
Identity{"elements"}, Identity{"element"},
Identity{"child"},
}; };
using WrappedElement = CargoHold<PackageWrap, Element>;
} }
/*--------------------------------------------------------------------
Constructor
name: The collection name
project: The source project
--------------------------------------------------------------------*/
RecordCollection::RecordCollection(const speckle::utility::String& name, Project::Shared project) : m_name{name}, m_project{project} {
} //RecordCollection::RecordCollection
/*--------------------------------------------------------------------
Get a child collection by name (adding if missing)
name: The child name
return: A pointer to the requested child (nullptr on failure, caller does not take ownership)
--------------------------------------------------------------------*/
RecordCollection* RecordCollection::getChild(const speckle::utility::String& name) {
//Return an existing child if possible
if (auto iter = m_children.find(name); iter != m_children.end())
return &iter->second;
//Otherwise insert and return a new collection with the requested name
return &m_children.insert({name, RecordCollection{name, m_project}}).first->second;
} //RecordCollection::getChild
/*--------------------------------------------------------------------
Add an index to the collection
index: The index to add
return: True if the index was added (false typically means the index already exists)
--------------------------------------------------------------------*/
bool RecordCollection::addIndex(const speckle::database::BIMIndex& index) {
return m_indices.insert(index).second;
} //RecordCollection::addIndex
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
Fill an inventory with the package items Fill an inventory with the package items
@@ -77,13 +36,13 @@ bool RecordCollection::addIndex(const speckle::database::BIMIndex& index) {
return: True if the package has added items to the inventory return: True if the package has added items to the inventory
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
bool RecordCollection::fillInventory(active::serialise::Inventory& inventory) const { bool RecordCollection::fillInventory(Inventory& inventory) const {
using enum Entry::Type; using enum Entry::Type;
base::fillInventory(inventory);
inventory.merge(Inventory{ inventory.merge(Inventory{
{ {
{ Identity{fieldID[nameID]}, nameID, element }, { fieldID[nameID], nameID, element },
{ Identity{fieldID[elementID]}, elementID, m_children.size() + m_indices.size(), std::nullopt }, { fieldID[elementID], elementID, base::size(), std::nullopt, !base::empty() },
{ fieldID[childrenID], childrenID, m_children.size(), std::nullopt, !m_children.empty() },
}, },
}.withType(&typeid(RecordCollection))); }.withType(&typeid(RecordCollection)));
return true; return true;
@@ -99,29 +58,18 @@ bool RecordCollection::fillInventory(active::serialise::Inventory& inventory) co
--------------------------------------------------------------------*/ --------------------------------------------------------------------*/
Cargo::Unique RecordCollection::getCargo(const Inventory::Item& item) const { Cargo::Unique RecordCollection::getCargo(const Inventory::Item& item) const {
if (item.ownerType != &typeid(RecordCollection)) if (item.ownerType != &typeid(RecordCollection))
return base::getCargo(item); return nullptr;
using namespace active::serialise; using namespace active::serialise;
//TODO: This is only currently coded to write collection content - reading can be added as required in future
switch (item.index) { switch (item.index) {
case nameID: case nameID:
return std::make_unique<StringWrap>(m_name); return std::make_unique<StringWrap>(m_name);
case elementID: { case elementID:
if (item.available < m_children.size()) { return nullptr; //TODO: Implement - need to interrogate BIM database for element and return as cargo
auto iter = m_children.begin(); case childrenID:
std::advance(iter, item.available); if (item.available < m_children.size())
return std::make_unique<PackageWrap>(iter->second); return std::make_unique<PackageWrap>(m_children[item.available]);
} return nullptr;
auto index = item.available - m_children.size();
if (index < m_indices.size()) {
auto iter = m_indices.begin();
std::advance(iter, index);
if (auto element = m_project->getElementDatabase()->getElement(*iter, iter->tableID); element)
return std::make_unique<WrappedElement>(std::move(element));
}
break;
}
default: default:
break;
}
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
}
} //RecordCollection::getCargo } //RecordCollection::getCargo
@@ -1,18 +1,13 @@
#ifndef CONNECTOR_RECORD_RECORD_COLLECTiON #ifndef CONNECTOR_RECORD_RECORD_COLLECTiON
#define CONNECTOR_RECORD_RECORD_COLLECTiON #define CONNECTOR_RECORD_RECORD_COLLECTiON
#include "Speckle/Database/Content/Record.h" #include "Active/Container/Vector.h"
#include "Speckle/Database/Identity/BIMIndex.h" #include "Active/Serialise/Package/Package.h"
#include "Speckle/Environment/Project.h" #include "Speckle/Database/Identity/RecordID.h"
#include "Speckle/Utility/String.h" #include "Speckle/Utility/String.h"
#include <unordered_set>
#include <unordered_map>
namespace connector::record { namespace connector::record {
class ProjectCollection;
/*! /*!
Container for a collection of elements (and potentially tables of associated attributes) for Speckle commits Container for a collection of elements (and potentially tables of associated attributes) for Speckle commits
@@ -31,38 +26,43 @@ namespace connector::record {
Note that the serialisation is currently implemented for sending only. Receive can be added as required Note that the serialisation is currently implemented for sending only. Receive can be added as required
*/ */
class RecordCollection : public speckle::database::Record { class RecordCollection : public std::vector<speckle::database::RecordID>, public active::serialise::Package {
public: public:
// MARK: - Types // MARK: - Types
using base = speckle::database::Record; using base = std::vector<speckle::database::RecordID>;
using Children = std::vector<RecordCollection>;
// MARK: - Constructors // MARK: - Constructors
/*! using base::base;
Destructor
*/
~RecordCollection() {}
// MARK: - Functions (const) // MARK: - Functions (const)
/*!
Get the speckle type identifier
@return The speckle type (relevant objects should override as required, but "Base" is still considered a type on its own)
*/
speckle::utility::String getSpeckleType() const override { return "Speckle.Core.Models.Collections.Collection"; }
/*! /*!
Get the container name Get the container name
@return The container name @return The container name
*/ */
const speckle::utility::String& getName() const { return m_name; } const speckle::utility::String& getName() const { return m_name; }
/*! /*!
Find a child by name Get the child collections
@param name The required child name @return The child collections nested under this collection
@return A pointer to the requested child (nullptr if not found)
*/ */
RecordCollection* findChild(const speckle::utility::String& name) const; const Children& getChildren() const;
// MARK: - Functions (mutating)
/*!
Set the container name
@param name The container name
*/
void setName(const speckle::utility::String& name) { m_name = name; }
/*!
Add a child collection
@param child The child collection to add
*/
void addChild(RecordCollection&& child);
// MARK: - Serialisation // MARK: - Serialisation
@@ -80,41 +80,10 @@ namespace connector::record {
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override; active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
private: private:
friend ProjectCollection;
// MARK: - Types
using Indices = std::unordered_set<speckle::database::BIMIndex>;
using Children = std::unordered_map<speckle::utility::String, RecordCollection>;
/*!
Constructor
@param name The collection name
@param project The source project
*/
RecordCollection(const speckle::utility::String& name, speckle::environment::Project::Shared project);
/*!
Get a child collection by name (adding if missing)
@param name The child name
@return A pointer to the requested child (nullptr on failure, caller does not take ownership)
*/
RecordCollection* getChild(const speckle::utility::String& name);
/*!
Add an index to the collection
@param index The index to add
@return True if the index was added (false typically means the index already exists)
*/
bool addIndex(const speckle::database::BIMIndex& index);
///The source project for the collection
speckle::environment::Project::Shared m_project;
///The collection name
speckle::utility::String m_name;
///Child nodes of this collection ///Child nodes of this collection
Children m_children; Children m_children;
///Indices of records in this collection ///The collection name
Indices m_indices; speckle::utility::String m_name;
}; };
} }
@@ -0,0 +1,34 @@
#include "Connector/Record/Collection/RootCollection.h"
#include "Active/Serialise/Item/Wrapper/ValueWrap.h"
#include "Active/Serialise/Package/Wrapper/PackageWrap.h"
using namespace active::serialise;
using namespace connector::record;
using namespace speckle::database;
using namespace speckle::utility;
/*--------------------------------------------------------------------
Fill an inventory with the package items
inventory: The inventory to receive the package items
return: True if the package has added items to the inventory
--------------------------------------------------------------------*/
bool RootCollection::fillInventory(Inventory& inventory) const {
//Extend with supplementary data as required
return base::fillInventory(inventory);
} //RootCollection::fillInventory
/*--------------------------------------------------------------------
Get the specified cargo
item: The inventory item to retrieve
return: The requested cargo (nullptr on failure)
--------------------------------------------------------------------*/
Cargo::Unique RootCollection::getCargo(const Inventory::Item& item) const {
//Extend with supplementary data as required
return base::getCargo(item);
} //RootCollection::getCargo
@@ -0,0 +1,52 @@
#ifndef CONNECTOR_RECORD_ROOT_COLLECTiON
#define CONNECTOR_RECORD_ROOT_COLLECTiON
#include "Connector/Record/Collection/RecordCollection.h"
namespace connector::record {
/*!
Root container for sending model data to a Speckle server
Additional information is anticipated at the root level that will not apply at any other level in the container hierarchy, e.g.:
- Classification hierarchy
- Layers
- Other attributes, e.g. materials
Add all this supplementary data to the root container as required
*/
class RootCollection : public RecordCollection {
public:
// MARK: - Types
using base = RecordCollection;
// MARK: - Constructors
using base::base;
// MARK: - Functions (const)
// MARK: - Functions (mutating)
// MARK: - Serialisation
/*!
Fill an inventory with the package items
@param inventory The inventory to receive the package items
@return True if the package has added items to the inventory
*/
bool fillInventory(active::serialise::Inventory& inventory) const override;
/*!
Get the specified cargo
@param item The inventory item to retrieve
@return The requested cargo (nullptr on failure)
*/
active::serialise::Cargo::Unique getCargo(const active::serialise::Inventory::Item& item) const override;
};
}
#endif //CONNECTOR_RECORD_ROOT_COLLECTiON
@@ -1,9 +1,13 @@
/*!
Copyright 2024 Ralph Wessel and Hugh Wessel
Distributed under the MIT License (See accompanying file LICENSE.txt or copy at https://opensource.org/license/mit/)
*/
#include "Connector/Record/Model/CardMover.h" #include "Connector/Record/Model/CardMover.h"
#include "Connector/Record/Model/ReceiverModelCard.h" #include "Connector/Record/Model/ReceiverModelCard.h"
#include "Connector/Record/Model/SenderModelCard.h" #include "Connector/Record/Model/SenderModelCard.h"
using namespace active::serialise;
using namespace connector::record; using namespace connector::record;
namespace { namespace {
@@ -33,7 +37,7 @@ namespace {
} }
///The handler for model card packages ///The handler for model card packages
std::shared_ptr<Handler> CardMover::m_handler = std::make_shared<Handler>(attributeTag); std::shared_ptr<active::serialise::Handler> CardMover::m_handler = std::make_shared<active::serialise::Handler>(attributeTag);
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
@@ -6,10 +6,10 @@
namespace connector::record { namespace connector::record {
/*! /*!
Wrapper to box/unbox model cards during (de)serialisation Wrapper to box/unbox objects during (de)serialisation, including reading/writing a specified attribute to determine object type
Model cards are polymorphic - this class ensures the type information is included when a card is serialised Note that a derived class could also define the package handler, allowing the wrapper to be created via a default constructor that is
and the correct object type is constructed on deserialisation automatically bound to a set of internally defined object types
*/ */
class CardMover : public active::serialise::Mover { class CardMover : public active::serialise::Mover {
public: public:
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER #ifndef CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER
#define CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER #define CONNECTOR_RECORD_ARCHICAD_EVERYTHING_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/EverythingSendFilter.h" #include "Connector/Record/Model/Filter/EverythingSendFilter.h"
namespace connector::record { namespace connector::record {
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER #ifndef CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER
#define CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER #define CONNECTOR_RECORD_ARCHICAD_SELECTION_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/DirectSelectionSendFilter.h" #include "Connector/Record/Model/Filter/DirectSelectionSendFilter.h"
namespace connector::record { namespace connector::record {
@@ -7,7 +7,7 @@
#include <array> #include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace speckle::utility; using namespace speckle::utility;
@@ -56,7 +56,7 @@ Cargo::Unique DirectSelectionSendFilter::getCargo(const Inventory::Item& item) c
using namespace active::serialise; using namespace active::serialise;
switch (item.index) { switch (item.index) {
case selectedElemID: case selectedElemID:
return std::make_unique<ContainerWrap<BIMRecordIDList>>(m_selectedElements, false, fieldID[selectedElemID].name); return std::make_unique<ContainerWrap<ElementIDList>>(m_selectedElements);
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER #ifndef CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER
#define CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER #define CONNECTOR_RECORD_DIRECT_SELECT_SEND_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/SendFilter.h" #include "Connector/Record/Model/Filter/SendFilter.h"
namespace connector::record { namespace connector::record {
@@ -32,17 +32,11 @@ namespace connector::record {
// MARK: - Functions (const) // 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 Get the filtered element IDs
@return The filter elements @return The filter elements
*/ */
const speckle::database::BIMRecordIDList& getElementIDs() const override { return m_selectedElements; } const database::ElementIDList& getElementIDs() const override { return m_selectedElements; }
// MARK: - Serialisation // MARK: - Serialisation
@@ -65,7 +59,7 @@ namespace connector::record {
private: private:
///A list of selected element IDs ///A list of selected element IDs
speckle::database::BIMRecordIDList m_selectedElements; database::ElementIDList m_selectedElements;
}; };
} }
@@ -9,7 +9,7 @@
#include <array> #include <array>
using namespace active::serialise; using namespace active::serialise;
using namespace speckle::database; using namespace connector::database;
using namespace connector::record; using namespace connector::record;
using namespace speckle::utility; using namespace speckle::utility;
@@ -58,7 +58,7 @@ Cargo::Unique EverythingSendFilter::getCargo(const Inventory::Item& item) const
using namespace active::serialise; using namespace active::serialise;
switch (item.index) { switch (item.index) {
case selectedElemID: case selectedElemID:
return std::make_unique<ContainerWrap<BIMRecordIDList>>(m_emptyList); return std::make_unique<ContainerWrap<ElementIDList>>(m_emptyList);
default: default:
return nullptr; //Requested an unknown index return nullptr; //Requested an unknown index
} }
@@ -1,7 +1,7 @@
#ifndef CONNECTOR_RECORD_EVERYTHING_SEND_FILTER #ifndef CONNECTOR_RECORD_EVERYTHING_SEND_FILTER
#define CONNECTOR_RECORD_EVERYTHING_SEND_FILTER #define CONNECTOR_RECORD_EVERYTHING_SEND_FILTER
#include "Speckle/Database/Identity/RecordID.h" #include "Connector/Database/Identity/RecordID.h"
#include "Connector/Record/Model/Filter/SendFilter.h" #include "Connector/Record/Model/Filter/SendFilter.h"
namespace connector::record { namespace connector::record {
@@ -32,23 +32,17 @@ namespace connector::record {
// MARK: - Functions (const) // 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 Get the filtered element IDs
@return The filter elements @return The filter elements
*/ */
const speckle::database::BIMRecordIDList& getElementIDs() const override { return m_emptyList; } const database::ElementIDList& getElementIDs() const override { return m_emptyList; }
/*! /*!
Determine if the filter has expired because an element in the selection has changed Determine if the filter has expired because an element in the selection has changed
@param changed The list of changed element IDs @param changed The list of changed element IDs
@return True if the one of the changed elements is in the selection @return True if the one of the changed elements is in the selection
*/ */
virtual bool checkExpiry(const speckle::database::BIMRecordIDList& changed) const override { return true; } virtual bool checkExpiry(const database::ElementIDList& changed) const override { return true; }
// MARK: - Serialisation // MARK: - Serialisation
@@ -71,7 +65,7 @@ namespace connector::record {
private: private:
///Enables a const empty list to be returned ///Enables a const empty list to be returned
speckle::database::BIMRecordIDList m_emptyList; database::ElementIDList m_emptyList;
}; };
} }
@@ -1,3 +1,8 @@
/*!
Copyright 2024 Ralph Wessel and Hugh Wessel
Distributed under the MIT License (See accompanying file LICENSE.txt or copy at https://opensource.org/license/mit/)
*/
#include "Connector/Record/Model/Filter/FilterMover.h" #include "Connector/Record/Model/Filter/FilterMover.h"
#include "Connector/Record/Model/Filter/ArchicadEverythingFilter.h" #include "Connector/Record/Model/Filter/ArchicadEverythingFilter.h"

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