// This library provides WebAssembly bindings for the FreeCAD's geometric solver library planegcs.
// Copyright (C) 2023  Miroslav Šerý, Salusoft89 <miroslav.sery@salusoft89.cz>  

// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.

// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

export const constraint_param_index : Record<string, Record<string, string>> = {
    equal: {
             param1: 'object_param_or_number',
             param2: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
            internalalignment: 'primitive_type',
    },
    proportional: {
             param1: 'object_param_or_number',
             param2: 'object_param_or_number',
            ratio: 'primitive_type',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    difference: {
             param1: 'object_param_or_number',
             param2: 'object_param_or_number',
             difference: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2p_distance: { 
             p1_id: 'object_id', 
             p2_id: 'object_id',
             distance: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2p_angle_incr_angle: { 
             p1_id: 'object_id', 
             p2_id: 'object_id',
             angle: 'object_param_or_number',
            incrAngle: 'primitive_type',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2p_angle: { 
             p1_id: 'object_id', 
             p2_id: 'object_id',
             angle: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2l_distance: { 
             p_id: 'object_id', 
             l_id: 'object_id',
             distance: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_line_pl: { 
             p_id: 'object_id', 
             l_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_line_ppp: { 
             p_id: 'object_id', 
             lp1_id: 'object_id', 
             lp2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_perp_bisector_pl: { 
             p_id: 'object_id', 
             l_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_perp_bisector_ppp: { 
             p_id: 'object_id', 
             lp1_id: 'object_id', 
             lp2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    parallel: { 
             l1_id: 'object_id', 
             l2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    perpendicular_ll: { 
             l1_id: 'object_id', 
             l2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    perpendicular_pppp: { 
             l1p1_id: 'object_id', 
             l1p2_id: 'object_id', 
             l2p1_id: 'object_id', 
             l2p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    l2l_angle_ll: { 
             l1_id: 'object_id', 
             l2_id: 'object_id',
             angle: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    l2l_angle_pppp: { 
             l1p1_id: 'object_id', 
             l1p2_id: 'object_id', 
             l2p1_id: 'object_id', 
             l2p2_id: 'object_id',
             angle: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    angle_via_point: { 
             crv1_id: 'object_id', 
             crv2_id: 'object_id', 
             p_id: 'object_id',
             angle: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    angle_via_two_points: { 
             crv1_id: 'object_id', 
             crv2_id: 'object_id', 
             p1_id: 'object_id', 
             p2_id: 'object_id',
             angle: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    angle_via_point_and_param: { 
             crv1_id: 'object_id', 
             crv2_id: 'object_id', 
             p_id: 'object_id',
             cparam: 'object_param_or_number',
             angle: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    angle_via_point_and_two_params: { 
             crv1_id: 'object_id', 
             crv2_id: 'object_id', 
             p_id: 'object_id',
             cparam1: 'object_param_or_number',
             cparam2: 'object_param_or_number',
             angle: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    midpoint_on_line_ll: { 
             l1_id: 'object_id', 
             l2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    midpoint_on_line_pppp: { 
             l1p1_id: 'object_id', 
             l1p2_id: 'object_id', 
             l2p1_id: 'object_id', 
             l2p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_circumf: { 
             p1_id: 'object_id', 
             p2_id: 'object_id',
             rd1: 'object_param_or_number',
             rd2: 'object_param_or_number',
            internal: 'primitive_type',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_at_bspline_knot: { 
             b_id: 'object_id', 
             l_id: 'object_id', 
            knotindex_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2p_coincident: { 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    horizontal_l: { 
             l_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    horizontal_pp: { 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    vertical_l: { 
             l_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    vertical_pp: { 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    coordinate_x: { 
             p_id: 'object_id',
             x: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    coordinate_y: { 
             p_id: 'object_id',
             y: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    arc_rules: { 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_circle: { 
             p_id: 'object_id', 
             c_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_ellipse: { 
             p_id: 'object_id', 
             e_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_hyperbolic_arc: { 
             p_id: 'object_id', 
             e_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_parabolic_arc: { 
             p_id: 'object_id', 
             e_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_bspline: { 
             p_id: 'object_id', 
             b_id: 'object_id',
             pointparam: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    arc_of_ellipse_rules: { 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    curve_value: { 
             p_id: 'object_id', 
             a_id: 'object_id',
             u: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    arc_of_hyperbola_rules: { 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    arc_of_parabola_rules: { 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    point_on_arc: { 
             p_id: 'object_id', 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    perpendicular_line2arc: { 
             p1_id: 'object_id', 
             p2_id: 'object_id', 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    perpendicular_arc2line: { 
             a_id: 'object_id', 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    perpendicular_circle2arc: { 
             center_id: 'object_id',
             radius: 'object_param_or_number', 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    perpendicular_arc2circle: { 
             a_id: 'object_id', 
             center_id: 'object_id',
             radius: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    perpendicular_arc2arc: { 
             a1_id: 'object_id',
            reverse1: 'primitive_type', 
             a2_id: 'object_id',
            reverse2: 'primitive_type',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_lc: { 
             l_id: 'object_id', 
             c_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_le: { 
             l_id: 'object_id', 
             e_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_la: { 
             l_id: 'object_id', 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_cc: { 
             c1_id: 'object_id', 
             c2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_aa: { 
             a1_id: 'object_id', 
             a2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    tangent_ca: { 
             c_id: 'object_id', 
             a_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    circle_radius: { 
             c_id: 'object_id',
             radius: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    arc_radius: { 
             a_id: 'object_id',
             radius: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    circle_diameter: { 
             c_id: 'object_id',
             diameter: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    arc_diameter: { 
             a_id: 'object_id',
             diameter: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    equal_length: { 
             l1_id: 'object_id', 
             l2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    equal_radius_cc: { 
             c1_id: 'object_id', 
             c2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    equal_radii_ee: { 
             e1_id: 'object_id', 
             e2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    equal_radii_ahah: { 
             a1_id: 'object_id', 
             a2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    equal_radius_ca: { 
             c1_id: 'object_id', 
             a2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    equal_radius_aa: { 
             a1_id: 'object_id', 
             a2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    equal_focus: { 
             a1_id: 'object_id', 
             a2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2p_symmetric_ppl: { 
             p1_id: 'object_id', 
             p2_id: 'object_id', 
             l_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2p_symmetric_ppp: { 
             p1_id: 'object_id', 
             p2_id: 'object_id', 
             p_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    snells_law: { 
             ray1_id: 'object_id', 
             ray2_id: 'object_id', 
             boundary_id: 'object_id', 
            p_id: 'object_id',
             n1: 'object_param_or_number',
             n2: 'object_param_or_number',
            flipn1: 'primitive_type',
            flipn2: 'primitive_type',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    c2cdistance: { 
             c1_id: 'object_id', 
             c2_id: 'object_id',
             dist: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    c2ldistance: { 
             c_id: 'object_id', 
             l_id: 'object_id',
             dist: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    p2cdistance: { 
             p_id: 'object_id', 
             c_id: 'object_id',
             distance: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    arc_length: { 
             a_id: 'object_id',
             dist: 'object_param_or_number',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_point2ellipse: { 
             e_id: 'object_id', 
             p1_id: 'object_id',
            alignmentType: 'primitive_type',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_ellipse_major_diameter: { 
             e_id: 'object_id', 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_ellipse_minor_diameter: { 
             e_id: 'object_id', 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_ellipse_focus1: { 
             e_id: 'object_id', 
             p1_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_ellipse_focus2: { 
             e_id: 'object_id', 
             p1_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_point2hyperbola: { 
             e_id: 'object_id', 
             p1_id: 'object_id',
            alignmentType: 'primitive_type',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_hyperbola_major_diameter: { 
             e_id: 'object_id', 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_hyperbola_minor_diameter: { 
             e_id: 'object_id', 
             p1_id: 'object_id', 
             p2_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_hyperbola_focus: { 
             e_id: 'object_id', 
             p1_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_parabola_focus: { 
             e_id: 'object_id', 
             p1_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_bspline_control_point: { 
             b_id: 'object_id', 
             c_id: 'object_id', 
            poleindex_id: 'object_id',
            tag: 'primitive_type',
            driving: 'primitive_type',
    },
    internal_alignment_knot_point: { 
             b_id: 'object_id', 
             p_id: 'object_id', 
            knotindex_id: 'object_id',
            tagId: 'primitive_type',
            driving: 'primitive_type',
    },
}
