def cross_cube_sub_constraint_constructor(ai_parser, ai_variant=0):
    """
  Add arguments relative to the cross_cube_sub
  ai_variant = 1 : for cross_cube directly
  ai_variant = 2 : for crest and then cross_cube
  """
    r_parser = ai_parser
    if ai_variant == 2:
        r_parser.add_argument('--axle_diameter', '--ad', action='store',
            type=float, default=10.0, help=
            'Set the diameter of the two axles. Default: 10.0')
        r_parser.add_argument('--inter_axle_length', '--ial', action=
            'store', type=float, default=15.0, help=
            'Set the length length betwen the two axle centers. Default: 15.0')
        r_parser.add_argument('--height_margin', '--hm', action='store',
            type=float, default=10.0, help=
            'Set the length betwen the axle peripheral and the inner edge of the top. Default: 10.0'
            )
        r_parser.add_argument('--top_thickness', '--tt', action='store',
            type=float, default=5.0, help=
            'Set the thickness of the top part. Default: 5.0')
    if ai_variant == 2:
        r_parser.add_argument('--cube_width', '--cw', action='store', type=
            float, default=60.0, help=
            'Set the outer width of the cube (for x and y). Default: 60.0')
    if ai_variant == 2:
        r_parser.add_argument('--face_A1_thickness', '--fa1t', action=
            'store', type=float, default=9.0, help=
            'Set the thickness of the face_A1 part. If equal to 0.0, set to top_thickness. Default: 9.0'
            )
        r_parser.add_argument('--face_A2_thickness', '--fa2t', action=
            'store', type=float, default=7.0, help=
            'Set the thickness of the face_A2 part. If equal to 0.0, set to top_thickness. Default: 7.0'
            )
    if ai_variant == 2:
        r_parser.add_argument('--face_B1_thickness', '--fb1t', action=
            'store', type=float, default=8.0, help=
            'Set the thickness of the face_B1 part. If equal to 0.0, set to top_thickness. Default: 8.0'
            )
        r_parser.add_argument('--face_B2_thickness', '--fb2t', action=
            'store', type=float, default=6.0, help=
            'Set the thickness of the face_B2 part. If equal to 0.0, set to top_thickness. Default: 6.0'
            )
    if ai_variant == 2:
        r_parser.add_argument('--face_rod_hole_diameter', '--frhd', action=
            'store', type=float, default=4.0, help=
            'Set the diameter of the holes for threaded rod on the faces. Default: 4.0'
            )
        r_parser.add_argument('--face_rod_hole_h_position', '--frhhp',
            action='store', type=float, default=5.0, help=
            'Set the horizontal position of the threaded rod center from the inner edge. Default: 5.0'
            )
        r_parser.add_argument('--face_rod_hole_v_distance', '--frhvd',
            action='store', type=float, default=5.0, help=
            'Set the vertical distance between the axis of the x-face-rod and the y-face-rod. Default: 5.0'
            )
        r_parser.add_argument('--face_rod_hole_v_position', '--frhvp',
            action='store', type=float, default=5.0, help=
            'Set the vertical position of the threaded rod center from the inner edge. Default: 5.0'
            )
    if ai_variant == 1:
        r_parser.add_argument('--top_rod_hole_diameter', '--trhd', action=
            'store', type=float, default=4.0, help=
            'Set the diameter of the holes for the vertical threaded rods. Default: 4.0'
            )
        r_parser.add_argument('--top_rod_hole_h_position', '--trhhp',
            action='store', type=float, default=10.0, help=
            'Set the horizontal position of the vertical threaded rod center from the inner edge. Default: 10.0'
            )
    if ai_variant == 2:
        r_parser.add_argument('--face_hollow_leg_nb', '--fhln', action=
            'store', type=int, default=1, help=
            'Set the number of legs (equivalent number of hollows) on the faces. Possible values: 1 (filled), 4, 8. Default: 1'
            )
        r_parser.add_argument('--face_hollow_border_width', '--fhbw',
            action='store', type=float, default=0.0, help=
            'Set the width around the face-inner-border. If equal to 0.0, set to max_face_top_thickness. Default: 0.0'
            )
        r_parser.add_argument('--face_hollow_axle_width', '--fhaw', action=
            'store', type=float, default=0.0, help=
            'Set the width around the axle. If equal to 0.0, set to axle_radius. Default: 0.0'
            )
        r_parser.add_argument('--face_hollow_leg_width', '--fhlw', action=
            'store', type=float, default=0.0, help=
            'Set the width of the legs. If equal to 0.0, set to max(max_face_top_thickness, axle_radius). Default: 0.0'
            )
        r_parser.add_argument('--face_hollow_smoothing_radius', '--fhsr',
            action='store', type=float, default=0.0, help=
            'Set the radius for smoothing the face-hollow corners. If equal to 0.0, set to cube_width/10. Default: 0.0'
            )
    if ai_variant == 1:
        r_parser.add_argument('--top_hollow_leg_nb', '--thln', action=
            'store', type=int, default=0, help=
            'Set the number of legs (equivalent number of hollows) on the top. Possible values: 0 (empty), 1 (filled), 4, 8. Default: 0'
            )
        r_parser.add_argument('--top_hollow_border_width', '--thbw', action
            ='store', type=float, default=0.0, help=
            'Set the width around the top-inner-border. If equal to 0.0, set to max_face_thickness. Default: 0.0'
            )
        r_parser.add_argument('--top_hollow_leg_width', '--thlw', action=
            'store', type=float, default=0.0, help=
            'Set the width of the legs. If equal to 0.0, set to max_face_thickness. Default: 0.0'
            )
        r_parser.add_argument('--top_hollow_smoothing_radius', '--thsr',
            action='store', type=float, default=0.0, help=
            'Set the radius for smoothing the top-hollow corners. If equal to 0.0, set to cube_width/10. Default: 0.0'
            )
    if ai_variant == 1:
        r_parser.add_argument('--axle_length', '--al', action='store', type
            =float, default=0.0, help=
            'Set the total length of the axles. If equal to 0.0, set to 2*cube_width. Default: 0.0'
            )
        r_parser.add_argument('--spacer_diameter', '--sd', action='store',
            type=float, default=0.0, help=
            'Set the external diameter of the spacer. If equal to 0.0, set to 1.2*axle_diameter. Default: 0.0'
            )
        r_parser.add_argument('--spacer_length', '--sl', action='store',
            type=float, default=0.0, help=
            'Set the length of the spacers. If equal to 0.0, set to (axle_length-cube_width)/4. Default: 0.0'
            )
    if ai_variant == 2:
        r_parser.add_argument('--cross_cube_cnc_router_bit_radius',
            '--cccrbr', action='store', type=float, default=1.0, help=
            'Set the minimal cnc_router_bit radius of the design. Default: 1.0'
            )
        r_parser.add_argument('--cross_cube_extra_cut_thickness', '--ccect',
            action='store', type=float, default=0.0, help=
            'Set the extra-cut-thickness for the internal cross_cube cuts. It can be used to compensate the manufacturing process or to check the 3D assembly with FreeCAD. Default: 0.0'
            )
    return r_parser
