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 #include "pcl/surface/3rdparty/opennurbs/opennurbs.h"
18 
19 // Easy way to toggle the name of the obsolete ON_3dmView::m_target
20 // variable when you want to change the name and compile to insure
21 // no rogue code is directly accessing this variable.  See
22 // ON_3dmView header for more comments.
23 //
24 //#define OBSOLETE_3DM_VIEW_TARGET m_target_HIDEME
25 #define OBSOLETE_3DM_VIEW_TARGET m_target
26 
27 //////////////////////////////////////////////////////////////////////////////////////////
28 //
29 // ON_3dmUnitsAndTolerances
30 //
31 
ON_UnitSystem()32 ON_UnitSystem::ON_UnitSystem()
33 {
34   m_unit_system = ON::millimeters;
35   m_custom_unit_scale = 1.0;
36 }
37 
ON_UnitSystem(ON::unit_system us)38 ON_UnitSystem::ON_UnitSystem(ON::unit_system us)
39 {
40   m_unit_system = ON::UnitSystem(us);
41   m_custom_unit_scale = ON::UnitScale(ON::meters,m_unit_system);
42 }
43 
operator =(ON::unit_system us)44 ON_UnitSystem& ON_UnitSystem::operator=(ON::unit_system us)
45 {
46   m_unit_system = ON::UnitSystem(us);
47   if ( ON::custom_unit_system != us )
48   {
49     m_custom_unit_scale = ON::UnitScale(ON::meters,m_unit_system);
50     m_custom_unit_name.Destroy();
51   }
52   return *this;
53 }
54 
operator ==(const ON_UnitSystem & other)55 bool ON_UnitSystem::operator==(const ON_UnitSystem& other)
56 {
57   if ( m_unit_system != other.m_unit_system )
58     return false;
59 
60   if ( ON::custom_unit_system == m_unit_system )
61   {
62     if ( m_custom_unit_name.Compare(other.m_custom_unit_name) )
63       return false;
64     if ( !(m_custom_unit_scale == other.m_custom_unit_scale) )
65       return false;
66   }
67 
68   return true;
69 }
70 
operator !=(const ON_UnitSystem & other)71 bool ON_UnitSystem::operator!=(const ON_UnitSystem& other)
72 {
73   if ( m_unit_system != other.m_unit_system )
74     return true;
75 
76   if ( ON::custom_unit_system == m_unit_system )
77   {
78     if ( m_custom_unit_name.Compare(other.m_custom_unit_name) )
79       return true;
80     if ( m_custom_unit_scale != other.m_custom_unit_scale )
81       return true;
82   }
83 
84   return false;
85 }
86 
~ON_UnitSystem()87 ON_UnitSystem::~ON_UnitSystem()
88 {
89 }
90 
Default()91 void ON_UnitSystem::Default()
92 {
93   m_unit_system = ON::millimeters;
94   m_custom_unit_scale = 1.0;
95   m_custom_unit_name.Destroy();
96 }
97 
IsValid() const98 bool ON_UnitSystem::IsValid() const
99 {
100   if ( m_unit_system != ON::UnitSystem(m_unit_system) )
101   {
102     // bogus enum value
103     return false;
104   }
105 
106   if ( ON::custom_unit_system == m_unit_system )
107   {
108     if ( !ON_IsValid(m_custom_unit_scale) || m_custom_unit_scale <= 0.0 )
109     {
110       // m_custom_unit_scale should be > 0.0 and a valid double
111       return false;
112     }
113   }
114 
115   return true;
116 }
117 
Read(ON_BinaryArchive & file)118 bool ON_UnitSystem::Read( ON_BinaryArchive& file )
119 {
120   Default();
121 
122   int major_version = 0;
123   int minor_version = 0;
124 
125   if ( !file.BeginRead3dmChunk(TCODE_ANONYMOUS_CHUNK,&major_version,&minor_version) )
126     return false;
127 
128   bool rc = (1 == major_version);
129   int i = m_unit_system;
130   if (rc)
131     rc = file.ReadInt( &i );
132   if (rc)
133     m_unit_system = ON::UnitSystem(i);
134   if (rc)
135     rc = file.ReadDouble( &m_custom_unit_scale );
136   if (rc)
137     rc = file.ReadString( m_custom_unit_name );
138 
139   if ( !file.EndRead3dmChunk() )
140     rc = false;
141 
142   return rc;
143 }
144 
Write(ON_BinaryArchive & file) const145 bool ON_UnitSystem::Write( ON_BinaryArchive& file ) const
146 {
147   if ( !file.BeginWrite3dmChunk(TCODE_ANONYMOUS_CHUNK,1,0) )
148     return false;
149 
150 
151   // values saved in the file
152   //no_unit_system =  0,
153   //microns        =  1,  // 1.0e-6 meters
154   //millimeters    =  2,  // 1.0e-3 meters
155   //centimeters    =  3,  // 1.0e-2 meters
156   //meters         =  4,
157   //kilometers     =  5,  // 1.0e+3 meters
158   //microinches    =  6,  // 1.0e-6 inches
159   //mils           =  7,  // 1.0e-3 inches
160   //inches         =  8,  // 0.0254 meters
161   //feet           =  9,  // 12 inches
162   //miles          = 10,  // 63360 inches
163   //custom_unit_system = 11, // x meters with x defined in ON_3dmUnitsAndTolerances.m_custom_unit_scale
164 
165   bool rc = file.WriteInt( m_unit_system );
166   if (rc)
167     rc = file.WriteDouble( m_custom_unit_scale );
168   if (rc)
169     rc = file.WriteString( m_custom_unit_name );
170 
171   if ( !file.EndWrite3dmChunk() )
172     rc = false;
173 
174   return rc;
175 }
176 
Dump(ON_TextLog & dump) const177 void ON_UnitSystem::Dump( ON_TextLog& dump ) const
178 {
179   ON_wString sUnitSystem;
180   switch( m_unit_system )
181   {
182   case ON::no_unit_system:
183     sUnitSystem = "no units";
184     break;
185   case ON::angstroms:
186     sUnitSystem = "angstroms";
187     break;
188   case ON::nanometers:
189     sUnitSystem = "nanometers";
190     break;
191   case ON::microns:
192     sUnitSystem = "microns";
193     break;
194   case ON::millimeters:
195     sUnitSystem = "millimeters";
196     break;
197   case ON::decimeters:
198     sUnitSystem = "decimeters";
199     break;
200   case ON::centimeters:
201     sUnitSystem = "centimeters";
202     break;
203   case ON::meters:
204     sUnitSystem = "meters";
205     break;
206   case ON::dekameters:
207     sUnitSystem = "dekameters";
208     break;
209   case ON::hectometers:
210     sUnitSystem = "hectometers";
211     break;
212   case ON::kilometers:
213     sUnitSystem = "kilometers";
214     break;
215   case ON::megameters:
216     sUnitSystem = "megameters";
217     break;
218   case ON::gigameters:
219     sUnitSystem = "gigameters";
220     break;
221   case ON::microinches:
222     sUnitSystem = "microinches";
223     break;
224   case ON::mils:
225     sUnitSystem = "mils (= 0.001 inches)";
226     break;
227   case ON::inches:
228     sUnitSystem = "inches";
229     break;
230   case ON::feet:
231     sUnitSystem = "feet";
232     break;
233   case ON::yards:
234     sUnitSystem = "yards";
235     break;
236   case ON::miles:
237     sUnitSystem = "miles";
238     break;
239   case ON::printer_point:
240     sUnitSystem = "points (1/72 inch)";
241     break;
242   case ON::printer_pica:
243     sUnitSystem = "picas (1/6 inch)";
244     break;
245   case ON::nautical_mile:
246     sUnitSystem = "nautical miles";
247     break;
248   case ON::astronomical:
249     sUnitSystem = "astronomical units";
250     break;
251   case ON::lightyears:
252     sUnitSystem = "light years";
253     break;
254   case ON::parsecs:
255     sUnitSystem = "parsecs";
256     break;
257 
258   case ON::custom_unit_system:
259     if ( m_custom_unit_name.Length() > 0 )
260     {
261       const wchar_t* wsCustomUnitName = m_custom_unit_name.Array();
262       if ( 0 != wsCustomUnitName && 0 != wsCustomUnitName[0] )
263       {
264         sUnitSystem.Format("%ls (= %g meters)",
265                            wsCustomUnitName,
266                            m_custom_unit_scale);
267       }
268     }
269     else
270       sUnitSystem.Format("user defined unit (= %g meters)",m_custom_unit_scale);
271     break;
272   default:
273     sUnitSystem = "unknown unit system";
274     break;
275   }
276   const wchar_t* wsUnitSystem = sUnitSystem.Array();
277   if ( 0 != wsUnitSystem )
278     dump.Print("Unit system: %ls\n",wsUnitSystem);
279 }
280 
Default()281 void ON_3dmUnitsAndTolerances::Default()
282 {
283   m_unit_system.Default();
284   m_unit_system.m_unit_system = ON::millimeters;
285   m_unit_system.m_custom_unit_name = L"Units";
286   m_absolute_tolerance = 0.001;    // = 0.01;       // Dale Lear: Changed March 2006
287   m_angle_tolerance = ON_PI/180.0; // = ON_PI/60.0; // Dale Lear: Changed 5 April 2006
288   m_relative_tolerance = 0.01;
289 
290   m_distance_display_mode = ON::decimal;
291   m_distance_display_precision = 3;
292 }
293 
ON_3dmUnitsAndTolerances()294 ON_3dmUnitsAndTolerances::ON_3dmUnitsAndTolerances()
295                         : m_absolute_tolerance(0.0),
296                           m_angle_tolerance(0.0),
297                           m_relative_tolerance(0.0),
298                           m_distance_display_mode(ON::decimal),
299                           m_distance_display_precision(3)
300 {
301   Default();
302 }
303 
~ON_3dmUnitsAndTolerances()304 ON_3dmUnitsAndTolerances::~ON_3dmUnitsAndTolerances()
305 {}
306 
ON_3dmUnitsAndTolerances(const ON_3dmUnitsAndTolerances & src)307 ON_3dmUnitsAndTolerances::ON_3dmUnitsAndTolerances(const ON_3dmUnitsAndTolerances& src )
308                         : m_absolute_tolerance(0.0),
309                           m_angle_tolerance(0.0),
310                           m_relative_tolerance(0.0),
311                           m_distance_display_mode(ON::decimal),
312                           m_distance_display_precision(3)
313 {
314   Default();
315   *this = src;
316 }
317 
operator =(const ON_3dmUnitsAndTolerances & src)318 ON_3dmUnitsAndTolerances& ON_3dmUnitsAndTolerances::operator=(const ON_3dmUnitsAndTolerances& src )
319 {
320   if ( this != &src )
321   {
322     m_unit_system = src.m_unit_system;
323     m_absolute_tolerance = src.m_absolute_tolerance;
324     m_angle_tolerance = src.m_angle_tolerance;
325     m_relative_tolerance = src.m_relative_tolerance;
326     m_distance_display_mode = src.m_distance_display_mode;
327     m_distance_display_precision = src.m_distance_display_precision;
328   }
329   return *this;
330 }
331 
Write(ON_BinaryArchive & file) const332 bool ON_3dmUnitsAndTolerances::Write( ON_BinaryArchive& file ) const
333 {
334   const int version = 102;
335   int i;
336 
337   // version 100 ON_3dmUnitsAndTolerances settings
338   bool rc = file.WriteInt( version );
339   i = m_unit_system.m_unit_system;
340   if ( rc ) rc = file.WriteInt( i );
341   if ( rc ) rc = file.WriteDouble( m_absolute_tolerance );
342   if ( rc ) rc = file.WriteDouble( m_angle_tolerance );
343   if ( rc ) rc = file.WriteDouble( m_relative_tolerance );
344 
345   // added in version 101
346   i = m_distance_display_mode;
347   if ( rc ) rc = file.WriteInt( i );
348   i = m_distance_display_precision;
349   if ( i < 0 || i > 20 ) {
350     ON_ERROR("ON_3dmUnitsAndTolerances::Write() - m_distance_display_precision out of range.");
351     i = 3;
352   }
353   if ( rc ) rc = file.WriteInt( i );
354 
355   // added in version 102
356   if ( rc ) rc = file.WriteDouble( m_unit_system.m_custom_unit_scale );
357   if ( rc ) rc = file.WriteString( m_unit_system.m_custom_unit_name );
358   return rc;
359 }
360 
Read(ON_BinaryArchive & file)361 bool ON_3dmUnitsAndTolerances::Read( ON_BinaryArchive& file )
362 {
363   Default();
364   int version = 0;
365   bool rc = file.ReadInt( &version );
366   if ( rc && version >= 100 && version < 200 ) {
367     int us = ON::no_unit_system;
368     rc = file.ReadInt( &us );
369     if ( rc )
370       m_unit_system.m_unit_system = ON::UnitSystem(us);
371     if ( rc ) rc = file.ReadDouble( &m_absolute_tolerance );
372     if ( rc ) rc = file.ReadDouble( &m_angle_tolerance );
373     if ( rc ) rc = file.ReadDouble( &m_relative_tolerance );
374     if ( version >= 101 ) {
375       int dm = ON::decimal;
376       if ( rc ) rc = file.ReadInt( &dm );
377       if ( rc ) m_distance_display_mode = ON::DistanceDisplayMode(dm);
378       if ( rc ) rc = file.ReadInt( &m_distance_display_precision );
379       if ( m_distance_display_precision < 0 || m_distance_display_precision > 20 )
380         m_distance_display_precision = 3; // some beta files had bogus values stored in file
381       if ( version >= 102 ) {
382         if ( rc ) rc = file.ReadDouble( &m_unit_system.m_custom_unit_scale );
383         if ( rc ) rc = file.ReadString( m_unit_system.m_custom_unit_name );
384       }
385     }
386   }
387   return rc;
388 }
389 
Dump(ON_TextLog & dump) const390 void ON_3dmUnitsAndTolerances::Dump( ON_TextLog& dump) const
391 {
392   m_unit_system.Dump(dump);
393   dump.Print("Absolute tolerance: %g\n",m_absolute_tolerance);
394   dump.Print("Angle tolerance: %g\n",m_angle_tolerance);
395 }
396 
Scale(ON::unit_system us) const397 double ON_3dmUnitsAndTolerances::Scale( ON::unit_system us ) const
398 {
399   // Example: If us = meters and m_unit_system = centimeters,
400   // then Scale() returns 100.
401   return ON::UnitScale( us, m_unit_system );
402 }
403 
404 //////////////////////////////////////////////////////////////////////////////////////////
405 //
406 // ON_3dmRenderSettings
407 //
Dump(ON_TextLog & text_log) const408 void ON_3dmRenderSettings::Dump( ON_TextLog& text_log ) const
409 {
410   text_log.Print("m_bCustomImageSize = %s\n",m_bCustomImageSize?"true":"false");
411   text_log.Print("m_image_width = %d\n",m_image_width);
412   text_log.Print("m_image_height = %d\n",m_image_height);
413   text_log.Print("m_image_dpi = %g\n",m_image_dpi);
414   text_log.Print("m_image_us = %d\n",m_image_us);
415   text_log.Print("m_ambient_light rgb = ");text_log.PrintRGB(m_ambient_light);text_log.Print("\n");
416   text_log.Print("m_background_style = %d\n",m_background_style);
417   text_log.Print("m_background_color rgb = ");text_log.PrintRGB(m_background_color);text_log.Print("\n");
418   text_log.Print("m_background_bitmap_filename = ");text_log.Print(m_background_bitmap_filename);text_log.Print("\n");
419   text_log.Print("m_bUseHiddenLights = %s\n",m_bUseHiddenLights?"true":"false");
420   text_log.Print("m_bDepthCue = %s\n",m_bDepthCue?"true":"false");
421   text_log.Print("m_bFlatShade = %s\n",m_bFlatShade?"true":"false");
422   text_log.Print("m_bRenderBackfaces = %s\n",m_bRenderBackfaces?"true":"false");
423   text_log.Print("m_bRenderPoints = %s\n",m_bRenderPoints?"true":"false");
424   text_log.Print("m_bRenderCurves = %s\n",m_bRenderCurves?"true":"false");
425   text_log.Print("m_bRenderIsoparams = %s\n",m_bRenderIsoparams?"true":"false");
426   text_log.Print("m_bRenderMeshEdges = %s\n",m_bRenderMeshEdges?"true":"false");
427   text_log.Print("m_bRenderAnnotation = %s\n",m_bRenderAnnotation?"true":"false");
428 
429   text_log.Print("m_antialias_style = %d\n",m_antialias_style);
430   text_log.Print("m_shadowmap_style = %d\n",m_shadowmap_style);
431   text_log.Print("m_shadowmap_width = %d\n",m_shadowmap_width);
432   text_log.Print("m_shadowmap_height = %d\n",m_shadowmap_height);
433   text_log.Print("m_shadowmap_offset = %g\n",m_shadowmap_offset);
434 
435   text_log.Print("m_bScaleBackgroundToFit = %s\n",m_bScaleBackgroundToFit?"true":"false");
436 }
437 
Default()438 void ON_3dmRenderSettings::Default()
439 {
440   m_bCustomImageSize = false;
441   m_image_width  = 800;
442   m_image_height = 600;
443   m_bScaleBackgroundToFit = false;
444   memset(m_reserved1,0,sizeof(m_reserved1));
445   m_image_dpi = 72.0;
446   m_image_us = ON::inches;
447 
448 
449   m_ambient_light.SetRGB( 0, 0, 0);
450 
451   m_background_style = 0;
452   m_background_color.SetRGB(160,160,160);
453   m_background_bottom_color.SetRGB(160,160,160);
454   m_background_bitmap_filename.Destroy();
455 
456   m_bUseHiddenLights = false;
457 
458   m_bDepthCue = false;
459   m_bFlatShade = false;
460 
461   m_bRenderBackfaces = true;
462   m_bRenderPoints = false;
463   m_bRenderCurves = false;
464   m_bRenderIsoparams = false;
465   m_bRenderMeshEdges = false;
466   m_bRenderAnnotation = false;
467 
468   m_antialias_style = 1;
469 
470   m_shadowmap_style = 1;
471   m_shadowmap_width = 1000;
472   m_shadowmap_height = 1000;
473   m_shadowmap_offset = 0.75;
474 
475   m_bUsesAmbientAttr      = true;
476   m_bUsesBackgroundAttr   = true;
477   m_bUsesBackfaceAttr     = false;
478   m_bUsesPointsAttr       = false;
479   m_bUsesCurvesAttr       = true;
480   m_bUsesIsoparmsAttr     = true;
481   m_bUsesMeshEdgesAttr    = false;
482   m_bUsesAnnotationAttr   = true;
483   m_bUsesHiddenLightsAttr = true;
484 
485   memset(m_reserved2,0,sizeof(m_reserved2));
486 }
487 
ON_3dmRenderSettings()488 ON_3dmRenderSettings::ON_3dmRenderSettings()
489 {
490   Default();
491 }
492 
~ON_3dmRenderSettings()493 ON_3dmRenderSettings::~ON_3dmRenderSettings()
494 {
495   m_background_bitmap_filename.Destroy();
496 }
497 
ON_3dmRenderSettings(const ON_3dmRenderSettings & src)498 ON_3dmRenderSettings::ON_3dmRenderSettings(const ON_3dmRenderSettings& src )
499 {
500   Default();
501   *this = src;
502 }
503 
operator =(const ON_3dmRenderSettings & src)504 ON_3dmRenderSettings& ON_3dmRenderSettings::operator=(const ON_3dmRenderSettings& src )
505 {
506   if ( this != &src ) {
507     m_bCustomImageSize = src.m_bCustomImageSize;
508     m_image_width = src.m_image_width;
509     m_image_height = src.m_image_height;
510     m_bScaleBackgroundToFit = src.m_bScaleBackgroundToFit;
511     m_image_dpi = src.m_image_dpi;
512     m_image_us = src.m_image_us;
513     m_ambient_light = src.m_ambient_light;
514     m_background_style = src.m_background_style;
515     m_background_color = src.m_background_color;
516     m_background_bitmap_filename = src.m_background_bitmap_filename;
517     m_bUseHiddenLights = src.m_bUseHiddenLights;
518     m_bDepthCue = src.m_bDepthCue;
519     m_bFlatShade = src.m_bFlatShade;
520     m_bRenderBackfaces = src.m_bRenderBackfaces;
521     m_bRenderPoints = src.m_bRenderPoints;
522     m_bRenderCurves = src.m_bRenderCurves;
523     m_bRenderIsoparams = src.m_bRenderIsoparams;
524     m_bRenderMeshEdges = src.m_bRenderMeshEdges;
525     m_bRenderAnnotation = src.m_bRenderAnnotation;
526     m_antialias_style = src.m_antialias_style;
527     m_shadowmap_style = src.m_shadowmap_style;
528     m_shadowmap_width = src.m_shadowmap_width;
529     m_shadowmap_height = src.m_shadowmap_height;
530     m_shadowmap_offset = src.m_shadowmap_offset;
531 
532     m_background_bottom_color = src.m_background_bottom_color;
533     m_bUsesAmbientAttr      = src.m_bUsesAmbientAttr;
534     m_bUsesBackgroundAttr   = src.m_bUsesBackgroundAttr;
535     m_bUsesBackfaceAttr     = src.m_bUsesBackfaceAttr;
536     m_bUsesPointsAttr       = src.m_bUsesPointsAttr;
537     m_bUsesCurvesAttr       = src.m_bUsesCurvesAttr;
538     m_bUsesIsoparmsAttr     = src.m_bUsesIsoparmsAttr;
539     m_bUsesMeshEdgesAttr    = src.m_bUsesMeshEdgesAttr;
540     m_bUsesAnnotationAttr   = src.m_bUsesAnnotationAttr;
541     m_bUsesHiddenLightsAttr = src.m_bUsesHiddenLightsAttr;
542   }
543   return *this;
544 }
545 
Write(ON_BinaryArchive & file) const546 bool ON_3dmRenderSettings::Write( ON_BinaryArchive& file ) const
547 {
548   int i;
549   // version 103: 11 November 2010
550   const int version = 103;
551   bool rc = file.WriteInt( version );
552   // version >= 100
553   if (rc) rc = file.WriteInt( m_bCustomImageSize );
554   if (rc) rc = file.WriteInt( m_image_width );
555   if (rc) rc = file.WriteInt( m_image_height );
556   if (rc) rc = file.WriteColor( m_ambient_light );
557   if (rc) rc = file.WriteInt( m_background_style );
558   if (rc) rc = file.WriteColor( m_background_color );
559   if (rc) rc = file.WriteString( m_background_bitmap_filename );
560   if (rc) rc = file.WriteInt( m_bUseHiddenLights );
561   if (rc) rc = file.WriteInt( m_bDepthCue );
562   if (rc) rc = file.WriteInt( m_bFlatShade );
563 
564   // 26 August 2003 Dale Lear:
565   //     When saving V2 files, turn on backfaces. RR 11656
566   //
567   i = (file.Archive3dmVersion() >= 3) ? m_bRenderBackfaces : 1;
568   if (rc) rc = file.WriteInt( i );
569 
570   if (rc) rc = file.WriteInt( m_bRenderPoints );
571   if (rc) rc = file.WriteInt( m_bRenderCurves );
572   if (rc) rc = file.WriteInt( m_bRenderIsoparams );
573   if (rc) rc = file.WriteInt( m_bRenderMeshEdges );
574   if (rc) rc = file.WriteInt( m_bRenderAnnotation );
575   if (rc) rc = file.WriteInt( m_antialias_style );
576   if (rc) rc = file.WriteInt( m_shadowmap_style );
577   if (rc) rc = file.WriteInt( m_shadowmap_width );
578   if (rc) rc = file.WriteInt( m_shadowmap_height );
579   if (rc) rc = file.WriteDouble( m_shadowmap_offset );
580   // version >= 101 begins here
581   if (rc) rc = file.WriteDouble( m_image_dpi );
582   i = m_image_us;
583   if (rc) rc = file.WriteInt( i );
584   // version >= 102 begins here
585   if (rc) rc = file.WriteColor( m_background_bottom_color );
586 
587   // version >= 103 begins here - added 11 November 2010
588   if (rc) rc = file.WriteBool( m_bScaleBackgroundToFit );
589 
590   return rc;
591 }
592 
Read(ON_BinaryArchive & file)593 bool ON_3dmRenderSettings::Read( ON_BinaryArchive& file )
594 {
595   Default();
596   int version = 0;
597   bool rc = file.ReadInt( &version );
598   if ( rc && version >= 100 && version < 200 )
599   {
600     if (rc)
601       rc = file.ReadInt( &m_bCustomImageSize );
602     if (rc)
603       rc = file.ReadInt( &m_image_width );
604     if (rc)
605       rc = file.ReadInt( &m_image_height );
606     if (rc)
607       rc = file.ReadColor( m_ambient_light );
608     if (rc)
609       rc = file.ReadInt( &m_background_style );
610     if (rc)
611       rc = file.ReadColor( m_background_color );
612     if (rc)
613       rc = file.ReadString( m_background_bitmap_filename );
614     if (rc)
615       rc = file.ReadInt( &m_bUseHiddenLights );
616     if (rc)
617       rc = file.ReadInt( &m_bDepthCue );
618     if (rc)
619       rc = file.ReadInt( &m_bFlatShade );
620     if (rc)
621       rc = file.ReadInt( &m_bRenderBackfaces );
622     if (rc)
623       rc = file.ReadInt( &m_bRenderPoints );
624     if (rc)
625       rc = file.ReadInt( &m_bRenderCurves );
626     if (rc)
627       rc = file.ReadInt( &m_bRenderIsoparams );
628     if (rc)
629       rc = file.ReadInt( &m_bRenderMeshEdges );
630     if (rc)
631       rc = file.ReadInt( &m_bRenderAnnotation );
632     if (rc)
633       rc = file.ReadInt( &m_antialias_style );
634     if (rc)
635       rc = file.ReadInt( &m_shadowmap_style );
636     if (rc)
637       rc = file.ReadInt( &m_shadowmap_width );
638     if (rc)
639       rc = file.ReadInt( &m_shadowmap_height );
640     if (rc)
641       rc = file.ReadDouble( &m_shadowmap_offset );
642     if (rc && version >= 101)
643     {
644       if (rc)
645         rc = file.ReadDouble( &m_image_dpi );
646       if (rc)
647       {
648         int i;
649         rc = file.ReadInt(&i);
650         if (rc)
651           m_image_us = ON::UnitSystem(i);
652       }
653 
654       if (rc && version >= 102)
655       {
656         rc = file.ReadColor( m_background_bottom_color );
657         if (rc && version >= 103)
658         {
659           rc = file.ReadBool( &m_bScaleBackgroundToFit );
660         }
661       }
662     }
663   }
664   return rc;
665 }
666 
ScaleBackgroundToFit() const667 bool ON_3dmRenderSettings::ScaleBackgroundToFit() const
668 {
669   return m_bScaleBackgroundToFit;
670 }
671 
SetScaleBackgroundToFit(bool bScaleBackgroundToFit)672 void ON_3dmRenderSettings::SetScaleBackgroundToFit( bool bScaleBackgroundToFit )
673 {
674   // The "? true : false" is here to prevent hacks from using a bool
675   // to store settings besides 1 and 0.
676   m_bScaleBackgroundToFit = bScaleBackgroundToFit?true:false;
677 }
678 
679 
680 //////////////////////////////////////////////////////////////////////////////////////////
681 //
682 // ON_3dmAnnotationSettings
683 //
684 
ON_3dmAnnotationSettings()685 ON_3dmAnnotationSettings::ON_3dmAnnotationSettings()
686 {
687   Default();
688 }
689 
~ON_3dmAnnotationSettings()690 ON_3dmAnnotationSettings::~ON_3dmAnnotationSettings()
691 {
692 }
693 
ON_3dmAnnotationSettings(const ON_3dmAnnotationSettings & src)694 ON_3dmAnnotationSettings::ON_3dmAnnotationSettings(const ON_3dmAnnotationSettings& src)
695 {
696   Default();
697   *this = src;
698 
699 }
700 
operator =(const ON_3dmAnnotationSettings & src)701 ON_3dmAnnotationSettings& ON_3dmAnnotationSettings::operator=(const ON_3dmAnnotationSettings& src)
702 {
703   if ( this != &src ) {
704     m_dimscale = src.m_dimscale;
705     m_textheight = src.m_textheight;
706     m_dimexe = src.m_dimexe;
707     m_dimexo = src.m_dimexo;
708     m_arrowlength = src.m_arrowlength;
709     m_arrowwidth = src.m_arrowwidth;
710     m_centermark = src.m_centermark;
711     m_dimunits = src.m_dimunits;;
712     m_arrowtype = src.m_arrowtype;
713     m_angularunits = src.m_angularunits;
714     m_lengthformat = src.m_lengthformat;
715     m_angleformat = src.m_angleformat;
716     m_textalign = src.m_textalign;
717     m_resolution = src.m_resolution;
718     m_facename = src.m_facename;
719     m_world_view_text_scale = src.m_world_view_text_scale;
720     m_world_view_hatch_scale = src.m_world_view_hatch_scale;
721     m_bEnableAnnotationScaling = src.m_bEnableAnnotationScaling;
722     m_bEnableHatchScaling = src.m_bEnableHatchScaling;
723   }
724   return *this;
725 }
726 
Dump(ON_TextLog &) const727 void ON_3dmAnnotationSettings::Dump( ON_TextLog& ) const
728 {
729   // TODO
730 }
731 
Default()732 void ON_3dmAnnotationSettings::Default()
733 {
734   memset(this,0,sizeof(*this));
735 
736   m_dimscale = 1.0;       // model size / plotted size
737   m_textheight = 1.0;
738   m_dimexe = 1.0;
739   m_dimexo = 1.0;
740   m_arrowlength = 1.0;
741   m_arrowwidth = 1.0;
742   m_centermark = 1.0;
743 
744   m_dimunits = ON::no_unit_system;  // units used to measure the dimension
745   m_arrowtype = 0;     // 0: filled narrow triangular arrow
746   m_angularunits = 0;  // 0: degrees, 1: radians
747   m_lengthformat = 0;  // 0: decimal, ...
748   m_angleformat = 0;   // 0: decimal degrees, ...
749   m_textalign = 0;     // 0: above line, 1: in line, 2: horizontal
750   m_resolution = 0;    // depends on m_lengthformat
751                        // for decimal, digits past the decimal point
752 
753   m_facename.Destroy(); // [LF_FACESIZE] // windows font name
754 
755   m_world_view_text_scale = 1.0f;
756   m_world_view_hatch_scale = 1.0f;
757   m_bEnableAnnotationScaling = 1;
758   m_bEnableHatchScaling = 1;
759 }
760 
WorldViewTextScale() const761 double ON_3dmAnnotationSettings::WorldViewTextScale() const
762 {
763   return m_world_view_text_scale;
764 }
765 
WorldViewHatchScale() const766 double ON_3dmAnnotationSettings::WorldViewHatchScale() const
767 {
768   return m_world_view_hatch_scale;
769 }
770 
SetWorldViewTextScale(double world_view_text_scale)771 void ON_3dmAnnotationSettings::SetWorldViewTextScale(double world_view_text_scale )
772 {
773   if ( ON_IsValid(world_view_text_scale) && world_view_text_scale > 0.0 )
774     m_world_view_text_scale = (float)world_view_text_scale;
775 }
776 
SetWorldViewHatchScale(double world_view_hatch_scale)777 void ON_3dmAnnotationSettings::SetWorldViewHatchScale(double world_view_hatch_scale )
778 {
779   if ( ON_IsValid(world_view_hatch_scale) && world_view_hatch_scale > 0.0 )
780     m_world_view_hatch_scale = (float)world_view_hatch_scale;
781 }
782 
IsAnnotationScalingEnabled() const783 bool ON_3dmAnnotationSettings::IsAnnotationScalingEnabled() const
784 {
785   return m_bEnableAnnotationScaling?true:false;
786 }
787 
EnableAnnotationScaling(bool bEnable)788 void ON_3dmAnnotationSettings::EnableAnnotationScaling( bool bEnable )
789 {
790   m_bEnableAnnotationScaling = bEnable?1:0;
791 }
792 
793 
IsHatchScalingEnabled() const794 bool ON_3dmAnnotationSettings::IsHatchScalingEnabled() const
795 {
796   return m_bEnableHatchScaling?true:false;
797 }
798 
EnableHatchScaling(bool bEnable)799 void ON_3dmAnnotationSettings::EnableHatchScaling( bool bEnable )
800 {
801   m_bEnableHatchScaling = bEnable?1:0;
802 }
803 
804 
Read(ON_BinaryArchive & file)805 bool ON_3dmAnnotationSettings::Read( ON_BinaryArchive& file )
806 {
807   Default();
808 
809   int major_version = 0;
810   int minor_version = 0;
811   bool rc = file.Read3dmChunkVersion(&major_version,&minor_version);
812   if ( major_version == 1 ) {
813     if ( minor_version >= 0 ) {
814       if (rc) rc = file.ReadDouble(&m_dimscale);
815       if (rc) rc = file.ReadDouble(&m_textheight);
816       if (rc) rc = file.ReadDouble(&m_dimexe);
817       if (rc) rc = file.ReadDouble(&m_dimexo);
818       if (rc) rc = file.ReadDouble(&m_arrowlength);
819       if (rc) rc = file.ReadDouble(&m_arrowwidth);
820       if (rc) rc = file.ReadDouble(&m_centermark);
821 
822       {
823         int i;
824         if (rc)
825         {
826           rc = file.ReadInt( &i );
827           if (rc)
828             m_dimunits = ON::UnitSystem(i);
829         }
830       }
831 
832       if (rc) rc = file.ReadInt( &m_arrowtype );
833       if (rc) rc = file.ReadInt( &m_angularunits );
834       if (rc) rc = file.ReadInt( &m_lengthformat );
835       if (rc) rc = file.ReadInt( &m_angleformat );
836       if (rc) rc = file.ReadInt( &m_textalign );
837       if (rc) rc = file.ReadInt( &m_resolution );
838 
839       if (rc) rc = file.ReadString( m_facename );
840 
841       // files that do not contain m_bEnableAnnotationScaling,
842       // set m_bEnableAnnotationScaling = false so the display
843       // image does not change.
844       m_bEnableAnnotationScaling = 0;
845 
846       // files that do not contain m_bEnableHatchScaling,
847       // set m_bEnableHatchScaling = false so the display
848       // image does not change.
849       m_bEnableHatchScaling = 0;
850 
851       if ( minor_version >= 1 )
852       {
853         // Added 25 August 2010 chunk version 1.1
854         double d = m_world_view_text_scale;
855         if (rc) rc = file.ReadDouble(&d);
856         if (rc && ON_IsValid(d) && d >= 0.0 ) m_world_view_text_scale = (float)d;
857         if (rc) rc = file.ReadChar(&m_bEnableAnnotationScaling);
858         if ( minor_version >= 2 )
859         {
860           d = m_world_view_hatch_scale;
861           if (rc) rc = file.ReadDouble(&d);
862           if (rc && ON_IsValid(d) && d >= 0.0) m_world_view_hatch_scale = (float)d;
863           if (rc) rc = file.ReadChar(&m_bEnableHatchScaling);
864         }
865       }
866     }
867   }
868   else {
869     rc = false;
870   }
871   return rc;
872 }
873 
Write(ON_BinaryArchive & file) const874 bool ON_3dmAnnotationSettings::Write( ON_BinaryArchive& file ) const
875 {
876   int i;
877   bool rc = file.Write3dmChunkVersion(1,2);
878   // March 22, 2010 - Global DimScale abandoned and moved into DimStyles, so now
879   // in older files, the dimscale values are multiplied into the DimStyle lengths and
880   // DimScale is written as 1.0
881   if (rc) rc = file.WriteDouble(1.0);
882 
883   if (rc) rc = file.WriteDouble(m_textheight);
884   if (rc) rc = file.WriteDouble(m_dimexe);
885   if (rc) rc = file.WriteDouble(m_dimexo);
886   if (rc) rc = file.WriteDouble(m_arrowlength);
887   if (rc) rc = file.WriteDouble(m_arrowwidth);
888   if (rc) rc = file.WriteDouble(m_centermark);
889 
890   i = m_dimunits;
891   if (rc) rc = file.WriteInt( i );
892   if (rc) rc = file.WriteInt( m_arrowtype );
893   if (rc) rc = file.WriteInt( m_angularunits );
894   if (rc) rc = file.WriteInt( m_lengthformat );
895   if (rc) rc = file.WriteInt( m_angleformat );
896   int textalign = (int)m_textalign;
897 
898   // 8-20-03 lw
899   // How the hell did this get changed?
900   if( file.Archive3dmVersion() <= 2)
901   {
902     switch( m_textalign)
903     {
904     case ON::dtHorizontal:
905       textalign = 2;
906       break;
907     case ON::dtInLine:
908       textalign = 1;
909       break;
910     default:
911       textalign = 0;
912       break;
913     }
914   }
915   if (rc) rc = file.WriteInt( textalign );
916   if (rc) rc = file.WriteInt( m_resolution );
917 
918   if (rc) rc = file.WriteString( m_facename );
919 
920   // Added 25 August 2010 chunk version 1.1
921   double d = m_world_view_text_scale;
922   if (rc) rc = file.WriteDouble(d);
923   if (rc) rc = file.WriteChar(m_bEnableAnnotationScaling);
924 
925   // Added 14 January 2011 chunk version 1.2
926   d = m_world_view_hatch_scale;
927   if (rc) rc = file.WriteDouble(d);
928   if (rc) rc = file.WriteChar(m_bEnableHatchScaling);
929 
930   return rc;
931 }
932 
933 //////////////////////////////////////////////////////////////////////////////////////////
934 //
935 // ON_3dmConstructionPlane
936 //
ON_3dmConstructionPlane()937 ON_3dmConstructionPlane::ON_3dmConstructionPlane()
938 {
939   Default();
940 }
941 
~ON_3dmConstructionPlane()942 ON_3dmConstructionPlane::~ON_3dmConstructionPlane()
943 {
944 }
945 
946 // default copy constructor and operator= work fine
947 /*
948 ON_3dmConstructionPlane::ON_3dmConstructionPlane(const ON_3dmConstructionPlane& src)
949 {
950   Default();
951   *this = src;
952 }
953 ON_3dmConstructionPlane& ON_3dmConstructionPlane::operator=(const ON_3dmConstructionPlane& src)
954 {
955   if ( this != &src )
956   {
957     m_plane = src.m_plane;
958     m_grid_spacing = src.m_grid_spacing;
959     m_snap_spacing = src.m_snap_spacing;
960     m_grid_line_count = src.m_grid_line_count;
961     m_grid_thick_frequency = src.m_grid_thick_frequency;
962     m_name = src.m_name;
963     m_bDepthBuffer = src.m_bDepthBuffer;
964   }
965   return *this;
966 }
967 */
968 
Dump(ON_TextLog &) const969 void ON_3dmConstructionPlane::Dump( ON_TextLog& ) const
970 {
971   // TODO
972 }
973 
Default()974 void ON_3dmConstructionPlane::Default()
975 {
976   m_name.Destroy();
977   m_plane = ON_xy_plane;
978 
979   // construction grid appearance
980 	m_grid_spacing = 1.0;   // distance between grid lines
981 	m_snap_spacing = 1.0;   // distance between grid snap points
982 	m_grid_line_count = 70;     // number of grid lines in each direction
983   m_grid_thick_frequency = 5; // thick line frequency
984   m_bDepthBuffer = true;
985 }
986 
Write(ON_BinaryArchive & file) const987 bool ON_3dmConstructionPlane::Write( ON_BinaryArchive& file ) const
988 {
989   bool rc = file.Write3dmChunkVersion(1,1);
990 
991   if (rc) rc = file.WritePlane(m_plane);
992   if (rc) rc = file.WriteDouble(m_grid_spacing);
993   if (rc) rc = file.WriteDouble(m_snap_spacing);
994   if (rc) rc = file.WriteInt(m_grid_line_count);
995   if (rc) rc = file.WriteInt(m_grid_thick_frequency);
996   if (rc) rc = file.WriteString(m_name);
997 
998   // added for version 1.1 chunks
999   if (rc) rc = file.WriteBool(m_bDepthBuffer);
1000 
1001   return rc;
1002 }
1003 
Read(ON_BinaryArchive & file)1004 bool ON_3dmConstructionPlane::Read( ON_BinaryArchive& file )
1005 {
1006   Default();
1007   int major_version = 0;
1008   int minor_version = 0;
1009   bool rc = file.Read3dmChunkVersion(&major_version,&minor_version);
1010   if (rc && major_version==1)
1011   {
1012     if (rc) rc = file.ReadPlane(m_plane);
1013     if (rc) rc = file.ReadDouble(&m_grid_spacing);
1014     if (rc) rc = file.ReadDouble(&m_snap_spacing);
1015     if (rc) rc = file.ReadInt(&m_grid_line_count);
1016     if (rc) rc = file.ReadInt(&m_grid_thick_frequency);
1017     if (rc) rc = file.ReadString(m_name);
1018 
1019     if ( minor_version >= 1 )
1020     {
1021       if (rc) rc = file.ReadBool(&m_bDepthBuffer);
1022     }
1023   }
1024   return rc;
1025 }
1026 
1027 //////////////////////////////////////////////////////////////////////////////////////////
1028 //
1029 // ON_3dmConstructionPlaneGridDefaults
1030 //
ON_3dmConstructionPlaneGridDefaults()1031 ON_3dmConstructionPlaneGridDefaults::ON_3dmConstructionPlaneGridDefaults()
1032 {
1033   Default();
1034 }
1035 
~ON_3dmConstructionPlaneGridDefaults()1036 ON_3dmConstructionPlaneGridDefaults::~ON_3dmConstructionPlaneGridDefaults()
1037 {
1038 }
1039 
ON_3dmConstructionPlaneGridDefaults(const ON_3dmConstructionPlaneGridDefaults & src)1040 ON_3dmConstructionPlaneGridDefaults::ON_3dmConstructionPlaneGridDefaults(const ON_3dmConstructionPlaneGridDefaults& src)
1041 {
1042   Default();
1043   *this = src;
1044 }
operator =(const ON_3dmConstructionPlaneGridDefaults & src)1045 ON_3dmConstructionPlaneGridDefaults& ON_3dmConstructionPlaneGridDefaults::operator=(const ON_3dmConstructionPlaneGridDefaults& src)
1046 {
1047   if ( this != &src ) {
1048     m_grid_spacing = src.m_grid_spacing;
1049     m_snap_spacing = src.m_snap_spacing;
1050     m_grid_line_count = src.m_grid_line_count;
1051     m_grid_thick_frequency = src.m_grid_thick_frequency;
1052     m_bShowGrid = src.m_bShowGrid;
1053     m_bShowGridAxes = src.m_bShowGridAxes;
1054     m_bShowWorldAxes = src.m_bShowWorldAxes;
1055   }
1056   return *this;
1057 }
1058 
Dump(ON_TextLog &) const1059 void ON_3dmConstructionPlaneGridDefaults::Dump(ON_TextLog&) const
1060 {
1061   // TODO
1062 }
1063 
Default()1064 void ON_3dmConstructionPlaneGridDefaults::Default()
1065 {
1066   // construction grid appearance
1067 	m_grid_spacing = 1.0;   // distance between grid lines
1068 	m_snap_spacing = 1.0;   // distance between grid snap points
1069 	m_grid_line_count = 70;     // number of grid lines in each direction
1070   m_grid_thick_frequency = 5; // thick line frequency
1071   m_bShowGrid = true;
1072   m_bShowGridAxes = true;
1073   m_bShowWorldAxes = true;
1074 }
1075 
Write(ON_BinaryArchive & file) const1076 bool ON_3dmConstructionPlaneGridDefaults::Write( ON_BinaryArchive& file ) const
1077 {
1078   bool rc = file.Write3dmChunkVersion(1,0);
1079   if (rc) rc = file.WriteDouble(m_grid_spacing);
1080   if (rc) rc = file.WriteDouble(m_snap_spacing);
1081   if (rc) rc = file.WriteInt(m_grid_line_count);
1082   if (rc) rc = file.WriteInt(m_grid_thick_frequency);
1083   if (rc) rc = file.WriteInt(m_bShowGrid);
1084   if (rc) rc = file.WriteInt(m_bShowGridAxes);
1085   if (rc) rc = file.WriteInt(m_bShowWorldAxes);
1086   return rc;
1087 }
1088 
Read(ON_BinaryArchive & file)1089 bool ON_3dmConstructionPlaneGridDefaults::Read( ON_BinaryArchive& file )
1090 {
1091   int major_version = 0;
1092   int minor_version = 0;
1093   bool rc = file.Read3dmChunkVersion(&major_version,&minor_version);
1094   if (rc && major_version==1) {
1095     if (rc) rc = file.ReadDouble(&m_grid_spacing);
1096     if (rc) rc = file.ReadDouble(&m_snap_spacing);
1097     if (rc) rc = file.ReadInt(&m_grid_line_count);
1098     if (rc) rc = file.ReadInt(&m_grid_thick_frequency);
1099     if (rc) rc = file.ReadInt(&m_bShowGrid);
1100     if (rc) rc = file.ReadInt(&m_bShowGridAxes);
1101     if (rc) rc = file.ReadInt(&m_bShowWorldAxes);
1102   }
1103   return rc;
1104 }
1105 
1106 
1107 
1108 //////////////////////////////////////////////////////////////////////////////////////////
1109 //
1110 // ON_3dmViewPosition
1111 //
ON_3dmViewPosition()1112 ON_3dmViewPosition::ON_3dmViewPosition()
1113 {
1114   Default();
1115 }
1116 
~ON_3dmViewPosition()1117 ON_3dmViewPosition::~ON_3dmViewPosition()
1118 {
1119 }
1120 
ON_3dmViewPosition(const ON_3dmViewPosition & src)1121 ON_3dmViewPosition::ON_3dmViewPosition(const ON_3dmViewPosition& src)
1122 {
1123   Default();
1124   *this = src;
1125 }
1126 
operator =(const ON_3dmViewPosition & src)1127 ON_3dmViewPosition& ON_3dmViewPosition::operator=(const ON_3dmViewPosition& src)
1128 {
1129   if ( this != &src ) {
1130     m_wnd_left   = src.m_wnd_left;
1131     m_wnd_right  = src.m_wnd_right;
1132     m_wnd_top    = src.m_wnd_top;
1133     m_wnd_bottom = src.m_wnd_bottom;
1134     m_bMaximized = src.m_bMaximized;
1135     m_floating_viewport = src.m_floating_viewport;
1136 
1137     // reserved fields are not used
1138     // m_reserved_1 = src.m_reserved_1;
1139     // m_reserved_2 = src.m_reserved_2;
1140     // m_reserved_3 = src.m_reserved_3;
1141   }
1142   return *this;
1143 }
1144 
Default()1145 void ON_3dmViewPosition::Default()
1146 {
1147   m_wnd_left   = 0.0;
1148   m_wnd_right  = 1.0;
1149   m_wnd_top    = 0.0;
1150   m_wnd_bottom = 1.0;
1151   m_bMaximized = false;
1152 
1153   m_floating_viewport = 0;
1154   m_reserved_1 = 0;
1155   m_reserved_2 = 0;
1156   m_reserved_3 = 0;
1157 }
1158 
Write(ON_BinaryArchive & file) const1159 bool ON_3dmViewPosition::Write( ON_BinaryArchive& file ) const
1160 {
1161   int minor_version =  ( file.Archive3dmVersion() >= 5 ) ? 1 : 0;
1162 
1163   bool rc = file.Write3dmChunkVersion(1,minor_version);
1164   if (rc)
1165   {
1166     if (rc) rc = file.WriteInt( m_bMaximized );
1167     if (rc) rc = file.WriteDouble( m_wnd_left );
1168     if (rc) rc = file.WriteDouble( m_wnd_right );
1169     if (rc) rc = file.WriteDouble( m_wnd_top );
1170     if (rc) rc = file.WriteDouble( m_wnd_bottom );
1171 
1172     if ( minor_version >= 1 )
1173     {
1174       // 13 March 2009 S. Baer
1175       // version 1.1 added support for m_floating_viewport
1176       // in V5 files.  This info is not in V4 files because
1177       // they might use this to write userdata.
1178       if (rc) rc = file.WriteChar( m_floating_viewport );
1179     }
1180   }
1181   return rc;
1182 }
1183 
Read(ON_BinaryArchive & file)1184 bool ON_3dmViewPosition::Read( ON_BinaryArchive& file )
1185 {
1186   int major_version = 0;
1187   int minor_version = 0;
1188   bool rc = file.Read3dmChunkVersion(&major_version,&minor_version);
1189   double x;
1190   Default();
1191   if (rc && major_version==1)
1192   {
1193     if (rc) rc = file.ReadInt( &m_bMaximized );
1194     if (rc) rc = file.ReadDouble( &m_wnd_left );
1195     if (rc) rc = file.ReadDouble( &m_wnd_right );
1196     if (rc) rc = file.ReadDouble( &m_wnd_top );
1197     if (rc) rc = file.ReadDouble( &m_wnd_bottom );
1198 
1199     // 13 March 2009 S. Baer
1200     // version 1.1 added support for m_floating_viewport
1201     if( rc && minor_version >= 1 )
1202     {
1203       rc = file.ReadChar( &m_floating_viewport );
1204     }
1205   }
1206 
1207   // if people put bogus values in a file, tune them up to something that will work
1208   if ( m_wnd_left > m_wnd_right ) {
1209     x = m_wnd_left; m_wnd_left = m_wnd_right; m_wnd_right = x;
1210   }
1211   if ( m_wnd_left  < 0.0 )
1212     m_wnd_left  = 0.0;
1213   if ( m_wnd_right >= 1.0 )
1214     m_wnd_right = 1.0;
1215   if ( m_wnd_left >= m_wnd_right ) {
1216     m_wnd_left = 0.0;
1217     m_wnd_right = 1.0;
1218   }
1219 
1220   if ( m_wnd_top > m_wnd_bottom ) {
1221     x = m_wnd_top; m_wnd_top = m_wnd_bottom; m_wnd_bottom = x;
1222   }
1223   if ( m_wnd_top  < 0.0 )
1224     m_wnd_top  = 0.0;
1225   if ( m_wnd_bottom >= 1.0 )
1226     m_wnd_bottom = 1.0;
1227   if ( m_wnd_top >= m_wnd_bottom ) {
1228     m_wnd_top = 0.0;
1229     m_wnd_bottom = 1.0;
1230   }
1231 
1232   return rc;
1233 }
1234 
1235 //////////////////////////////////////////////////////////////////////////////////////////
1236 //
1237 // ON_3dmViewTraceImage
1238 //
ON_3dmViewTraceImage()1239 ON_3dmViewTraceImage::ON_3dmViewTraceImage()
1240 {
1241   Default();
1242 }
1243 
~ON_3dmViewTraceImage()1244 ON_3dmViewTraceImage::~ON_3dmViewTraceImage()
1245 {
1246 }
1247 
Default()1248 void ON_3dmViewTraceImage::Default()
1249 {
1250   m_plane = ON_xy_plane;
1251   m_width = 0.0;
1252   m_height = 0.0;
1253   m_bitmap_filename.Destroy();
1254   m_bGrayScale = true;
1255   m_bHidden = false;
1256   m_bFiltered = false;
1257 }
1258 
Write(ON_BinaryArchive & file) const1259 bool ON_3dmViewTraceImage::Write( ON_BinaryArchive& file ) const
1260 {
1261   // opennurbs version  < 200307300 - version 1.0 or 1.1 chunk
1262   // opennurbs version >= 200307300 - version 1.2 chunk
1263   bool rc = file.Write3dmChunkVersion(1,3);
1264   if (rc)
1265   {
1266     if (rc) rc = file.WriteString( m_bitmap_filename );
1267     if (rc) rc = file.WriteDouble( m_width );
1268     if (rc) rc = file.WriteDouble( m_height );
1269     if (rc) rc = file.WritePlane( m_plane );
1270 
1271     // version 1.1
1272     if (rc) rc = file.WriteBool( m_bGrayScale );
1273 
1274     // version 1.2
1275     if (rc) rc = file.WriteBool( m_bHidden );
1276 
1277     // version 1.3
1278     if (rc) rc = file.WriteBool( m_bFiltered );
1279   }
1280   return rc;
1281 }
1282 
1283 
Read(ON_BinaryArchive & file)1284 bool ON_3dmViewTraceImage::Read( ON_BinaryArchive& file )
1285 {
1286   // opennurbs version  < 200307300 - version 1.0 or 1.1 chunk
1287   // opennurbs version >= 200307300 - version 1.2 chunk
1288   int major_version = 0;
1289   int minor_version = 0;
1290   bool rc = file.Read3dmChunkVersion(&major_version,&minor_version);
1291   if (rc && major_version==1)
1292   {
1293     if (rc) rc = file.ReadString( m_bitmap_filename );
1294     if (rc) rc = file.ReadDouble( &m_width );
1295     if (rc) rc = file.ReadDouble( &m_height );
1296     if (rc) rc = file.ReadPlane( m_plane );
1297     if ( minor_version >= 1 )
1298     {
1299       if (rc) rc = file.ReadBool(&m_bGrayScale);
1300 
1301       if ( minor_version >= 2 )
1302       {
1303         if (rc) rc = file.ReadBool(&m_bHidden);
1304 
1305         if ( minor_version >= 3 )
1306         {
1307           if (rc) rc = file.ReadBool( &m_bFiltered );
1308         }
1309       }
1310     }
1311   }
1312   else
1313     rc = false;
1314   return rc;
1315 }
1316 
1317 
operator ==(const ON_3dmViewTraceImage & other) const1318 bool ON_3dmViewTraceImage::operator==( const ON_3dmViewTraceImage& other ) const
1319 {
1320   if ( m_plane != other.m_plane )
1321     return false;
1322   if ( m_width != other.m_width )
1323     return false;
1324   if ( m_height != other.m_height )
1325     return false;
1326   if( m_bitmap_filename != other.m_bitmap_filename )
1327     return false;
1328   if ( m_bHidden != other.m_bHidden )
1329     return false;
1330   if ( m_bGrayScale != other.m_bGrayScale )
1331     return false;
1332   if ( m_bFiltered != other.m_bFiltered )
1333     return false;
1334 
1335   return true;
1336 }
1337 
operator !=(const ON_3dmViewTraceImage & other) const1338 bool ON_3dmViewTraceImage::operator!=( const ON_3dmViewTraceImage& other ) const
1339 {
1340   return operator==(other) ? false : true;
1341 }
1342 
1343 
ON_3dmWallpaperImage()1344 ON_3dmWallpaperImage::ON_3dmWallpaperImage()
1345 {
1346   Default();
1347 }
1348 
~ON_3dmWallpaperImage()1349 ON_3dmWallpaperImage::~ON_3dmWallpaperImage()
1350 {
1351 }
1352 
operator ==(const ON_3dmWallpaperImage & other) const1353 bool ON_3dmWallpaperImage::operator==( const ON_3dmWallpaperImage& other ) const
1354 {
1355   if ( m_bitmap_filename != other.m_bitmap_filename )
1356     return false;
1357   if ( m_bHidden != other.m_bHidden )
1358     return false;
1359   return ( m_bGrayScale == other.m_bGrayScale );
1360 }
1361 
operator !=(const ON_3dmWallpaperImage & other) const1362 bool ON_3dmWallpaperImage::operator!=( const ON_3dmWallpaperImage& other ) const
1363 {
1364   return operator==(other) ? false : true;
1365 }
1366 
Default()1367 void ON_3dmWallpaperImage::Default()
1368 {
1369   m_bitmap_filename.Destroy();
1370   m_bGrayScale = true;
1371   m_bHidden = false;
1372 }
1373 
Write(ON_BinaryArchive & file) const1374 bool ON_3dmWallpaperImage::Write( ON_BinaryArchive& file ) const
1375 {
1376   // version  < 200307300 - version 1.0 chunk
1377   // version >= 200307300 - version 1.1 chunk
1378   bool rc = file.Write3dmChunkVersion(1,1);
1379   if (rc)
1380   {
1381     if (rc) rc = file.WriteString( m_bitmap_filename );
1382     if (rc) rc = file.WriteBool( m_bGrayScale );
1383 
1384     if (rc) rc = file.WriteBool( m_bHidden ); // added in 1.1 chunk
1385   }
1386   return rc;
1387 }
1388 
Read(ON_BinaryArchive & file)1389 bool ON_3dmWallpaperImage::Read( ON_BinaryArchive& file )
1390 {
1391   // version  < 200307300 - version 1.0 chunk
1392   // version >= 200307300 - version 1.1 chunk
1393   Default();
1394   int major_version = 0;
1395   int minor_version = 0;
1396   bool rc = file.Read3dmChunkVersion(&major_version,&minor_version);
1397   if (rc && major_version==1)
1398   {
1399     if (rc) rc = file.ReadString( m_bitmap_filename );
1400     if (rc) rc = file.ReadBool( &m_bGrayScale );
1401 
1402     if ( minor_version >= 1 )
1403     {
1404       if (rc) rc = file.ReadBool( &m_bHidden );
1405     }
1406   }
1407   else
1408     rc = false;
1409   return rc;
1410 }
1411 
1412 
1413 //////////////////////////////////////////////////////////////////////////////////////////
1414 //
1415 // ON_3dmView
1416 //
1417 
ON_3dmPageSettings()1418 ON_3dmPageSettings::ON_3dmPageSettings()
1419 {
1420   Default();
1421 }
1422 
~ON_3dmPageSettings()1423 ON_3dmPageSettings::~ON_3dmPageSettings()
1424 {
1425 }
1426 
Default()1427 void ON_3dmPageSettings::Default()
1428 {
1429   m_page_number = 0;
1430 
1431   m_width_mm  = 0.0;
1432   m_height_mm = 0.0;
1433 
1434   m_left_margin_mm   = 0.0;
1435   m_right_margin_mm  = 0.0;
1436   m_top_margin_mm    = 0.0;
1437   m_bottom_margin_mm = 0.0;
1438 
1439   m_printer_name.Destroy();
1440 }
1441 
1442 
IsValid(ON_TextLog * text_log) const1443 bool ON_3dmPageSettings::IsValid( ON_TextLog* text_log ) const
1444 {
1445   bool rc = true;
1446 
1447   if ( m_width_mm != 0.0 || m_height_mm != 0.0 )
1448   {
1449     if ( !ON_IsValid(m_width_mm) || m_width_mm <= 0.0 )
1450     {
1451       if ( text_log )
1452       {
1453         text_log->Print("ON_3dmPageSettings has m_width_mm = %g (should be > 0.0).\n",m_width_mm);
1454       }
1455       rc = false;
1456     }
1457     if ( !ON_IsValid(m_height_mm) || m_height_mm <= 0.0 )
1458     {
1459       if ( text_log )
1460       {
1461         text_log->Print("ON_3dmPageSettings has m_height_mm = %g (should be > 0.0).\n",m_height_mm);
1462       }
1463       rc = false;
1464     }
1465     if ( !ON_IsValid(m_top_margin_mm) || m_top_margin_mm < 0.0 )
1466     {
1467       if ( text_log )
1468       {
1469         text_log->Print("ON_3dmPageSettings has m_top_margin_mm = %g (should be >= 0.0).\n",m_top_margin_mm);
1470       }
1471       rc = false;
1472     }
1473     if ( !ON_IsValid(m_bottom_margin_mm) || m_bottom_margin_mm < 0.0 )
1474     {
1475       if ( text_log )
1476       {
1477         text_log->Print("ON_3dmPageSettings has m_bottom_margin_mm = %g (should be >= 0.0).\n",m_bottom_margin_mm);
1478       }
1479       rc = false;
1480     }
1481     if ( !ON_IsValid(m_left_margin_mm) || m_left_margin_mm < 0.0 )
1482     {
1483       if ( text_log )
1484       {
1485         text_log->Print("ON_3dmPageSettings has m_left_margin_mm = %g (should be >= 0.0).\n",m_left_margin_mm);
1486       }
1487       rc = false;
1488     }
1489     if ( !ON_IsValid(m_right_margin_mm) || m_right_margin_mm < 0.0 )
1490     {
1491       if ( text_log )
1492       {
1493         text_log->Print("ON_3dmPageSettings has m_right_margin_mm = %g (should be >= 0.0).\n",m_right_margin_mm);
1494       }
1495       rc = false;
1496     }
1497     if ( m_left_margin_mm + m_right_margin_mm >= m_width_mm )
1498     {
1499       if ( text_log )
1500       {
1501         text_log->Print("ON_3dmPageSettings has m_left_margin_mm+m_right_margin_mm = %g > %g = m_width_mm.\n",m_left_margin_mm + m_right_margin_mm, m_width_mm);
1502       }
1503       rc = false;
1504     }
1505     if ( m_top_margin_mm + m_bottom_margin_mm >= m_height_mm )
1506     {
1507       if ( text_log )
1508       {
1509         text_log->Print("ON_3dmPageSettings has m_top_margin_mm+m_bottom_margin_mm = %g > %g = m_height_mm.\n",m_top_margin_mm + m_bottom_margin_mm, m_height_mm);
1510       }
1511       rc = false;
1512     }
1513   }
1514   else
1515   {
1516     if ( m_top_margin_mm != 0.0 )
1517     {
1518       if ( text_log )
1519       {
1520         text_log->Print("ON_3dmPageSettings has m_top_margin_mm = %g (should be 0.0).\n",m_top_margin_mm);
1521       }
1522       rc = false;
1523     }
1524     if ( m_bottom_margin_mm != 0.0 )
1525     {
1526       if ( text_log )
1527       {
1528         text_log->Print("ON_3dmPageSettings has m_bottom_margin_mm = %g (should be 0.0).\n",m_bottom_margin_mm);
1529       }
1530       rc = false;
1531     }
1532     if ( m_left_margin_mm != 0.0 )
1533     {
1534       if ( text_log )
1535       {
1536         text_log->Print("ON_3dmPageSettings has m_left_margin_mm = %g (should be 0.0).\n",m_left_margin_mm);
1537       }
1538       rc = false;
1539     }
1540     if ( m_right_margin_mm != 0.0 )
1541     {
1542       if ( text_log )
1543       {
1544         text_log->Print("ON_3dmPageSettings has m_right_margin_mm = %g (should be 0.0).\n",m_right_margin_mm);
1545       }
1546       rc = false;
1547     }
1548   }
1549 
1550   return rc;
1551 }
1552 
Write(ON_BinaryArchive & archive) const1553 bool ON_3dmPageSettings::Write(ON_BinaryArchive& archive) const
1554 {
1555   bool rc = archive.BeginWrite3dmChunk( TCODE_ANONYMOUS_CHUNK, 1, 0 );
1556   if ( !rc )
1557     return false;
1558 
1559   for(;;)
1560   {
1561     rc = archive.WriteInt( m_page_number );
1562     if (!rc) break;
1563 
1564     rc = archive.WriteDouble(m_width_mm);
1565     if ( !rc) break;
1566 
1567     rc = archive.WriteDouble(m_height_mm);
1568     if ( !rc) break;
1569 
1570     rc = archive.WriteDouble(m_left_margin_mm);
1571     if ( !rc) break;
1572 
1573     rc = archive.WriteDouble(m_right_margin_mm);
1574     if ( !rc) break;
1575 
1576     rc = archive.WriteDouble(m_top_margin_mm);
1577     if ( !rc) break;
1578 
1579     rc = archive.WriteDouble(m_bottom_margin_mm);
1580     if ( !rc) break;
1581 
1582     rc = archive.WriteString(m_printer_name);
1583     if (!rc) break;
1584 
1585     break;
1586   }
1587 
1588   if ( !archive.EndWrite3dmChunk() )
1589     rc = false;
1590 
1591   return rc;
1592 }
1593 
Read(ON_BinaryArchive & archive)1594 bool ON_3dmPageSettings::Read(ON_BinaryArchive& archive)
1595 {
1596   int major_version = 0;
1597   int minor_version = 0;
1598   bool rc = archive.BeginRead3dmChunk( TCODE_ANONYMOUS_CHUNK, &major_version, &minor_version );
1599   if ( !rc )
1600     return false;
1601 
1602   for(;;)
1603   {
1604     rc = (1 == major_version);
1605     if (!rc) break;
1606 
1607     rc = archive.ReadInt(&m_page_number );
1608     if (!rc) break;
1609 
1610     rc = archive.ReadDouble(&m_width_mm);
1611     if ( !rc) break;
1612 
1613     rc = archive.ReadDouble(&m_height_mm);
1614     if ( !rc) break;
1615 
1616     rc = archive.ReadDouble(&m_left_margin_mm);
1617     if ( !rc) break;
1618 
1619     rc = archive.ReadDouble(&m_right_margin_mm);
1620     if ( !rc) break;
1621 
1622     rc = archive.ReadDouble(&m_top_margin_mm);
1623     if ( !rc) break;
1624 
1625     rc = archive.ReadDouble(&m_bottom_margin_mm);
1626     if ( !rc) break;
1627 
1628     rc = archive.ReadString(m_printer_name);
1629     if (!rc) break;
1630 
1631     break;
1632   }
1633 
1634   if ( !archive.EndRead3dmChunk() )
1635     rc = false;
1636 
1637   return rc;
1638 }
1639 
1640 //////////////////////////////////////////////////////////////////////////////////////////
1641 //
1642 // ON_3dmView
1643 //
ON_3dmView()1644 ON_3dmView::ON_3dmView()
1645 {
1646   Default();
1647 }
1648 
~ON_3dmView()1649 ON_3dmView::~ON_3dmView()
1650 {
1651 }
1652 
Dump(ON_TextLog & dump) const1653 void ON_3dmView::Dump( ON_TextLog& dump ) const
1654 {
1655   const wchar_t* wsViewName = m_name;
1656   if ( !wsViewName )
1657     wsViewName = L"";
1658   ON::view_projection proj = m_vp.Projection();
1659 
1660 
1661   ON_3dPoint camLoc;
1662   ON_3dVector camX, camY, camZ;
1663   ON_BOOL32 bValidCamera = m_vp.GetCameraFrame( camLoc, camX, camY, camZ );
1664   double frus_left,frus_right,frus_bottom,frus_top,frus_near,frus_far;
1665   ON_BOOL32 bValidFrustum = m_vp.GetFrustum(&frus_left,&frus_right,&frus_bottom,&frus_top,&frus_near,&frus_far);
1666   int port_left, port_right, port_bottom, port_top, port_near, port_far;
1667   ON_BOOL32 bValidPort = m_vp.GetScreenPort(&port_left,&port_right,&port_bottom,&port_top,&port_near,&port_far);
1668 
1669   const char* sProjectionName;
1670   switch(proj)
1671   {
1672   case ON::parallel_view: sProjectionName = "parallel"; break;
1673   case ON::perspective_view: sProjectionName = "perspective"; break;
1674   case ON::unknown_view:
1675   default:
1676     sProjectionName = "unknown";
1677     break;
1678   }
1679   dump.Print("Viewport: name = \"%ls\" projection = %s\n",wsViewName,sProjectionName);
1680 
1681   dump.PushIndent();
1682 
1683   if ( bValidCamera )
1684   {
1685     dump.Print("viewport camera frame\n"
1686            "  location = %g, %g, %g\n"
1687            "  X = %g, %g, %g\n"
1688            "  Y = %g, %g, %g\n"
1689            "  Z = %g, %g, %g\n",
1690            camLoc.x,camLoc.y,camLoc.z,
1691            camX.x,camX.y,camX.z,
1692            camY.x,camY.y,camY.z,
1693            camZ.x,camZ.y,camZ.z
1694            );
1695     ON_3dPoint target_point = TargetPoint();
1696     double target_distance = target_point.DistanceTo( camLoc );
1697     dump.Print("camera target\n"
1698                "  distance = %g\n"
1699                "  point = %g,%g,%g\n",
1700                target_distance,
1701                target_point.x,target_point.y,target_point.z
1702                );
1703   }
1704 
1705 
1706   if ( bValidFrustum ) {
1707     dump.Print("view frustum\n"
1708            "  left   = %g, right = %g\n"
1709            "  bottom = %g, top   = %g\n"
1710            "  near   = %g, far   = %g\n",
1711            frus_left,frus_right,
1712            frus_bottom,frus_top,
1713            frus_near,frus_far
1714            );
1715   }
1716 
1717   if ( bValidPort ) {
1718     // location of viewport window on screen
1719     dump.Print("viewport window screen location\n"
1720            "  left   = %4d, right = %4d\n"
1721            "  bottom = %4d, top   = %4d\n"
1722            "  near   = %4d, far   = %4d\n",
1723            port_left,port_right,
1724            port_bottom,port_top,
1725            port_near,port_far
1726            );
1727   }
1728 
1729 
1730   // relative position of viewport window in application main frame
1731   double rel_left,rel_right,rel_bottom,rel_top;
1732   rel_left = m_position.m_wnd_left;
1733   rel_right = m_position.m_wnd_right;
1734   rel_bottom = m_position.m_wnd_bottom;
1735   rel_top = m_position.m_wnd_top;
1736   dump.Print("relative viewport window position in application frame window\n"
1737              "  left   = %6.2f%%, right = %6.2f%%\n"
1738              "  bottom = %6.2f%%, top   = %6.2f%%\n",
1739              100.0*rel_left, 100.0*rel_right,
1740              100.0*rel_bottom, 100.0*rel_top
1741              );
1742 
1743   dump.PopIndent();
1744 
1745 }
1746 
Default()1747 void ON_3dmView::Default()
1748 {
1749   m_name.Destroy();
1750 
1751   m_vp.Initialize();
1752   // ON_3dmView::m_target is obsolete - keep it in sync with m_vp.m_target_point
1753   OBSOLETE_3DM_VIEW_TARGET = m_vp.TargetPoint();
1754 
1755   m_cplane.Default();
1756   m_display_mode_id = ON_nil_uuid;
1757   m_display_mode = ON::wireframe_display;
1758   m_view_type = ON::model_view_type;
1759   m_position.Default();
1760   if ( m_vp.Projection() == ON::parallel_view ) {
1761     m_cplane.m_plane.CreateFromFrame( m_cplane.m_plane.origin, m_vp.CameraX(), m_vp.CameraY() );
1762   }
1763   m_bShowConstructionGrid = true;
1764   m_bShowConstructionAxes = true;
1765   m_bShowWorldAxes = true;
1766 
1767   m_trace_image.Default();
1768   m_wallpaper_image.Default();
1769 
1770   m_page_settings.Default();
1771 
1772   m_bLockedProjection = false;
1773 }
1774 
TargetPoint() const1775 ON_3dPoint ON_3dmView::TargetPoint() const
1776 {
1777   ON_3dPoint target_point = m_vp.TargetPoint();
1778   if ( OBSOLETE_3DM_VIEW_TARGET != target_point )
1779   {
1780     ON_ERROR("Obsolete ON_3dmView::m_target is not set correctly");
1781     const_cast<ON_3dmView*>(this)->OBSOLETE_3DM_VIEW_TARGET = target_point; // fix error condition
1782   }
1783   return target_point;
1784 }
1785 
SetTargetPoint(ON_3dPoint target_point)1786 bool ON_3dmView::SetTargetPoint(ON_3dPoint target_point)
1787 {
1788   bool rc = m_vp.SetTargetPoint(target_point);
1789   OBSOLETE_3DM_VIEW_TARGET = m_vp.TargetPoint(); // keep obsolete m_target in sync with m_vp.m_target_point
1790   return rc;
1791 }
1792 
IsValid(ON_TextLog * text_log) const1793 bool ON_3dmView::IsValid(ON_TextLog* text_log) const
1794 {
1795   bool rc = m_vp.IsValid(text_log)?true:false;
1796   while(rc)
1797   {
1798     switch(m_view_type)
1799     {
1800     case ON::model_view_type:
1801       if ( m_page_settings.m_width_mm != 0.0 || m_page_settings.m_height_mm != 0.0 )
1802       {
1803         if ( text_log )
1804         {
1805           text_log->Print("ON_3dmView has m_view_type = ON::model_view_type but m_page_settings width,height = (%g,%g) (both should be zero).\n",
1806                           m_page_settings.m_width_mm,
1807                           m_page_settings.m_height_mm);
1808         }
1809         rc = false;
1810       }
1811       //if (    m_nested_view_position.m_min.x != 0.0 || m_nested_view_position.m_max.x != 0.0
1812       //     || m_nested_view_position.m_min.y != 0.0 || m_nested_view_position.m_max.y != 0.0
1813       //     || m_nested_view_position.m_min.z != 0.0 || m_nested_view_position.m_max.z != 0.0 )
1814       //{
1815       //  if ( text_log )
1816       //  {
1817       //    text_log->Print("ON_3dmView has m_view_type = ON::model_view_type and m_nested_view_position is not identically zero.\n");
1818       //  }
1819       //  rc = false;
1820       //}
1821       //if ( !ON_UuidIsNil(m_parent_viewport_id) )
1822       //{
1823       //  if ( text_log )
1824       //  {
1825       //    text_log->Print("ON_3dmView has m_view_type = ON::model_view_type and m_parent_viewport_id is not nil\n");
1826       //  }
1827       //  rc = false;
1828       //}
1829       break;
1830     case ON::page_view_type:
1831       //if (    m_nested_view_position.m_min.x != 0.0 || m_nested_view_position.m_max.x != 0.0
1832       //     || m_nested_view_position.m_min.y != 0.0 || m_nested_view_position.m_max.y != 0.0
1833       //     || m_nested_view_position.m_min.z != 0.0 || m_nested_view_position.m_max.z != 0.0 )
1834       //{
1835       //  if ( text_log )
1836       //  {
1837       //    text_log->Print("ON_3dmView has m_view_type = ON::page_view_type and m_nested_view_position is not identically zero.\n");
1838       //  }
1839       //  rc = false;
1840       //}
1841       //if ( !ON_UuidIsNil(m_parent_viewport_id) )
1842       //{
1843       //  if ( text_log )
1844       //  {
1845       //    text_log->Print("ON_3dmView has m_view_type = ON::page_view_type and m_parent_viewport_id is not nil\n");
1846       //  }
1847       //  rc = false;
1848       //}
1849       if ( m_page_settings.m_width_mm <= 0.0 || m_page_settings.m_height_mm <= 0.0 )
1850       {
1851         if ( text_log )
1852         {
1853           text_log->Print("ON_3dmView has m_view_type = ON::page_view_type but page width,height = (%g,%g)\n",
1854                           m_page_settings.m_width_mm,
1855                           m_page_settings.m_height_mm);
1856         }
1857         rc = false;
1858       }
1859       break;
1860 
1861     case ON::nested_view_type:
1862       if ( m_page_settings.m_width_mm != 0.0 || m_page_settings.m_height_mm != 0.0 )
1863       {
1864         if ( text_log )
1865         {
1866           text_log->Print("ON_3dmView has m_view_type = ON::nested_view_type but m_page_settings width,height = (%g,%g) (both should be zero).\n",
1867                           m_page_settings.m_width_mm,
1868                           m_page_settings.m_height_mm);
1869         }
1870         rc = false;
1871       }
1872       //if ( ON_UuidIsNil(m_parent_viewport_id) )
1873       //{
1874       //  if ( text_log )
1875       //  {
1876       //    text_log->Print("ON_3dmView has m_view_type = ON::nested_view_type and m_parent_viewport_id is nil.\n");
1877       //  }
1878       //  rc = false;
1879       //}
1880 
1881       //if ( !m_nested_view_position.IsValid()
1882       //     || m_nested_view_position.m_min.x >= m_nested_view_position.m_max.x
1883       //     || m_nested_view_position.m_min.y >= m_nested_view_position.m_max.y
1884       //     || m_nested_view_position.m_min.z != m_nested_view_position.m_max.z )
1885       //{
1886       //  if ( text_log )
1887       //  {
1888       //    text_log->Print("ON_3dmView has m_view_type = ON::nested_view_type and m_nested_view_position is bogus.\n");
1889       //  }
1890       //  rc = false;
1891       //}
1892       break;
1893 
1894     default:
1895       if ( text_log )
1896       {
1897         text_log->Print("ON_3dmView m_view_type = %d (illegal enum value)\n",m_view_type);
1898       }
1899       rc = false;
1900       break;
1901     }
1902     if (rc)
1903       break;
1904 
1905 
1906 
1907 
1908     break;
1909   }
1910   return rc;
1911 }
1912 
Write(ON_BinaryArchive & file) const1913 bool ON_3dmView::Write( ON_BinaryArchive& file ) const
1914 {
1915   // Everything in a view is in a subchunk so new records can
1916   // be added to a view and old I/O code will still
1917   // work.
1918   bool rc = true;
1919 
1920   // 27 June 2008 Dale Lear
1921   //   I added support for saving userdata attached to
1922   //   the m_vp ON_Viewport.  Ideally, I would just call
1923   //   file.WriteObject(m_vp), but userdata support is being
1924   //   added years after millions of files have been written
1925   //   by calling m_vp.Write().
1926   if(rc) {
1927     rc = file.BeginWrite3dmChunk( TCODE_VIEW_VIEWPORT, 0 );
1928     if(rc) {
1929       rc = m_vp.Write(file)?true:false;
1930       if ( !file.EndWrite3dmChunk() )
1931         rc = false;
1932     }
1933   }
1934   if(rc && 0 != m_vp.FirstUserData() && file.Archive3dmVersion() >= 4)
1935   {
1936     rc = file.BeginWrite3dmChunk( TCODE_VIEW_VIEWPORT_USERDATA, 0 );
1937     if(rc)
1938     {
1939       rc = file.WriteObjectUserData(m_vp);
1940       // write a "fake" TCODE_OPENNURBS_CLASS_END end of class
1941       // mark so I can use
1942       // ON_BinaryArchive::ReadObjectUserData()
1943       // to read this user data.
1944       if ( file.BeginWrite3dmChunk( TCODE_OPENNURBS_CLASS_END, 0 ) )
1945       {
1946         if ( !file.EndWrite3dmChunk() )
1947           rc = false;
1948       }
1949       else
1950       {
1951         rc = false;
1952       }
1953       if ( !file.EndWrite3dmChunk() ) // end of TCODE_VIEW_VIEWPORT_USERDATA
1954         rc = false;
1955     }
1956   }
1957   if(rc) {
1958     rc = file.BeginWrite3dmChunk( TCODE_VIEW_CPLANE, 0 );
1959     if(rc) {
1960       rc = m_cplane.Write(file);
1961       if ( !file.EndWrite3dmChunk() )
1962         rc = false;
1963     }
1964   }
1965   if(rc) {
1966     rc = file.BeginWrite3dmChunk( TCODE_VIEW_TARGET, 0 );
1967     if(rc) {
1968       ON_3dPoint target_point = TargetPoint();
1969       if(rc) rc = file.WritePoint(target_point);
1970       if ( !file.EndWrite3dmChunk() )
1971         rc = false;
1972     }
1973   }
1974   if(rc) {
1975     rc = file.BeginWrite3dmChunk( TCODE_VIEW_DISPLAYMODE, m_display_mode );
1976     if(rc) {
1977       if ( !file.EndWrite3dmChunk() )
1978         rc = false;
1979     }
1980   }
1981   if(rc) {
1982     rc = file.BeginWrite3dmChunk( TCODE_VIEW_POSITION, 0 );
1983     if(rc) {
1984       if(rc) rc = m_position.Write(file);
1985       if ( !file.EndWrite3dmChunk() )
1986         rc = false;
1987     }
1988   }
1989   if(rc) {
1990     rc = file.BeginWrite3dmChunk( TCODE_VIEW_SHOWCONGRID, m_bShowConstructionGrid );
1991     if(rc) {
1992       if ( !file.EndWrite3dmChunk() )
1993         rc = false;
1994     }
1995   }
1996   if(rc) {
1997     rc = file.BeginWrite3dmChunk( TCODE_VIEW_SHOWCONAXES, m_bShowConstructionAxes );
1998     if(rc) {
1999       if ( !file.EndWrite3dmChunk() )
2000         rc = false;
2001     }
2002   }
2003   if(rc) {
2004     rc = file.BeginWrite3dmChunk( TCODE_VIEW_SHOWWORLDAXES, m_bShowWorldAxes );
2005     if(rc) {
2006       if ( !file.EndWrite3dmChunk() )
2007         rc = false;
2008     }
2009   }
2010   if(rc) {
2011     rc = file.BeginWrite3dmChunk( TCODE_VIEW_NAME, 0 );
2012     if(rc) {
2013       if(rc) rc = file.WriteString(m_name);
2014       if ( !file.EndWrite3dmChunk() )
2015         rc = false;
2016     }
2017   }
2018   if(rc) {
2019     rc = file.BeginWrite3dmChunk( TCODE_VIEW_TRACEIMAGE, 0 );
2020     if(rc)
2021     {
2022       if(rc)
2023         rc = m_trace_image.Write(file);
2024       if ( !file.EndWrite3dmChunk() )
2025         rc = false;
2026     }
2027   }
2028   if(rc)
2029   {
2030     rc = file.BeginWrite3dmChunk( TCODE_VIEW_WALLPAPER, 0 );
2031     if(rc)
2032     {
2033       if(rc) rc = file.WriteString(m_wallpaper_image.m_bitmap_filename);
2034       if ( !file.EndWrite3dmChunk() )
2035         rc = false;
2036     }
2037   }
2038   if(rc && file.Archive3dmVersion() >= 3 )
2039   {
2040     // Added 5 June 2003 to support additional wallpaper attributes.
2041     // Older versions of Rhino/opennurbs
2042     // will just skip this chunk and get filename from the
2043     // TCODE_VIEW_WALLPAPER chunk written above.
2044     rc = file.BeginWrite3dmChunk( TCODE_VIEW_WALLPAPER_V3, 0 );
2045     if(rc)
2046     {
2047       if(rc)
2048         rc = m_wallpaper_image.Write(file);
2049       if ( !file.EndWrite3dmChunk() )
2050         rc = false;
2051     }
2052   }
2053 
2054   if (rc && file.Archive3dmVersion() >= 4)
2055   {
2056     // 23 March 2005 Dale Lear:
2057     //   The "chunks" above trace their history back to Rhino 1.0;
2058     //   The TCODE_VIEW_ATTRIBUTES chunk uses a chunk version so that
2059     //   new view information can be added without inventing a new
2060     //   TCODE for each new piece of information.
2061 
2062     rc = file.BeginWrite3dmChunk( TCODE_VIEW_ATTRIBUTES, 0 );
2063     if (rc)
2064     {
2065       rc = file.Write3dmChunkVersion( 1, 4 ); // (there are no 1.0 fields)
2066 
2067       while(rc)
2068       {
2069         // 1.1 fields (there are no 1.0 fields)
2070         rc = file.WriteInt( m_view_type );
2071         if (!rc) break;
2072 
2073         // obsolete values - superceded by m_page_settings
2074         rc = file.WriteDouble( m_page_settings.m_width_mm );
2075         if (!rc) break;
2076 
2077         rc = file.WriteDouble( m_page_settings.m_height_mm );
2078         if (!rc) break;
2079 
2080         ON_UUID obsolete_parent_viewport_id;
2081         memset(&obsolete_parent_viewport_id,0,sizeof(obsolete_parent_viewport_id));
2082         rc = file.WriteUuid( obsolete_parent_viewport_id );
2083         if (!rc) break;
2084 
2085         ON_BoundingBox obsolete_nested_view_position;
2086         rc = file.WriteBoundingBox( obsolete_nested_view_position );
2087         if (!rc) break;
2088 
2089         // 28 feb 2006 version 1.2 fields
2090         rc = file.WriteUuid(m_display_mode_id);
2091         if (!rc) break;
2092 
2093         rc = m_page_settings.Write(file);
2094         if (!rc) break;
2095 
2096         // 7 March 2006 version 1.3 fields
2097         rc = file.WriteBool(m_bLockedProjection);
2098         if (!rc) break;
2099 
2100         // 12 December 2010 version 1.4
2101         rc = file.WriteArray(m_clipping_planes);
2102         if (!rc) break;
2103 
2104         break;
2105       }
2106 
2107       // Since BeginWrite3dmChunk() returned true, EndWrite3dmChunk()
2108       // must be called even when rc is false
2109       if ( !file.EndWrite3dmChunk() )
2110         rc = false;
2111     }
2112   }
2113 
2114   // required TCODE_ENDOFTABLE chunk - marks end of view table
2115   if ( rc ) {
2116     rc = file.BeginWrite3dmChunk( TCODE_ENDOFTABLE, 0 );
2117     if ( rc ) {
2118       if ( !file.EndWrite3dmChunk() )
2119         rc = false;
2120     }
2121   }
2122   return rc;
2123 }
2124 
Read(ON_BinaryArchive & file)2125 bool ON_3dmView::Read( ON_BinaryArchive& file )
2126 {
2127   // Everything in a view is in a subchunk so new records can
2128   // be added to a view and old I/O code will still
2129   // work.
2130   unsigned int tcode = 0;
2131   ON__INT64 big_value = 0;
2132   int i32;
2133   bool rc = true;
2134 
2135   Default();
2136 
2137   bool bHaveTargetPoint = false;
2138   bool bHaveViewport = false;
2139   ON_3dPoint target_point = ON_3dPoint::UnsetPoint;
2140 
2141   while(rc) {
2142     rc = file.BeginRead3dmBigChunk(&tcode,&big_value);
2143     if (!rc)
2144       break;
2145     switch(tcode)
2146     {
2147     case TCODE_VIEW_CPLANE:
2148       rc = m_cplane.Read(file);
2149       break;
2150     case TCODE_VIEW_VIEWPORT:
2151       rc = m_vp.Read(file)?true:false;
2152       if (rc)
2153         bHaveViewport = true;
2154       break;
2155     case TCODE_VIEW_VIEWPORT_USERDATA:
2156       // 27 June 2008 Dale Lear
2157       //   I added support for saving userdata attached to
2158       //   the m_vp ON_Viewport.  Ideally, the ON_Viewport
2159       //   would be read by calling file.ReadObject(), but
2160       //   userdata support is being added years after
2161       //   millions of files have been written by calling
2162       //   m_vp.Write()/Read().
2163       rc = file.ReadObjectUserData(m_vp);
2164       break;
2165     case TCODE_VIEW_SHOWCONGRID:
2166       m_bShowConstructionGrid = big_value?true:false;
2167       break;
2168     case TCODE_VIEW_SHOWCONAXES:
2169       m_bShowConstructionAxes = big_value?true:false;
2170       break;
2171     case TCODE_VIEW_SHOWWORLDAXES:
2172       m_bShowWorldAxes = big_value?true:false;
2173       break;
2174     case TCODE_VIEW_TRACEIMAGE:
2175       rc = m_trace_image.Read(file);
2176       break;
2177     case TCODE_VIEW_WALLPAPER:
2178       // used prior to 5 June 2003 and still written
2179       // after 5 June 2003 so older Rhinos/opennurbs
2180       // will not loose the filename information.
2181       rc = file.ReadString(m_wallpaper_image.m_bitmap_filename);
2182       m_wallpaper_image.m_bGrayScale = true;
2183       break;
2184     case TCODE_VIEW_WALLPAPER_V3:
2185       // Added 5 June 2003 to support additional wallpaper attributes.
2186       rc = m_wallpaper_image.Read(file);
2187       break;
2188     case TCODE_VIEW_TARGET:
2189       rc = file.ReadPoint(target_point);
2190       if (rc)
2191         bHaveTargetPoint = true;
2192       break;
2193     case TCODE_VIEW_DISPLAYMODE:
2194       i32 = (int)big_value;
2195       m_display_mode = ON::DisplayMode(i32);
2196       break;
2197     case TCODE_VIEW_NAME:
2198       rc = file.ReadString(m_name);
2199       break;
2200     case TCODE_VIEW_POSITION:
2201       rc = m_position.Read(file);
2202       break;
2203 
2204     case TCODE_VIEW_ATTRIBUTES:
2205       {
2206         int major_version = 0;
2207         int minor_version = 0;
2208         rc = file.Read3dmChunkVersion(&major_version,&minor_version);
2209         // there are no 1.0 fields in this chunk
2210         while ( rc
2211                 && major_version == 1 && minor_version >= 1
2212                 && file.Archive3dmVersion() >= 4
2213                 && file.ArchiveOpenNURBSVersion() >= 200503170 )
2214         {
2215           // Added 23 March 2005 Dale Lear
2216           // 1.1 fields (there are no 1.0 fields)
2217           i32 = 0;
2218           rc = file.ReadInt( &i32 );
2219           if (!rc) break;
2220           m_view_type = ON::ViewType(i32);
2221 
2222           rc = file.ReadDouble( &m_page_settings.m_width_mm );
2223           if (!rc) break;
2224 
2225           rc = file.ReadDouble( &m_page_settings.m_height_mm );
2226           if (!rc) break;
2227 
2228           ON_UUID obsolete_parent_viewport_id;
2229           rc = file.ReadUuid( obsolete_parent_viewport_id );
2230           if (!rc) break;
2231 
2232           ON_BoundingBox obsolete_nested_view_position;
2233           rc = file.ReadBoundingBox( obsolete_nested_view_position );
2234           if (!rc) break;
2235 
2236           if ( minor_version >= 2 )
2237           {
2238             // 28 feb 2006 version 1.2 field
2239             rc = file.ReadUuid(m_display_mode_id);
2240             if (!rc) break;
2241 
2242             rc = m_page_settings.Read(file);
2243             if (!rc) break;
2244 
2245             if ( minor_version >= 3 )
2246             {
2247               rc = file.ReadBool(&m_bLockedProjection);
2248               if (!rc) break;
2249 
2250               if ( minor_version >= 4 )
2251               {
2252                 rc = file.ReadArray(m_clipping_planes);
2253                 if (!rc) break;
2254               }
2255             }
2256           }
2257 
2258           // Add new inforamation here - ask Dale Lear for help.
2259 
2260           break;
2261         }
2262       }
2263       break;
2264     }
2265 
2266     if (!file.EndRead3dmChunk())
2267       rc = false;
2268     if ( tcode == TCODE_ENDOFTABLE )
2269       break;
2270   }
2271 
2272   if (    bHaveViewport
2273        && bHaveTargetPoint
2274        && target_point.IsValid()
2275        && !OBSOLETE_3DM_VIEW_TARGET.IsValid()
2276      )
2277   {
2278     // m_target is obsolete, but some older files
2279     // have the good value stored in ON_3dmView. In this
2280     // case use the good value as the target point.
2281     SetTargetPoint(target_point); // sets both this->m_target and m_vp.m_target_point
2282   }
2283   else
2284   {
2285     // Assume the value on m_vp.m_target_point is the right one and
2286     // Keep the obsolete m_target in sync with m_vp.m_target_point.
2287     OBSOLETE_3DM_VIEW_TARGET = m_vp.TargetPoint();
2288   }
2289 
2290   return rc;
2291 }
2292 
ON_EarthAnchorPoint()2293 ON_EarthAnchorPoint::ON_EarthAnchorPoint()
2294 {
2295   Default();
2296 }
2297 
~ON_EarthAnchorPoint()2298 ON_EarthAnchorPoint::~ON_EarthAnchorPoint()
2299 {
2300 }
2301 
Default()2302 void ON_EarthAnchorPoint::Default()
2303 {
2304   m_earth_basepoint_latitude = 0.0;
2305   m_earth_basepoint_longitude = 0.0;
2306   m_earth_basepoint_elevation = 0.0;
2307   m_earth_basepoint_elevation_zero = 0;
2308 
2309   m_model_basepoint.Set(0.0,0.0,0.0);
2310   m_model_north.Set(0.0,1.0,0.0);
2311   m_model_east.Set(1.0,0.0,0.0);
2312 
2313   m_id = ON_nil_uuid;
2314   m_name.Destroy();
2315   m_description.Destroy();
2316   m_url.Destroy();
2317   m_url_tag.Destroy();
2318 }
2319 
CompareEarthLocation(const ON_EarthAnchorPoint * a,const ON_EarthAnchorPoint * b)2320 int ON_EarthAnchorPoint::CompareEarthLocation(const ON_EarthAnchorPoint* a, const ON_EarthAnchorPoint* b)
2321 {
2322   if ( !a )
2323   {
2324     return b ? -1 : 0;
2325   }
2326   if (!b)
2327   {
2328     return 1;
2329   }
2330 
2331   double xa = a->m_earth_basepoint_longitude;
2332   double xb = b->m_earth_basepoint_longitude;
2333   if ( !ON_IsValid(xa) )
2334   {
2335     if ( ON_IsValid(xb) ) return -1;
2336   }
2337   else if ( !ON_IsValid(xb) )
2338   {
2339     return 1;
2340   }
2341   else
2342   {
2343     while(xa <= 0.0)
2344       xa += 360.0;
2345     while(xa > 360.0)
2346       xa -= 360.0;
2347     while(xb <= 0.0)
2348       xb += 360.0;
2349     while(xb > 360.0)
2350       xb -= 360.0;
2351     if ( xa < xb ) return -1;
2352     if ( xa > xb ) return 1;
2353   }
2354 
2355   xa = a->m_earth_basepoint_latitude;
2356   xb = b->m_earth_basepoint_latitude;
2357   if ( !ON_IsValid(xa) )
2358   {
2359     if ( ON_IsValid(xb) ) return -1;
2360   }
2361   else if ( !ON_IsValid(xb) )
2362   {
2363     return 1;
2364   }
2365   else
2366   {
2367     while(xa <= 0.0)
2368       xa += 360.0;
2369     while(xa > 360.0)
2370       xa -= 360.0;
2371     while(xb <= 0.0)
2372       xb += 360.0;
2373     while(xb > 360.0)
2374       xb -= 360.0;
2375     if ( xa < xb ) return -1;
2376     if ( xa > xb ) return 1;
2377   }
2378 
2379   int i = a->m_earth_basepoint_elevation_zero - b->m_earth_basepoint_elevation_zero;
2380   if ( i != 0 )
2381     return i;
2382 
2383   xa = a->m_earth_basepoint_elevation;
2384   xb = b->m_earth_basepoint_elevation;
2385   if ( !ON_IsValid(xa) )
2386   {
2387     if ( ON_IsValid(xb) ) return -1;
2388   }
2389   else if ( !ON_IsValid(xb) )
2390   {
2391     return 1;
2392   }
2393   else
2394   {
2395     if ( xa < xb ) return -1;
2396     if ( xa > xb ) return 1;
2397   }
2398 
2399   return 0;
2400 }
2401 
CompareModelDirection(const ON_EarthAnchorPoint * a,const ON_EarthAnchorPoint * b)2402 int ON_EarthAnchorPoint::CompareModelDirection(const ON_EarthAnchorPoint* a, const ON_EarthAnchorPoint* b)
2403 {
2404   if ( !a )
2405   {
2406     return b ? -1 : 0;
2407   }
2408   if (!b)
2409   {
2410     return 1;
2411   }
2412 
2413   int i = ON_ComparePoint(3,false,&a->m_model_basepoint.x,&b->m_model_basepoint.x);
2414   if ( !i )
2415   {
2416     i = ON_ComparePoint(3,false,&a->m_model_north.x,&b->m_model_north.x);
2417     if ( !i )
2418     {
2419       i = ON_ComparePoint(3,false,&a->m_model_east.x,&b->m_model_east.x);
2420     }
2421   }
2422   return i;
2423 }
2424 
CompareIdentification(const ON_EarthAnchorPoint * a,const ON_EarthAnchorPoint * b)2425 int ON_EarthAnchorPoint::CompareIdentification(const ON_EarthAnchorPoint* a, const ON_EarthAnchorPoint* b)
2426 {
2427   if ( !a )
2428   {
2429     return b ? -1 : 0;
2430   }
2431   if (!b)
2432   {
2433     return 1;
2434   }
2435 
2436   int i = ON_UuidCompare(a->m_id,b->m_id);
2437   if ( !i)
2438   {
2439     i = a->m_name.Compare(b->m_name);
2440     if (!i)
2441     {
2442       i = a->m_description.Compare(b->m_description);
2443       if (!i)
2444       {
2445         i = a->m_url.CompareNoCase(b->m_url);
2446         if ( !i)
2447         {
2448           i = a->m_url_tag.Compare(b->m_url_tag);
2449         }
2450       }
2451     }
2452   }
2453   return i;
2454 }
2455 
Compare(const ON_EarthAnchorPoint * a,const ON_EarthAnchorPoint * b)2456 int ON_EarthAnchorPoint::Compare(const ON_EarthAnchorPoint* a, const ON_EarthAnchorPoint* b)
2457 {
2458   int i = ON_EarthAnchorPoint::CompareEarthLocation(a,b);
2459   if ( !i)
2460   {
2461     i = ON_EarthAnchorPoint::CompareModelDirection(a,b);
2462     if (!i)
2463     {
2464       i = ON_EarthAnchorPoint::CompareIdentification(a,b);
2465     }
2466   }
2467   return i;
2468 }
2469 
Read(ON_BinaryArchive & file)2470 bool ON_EarthAnchorPoint::Read( ON_BinaryArchive& file )
2471 {
2472   Default();
2473   int major_version = 0;
2474   int minor_version = 0;
2475   bool rc = file.BeginRead3dmChunk(TCODE_ANONYMOUS_CHUNK,&major_version,&minor_version);
2476   if ( !rc )
2477     return false;
2478 
2479   for(;;)
2480   {
2481     rc = (1 == major_version);
2482     if (!rc) break;
2483 
2484     rc = file.ReadDouble(&m_earth_basepoint_latitude);
2485     if (!rc) break;
2486     rc = file.ReadDouble(&m_earth_basepoint_longitude);
2487     if (!rc) break;
2488     rc = file.ReadDouble(&m_earth_basepoint_elevation);
2489     if (!rc) break;
2490     rc = file.ReadPoint(m_model_basepoint);
2491     if (!rc) break;
2492     rc = file.ReadVector(m_model_north);
2493     if (!rc) break;
2494     rc = file.ReadVector(m_model_east);
2495     if (!rc) break;
2496 
2497     if ( minor_version >= 1 )
2498     {
2499       // 1.1 fields
2500       rc = file.ReadInt(&m_earth_basepoint_elevation_zero);
2501       if (!rc) break;
2502       rc = file.ReadUuid(m_id);
2503       if (!rc) break;
2504       rc = file.ReadString(m_name);
2505       if (!rc) break;
2506       rc = file.ReadString(m_description);
2507       if (!rc) break;
2508       rc = file.ReadString(m_url);
2509       if (!rc) break;
2510       rc = file.ReadString(m_url_tag);
2511       if (!rc) break;
2512     }
2513 
2514     break;
2515   }
2516 
2517   if ( !file.EndRead3dmChunk() )
2518     rc = false;
2519 
2520   return rc;
2521 }
2522 
Write(ON_BinaryArchive & file) const2523 bool ON_EarthAnchorPoint::Write( ON_BinaryArchive& file ) const
2524 {
2525   bool rc = file.BeginWrite3dmChunk(TCODE_ANONYMOUS_CHUNK,1,1);
2526   if ( !rc )
2527     return false;
2528 
2529   for(;;)
2530   {
2531     rc = file.WriteDouble(m_earth_basepoint_latitude);
2532     if (!rc) break;
2533     rc = file.WriteDouble(m_earth_basepoint_longitude);
2534     if (!rc) break;
2535     rc = file.WriteDouble(m_earth_basepoint_elevation);
2536     if (!rc) break;
2537     rc = file.WritePoint(m_model_basepoint);
2538     if (!rc) break;
2539     rc = file.WriteVector(m_model_north);
2540     if (!rc) break;
2541     rc = file.WriteVector(m_model_east);
2542     if (!rc) break;
2543 
2544     // 1.1 fields
2545     rc = file.WriteInt(m_earth_basepoint_elevation_zero);
2546     if (!rc) break;
2547     rc = file.WriteUuid(m_id);
2548     if (!rc) break;
2549     rc = file.WriteString(m_name);
2550     if (!rc) break;
2551     rc = file.WriteString(m_description);
2552     if (!rc) break;
2553     rc = file.WriteString(m_url);
2554     if (!rc) break;
2555     rc = file.WriteString(m_url_tag);
2556     if (!rc) break;
2557 
2558 
2559     break;
2560   }
2561 
2562   if ( !file.EndWrite3dmChunk() )
2563     rc = false;
2564 
2565   return rc;
2566 }
2567 
2568 
GetModelCompass(ON_Plane & model_compass) const2569 bool ON_EarthAnchorPoint::GetModelCompass(ON_Plane& model_compass) const
2570 {
2571   ON_Plane mc;
2572   mc.xaxis = m_model_east;
2573   mc.yaxis = m_model_north;
2574   if ( fabs(mc.xaxis.Length() - 1.0) > ON_SQRT_EPSILON )
2575   {
2576     if ( !mc.xaxis.Unitize() )
2577       return false;
2578   }
2579   if ( fabs(mc.yaxis.Length() - 1.0) > ON_SQRT_EPSILON )
2580   {
2581     if ( !mc.yaxis.Unitize() )
2582       return false;
2583   }
2584   double d = mc.xaxis*mc.yaxis;
2585   if ( fabs(d) > ON_SQRT_EPSILON )
2586   {
2587     // assume north is correct
2588     mc.xaxis.x -= d*mc.yaxis.x;
2589     mc.xaxis.y -= d*mc.yaxis.y;
2590     mc.xaxis.z -= d*mc.yaxis.z;
2591     if( !mc.xaxis.Unitize() )
2592       return false;
2593   }
2594   mc.zaxis = ON_CrossProduct(mc.xaxis,mc.yaxis);
2595   if ( fabs(mc.zaxis.Length() - 1.0) > ON_SQRT_EPSILON )
2596   {
2597     if ( !mc.zaxis.Unitize() )
2598       return false;
2599   }
2600   mc.origin = m_model_basepoint;
2601   mc.UpdateEquation();
2602   model_compass = mc;
2603   return model_compass.IsValid();
2604 }
2605 
GetModelToEarthXform(const ON_UnitSystem & model_unit_system,ON_Xform & model_to_earth) const2606 bool ON_EarthAnchorPoint::GetModelToEarthXform(
2607           const ON_UnitSystem& model_unit_system,
2608           ON_Xform& model_to_earth
2609           ) const
2610 {
2611   // The orient_model rotates the model so that
2612   //   xaxis runs from west to east
2613   //   yaxis runs from south to north
2614   //   zaxis points "up"
2615   ON_Plane model_compass;
2616   bool rc = GetModelCompass( model_compass );
2617   model_compass.origin = m_model_basepoint;
2618   model_compass.UpdateEquation();
2619   ON_Xform orient_model;
2620   orient_model.Rotation( model_compass, ON_xy_plane  );
2621 
2622   ON_Xform coord_change(1.0);
2623 
2624   const double lat_radians = m_earth_basepoint_latitude/180.0*ON_PI;
2625   const double cos_lat = cos(lat_radians);
2626   const double sin_lat = sin(lat_radians);
2627 
2628   // get radius of earth at this latitude
2629   const double earth_polar_radius      = 6356750.0; // Earth's radius at poles (meters)
2630   const double earth_equatorial_radius = 6378135.0; // Earth's radius at equator (meters)
2631   ON_2dVector r;
2632   r.x = cos_lat;
2633   r.y = sin_lat*(earth_equatorial_radius/earth_polar_radius);
2634   double earth_radius = earth_equatorial_radius/r.Length();
2635   if ( earth_radius > earth_equatorial_radius )
2636     earth_radius = earth_equatorial_radius;
2637   else if ( earth_radius < earth_polar_radius )
2638     earth_radius = earth_polar_radius;
2639 
2640   const double meters_per_degree_latitude = earth_radius*ON_PI/180.0; // meters per degree of latitude
2641 
2642   const double model_to_meters_scale = ON::UnitScale(model_unit_system, ON::meters);
2643   const double north_south_scale  = model_to_meters_scale/meters_per_degree_latitude;
2644   const double east_west_scale = ( 1.0e100*cos_lat < north_south_scale )
2645                                ? north_south_scale
2646                                : north_south_scale/cos_lat;
2647 
2648   coord_change.m_xform[0][0] = east_west_scale;
2649   coord_change.m_xform[0][3] = m_earth_basepoint_longitude;
2650   coord_change.m_xform[1][1] = north_south_scale;
2651   coord_change.m_xform[1][3] = m_earth_basepoint_latitude;
2652   coord_change.m_xform[2][2] = model_to_meters_scale;
2653   coord_change.m_xform[3][2] = m_earth_basepoint_elevation;
2654 
2655   model_to_earth = coord_change*orient_model;
2656 
2657   return rc;
2658 }
2659 
2660 
2661 //////////////////////////////////////////////////////////////////////////////////////////
2662 //
2663 // ON_3dmSettings
2664 //
2665 
Default()2666 void ON_3dmSettings::Default()
2667 {
2668   // default properties
2669   m_model_URL.Destroy();
2670   m_model_basepoint.Set(0.0,0.0,0.0);
2671   m_earth_anchor_point.Default();
2672   m_ModelUnitsAndTolerances.Default();
2673   m_PageUnitsAndTolerances.Default();
2674   m_RenderMeshSettings.Default();
2675   m_CustomRenderMeshSettings.Default();
2676 
2677   m_IO_settings.Default();
2678 
2679   // 28 Febuary 2003 Dale Lear:
2680   //     Add analysis mesh default settings
2681   m_AnalysisMeshSettings.DefaultAnalysisMeshParameters();
2682 
2683   m_AnnotationSettings.Default();
2684   m_named_cplanes.Empty();
2685   m_named_views.Empty();
2686   m_views.Empty();
2687   m_active_view_id = ON_nil_uuid;
2688 
2689   m_current_layer_index = 0;
2690   m_current_font_index = 0;
2691   m_current_dimstyle_index = 0;
2692 
2693   m_current_material_index = -1; // -1 = "default" material
2694   m_current_material_source = ON::material_from_layer;
2695 
2696   m_current_color.SetRGB(0,0,0);
2697   m_current_color_source = ON::color_from_layer;
2698 
2699   m_current_linetype_index = -1;  // -1 = "default" solid line
2700   m_current_linetype_source = ON::linetype_from_layer;
2701 
2702   m_current_plot_color = ON_UNSET_COLOR;
2703   m_current_plot_color_source = ON::plot_color_from_layer;
2704 
2705   m_current_wire_density = 1;
2706   m_RenderSettings.Default();
2707   m_GridDefaults.Default();
2708 
2709   m_linetype_display_scale = 1.0;
2710 
2711   m_plugin_list.Destroy();
2712 }
2713 
ON_3dmSettings()2714 ON_3dmSettings::ON_3dmSettings()
2715 {
2716   Default();
2717 };
2718 
~ON_3dmSettings()2719 ON_3dmSettings::~ON_3dmSettings()
2720 {
2721 }
2722 
ON_3dmIOSettings()2723 ON_3dmIOSettings::ON_3dmIOSettings()
2724 {
2725   Default();
2726 }
2727 
Default()2728 void ON_3dmIOSettings::Default()
2729 {
2730   m_bSaveTextureBitmapsInFile = false;
2731   // 7 February 2011 - default changed to 1.
2732   //m_idef_link_update = 0;
2733   m_idef_link_update = 1;
2734 }
2735 
2736 
Read(ON_BinaryArchive & file)2737 bool ON_3dmIOSettings::Read(ON_BinaryArchive& file)
2738 {
2739   Default();
2740 
2741   int major_version = 0;
2742   int minor_version = 0;
2743   bool rc = file.BeginRead3dmChunk(TCODE_ANONYMOUS_CHUNK,&major_version,&minor_version);
2744   if (!rc)
2745     return false;
2746 
2747   for(;;)
2748   {
2749     rc = ( 1 == major_version );
2750     if (!rc) break;
2751 
2752     rc = file.ReadBool(&m_bSaveTextureBitmapsInFile);
2753     if(!rc) break;
2754 
2755     rc = file.ReadInt(&m_idef_link_update);
2756     if(!rc) break;
2757 
2758     if ( 0 == m_idef_link_update && file.Archive3dmVersion() >= 5 )
2759     {
2760       // 7 February 2011 - old 0 value is no longer an option.
2761       m_idef_link_update = 1;
2762     }
2763 
2764     break;
2765   }
2766 
2767   if ( !file.EndRead3dmChunk() )
2768     rc = false;
2769 
2770   return rc;
2771 }
2772 
Write(ON_BinaryArchive & file) const2773 bool ON_3dmIOSettings::Write(ON_BinaryArchive& file) const
2774 {
2775   bool rc = file.BeginWrite3dmChunk(TCODE_ANONYMOUS_CHUNK,1,0);
2776   if (!rc)
2777     return false;
2778   for(;;)
2779   {
2780     rc = file.WriteBool(m_bSaveTextureBitmapsInFile);
2781     if(!rc) break;
2782 
2783     int i = m_idef_link_update;
2784     if ( 0 == i && file.Archive3dmVersion() >= 5 )
2785     {
2786       // 7 February 2011 - old 0 value is no longer an option.
2787       i = 1;
2788     }
2789     rc = file.WriteInt(i);
2790     if(!rc) break;
2791 
2792     break;
2793   }
2794   if ( !file.EndWrite3dmChunk() )
2795     rc = false;
2796 
2797   return rc;
2798 }
2799 
2800 
ON_3dmSettings_Read_v1_TCODE_NAME(ON_BinaryArchive & file,ON_wString & str)2801 static bool ON_3dmSettings_Read_v1_TCODE_NAME(ON_BinaryArchive& file, ON_wString& str )
2802 {
2803   // reads legacy 1.0 named view TCODE_NAME chunk
2804   str.Empty();
2805   int len = 0;
2806   bool rc = file.ReadInt( &len );
2807   if (rc && len > 0) {
2808     char* name = (char*)oncalloc( 1, len + 1);
2809     rc = file.ReadString( len, name );
2810     if (rc)
2811       str = name; // ASCII -> UNICODE
2812     if (name)
2813       onfree(name);
2814   }
2815   return rc;
2816 }
2817 
ON_3dmSettings_Read_v1_TCODE_CPLANE(ON_BinaryArchive & file,ON_3dmConstructionPlane & cplane)2818 static bool ON_3dmSettings_Read_v1_TCODE_CPLANE(ON_BinaryArchive& file, ON_3dmConstructionPlane& cplane)
2819 {
2820   // reads legacy 1.0 named view TCODE_CPLANE chunk
2821 
2822   // do NOT call cplane.Default() here
2823   bool rc = true;
2824 	ON_3dPoint origin;
2825 	ON_3dVector xaxis, yaxis;
2826 	double gridsize;
2827 	int gridsections, gridthicksections;
2828   if (rc) rc = file.ReadPoint( origin );
2829   if (rc) rc = file.ReadVector( xaxis );
2830   if (rc) rc = file.ReadVector( yaxis );
2831   if (rc)
2832   {
2833     rc = file.ReadDouble(&gridsize);
2834     if (rc)
2835     {
2836       rc = file.ReadInt(&gridsections);
2837       if (rc)
2838       {
2839         rc = file.ReadInt(&gridthicksections);
2840         if (rc)
2841         {
2842           cplane.m_plane.CreateFromFrame(origin,xaxis,yaxis);
2843           cplane.m_grid_line_count = gridsections;
2844           cplane.m_grid_thick_frequency = gridthicksections;
2845           cplane.m_grid_spacing = gridsize;
2846           cplane.m_snap_spacing = gridsize;
2847         }
2848         }
2849     }
2850   }
2851   return rc;
2852 }
2853 
ON_3dmSettings_Read_v1_TCODE_VIEW(ON_BinaryArchive & file,ON_3dmView & view)2854 static bool ON_3dmSettings_Read_v1_TCODE_VIEW(ON_BinaryArchive& file, ON_3dmView& view)
2855 {
2856   // reads legacy 1.0 named view TCODE_VIEW chunk
2857   // do NOT call view.Default() here
2858   bool rc = true;
2859 
2860 	int projection, valid;
2861 	double angle1, angle2, angle3, viewsize, cameradist;
2862   ON_3dPoint target_point;
2863   while(rc)
2864   {
2865     rc = file.ReadInt(&projection);
2866     if (!rc) break;
2867     rc = file.ReadInt(&valid);
2868     if (!rc) break;
2869     rc = file.ReadPoint( target_point );
2870     if (!rc) break;
2871     rc = file.ReadDouble( &angle1 );
2872     if (!rc) break;
2873     rc = file.ReadDouble( &angle2 );
2874     if (!rc) break;
2875     rc = file.ReadDouble( &angle3 );
2876     if (!rc) break;
2877     rc = file.ReadDouble( &viewsize );
2878     if (!rc) break;
2879     rc = file.ReadDouble( &cameradist );
2880     if (!rc) break;
2881 
2882     if( cameradist <= 0.0 || cameradist >= ( DBL_MAX / 2.0 ))
2883       cameradist = 100.0;
2884     if( viewsize <= 0.0 || viewsize >= ( DBL_MAX / 2.0 ))
2885       viewsize = 0.125;
2886     ON_ViewportFromRhinoView(
2887           projection == 2 ? ON::perspective_view : ON::parallel_view,
2888           target_point,
2889           angle1,
2890           angle2,
2891           angle3,
2892           viewsize,
2893           cameradist,
2894           100, // screen_width,
2895           100, // screen_height,
2896           view.m_vp
2897           );
2898     // keep obsolete view.m_target in sync with view.m_vp.m_target_point
2899     view.OBSOLETE_3DM_VIEW_TARGET = view.m_vp.TargetPoint();
2900     break;
2901   }
2902 
2903   return rc;
2904 }
2905 
ON_3dmSettings_Read_v1_TCODE_NAMED_VIEW(ON_BinaryArchive & file,ON_3dmView & view)2906 static bool ON_3dmSettings_Read_v1_TCODE_NAMED_VIEW(ON_BinaryArchive& file, ON_3dmView& view)
2907 {
2908   // reads legacy 1.0 named view TCODE_NAMED_VIEW chunk
2909   view.Default();
2910   bool rc = true;
2911   unsigned int tcode;
2912   ON__INT64 big_value;
2913 
2914   while(rc)
2915   {
2916     rc = file.BeginRead3dmBigChunk( &tcode, &big_value );
2917     if (!rc )
2918       break;
2919     switch(tcode) {
2920 
2921     case TCODE_NAME:
2922       rc = ON_3dmSettings_Read_v1_TCODE_NAME(file,view.m_name);
2923       break;
2924 
2925     case TCODE_CPLANE:
2926       rc = ON_3dmSettings_Read_v1_TCODE_CPLANE(file,view.m_cplane);
2927       break;
2928 
2929     case TCODE_VIEW:
2930       rc = ON_3dmSettings_Read_v1_TCODE_VIEW( file, view );
2931       break;
2932 
2933     case TCODE_SHOWGRID:
2934       view.m_bShowConstructionGrid = big_value?true:false;
2935       break;
2936 
2937     case TCODE_SHOWGRIDAXES:
2938       view.m_bShowConstructionAxes = big_value?true:false;
2939       break;
2940 
2941     case TCODE_SHOWWORLDAXES:
2942       view.m_bShowWorldAxes = big_value?true:false;
2943       break;
2944 
2945     }
2946     if ( !file.EndRead3dmChunk() )
2947       rc = false;
2948     if ( tcode == TCODE_ENDOFTABLE )
2949       break;
2950   }
2951   return rc;
2952 }
2953 
ON_3dmSettings_Read_v1_TCODE_NAMED_CPLANE(ON_BinaryArchive & file,ON_3dmConstructionPlane & cplane)2954 static bool ON_3dmSettings_Read_v1_TCODE_NAMED_CPLANE(ON_BinaryArchive& file, ON_3dmConstructionPlane& cplane)
2955 {
2956   // reads legacy 1.0 named construction plane TCODE_NAMED_CPLANE chunk
2957   cplane.Default();
2958 
2959   bool rc = true;
2960   unsigned int tcode;
2961   ON__INT64 big_value;
2962 
2963   while(rc)
2964   {
2965     rc = file.BeginRead3dmBigChunk( &tcode, &big_value );
2966     if (!rc )
2967       break;
2968     switch(tcode) {
2969 
2970     case TCODE_NAME:
2971       rc = ON_3dmSettings_Read_v1_TCODE_NAME(file, cplane.m_name );
2972       break;
2973 
2974     case TCODE_CPLANE:
2975       rc = ON_3dmSettings_Read_v1_TCODE_CPLANE(file, cplane );
2976       break;
2977     }
2978     if ( !file.EndRead3dmChunk() )
2979       rc = false;
2980     if ( tcode == TCODE_ENDOFTABLE )
2981       break;
2982   }
2983   return rc;
2984 }
2985 
ON_3dmSettings_Read_v1_TCODE_UNIT_AND_TOLERANCES(ON_BinaryArchive & file,ON_3dmUnitsAndTolerances & UnitsAndTolerances)2986 static bool ON_3dmSettings_Read_v1_TCODE_UNIT_AND_TOLERANCES(ON_BinaryArchive& file, ON_3dmUnitsAndTolerances& UnitsAndTolerances )
2987 {
2988   bool rc = true;
2989   int v = 0;
2990   int us = 0;
2991   UnitsAndTolerances.Default();
2992   if (rc)
2993     rc = file.ReadInt( &v ); // should get v = 1
2994   if (rc)
2995     rc = file.ReadInt( &us );
2996   switch (us)
2997   {
2998   case 0: // NO_UNIT_SYSTEM:
2999     UnitsAndTolerances.m_unit_system.m_unit_system = ON::no_unit_system;
3000     break;
3001   case 1: // MICRONS:
3002     UnitsAndTolerances.m_unit_system.m_unit_system = ON::microns;
3003     break;
3004   case 2: // MILLIMETERS:
3005     UnitsAndTolerances.m_unit_system.m_unit_system = ON::millimeters;
3006     break;
3007   case 3: // CENTIMETERS:
3008     UnitsAndTolerances.m_unit_system.m_unit_system = ON::centimeters;
3009     break;
3010   case 4: // METERS:
3011     UnitsAndTolerances.m_unit_system.m_unit_system = ON::meters;
3012     break;
3013   case 5: // KILOMETERS:
3014     UnitsAndTolerances.m_unit_system.m_unit_system = ON::kilometers;
3015     break;
3016   case 6: // MICROINCHES:
3017     UnitsAndTolerances.m_unit_system.m_unit_system = ON::microinches;
3018     break;
3019   case 7: // MILS:
3020     UnitsAndTolerances.m_unit_system.m_unit_system = ON::mils;
3021     break;
3022   case 8: // INCHES:
3023     UnitsAndTolerances.m_unit_system.m_unit_system = ON::inches;
3024     break;
3025   case 9: // FEET:
3026     UnitsAndTolerances.m_unit_system.m_unit_system = ON::feet;
3027     break;
3028   case 10: // MILES:
3029     UnitsAndTolerances.m_unit_system.m_unit_system = ON::miles;
3030     break;
3031   default: // NO_UNIT_SYSTEM:
3032     UnitsAndTolerances.m_unit_system.m_unit_system = ON::no_unit_system;
3033     break;
3034   }
3035   if (rc) rc = file.ReadDouble( &UnitsAndTolerances.m_absolute_tolerance );
3036   if (rc) rc = file.ReadDouble( &UnitsAndTolerances.m_relative_tolerance );
3037   if (rc) rc = file.ReadDouble( &UnitsAndTolerances.m_angle_tolerance );
3038   return rc;
3039 }
3040 
ON_3dmSettings_Read_v1_TCODE_VIEWPORT(ON_BinaryArchive & file,ON_3dmView & view)3041 static bool ON_3dmSettings_Read_v1_TCODE_VIEWPORT(ON_BinaryArchive& file, ON_3dmView& view)
3042 {
3043   // reads legacy 1.0 named construction plane TCODE_VIEWPORT chunk
3044   view.Default();
3045   bool rc = true;
3046   ON__UINT32 tcode;
3047   ON__INT64 big_value;
3048 
3049   double clipdist = 0.0;
3050   double snapsize = 0.0;
3051 
3052   int chunk_count = 0;// debugging counter
3053   for ( chunk_count = 0; rc; chunk_count++ )
3054   {
3055     rc = file.BeginRead3dmBigChunk( &tcode, &big_value );
3056     if (!rc )
3057       break;
3058     switch(tcode) {
3059 
3060     case TCODE_NEAR_CLIP_PLANE:
3061       rc = file.ReadDouble(&clipdist);
3062       break;
3063 
3064     case TCODE_SNAPSIZE:
3065       rc = file.ReadDouble(&snapsize);
3066       break;
3067 
3068     case TCODE_NAME:
3069       rc = ON_3dmSettings_Read_v1_TCODE_NAME(file,view.m_name);
3070       break;
3071 
3072     case TCODE_CPLANE:
3073       rc = ON_3dmSettings_Read_v1_TCODE_CPLANE(file,view.m_cplane);
3074       break;
3075 
3076     case TCODE_VIEW:
3077       rc = ON_3dmSettings_Read_v1_TCODE_VIEW( file, view );
3078       break;
3079 
3080     case TCODE_SHOWGRID:
3081       view.m_bShowConstructionGrid = big_value?true:false;
3082       break;
3083 
3084     case TCODE_SHOWGRIDAXES:
3085       view.m_bShowConstructionAxes = big_value?true:false;
3086       break;
3087 
3088     case TCODE_SHOWWORLDAXES:
3089       view.m_bShowWorldAxes = big_value?true:false;
3090       break;
3091 
3092     case TCODE_VIEWPORT_POSITION:
3093       rc = file.ReadDouble(&view.m_position.m_wnd_left);
3094       rc = file.ReadDouble(&view.m_position.m_wnd_top);
3095       rc = file.ReadDouble(&view.m_position.m_wnd_right);
3096       rc = file.ReadDouble(&view.m_position.m_wnd_bottom);
3097       break;
3098 
3099     case TCODE_VIEWPORT_TRACEINFO:
3100       {
3101         ON_3dPoint origin;
3102         ON_3dVector xaxis, yaxis;
3103         if (rc) rc = file.ReadPoint( origin );
3104         if (rc) rc = file.ReadVector( xaxis );
3105         if (rc) rc = file.ReadVector( yaxis );
3106         view.m_trace_image.m_plane.CreateFromFrame(origin,xaxis,yaxis);
3107         if (rc) rc = file.ReadDouble(&view.m_trace_image.m_width);
3108         if (rc) rc = file.ReadDouble(&view.m_trace_image.m_height);
3109         if (rc) rc = ON_3dmSettings_Read_v1_TCODE_NAME(file,view.m_trace_image.m_bitmap_filename);
3110       }
3111       break;
3112 
3113     case TCODE_VIEWPORT_WALLPAPER:
3114       rc = ON_3dmSettings_Read_v1_TCODE_NAME(file,view.m_wallpaper_image.m_bitmap_filename);
3115       break;
3116 
3117     case TCODE_HIDE_TRACE:
3118       // TCODE_HIDE_TRACE was used in early 1.0 betas.
3119       // It should have add the short bit set and it is no longer used.
3120       // This case is here so that these old files will read correctly.
3121       tcode |= TCODE_SHORT; // so goo skip will work
3122       break;
3123 
3124     case TCODE_MAXIMIZED_VIEWPORT:
3125       if ( big_value )
3126         view.m_position.m_bMaximized = true;
3127       break;
3128 
3129     case TCODE_VIEWPORT_DISPLAY_MODE: // short TCODE with display mode value
3130       switch ( big_value )
3131       {
3132       case 0: // wireframe working mode
3133         view.m_display_mode = ON::wireframe_display;
3134         break;
3135       case 1: // shaded working mode
3136         view.m_display_mode = ON::shaded_display;
3137         break;
3138       }
3139       break;
3140 
3141     }
3142     if ( !file.EndRead3dmChunk() )
3143       rc = false;
3144     if ( tcode == TCODE_ENDOFTABLE )
3145       break;
3146   }
3147   return rc;
3148 }
3149 
Read_v1(ON_BinaryArchive & file)3150 bool ON_3dmSettings::Read_v1( ON_BinaryArchive& file )
3151 {
3152   bool bGotSomething = false;
3153   bool rc = false;
3154   // read settings from old version 1 file
3155   std::size_t pos0 = file.CurrentPosition();
3156 
3157   // need to start at the beginning of the file
3158   ON__UINT32 tcode;
3159   ON__INT64 big_value;
3160   rc = file.SeekFromStart(32)?true:false; // skip 32 byte header
3161 
3162   int chunk_count = 0; // debugging counter
3163   for ( chunk_count = 0; rc; chunk_count++ )
3164   {
3165     rc = file.BeginRead3dmBigChunk( &tcode, &big_value );
3166     if ( !rc )
3167       break; // assume we are at the end of the file
3168 
3169     switch(tcode) {
3170     case TCODE_VIEWPORT:
3171       bGotSomething = true;
3172       {
3173         ON_3dmView view;
3174         rc = ON_3dmSettings_Read_v1_TCODE_VIEWPORT(file, view);
3175         if (rc)
3176           m_views.Append(view);
3177       }
3178       break;
3179 
3180     case TCODE_NAMED_CPLANE:
3181       bGotSomething = true;
3182       {
3183         ON_3dmConstructionPlane cplane;
3184         rc = ON_3dmSettings_Read_v1_TCODE_NAMED_CPLANE(file,cplane);
3185         if (rc)
3186           m_named_cplanes.Append(cplane);
3187       }
3188       break;
3189 
3190     case TCODE_NAMED_VIEW:
3191       bGotSomething = true;
3192       {
3193         ON_3dmView view;
3194         rc = ON_3dmSettings_Read_v1_TCODE_NAMED_VIEW(file, view);
3195         if (rc)
3196           m_named_views.Append(view);
3197       }
3198       break;
3199 
3200     case TCODE_UNIT_AND_TOLERANCES:
3201       bGotSomething = true;
3202       rc = ON_3dmSettings_Read_v1_TCODE_UNIT_AND_TOLERANCES(file,m_ModelUnitsAndTolerances);
3203       break;
3204     }
3205 
3206     rc = file.EndRead3dmChunk();
3207   }
3208 
3209   file.SeekFromStart(pos0);
3210   return bGotSomething;
3211 }
3212 
Read_v2(ON_BinaryArchive & file)3213 bool ON_3dmSettings::Read_v2(ON_BinaryArchive& file )
3214 {
3215   bool rc = true;
3216   ON__UINT32 tcode;
3217   ON__INT64 big_value;
3218 
3219   while(rc)
3220   {
3221     tcode = 0;
3222     big_value = 0;
3223     rc = file.BeginRead3dmBigChunk( &tcode, &big_value );
3224     if ( !rc )
3225       break;
3226 
3227     switch(tcode)
3228     {
3229     case TCODE_SETTINGS_PLUGINLIST:
3230       {
3231         int major_version = 0, minor_version = 0, count = 0, i;
3232         rc = file.Read3dmChunkVersion(&major_version,&minor_version);
3233         if (rc && 1 == major_version && minor_version >= 0 )
3234         {
3235           rc = file.ReadInt( &count );
3236           if ( count > 0 )
3237           {
3238             for ( i = 0; rc && i < count; i++ )
3239             {
3240               rc = m_plugin_list.AppendNew().Read(file);
3241             }
3242           }
3243         }
3244       }
3245       break;
3246 
3247     case TCODE_SETTINGS_UNITSANDTOLS: // units and tolerances
3248       rc = m_ModelUnitsAndTolerances.Read(file);
3249       // Copy model settings to page settings so reading old files
3250       // will work right.  If the file is new enough to have page
3251       // units and tolerances in it, they get read later.
3252       m_PageUnitsAndTolerances = m_ModelUnitsAndTolerances;
3253       break;
3254 
3255     case TCODE_SETTINGS_RENDERMESH:
3256       rc = m_RenderMeshSettings.Read(file);
3257       break;
3258 
3259     case TCODE_SETTINGS_ANALYSISMESH:
3260       rc = m_AnalysisMeshSettings.Read(file);
3261       break;
3262 
3263     case TCODE_SETTINGS_ANNOTATION:
3264       rc = m_AnnotationSettings.Read(file);
3265       break;
3266 
3267     case TCODE_SETTINGS_NAMED_CPLANE_LIST: // named cplanes
3268       {
3269         m_named_cplanes.Empty();
3270         ON__UINT32 subtcode = 0;
3271         ON__INT64 subvalue = 0;
3272         int count, i;
3273         rc = file.ReadInt(&count);
3274         for ( i = 0; i < count && rc ; i++ ) {
3275           rc = file.BeginRead3dmBigChunk( &subtcode, &subvalue );
3276           if (rc ) {
3277             if ( subtcode != TCODE_VIEW_CPLANE )
3278               rc = false;
3279             else {
3280               ON_3dmConstructionPlane& cplane = m_named_cplanes.AppendNew();
3281               rc = cplane.Read(file);
3282             }
3283             if ( !file.EndRead3dmChunk() ) {
3284               rc = false;
3285             }
3286           }
3287         }
3288       }
3289       break;
3290 
3291     case TCODE_SETTINGS_NAMED_VIEW_LIST: // named views
3292       {
3293         m_named_views.Empty();
3294         ON__UINT32 subtcode = 0;
3295         ON__INT64 subvalue = 0;
3296         int count, i;
3297         rc = file.ReadInt(&count);
3298         for ( i = 0; i < count && rc ; i++ )
3299         {
3300           rc = file.BeginRead3dmBigChunk( &subtcode, &subvalue );
3301           if (rc )
3302           {
3303             if ( subtcode != TCODE_VIEW_RECORD )
3304               rc = false;
3305             else
3306             {
3307               ON_3dmView& cplane = m_named_views.AppendNew();
3308               rc = cplane.Read(file);
3309             }
3310             if ( !file.EndRead3dmChunk() )
3311             {
3312               rc = false;
3313             }
3314           }
3315         }
3316       }
3317       break;
3318 
3319     case TCODE_SETTINGS_VIEW_LIST: // active view is first in list
3320       {
3321         m_views.Empty();
3322         ON__UINT32 subtcode = 0;
3323         ON__INT64 subvalue = 0;
3324         int count, i;
3325         rc = file.ReadInt(&count);
3326         m_views.Reserve(count);
3327         for ( i = 0; i < count && rc ; i++ )
3328         {
3329           rc = file.BeginRead3dmBigChunk( &subtcode, &subvalue );
3330           if (rc )
3331           {
3332             if ( subtcode != TCODE_VIEW_RECORD )
3333               rc = false;
3334             else
3335             {
3336               ON_3dmView& view = m_views.AppendNew();
3337               rc = view.Read(file);
3338             }
3339             if ( !file.EndRead3dmChunk() )
3340             {
3341               rc = false;
3342             }
3343           }
3344         }
3345       }
3346       break;
3347 
3348     case TCODE_SETTINGS__NEVER__USE__THIS:
3349       {
3350         if ( 28 == big_value )
3351         {
3352           // 23 March 2005 Dale Lear - this was the ON_LineStyle
3353           //                           and a linesytlesource int
3354           //                           that never got used.
3355           unsigned char b[24];
3356           if (rc) rc = file.ReadByte(24,b);
3357           // The other 4 bytes are a 32 bit chunk crc
3358           // that gets read by EndRead3dmChunk()
3359         }
3360       }
3361       break;
3362 
3363     case TCODE_SETTINGS_CURRENT_LAYER_INDEX:
3364       if ( big_value < -1 || big_value > 0x7FFFFFFF )
3365       {
3366         ON_ERROR("ON_3dmSettings::Read_v2() - TCODE_SETTINGS_CURRENT_LAYER_INDEX - invalid layer index value");
3367       }
3368       else
3369       {
3370         m_current_layer_index = (int)big_value;
3371       }
3372       break;
3373 
3374     case TCODE_SETTINGS_CURRENT_FONT_INDEX:
3375       if ( big_value < -1 || big_value > 0x7FFFFFFF )
3376       {
3377         ON_ERROR("ON_3dmSettings::Read_v2() - TCODE_SETTINGS_CURRENT_FONT_INDEX - invalid font index value");
3378       }
3379       else
3380       {
3381         // in archives with opennurbs version >= 200106100
3382         m_current_font_index = (int)big_value;
3383       }
3384       break;
3385 
3386     case TCODE_SETTINGS_CURRENT_DIMSTYLE_INDEX:
3387       if ( big_value < -1 || big_value > 0x7FFFFFFF )
3388       {
3389         ON_ERROR("ON_3dmSettings::Read_v2() - TCODE_SETTINGS_CURRENT_DIMSTYLE_INDEX - invalid dimstyle index value");
3390       }
3391       else
3392       {
3393         // in archives with opennurbs version >= 200106100
3394         m_current_dimstyle_index = (int)big_value;
3395       }
3396       break;
3397 
3398     case TCODE_SETTINGS_CURRENT_MATERIAL_INDEX:
3399       {
3400         int i32 = 0;
3401         if (rc) rc = file.ReadInt( &m_current_material_index );
3402         if (rc) rc = file.ReadInt( &i32 );
3403         if (rc) m_current_material_source = ON::ObjectMaterialSource(i32);
3404       }
3405       break;
3406 
3407     case TCODE_SETTINGS_CURRENT_COLOR:
3408       {
3409         int i32 = 0;
3410         if (rc) rc = file.ReadColor( m_current_color );
3411         if (rc) rc = file.ReadInt( &i32 );
3412         if (rc) m_current_color_source = ON::ObjectColorSource(i32);
3413       }
3414       break;
3415 
3416     case TCODE_SETTINGS_CURRENT_WIRE_DENSITY:
3417       if ( big_value < -2 || big_value > 0x7FFFFFFF )
3418       {
3419         ON_ERROR("ON_3dmSettings::Read_v2() - TCODE_SETTINGS_CURRENT_WIRE_DENSITY - invalid current_wire_density value");
3420       }
3421       else
3422       {
3423         m_current_wire_density = (int)big_value;
3424       }
3425       break;
3426 
3427     case TCODE_SETTINGS_RENDER:
3428       rc = m_RenderSettings.Read(file);
3429       break;
3430 
3431     case TCODE_SETTINGS_GRID_DEFAULTS:
3432       rc = m_GridDefaults.Read(file);
3433       break;
3434 
3435     case TCODE_SETTINGS_MODEL_URL: // added 21 June 2001
3436       rc = file.ReadString(m_model_URL);
3437       break;
3438 
3439     case TCODE_SETTINGS_ATTRIBUTES:
3440       {
3441         int major_version = 0;
3442         int minor_version = 0;
3443         for(;;)
3444         {
3445           rc = file.Read3dmChunkVersion(&major_version,&minor_version);
3446           if (!rc) break;
3447           if ( 1 == major_version )
3448           {
3449             // version 1.0 fields 23 March 2005
3450             rc = file.ReadDouble( &m_linetype_display_scale );
3451             if (!rc) break;
3452 
3453             rc = file.ReadColor(m_current_plot_color);
3454             if (!rc) break;
3455 
3456             int i;
3457             rc = file.ReadInt(&i);
3458             if (!rc) break;
3459             m_current_plot_color_source = ON::PlotColorSource(i);
3460 
3461             rc = file.ReadInt(&m_current_linetype_index);
3462             if (!rc) break;
3463 
3464             rc = file.ReadInt(&i);
3465             if (!rc) break;
3466             m_current_linetype_source = ON::ObjectLinetypeSource(i);
3467 
3468             if ( minor_version >= 1 )
3469             {
3470               // Added 6 Feb 2006
3471               int mjv = 1, mnv = 1;
3472               rc = file.BeginRead3dmChunk(TCODE_ANONYMOUS_CHUNK,&mjv,&mnv);
3473               if (rc)
3474               {
3475                 rc = m_PageUnitsAndTolerances.Read(file);
3476                 if ( !file.EndRead3dmChunk() )
3477                   rc = false;
3478               }
3479 
3480 
3481               if ( minor_version >= 2 )
3482               {
3483                 // 1 Mar 2006 1.2 fields
3484                 rc = file.ReadUuid(m_active_view_id);
3485                 if (!rc) break;
3486 
3487                 if ( minor_version >= 3 )
3488                 {
3489                   rc = file.ReadPoint( m_model_basepoint);
3490                   if (!rc) break;
3491                   rc = m_earth_anchor_point.Read(file);
3492                   if (!rc) break;
3493 
3494                   if ( minor_version >= 4 )
3495                   {
3496                     rc = file.ReadBool(&m_IO_settings.m_bSaveTextureBitmapsInFile);
3497                     if (rc && minor_version >= 5)
3498                     {
3499                       rc = m_IO_settings.Read(file);
3500                       if (rc && minor_version >= 6 )
3501                       {
3502                         // 7 June 2006
3503                         m_CustomRenderMeshSettings.Read(file);
3504                       }
3505                     }
3506                   }
3507                 }
3508               }
3509             }
3510 
3511           }
3512 
3513           break;
3514         }
3515       }
3516       break;
3517 
3518     default:
3519       // information added in future will be skipped by file.EndRead3dmChunk()
3520       break;
3521     }
3522 
3523     if ( !file.EndRead3dmChunk() )
3524       rc = false;
3525     if ( TCODE_ENDOFTABLE == tcode )
3526       break;
3527   }
3528 
3529   return rc;
3530 }
3531 
Read(ON_BinaryArchive & file)3532 bool ON_3dmSettings::Read(ON_BinaryArchive& file )
3533 {
3534   bool rc = false;
3535 
3536   Default();
3537 
3538   if ( 1 == file.Archive3dmVersion() )
3539   {
3540     rc = Read_v1(file);
3541   }
3542   else
3543   {
3544     rc = Read_v2(file);
3545   }
3546 
3547   return rc;
3548 }
3549 
3550 
ON_3dmSettings_Write_v1_TCODE_UNIT_AND_TOLERANCES(ON_BinaryArchive & file,const ON_3dmUnitsAndTolerances & UnitsAndTolerances)3551 static bool ON_3dmSettings_Write_v1_TCODE_UNIT_AND_TOLERANCES(ON_BinaryArchive& file, const ON_3dmUnitsAndTolerances& UnitsAndTolerances )
3552 {
3553   bool rc = true;
3554   int v = 1, us = 0;
3555   if (rc) rc = file.WriteInt( v ); // v = 1
3556   switch (UnitsAndTolerances.m_unit_system.m_unit_system)
3557   {
3558   case ON::no_unit_system:
3559     us=0; // NO_UNIT_SYSTEM
3560     break;
3561   case ON::microns:
3562     us=1; // MICRONS
3563     break;
3564   case ON::millimeters:
3565     us=2; // MILLIMETERS
3566     break;
3567   case ON::centimeters:
3568     us=3; // CENTIMETERS
3569     break;
3570   case ON::meters:
3571     us=4; // METERS
3572     break;
3573   case ON::kilometers:
3574     us=5; // KILOMETERS
3575     break;
3576   case ON::microinches:
3577     us=6; // MICROINCHES
3578     break;
3579   case ON::mils:
3580     us=7; // MILS
3581     break;
3582   case ON::inches:
3583     us=8; // INCHES
3584     break;
3585   case ON::feet:
3586     us=9; // FEET
3587     break;
3588   case ON::miles:
3589     us=10; // MILES
3590     break;
3591   default:
3592     us=0; // NO_UNIT_SYSTEM
3593     break;
3594   }
3595   if (rc) rc = file.WriteInt( us );
3596   if (rc) rc = file.WriteDouble( UnitsAndTolerances.m_absolute_tolerance );
3597   if (rc) rc = file.WriteDouble( UnitsAndTolerances.m_relative_tolerance );
3598   if (rc) rc = file.WriteDouble( UnitsAndTolerances.m_angle_tolerance );
3599 
3600   return rc;
3601 }
3602 
Write_v1(ON_BinaryArchive & file) const3603 bool ON_3dmSettings::Write_v1(ON_BinaryArchive& file) const
3604 {
3605   bool rc = true;
3606 
3607   // version 1 units and tolerances chunk
3608   rc = file.BeginWrite3dmChunk(TCODE_UNIT_AND_TOLERANCES,0);
3609   if (rc) {
3610     rc = ON_3dmSettings_Write_v1_TCODE_UNIT_AND_TOLERANCES( file, m_ModelUnitsAndTolerances );
3611     if (!file.EndWrite3dmChunk())
3612       rc = false;
3613   }
3614 
3615   return rc;
3616 }
3617 
Write_v2(ON_BinaryArchive & file) const3618 bool ON_3dmSettings::Write_v2(ON_BinaryArchive& file) const
3619 {
3620   int i;
3621   bool rc = true;
3622 
3623   // TCODE_SETTINGS_PLUGINLIST - plugins that may have saved userdata in the file
3624   if (rc && file.Archive3dmVersion() >= 4 && m_plugin_list.Count() > 0 )
3625   {
3626     // The plug-in list chunk needs to be first, so the plug-ins that save
3627     // userdata on views can be loaded as needed.
3628     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_PLUGINLIST,0);
3629     if ( rc )
3630     {
3631       if (rc) rc = file.Write3dmChunkVersion(1,0);
3632       if (rc) rc = file.WriteInt( m_plugin_list.Count() );
3633       for ( i = 0; rc && i < m_plugin_list.Count(); i++ )
3634       {
3635         rc = m_plugin_list[i].Write(file);
3636       }
3637 
3638       if ( !file.EndWrite3dmChunk() )
3639         rc = false;
3640     }
3641   }
3642 
3643   // TCODE_PROPERTIES_UNITSANDTOLS - units and tolerances
3644   if ( rc  ) {
3645     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_UNITSANDTOLS,0);
3646     if ( rc ) {
3647       rc = m_ModelUnitsAndTolerances.Write(file);
3648       if ( !file.EndWrite3dmChunk() )
3649         rc = false;
3650     }
3651   }
3652 
3653   // TCODE_SETTINGS_RENDERMESH - rendering defaults
3654   if ( rc  ) {
3655     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_RENDERMESH,0);
3656     if ( rc ) {
3657       rc = m_RenderMeshSettings.Write(file);
3658       if ( !file.EndWrite3dmChunk() )
3659         rc = false;
3660     }
3661   }
3662 
3663   // TCODE_SETTINGS_ANALYSISMESH - analysis mesh defaults
3664   if ( rc  ) {
3665     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_ANALYSISMESH,0);
3666     if ( rc ) {
3667       rc = m_AnalysisMeshSettings.Write(file);
3668       if ( !file.EndWrite3dmChunk() )
3669         rc = false;
3670     }
3671   }
3672 
3673   // TCODE_SETTINGS_ANNOTATION - annotation settings
3674   if ( rc  ) {
3675     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_ANNOTATION,0);
3676     if ( rc ) {
3677       rc = m_AnnotationSettings.Write(file);
3678       if ( !file.EndWrite3dmChunk() )
3679         rc = false;
3680     }
3681   }
3682 
3683   // TCODE_SETTINGS_NAMED_CPLANE_LIST
3684   if ( rc  ) {
3685     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_NAMED_CPLANE_LIST,0);
3686     if ( rc ) {
3687       const int count = m_named_cplanes.Count();
3688       rc = file.WriteInt(count);
3689       for ( i = 0; i < count && rc; i++ ) {
3690         rc = file.BeginWrite3dmChunk( TCODE_VIEW_CPLANE, 0 );
3691         if (rc ) {
3692           rc = m_named_cplanes[i].Write(file);
3693           if ( !file.EndWrite3dmChunk() )
3694             rc = false;
3695         }
3696       }
3697       if ( !file.EndWrite3dmChunk() )
3698         rc = false;
3699     }
3700   }
3701 
3702   // TCODE_SETTINGS_NAMED_VIEW_LIST
3703   if ( rc  ) {
3704     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_NAMED_VIEW_LIST,0);
3705     if ( rc ) {
3706       const int count = m_named_views.Count();
3707       rc = file.WriteInt(count);
3708       for ( i = 0; i < count && rc; i++ ) {
3709         rc = file.BeginWrite3dmChunk( TCODE_VIEW_RECORD, 0 );
3710         if (rc ) {
3711           rc = m_named_views[i].Write(file);
3712           if ( !file.EndWrite3dmChunk() )
3713             rc = false;
3714         }
3715       }
3716       if ( !file.EndWrite3dmChunk() )
3717         rc = false;
3718     }
3719   }
3720 
3721   // TCODE_SETTINGS_VIEW_LIST
3722   if ( rc  ) {
3723     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_VIEW_LIST,0);
3724     if ( rc ) {
3725       const int count = m_views.Count();
3726       rc = file.WriteInt(count);
3727       for ( i = 0; i < count && rc; i++ ) {
3728         rc = file.BeginWrite3dmChunk( TCODE_VIEW_RECORD, 0 );
3729         if (rc ) {
3730           rc = m_views[i].Write(file);
3731           if ( !file.EndWrite3dmChunk() )
3732             rc = false;
3733         }
3734       }
3735       if ( !file.EndWrite3dmChunk() )
3736         rc = false;
3737     }
3738   }
3739 
3740   // TCODE_SETTINGS_CURRENT_LAYER_INDEX
3741   if (rc) {
3742     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_CURRENT_LAYER_INDEX, m_current_layer_index );
3743     if ( !file.EndWrite3dmChunk() )
3744       rc = false;
3745   }
3746 
3747   // TCODE_SETTINGS_CURRENT_MATERIAL_INDEX
3748   if (rc) {
3749     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_CURRENT_MATERIAL_INDEX, 0 );
3750     if (rc) {
3751       rc = file.WriteInt( m_current_material_index );
3752       i = m_current_material_source;
3753       if (rc) rc = file.WriteInt( i );
3754       if ( !file.EndWrite3dmChunk() )
3755         rc = false;
3756     }
3757   }
3758 
3759   // TCODE_SETTINGS_CURRENT_COLOR
3760   if (rc) {
3761     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_CURRENT_COLOR, 0 );
3762     if (rc) {
3763       rc = file.WriteColor( m_current_color );
3764       i = m_current_color_source;
3765       if (rc) rc = file.WriteInt( i );
3766       if ( !file.EndWrite3dmChunk() )
3767         rc = false;
3768     }
3769   }
3770 
3771 
3772   // TCODE_SETTINGS_CURRENT_WIRE_DENSITY
3773   if (rc) {
3774     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_CURRENT_WIRE_DENSITY, m_current_wire_density );
3775     if (rc) {
3776       if ( !file.EndWrite3dmChunk() )
3777         rc = false;
3778     }
3779   }
3780 
3781   // TCODE_SETTINGS_RENDER
3782   if (rc) {
3783     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_RENDER, 0 );
3784     if (rc) {
3785       rc = m_RenderSettings.Write(file);
3786       if ( !file.EndWrite3dmChunk() )
3787         rc = false;
3788     }
3789   }
3790 
3791   // TCODE_SETTINGS_GRID_DEFAULTS
3792   if (rc) {
3793     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_GRID_DEFAULTS, 0 );
3794     if (rc) {
3795       rc = m_GridDefaults.Write(file);
3796       if ( !file.EndWrite3dmChunk() )
3797         rc = false;
3798     }
3799   }
3800 
3801   // TCODE_SETTINGS_MODEL_URL - added 21 June 2001
3802   if (rc && m_model_URL.Length() > 0 ) {
3803     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_MODEL_URL, 0 );
3804     if (rc) {
3805       rc = file.WriteString(m_model_URL);
3806       if ( !file.EndWrite3dmChunk() )
3807         rc = false;
3808     }
3809   }
3810 
3811   // TCODE_SETTINGS_CURRENT_FONT_INDEX - added 10 June 2002
3812   if (rc) {
3813     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_CURRENT_FONT_INDEX, m_current_font_index );
3814     if ( !file.EndWrite3dmChunk() )
3815       rc = false;
3816   }
3817 
3818   // TCODE_SETTINGS_CURRENT_DIMSTYLE_INDEX - added 10 June 2002
3819   if (rc) {
3820     rc = file.BeginWrite3dmChunk( TCODE_SETTINGS_CURRENT_DIMSTYLE_INDEX, m_current_dimstyle_index );
3821     if ( !file.EndWrite3dmChunk() )
3822       rc = false;
3823   }
3824 
3825   // TCODE_SETTINGS_ATTRIBUTES
3826   if (rc && file.Archive3dmVersion() >= 4 )
3827   {
3828     // 23 March 2005 Dale Lear
3829     rc = file.BeginWrite3dmChunk(TCODE_SETTINGS_ATTRIBUTES, 0 );
3830     if (rc)
3831     {
3832       for(;;)
3833       {
3834         // 1.0 - 23 March 2005
3835         // 1.1 -  6 Feb   2006
3836         // 1.2 -  1 March 2006
3837         // 1.3 - 29 March 2006
3838         // 1.4 - 18 April 2006
3839         // 1.5 - 21 April 2006
3840         // 1.6 -  7 June  2006
3841         rc = file.Write3dmChunkVersion(1,6);
3842 
3843         // version 1.0 fields
3844         rc = file.WriteDouble( m_linetype_display_scale );
3845         if (!rc) break;
3846 
3847         rc = file.WriteColor(m_current_plot_color);
3848         if (!rc) break;
3849 
3850         rc = file.WriteInt(m_current_plot_color_source);
3851         if (!rc) break;
3852 
3853         rc = file.WriteInt(m_current_linetype_index);
3854         if (!rc) break;
3855 
3856         rc = file.WriteInt(m_current_linetype_source);
3857         if (!rc) break;
3858 
3859         // 6 Feb 2006, 1.1 fields
3860 
3861         // the units and tols has to be inside a chunk
3862         rc = file.BeginWrite3dmChunk(TCODE_ANONYMOUS_CHUNK,1,0);
3863         if (rc)
3864         {
3865           rc = m_PageUnitsAndTolerances.Write(file);
3866           if ( !file.EndWrite3dmChunk() )
3867             rc = false;
3868         }
3869         if (!rc) break;
3870 
3871         // 1 Mar 2006 1.2 fields
3872         rc = file.WriteUuid(m_active_view_id);
3873         if (!rc) break;
3874 
3875         // 29 March 2006 1.3 fields
3876         rc = file.WritePoint( m_model_basepoint);
3877         if (!rc) break;
3878         rc = m_earth_anchor_point.Write(file);
3879         if (!rc) break;
3880 
3881         // 18 April 2006 1.4 fields
3882         rc = file.WriteBool(m_IO_settings.m_bSaveTextureBitmapsInFile);
3883         if (!rc) break;
3884 
3885         // 21 April 2006 1.5 fields
3886         rc = m_IO_settings.Write(file);
3887         if (!rc) break;
3888 
3889         // 7 June 2006 1.6 fields
3890         rc = m_CustomRenderMeshSettings.Write(file);
3891         if (!rc) break;
3892 
3893         break;
3894       }
3895 
3896       if ( !file.EndWrite3dmChunk() )
3897         rc = false;
3898     }
3899   }
3900 
3901   // required TCODE_ENDOFTABLE chunk - marks end of settings table
3902   if ( rc ) {
3903     rc = file.BeginWrite3dmChunk( TCODE_ENDOFTABLE, 0 );
3904     if ( rc ) {
3905       if ( !file.EndWrite3dmChunk() )
3906         rc = false;
3907     }
3908   }
3909 
3910 
3911   return rc;
3912 }
3913 
Write(ON_BinaryArchive & file) const3914 bool ON_3dmSettings::Write(ON_BinaryArchive& file) const
3915 {
3916   bool rc = false;
3917   if ( 1 == file.Archive3dmVersion() )
3918   {
3919     rc = Write_v1(file);
3920   }
3921   else
3922   {
3923     rc = Write_v2(file);
3924   }
3925   return rc;
3926 }
3927 
Dump(ON_TextLog & dump) const3928 void ON_3dmSettings::Dump( ON_TextLog& dump ) const
3929 {
3930   int i;
3931 
3932   const wchar_t* model_URL = m_model_URL;
3933   if ( model_URL && *model_URL )
3934   {
3935     dump.Print("Model URL: %ls\n",model_URL);
3936   }
3937   dump.Print("Model space units and tolerances:\n");
3938   dump.PushIndent();
3939   m_ModelUnitsAndTolerances.Dump(dump);
3940   dump.PopIndent();
3941 
3942   dump.Print("Page space units and tolerances:\n");
3943   dump.PushIndent();
3944   m_PageUnitsAndTolerances.Dump(dump);
3945   dump.PopIndent();
3946 
3947   dump.Print("Render mesh settings:\n");
3948   dump.PushIndent();
3949   m_RenderMeshSettings.Dump(dump);
3950   dump.PopIndent();
3951 
3952   dump.Print("Analysis mesh settings:\n");
3953   dump.PushIndent();
3954   m_AnalysisMeshSettings.Dump(dump);
3955   dump.PopIndent();
3956 
3957   dump.Print("Render settings:\n");
3958   dump.PushIndent();
3959   m_RenderSettings.Dump(dump);
3960   dump.PopIndent();
3961 
3962   dump.Print("Annotation settings:\n");
3963   dump.PushIndent();
3964   m_AnnotationSettings.Dump(dump);
3965   dump.PopIndent();
3966 
3967   dump.Print("Construction plane grid defaults:\n");
3968   dump.PushIndent();
3969   m_GridDefaults.Dump(dump);
3970   dump.PopIndent();
3971 
3972   dump.Print("Named construction planes:\n");
3973   dump.PushIndent();
3974   for ( i = 0; i < m_named_cplanes.Count(); i++ )
3975   {
3976     dump.Print("named construction plane %d:\n");
3977     dump.PushIndent();
3978     m_named_cplanes[i].Dump(dump);
3979     dump.PopIndent();
3980   }
3981   dump.PopIndent();
3982 
3983   dump.Print("Named views:\n");
3984   dump.PushIndent();
3985   for ( i = 0; i < m_named_views.Count(); i++ )
3986   {
3987     dump.Print("named view %d:\n",i);
3988     dump.PushIndent();
3989     m_named_views[i].Dump(dump);
3990     dump.PopIndent();
3991   }
3992   dump.PopIndent();
3993 
3994   dump.Print("Model views:\n");
3995   dump.PushIndent();
3996   for ( i = 0; i < m_views.Count(); i++ )
3997   {
3998     dump.Print("model view %d:\n",i);
3999     dump.PushIndent();
4000     m_views[i].Dump(dump);
4001     dump.PopIndent();
4002   }
4003   dump.PopIndent();
4004 
4005   dump.Print("New object attributes:\n");
4006   dump.PushIndent();
4007   {
4008     dump.Print("Current display color rgb");dump.PrintRGB(m_current_color); dump.Print(":\n");
4009     dump.Print("Current display color source = %d\n",m_current_color_source);
4010     dump.Print("Current plot color rgb");dump.PrintRGB(m_current_plot_color); dump.Print(":\n");
4011     dump.Print("Current plot color source = %d\n",m_current_plot_color_source);
4012     dump.Print("Current material index = %d\n",m_current_material_index);
4013     dump.Print("Current material source = %d\n",m_current_material_source);
4014     dump.Print("Current linetype index = %d\n",m_current_linetype_index);
4015     dump.Print("Current linetype source = %d\n",m_current_linetype_source);
4016     dump.Print("Current layer index = %d\n",m_current_layer_index);
4017     dump.Print("Current font index = %d\n",m_current_font_index);
4018     dump.Print("Current dimstyle index = %d\n",m_current_dimstyle_index);
4019     dump.Print("Current wire density = %d\n",m_current_wire_density);
4020     dump.Print("Linetype diaplay scale = %g\n",m_linetype_display_scale);
4021   }
4022   dump.PopIndent();
4023 
4024   dump.Print("Plug-in list\n");
4025   dump.PushIndent();
4026   for ( i = 0; i < m_plugin_list.Count(); i++ )
4027   {
4028     dump.Print("plug-in %d:\n",i);
4029     dump.PushIndent();
4030     m_plugin_list[i].Dump(dump);
4031     dump.PopIndent();
4032   }
4033   dump.PopIndent();
4034 
4035 }
4036 
4037