3
interface //#################################################################### ■
5
uses System.Types, System.UITypes, System.Math.Vectors, System.Generics.Collections, System.Classes,
6
FMX.Types, FMX.Graphics,
7
FMX.Types3D, FMX.Controls3D, FMX.Objects3D, FMX.Viewport3D, FMX.MaterialSources,
10
type //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【型】
12
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
14
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
16
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HBitmapData
18
HBitmapData = record helper for TBitmapData
21
function GetPixels( const X_,Y_:Integer ) :TAlphaColor;
22
procedure SetPixels( const X_,Y_:Integer; const Pixels_:TAlphaColor );
25
property Pixels[ const X_,Y_:Integer ] :TAlphaColor read GetPixels write SetPixels;
28
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HCanvas
30
HCanvas = class helper for TCanvas
34
function GetMatrix :TMatrix;
35
procedure SetMatrix( const Matrix_:TMatrix );
37
property Matrix :TMatrix read GetMatrix write SetMatrix;
39
procedure DrawCircle( const Center_ :TPointF;
40
const Radius_ :Single;
41
const Opacity_:Single = 1 );
42
procedure FillCircle( const Center_ :TPointF;
43
const Radius_ :Single;
44
const Opacity_:Single = 1 );
45
procedure DrawText( const Text_ :String;
47
const AlignX_ :TTextAlign;
48
const AlignY_ :TTextAlign;
49
const Opacity_:Single = 1 );
52
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HMeshData
54
HMeshData = class helper for TMeshData
59
procedure SaveToFileBinSTL( const FileName_:String; const Text_:AnsiString = '' );
62
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HControl3D
64
HControl3D = class helper for TControl3D
68
function GetAbsolMatrix :TMatrix3D;
69
procedure SetAbsoluteMatrix( const AbsoluteMatrix_:TMatrix3D ); virtual;
70
function GetLocalMatrix :TMatrix3D; virtual;
71
procedure SetLocalMatrix( const LocalMatrix_:TMatrix3D ); virtual;
73
procedure RecalcFamilyAbsolute;
74
procedure RecalcChildrenAbsolute;
77
property AbsoluteMatrix :TMatrix3D read GetAbsolMatrix write SetAbsoluteMatrix;
78
property LocalMatrix :TMatrix3D read GetLocalMatrix write SetLocalMatrix ;
80
procedure RenderInternalTo( const Context_:TContext3D );
83
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HCustomMesh
85
HCustomMesh = class helper for TCustomMesh
89
function GetMeshData :TMeshData;
92
property MeshData :TMeshData read GetMeshData;
95
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TTrueViewport3D
97
TTrueViewport3D = class( TViewport3D )
101
_RenderingList :TList<TControl3D>;
104
procedure Paint; override;
105
procedure Resize; override;
107
constructor Create( Owner_:TComponent ); override;
108
destructor Destroy; override;
110
procedure RebuildRenderingList;
113
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TTensorShape
115
TTensorShape = class( TControl3D )
118
_GeometryX :TMeshData;
119
_GeometryY :TMeshData;
120
_GeometryZ :TMeshData;
121
_MaterialX :TColorMaterialSource;
122
_MaterialY :TColorMaterialSource;
123
_MaterialZ :TColorMaterialSource;
124
_MeshData :TMeshData;
127
procedure SetMeshData( const MeshData_:TMeshData );
128
procedure SetAxisLeng( const AxisLeng_:Single );
129
function GetColorX :TAlphaColor;
130
procedure SetColorX( const ColorX_:TAlphaColor );
131
function GetColorY :TAlphaColor;
132
procedure SetColorY( const ColorY_:TAlphaColor );
133
function GetColorZ :TAlphaColor;
134
procedure SetColorZ( const ColorZ_:TAlphaColor );
136
procedure Render; override;
138
constructor Create( Owner_:TComponent ); override;
139
destructor Destroy; override;
141
property MeshData :TMeshData read _MeshData write SetMeshData;
142
property AxisLeng :Single read _AxisLeng write SetAxisLeng;
143
property ColorX :TAlphaColor read GetColorX write SetColorX ;
144
property ColorY :TAlphaColor read GetColorY write SetColorY ;
145
property ColorZ :TAlphaColor read GetColorZ write SetColorZ ;
150
//const //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【定数】
152
//var //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【変数】
154
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
156
function GapFit( const P0_,P1_:TPoint3D ) :TMatrix3D;
158
implementation //############################################################### ■
160
uses System.SysUtils, System.RTLConsts, System.AnsiStrings,
164
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【レコード】
166
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【クラス】
168
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HBitmapData
170
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
172
/////////////////////////////////////////////////////////////////////// アクセス
174
function HBitmapData.GetPixels( const X_,Y_:Integer ) :TAlphaColor;
176
Result := GetPixel( X_, Y_ );
179
procedure HBitmapData.SetPixels( const X_,Y_:Integer; const Pixels_:TAlphaColor );
181
SetPixel( X_, Y_, Pixels_ );
184
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
186
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HCanvas
188
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
190
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
192
/////////////////////////////////////////////////////////////////////// アクセス
194
function HCanvas.GetMatrix :TMatrix;
202
procedure HCanvas.SetMatrix( const Matrix_:TMatrix );
204
inherited SetMatrix( Matrix_ );
207
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
209
procedure HCanvas.DrawCircle( const Center_ :TPointF;
210
const Radius_ :Single;
211
const Opacity_:Single = 1 );
213
DrawEllipse( TRectF.Create( Center_.X-Radius_, Center_.Y-Radius_,
214
Center_.X+Radius_, Center_.Y+Radius_ ), Opacity_ );
217
procedure HCanvas.FillCircle( const Center_ :TPointF;
218
const Radius_ :Single;
219
const Opacity_:Single = 1 );
221
FillEllipse( TRectF.Create( Center_.X-Radius_, Center_.Y-Radius_,
222
Center_.X+Radius_, Center_.Y+Radius_ ), Opacity_ );
225
procedure HCanvas.DrawText( const Text_ :String;
227
const AlignX_ :TTextAlign;
228
const AlignY_ :TTextAlign;
229
const Opacity_:Single = 1 );
231
W, H, W2, H2 :Single;
234
R := TRectF.Create( 0, 0, Single.MaxValue, Single.MaxValue );
235
MeasureText( R, Text_, False, [], TTextAlign.Leading, TTextAlign.Leading );
246
Right := Pos_.X + W ;
253
Right := Pos_.X + W2;
266
Bottom := Pos_.Y + H ;
273
Bottom := Pos_.Y + H2;
283
FillText( R, Text_, False, Opacity_, [], AlignX_, AlignY_ );
286
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HMeshData
288
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
290
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
292
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
294
/////////////////////////////////////////////////////////////////////// メソッド
296
procedure HMeshData.SaveToFileBinSTL( const FileName_:String; const Text_:AnsiString = '' );
298
Cs :array [ 0..80-1 ] of AnsiChar;
308
with TFileStream.Create( FileName_, fmCreate ) do
311
System.AnsiStrings.StrLCopy( Cs, PAnsiChar( Text_ ), Length( Cs )-1 );
315
N := IndexBuffer.Length div 3;
317
Write( N, SizeOf( N ) );
323
Nor := TSingle3D.Create( 0, 0, 0 );
324
Pos1 := VertexBuffer.Vertices[ IndexBuffer.Indices[ 3*I+0 ] ];
325
Pos2 := VertexBuffer.Vertices[ IndexBuffer.Indices[ 3*I+1 ] ];
326
Pos3 := VertexBuffer.Vertices[ IndexBuffer.Indices[ 3*I+2 ] ];
330
Write( Face, SizeOf( Face ) );
339
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HControl3D
341
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
343
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
345
/////////////////////////////////////////////////////////////////////// アクセス
347
function HControl3D.GetAbsolMatrix :TMatrix3D;
349
if FRecalcAbsolute then
351
if FParent is TControl3D then FAbsoluteMatrix := FLocalMatrix * TControl3D(FParent).AbsoluteMatrix
352
else FAbsoluteMatrix := FLocalMatrix;
354
Result := FAbsoluteMatrix;
356
FInvAbsoluteMatrix := FAbsoluteMatrix.Inverse;
358
FRecalcAbsolute := False;
360
else Result := FAbsoluteMatrix;
363
procedure HControl3D.SetAbsoluteMatrix( const AbsoluteMatrix_:TMatrix3D );
365
FAbsoluteMatrix := AbsoluteMatrix_;
366
FInvAbsoluteMatrix := AbsoluteMatrix_.Inverse;
368
if Assigned( FParent ) and ( FParent is TControl3D )
369
then FLocalMatrix := FAbsoluteMatrix * TControl3D( FParent ).AbsoluteMatrix.Inverse
370
else FLocalMatrix := FAbsoluteMatrix;
372
RecalcChildrenAbsolute;
377
function HControl3D.GetLocalMatrix :TMatrix3D;
379
Result := FLocalMatrix;
382
procedure HControl3D.SetLocalMatrix( const LocalMatrix_:TMatrix3D );
384
FLocalMatrix := LocalMatrix_;
386
RecalcFamilyAbsolute;
391
/////////////////////////////////////////////////////////////////////// メソッド
393
procedure HControl3D.RecalcFamilyAbsolute;
398
procedure HControl3D.RecalcChildrenAbsolute;
402
FRecalcAbsolute := False;
404
if Assigned( Children ) then
408
if F is TControl3D then TControl3D( F ).RecalcFamilyAbsolute;
413
procedure HControl3D.RenderInternalTo( const Context_:TContext3D );
415
TempContext := Context_;
422
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
424
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% HCustomMesh
426
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
428
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
430
/////////////////////////////////////////////////////////////////////// アクセス
432
function HCustomMesh.GetMeshData :TMeshData;
437
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
439
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TTrueViewport3D
441
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
443
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
445
/////////////////////////////////////////////////////////////////////// メソッド
447
procedure TTrueViewport3D.Paint;
453
if ( csDesigning in ComponentState ) then
457
InflateRect( R, -0.5, -0.5 );
459
Canvas.DrawDashRect( R, 0, 0, AllCorners, AbsoluteOpacity, $A0909090 );
467
if Assigned( Context ) then
475
SetContextState( TContextState.csScissorOff );
476
Clear( [ TClearTarget.Color, TClearTarget.Depth ], Color, 1.0, 0 );
477
SetCameraMatrix( Camera.CameraMatrix );
478
SetCameraAngleOfView( Camera.AngleOfView );
481
for I := 0 to Camera.Viewport.LightCount-1
482
do Lights.Add( Camera.Viewport.Lights[ I ].LightDescription );
484
for C in _RenderingList do
488
if Visible or ( not Visible and ( csDesigning in ComponentState ) and not Locked )
489
then RenderInternalTo( Self.Context );
497
CopyToBitmap( _Bitmap, _Bitmap.Bounds );
504
inherited Canvas.DrawBitmap( _Bitmap, _Bitmap.BoundsF, LocalRect, AbsoluteOpacity, True );
508
procedure TTrueViewport3D.Resize;
512
FreeAndNil( _Bitmap );
514
with Context do _Bitmap := TBitmap.Create( Width, Height );
517
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
519
constructor TTrueViewport3D.Create( Owner_:TComponent );
524
_RenderingList := TList<TControl3D>.Create;
526
UsingDesignCamera := False;
529
destructor TTrueViewport3D.Destroy;
531
FreeAndNil( _Bitmap );
532
FreeAndNil( _RenderingList );
537
/////////////////////////////////////////////////////////////////////// メソッド
539
procedure TTrueViewport3D.RebuildRenderingList;
542
//CompareFunc :TRenderingCompare;
544
with TViewport3D( Camera.Viewport ) do
546
if Assigned( Children ) and ( Children.Count > 0 ) and ( FUpdating = 0 ) then
548
_RenderingList.Clear;
552
if ( F is TControl3D ) then _RenderingList.Add( F as TControl3D );
556
CompareFunc := TRenderingCompare.Create;
559
_RenderingList.Sort( CompareFunc );
569
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% TTensorShape
571
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& private
573
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& protected
575
/////////////////////////////////////////////////////////////////////// アクセス
577
procedure TTensorShape.SetMeshData( const MeshData_:TMeshData );
579
_MeshData := MeshData_; MakeShape;
582
procedure TTensorShape.SetAxisLeng( const AxisLeng_:Single );
584
_AxisLeng := AxisLeng_; MakeShape;
587
//------------------------------------------------------------------------------
589
function TTensorShape.GetColorX :TAlphaColor;
591
Result := _MaterialX.Color;
594
procedure TTensorShape.SetColorX( const ColorX_:TAlphaColor );
596
_MaterialX.Color := ColorX_; Repaint;
599
function TTensorShape.GetColorY :TAlphaColor;
601
Result := _MaterialY.Color;
604
procedure TTensorShape.SetColorY( const ColorY_:TAlphaColor );
606
_MaterialY.Color := ColorY_; Repaint;
609
function TTensorShape.GetColorZ :TAlphaColor;
611
Result := _MaterialZ.Color;
614
procedure TTensorShape.SetColorZ( const ColorZ_:TAlphaColor );
616
_MaterialZ.Color := ColorZ_; Repaint;
619
/////////////////////////////////////////////////////////////////////// メソッド
621
procedure TTensorShape.Render;
625
SetMatrix( AbsoluteMatrix );
627
DrawLines( _GeometryX.VertexBuffer, _GeometryX.IndexBuffer, _MaterialX.Material, AbsoluteOpacity );
628
DrawLines( _GeometryY.VertexBuffer, _GeometryY.IndexBuffer, _MaterialY.Material, AbsoluteOpacity );
629
DrawLines( _GeometryZ.VertexBuffer, _GeometryZ.IndexBuffer, _MaterialZ.Material, AbsoluteOpacity );
633
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& public
635
constructor TTensorShape.Create( Owner_:TComponent );
641
_GeometryX := TMeshData.Create;
642
_GeometryY := TMeshData.Create;
643
_GeometryZ := TMeshData.Create;
645
_MaterialX := TColorMaterialSource.Create( Self );
646
_MaterialY := TColorMaterialSource.Create( Self );
647
_MaterialZ := TColorMaterialSource.Create( Self );
649
_MaterialX.Color := TAlphaColors.Red ;
650
_MaterialY.Color := TAlphaColors.Lime;
651
_MaterialZ.Color := TAlphaColors.Blue;
656
destructor TTensorShape.Destroy;
665
/////////////////////////////////////////////////////////////////////// メソッド
667
procedure TTensorShape.MakeShape;
670
AO, AX, AY, AZ :TPoint3D;
672
with _MeshData.VertexBuffer do
674
N := Length * 2{Poin};
676
_GeometryX.VertexBuffer.Length := N;
677
_GeometryY.VertexBuffer.Length := N;
678
_GeometryZ.VertexBuffer.Length := N;
680
_GeometryX.IndexBuffer .Length := N;
681
_GeometryY.IndexBuffer .Length := N;
682
_GeometryZ.IndexBuffer .Length := N;
685
for I := 0 to Length-1 do
687
AO := Vertices [ I ];
688
AX := Tangents [ I ];
689
AY := BiNormals[ I ];
692
_GeometryX.VertexBuffer.Vertices[ J ] := AO;
693
_GeometryY.VertexBuffer.Vertices[ J ] := AO;
694
_GeometryZ.VertexBuffer.Vertices[ J ] := AO;
696
_GeometryX.IndexBuffer .Indices [ J ] := J;
697
_GeometryY.IndexBuffer .Indices [ J ] := J;
698
_GeometryZ.IndexBuffer .Indices [ J ] := J;
702
_GeometryX.VertexBuffer.Vertices[ J ] := AO + _AxisLeng * AX;
703
_GeometryY.VertexBuffer.Vertices[ J ] := AO + _AxisLeng * AY;
704
_GeometryZ.VertexBuffer.Vertices[ J ] := AO + _AxisLeng * AZ;
706
_GeometryX.IndexBuffer .Indices [ J ] := J;
707
_GeometryY.IndexBuffer .Indices [ J ] := J;
708
_GeometryZ.IndexBuffer .Indices [ J ] := J;
717
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$【ルーチン】
719
function GapFit( const P0_,P1_:TPoint3D ) :TMatrix3D;
721
AX, AY ,AZ, AP, E :TPoint3D;
723
AY := ( P1_ - P0_ ).Normalize;
724
AP := ( P1_ + P0_ ) / 2;
728
case MinI( Abs( X ), Abs( Y ) ,Abs( Z ) ) of
729
1: E := TPoint3D.Create( 1, 0, 0 );
730
2: E := TPoint3D.Create( 0, 1, 0 );
731
3: E := TPoint3D.Create( 0, 0, 1 );
734
AZ := CrossProduct( E ).Normalize;
736
AX := CrossProduct( AZ );
741
m11 := AX.X; m12 := AX.Y; m13 := AX.Z; m14 := 0;
742
m21 := AY.X; m22 := AY.Y; m23 := AY.Z; m24 := 0;
743
m31 := AZ.X; m32 := AZ.Y; m33 := AZ.Z; m34 := 0;
744
m41 := AP.X; m42 := AP.Y; m43 := AP.Z; m44 := 1;
748
//############################################################################## □
750
initialization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 初期化
752
finalization //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ 最終化
754
end. //######################################################################### ■