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 }