class_docstr: Structured environment version of the cutting 2D environment.
  The environment alternates between the two sub-steps:
  
  - Select cutting piece
  - Select cutting configuration (cutting order and cutting orientation)
  
  :param maze_env: The "flat" cutting 2D environment to wrap.
class_docstr_tok: ["Structured","environment","version","of","the","cutting","2D","environment",".","The","environment","alternates","between","the","two","sub-steps",":","-","Select","cutting","piece","-","Select","cutting","configuration","(","cutting","order","and","cutting","orientation",")",":","param","maze_env",":","The","``","flat","''","cutting","2D","environment","to","wrap","."]
code: def __init__(self, maze_env: MazeEnv):
      super().__init__(maze_env)
  
      # add masks to observation spaces
      max_inventory = (
          self.observation_conversion.max_pieces_in_inventory
      )
      self._observation_spaces_dict[0].spaces[
          "inventory_mask"
      ] = gym.spaces.Box(
          low=np.float32(0),
          high=np.float32(1),
          shape=(max_inventory,),
          dtype=np.float32,
      )
  
      self._observation_spaces_dict[1].spaces[
          "cutting_mask"
      ] = gym.spaces.Box(
          low=np.float32(0),
          high=np.float32(1),
          shape=(2,),
          dtype=np.float32,
      )
  
file_path: maze/tutorials/tutorial_maze_env/part06_struct_env/env/struct_env_masked.py
imports: from copy import deepcopy
  from typing import Dict, List, Tuple
  import gym
  import numpy
  from tutorial_maze_env.part06_struct_env.env.maze_env import maze_env_factory
  from tutorial_maze_env.part06_struct_env.env.struct_env import StructuredCutting2DEnvironment
  from maze.core.env.maze_env import MazeEnv
label_desc: Use image node_id 1 to create a new MaskedStructuredCutting2DEnvironment object from inherited base classes: StructuredCutting2DEnvironment with example: obj = MaskedStructuredCutting2DEnvironment(maze_env)