Skip to content

Commit a154519

Browse files
committed
IModel blueprint
1 parent 5ece3c0 commit a154519

File tree

6 files changed

+296
-42
lines changed

6 files changed

+296
-42
lines changed

Source/CesiumRuntime/Private/Cesium3DTileset.cpp

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1197,9 +1197,7 @@ void ACesium3DTileset::LoadTileset() {
11971197
externals,
11981198
Cesium3DTilesSelection::ITwinCesiumCuratedContentLoaderFactory(
11991199
static_cast<uint32_t>(this->ITwinCesiumContentID),
1200-
this->ITwinConnection->GetConnection()
1201-
->getAccessToken()
1202-
.getToken()),
1200+
this->ITwinConnection->GetConnection()->getAuthToken().getToken()),
12031201
options);
12041202
break;
12051203
case ETilesetSource::FromIModelMeshExportService:
@@ -1214,9 +1212,7 @@ void ACesium3DTileset::LoadTileset() {
12141212
Cesium3DTilesSelection::IModelMeshExportContentLoaderFactory(
12151213
TCHAR_TO_UTF8(*this->IModelID),
12161214
std::nullopt,
1217-
this->ITwinConnection->GetConnection()
1218-
->getAccessToken()
1219-
.getToken()),
1215+
this->ITwinConnection->GetConnection()->getAuthToken().getToken()),
12201216
options);
12211217
break;
12221218
case ETilesetSource::FromITwinRealityData:
@@ -1233,7 +1229,7 @@ void ACesium3DTileset::LoadTileset() {
12331229
this->ITwinID.IsEmpty() ? std::nullopt
12341230
: std::make_optional<std::string>(
12351231
TCHAR_TO_UTF8(*this->ITwinID)),
1236-
this->ITwinConnection->GetConnection()->getAccessToken().getToken(),
1232+
this->ITwinConnection->GetConnection()->getAuthToken().getToken(),
12371233
[asyncSystem, pConnection = this->ITwinConnection->GetConnection()](
12381234
const std::string&) {
12391235
if (!pConnection->getRefreshToken()) {
@@ -1251,14 +1247,14 @@ void ACesium3DTileset::LoadTileset() {
12511247
return CesiumUtility::Result<std::string>(result.errors);
12521248
}
12531249

1254-
if (!pConnection->getAccessToken().isValid()) {
1250+
if (!pConnection->getAuthToken().isValid()) {
12551251
return CesiumUtility::Result<
12561252
std::string>(CesiumUtility::ErrorList::error(
12571253
"Tried to refresh access token for reality data, but was not able to obtain valid token."));
12581254
}
12591255

12601256
return CesiumUtility::Result<std::string>(
1261-
pConnection->getAccessToken().getToken());
1257+
pConnection->getAuthToken().getToken());
12621258
});
12631259
}),
12641260
options);

