1 #define DWG_TYPE DWG_TYPE_GEODATA
2 #include "common.c"
3
4 void
5 api_process (dwg_object *obj)
6 {
7 int error, isnew;
8 BITCODE_BL i;
9 BITCODE_BL class_version;
10 BITCODE_H host_block;
11 BITCODE_BS coord_type; /* 0 unknown, 1 local grid, 2 projected grid,
12 3 geographic defined by latitude/longitude) */
13 BITCODE_3BD design_pt;
14 BITCODE_3BD ref_pt;
15 BITCODE_2RD ref_pt2d; // x reversed with y
16 BITCODE_3BD obs_pt;
17 BITCODE_BD unit_scale_horiz;
18 BITCODE_BL units_value_horiz;
19 BITCODE_BD unit_scale_vert;
20 BITCODE_BL units_value_vert;
21 BITCODE_3BD up_dir;
22 BITCODE_2RD north_dir;
23 BITCODE_BL scale_est; /* None = 1, User specified scale factor = 2,
24 Grid scale at reference point = 3, Prismodial = 4 */
25 BITCODE_BD user_scale_factor;
26 BITCODE_B do_sea_level_corr;
27 BITCODE_BD sea_level_elev;
28 BITCODE_BD coord_proj_radius;
29 BITCODE_T coord_system_def;
30 BITCODE_T geo_rss_tag;
31 BITCODE_T coord_system_datum; /* obsolete */
32 BITCODE_T coord_system_wkt; /* obsolete */
33 BITCODE_T observation_from_tag;
34 BITCODE_T observation_to_tag;
35 BITCODE_T observation_coverage_tag;
36 BITCODE_BL num_geomesh_pts;
37 Dwg_GEODATA_meshpt *geomesh_pts;
38 BITCODE_BL num_geomesh_faces;
39 Dwg_GEODATA_meshface *geomesh_faces;
40 BITCODE_B has_civil_data;
41 BITCODE_B obsolete_false;
42 BITCODE_3BD zero1, zero2;
43 BITCODE_BL unknown1;
44 BITCODE_BL unknown2;
45 BITCODE_B unknown_b;
46 BITCODE_BD north_dir_angle_deg;
47 BITCODE_BD north_dir_angle_rad;
48
49 Dwg_Version_Type dwg_version = obj->parent->header.version;
50 dwg_obj_geodata *geodata = dwg_object_to_GEODATA (obj);
51
52 CHK_ENTITY_TYPE (geodata, GEODATA, class_version, BL);
53 CHK_ENTITY_MAX (geodata, GEODATA, class_version, BL, 3);
54 CHK_ENTITY_H (geodata, GEODATA, host_block);
55 CHK_ENTITY_TYPE (geodata, GEODATA, coord_type, BS);
56 /* 0 unknown, 1 local grid, 2 projected grid,
57 3 geographic defined by latitude/longitude) */
58 CHK_ENTITY_MAX (geodata, GEODATA, coord_type, BS, 3);
59 CHK_ENTITY_3RD (geodata, GEODATA, design_pt);
60 CHK_ENTITY_3RD (geodata, GEODATA, ref_pt);
61 CHK_ENTITY_3RD (geodata, GEODATA, obs_pt);
62 CHK_ENTITY_TYPE (geodata, GEODATA, unit_scale_horiz, BD);
63 CHK_ENTITY_3RD (geodata, GEODATA, up_dir);
64 CHK_ENTITY_2RD (geodata, GEODATA, north_dir);
65 CHK_ENTITY_TYPE (geodata, GEODATA, scale_est, BL);
66 /* None = 1, User specified scale factor = 2,
67 Grid scale at reference point = 3, Prismodial = 4 */
68 CHK_ENTITY_MAX (geodata, GEODATA, scale_est, BL, 4);
69 CHK_ENTITY_TYPE (geodata, GEODATA, user_scale_factor, BD);
70 CHK_ENTITY_TYPE (geodata, GEODATA, do_sea_level_corr, B);
71 CHK_ENTITY_TYPE (geodata, GEODATA, sea_level_elev, BD);
72 CHK_ENTITY_TYPE (geodata, GEODATA, coord_proj_radius, BD);
73 CHK_ENTITY_UTF8TEXT (geodata, GEODATA, coord_system_def);
74 CHK_ENTITY_UTF8TEXT (geodata, GEODATA, geo_rss_tag);
75
76 if (class_version >= 2)
77 {
78 CHK_ENTITY_TYPE (geodata, GEODATA, unit_scale_vert, BD);
79 CHK_ENTITY_TYPE (geodata, GEODATA, units_value_vert, BL);
80 }
81 else
82 {
83 CHK_ENTITY_TYPE (geodata, GEODATA, units_value_horiz, BL);
84 CHK_ENTITY_MAX (geodata, GEODATA, units_value_horiz, BL, 6);
85 CHK_ENTITY_UTF8TEXT (geodata, GEODATA, coord_system_datum); // obsolete
86 CHK_ENTITY_UTF8TEXT (geodata, GEODATA, coord_system_wkt); // obsolete
87 CHK_ENTITY_TYPE (geodata, GEODATA, has_civil_data, B);
88 CHK_ENTITY_TYPE (geodata, GEODATA, obsolete_false, B);
89 CHK_ENTITY_TYPE (geodata, GEODATA, north_dir_angle_deg, BD);
90 CHK_ENTITY_MAX (geodata, GEODATA, north_dir_angle_deg, BD, 360.0);
91 CHK_ENTITY_TYPE (geodata, GEODATA, north_dir_angle_rad, BD);
92 CHK_ENTITY_MAX (geodata, GEODATA, north_dir_angle_rad, BD, MAX_ANGLE);
93 }
94
95 CHK_ENTITY_UTF8TEXT (geodata, GEODATA, observation_from_tag);
96 CHK_ENTITY_UTF8TEXT (geodata, GEODATA, observation_to_tag);
97 CHK_ENTITY_UTF8TEXT (geodata, GEODATA, observation_coverage_tag);
98 CHK_ENTITY_TYPE (geodata, GEODATA, num_geomesh_pts, BL);
99 if (!dwg_dynapi_entity_value (geodata, "GEODATA", "geomesh_pts",
100 &geomesh_pts, NULL))
101 fail ("GEODATA.geomesh_pts");
102 if (num_geomesh_pts)
103 {
104 if (!geomesh_pts)
105 fail ("HATCH.geomesh_pts");
106 else
107 for (i = 0; i < num_geomesh_pts; i++)
108 {
109 CHK_SUBCLASS_2RD (geomesh_pts[i], GEODATA_meshpt, source_pt);
110 CHK_SUBCLASS_2RD (geomesh_pts[i], GEODATA_meshpt, dest_pt);
111 }
112 }
113 CHK_ENTITY_TYPE (geodata, GEODATA, num_geomesh_faces, BL);
114 if (!dwg_dynapi_entity_value (geodata, "GEODATA", "geomesh_faces",
115 &geomesh_faces, NULL))
116 fail ("GEODATA.geomesh_faces");
117 if (num_geomesh_faces)
118 {
119 if (!geomesh_faces)
120 fail ("HATCH.geomesh_faces");
121 else
122 for (i = 0; i < num_geomesh_faces; i++)
123 {
124 CHK_SUBCLASS_TYPE (geomesh_faces[i], GEODATA_meshface, face1, BL);
125 CHK_SUBCLASS_TYPE (geomesh_faces[i], GEODATA_meshface, face2, BL);
126 CHK_SUBCLASS_TYPE (geomesh_faces[i], GEODATA_meshface, face3, BL);
127 }
128 }
129
130 UNTIL (R_2007)
131 {
132 CHK_ENTITY_TYPE (geodata, GEODATA, has_civil_data, B);
133 CHK_ENTITY_TYPE (geodata, GEODATA, obsolete_false, B);
134 CHK_ENTITY_2RD (geodata, GEODATA, ref_pt2d);
135 CHK_ENTITY_TYPE (geodata, GEODATA, unknown1, BL);
136 CHK_ENTITY_TYPE (geodata, GEODATA, unknown2, BL);
137 CHK_ENTITY_3RD (geodata, GEODATA, zero1);
138 CHK_ENTITY_3RD (geodata, GEODATA, zero2);
139 CHK_ENTITY_TYPE (geodata, GEODATA, unknown_b, B);
140 CHK_ENTITY_TYPE (geodata, GEODATA, north_dir_angle_deg, BD);
141 CHK_ENTITY_TYPE (geodata, GEODATA, north_dir_angle_rad, BD);
142 CHK_ENTITY_TYPE (geodata, GEODATA, scale_est, BL);
143 CHK_ENTITY_TYPE (geodata, GEODATA, user_scale_factor, BD);
144 CHK_ENTITY_TYPE (geodata, GEODATA, do_sea_level_corr, B);
145 CHK_ENTITY_TYPE (geodata, GEODATA, sea_level_elev, BD);
146 CHK_ENTITY_TYPE (geodata, GEODATA, coord_proj_radius, BD);
147 }
148 }