-
Notifications
You must be signed in to change notification settings - Fork 0
/
file.ReleaseNotes.html
2034 lines (1842 loc) · 72.1 KB
/
file.ReleaseNotes.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>
File: Release Notes
— SketchUp Ruby API Documentation
</title>
<link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="css/sketchup.css" type="text/css" charset="utf-8" />
<link rel="stylesheet" href="css/rubyapi.css" type="text/css" charset="utf-8" />
<script type="text/javascript" charset="utf-8">
pathId = "ReleaseNotes";
relpath = '';
</script>
<script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="js/app.js"></script>
<link rel="shortcut icon" type="image/vnd.microsoft.icon"
href="https://help.sketchup.com/sites/all/themes/sketch_help/favicon.ico">
<link rel='stylesheet' type='text/css'
href='https://fonts.googleapis.com/css?family=Open+Sans:400,700,400italic'>
<script>
// Every time this page is loaded, it sends this action to SketchUp, telling
// SketchUp that a new page has loaded that has example snippets that should
// be replaced with code editors. Nothing happens if the page is loaded in a
// regular browser outside of the SketchUp client.
$( document ).ready(function() {
if (typeof sketchup == 'object') {
sketchup.page_loaded();
}
});
</script>
</head>
<body>
<!-- SU - start -->
<header id="navbar" role="banner" class="navbar navbar-fixed-top navbar-inverse">
<div id="api-documentation-header">
<div class="navbar-header">
<a class="logo navbar-btn pull-left" href="http://developer.sketchup.com" title="Home">
<img src="http://developer.sketchup.com/sites/help.sketchup.com/files/SU_Developer-RedWhite.png" alt="Home">
</a>
<a class="name navbar-brand" href="/en" title="Home">SketchUp Developer Center</a>
<!-- .btn-navbar is used as the toggle for collapsed navbar content -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse">
<nav role="navigation">
<ul class="menu nav navbar-nav">
<li class="first leaf"><a href="http://forums.sketchup.com/c/developers">Community</a></li>
<li class="leaf"><a href="http://blog.sketchup.com/tags/developers">SketchUpdate Blog</a></li>
<li class="leaf"><a href="http://www.sketchup.com/download" class="top-menu--download-button">Download</a></li>
<li class="last expanded dropdown">
<a href="http://www.trimble.com" class="trimble-top-menu-item dropdown-toggle" data-target="#" data-toggle="dropdown"><img src="http://www.sketchup.com/sites/developers.sketchup.com/files/core/trimble-logo-white.png"><span class="caret"></span></a>
<ul class="dropdown-menu">
<li class="first leaf"><a href="http://connect.trimble.com/">Trimble Connect</a></li>
<li class="leaf"><a href="https://www.trimble.com/Corporate/About_Trimble.aspx">About Trimble</a></li>
<li class="last leaf"><a href="http://buildings.trimble.com/">Trimble Buildings</a></li>
</ul>
</li>
</ul>
</nav>
</div>
</div>
</header>
<!-- SU - end -->
<div id="su-content">
<div class="nav_wrap">
<iframe id="nav" src="file_list.html"></iframe>
<div id="resizer"></div>
</div>
<div id="main" tabindex="-1">
<div id="header">
<div id="menu">
<a href="_index.html">Index</a> »
<span class="title">File: Release Notes</span>
</div>
<div id="search">
<a class="full_list_link" id="class_list_link"
href="class_list.html">
<svg width="24" height="24">
<rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
<rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
</svg>
</a>
</div>
<div class="clear"></div>
</div>
<iframe id="search_frame" src="file_list.html"></iframe>
<div id="content"><div id='filecontents'>
<h1 id="label-Release+Notes">Release Notes</h1>
<p>The SketchUp API has been around in some fashion since the early days of
SketchUp, and with every release we have extended its capabilities. Read
below for what's been changed.</p>
<p>Though our adoption rate to the latest version is quite high, it can take
time after a release before everyone upgrades. If you are building scripts
that rely on functionality from the most recent version, be sure to check
the Sketchup.version to make sure your users are able to run your script:</p>
<pre class="code ruby"><code class="ruby"><span class='comment'># You do something like this in the initialization routine of your extension.
</span><span class='id identifier rubyid_version_required'>version_required</span> <span class='op'>=</span> <span class='int'>16</span>
<span class='kw'>if</span> <span class='lparen'>(</span><span class='const'>Sketchup</span><span class='period'>.</span><span class='id identifier rubyid_version'>version</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span> <span class='op'><</span> <span class='id identifier rubyid_version_required'>version_required</span><span class='rparen'>)</span>
<span class='const'>UI</span><span class='period'>.</span><span class='id identifier rubyid_messagebox'>messagebox</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>You must have Sketchup 20</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_version_required'>version_required</span><span class='embexpr_end'>}</span><span class='tstring_content'> to run this </span><span class='tstring_end'>"</span></span>\
<span class='tstring'><span class='tstring_beg'>"</span><span class='tstring_content'>extension. Visit sketchup.com to upgrade.</span><span class='tstring_end'>"</span></span><span class='rparen'>)</span>
<span class='kw'>return</span>
<span class='kw'>end</span>
</code></pre>
<h2 id="label-Build+Numbers">Build Numbers</h2>
<p>Here are the build numbers for recent SketchUp releases. Note that build
numbers in languages besides English are larger for each release, so it is
best to check for builds that are greater than or equal to the numbers
here.</p>
<ul><li>
<p><strong>SU2017 M0</strong> = 17.0.18899 on Windows 64-bit, 17.0.18898 on
Mac 64-bit.</p>
</li><li>
<p><strong>SU2016 M0</strong> = 16.0.19912 on Windows 64-bit, 16.0.19911 on
Windows 32-bit, 16.0.19913 on Mac 64-bit.</p>
</li><li>
<p><strong>SU2015 M2</strong> = 15.2.685 on Windows 64-bit, 15.2.687 on
Windows 32-bit, 15.2.686 on Mac 64-bit.</p>
</li><li>
<p><strong>SU2015 M1</strong> = 15.1.106 on Windows 64-bit, 15.1.105 on
Windows 32-bit, 15.1.104 on Mac 64-bit.</p>
</li><li>
<p><strong>SU2015</strong> = 15.0.9350 on Windows 64-bit, 15.0.9351 on Windows
32-bit, 15.0.9349 on Mac 64-bit.</p>
</li><li>
<p><strong>SU2014 M1</strong> = 14.1.1282 on Windows, 14.1.1283 on Mac.</p>
</li><li>
<p><strong>SU2014</strong> = 14.0.4900 on Windows, 14.0.4899 on Mac.</p>
</li><li>
<p><strong>SU2013 M2</strong> = 13.0.4812 on Windows, 13.0.4811 on Mac.</p>
</li><li>
<p><strong>SU2013 M1</strong> = 13.0.4124 on Windows, 13.0.4123 on Mac.</p>
</li><li>
<p><strong>SU2013</strong> = 13.0.3689 on Windows, 13.0.3688 on Mac.</p>
</li><li>
<p><strong>SU8.0 M2</strong> = 8.0.11752 on Windows, 8.0.11751 on Mac.</p>
</li><li>
<p><strong>SU8.0 M1</strong> = 8.0.4811 on Windows, 8.0.4810 on Mac.</p>
</li><li>
<p><strong>SU8.0</strong> = 8.0.3117 on Windows, 8.0.3161 on Mac.</p>
</li><li>
<p><strong>SU7.1 M2</strong> = 7.1.6860 on Windows, 7.1.6859 on Mac.</p>
</li><li>
<p><strong>SU7.0 M1</strong> = 7.0.10247 on Windows, 7.0.10246 on Mac.</p>
</li><li>
<p><strong>SU7.0 M0</strong> = 7.0.8657 on Windows, 7.0.8656 on Mac.</p>
</li><li>
<p><strong>SU6 M6</strong> = 6.4.265 on Windows, 6.4.263 on Mac.</p>
</li></ul>
<h1 id="label-What-27s+new+in+SketchUp+2017+M0">What's new in SketchUp 2017 M0</h1>
<h2 id="label-Ruby+2.2">Ruby 2.2</h2>
<p>Yes, its that time again - time to update our Ruby Interpreter. We have
upgraded to Ruby version 2.2.4. We're hopeful that extensions that use
pure ruby will be able to upgrade to Ruby 2.2 with little difficulty.
Please note that any compiled C extensions will need to be rebuilt.</p>
<h2 id="label-Embedded+Web+Framework">Embedded Web Framework</h2>
<p>One of the developer features we are most excited about for SketchUp 2017
is a new Web Dialog framework. For SketchUp 2017 we are bundling the
Chromium Web Browser with the SketchUp installer. What?! Yes, now SketchUp
comes pre-packaged with a single web browser for both Mac and Windows
clients. No more trauma from banging your head against the wall while
trying to make your web pages compatible with Internet Explorer 8-11 and
Safari.</p>
<p>In order to maintain backwards compatibility, we have implemented a new
HtmlDialog class in the Ruby API and we have not altered the existing
WebDialog class. Extensions that use WebDialogs should continue to work
with no changes required.</p>
<h2 id="label-New+Ruby+API+Documentation">New Ruby API Documentation</h2>
<p>We have been working to improve our Ruby API documents and the publication
process. We switched from an internally tweaked and maintained version of
RDoc to YARD for our documentation generation. In the process we had to
make many alterations to our documentation in the source code, we made a
specialized YARD template to suit our needs. What we have now is a simple
way to regenerate the documents in a matter of seconds, and we can push
them to a git repo, where they are immediately available publicly. A
process that used to take hours of manual html editing and special access
to our Sketchup.com webserver, has been reduced to about a 10 minute
process to generate and publish the documentation.</p>
<h2 id="label-SketchUp+C+API+Parity+-+continued">SketchUp C API Parity - continued</h2>
<p>We have focused on adding features to the SketchUp C API in 2017 to provide
greater benefit to our developers and as part of our continued effort to
fully deprecate and remove the old C++ API in the future. A complete list
of functions that we have added for 2017 can be found below. We are
continuing to add more until we gain enough coverage to consider the C API
at feature parity with the deprecated C++ API.</p>
<h2 id="label-Updated+Compilers">Updated Compilers</h2>
<p>We updated our compilers for Windows and macOS. On Windows we are now using
Visual Studio 2015 SP1 (targeting Windows 7). On MacOs we are using XCode
7.2.1 (with deployment target 10.10).</p>
<h2 id="label-New+Ruby+API+Features">New Ruby API Features</h2>
<ul><li>
<p>Added class SketchUp::InstancePath</p>
</li><li>
<p>Added class Sketchup::Http::Request</p>
</li><li>
<p>Added class Sketchup::Http::Response</p>
</li><li>
<p>Added class UI::Notification</p>
</li><li>
<p>Added method Sketchup::Entity.persistent_id</p>
</li><li>
<p>Added method Sketchup::InputPoint.instance_path</p>
</li><li>
<p>Added method Sketchup::Model.find_entity_by_pid</p>
</li><li>
<p>Added method Sketchup::Model.instance_path_from_pid_path</p>
</li><li>
<p>Added method Sketchup::Materials.load</p>
</li><li>
<p>Added method Sketchup::Material.save_as</p>
</li><li>
<p>Added method UI.scale_factor</p>
</li></ul>
<h2 id="label-New+LayOut+C+API+Features+and+Improvements">New LayOut C API Features and Improvements</h2>
<ul><li>
<p>Added LOAutoTextDefinitionRef to support auto text definitions.</p>
</li><li>
<p>Added LOConnectionPointCreateFromPID in order to support deep connections.</p>
</li><li>
<p>Added LOVector2D and modified LOPathGetTangentAtParameter to require an
LOVector2D instead of an LOPoint2D.</p>
</li><li>
<p>Added LOPathCreateArc.</p>
</li><li>
<p>Added LOPathGetCircle.</p>
</li><li>
<p>Added LOPathGetArc.</p>
</li><li>
<p>Added LOImageSetClipMask.</p>
</li><li>
<p>Added LOSketchUpModelGetClipMask.</p>
</li><li>
<p>Added LOSketchUpModelSetClipMask.</p>
</li><li>
<p>Added LOSketchUpModelGetModel, which returns an SUModelRef.</p>
</li><li>
<p>Added LOTableRef object to support the new LayOut Table entity.</p>
</li><li>
<p>Added LOAngularDimensionRef object to support angular dimensions.</p>
</li></ul>
<h2 id="label-New+SketchUp+C+API+Features">New SketchUp C API Features</h2>
<ul><li>
<p>Added SUCameraGet2D()</p>
</li><li>
<p>Added SUCameraGetCenter2D()</p>
</li><li>
<p>Added SUCameraGetClippingDistances()</p>
</li><li>
<p>Added SUCameraGetDescription()</p>
</li><li>
<p>Added SUCameraGetDirection()</p>
</li><li>
<p>Added SUCameraGetFOVIsHeight()</p>
</li><li>
<p>Added SUCameraGetImageWidth()</p>
</li><li>
<p>Added SUCameraGetScale2D()</p>
</li><li>
<p>Added SUCameraGetViewTransformation()</p>
</li><li>
<p>Added SUCameraSet2D()</p>
</li><li>
<p>Added SUCameraSetAspectRatio()</p>
</li><li>
<p>Added SUCameraSetCenter2D()</p>
</li><li>
<p>Added SUCameraSetDescription()</p>
</li><li>
<p>Added SUCameraSetFOVIsHeight()</p>
</li><li>
<p>Added SUCameraSetImageWidth()</p>
</li><li>
<p>Added SUCameraSetScale2D()</p>
</li><li>
<p>Added SUComponentDefinitionGetInstances()</p>
</li><li>
<p>Added SUComponentDefinitionGetNumInstances()</p>
</li><li>
<p>Added SUComponentDefinitionGetNumUsedInstances()</p>
</li><li>
<p>Added SUDimensionFromDrawingElement()</p>
</li><li>
<p>Added SUDimensionFromEntity()</p>
</li><li>
<p>Added SUDimensionGetArrowType()</p>
</li><li>
<p>Added SUDimensionGetPlane()</p>
</li><li>
<p>Added SUDimensionGetText()</p>
</li><li>
<p>Added SUDimensionGetText3D()</p>
</li><li>
<p>Added SUDimensionGetType()</p>
</li><li>
<p>Added SUDimensionLinearCreate()</p>
</li><li>
<p>Added SUDimensionLinearFromDimension()</p>
</li><li>
<p>Added SUDimensionLinearGetEndPoint()</p>
</li><li>
<p>Added SUDimensionLinearGetHorizontalAlignment()</p>
</li><li>
<p>Added SUDimensionLinearGetNormal()</p>
</li><li>
<p>Added SUDimensionLinearGetPosition()</p>
</li><li>
<p>Added SUDimensionLinearGetStartPoint()</p>
</li><li>
<p>Added SUDimensionLinearGetVerticalAlignment()</p>
</li><li>
<p>Added SUDimensionLinearGetXAxis()</p>
</li><li>
<p>Added SUDimensionLinearRef</p>
</li><li>
<p>Added SUDimensionLinearRelease()</p>
</li><li>
<p>Added SUDimensionLinearSetEndPoint()</p>
</li><li>
<p>Added SUDimensionLinearSetHorizontalAlignment()</p>
</li><li>
<p>Added SUDimensionLinearSetNormal()</p>
</li><li>
<p>Added SUDimensionLinearSetPosition()</p>
</li><li>
<p>Added SUDimensionLinearSetVerticalAlignment()</p>
</li><li>
<p>Added SUDimensionLinearSetXAxis()</p>
</li><li>
<p>Added SUDimensionLinearToDimension()</p>
</li><li>
<p>Added SUDimensionRadialCreate()</p>
</li><li>
<p>Added SUDimensionRadialFromDimension()</p>
</li><li>
<p>Added SUDimensionRadialGetCurveInstancePath()</p>
</li><li>
<p>Added SUDimensionRadialGetDiameter()</p>
</li><li>
<p>Added SUDimensionRadialGetLeaderBreakPoint()</p>
</li><li>
<p>Added SUDimensionRadialGetLeaderPoints()</p>
</li><li>
<p>Added SUDimensionRadialRef</p>
</li><li>
<p>Added SUDimensionRadialRelease()</p>
</li><li>
<p>Added SUDimensionRadialSetCurveInstancePath()</p>
</li><li>
<p>Added SUDimensionRadialSetDiameter()</p>
</li><li>
<p>Added SUDimensionRadialSetLeaderBreakPoint()</p>
</li><li>
<p>Added SUDimensionRadialToDimension()</p>
</li><li>
<p>Added SUDimensionRef</p>
</li><li>
<p>Added SUDimensionSetArrowType()</p>
</li><li>
<p>Added SUDimensionSetText()</p>
</li><li>
<p>Added SUDimensionSetText3D()</p>
</li><li>
<p>Added SUDimensionStyleGet3D()</p>
</li><li>
<p>Added SUDimensionStyleGetArrowSize()</p>
</li><li>
<p>Added SUDimensionStyleGetArrowType()</p>
</li><li>
<p>Added SUDimensionStyleGetColor()</p>
</li><li>
<p>Added SUDimensionStyleGetExtensionLineOffset()</p>
</li><li>
<p>Added SUDimensionStyleGetExtensionLineOvershoot()</p>
</li><li>
<p>Added SUDimensionStyleGetFont()</p>
</li><li>
<p>Added SUDimensionStyleGetHideOutOfPlane()</p>
</li><li>
<p>Added SUDimensionStyleGetHideOutOfPlaneValue()</p>
</li><li>
<p>Added SUDimensionStyleGetHideSmall()</p>
</li><li>
<p>Added SUDimensionStyleGetHideSmallValue()</p>
</li><li>
<p>Added SUDimensionStyleGetLineWeight()</p>
</li><li>
<p>Added SUDimensionStyleGetShowRadialPrefix()</p>
</li><li>
<p>Added SUDimensionStyleGetTextColor()</p>
</li><li>
<p>Added SUDimensionStyleRef</p>
</li><li>
<p>Added SUDimensionToDrawingElement()</p>
</li><li>
<p>Added SUDimensionToEntity()</p>
</li><li>
<p>Added SUEntitiesErase()</p>
</li><li>
<p>Added SUEntitiesGetNumDimensions()</p>
</li><li>
<p>Added SUEntitiesGetDimensions()</p>
</li><li>
<p>Added SUEntitiesIsRecursivelyEmpty()</p>
</li><li>
<p>Added SUEntitiesTransform()</p>
</li><li>
<p>Added SUEntitiesTransformMultiple()</p>
</li><li>
<p>Added SUFontGetBold()</p>
</li><li>
<p>Added SUFontGetFaceName()</p>
</li><li>
<p>Added SUFontGetItalic()</p>
</li><li>
<p>Added SUFontGetPointSize()</p>
</li><li>
<p>Added SUFontGetUseWorldSize()</p>
</li><li>
<p>Added SUFontGetWorldSize</p>
</li><li>
<p>Added SUFontRef</p>
</li><li>
<p>Added SUGeometryInputAddCurve()</p>
</li><li>
<p>Added SUGeometryInputAddEdge()</p>
</li><li>
<p>Added SUGeometryInputEdgeSetHidden()</p>
</li><li>
<p>Added SUGeometryInputEdgeSetSoft()</p>
</li><li>
<p>Added SUGeometryInputEdgeSetSmooth()</p>
</li><li>
<p>Added SUGeometryInputFaceSetHidden()</p>
</li><li>
<p>Added SUImageCreateFromImageRep()</p>
</li><li>
<p>Added SUImageGetImageRep()</p>
</li><li>
<p>Added SUImageRepRef</p>
</li><li>
<p>Added SUImageRepConvertTo32BitsPerPixel()</p>
</li><li>
<p>Added SUImageRepCopy()</p>
</li><li>
<p>Added SUImageRepCreate()</p>
</li><li>
<p>Added SUImageRepGetData()</p>
</li><li>
<p>Added SUImageRepGetDataSize()</p>
</li><li>
<p>Added SUImageRepGetPixelDimensions()</p>
</li><li>
<p>Added SUImageRepGetRowPadding()</p>
</li><li>
<p>Added SUImageRepLoadFile()</p>
</li><li>
<p>Added SUImageRepRelease()</p>
</li><li>
<p>Added SUImageRepResize()</p>
</li><li>
<p>Added SUImageRepSaveToFile()</p>
</li><li>
<p>Added SUImageRepSetData()</p>
</li><li>
<p>Added SUMaterialGetNameLegacyBehavior()</p>
</li><li>
<p>Added SUModelGetDimensionStyle()</p>
</li><li>
<p>Added SUModelGetStyles()</p>
</li><li>
<p>Added SUModelIsGeoReferenced()</p>
</li><li>
<p>Added SUPlane3DGetNormal()</p>
</li><li>
<p>Added SUSceneActivate()</p>
</li><li>
<p>Added SUSceneClearPhotoMatchImage()</p>
</li><li>
<p>Added SUSceneCopy()</p>
</li><li>
<p>Added SUSceneGetFlags()</p>
</li><li>
<p>Added SUSceneGetPhotoMatchImageDisplayed()</p>
</li><li>
<p>Added SUSceneGetSketchAxesDisplayed()</p>
</li><li>
<p>Added SUSceneGetStyle()</p>
</li><li>
<p>Added SUSceneSetFlags()</p>
</li><li>
<p>Added SUSceneSetSketchAxesDisplayed()</p>
</li><li>
<p>Added SUStyleCreate()</p>
</li><li>
<p>Added SUStyleCreateFromFile()</p>
</li><li>
<p>Added SUStyleFromEntity()</p>
</li><li>
<p>Added SUStyleGetDescription()</p>
</li><li>
<p>Added SUStyleGetDisplayName()</p>
</li><li>
<p>Added SUStyleGetDisplaysWatermark()</p>
</li><li>
<p>Added SUStyleGetGuid()</p>
</li><li>
<p>Added SUStyleGetName()</p>
</li><li>
<p>Added SUStyleGetPath()</p>
</li><li>
<p>Added SUStyleGetProperty()</p>
</li><li>
<p>Added SUStyleSetProperty()</p>
</li><li>
<p>Added SUStyleRef</p>
</li><li>
<p>Added SUStyleRelease()</p>
</li><li>
<p>Added SUStylesAddStyle()</p>
</li><li>
<p>Added SUStylesApplyStyleToScene()</p>
</li><li>
<p>Added SUStyleSaveToFile()</p>
</li><li>
<p>Added SUStyleSetDescription()</p>
</li><li>
<p>Added SUStyleSetName()</p>
</li><li>
<p>Added SUStylesGetActiveStyle()</p>
</li><li>
<p>Added SUStylesGetActiveStyleChanged()</p>
</li><li>
<p>Added SUStylesGetNumStyles()</p>
</li><li>
<p>Added SUStylesGetSelectedStyle()</p>
</li><li>
<p>Added SUStylesGetStyleByGuid()</p>
</li><li>
<p>Added SUStylesGetStyleByPath()</p>
</li><li>
<p>Added SUStylesGetStyles()</p>
</li><li>
<p>Added SUStylesRef</p>
</li><li>
<p>Added SUStyleToEntity()</p>
</li><li>
<p>Added SUStringCompare()</p>
</li><li>
<p>Added SUTextureSetFileName()</p>
</li><li>
<p>Added SUTransformationSetFromPointAndNormal()</p>
</li></ul>
<h2 id="label-Bug+Fixes-2FSmall+Improvements">Bug Fixes/Small Improvements</h2>
<h3 id="label-Ruby+API">Ruby API</h3>
<ul><li>
<p>Fixed Entities.transform_by_vectors so that it performs a bounds check on
the second array. An ArgumentError is raised if the second array has less
items than the first.</p>
</li><li>
<p>Added ability to UI::HtmlDialogs to receive JavaScript arrays and objects
using callbacks.</p>
</li><li>
<p>Removed a limitation with UI::HtmlDialog where callbacks were required to
have at least one argument. Now no arguments are required.</p>
</li></ul>
<h3 id="label-LayOut+C+API">LayOut C API</h3>
<ul><li>
<p>Linear Dimensions will now have the default style applied to them upon
creation.</p>
</li><li>
<p>LOGetAPIVersion now returns a major.minor version of 2.0.</p>
</li></ul>
<h2 id="label-SketchUp+C+API">SketchUp C API</h2>
<ul><li>
<p>Changed SUComponentDefinitionRelease(), now can be used to destroy
definitions in models</p>
</li><li>
<p>Changed SUMaterialGetName(), now returns internal unprocessed string
identifier</p>
</li><li>
<p>Fixed bug in SUModelGetComponentDefinitions that occurred when requesting
fewer component definitions than are in the model.</p>
</li><li>
<p>Fixed memory leak in SUModelGetStatistics.</p>
</li><li>
<p>Modified SUMaterialGetName to return the internal name.</p>
</li><li>
<p>Added SUMaterialGetNameLegacyBehavior which behaves as the same as the old
SUMaterialGetName by returning the display name, but without any
translations applied.</p>
</li></ul>
<h2 id="label-What-27s+new+in+SketchUp+2016+M0">What's new in SketchUp 2016 M0</h2>
<h3 id="label-A+new+LayOut+API">A new LayOut API</h3>
<p>We’re proud to announce our first step towards an extension ecosystem for
LayOut. Using this new API developers can now open, create, modify, save,
and export .layout files. Practically, this means that other applications
can import or export the .layout file format using the C API. (This
includes creating a .layout file from SketchUp). We have several sample
scripts for developers to try out at release. Check out the API
documentation in the <a
href="http://extensions.sketchup.com/developer_center/layout_c_api/layout/index.html">Developer
Center</a> for more information.</p>
<h3 id="label-Digitally+Signing+Extensions+-+Extensions+Loading+Policy">Digitally Signing Extensions - Extensions Loading Policy</h3>
<p>With SketchUp 2016 we introduced the ability for users to select which
Extension Loading Policy they want to use. The options are “Identified
Extensions Only”, “Approve Unidentified Extensions”, and “Unrestricted.</p>
<p>The developer side of this feature is known as a Digital Signature. All
SketchUp extensions for 2016 or later will now require a Digital Signature
to run in the highest security mode - “Identified Extensions Only”. If the
user has chosen “Approve Unidentified Extensions” then all signed
extensions will load automatically and any unsigned extension will have to
be approved by the user. All extensions signed and unsigned, will load in
“Unrestricted” mode.</p>
<p>SketchUp 2016 M0 installs in “Unrestricted” mode by default.</p>
<p>To digitally sign your extension, simply upload your .rbz package to our
new Digital Signature and Encryption page and we will sign it and return it
to you. Visit the new <a
href="https://extensions.sketchup.com/en/developer_center/extension_signature">Extension
Digital Signature page</a>.</p>
<p>You will need to sign your extension each time you make code changes and
want to re-release it. You will need to be a registered Developer on the
Extension Warehouse to be able to sign or encrypt extensions. <a
href="http://http://extensions.sketchup.com/en/developer">Apply here!</a></p>
<h3 id="label-Ruby+Encryption+2.0">Ruby Encryption 2.0</h3>
<p>Goodbye .rbs and Hello .rbe! We have added a new encryption that you can
use to help protect your extension Intellectual Property (IP). SketchUp
2016 can read both .rbe and .rbs filetypes. This should help make sure that
we maintain backwards compatibility for authors who need some time to
re-encrypt their extensions. To use our new encryption, simply upload an
unencrypted version of your .rbz package to our new Digital Signature and
Encryption page and we will encrypt it and return it to you. Visit the new
<a
href="https://extensions.sketchup.com/en/developer_center/extension_signature">Extension
Digital Signature page</a> page here for more information.</p>
<p>You will need to be a registered Developer on the Extension Warehouse to be
able to sign or encrypt extensions. <a
href="http://extensions.sketchup.com/en/developer">Apply here!</a></p>
<h3 id="label-Developer+Center">Developer Center</h3>
<p>Between the new Extension Digital Signature Page, the new LayOut C API and
a whole lot of future ideas and potential, we have decided to create a new
central location to organize our developer resources, API documentation,
etc. Visit (and bookmark!): <a
href="https://extensions.sketchup.com/en/developer_center">extensions.sketchup.com/en/developer_center</a></p>
<h3 id="label-Observer+Upgrades">Observer Upgrades</h3>
<p>We have been working on finding ways to make observers more stable and
reliable for all developers. Most of these changes happen under the hood
and are not entirely visible to developers. To help with that, we added a
few Ruby Warnings that appear in the Ruby Console, and two debugging
methods that will determine whether those warnings are shown:
Sketchup.debug_mode= and Sketchup.debug_mode?.</p>
<ul><li>
<p>Observer events are now queued up until the active operation is done.</p>
</li><li>
<p>ModelObserver doesn't notify about intermediate Ruby operations
(“transactions”).</p>
</li><li>
<p>Observers should no longer return zombie Ruby objects for entities. See the
Observers 2016 pdf for more information.</p>
</li><li>
<p>Removed dummy methods from all observer base classes in order to improve
performance.See <a
href="https://assets.sketchup.com/files/ewh/Observers2016.pdf">this pdf</a>
for a more in depth look at the changes we made to the Observers.</p>
</li></ul>
<h3 id="label-SketchUp+C+API+Parity+-+continued">SketchUp C API Parity - continued</h3>
<p>We have focused on adding features to the SketchUp C API in 2016 to provide
greater benefit to our developers and as part of our continued effort to
fully deprecate and remove the old C++ API in the future. Below is a
complete list of functions that we have added for 2016. We are continuing
to add more until we gain enough coverage to consider the C API at feature
parity with the deprecated C++ API.</p>
<h3 id="label-New+Ruby+API">New Ruby API</h3>
<ul><li>
<p>Added optional arguments to Sketchup::View.draw_text which define the
appearance of the text drawn.</p>
</li><li>
<p>Added Axes class, exposing the drawing axes in SketchUp via model.axes and
page.axes.</p>
</li><li>
<p>Added PickHelper.window_pick.</p>
</li><li>
<p>Added PickHelper.boundingbox_pick.</p>
</li><li>
<p>Added Sketchup::Texture.write.</p>
</li><li>
<p>Added Sketchup::ComponentDefinition.count_used_instances</p>
</li><li>
<p>Added Model.export to export pdf files. This is a vector export, not a
rasterized image wrapped up in a pdf container.</p>
</li><li>
<p>UI::Command class and UI.create_cursor were modified to accept vector
format (SVG under Windows, PDF under OSX). Both toolbars and cursors can
now accept vector icons.</p>
</li><li>
<p>Added two methods to assist with debugging extensions. Sketchup.debug_mode=
and Sketchup.debug_mode? will allow developers to toggle the display of the
following notifications:</p>
</li><li>
<p>Ruby Console now warns about Ruby operations left open. Leaving operations
open is typically a bad practice. We are warning developers that they
should try to find a different way of doing what they want to do.</p>
</li><li>
<p>Ruby Console now warns when a user tries to create a nested operation.
Starting a new operation while one is still open is a bad practice. We
would like developers to be more aware that they are doing this so that
they can fix their code.</p>
</li></ul>
<h3 id="label-New+C+API+Features">New C API Features</h3>
<ul><li>
<p>Added SUArcCurveCreate</p>
</li><li>
<p>Added SUArcCurveFromCurve()</p>
</li><li>
<p>Added SUArcCurveFromEntity()</p>
</li><li>
<p>Added SUArcCurveGetCenter()</p>
</li><li>
<p>Added SUArcCurveGetEndAngle()</p>
</li><li>
<p>Added SUArcCurveGetEndPoint()</p>
</li><li>
<p>Added SUArcCurveGetIsFullCircle()</p>
</li><li>
<p>Added SUArcCurveGetNormal()</p>
</li><li>
<p>Added SUArcCurveGetRadius()</p>
</li><li>
<p>Added SUArcCurveGetStartAngle()</p>
</li><li>
<p>Added SUArcCurveGetStartPoint()</p>
</li><li>
<p>Added SUArcCurveGetXAxis()</p>
</li><li>
<p>Added SUArcCurveGetYAxis()</p>
</li><li>
<p>Added SUArcCurveRelease()</p>
</li><li>
<p>Added SUArcCurveToCurve()</p>
</li><li>
<p>Added SUArcCurveToEntity()</p>
</li><li>
<p>Added SUAxesCreate()</p>
</li><li>
<p>Added SUAxesCreateCustom()</p>
</li><li>
<p>Added SUAxesFromDrawingElement()</p>
</li><li>
<p>Added SUAxesFromEntity()</p>
</li><li>
<p>Added SUAxesGetOrigin()</p>
</li><li>
<p>Added SUAxesGetPlane()</p>
</li><li>
<p>Added SUAxesGetTransform()</p>
</li><li>
<p>Added SUAxesGetXAxis()</p>
</li><li>
<p>Added SUAxesGetYAxis()</p>
</li><li>
<p>Added SUAxesGetZAxis()</p>
</li><li>
<p>Added SUAxesRelease()</p>
</li><li>
<p>Added SUAxesSetAxesVecs()</p>
</li><li>
<p>Added SUAxesSetOrigin()</p>
</li><li>
<p>Added SUAxesToDrawingElement()</p>
</li><li>
<p>Added SUAxesToEntity()</p>
</li><li>
<p>Added SUComponentDefinitionGetInsertPoint()</p>
</li><li>
<p>Added SUComponentDefinitionGetLoadTime()</p>
</li><li>
<p>Added SUComponentDefinitionGetOpenings()</p>
</li><li>
<p>Added SUComponentDefinitionGetPath()</p>
</li><li>
<p>Added SUComponentDefinitionIsInternal()</p>
</li><li>
<p>Added SUComponentDefinitionIsInternal()</p>
</li><li>
<p>Added SUComponentDefinitionOrientFacesConsistently()</p>
</li><li>
<p>Added SUComponentDefinitionSetAxes()</p>
</li><li>
<p>Added SUComponentDefinitionSetInsertPoint()</p>
</li><li>
<p>Added SUComponentInstanceIsLocked()</p>
</li><li>
<p>Added SUComponentInstanceSaveAs()</p>
</li><li>
<p>Added SUComponentInstanceSetLocked()</p>
</li><li>
<p>Added SUEntitiesAddArcCurves()</p>
</li><li>
<p>Added SUEntitiesAddGuideLines()</p>
</li><li>
<p>Added SUEntitiesAddSectionPlanes()</p>
</li><li>
<p>Added SUEntitiesGetArcCurves()</p>
</li><li>
<p>Added SUEntitiesGetGuideLines()</p>
</li><li>
<p>Added SUEntitiesGetNumArcCurves()</p>
</li><li>
<p>Added SUEntitiesGetNumGuideLines()</p>
</li><li>
<p>Added SUEntitiesGetNumSectionPlanes()</p>
</li><li>
<p>Added SUEntitiesGetSectionPlanes()</p>
</li><li>
<p>Added SUFaceGetAreaWithTransform()</p>
</li><li>
<p>Added SUFaceGetAttachedDrawingElements()</p>
</li><li>
<p>Added SUFaceGetEdgeUses()</p>
</li><li>
<p>Added SUFaceGetNumAttachedDrawingElements()</p>
</li><li>
<p>Added SUFaceGetNumEdgeUses()</p>
</li><li>
<p>Added SUFaceReverse()</p>
</li><li>
<p>Added SUGetEdition()</p>
</li><li>
<p>Added SUGetVersionStringUtf8()</p>
</li><li>
<p>Added SUGroupFromComponentInstance()</p>
</li><li>
<p>Added SUGroupToComponentInstance()</p>
</li><li>
<p>Added SUGuideLineCreateFinite()</p>
</li><li>
<p>Added SUGuideLineCreateInfinite()</p>
</li><li>
<p>Added SUGuideLineFromDrawingElement()</p>
</li><li>
<p>Added SUGuideLineFromEntity()</p>
</li><li>
<p>Added SUGuideLineGetData()</p>
</li><li>
<p>Added SUGuideLineRelease()</p>
</li><li>
<p>Added SUGuideLineToDrawingElement()</p>
</li><li>
<p>Added SUGuideLineToEntity()</p>
</li><li>
<p>Added SUGuidePointDisplayAsLine()</p>
</li><li>
<p>Added SUGuidePointGetFromPosition()</p>
</li><li>
<p>Added SUModelGetActiveScene()</p>
</li><li>
<p>Added SUModelSetActiveScene()</p>
</li><li>
<p>Added SUModelSetCamera()</p>
</li><li>
<p>Added SUOptionsProviderGetName()</p>
</li><li>
<p>Added SUPolyline3dAddPoints()</p>
</li><li>
<p>Added SUPolyline3dCreate()</p>
</li><li>
<p>Added SUPolyline3dRelease()</p>
</li><li>
<p>Added SUSceneAddLayer()</p>
</li><li>
<p>Added SUSceneClearLayers()</p>
</li><li>
<p>Added SUSceneGetAxes()</p>
</li><li>
<p>Added SUSceneGetLayers()</p>
</li><li>
<p>Added SUSceneGetNumLayers()</p>
</li><li>
<p>Added SUSceneGetUseCamera()</p>
</li><li>
<p>Added SUSceneGetUseHiddenLayers()</p>
</li><li>
<p>Added SUSceneGetUseRenderingOptions()</p>
</li><li>
<p>Added SUSceneRemoveLayer()</p>
</li><li>
<p>Added SUSceneSetCamera()</p>
</li><li>
<p>Added SUSceneSetUseCamera()</p>
</li><li>
<p>Added SUSceneSetUseHiddenLayers()</p>
</li><li>
<p>Added SUSceneSetUseRenderingOptions()</p>
</li><li>
<p>Added SUSectionPlaneCreate()</p>
</li><li>
<p>Added SUSectionPlaneFromDrawingElement()</p>
</li><li>
<p>Added SUSectionPlaneFromEntity()</p>
</li><li>
<p>Added SUSectionPlaneGetPlane()</p>
</li><li>
<p>Added SUSectionPlaneIsActive()</p>
</li><li>
<p>Added SUSectionPlaneRelease()</p>
</li><li>
<p>Added SUSectionPlaneSetPlane()</p>
</li><li>
<p>Added SUSectionPlaneToDrawingElement()</p>
</li><li>
<p>Added SUSectionPlaneToEntity()</p>
</li><li>
<p>Added SUVertexSetPosition()</p>
</li></ul>
<h3 id="label-Bug+Fixes-2FSmall+Improvements">Bug Fixes/Small Improvements</h3>
<ul><li>
<p>Fixed Pages.erase so that it doesn't incorrectly create an undo
operation any more.</p>
</li><li>
<p>Removed instance of a zombie instance with Curves. See the Observers 2016
pdf for more information.</p>
</li><li>
<p>Fixed issue where View Observer does not fire when using the Zoom tool in