You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/AutomatedTesting/Gem/PythonTests/EditorPythonBindings/EntitySearchCommands_test_c...

405 lines
14 KiB
Python

"""
Copyright (c) Contributors to the Open 3D Engine Project.
For complete copyright and license terms please see the LICENSE at the root of this distribution.
SPDX-License-Identifier: Apache-2.0 OR MIT
"""
# Tests the Entity Search Python API while the Editor is running
import azlmbr.editor as editor
import azlmbr.entity as entity
import azlmbr.bus as bus
import azlmbr.math as math
import azlmbr.components as components
# Open a level (any level should work)
editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'OpenLevelNoPrompt', 'WaterSample')
# Save Root Entities and Total Entity number
root = entity.SearchBus(bus.Broadcast, 'GetRootEditorEntities')
rootNum = len(root)
all = entity.SearchBus(bus.Broadcast, 'SearchEntities', entity.SearchFilter())
allNum = len(all)
# Create Hierarchy
#
# City
# |_ Street (2)
# |_ Car
# | |_ Passenger (1, 2)
# | |_ Passenger
# |_ Car (1)
# | |_ Passenger
# |_ SportsCar
# |_ Passenger (2)
# |_ Passenger
#
def CreateEntity(name, parentId):
newEntityId = editor.ToolsApplicationRequestBus(bus.Broadcast, 'CreateNewEntity', parentId)
editor.EditorEntityAPIBus(bus.Event, 'SetName', newEntityId, name)
testName = editor.EditorEntityInfoRequestBus(bus.Event, 'GetName', newEntityId)
if (testName != name):
print("FAILURE: testName {} does not equal set name {}".format(testName, name))
return newEntityId
# Entities
cityId = CreateEntity('City', entity.EntityId())
streetId = CreateEntity('Street', cityId)
carId1 = CreateEntity('Car', streetId)
passengerId1 = CreateEntity('Passenger', carId1)
passengerId2 = CreateEntity('Passenger', carId1)
carId2 = CreateEntity('Car', streetId)
passengerId3 = CreateEntity('Passenger', carId2)
sportsCarId = CreateEntity('SportsCar', streetId)
passengerId4 = CreateEntity('Passenger', sportsCarId)
passengerId5 = CreateEntity('Passenger', sportsCarId)
# Components
typeIdsList = editor.EditorComponentAPIBus(bus.Broadcast, 'FindComponentTypeIdsByEntityType', ["Comment", "Actor"], entity.EntityType().Game)
editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', passengerId1, [typeIdsList[0]])
editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', carId2, [typeIdsList[0]])
editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', streetId, [typeIdsList[1]])
editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', passengerId1, [typeIdsList[1]])
editor.EditorComponentAPIBus(bus.Broadcast, 'AddComponentsOfType', passengerId4, [typeIdsList[1]])
# Test the Entity Search API
def CompareEntityIds(id1, id2):
return (id1.ToString() == id2.ToString())
def SearchResultCheck(searchFilter, testName, resultId):
entities = entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter)
if(len(entities) == 1) and (CompareEntityIds(entities[0], resultId)):
print("SUCCESS: " + testName)
else:
print("FAILURE: " + testName)
def SearchResultsCheck(searchFilter, testName, resultSize):
entities = entity.SearchBus(bus.Broadcast, 'SearchEntities', searchFilter)
if(len(entities) == resultSize):
print("SUCCESS: " + testName)
else:
print("FAILURE: " + testName + " (size is " + str(len(entities)) + ", should be " + str(resultSize) + ")")
# Get Root Entities
rootEntities = entity.SearchBus(bus.Broadcast, 'GetRootEditorEntities')
if(len(rootEntities) == 1 + rootNum):
print("SUCCESS: Root Entities")
else:
print("FAILURE: Root Entities")
# Search by Name - Base
# No filters - return all entities
searchFilter1 = entity.SearchFilter()
SearchResultsCheck(searchFilter1, "No filters - return all entities", (10 + allNum))
# Filter by name - single entity
searchFilter2 = entity.SearchFilter()
searchFilter2.names = ["Street"]
SearchResultCheck(searchFilter2, "Filter by name - single entity", streetId)
# Filter by name - multiple entities
searchFilter3 = entity.SearchFilter()
searchFilter3.names = ["Passenger"]
SearchResultsCheck(searchFilter3, "Filter by name - multiple entities", 5)
# Filter by name - multiple names
searchFilter4 = entity.SearchFilter()
searchFilter4.names = ["Passenger", "Street"]
SearchResultsCheck(searchFilter4, "Filter by name - multiple names", 6)
# Search by Name - Wildcard
# Filter by name - wildcard 01
searchFilter5 = entity.SearchFilter()
searchFilter5.names = ["Str*et"]
SearchResultCheck(searchFilter5, "Filter by name - wildcard 01", streetId)
# Filter by name - wildcard 02
searchFilter6 = entity.SearchFilter()
searchFilter6.names = ["St*et"]
SearchResultCheck(searchFilter6, "Filter by name - wildcard 02", streetId)
# Filter by name - wildcard 03
searchFilter7 = entity.SearchFilter()
searchFilter7.names = ["Str?et"]
SearchResultCheck(searchFilter7, "Filter by name - wildcard 03", streetId)
# Filter by name - wildcard 04
searchFilter8 = entity.SearchFilter()
searchFilter8.names = ["Str?t"]
SearchResultsCheck(searchFilter8, "Filter by name - wildcard 04", 0)
# Filter by name - wildcard 05
searchFilter10 = entity.SearchFilter()
searchFilter10.names = ["*"]
SearchResultsCheck(searchFilter10, "Filter by name - wildcard 05", (10 + allNum))
# Search by Name - Case Sensitive
# Filter by name - case sensitive 01
searchFilter11 = entity.SearchFilter()
searchFilter11.names = ["Street"]
searchFilter11.names_case_sensitive = False # default
SearchResultCheck(searchFilter11, "Filter by name - case sensitive 01", streetId)
# Filter by name - case sensitive 02
searchFilter12 = entity.SearchFilter()
searchFilter12.names = ["street"]
searchFilter12.names_case_sensitive = False
SearchResultCheck(searchFilter12, "Filter by name - case sensitive 02", streetId)
# Filter by name - case sensitive 03
searchFilter13 = entity.SearchFilter()
searchFilter13.names = ["Street"]
searchFilter13.names_case_sensitive = True
SearchResultCheck(searchFilter13, "Filter by name - case sensitive 03", streetId)
# Filter by name - case sensitive 04
searchFilter14 = entity.SearchFilter()
searchFilter14.names = ["street"]
searchFilter14.names_case_sensitive = True # default
SearchResultsCheck(searchFilter14, "Filter by name - case sensitive 04", 0)
# Search by Path - Base
# Filter by path - base 01
searchFilter15 = entity.SearchFilter()
searchFilter15.names = ["City|Street|SportsCar"]
SearchResultCheck(searchFilter15, "Filter by path - base 01", sportsCarId)
# Filter by path - base 02
searchFilter16 = entity.SearchFilter()
searchFilter16.names = ["City|Street|Car|Passenger"]
SearchResultsCheck(searchFilter16, "Filter by path - base 02", 3)
# Search by Path - Wildcard
# Filter by path - wildcard 01
searchFilter17 = entity.SearchFilter()
searchFilter17.names = ["City|*|SportsCar"]
SearchResultCheck(searchFilter17, "Filter by path - wildcard 01", sportsCarId)
# Filter by path - wildcard 02
searchFilter18 = entity.SearchFilter()
searchFilter18.names = ["City|Street|*|Passenger"]
SearchResultsCheck(searchFilter18, "Filter by path - wildcard 02", 5)
# Filter by path - wildcard 03
searchFilter19 = entity.SearchFilter()
searchFilter19.names = ["City|Street|*Car|Passenger"]
SearchResultsCheck(searchFilter19, "Filter by path - wildcard 03", 5)
# Filter by path - wildcard 04
searchFilter20 = entity.SearchFilter()
searchFilter20.names = ["City|Street|Sport*|Passenger"]
SearchResultsCheck(searchFilter20, "Filter by path - wildcard 04", 2)
# Search by Path - Case Sensitive
# Filter by path - case sensitive 01
searchFilter21 = entity.SearchFilter()
searchFilter21.names = ["City|Street"]
searchFilter21.names_case_sensitive = False # default
SearchResultCheck(searchFilter21, "Filter by path - case sensitive 01", streetId)
# Filter by path - case sensitive 02
searchFilter22 = entity.SearchFilter()
searchFilter22.names = ["city|street"]
searchFilter22.names_case_sensitive = False # default
SearchResultCheck(searchFilter22, "Filter by path - case sensitive 02", streetId)
# Filter by path - case sensitive 03
searchFilter23 = entity.SearchFilter()
searchFilter23.names = ["City|Street"]
searchFilter23.names_case_sensitive = True
SearchResultCheck(searchFilter23, "Filter by path - case sensitive 03", streetId)
# Filter by path - case sensitive 04
searchFilter24 = entity.SearchFilter()
searchFilter24.names = ["city|street"]
searchFilter24.names_case_sensitive = True
SearchResultsCheck(searchFilter24, "Filter by path - case sensitive 04", 0)
# Search by Component - Base
# Filter by component - base 01
searchFilter25 = entity.SearchFilter()
searchFilter25.components = { typeIdsList[0]:{} }
SearchResultsCheck(searchFilter25, "Filter by component - base 01", 2)
# Filter by component - base 02
searchFilter26 = entity.SearchFilter()
searchFilter26.components = { typeIdsList[1]:{} }
SearchResultsCheck(searchFilter26, "Filter by component - base 02", 3)
# Search by Component - Multiple
# Filter by component - multiple 01
searchFilter27 = entity.SearchFilter()
searchFilter27.components = { typeIdsList[0]: {} , typeIdsList[1]: {} }
searchFilter27.components_match_all = False # default
SearchResultsCheck(searchFilter27, "Filter by component - multiple 01", 4)
# Filter by component - multiple 02
searchFilter28 = entity.SearchFilter()
searchFilter28.components = { typeIdsList[0]: {} , typeIdsList[1]: {} }
searchFilter28.components_match_all = True
SearchResultCheck(searchFilter28, "Filter by component - multiple 02", passengerId1)
# Search with Roots - Base
# Filter with roots - base 01
searchFilter29 = entity.SearchFilter()
searchFilter29.names = ["Passenger"]
searchFilter29.roots = [carId1]
SearchResultsCheck(searchFilter29, "Filter with roots - base 01", 2)
# Filter with roots - base 02
searchFilter30 = entity.SearchFilter()
searchFilter30.names = ["Passenger"]
searchFilter30.roots = [carId2]
SearchResultCheck(searchFilter30, "Filter with roots - base 02", passengerId3)
# Filter with roots - base 03
searchFilter31 = entity.SearchFilter()
searchFilter31.names = ["SportsCar"]
searchFilter31.roots = [carId1]
SearchResultsCheck(searchFilter31, "Filter with roots - base 03", 0)
# Filter with roots - base 04
searchFilter32 = entity.SearchFilter()
searchFilter32.names = ["City|Street|SportsCar|Passenger"]
searchFilter32.roots = [carId1]
SearchResultsCheck(searchFilter32, "Filter with roots - base 04", 0)
# Filter with roots - base 05
searchFilter33 = entity.SearchFilter()
searchFilter33.names = ["Car|Passenger"]
searchFilter33.roots = [carId1]
SearchResultsCheck(searchFilter33, "Filter with roots - base 05", 2)
# Search with Roots - NameIsRootBased
# Filter with roots - NameIsRootBased 01
searchFilter34 = entity.SearchFilter()
searchFilter34.names = ["Car|Passenger"]
searchFilter34.names_are_root_based = False # default
SearchResultsCheck(searchFilter34, "Filter with roots - NameIsRootBased 01", 3)
# Filter with roots - NameIsRootBased 02
searchFilter35 = entity.SearchFilter()
searchFilter35.names = ["Car|Passenger"]
searchFilter35.names_are_root_based = True
SearchResultsCheck(searchFilter35, "Filter with roots - NameIsRootBased 02", 0)
# Filter with roots - NameIsRootBased 03
searchFilter36 = entity.SearchFilter()
searchFilter36.names = ["Car|Passenger"]
searchFilter36.roots = [streetId]
searchFilter36.names_are_root_based = False # default
SearchResultsCheck(searchFilter36, "Filter with roots - NameIsRootBased 03", 3)
# Filter with roots - NameIsRootBased 04
searchFilter37 = entity.SearchFilter()
searchFilter37.names = ["Car|Passenger"]
searchFilter37.roots = [streetId]
searchFilter37.names_are_root_based = True
SearchResultsCheck(searchFilter37, "Filter with roots - NameIsRootBased 04", 3)
# Filter with roots - NameIsRootBased 05
searchFilter38 = entity.SearchFilter()
searchFilter38.names = ["Car|Passenger"]
searchFilter38.roots = [carId2]
searchFilter38.names_are_root_based = True
SearchResultsCheck(searchFilter38, "Filter with roots - NameIsRootBased 05", 0)
# Search with Multiple Filters
searchFilter39 = entity.SearchFilter()
searchFilter39.names = ["Pass*"]
searchFilter39.roots = [sportsCarId]
searchFilter39.components = { typeIdsList[1]:{} }
searchFilter39.names_are_root_based = True
searchFilter39.names_case_sensitive = True
SearchResultCheck(searchFilter39, "Search with Multiple Filters", passengerId4)
# Search with Aabb - Base
aabb = math.Aabb()
cityPosition = components.TransformBus(bus.Event, "GetWorldTranslation", cityId)
print("City Position: ( " + str(cityPosition.x) + ", " + str(cityPosition.y) + ", " + str(cityPosition.z) + " )")
# Filter by AABB - base 01
searchFilter40 = entity.SearchFilter()
aabbMin = math.Vector3(cityPosition.x - 1000.0, cityPosition.y - 1000.0, cityPosition.z - 1000.0)
aabbMax = math.Vector3(cityPosition.x + 1000.0, cityPosition.y + 1000.0, cityPosition.z + 1000.0)
aabb.Set(aabbMin, aabbMax)
searchFilter40.aabb = aabb
searchFilter40.names = ["City", "Street", "SportsCar", "Car", "Passenger"]
searchFilter40.names_case_sensitive = True
SearchResultsCheck(searchFilter40, "Filter by AABB - base 01", 10)
# Filter by AABB - base 02
searchFilter41 = entity.SearchFilter()
aabbMin = math.Vector3(cityPosition.x - 1000.0, cityPosition.y - 1000.0, cityPosition.z - 1000.0)
aabbMax = math.Vector3(cityPosition.x - 100.0, cityPosition.y - 100.0, cityPosition.z - 100.0)
aabb.Set(aabbMin, aabbMax)
searchFilter41.aabb = aabb
searchFilter41.names = ["City", "Street", "SportsCar", "Car", "Passenger"]
searchFilter41.names_case_sensitive = True
SearchResultsCheck(searchFilter41, "Filter by AABB - base 02", 0)
# Search with Component Properties - Base
# Filter by Component Properties - base 01
searchFilter42 = entity.SearchFilter()
searchFilter42.components = { typeIdsList[1]:{'Render options|Draw character': True} }
searchFilter42.names = ["City", "Street", "SportsCar", "Car", "Passenger"]
SearchResultsCheck(searchFilter42, "Filter by Component Properties - base 01", 3)
# Filter by Component Properties - base 02
searchFilter43 = entity.SearchFilter()
searchFilter43.components = { typeIdsList[0]:{}, typeIdsList[1]:{'Render options|Draw character': True} }
searchFilter43.components_match_all = False
searchFilter43.names = ["City", "Street", "SportsCar", "Car", "Passenger"]
SearchResultsCheck(searchFilter43, "Filter by Component Properties - base 02", 4)
# Filter by Component Properties - base 03
searchFilter44 = entity.SearchFilter()
searchFilter44.components = { typeIdsList[0]:{}, typeIdsList[1]:{'Render options|Draw character': True} }
searchFilter44.components_match_all = True
searchFilter44.names = ["City", "Street", "SportsCar", "Car", "Passenger"]
SearchResultsCheck(searchFilter44, "Filter by Component Properties - base 03", 1)
editor.EditorToolsApplicationRequestBus(bus.Broadcast, 'ExitNoPrompt')