(root)/
libredwg-0.13/
test/
unit-testing/
geodata.c
       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  }