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