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