scratch_agent / utils /block_correcter.py
WebashalarForML's picture
Upload 24 files
3d3703f verified
raw
history blame
11.6 kB
import json
def update_and_clean_blocks(all_generated_blocks, generated_output_blocks):
"""
Updates the generated_output_blocks with values from all_generated_blocks
and removes specified keys from the updated blocks.
Args:
all_generated_blocks (dict): The dictionary containing all generated block data.
generated_output_blocks (dict): The dictionary to be updated and cleaned.
Returns:
dict: The updated and cleaned dictionary.
"""
keys_to_remove = ["functionality", "block_shape", "id", "block_name", "block_type"]
updated_blocks = {}
for block_id, generated_block_data in generated_output_blocks.items():
if block_id in all_generated_blocks:
all_block_data = all_generated_blocks[block_id]
# Create a new dictionary for the updated block, including only desired fields
current_updated_block = {}
for key, value in generated_block_data.items():
if key not in keys_to_remove:
current_updated_block[key] = value
# Update specific values from all_generated_blocks if they exist
# and are not among the keys to be removed
if "next" in all_block_data and "next" not in keys_to_remove:
current_updated_block["next"] = all_block_data["next"]
if "parent" in all_block_data and "parent" not in keys_to_remove:
current_updated_block["parent"] = all_block_data["parent"]
if "topLevel" in all_block_data and "topLevel" not in keys_to_remove:
current_updated_block["topLevel"] = all_block_data["topLevel"]
updated_blocks[block_id] = current_updated_block
else:
# If a block_id from generated_output_blocks is not in all_generated_blocks,
# just clean it
current_updated_block = {}
for key, value in generated_block_data.items():
if key not in keys_to_remove:
current_updated_block[key] = value
updated_blocks[block_id] = current_updated_block
return updated_blocks
# Load the provided JSON data
all_generated_blocks = {
"event_whenflagclicked_1": {
"block_name": "when green flag pressed",
"block_type": "Events",
"op_code": "event_whenflagclicked",
"block_shape": "Hat Block",
"functionality": "This Hat block initiates the script when the green flag is clicked, serving as the common starting point for most Scratch projects.",
"inputs": {},
"fields": {},
"shadow": False,
"topLevel": True,
"id": "event_whenflagclicked_1",
"next": "data_setvariableto_1",
"parent": None
},
"data_setvariableto_1": {
"block_name": "set [my variable v] to ()",
"block_type": "Data",
"block_shape": "Stack Block",
"op_code": "data_setvariableto",
"functionality": "Assigns a specific value (number, string, or boolean) to a variable.",
"inputs": {
"VALUE": {
"kind": "value",
"value": 0
}
},
"fields": {
"VARIABLE": [
"score",
None
]
},
"shadow": False,
"topLevel": False,
"id": "data_setvariableto_1",
"next": "control_forever_1",
"parent": "event_whenflagclicked_1"
},
"data_setvariableto_2": {
"block_name": "set [my variable v] to ()",
"block_type": "Data",
"block_shape": "Stack Block",
"op_code": "data_setvariableto",
"functionality": "Assigns a specific value (number, string, or boolean) to a variable.",
"inputs": {
"VALUE": [
1,
[
10,
"0"
]
]
},
"fields": {
"VARIABLE": [
"my variable",
"`jEk@4|i[#Fk?(8x)AV.-my variable"
]
},
"shadow": False,
"topLevel": False,
"parent": None,
"next": None
},
"control_forever_1": {
"block_name": "forever",
"block_type": "Control",
"block_shape": "C-Block",
"op_code": "control_forever",
"functionality": "Continuously runs the blocks inside it.",
"inputs": {
"SUBSTACK": [
2,
"control_if_1"
]
},
"fields": {},
"shadow": False,
"topLevel": False,
"id": "control_forever_1",
"next": None,
"parent": "event_whenflagclicked_1"
},
"control_if_1": {
"block_name": "if <> then",
"block_type": "Control",
"block_shape": "C-Block",
"op_code": "control_if",
"functionality": "Executes the blocks inside it only if the specified boolean condition is true. [NOTE: it takes boolean blocks as input]",
"inputs": {
"CONDITION": {
"kind": "block",
"block": "sensing_touchingobject_1"
},
"SUBSTACK": [
2,
"data_changevariableby_1"
]
},
"fields": {},
"shadow": False,
"topLevel": False,
"id": "control_if_1",
"next": None,
"parent": "control_forever_1"
},
"control_wait_1": {
"block_name": "wait () seconds",
"block_type": "Control",
"block_shape": "Stack Block",
"op_code": "control_wait",
"functionality": "Pauses the script for a specified duration.",
"inputs": {
"DURATION": {
"kind": "value",
"value": 0.1
}
},
"fields": {},
"shadow": False,
"topLevel": False,
"id": "control_wait_1",
"next": None,
"parent": "control_if_1"
},
"sensing_touchingobject_1": {
"block_name": "<touching [edge v]?>",
"block_type": "Sensing",
"op_code": "sensing_touchingobject",
"block_shape": "Boolean Block",
"functionality": "Checks if its sprite is touching the mouse-pointer, edge, or another specified sprite.",
"inputs": {
"TOUCHINGOBJECTMENU": [
1,
"sensing_touchingobjectmenu_1"
]
},
"fields": {},
"shadow": False,
"topLevel": False,
"id": "sensing_touchingobject_1",
"parent": "control_if_1",
"next": None
},
"sensing_touchingobjectmenu_1": {
"block_name": "touching object menu",
"block_type": "Sensing",
"block_shape": "Reporter Block",
"op_code": "sensing_touchingobjectmenu",
"functionality": "Menu for touching object block.",
"inputs": {},
"fields": {
"TOUCHINGOBJECTMENU": [
"other sprite",
None
]
},
"shadow": True,
"topLevel": False,
"id": "sensing_touchingobjectmenu_1",
"parent": "sensing_touchingobject_1",
"next": None
},
"data_changevariableby_1": {
"block_name": "change [my variable v] by ()",
"block_type": "Data",
"block_shape": "Stack Block",
"op_code": "data_changevariableby",
"functionality": "Increases or decreases a variable's numerical value by a specified amount.",
"inputs": {
"VALUE": {
"kind": "value",
"value": -1
}
},
"fields": {
"VARIABLE": [
"score",
None
]
},
"shadow": False,
"topLevel": False,
"id": "data_changevariableby_1",
"next": "control_wait_1",
"parent": "control_if_1"
}
}
generated_output_blocks = {
"event_whenflagclicked_1": {
"block_name": "when green flag pressed",
"block_type": "Events",
"op_code": "event_whenflagclicked",
"block_shape": "Hat Block",
"functionality": "This Hat block initiates the script when the green flag is clicked, serving as the common starting point for most Scratch projects.",
"inputs": {},
"fields": {},
"shadow": False,
"topLevel": True,
"parent": None,
"next": None
},
"data_setvariableto_1": {
"block_name": "set [my variable v] to ()",
"block_type": "Data",
"block_shape": "Stack Block",
"op_code": "data_setvariableto",
"functionality": "Assigns a specific value (number, string, or boolean) to a variable.",
"inputs": {
"VALUE": [
1,
[
10,
"0"
]
]
},
"fields": {
"VARIABLE": [
"my variable",
"`jEk@4|i[#Fk?(8x)AV.-my variable"
]
},
"shadow": False,
"topLevel": True,
"parent": None,
"next": None
},
"data_setvariableto_2": {
"block_name": "set [my variable v] to ()",
"block_type": "Data",
"block_shape": "Stack Block",
"op_code": "data_setvariableto",
"functionality": "Assigns a specific value (number, string, or boolean) to a variable.",
"inputs": {
"VALUE": [
1,
[
10,
"0"
]
]
},
"fields": {
"VARIABLE": [
"my variable",
"`jEk@4|i[#Fk?(8x)AV.-my variable"
]
},
"shadow": False,
"topLevel": True,
"parent": None,
"next": None
},
"control_forever_1": {
"block_name": "forever",
"block_type": "Control",
"block_shape": "C-Block",
"op_code": "control_forever",
"functionality": "Continuously runs the blocks inside it.",
"inputs": {
"SUBSTACK": [
2,
None
]
},
"fields": {},
"shadow": False,
"topLevel": True,
"parent": None,
"next": None
},
"control_if_1": {
"block_name": "if <> then",
"block_type": "Control",
"block_shape": "C-Block",
"op_code": "control_if",
"functionality": "Executes the blocks inside it only if the specified boolean condition is true. [NOTE: it takes boolean blocks as input]",
"inputs": {
"CONDITION": [
2,
None
],
"SUBSTACK": [
2,
None
]
},
"fields": {},
"shadow": False,
"topLevel": True,
"parent": None,
"next": None
},
"control_wait_1": {
"block_name": "wait () seconds",
"block_type": "Control",
"block_shape": "Stack Block",
"op_code": "control_wait",
"functionality": "Pauses the script for a specified duration.",
"inputs": {
"DURATION": [
1,
[
5,
"1"
]
]
},
"fields": {},
"shadow": False,
"topLevel": True,
"parent": None,
"next": None
},
"sensing_touchingobject_1": {
"block_name": "<touching [edge v]?>",
"block_type": "Sensing",
"op_code": "sensing_touchingobject",
"block_shape": "Boolean Block",
"functionality": "Checks if its sprite is touching the mouse-pointer, edge, or another specified sprite.",
"inputs": {
"TOUCHINGOBJECTMENU": [
1,
"sensing_touchingobjectmenu_1"
]
},
"fields": {},
"shadow": False,
"topLevel": True,
"parent": None,
"next": None
},
"sensing_touchingobjectmenu_1": {
"block_name": "touching object menu",
"block_type": "Sensing",
"block_shape": "Reporter Block",
"op_code": "sensing_touchingobjectmenu",
"functionality": "Menu for touching object block.",
"inputs": {},
"fields": {
"TOUCHINGOBJECTMENU": [
"_mouse_",
None
]
},
"shadow": True,
"topLevel": False,
"next": None,
"parent": "sensing_touchingobject_1"
}
}
# Process the blocks
processed_blocks = update_and_clean_blocks(all_generated_blocks, generated_output_blocks)
# Print the processed blocks in a readable JSON format
print(json.dumps(processed_blocks, indent=2))