def combine_rotation_constraints(parent_planes, eps=0.01):
    """
    Given a list of normals, compute the combined axis of rotation.
    If there are conflicting constraints, return None.
    """

    normals = [
        bpy.data.objects[name].data.polygons[poly].normal
        for name, poly in parent_planes
    ]

    # Start with the first constraint
    combined_axis = rotation_constraint(normals[0])

    for normal in normals[1:]:
        axis = rotation_constraint(normal)

        # If the axes are not parallel, there's a conflict
        if not np.isclose(combined_axis.dot(axis), 1, atol=eps):
            return None

        # Otherwise, keep the current axis (since they're parallel)

    return combined_axis

    Given a list of normals, compute the combined axis of rotation.
    If there are conflicting constraints, return None.
    
infinigen/core/constraints/example_solver/geometry/dof.py