Source/CesiumRuntime/Private/CesiumCartographicPolygon.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ ACesiumCartographicPolygon::CreateCartographicPolygon(
4848
int32 splinePointsCount = this->Polygon->GetNumberOfSplinePoints();
4949

5050
if (splinePointsCount < 3) {
51-
return CartographicPolygon({});
51+
return CartographicPolygon(std::vector<glm::dvec2>{});
5252
}
5353

5454
std::vector<glm::dvec2> polygon(splinePointsCount);

Source/CesiumRuntime/Private/CesiumITwinAPIBlueprintLibrary.cpp

Lines changed: 136 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,24 @@
22
#include "Async/Async.h"
33
#include "CesiumITwinCesiumCuratedContentRasterOverlay.h"
44
#include "CesiumRuntime.h"
5+
#include <CesiumUtility/ErrorList.h>
56
#include <CesiumUtility/Result.h>
67

8+
namespace {
9+
TArray<FString> errorListToArray(const CesiumUtility::ErrorList& errors) {
10+
TArray<FString> Errors;
11+
for (const std::string& error : errors.errors) {
12+
Errors.Emplace(UTF8_TO_TCHAR(error.c_str()));
13+
}
14+
15+
for (const std::string& warning : errors.warnings) {
16+
Errors.Emplace(UTF8_TO_TCHAR(warning.c_str()));
17+
}
18+
19+
return Errors;
20+
}
21+
} // namespace
22+
723
UCesiumITwinAPIAuthorizeAsyncAction*
824
UCesiumITwinAPIAuthorizeAsyncAction::Authorize(const FString& ClientID) {
925
UCesiumITwinAPIAuthorizeAsyncAction* pAsyncAction =
@@ -40,20 +56,11 @@ void UCesiumITwinAPIAuthorizeAsyncAction::Activate() {
4056
}
4157

4258
if (!connection.value) {
43-
TArray<FString> Errors;
44-
for (const std::string& error : connection.errors.errors) {
45-
Errors.Emplace(UTF8_TO_TCHAR(error.c_str()));
46-
}
47-
48-
for (const std::string& warning : connection.errors.warnings) {
49-
Errors.Emplace(UTF8_TO_TCHAR(warning.c_str()));
50-
}
51-
5259
this->OnAuthorizationEvent.Broadcast(
5360
ECesiumITwinAuthorizationDelegateType::Failure,
5461
FString(),
5562
nullptr,
56-
Errors);
63+
errorListToArray(connection.errors));
5764
} else {
5865
TSharedPtr<CesiumITwinClient::Connection> pInternalConnection =
5966
MakeShared<CesiumITwinClient::Connection>(
@@ -96,25 +103,133 @@ void UCesiumITwinAPIGetProfileAsyncAction::Activate() {
96103
LogCesium,
97104
Warning,
98105
TEXT(
99-
"Authorization finished but authorize async action is no longer valid."));
106+
"Get profile finished but get profile async action is no longer valid."));
100107
return;
101108
}
102109

