diff --git a/src/scratchtocatrobat/converter/converter.py b/src/scratchtocatrobat/converter/converter.py index d9ccff37..928dee59 100644 --- a/src/scratchtocatrobat/converter/converter.py +++ b/src/scratchtocatrobat/converter/converter.py @@ -418,11 +418,16 @@ class _ScratchToCatrobat(object): catbricks.CameraBrick(int(status.lower() != 'off')) ], - "changeGraphicEffect:by:": None, + "changeGraphicEffect:by:": lambda effect_type, value: + catbricks.ChangeBrightnessByNBrick if effect_type == 'BRIGHTNESS' else + catbricks.ChangeTransparencyByNBrick if effect_type == 'GHOST' else + catbricks.ChangeColorByNBrick if effect_type == 'COLOR' else + _placeholder_for_unmapped_blocks_to("changeGraphicEffect:by:", effect_type, value), "setGraphicEffect:to:": lambda effect_type, value: - catbricks.SetBrightnessBrick(value) if effect_type == 'brightness' else - catbricks.SetTransparencyBrick(value) if effect_type == 'ghost' else - _placeholder_for_unmapped_blocks_to("setGraphicEffect:to:", effect_type, value), + catbricks.SetBrightnessBrick if effect_type == 'BRIGHTNESS' else + catbricks.SetTransparencyBrick if effect_type == 'GHOST' else + catbricks.SetColorBrick if effect_type == 'COLOR' else + _placeholder_for_unmapped_blocks_to("setGraphicEffect:to:", effect_type, value), "filterReset": catbricks.ClearGraphicEffectBrick, "changeSizeBy:": catbricks.ChangeSizeByNBrick, "setSizeTo:": catbricks.SetSizeToBrick, @@ -2374,53 +2379,54 @@ def _converted_script_element(self): def _regular_block_conversion(self): CatrobatClass = self.CatrobatClass - # TODO: replace with UnmappedBlock as a None object - if CatrobatClass is not None: - is_catrobat_enum = not hasattr(CatrobatClass, "__module__") and hasattr(CatrobatClass, "getClass") - self.arguments = _with_unmapped_blocks_replaced_as_default_formula_value(self.arguments) - for try_number in range(6): - try: - # TODO: simplify - if try_number == 0: - converted_args = [(common.int_or_float(arg) or arg if isinstance(arg, (str, unicode)) else arg) for arg in self.arguments] - elif try_number == 1: - def handleBoolean(arg): - if isinstance(arg, bool): - return int(arg) - else: - return arg - - converted_args = [catformula.FormulaElement(catElementType.NUMBER, str(handleBoolean(arg)), None) if isinstance(arg, numbers.Number) else arg for arg in converted_args] # @UndefinedVariable - elif try_number == 4: - converted_args = self.arguments - elif try_number == 2: - args = [arg if arg != None else "" for arg in self.arguments] - converted_args = [catrobat.create_formula_with_value(arg) for arg in args] - elif try_number == 3: - if len(self.arguments) == 2 and self.arguments[0] in { "brightness", "color", "ghost" }: - converted_args = [self.arguments[0]] + [catrobat.create_formula_with_value(arg) for arg in self.arguments[1:]] - - if not is_catrobat_enum: - converted_value = CatrobatClass(*converted_args) - else: - converted_value = catrobat.formula_element_for(CatrobatClass, converted_args) - assert converted_value, "No result for {} with args {}".format(self.block_name, converted_args) - break - except (TypeError) as e: - log.debug("instantiation try %d failed for class: %s, raw_args: %s, Catroid args: %s", - try_number, CatrobatClass, self.arguments, map(catrobat.simple_name_for, converted_args)) - class_exception = e - else: - log.error("General instantiation failed for class: %s, raw_args: %s, Catroid args: %s", - CatrobatClass, self.arguments, map(catrobat.simple_name_for, converted_args)) - raise class_exception - log.exception(class_exception) - self.errors += [class_exception] - new_stack_values = converted_value - else: + + if CatrobatClass is None: log.debug("no Class for: %s, args: %s", self.block_name, map(catrobat.simple_name_for, self.arguments)) - new_stack_values = UnmappedBlock(self.sprite, *([self.block_name] + self.arguments)) - return new_stack_values + return UnmappedBlock(self.sprite, *([self.block_name] + self.arguments)) + + is_catrobat_enum = not hasattr(CatrobatClass, "__module__") and hasattr(CatrobatClass, "getClass") + self.arguments = _with_unmapped_blocks_replaced_as_default_formula_value(self.arguments) + + for try_number in range(4): + try: + if try_number == 0: + converted_args = [(common.int_or_float(arg) or arg if isinstance(arg, (str, unicode)) else arg) for arg in self.arguments] + + elif try_number == 1: + def handleBoolean(arg): + if isinstance(arg, bool): + return int(arg) + else: + return arg + + converted_args = [catformula.FormulaElement(catElementType.NUMBER, str(handleBoolean(arg)), None) if isinstance(arg, numbers.Number) else arg for arg in converted_args] # @UndefinedVariable + + elif try_number == 2: + args = [arg if arg != None else "" for arg in self.arguments] + converted_args = [catrobat.create_formula_with_value(arg) for arg in args] + + elif try_number == 3: + converted_args = self.arguments + + if not is_catrobat_enum: + converted_value = CatrobatClass(*converted_args) + else: + converted_value = catrobat.formula_element_for(CatrobatClass, converted_args) + + assert converted_value, "No result for {} with args {}".format(self.block_name, converted_args) + break + except TypeError as e: + log.debug("instantiation try %d failed for class: %s, raw_args: %s, Catroid args: %s", + try_number, CatrobatClass, self.arguments, map(catrobat.simple_name_for, converted_args)) + class_exception = e + else: + log.error("General instantiation failed for class: %s, raw_args: %s, Catroid args: %s", + CatrobatClass, self.arguments, map(catrobat.simple_name_for, converted_args)) + raise class_exception + log.exception(class_exception) + self.errors += [class_exception] + + return converted_value def _converted_helper_brick_or_formula_element(self, arguments, block_name): preserved_args = self.arguments @@ -2933,16 +2939,16 @@ def _convert_sound_block(self): @_register_handler(_block_name_to_handler_map, "setGraphicEffect:to:") def _convert_set_graphic_effect_block(self): [effect_type, value] = self.arguments - if effect_type == 'brightness': + if effect_type == 'BRIGHTNESS': # range Scratch: -100 to 100 (default: 0) # range Catrobat: 0 to 200% (default: 100%) formula_elem = self._converted_helper_brick_or_formula_element([value, 100], "+") return catbricks.SetBrightnessBrick(catrobat.create_formula_with_value(formula_elem)) - elif effect_type == 'ghost': + elif effect_type == 'GHOST': # range Scratch: 0 to 100 (default: 0) # range Catrobat: 0 to 100% (default: 0%) return catbricks.SetTransparencyBrick(catrobat.create_formula_with_value(value)) - elif effect_type == 'color': + elif effect_type == 'COLOR': # range Scratch: 0 to 200 (default: 0) # range Catrobat: 0 to 200% (default: 0%) return catbricks.SetColorBrick(catrobat.create_formula_with_value(value)) @@ -2952,16 +2958,16 @@ def _convert_set_graphic_effect_block(self): @_register_handler(_block_name_to_handler_map, "changeGraphicEffect:by:") def _convert_change_graphic_effect_block(self): [effect_type, value] = self.arguments - if effect_type == 'brightness': + if effect_type == 'BRIGHTNESS': # range Scratch: -100 to 100 (default: 0) # range Catrobat: 0 to 200% (default: 100%) # since ChangeBrightnessByNBrick adds increment -> no range-conversion needed return catbricks.ChangeBrightnessByNBrick(catrobat.create_formula_with_value(value)) - elif effect_type == 'ghost': + elif effect_type == 'GHOST': # range Scratch: 0 to 100 (default: 0) # range Catrobat: 0 to 100% (default: 0%) return catbricks.ChangeTransparencyByNBrick(catrobat.create_formula_with_value(value)) - elif effect_type == 'color': + elif effect_type == 'COLOR': # range Scratch: 0 to 200 (default: 0) # range Catrobat: 0 to 200% (default: 0%) return catbricks.ChangeColorByNBrick(catrobat.create_formula_with_value(value)) diff --git a/src/scratchtocatrobat/converter/test_converter.py b/src/scratchtocatrobat/converter/test_converter.py index 56afa664..00eec5db 100644 --- a/src/scratchtocatrobat/converter/test_converter.py +++ b/src/scratchtocatrobat/converter/test_converter.py @@ -1092,7 +1092,7 @@ def test_can_convert_doplaysoundandwait_block(self): # setGraphicEffect:to: (brightness) def test_can_convert_set_graphic_effect_with_float_value_brightness_block(self): - scratch_block = _, _, expected_value = ["setGraphicEffect:to:", "brightness", 10.1] + scratch_block = _, _, expected_value = ["setGraphicEffect:to:", "BRIGHTNESS", 10.1] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.SetBrightnessBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.BRIGHTNESS).formulaTree # @UndefinedVariable @@ -1117,7 +1117,7 @@ def test_can_convert_set_graphic_effect_with_float_value_brightness_block(self): def test_can_convert_set_graphic_effect_with_formula_value_brightness_block(self): expected_left_operand = 10.1 expected_right_operand = 1 - scratch_block = ["setGraphicEffect:to:", "brightness", ["+", expected_left_operand, + scratch_block = ["setGraphicEffect:to:", "BRIGHTNESS", ["+", expected_left_operand, expected_right_operand]] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.SetBrightnessBrick) @@ -1153,7 +1153,7 @@ def test_can_convert_set_graphic_effect_with_formula_value_brightness_block(self # setGraphicEffect:to: (ghost) def test_can_convert_set_graphic_effect_with_float_value_ghost_block(self): - scratch_block = _, _, expected_value = ["setGraphicEffect:to:", "ghost", 10.2] + scratch_block = _, _, expected_value = ["setGraphicEffect:to:", "GHOST", 10.2] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.SetTransparencyBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.TRANSPARENCY).formulaTree # @UndefinedVariable @@ -1166,7 +1166,7 @@ def test_can_convert_set_graphic_effect_with_float_value_ghost_block(self): def test_can_convert_set_graphic_effect_with_formula_value_ghost_block(self): expected_left_operand = 10.2 expected_right_operand = 1 - scratch_block = ["setGraphicEffect:to:", "ghost", ["+", expected_left_operand, expected_right_operand]] + scratch_block = ["setGraphicEffect:to:", "GHOST", ["+", expected_left_operand, expected_right_operand]] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.SetTransparencyBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.TRANSPARENCY).formulaTree # @UndefinedVariable @@ -1189,7 +1189,7 @@ def test_can_convert_set_graphic_effect_with_formula_value_ghost_block(self): # setGraphicEffect:to: (color) def test_can_convert_set_graphic_effect_with_float_value_color_block(self): - scratch_block = _, _, expected_value = ["setGraphicEffect:to:", "color", 10.2] + scratch_block = _, _, expected_value = ["setGraphicEffect:to:", "COLOR", 10.2] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.SetColorBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.COLOR).formulaTree # @UndefinedVariable @@ -1202,7 +1202,7 @@ def test_can_convert_set_graphic_effect_with_float_value_color_block(self): def test_can_convert_set_graphic_effect_with_formula_value_color_block(self): expected_left_operand = 10.2 expected_right_operand = 1 - scratch_block = ["setGraphicEffect:to:", "color", ["+", expected_left_operand, expected_right_operand]] + scratch_block = ["setGraphicEffect:to:", "COLOR", ["+", expected_left_operand, expected_right_operand]] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.SetColorBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.COLOR).formulaTree # @UndefinedVariable @@ -1225,7 +1225,7 @@ def test_can_convert_set_graphic_effect_with_formula_value_color_block(self): # changeGraphicEffect:by: (brightness) def test_can_convert_change_graphic_effect_with_float_value_brightness_block(self): - scratch_block = _, _, expected_value = ["changeGraphicEffect:by:", "brightness", 10.1] + scratch_block = _, _, expected_value = ["changeGraphicEffect:by:", "BRIGHTNESS", 10.1] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.ChangeBrightnessByNBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.BRIGHTNESS_CHANGE).formulaTree # @UndefinedVariable @@ -1238,7 +1238,7 @@ def test_can_convert_change_graphic_effect_with_float_value_brightness_block(sel def test_can_convert_change_graphic_effect_with_formula_value_brightness_block(self): expected_left_operand = 10.2 expected_right_operand = 1 - scratch_block = ["changeGraphicEffect:by:", "brightness", ["+", expected_left_operand, expected_right_operand]] + scratch_block = ["changeGraphicEffect:by:", "BRIGHTNESS", ["+", expected_left_operand, expected_right_operand]] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.ChangeBrightnessByNBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.BRIGHTNESS_CHANGE).formulaTree # @UndefinedVariable @@ -1261,7 +1261,7 @@ def test_can_convert_change_graphic_effect_with_formula_value_brightness_block(s # changeGraphicEffect:by: (ghost) def test_can_convert_change_graphic_effect_with_float_value_ghost_block(self): - scratch_block = _, _, expected_value = ["changeGraphicEffect:by:", "ghost", 10.2] + scratch_block = _, _, expected_value = ["changeGraphicEffect:by:", "GHOST", 10.2] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.ChangeTransparencyByNBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.TRANSPARENCY_CHANGE).formulaTree # @UndefinedVariable @@ -1274,7 +1274,7 @@ def test_can_convert_change_graphic_effect_with_float_value_ghost_block(self): def test_can_convert_change_graphic_effect_with_formula_value_ghost_block(self): expected_left_operand = 10.2 expected_right_operand = 1 - scratch_block = ["changeGraphicEffect:by:", "ghost", ["+", expected_left_operand, expected_right_operand]] + scratch_block = ["changeGraphicEffect:by:", "GHOST", ["+", expected_left_operand, expected_right_operand]] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.ChangeTransparencyByNBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.TRANSPARENCY_CHANGE).formulaTree # @UndefinedVariable @@ -1297,7 +1297,7 @@ def test_can_convert_change_graphic_effect_with_formula_value_ghost_block(self): # changeGraphicEffect:by: (color) def test_can_convert_change_graphic_effect_with_float_value_color_block(self): - scratch_block = _, _, expected_value = ["changeGraphicEffect:by:", "color", 10.2] + scratch_block = _, _, expected_value = ["changeGraphicEffect:by:", "COLOR", 10.2] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.ChangeColorByNBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.COLOR_CHANGE).formulaTree # @UndefinedVariable @@ -1310,7 +1310,7 @@ def test_can_convert_change_graphic_effect_with_float_value_color_block(self): def test_can_convert_change_graphic_effect_with_formula_value_color_block(self): expected_left_operand = 10.2 expected_right_operand = 1 - scratch_block = ["changeGraphicEffect:by:", "color", ["+", expected_left_operand, expected_right_operand]] + scratch_block = ["changeGraphicEffect:by:", "COLOR", ["+", expected_left_operand, expected_right_operand]] [catr_brick] = self.block_converter._catrobat_bricks_from(scratch_block, DUMMY_CATR_SPRITE) assert isinstance(catr_brick, catbricks.ChangeColorByNBrick) formula_tree_value = catr_brick.getFormulaWithBrickField(catbasebrick.BrickField.COLOR_CHANGE).formulaTree # @UndefinedVariable