00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "xFileDataObject.h"
00016 #include "xFileTemplate.h"
00017 #include "xFile.h"
00018 #include "xFileDataNodeTemplate.h"
00019 #include "xFileDataObjectInteger.h"
00020 #include "xFileDataObjectDouble.h"
00021 #include "xFileDataObjectString.h"
00022 #include "config_xfile.h"
00023 #include "indent.h"
00024
00025 TypeHandle XFileDataObject::_type_handle;
00026
00027
00028
00029
00030
00031
00032 XFileDataObject::
00033 ~XFileDataObject() {
00034 }
00035
00036
00037
00038
00039
00040
00041
00042
00043 bool XFileDataObject::
00044 is_complex_object() const {
00045 return false;
00046 }
00047
00048
00049
00050
00051
00052
00053
00054 string XFileDataObject::
00055 get_type_name() const {
00056 return get_type().get_name();
00057 }
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067 XFileDataObject &XFileDataObject::
00068 add_int(int int_value) {
00069 XFileDataObject *object =
00070 new XFileDataObjectInteger(get_data_def(), int_value);
00071 add_element(object);
00072 return *object;
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 XFileDataObject &XFileDataObject::
00084 add_double(double double_value) {
00085 XFileDataObject *object =
00086 new XFileDataObjectDouble(get_data_def(), double_value);
00087 add_element(object);
00088 return *object;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 XFileDataObject &XFileDataObject::
00100 add_string(const string &string_value) {
00101 XFileDataObject *object =
00102 new XFileDataObjectString(get_data_def(), string_value);
00103 add_element(object);
00104 return *object;
00105 }
00106
00107
00108
00109
00110
00111
00112 XFileDataObject &XFileDataObject::
00113 add_Vector(XFile *x_file, const LVecBase3d &vector) {
00114 XFileTemplate *xtemplate = XFile::find_standard_template("Vector");
00115 nassertr(xtemplate != (XFileTemplate *)NULL, *this);
00116 XFileDataNodeTemplate *node =
00117 new XFileDataNodeTemplate(x_file, "", xtemplate);
00118 add_element(node);
00119 node->zero_fill();
00120
00121 node->set(vector);
00122
00123 return *node;
00124 }
00125
00126
00127
00128
00129
00130
00131 XFileDataObject &XFileDataObject::
00132 add_MeshFace(XFile *x_file) {
00133 XFileTemplate *xtemplate = XFile::find_standard_template("MeshFace");
00134 nassertr(xtemplate != (XFileTemplate *)NULL, *this);
00135 XFileDataNodeTemplate *node =
00136 new XFileDataNodeTemplate(x_file, "", xtemplate);
00137 add_element(node);
00138 node->zero_fill();
00139
00140 return *node;
00141 }
00142
00143
00144
00145
00146
00147
00148 XFileDataObject &XFileDataObject::
00149 add_IndexedColor(XFile *x_file, int index, const LColor &color) {
00150 XFileTemplate *xtemplate = XFile::find_standard_template("IndexedColor");
00151 nassertr(xtemplate != (XFileTemplate *)NULL, *this);
00152 XFileDataNodeTemplate *node =
00153 new XFileDataNodeTemplate(x_file, "", xtemplate);
00154 add_element(node);
00155 node->zero_fill();
00156
00157 (*node)["index"] = index;
00158 (*node)["indexColor"] = LCAST(double, color);
00159
00160 return *node;
00161 }
00162
00163
00164
00165
00166
00167
00168 XFileDataObject &XFileDataObject::
00169 add_Coords2d(XFile *x_file, const LVecBase2d &coords) {
00170 XFileTemplate *xtemplate = XFile::find_standard_template("Coords2d");
00171 nassertr(xtemplate != (XFileTemplate *)NULL, *this);
00172 XFileDataNodeTemplate *node =
00173 new XFileDataNodeTemplate(x_file, "", xtemplate);
00174 add_element(node);
00175 node->zero_fill();
00176
00177 node->set(coords);
00178
00179 return *node;
00180 }
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190 bool XFileDataObject::
00191 add_element(XFileDataObject *element) {
00192 return false;
00193 }
00194
00195
00196
00197
00198
00199
00200
00201 void XFileDataObject::
00202 output_data(ostream &out) const {
00203 out << "(" << get_type() << "::output_data() not implemented.)";
00204 }
00205
00206
00207
00208
00209
00210
00211
00212 void XFileDataObject::
00213 write_data(ostream &out, int indent_level, const char *) const {
00214 indent(out, indent_level)
00215 << "(" << get_type() << "::write_data() not implemented.)\n";
00216 }
00217
00218
00219
00220
00221
00222
00223
00224 void XFileDataObject::
00225 set_int_value(int int_value) {
00226 xfile_cat.error()
00227 << get_type_name() << " does not support integer values.\n";
00228 }
00229
00230
00231
00232
00233
00234
00235
00236 void XFileDataObject::
00237 set_double_value(double double_value) {
00238 xfile_cat.error()
00239 << get_type_name() << " does not support floating-point values.\n";
00240 }
00241
00242
00243
00244
00245
00246
00247
00248 void XFileDataObject::
00249 set_string_value(const string &string_value) {
00250 xfile_cat.error()
00251 << get_type_name() << " does not support string values.\n";
00252 }
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 void XFileDataObject::
00263 store_double_array(int num_elements, const double *values) {
00264 if (get_num_elements() != num_elements) {
00265 xfile_cat.error()
00266 << get_type_name() << " does not accept "
00267 << num_elements << " values.\n";
00268 return;
00269 }
00270
00271 for (int i = 0; i < num_elements; i++) {
00272 get_element(i)->set_double_value(values[i]);
00273 }
00274 }
00275
00276
00277
00278
00279
00280
00281
00282
00283 int XFileDataObject::
00284 get_int_value() const {
00285 return 0;
00286 }
00287
00288
00289
00290
00291
00292
00293
00294 double XFileDataObject::
00295 get_double_value() const {
00296 return 0.0;
00297 }
00298
00299
00300
00301
00302
00303
00304
00305 string XFileDataObject::
00306 get_string_value() const {
00307 return string();
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318 void XFileDataObject::
00319 get_double_array(int num_elements, double *values) const {
00320 if (get_num_elements() != num_elements) {
00321 xfile_cat.error()
00322 << get_type_name() << " does not contain "
00323 << num_elements << " values.\n";
00324 return;
00325 }
00326
00327 for (int i = 0; i < num_elements; i++) {
00328 values[i] = ((XFileDataObject *)this)->get_element(i)->get_double_value();
00329 }
00330 }
00331
00332
00333
00334
00335
00336
00337
00338
00339 int XFileDataObject::
00340 get_num_elements() const {
00341 return 0;
00342 }
00343
00344
00345
00346
00347
00348
00349
00350 XFileDataObject *XFileDataObject::
00351 get_element(int n) {
00352 xfile_cat.warning()
00353 << "Looking for [" << n << "] within data object of type "
00354 << get_type_name() << ", does not support nested objects.\n";
00355 return NULL;
00356 }
00357
00358
00359
00360
00361
00362
00363
00364 XFileDataObject *XFileDataObject::
00365 get_element(const string &name) {
00366 xfile_cat.warning()
00367 << "Looking for [\"" << name << "\"] within data object of type "
00368 << get_type_name() << ", does not support nested objects.\n";
00369 return NULL;
00370 }