(root)/
libredwg-0.13/
test/
unit-testing/
helix.c
       1  // TODO unstable
       2  #define DWG_TYPE DWG_TYPE_HELIX
       3  #include "common.c"
       4  
       5  void
       6  api_process (dwg_object *obj)
       7  {
       8    int error;
       9    BITCODE_BL i;
      10    // AcDbSpline
      11    BITCODE_BS flag;
      12    BITCODE_BS scenario; /* 1 spline, 2 bezier */
      13    BITCODE_BS degree;
      14    BITCODE_BL splineflags; /* 2013+: method fit points = 1, CV frame show = 2,
      15                               closed = 4 */
      16    BITCODE_BL knotparam;   /* 2013+: Chord = 0, Square root = 1, Uniform = 2,
      17                               Custom = 15 */
      18    BITCODE_BD fit_tol;
      19    BITCODE_3BD beg_tan_vec;
      20    BITCODE_3BD end_tan_vec;
      21    BITCODE_B closed_b; /* bit 1 of 70 */
      22    BITCODE_B periodic; /* bit 2 of 70 */
      23    BITCODE_B rational; /* bit 3 of 70 */
      24    BITCODE_B weighted; /* bit 4 of 70 */
      25    BITCODE_BD knot_tol;
      26    BITCODE_BD ctrl_tol;
      27    BITCODE_BS num_fit_pts;
      28    BITCODE_3DPOINT *fit_pts;
      29    BITCODE_BL num_knots;
      30    BITCODE_BD *knots;
      31    BITCODE_BL num_ctrl_pts;
      32    Dwg_SPLINE_control_point *ctrl_pts;
      33    // AcDbHelix
      34    BITCODE_BL major_version;
      35    BITCODE_BL maint_version;
      36    BITCODE_3BD axis_base_pt;
      37    BITCODE_3BD start_pt;
      38    BITCODE_3BD axis_vector;
      39    BITCODE_BD radius;
      40    BITCODE_BD turns;
      41    BITCODE_BD turn_height;
      42    BITCODE_B handedness;
      43    BITCODE_RC constraint_type;
      44  
      45    Dwg_Version_Type dwg_version = obj->parent->header.version;
      46    dwg_ent_helix *helix = dwg_object_to_HELIX (obj);
      47  
      48    CHK_ENTITY_TYPE (helix, HELIX, flag, BS);
      49    CHK_ENTITY_TYPE (helix, HELIX, scenario, BS);
      50    if (scenario == 0 || scenario > 2)
      51      fail ("Illegal SPLINE.scenario %d", (int)scenario);
      52    CHK_ENTITY_TYPE (helix, HELIX, degree, BS);
      53    CHK_ENTITY_TYPE (helix, HELIX, splineflags, BL);
      54    CHK_ENTITY_TYPE (helix, HELIX, knotparam, BL);
      55    CHK_ENTITY_TYPE (helix, HELIX, fit_tol, BD);
      56    CHK_ENTITY_3RD (helix, HELIX, beg_tan_vec);
      57    CHK_ENTITY_3RD (helix, HELIX, end_tan_vec);
      58    CHK_ENTITY_TYPE (helix, HELIX, rational, B);
      59    CHK_ENTITY_TYPE (helix, HELIX, closed_b, B);
      60    CHK_ENTITY_TYPE (helix, HELIX, periodic, B);
      61    CHK_ENTITY_TYPE (helix, HELIX, weighted, B);
      62    CHK_ENTITY_TYPE (helix, HELIX, knot_tol, BD);
      63    CHK_ENTITY_TYPE (helix, HELIX, ctrl_tol, BD);
      64    CHK_ENTITY_TYPE (helix, HELIX, num_fit_pts, BS);
      65    CHK_ENTITY_TYPE (helix, HELIX, num_knots, BL);
      66    CHK_ENTITY_TYPE (helix, HELIX, num_ctrl_pts, BL);
      67  
      68    if (!dwg_dynapi_entity_value (helix, "HELIX", "fit_pts", &fit_pts, NULL))
      69      fail ("HELIX.fit_pts");
      70    if (!dwg_dynapi_entity_value (helix, "HELIX", "knots", &knots, NULL))
      71      fail ("HELIX.knots");
      72    if (!dwg_dynapi_entity_value (helix, "HELIX", "ctrl_pts", &ctrl_pts, NULL))
      73      fail ("HELIX.ctrl_pts");
      74  
      75    if (scenario == 1)
      76      {
      77        if (num_fit_pts)
      78          fail ("HELIX.num_fit_pts with scenario 1");
      79        for (i = 0; i < num_ctrl_pts; i++)
      80          {
      81            if (i < 10 || i == num_ctrl_pts - 1)
      82              {
      83                if (i == num_ctrl_pts - 1)
      84                  printf ("\n");
      85                CHK_SUBCLASS_TYPE (ctrl_pts[i], SPLINE_control_point, x, BD);
      86                CHK_SUBCLASS_TYPE (ctrl_pts[i], SPLINE_control_point, y, BD);
      87                CHK_SUBCLASS_TYPE (ctrl_pts[i], SPLINE_control_point, z, BD);
      88                CHK_SUBCLASS_TYPE (ctrl_pts[i], SPLINE_control_point, w, BD);
      89              }
      90            else
      91              printf (".");
      92          }
      93        for (i = 0; i < num_knots; i++)
      94          {
      95            double d;
      96            if (i < 10)
      97              ok ("HELIX.knots[%d]: %f", i, knots[i]);
      98            else
      99              {
     100                d = knots[i];
     101                printf (".");
     102              }
     103          }
     104        if (num_knots >= 10)
     105          printf ("\n");
     106      }
     107    else
     108      {
     109        if (num_knots)
     110          fail ("HELIX.num_knots with scenario 2");
     111        if (num_ctrl_pts)
     112          fail ("HELIX.num_ctrl_pts with scenario 2");
     113        for (i = 0; i < num_fit_pts; i++)
     114          {
     115            ok ("HELIX.fit_pts[%d]: (%f, %f, %f)", i, fit_pts[i].x, fit_pts[i].y,
     116                fit_pts[i].z);
     117          }
     118      }
     119  
     120    // AcDbHelix
     121    CHK_ENTITY_TYPE (helix, HELIX, major_version, BL);
     122    CHK_ENTITY_TYPE (helix, HELIX, maint_version, BL);
     123    CHK_ENTITY_3RD (helix, HELIX, axis_base_pt);
     124    CHK_ENTITY_3RD (helix, HELIX, start_pt);
     125    CHK_ENTITY_3RD (helix, HELIX, axis_vector);
     126    CHK_ENTITY_TYPE (helix, HELIX, radius, BD);
     127    CHK_ENTITY_TYPE (helix, HELIX, turns, BD);
     128    CHK_ENTITY_TYPE (helix, HELIX, turn_height, BD);
     129    CHK_ENTITY_TYPE (helix, HELIX, handedness, B);
     130    CHK_ENTITY_TYPE (helix, HELIX, constraint_type, RC);
     131    CHK_ENTITY_MAX (helix, HELIX, constraint_type, RC, 2);
     132  }