From fa7c187fb09787e70db8c5be10217544012fe14e Mon Sep 17 00:00:00 2001 From: Aaron Samaniego Date: Mon, 19 Feb 2024 09:35:28 +0100 Subject: [PATCH 1/7] Add initial code for commandlet --- .../SetProperPositionForWorldPartition.cpp | 97 +++++++++++++++++++ .../SetProperPositionForWorldPartition.h | 46 +++++++++ 2 files changed, 143 insertions(+) create mode 100644 Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp create mode 100644 Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartition.h diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp new file mode 100644 index 000000000..46b812ae6 --- /dev/null +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp @@ -0,0 +1,97 @@ +// Copyright (c) 2024 Computer Vision Center (CVC) at the Universitat Autonoma +// de Barcelona (UAB). +// +// This work is licensed under the terms of the MIT license. +// For a copy, see . + +#include "Commandlet/SetProperPositionForWorldPartition.h" + +#if WITH_EDITOR +#include "FileHelpers.h" +#endif +#include "UObject/ConstructorHelpers.h" +#include "EditorLevelLibrary.h" + +DEFINE_LOG_CATEGORY(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet); + + +USetProperPositionForWorldPartition::USetProperPositionForWorldPartition() +{ +#if WITH_EDITOR + ConstructorHelpers::FClassFinder OpenDrivelassFinder(TEXT("/CarlaTools/OnroadMapGenerator/BP_OpenDriveToMap")); + OpenDriveClass = OpenDrivelassFinder.Class; +#endif +} + +USetProperPositionForWorldPartition::USetProperPositionForWorldPartition(const FObjectInitializer& Initializer) + : Super(Initializer) +{ +#if WITH_EDITOR + ConstructorHelpers::FClassFinder OpenDrivelassFinder(TEXT("/CarlaTools/OnroadMapGenerator/BP_OpenDriveToMap")); + OpenDriveClass = OpenDrivelassFinder.Class; +#endif +} + +#if WITH_EDITORONLY_DATA + +int32 USetProperPositionForWorldPartition::Main(const FString &Params) +{ + UE_LOG(LogCarlaToolsMapGenerateTileCommandlet, Log, TEXT("UGenerateTileCommandlet::Main Arguments %s"), *Params); + TArray Tokens; + TArray Switches; + TMap ParamsMap; + + ParseCommandLine(*Params, Tokens, Switches, ParamsMap ); + + OpenDriveMap = NewObject(this, OpenDriveClass); + FString FilePath = ParamsMap["FilePath"]; + FString BaseLevelName = ParamsMap["BaseLevelName"]; + FIntVector CurrentTilesInXY = FIntVector(FCString::Atof(*ParamsMap["CTileX"]),FCString::Atof(*ParamsMap["CTileY"]), 0); + + UEditorLevelLibrary::LoadLevel(*BaseLevelName); + UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Valid Map loaded")); + UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("MapName %s"), *MapName); + + AActor* QueryActor = UGameplayStatics::GetActorOfClass( + GEditor->GetEditorWorldContext().World(), + ALargeMapManager::StaticClass()); + if (QueryActor != nullptr) { + ALargeMapManager* LmManager = Cast(QueryActor); + NumTilesInXY = LmManager->GetNumTilesInXY(); + TileSize = LmManager->GetTileSize(); + Tile0Offset = LmManager->GetTile0Offset(); + + FCarlaMapTile& CarlaTile = LmManager->GetCarlaMapTile(CurrentTilesInXY); + UEditorLevelLibrary::SaveCurrentLevel(); + + UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Current Tile is %s"), *(CurrentTilesInXY.ToString())); + UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("NumTilesInXY is %s"), *(NumTilesInXY.ToString())); + UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("TileSize is %f"), (TileSize)); + UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Tile0Offset is %s"), *(Tile0Offset.ToString())); + UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Tile Name is %s"), *(CarlaTile.Name)); + + UEditorLevelLibrary::LoadLevel(CarlaTile.Name); + + MinPosition = FVector(CurrentTilesInXY.X * TileSize, CurrentTilesInXY.Y * -TileSize, 0.0f); + MaxPosition = FVector((CurrentTilesInXY.X + 1.0f) * TileSize, (CurrentTilesInXY.Y + 1.0f) * -TileSize, 0.0f); + + + TArray FoundActors; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActor::StaticClass(), FoundActors); + + for (AActor* CA : FoundActors) + { + CA->AddActorWorldOffset(MinPosition, false, nullptr, ETeleportType::ResetPhysics); + } + } + else { + UE_LOG(LogCarlaToolsMapGenerator, Error, TEXT("Largemapmanager not found ")); + } + + UEditorLoadingAndSavingUtils::SaveDirtyPackages(true, true); + UEditorLevelLibrary::SaveCurrentLevel(); + + return 0; +} + +#endif diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartition.h b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartition.h new file mode 100644 index 000000000..74c550d3f --- /dev/null +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartition.h @@ -0,0 +1,46 @@ +// Copyright (c) 2024 Computer Vision Center (CVC) at the Universitat Autonoma +// de Barcelona (UAB). +// +// This work is licensed under the terms of the MIT license. +// For a copy, see . + +#pragma once + +#include "Runtime/Engine/Classes/Engine/ObjectLibrary.h" +#include "Commandlets/Commandlet.h" + +#include + +#include + +#include "OpenDriveToMap.h" + +#include "SetProperPositionForWorldPartition.generated.h" + +// Each commandlet should generate only 1 Tile + +DECLARE_LOG_CATEGORY_EXTERN(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Log, All); + + +UCLASS() +class CARLATOOLS_API USetProperPositionForWorldPartition + : public UCommandlet +{ + GENERATED_BODY() + +public: + + /// Default constructor. + USetProperPositionForWorldPartition(); + USetProperPositionForWorldPartition(const FObjectInitializer &); + +#if WITH_EDITORONLY_DATA + + virtual int32 Main(const FString &Params) override; + +#endif // WITH_EDITORONLY_DATA + UPROPERTY() + UOpenDriveToMap* OpenDriveMap; + UPROPERTY() + UClass* OpenDriveClass; +}; From b3fc04064dd0ba421db3d635a3e7b57e8097ddbc Mon Sep 17 00:00:00 2001 From: JoseMartinez <44341347+JoseM98@users.noreply.github.com> Date: Mon, 19 Feb 2024 15:45:12 +0100 Subject: [PATCH 2/7] Updating commandlet file for world partition. --- ...set_proper_position_for_world_partition.py | 43 ++++++++ .../SetProperPositionForWorldPartition.cpp | 97 ------------------- ...perPositionForWorldPartitionCommandlet.cpp | 88 +++++++++++++++++ ...operPositionForWorldPartitionCommandlet.h} | 12 +-- 4 files changed, 135 insertions(+), 105 deletions(-) create mode 100644 Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py delete mode 100644 Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp create mode 100644 Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp rename Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/{SetProperPositionForWorldPartition.h => SetProperPositionForWorldPartitionCommandlet.h} (72%) diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py new file mode 100644 index 000000000..5fdc1f54a --- /dev/null +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +import unreal +import argparse +import json +import os +import subprocess + + +"""Generic function for running a commandlet with its arguments.""" +ue4_path = os.environ["UE4_ROOT"] +uproject_path = unreal.Paths.project_dir() + ("CarlaUE4.uproject") +run = "-run=%s" % ("SetProperPositionForWorldPartitionCommandlet") + +print("Before any Commandlet:") + +argparser = argparse.ArgumentParser() + +argparser.add_argument( + '-s', '--paramstring', + metavar='S', + default='', + type=str, + help='String to put as arguments') +args = argparser.parse_args() + +arguments = args.paramstring + +if os.name == "nt": + sys_name = "Win64" + editor_path = "%s/Engine/Binaries/%s/UnrealEditor" % (ue4_path, sys_name) + command = [editor_path, uproject_path, run] + command.extend(arguments) + print("Commandlet:", command) + print("Arguments:", arguments) + subprocess.check_call(command, shell=True) +elif os.name == "posix": + sys_name = "Linux" + editor_path = "%s/Engine/Binaries/%s/UnrealEditor" % (ue4_path, sys_name) + full_command = editor_path + " " + uproject_path + " " + run + " " + arguments + print("Commandlet:", full_command) + print("Arguments:", arguments) + subprocess.call([full_command], shell=True) + diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp deleted file mode 100644 index 46b812ae6..000000000 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartition.cpp +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright (c) 2024 Computer Vision Center (CVC) at the Universitat Autonoma -// de Barcelona (UAB). -// -// This work is licensed under the terms of the MIT license. -// For a copy, see . - -#include "Commandlet/SetProperPositionForWorldPartition.h" - -#if WITH_EDITOR -#include "FileHelpers.h" -#endif -#include "UObject/ConstructorHelpers.h" -#include "EditorLevelLibrary.h" - -DEFINE_LOG_CATEGORY(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet); - - -USetProperPositionForWorldPartition::USetProperPositionForWorldPartition() -{ -#if WITH_EDITOR - ConstructorHelpers::FClassFinder OpenDrivelassFinder(TEXT("/CarlaTools/OnroadMapGenerator/BP_OpenDriveToMap")); - OpenDriveClass = OpenDrivelassFinder.Class; -#endif -} - -USetProperPositionForWorldPartition::USetProperPositionForWorldPartition(const FObjectInitializer& Initializer) - : Super(Initializer) -{ -#if WITH_EDITOR - ConstructorHelpers::FClassFinder OpenDrivelassFinder(TEXT("/CarlaTools/OnroadMapGenerator/BP_OpenDriveToMap")); - OpenDriveClass = OpenDrivelassFinder.Class; -#endif -} - -#if WITH_EDITORONLY_DATA - -int32 USetProperPositionForWorldPartition::Main(const FString &Params) -{ - UE_LOG(LogCarlaToolsMapGenerateTileCommandlet, Log, TEXT("UGenerateTileCommandlet::Main Arguments %s"), *Params); - TArray Tokens; - TArray Switches; - TMap ParamsMap; - - ParseCommandLine(*Params, Tokens, Switches, ParamsMap ); - - OpenDriveMap = NewObject(this, OpenDriveClass); - FString FilePath = ParamsMap["FilePath"]; - FString BaseLevelName = ParamsMap["BaseLevelName"]; - FIntVector CurrentTilesInXY = FIntVector(FCString::Atof(*ParamsMap["CTileX"]),FCString::Atof(*ParamsMap["CTileY"]), 0); - - UEditorLevelLibrary::LoadLevel(*BaseLevelName); - UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Valid Map loaded")); - UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("MapName %s"), *MapName); - - AActor* QueryActor = UGameplayStatics::GetActorOfClass( - GEditor->GetEditorWorldContext().World(), - ALargeMapManager::StaticClass()); - if (QueryActor != nullptr) { - ALargeMapManager* LmManager = Cast(QueryActor); - NumTilesInXY = LmManager->GetNumTilesInXY(); - TileSize = LmManager->GetTileSize(); - Tile0Offset = LmManager->GetTile0Offset(); - - FCarlaMapTile& CarlaTile = LmManager->GetCarlaMapTile(CurrentTilesInXY); - UEditorLevelLibrary::SaveCurrentLevel(); - - UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Current Tile is %s"), *(CurrentTilesInXY.ToString())); - UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("NumTilesInXY is %s"), *(NumTilesInXY.ToString())); - UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("TileSize is %f"), (TileSize)); - UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Tile0Offset is %s"), *(Tile0Offset.ToString())); - UE_LOG(LogCarlaToolsMapGenerator, Warning, TEXT("Tile Name is %s"), *(CarlaTile.Name)); - - UEditorLevelLibrary::LoadLevel(CarlaTile.Name); - - MinPosition = FVector(CurrentTilesInXY.X * TileSize, CurrentTilesInXY.Y * -TileSize, 0.0f); - MaxPosition = FVector((CurrentTilesInXY.X + 1.0f) * TileSize, (CurrentTilesInXY.Y + 1.0f) * -TileSize, 0.0f); - - - TArray FoundActors; - UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActor::StaticClass(), FoundActors); - - for (AActor* CA : FoundActors) - { - CA->AddActorWorldOffset(MinPosition, false, nullptr, ETeleportType::ResetPhysics); - } - } - else { - UE_LOG(LogCarlaToolsMapGenerator, Error, TEXT("Largemapmanager not found ")); - } - - UEditorLoadingAndSavingUtils::SaveDirtyPackages(true, true); - UEditorLevelLibrary::SaveCurrentLevel(); - - return 0; -} - -#endif diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp new file mode 100644 index 000000000..0a771190f --- /dev/null +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp @@ -0,0 +1,88 @@ +// Copyright (c) 2024 Computer Vision Center (CVC) at the Universitat Autonoma +// de Barcelona (UAB). +// +// This work is licensed under the terms of the MIT license. +// For a copy, see . + +#include "Commandlet/SetProperPositionForWorldPartitionCommandlet.h" + +#if WITH_EDITOR +#include "FileHelpers.h" +#endif +#include "UObject/ConstructorHelpers.h" +#include "EditorLevelLibrary.h" +#include "MapGen/LargeMapManager.h" + +DEFINE_LOG_CATEGORY(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet); + + +USetProperPositionForWorldPartitionCommandlet::USetProperPositionForWorldPartitionCommandlet() +{ + +} + +USetProperPositionForWorldPartitionCommandlet::USetProperPositionForWorldPartitionCommandlet(const FObjectInitializer& Initializer) + : Super(Initializer) +{ + +} + +#if WITH_EDITORONLY_DATA + +int32 USetProperPositionForWorldPartitionCommandlet::Main(const FString &Params) +{ + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Log, TEXT("USetProperPositionForWorldPartition::Main Arguments %s"), *Params); + TArray Tokens; + TArray Switches; + TMap ParamsMap; + + ParseCommandLine(*Params, Tokens, Switches, ParamsMap ); + + FString BaseLevelName = ParamsMap["BaseLevelName"]; + FIntVector CurrentTilesInXY = FIntVector(FCString::Atof(*ParamsMap["CTileX"]),FCString::Atof(*ParamsMap["CTileY"]), 0); + + UEditorLevelLibrary::LoadLevel(*BaseLevelName); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Valid Map loaded")); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("MapName %s"), *BaseLevelName); + + AActor* QueryActor = UGameplayStatics::GetActorOfClass( GEditor->GetEditorWorldContext().World(), ALargeMapManager::StaticClass()); + if (QueryActor != nullptr) { + ALargeMapManager* LmManager = Cast(QueryActor); + FIntVector NumTilesInXY = LmManager->GetNumTilesInXY(); + float TileSize = LmManager->GetTileSize(); + FVector Tile0Offset = LmManager->GetTile0Offset(); + + FCarlaMapTile& CarlaTile = LmManager->GetCarlaMapTile(CurrentTilesInXY); + UEditorLevelLibrary::SaveCurrentLevel(); + + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Current Tile is %s"), *(CurrentTilesInXY.ToString())); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("NumTilesInXY is %s"), *(NumTilesInXY.ToString())); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("TileSize is %f"), (TileSize)); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Tile0Offset is %s"), *(Tile0Offset.ToString())); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Tile Name is %s"), *(CarlaTile.Name)); + + UEditorLevelLibrary::LoadLevel(CarlaTile.Name); + + FVector MinPosition = FVector(CurrentTilesInXY.X * TileSize, CurrentTilesInXY.Y * -TileSize, 0.0f); + FVector MaxPosition = FVector((CurrentTilesInXY.X + 1.0f) * TileSize, (CurrentTilesInXY.Y + 1.0f) * -TileSize, 0.0f); + + + TArray FoundActors; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActor::StaticClass(), FoundActors); + + for (AActor* CA : FoundActors) + { + CA->AddActorWorldOffset(MinPosition, false, nullptr, ETeleportType::ResetPhysics); + } + } + else { + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Error, TEXT("Largemapmanager not found ")); + } + + UEditorLoadingAndSavingUtils::SaveDirtyPackages(true, true); + UEditorLevelLibrary::SaveCurrentLevel(); + + return 0; +} + +#endif diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartition.h b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartitionCommandlet.h similarity index 72% rename from Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartition.h rename to Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartitionCommandlet.h index 74c550d3f..11c9305d8 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartition.h +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartitionCommandlet.h @@ -15,7 +15,7 @@ #include "OpenDriveToMap.h" -#include "SetProperPositionForWorldPartition.generated.h" +#include "SetProperPositionForWorldPartitionCommandlet.generated.h" // Each commandlet should generate only 1 Tile @@ -23,7 +23,7 @@ DECLARE_LOG_CATEGORY_EXTERN(LogCarlaToolsMapSetProperPositionForWorldPartitionCo UCLASS() -class CARLATOOLS_API USetProperPositionForWorldPartition +class CARLATOOLS_API USetProperPositionForWorldPartitionCommandlet : public UCommandlet { GENERATED_BODY() @@ -31,16 +31,12 @@ class CARLATOOLS_API USetProperPositionForWorldPartition public: /// Default constructor. - USetProperPositionForWorldPartition(); - USetProperPositionForWorldPartition(const FObjectInitializer &); + USetProperPositionForWorldPartitionCommandlet(); + USetProperPositionForWorldPartitionCommandlet(const FObjectInitializer &); #if WITH_EDITORONLY_DATA virtual int32 Main(const FString &Params) override; #endif // WITH_EDITORONLY_DATA - UPROPERTY() - UOpenDriveToMap* OpenDriveMap; - UPROPERTY() - UClass* OpenDriveClass; }; From dd5bffe8d7ba598bf5c86cd54637718c740c7a7c Mon Sep 17 00:00:00 2001 From: JoseMartinez <44341347+JoseM98@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:34:48 +0100 Subject: [PATCH 3/7] Fixing commandlet argument values. --- .../Python/set_proper_position_for_world_partition.py | 4 ++-- .../SetProperPositionForWorldPartitionCommandlet.cpp | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py index 5fdc1f54a..8472d474f 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py @@ -23,13 +23,13 @@ argparser.add_argument( help='String to put as arguments') args = argparser.parse_args() -arguments = args.paramstring +arguments = args.paramstring.split() if os.name == "nt": sys_name = "Win64" editor_path = "%s/Engine/Binaries/%s/UnrealEditor" % (ue4_path, sys_name) command = [editor_path, uproject_path, run] - command.extend(arguments) + command = command + arguments print("Commandlet:", command) print("Arguments:", arguments) subprocess.check_call(command, shell=True) diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp index 0a771190f..0fd29c4be 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp @@ -6,6 +6,9 @@ #include "Commandlet/SetProperPositionForWorldPartitionCommandlet.h" +#include +#include + #if WITH_EDITOR #include "FileHelpers.h" #endif @@ -79,7 +82,7 @@ int32 USetProperPositionForWorldPartitionCommandlet::Main(const FString &Params) UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Error, TEXT("Largemapmanager not found ")); } - UEditorLoadingAndSavingUtils::SaveDirtyPackages(true, true); + //UEditorLoadingAndSavingUtils::SaveDirtyPackages(true, true); UEditorLevelLibrary::SaveCurrentLevel(); return 0; From 2566839481b6930b9902486707d284e90e1548cf Mon Sep 17 00:00:00 2001 From: JoseMartinez <44341347+JoseM98@users.noreply.github.com> Date: Mon, 19 Feb 2024 16:43:38 +0100 Subject: [PATCH 4/7] Fix an issue getting the Worlf on the commandlet. --- .../Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp index 0fd29c4be..3462197ba 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp @@ -71,7 +71,7 @@ int32 USetProperPositionForWorldPartitionCommandlet::Main(const FString &Params) TArray FoundActors; - UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActor::StaticClass(), FoundActors); + UGameplayStatics::GetAllActorsOfClass(GEditor->GetEditorWorldContext().World(), AActor::StaticClass(), FoundActors); for (AActor* CA : FoundActors) { From 5011f248daafb04a397df00083194c76e316f240 Mon Sep 17 00:00:00 2001 From: JoseMartinez <44341347+JoseM98@users.noreply.github.com> Date: Mon, 19 Feb 2024 18:47:27 +0100 Subject: [PATCH 5/7] Commandlet iterates over all tiles of the map. --- ...perPositionForWorldPartitionCommandlet.cpp | 71 ++++++++++++------- ...roperPositionForWorldPartitionCommandlet.h | 2 + 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp index 3462197ba..d56b4f82e 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp @@ -16,6 +16,8 @@ #include "EditorLevelLibrary.h" #include "MapGen/LargeMapManager.h" + + DEFINE_LOG_CATEGORY(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet); @@ -42,41 +44,33 @@ int32 USetProperPositionForWorldPartitionCommandlet::Main(const FString &Params) ParseCommandLine(*Params, Tokens, Switches, ParamsMap ); FString BaseLevelName = ParamsMap["BaseLevelName"]; - FIntVector CurrentTilesInXY = FIntVector(FCString::Atof(*ParamsMap["CTileX"]),FCString::Atof(*ParamsMap["CTileY"]), 0); - UEditorLevelLibrary::LoadLevel(*BaseLevelName); - UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Valid Map loaded")); - UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("MapName %s"), *BaseLevelName); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Valid Map loaded, MapName %s"), *BaseLevelName); AActor* QueryActor = UGameplayStatics::GetActorOfClass( GEditor->GetEditorWorldContext().World(), ALargeMapManager::StaticClass()); if (QueryActor != nullptr) { ALargeMapManager* LmManager = Cast(QueryActor); - FIntVector NumTilesInXY = LmManager->GetNumTilesInXY(); - float TileSize = LmManager->GetTileSize(); - FVector Tile0Offset = LmManager->GetTile0Offset(); - - FCarlaMapTile& CarlaTile = LmManager->GetCarlaMapTile(CurrentTilesInXY); - UEditorLevelLibrary::SaveCurrentLevel(); - - UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Current Tile is %s"), *(CurrentTilesInXY.ToString())); + + const FIntVector NumTilesInXY = LmManager->GetNumTilesInXY(); + const float TileSize = LmManager->GetTileSize(); UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("NumTilesInXY is %s"), *(NumTilesInXY.ToString())); UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("TileSize is %f"), (TileSize)); - UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Tile0Offset is %s"), *(Tile0Offset.ToString())); - UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Tile Name is %s"), *(CarlaTile.Name)); - - UEditorLevelLibrary::LoadLevel(CarlaTile.Name); - - FVector MinPosition = FVector(CurrentTilesInXY.X * TileSize, CurrentTilesInXY.Y * -TileSize, 0.0f); - FVector MaxPosition = FVector((CurrentTilesInXY.X + 1.0f) * TileSize, (CurrentTilesInXY.Y + 1.0f) * -TileSize, 0.0f); - - - TArray FoundActors; - UGameplayStatics::GetAllActorsOfClass(GEditor->GetEditorWorldContext().World(), AActor::StaticClass(), FoundActors); - - for (AActor* CA : FoundActors) + + UEditorLevelLibrary::SaveCurrentLevel(); + + for(int TileX = 0; TileX < NumTilesInXY.X; TileX++) { - CA->AddActorWorldOffset(MinPosition, false, nullptr, ETeleportType::ResetPhysics); + for(int TileY = 0; TileY < NumTilesInXY.Y; TileY++) + { + if(TileX != 0 || TileY != 0) + { + UEditorLevelLibrary::LoadLevel(*BaseLevelName); + UEditorLevelLibrary::SaveCurrentLevel(); + ProcessTile(FIntVector(TileX, TileY, 0), TileSize); + } + } } + } else { UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Error, TEXT("Largemapmanager not found ")); @@ -88,4 +82,29 @@ int32 USetProperPositionForWorldPartitionCommandlet::Main(const FString &Params) return 0; } +void USetProperPositionForWorldPartitionCommandlet::ProcessTile(const FIntVector CurrentTilesInXY, const float TileSize) +{ + AActor* QueryActor = UGameplayStatics::GetActorOfClass( GEditor->GetEditorWorldContext().World(), ALargeMapManager::StaticClass()); + if (QueryActor != nullptr) + { + ALargeMapManager* LmManager = Cast(QueryActor); + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Current Tile is %s"), *(CurrentTilesInXY.ToString())); + const FCarlaMapTile& CarlaTile = LmManager->GetCarlaMapTile(CurrentTilesInXY); + + UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Tile Name is %s"), *(CarlaTile.Name)); + UEditorLevelLibrary::LoadLevel(CarlaTile.Name); + + const FVector MinPosition = FVector(CurrentTilesInXY.X * TileSize, CurrentTilesInXY.Y * -TileSize, 0.0f); + + TArray FoundActors; + UGameplayStatics::GetAllActorsOfClass(GEditor->GetEditorWorldContext().World(), AActor::StaticClass(), FoundActors); + for (AActor* CA : FoundActors) + { + CA->AddActorWorldOffset(MinPosition, false, nullptr, ETeleportType::ResetPhysics); + } + + UEditorLevelLibrary::SaveCurrentLevel(); + } +} + #endif diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartitionCommandlet.h b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartitionCommandlet.h index 11c9305d8..3c7055c36 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartitionCommandlet.h +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Public/Commandlet/SetProperPositionForWorldPartitionCommandlet.h @@ -38,5 +38,7 @@ public: virtual int32 Main(const FString &Params) override; + void ProcessTile(const FIntVector CurrentTilesInXY, const float TileSize); + #endif // WITH_EDITORONLY_DATA }; From 286e7afd157eb29786cc42b3e2cec27c4f7cca9d Mon Sep 17 00:00:00 2001 From: JoseMartinez <44341347+JoseM98@users.noreply.github.com> Date: Mon, 19 Feb 2024 18:52:05 +0100 Subject: [PATCH 6/7] Adding WidgetEditorUtility uasset for running commandlet script. --- ...BP_SetProperPositionForWorldPartition.uasset | Bin 0 -> 81726 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Unreal/CarlaUE4/Plugins/CarlaTools/Content/LevelWorldPartition/WBP_SetProperPositionForWorldPartition.uasset diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/LevelWorldPartition/WBP_SetProperPositionForWorldPartition.uasset b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/LevelWorldPartition/WBP_SetProperPositionForWorldPartition.uasset new file mode 100644 index 0000000000000000000000000000000000000000..b7af3fbe1853873afd558c50a63ffbb33e4315bd GIT binary patch literal 81726 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 NJ^sMROa(;!{{w1lX^H>< literal 0 HcmV?d00001 From 79555a7c5d7334d441a4050d477a392ac13864e5 Mon Sep 17 00:00:00 2001 From: Aaron Samaniego Date: Mon, 26 Feb 2024 10:20:04 +0100 Subject: [PATCH 7/7] Fix loop being in commandlet, loop on tiles should be out of them --- ..._SetProperPositionForWorldPartition.uasset | Bin 81726 -> 75399 bytes ...set_proper_position_for_world_partition.py | 2 +- ...perPositionForWorldPartitionCommandlet.cpp | 18 ++++-------------- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/LevelWorldPartition/WBP_SetProperPositionForWorldPartition.uasset b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/LevelWorldPartition/WBP_SetProperPositionForWorldPartition.uasset index b7af3fbe1853873afd558c50a63ffbb33e4315bd..739445eba4e89c69f577a49563fe57ef75525504 100644 GIT binary patch literal 75399 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 NJ^sMROa(;!{{w1lX^H>< diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py index 8472d474f..00c8918ff 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Content/Python/set_proper_position_for_world_partition.py @@ -7,7 +7,7 @@ import subprocess """Generic function for running a commandlet with its arguments.""" -ue4_path = os.environ["UE4_ROOT"] +ue4_path = os.environ["UE5_ROOT"] uproject_path = unreal.Paths.project_dir() + ("CarlaUE4.uproject") run = "-run=%s" % ("SetProperPositionForWorldPartitionCommandlet") diff --git a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp index d56b4f82e..1d3e20df9 100644 --- a/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp +++ b/Unreal/CarlaUE4/Plugins/CarlaTools/Source/CarlaTools/Private/Commandlet/SetProperPositionForWorldPartitionCommandlet.cpp @@ -44,8 +44,8 @@ int32 USetProperPositionForWorldPartitionCommandlet::Main(const FString &Params) ParseCommandLine(*Params, Tokens, Switches, ParamsMap ); FString BaseLevelName = ParamsMap["BaseLevelName"]; + FIntVector CurrentTilesInXY = FIntVector(FCString::Atof(*ParamsMap["CTileX"]), FCString::Atof(*ParamsMap["CTileY"]), 0); UEditorLevelLibrary::LoadLevel(*BaseLevelName); - UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Warning, TEXT("Valid Map loaded, MapName %s"), *BaseLevelName); AActor* QueryActor = UGameplayStatics::GetActorOfClass( GEditor->GetEditorWorldContext().World(), ALargeMapManager::StaticClass()); if (QueryActor != nullptr) { @@ -58,19 +58,9 @@ int32 USetProperPositionForWorldPartitionCommandlet::Main(const FString &Params) UEditorLevelLibrary::SaveCurrentLevel(); - for(int TileX = 0; TileX < NumTilesInXY.X; TileX++) - { - for(int TileY = 0; TileY < NumTilesInXY.Y; TileY++) - { - if(TileX != 0 || TileY != 0) - { - UEditorLevelLibrary::LoadLevel(*BaseLevelName); - UEditorLevelLibrary::SaveCurrentLevel(); - ProcessTile(FIntVector(TileX, TileY, 0), TileSize); - } - } - } - + UEditorLevelLibrary::LoadLevel(*BaseLevelName); + ProcessTile(FIntVector(CurrentTilesInXY.X, CurrentTilesInXY.Y, 0), TileSize); + UEditorLevelLibrary::SaveCurrentLevel(); } else { UE_LOG(LogCarlaToolsMapSetProperPositionForWorldPartitionCommandlet, Error, TEXT("Largemapmanager not found "));