103110
if (!result.value) {
104-
TArray<FString> Errors;
105-
for (const std::string& error : result.errors.errors) {
106-
Errors.Emplace(UTF8_TO_TCHAR(error.c_str()));
107-
}
108-
109-
for (const std::string& warning : result.errors.warnings) {
110-
Errors.Emplace(UTF8_TO_TCHAR(warning.c_str()));
111-
}
112-
113-
OnProfileResult.Broadcast(nullptr, Errors);
111+
OnProfileResult.Broadcast(nullptr, errorListToArray(result.errors));
114112
} else {
115113
UCesiumITwinUserProfile* pProfile = NewObject<UCesiumITwinUserProfile>();
116114
pProfile->SetProfile(std::move(*result.value));
117115
OnProfileResult.Broadcast(pProfile, TArray<FString>());
118116
}
119117
});
120118
}
119+
120+
const int PageSize = 50;
121+
122+
UCesiumITwinAPIGetITwinsAsyncAction*
123+
UCesiumITwinAPIGetITwinsAsyncAction::GetITwins(
124+
UCesiumITwinConnection* pConnection,
125+
int Page) {
126+
UCesiumITwinAPIGetITwinsAsyncAction* pAsyncAction =
127+
NewObject<UCesiumITwinAPIGetITwinsAsyncAction>();
128+
pAsyncAction->pConnection = pConnection->pConnection;
129+
pAsyncAction->page = FMath::Max(Page, 1);
130+
return pAsyncAction;
131+
}
132+
133+
void UCesiumITwinAPIGetITwinsAsyncAction::Activate() {
134+
if (!this->pConnection) {
135+
TArray<FString> Errors;
136+
Errors.Push("No connection to iTwin.");
137+
OnITwinsResult.Broadcast(TArray<UCesiumITwin*>(), false, Errors);
138+
return;
139+
}
140+
141+
CesiumITwinClient::QueryParameters params;
142+
params.top = PageSize;
143+
params.skip = PageSize * (this->page - 1);
144+
145+
this->pConnection->itwins(params).thenInMainThread(
146+
[this](CesiumUtility::Result<
147+
CesiumITwinClient::PagedList<CesiumITwinClient::ITwin>>&& result) {
148+
if (!IsValid(this)) {
149+
UE_LOG(
150+
LogCesium,
151+
Warning,
152+
TEXT(
153+
"Get itwins finished but get itwins async action is no longer valid."));
154+
return;
155+
}
156+
157+
if (!result.value) {
158+
OnITwinsResult.Broadcast(
159+
TArray<UCesiumITwin*>(),
160+
false,
161+
errorListToArray(result.errors));
162+
} else {
163+
TArray<UCesiumITwin*> iTwins;
164+
iTwins.Reserve(result.value->size());
165+
for (CesiumITwinClient::ITwin& iTwin : *result.value) {
166+
UCesiumITwin* pITwin = NewObject<UCesiumITwin>();
167+
pITwin->SetITwin(MoveTemp(iTwin));
168+
iTwins.Emplace(pITwin);
169+
}
170+
OnITwinsResult.Broadcast(
171+
iTwins,
172+
result.value->hasNextUrl(),
173+
TArray<FString>());
174+
}
175+
});
176+
}
177+
178+
UCesiumITwinAPIGetIModelsAsyncAction*
179+
UCesiumITwinAPIGetIModelsAsyncAction::GetIModels(
180+
UCesiumITwinConnection* pConnection,
181+
const FString& iTwinId,
182+
int Page) {
183+
UCesiumITwinAPIGetIModelsAsyncAction* pAsyncAction =
184+
NewObject<UCesiumITwinAPIGetIModelsAsyncAction>();
185+
pAsyncAction->pConnection = pConnection->pConnection;
186+
pAsyncAction->page = FMath::Max(Page, 1);
187+
pAsyncAction->iTwinId = iTwinId;
188+
return pAsyncAction;
189+
}
190+
191+
void UCesiumITwinAPIGetIModelsAsyncAction::Activate() {
192+
if (!this->pConnection) {
193+
TArray<FString> Errors;
194+
Errors.Push("No connection to iTwin.");
195+
OnIModelsResult.Broadcast(TArray<UCesiumIModel*>(), false, Errors);
196+
return;
197+
}
198+
199+
CesiumITwinClient::QueryParameters params;
200+
params.top = PageSize;
201+
params.skip = PageSize * (this->page - 1);
202+
203+
this->pConnection->imodels(TCHAR_TO_UTF8(*this->iTwinId), params)
204+
.thenInMainThread([this](
205+
CesiumUtility::Result<CesiumITwinClient::PagedList<
206+
CesiumITwinClient::IModel>>&& result) {
207+
if (!IsValid(this)) {
208+
UE_LOG(
209+
LogCesium,
210+
Warning,
211+
TEXT(
212+
"Get itwins finished but get itwins async action is no longer valid."));
213+
return;
214+
}
215+
216+
if (!result.value) {
217+
OnIModelsResult.Broadcast(
218+
TArray<UCesiumIModel*>(),
219+
false,
220+
errorListToArray(result.errors));
221+
} else {
222+
TArray<UCesiumIModel*> iModels;
223+
iModels.Reserve(result.value->size());
224+
for (CesiumITwinClient::IModel& iModel : *result.value) {
225+
UCesiumIModel* pIModel = NewObject<UCesiumIModel>();
226+
pIModel->SetIModel(MoveTemp(iModel));
227+
iModels.Emplace(pIModel);
228+
}
229+
OnIModelsResult.Broadcast(
230+
iModels,
231+
result.value->hasNextUrl(),
232+
TArray<FString>());
233+
}
234+
});
235+
}

Source/CesiumRuntime/Public/Cesium3DTileset.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1165,9 +1165,7 @@ class CESIUMRUNTIME_API ACesium3DTileset : public AActor {
11651165
void SetITwinID(const FString& InITwinID);
11661166

11671167
UFUNCTION(BlueprintGetter, Category = "Cesium")
1168-
UCesiumITwinConnection* GetITwinAccessToken() const {
1169-
return ITwinConnection;
1170-
}
1168+
UCesiumITwinConnection* GetITwinConnection() const { return ITwinConnection; }
11711169

11721170
UFUNCTION(BlueprintSetter, Category = "Cesium")
11731171
void SetITwinConnection(UCesiumITwinConnection* InAccessToken);

0 commit comments

Comments
 (0)