1 /* $NoKeywords: $ */
2 /*
3 //
4 // Copyright (c) 1993-2012 Robert McNeel & Associates. All rights reserved.
5 // OpenNURBS, Rhinoceros, and Rhino3D are registered trademarks of Robert
6 // McNeel & Associates.
7 //
8 // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT EXPRESS OR IMPLIED WARRANTY.
9 // ALL IMPLIED WARRANTIES OF FITNESS FOR ANY PARTICULAR PURPOSE AND OF
10 // MERCHANTABILITY ARE HEREBY DISCLAIMED.
11 //
12 // For complete openNURBS copyright information see <http://www.opennurbs.org>.
13 //
14 ////////////////////////////////////////////////////////////////
15 */
16 
17 
18 #if !defined(OPENNURBS_EXTENSIONS_INC_)
19 #define OPENNURBS_EXTENSIONS_INC_
20 
21 #include <pcl/pcl_exports.h>
22 
23 /*
24 Description:
25   Used to store user data information in an ONX_Model.
26 */
27 class PCL_EXPORTS ON_CLASS ONX_Model_UserData
28 {
29 public:
30 #if defined(ON_DLL_EXPORTS) || defined(ON_DLL_IMPORTS)
31   // See comments at the top of opennurbs_extensions.cpp for details.
32 
33   // new/delete
34   void* operator new(std::size_t);
35   void  operator delete(void*);
36 
37   // array new/delete
38   void* operator new[] (std::size_t);
39   void  operator delete[] (void*);
40 
41   // in place new/delete
42   void* operator new(std::size_t,void*);
43   void  operator delete(void*,void*);
44 #endif
45 
46   ONX_Model_UserData();
47   ~ONX_Model_UserData();
48   ONX_Model_UserData(const ONX_Model_UserData&);
49   ONX_Model_UserData& operator=(const ONX_Model_UserData&);
50 
51   void Dump( ON_TextLog& ) const;
52 
53   ON_UUID  m_uuid;
54   ON_3dmGoo m_goo;
55 
56 private:
57   void Destroy();
58   unsigned int* m_ref_count; // reference counts used to avoid expensive object copying
59 
60 public:
61   int m_usertable_3dm_version ;
62   int m_usertable_opennurbs_version;
63 };
64 
65 /*
66 Description:
67   Used to store geometry table object definition and attributes in an ONX_Model.
68 */
69 class PCL_EXPORTS ON_CLASS ONX_Model_Object
70 {
71 public:
72 #if defined(ON_DLL_EXPORTS) || defined(ON_DLL_IMPORTS)
73   // See comments at the top of opennurbs_extensions.cpp for details.
74 
75   // new/delete
76   void* operator new(std::size_t);
77   void  operator delete(void*);
78 
79   // array new/delete
80   void* operator new[] (std::size_t);
81   void  operator delete[] (void*);
82 
83   // in place new/delete
84   void* operator new(std::size_t,void*);
85   void  operator delete(void*,void*);
86 #endif
87 
88   ONX_Model_Object();
89   ~ONX_Model_Object();
90   ONX_Model_Object(const ONX_Model_Object&);
91   ONX_Model_Object& operator=(const ONX_Model_Object&);
92 
93   void Dump( ON_TextLog& ) const;
94 
95   // If m_bDeleteObject is true, then m_object will be deleted when
96   // the last ONX_Model_Object that refers to it is destroyed.  The
97   // default value of m_bDeleteObject is false.
98   bool m_bDeleteObject;
99   const ON_Object* m_object;
100   ON_3dmObjectAttributes m_attributes;
101 
102 private:
103   void Destroy();
104   unsigned int* m_ref_count; // reference counts used to avoid expensive object copying
105 };
106 
107 /*
108 Description:
109   Used to store render light table light definition and attributes in an ONX_Model.
110 */
111 class PCL_EXPORTS ON_CLASS ONX_Model_RenderLight
112 {
113 public:
114 #if defined(ON_DLL_EXPORTS) || defined(ON_DLL_IMPORTS)
115   // See comments at the top of opennurbs_extensions.cpp for details.
116 
117   // new/delete
118   void* operator new(std::size_t);
119   void  operator delete(void*);
120 
121   // array new/delete
122   void* operator new[] (std::size_t);
123   void  operator delete[] (void*);
124 
125   // in place new/delete
126   void* operator new(std::size_t,void*);
127   void  operator delete(void*,void*);
128 #endif
129 
130   ONX_Model_RenderLight();
131   ~ONX_Model_RenderLight();
132   ONX_Model_RenderLight(const ONX_Model_RenderLight&);
133   ONX_Model_RenderLight& operator=(const ONX_Model_RenderLight&);
134 
135   ON_Light m_light;
136   ON_3dmObjectAttributes m_attributes;
137 };
138 
139 #if defined(ON_DLL_TEMPLATE)
140 // This stuff is here because of a limitation in the way Microsoft
141 // handles templates and DLLs.  See Microsoft's knowledge base
142 // article ID Q168958 for details.
143 #pragma warning( push )
144 #pragma warning( disable : 4231 )
145 
146 ON_DLL_TEMPLATE template class ON_CLASS ON_SimpleArray<ON_Bitmap*>;
147 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_Linetype>;
148 ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_Linetype>;
149 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_Layer>;
150 ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_Layer>;
151 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_Group>;
152 ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_Group>;
153 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_Font>;
154 ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_Font>;
155 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_DimStyle>;
156 ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_DimStyle>;
157 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ONX_Model_RenderLight>;
158 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_HatchPattern>;
159 ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_HatchPattern>;
160 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ON_InstanceDefinition>;
161 ON_DLL_TEMPLATE template class ON_CLASS ON_ObjectArray<ON_InstanceDefinition>;
162 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ONX_Model_Object>;
163 ON_DLL_TEMPLATE template class ON_CLASS ON_ClassArray<ONX_Model_UserData>;
164 ON_DLL_TEMPLATE template class ON_CLASS ON_SimpleArray<ON_HistoryRecord*>;
165 
166 #pragma warning( pop )
167 #endif
168 
169 
170 /*
171 Description:
172   Pedegodgical example of all the things in an OpenNURBS 3dm archive.
173   The openNURBS examples use ONX_Model to store the information
174   read from 3dm archives.  Please study example_read.cpp for
175   details.
176 */
177 class PCL_EXPORTS ON_CLASS ONX_Model
178 {
179 public:
180 #if defined(ON_DLL_EXPORTS) || defined(ON_DLL_IMPORTS)
181   // See comments at the top of opennurbs_extensions.cpp for details.
182 
183   // new/delete
184   void* operator new(std::size_t);
185   void  operator delete(void*);
186 
187   // array new/delete
188   void* operator new[] (std::size_t);
189   void  operator delete[] (void*);
190 
191   // in place new/delete
192   void* operator new(std::size_t,void*);
193   void  operator delete(void*,void*);
194 #endif
195 
196   ONX_Model();
197   virtual ~ONX_Model();
198 
199   /*
200   Description:
201     Destroys contents of this model and leaves it ready to be reused.
202   */
203   void Destroy();
204 
205   /*
206   Description:
207     Reads an openNURBS archive and saves the information in this model
208   Parameters:
209     archive - [in] archive to read from
210     error_log - [out] any archive reading errors are logged here.
211   Returns:
212     true if archive is read with no error.  False if errors occur.
213     Error details are logged in error_log.  If crc errors are in
214     the archive, then m_crc_error_count is set to the number of
215     errors.
216   Example:
217 
218             // for ASCII file names
219             const char* sFileName = ....;
220             FILE* fp = ON::OpenFile( sFileName, "rb");
221 
222             // for UNICODE file names
223             const wchar_t* wsFileName = ....;
224             FILE* fp = ON::OpenFile( wsFileName, L"rb");
225 
226             bool bModelRead = false;
227             bool bModelIsValid = false;
228 
229             ON_TextLog error_log;
230             ONX_Model model;
231 
232             if ( 0 != fp )
233             {
234               ON_BinaryFile archive( ON::read3dm, fp );
235               bModelRead = model.read( archive, error_log );
236               ON::CloseFile( fp );
237             }
238 
239             if ( bModelRead )
240             {
241               bModelIsValid = model.Validate(error_log);
242             }
243 
244   See Also:
245     ONX_Model::IsValid
246     ONX_Model::Write
247     ONX_Model::m_crc_error_count
248   */
249   bool Read(
250          ON_BinaryArchive& archive,
251          ON_TextLog* error_log = NULL
252          );
253 
254   bool Read(
255          const char* filename,
256          ON_TextLog* error_log = NULL
257          );
258 
259   bool Read(
260          const wchar_t* filename,
261          ON_TextLog* error_log = NULL
262          );
263 
264   /*
265   Description:
266     Writes contents of this model to an openNURBS archive.
267     It is a good practice to call Polish() before calling
268     Write so that your file has all the "fluff" that makes it
269     complete.  If the model is not valid, then Write will refuse
270     to write it.
271 
272   Parameters:
273     archive - [in]
274       archive to write to
275 
276     version - [in]
277       Version of the openNURBS archive to write.
278         0 default value and suggested.
279            When 0 is passed in, the value of ON_BinaryArchive::CurrentArchiveVersion()
280            is used.
281         2, 3, 4
282           If you pass in one of these values, some information
283           in current data structures will not be saved in the
284           file.
285           Rhino 2.x can read version 2 files.
286           Rhino 3.x can read version 2 and 3 files.
287           Rhino 4.x can read version 2, 3 and 4 files.
288           Rhino 5.x can read version 2, 3, 4, 5 and 50 files.
289           Rhino 5.x writes version 50 files.
290 
291     sStartSectionComment - [in]
292       Brief desciption of your app, today's date, etc.
293 
294     error_log - [out]
295       any archive writing errors are logged here.
296 
297   Returns:
298     True if archive is written with no error.
299     False if errors occur.
300     Error details are logged in error_log.
301 
302   Example:
303 
304             model = ...;
305 
306             model.Polish(); // fill in defaults as needed.
307 
308             ON_TextLog error_log;
309             if ( !model.IsValid( error_log ) )
310             {
311               // try to repair the model
312               model.Audit(true);
313             }
314 
315             if ( model.IsValid( error_log ) )
316             {
317 
318               // for ASCII file names
319               const char* sFileName = ....;
320               FILE* fp = ON::OpenFile( sFileName, "wb");
321 
322               // for UNICODE file names
323               const wchar_t* wsFileName = ....;
324               FILE* fp = ON::OpenFile( wsFileName, L"wb");
325 
326               bool ok = false;
327               if ( 0 != fp )
328               {
329                 const char* sStartSectionComment = "...";
330                 int version = 5; // 2, 3, 4 or 5 are valid
331                 ON_BinaryFile archive( ON::write3dm, fp );
332                 ok = model.write( archive,
333                                   version,
334                                   sStartSectionComment,
335                                   error_log );
336                 ON::CloseFile( fp );
337               }
338            }
339 
340   See Also:
341     ONX_Model::Polish
342     ONX_Model::IsValid
343     ONX_Model::Read
344   */
345   bool Write(
346          ON_BinaryArchive& archive,
347          int version = 0,
348          const char* sStartSectionComment = NULL,
349          ON_TextLog* error_log = NULL
350          );
351 
352   bool Write(
353          const char* filename,
354          int version = 0,
355          const char* sStartSectionComment = NULL,
356          ON_TextLog* error_log = NULL
357          );
358 
359   bool Write(
360          const wchar_t* filename,
361          int version = 0,
362          const char* sStartSectionComment = NULL,
363          ON_TextLog* error_log = NULL
364          );
365 
366   /*
367   Description:
368     Check a model to make sure it is valid.
369   Parameters:
370     text_log - [in] if not NULL and errors are found,
371                     a description of the problem is put in
372                     this text_log.
373   Returns:
374     True if the model is valid.
375   */
376   bool IsValid( ON_TextLog* text_log = NULL ) const;
377 
378   /*
379   Description:
380     Quickly fills in the little details, like making sure there is
381     at least one layer and table indices make sense.
382     For a full blown check and repair, call Audit(true).
383   See Also:
384     ONX_Model::Audit
385   */
386   virtual
387   void Polish();
388 
389   /*
390   Description:
391     Check a model to make sure it is valid and, if possible
392     and requrested, attempt to repair.
393   Parameters:
394     bAttemptRepair - [in] if true and a problem is found,
395          the problem is repaired.
396     repair_count - [out] number of successful repairs.
397     text_log - [in] if not NULL and errors are found,
398                     a description of the problem is put in
399                     this text_log.
400     warnings - [out]
401         If problems were found, warning ids are appended to this list.
402           @untitled table
403            1      m_material_table[] flaws
404            2      layer table is not perfect.
405            3      some m_object_table[].m_attributes.m_uuid was nil or not unique.
406            4      some m_object_table[].IsValid() is false
407            5      some m_idef_table[] has an invalid or duplicate name
408            6      warning some m_idef_table[].m_object_uuid[] is not valid
409            7      warning some m_object_table[].m_object is null
410            8      warning some m_object_table[].m_object->IsValid() is false
411            9      warning some m_object_table[].m_attributes is not valid
412           10      linetype table is not perfect.
413           11      lineset table is not perfect.
414           12      some m_idef_table[].m_uuid was nil or not unique.
415           13      some m_texture_mapping_table[i].m_mapping_id was nil or not unique.
416           14      some m_material_table[i].m_material_id was nil or not unique.
417           15      some m_light_table[i].m_light_id was nil or not unique.
418   Returns:
419     True if model is valid and false if the model has serious
420     @untitled table
421     <0      model has serious errors
422     =0      model is ok
423     >0      number of problems that were found.
424   */
425   virtual
426   int Audit(
427         bool bAttemptRepair,
428         int* repair_count,
429         ON_TextLog* text_log,
430         ON_SimpleArray<int>* warnings
431         );
432 
433   /////////////////////////////////////////////////////////////////////
434   //
435   // BEGIN model definitions
436   //
437 
438   // start section information
439   int m_3dm_file_version;
440   int m_3dm_opennurbs_version;
441   ON_String m_sStartSectionComments;
442 
443   // Properties include revision history, notes, information about
444   // the applicaton that created the file, and an option preview image.
445   ON_3dmProperties m_properties;
446 
447   // Settings include tolerance, and unit system, and defaults used
448   // for creating views and objects.
449   ON_3dmSettings   m_settings;
450 
451   // Tables in an openNURBS archive
452   ON_SimpleArray<ON_Bitmap*>            m_bitmap_table;
453   ON_ObjectArray<ON_TextureMapping>     m_mapping_table;
454   ON_ObjectArray<ON_Material>           m_material_table;
455   ON_ObjectArray<ON_Linetype>           m_linetype_table;
456   ON_ObjectArray<ON_Layer>              m_layer_table;
457   ON_ObjectArray<ON_Group>              m_group_table;
458   ON_ObjectArray<ON_Font>               m_font_table;
459   ON_ObjectArray<ON_DimStyle>           m_dimstyle_table;
460   ON_ClassArray<ONX_Model_RenderLight>  m_light_table;
461   ON_ObjectArray<ON_HatchPattern>       m_hatch_pattern_table;
462   ON_ObjectArray<ON_InstanceDefinition> m_idef_table;
463   ON_ClassArray<ONX_Model_Object>       m_object_table;
464   ON_SimpleArray<ON_HistoryRecord*>     m_history_record_table;
465   ON_ClassArray<ONX_Model_UserData>     m_userdata_table;
466 
467   // The id index fields are used to lookup objects by id
468   ON_UuidIndexList m_mapping_id_index;
469   ON_UuidIndexList m_material_id_index;
470   ON_UuidIndexList m_object_id_index;
471   ON_UuidIndexList m_idef_id_index;
472 
473   // length of archive returned by ON_BinaryArchive::Read3dmEndMark()
474   std::size_t m_file_length;
475 
476   // Number of crc errors found during archive reading.
477   // If > 0, then the archive is corrupt.
478   int m_crc_error_count;
479 
480   //
481   // END model definitions
482   //
483   /////////////////////////////////////////////////////////////////////
484 
485   /*
486   Returns:
487     Bounding box of every object in m_object_table[].
488   */
489   ON_BoundingBox BoundingBox() const;
490 
491   /*
492   Description:
493     Get render material from object attributes.
494   Parameters:
495     attributes - [in] object attributes.
496     material - [out] render material
497   */
498   void GetRenderMaterial(
499         const ON_3dmObjectAttributes& attributes,
500         ON_Material& material
501         ) const;
502 
503   /*
504   Description:
505     Get render material from object_index.
506   Parameters:
507     object_index - [in] m_object_table[] index
508     material - [out] render material
509   */
510   void GetRenderMaterial(
511         int object_index,
512         ON_Material& material
513         ) const;
514 
515   /*
516   Description:
517     Get linetype from object attributes.
518   Parameters:
519     attributes - [in] object attributes.
520     linetype - [out] linetype
521   */
522   void GetLinetype(
523         const ON_3dmObjectAttributes& attributes,
524         ON_Linetype& linetype
525         ) const;
526 
527   /*
528   Description:
529     Get linetype from object_index.
530   Parameters:
531     object_index - [in] m_object_table[] index
532     linetype - [out] linetype
533   */
534   void GetLinetype(
535         int object_index,
536         ON_Linetype& linetype
537         ) const;
538 
539   /*
540   Description:
541     Get wireframe drawing color from object attributes.
542   Parameters:
543     attributes - [in] object attributes.
544   Returns:
545     Wireframe drawing color.
546   */
547   ON_Color WireframeColor(const ON_3dmObjectAttributes& attributes) const;
548 
549   /*
550   Description:
551     Get wireframe drawing color from object attributes.
552   Parameters:
553     object_index - [in] m_object_table[] index
554   Returns:
555     Wireframe drawing color.
556   */
557   ON_Color WireframeColor(int object_index) const;
558 
559   /*
560   Description:
561     Get index of object in m_object_table from object_uuid.
562   Parameters:
563     object_uuid - [in] object uuid.
564   Returns:
565     Index of the object or -1 if it is not found.
566   */
567   virtual
568   int ObjectIndex(
569     ON_UUID object_uuid
570     ) const;
571 
572   /*
573   Description:
574     Get instance definition from instance definition table.
575   Parameters:
576     idef_uuid - [in] instance definition uuid.
577   Example:
578 
579           ON_XModel model = ...;
580           ..
581           ON_InstanceRef* pIRef = ..;
582           ON_UUID idef_uuid = pIRef->m_instance_definition_uuid;
583           int idef_index = model.IDefIndex( idef_uuid );
584           if ( idef_index >= 0 )
585           {
586             const ON_InstanceDefinition& idef = model.m_idef_table[idef_index];
587             ...
588           }
589 
590   Returns:
591     Index of the instance definition or -1 if it is not found.
592   */
593   virtual
594   int IDefIndex(
595     ON_UUID idef_uuid
596     ) const;
597 
598   /*
599   Description:
600     Get instance definition index from instance definition name.
601   Parameters:
602     idef_name - [in] name to search for
603   Returns:
604     Index of the instance definition or -1 if it is not found.
605   */
606   virtual
607   int IDefIndex(
608     const wchar_t* idef_name
609     ) const;
610 
611   /*
612   Description:
613     Get instance definition name that is not currently in use.
614   */
615   virtual
616   void GetUnusedIDefName( ON_wString& idef_name ) const;
617 
618   /*
619   Description:
620     See if the instance reference iref refers to an instance
621     definition.
622   Parameters:
623     iref - [in]
624     idef_uuid - [in] id of idef we are looking for
625   Returns:
626     @untitled table
627      0         iref does not use idef
628      1         iref directly references idef
629     >1         iref has a nested reference to idef (nesting depth returned)
630     -1         iref.m_instance_definition_uuid is not valid
631     -2         invalid idef found
632   */
633   virtual
634   int UsesIDef(
635         const ON_InstanceRef& iref,
636         ON_UUID idef_uuid
637         ) const;
638 
639   /*
640   Description:
641     Get layer definition from layer table.
642   Parameters:
643     layer_name - [in] name to search for
644   Example:
645 
646           ON_XModel model = ...;
647           ..
648           ON_InstanceRef* pIRef = ..;
649           ON_UUID idef_uuid = pIRef->m_instance_definition_uuid;
650           int layer_index = model.IDefIndex( idef_uuid );
651           if ( idef_index >= 0 )
652           {
653             const ON_InstanceDefinition& idef = model.m_idef_table[idef_index];
654             ...
655           }
656 
657   Returns:
658     Index of the layer or -1 if it is not found.
659   */
660   virtual
661   int LayerIndex(
662     const wchar_t* layer_name
663     ) const;
664 
665   /*
666   Description:
667     Get layer name that is not currently in use.
668   */
669   virtual
670   void GetUnusedLayerName( ON_wString& layer_name ) const;
671 
672   /////////////////////////////////////////////////////////////////////
673   //
674   // BEGIN model document level user string tools
675   //
676 
677   /*
678   Description:
679     Attach a user string to the document.
680   Parameters:
681     key - [in] id used to retrieve this string.
682     string_value - [in]
683       If NULL, the string with this id will be removed.
684   Returns:
685     True if successful.
686   */
687   bool SetDocumentUserString(
688     const wchar_t* key,
689     const wchar_t* string_value
690     );
691 
692   /*
693   Description:
694     Get user string from the document.
695   Parameters:
696     key - [in] id used to retrieve the string.
697     string_value - [out]
698   Returns:
699     True if a string with id was found.
700   */
701   bool GetDocumentUserString(
702     const wchar_t* key,
703     ON_wString& string_value
704     ) const;
705 
706   /*
707   Description:
708     Get a list of all user strings in the document.
709   Parameters:
710     user_strings - [out]
711       user strings are appended to this list.
712   Returns:
713     Number of elements appended to the user_strings list.
714   */
715   int GetDocumentUserStrings( ON_ClassArray<ON_UserString>& user_strings ) const;
716 
717   //
718   // END model document level user string tools
719   //
720   /////////////////////////////////////////////////////////////////////
721 
722 
723   /////////////////////////////////////////////////////////////////////
724   //
725   // BEGIN model text dump tools
726   //
727 
728   // text dump of entire model
729   void Dump( ON_TextLog& ) const;
730 
731   // text dump of model properties and settings
732   void DumpSummary( ON_TextLog& ) const;
733 
734   // text dump of bitmap table
735   void DumpBitmapTable( ON_TextLog& ) const;
736 
737   // text dump of texture mapping table
738   void DumpTextureMappingTable( ON_TextLog& ) const;
739 
740   // text dump of render material table
741   void DumpMaterialTable( ON_TextLog& ) const;
742 
743   // text dump of line type table
744   void DumpLinetypeTable( ON_TextLog& ) const;
745 
746   // text dump of layer table
747   void DumpLayerTable( ON_TextLog& ) const;
748 
749   // text dump of light table
750   void DumpLightTable( ON_TextLog& ) const;
751 
752   // text dump of group table
753   void DumpGroupTable( ON_TextLog& ) const;
754 
755   // text dump of font table
756   void DumpFontTable( ON_TextLog& ) const;
757 
758   // text dump of dimstyle table
759   void DumpDimStyleTable( ON_TextLog& ) const;
760 
761   // text dump of hatch pattern table
762   void DumpHatchPatternTable( ON_TextLog& ) const;
763 
764   // text dump of instance definition table
765   void DumpIDefTable( ON_TextLog& ) const;
766 
767   // text dump of object table
768   void DumpObjectTable( ON_TextLog& ) const;
769 
770   // text dump of object table
771   void DumpHistoryRecordTable( ON_TextLog& ) const;
772 
773   // text dump of user data table
774   void DumpUserDataTable( ON_TextLog& ) const;
775 
776   //
777   // END model text dump tools
778   //
779   /////////////////////////////////////////////////////////////////////
780 
781   /*
782   Description:
783     Destroys cached searching and bounding box information.  Call
784     if you modify the m_object_table or m_idef_table.
785   */
786   void DestroyCache();
787 
788   /////////////////////////////////////////////////////////////////////
789   //
790   // BEGIN Render Development Toolkit (RDK) information
791   //
792   static bool IsRDKDocumentInformation(const ONX_Model_UserData& docud);
793   static bool GetRDKDocumentInformation(const ONX_Model_UserData& docud,ON_wString& rdk_xml_document_data);
794 
795   static bool IsRDKObjectInformation(const ON_UserData& objectud);
796   static bool GetRDKObjectInformation(const ON_Object& object,ON_wString& rdk_xml_object_data);
797   //
798   // END Render Development Toolkit (RDK) information
799   //
800   /////////////////////////////////////////////////////////////////////
801 
802 
803 private:
804   // prohibit use of copy construction and operator=
805   ONX_Model(const ONX_Model&);
806   ONX_Model& operator=(const ONX_Model&);
807 
808 private:
809 
810   // This bounding box contains all objects in the object table.
811   ON_BoundingBox m__object_table_bbox;
812 };
813 
814 /*
815 Description:
816   Tests a string to see if it is valid as a name for a layer,
817   object, material, linetype, instance definition, etc.
818 Parameters:
819   name - [in] string to test
820 Returns:
821   True if the string is a valid name.
822 */
823 ON_DECL
824 bool ONX_IsValidName(
825           const wchar_t* name
826           );
827 
828 #endif
829