0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- prepar...
[occt.git] / src / IGESDimen / IGESDimen_ToolNewDimensionedGeometry.cxx
1 // Created by: CKY / Contract Toubro-Larsen
2 // Copyright (c) 1993-1999 Matra Datavision
3 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 //--------------------------------------------------------------------
17 //--------------------------------------------------------------------
18
19 #include <gp_Pnt.hxx>
20 #include <gp_XYZ.hxx>
21 #include <IGESData_DirChecker.hxx>
22 #include <IGESData_Dump.hxx>
23 #include <IGESData_HArray1OfIGESEntity.hxx>
24 #include <IGESData_IGESDumper.hxx>
25 #include <IGESData_IGESEntity.hxx>
26 #include <IGESData_IGESReaderData.hxx>
27 #include <IGESData_IGESWriter.hxx>
28 #include <IGESData_ParamCursor.hxx>
29 #include <IGESData_ParamReader.hxx>
30 #include <IGESData_TransfEntity.hxx>
31 #include <IGESDimen_NewDimensionedGeometry.hxx>
32 #include <IGESDimen_ToolNewDimensionedGeometry.hxx>
33 #include <Interface_Check.hxx>
34 #include <Interface_CopyTool.hxx>
35 #include <Interface_EntityIterator.hxx>
36 #include <Interface_Macros.hxx>
37 #include <Interface_ShareTool.hxx>
38 #include <Message_Messenger.hxx>
39 #include <Standard_DomainError.hxx>
40 #include <TColgp_HArray1OfXYZ.hxx>
41 #include <TColStd_HArray1OfInteger.hxx>
42
43 IGESDimen_ToolNewDimensionedGeometry::IGESDimen_ToolNewDimensionedGeometry ()
44       {  }
45
46
47 void  IGESDimen_ToolNewDimensionedGeometry::ReadOwnParams
48   (const Handle(IGESDimen_NewDimensionedGeometry)& ent,
49    const Handle(IGESData_IGESReaderData)& IR, IGESData_ParamReader& PR) const
50 {
51   //Standard_Boolean st; //szv#4:S4163:12Mar99 moved down
52   Standard_Integer i, num;
53   Standard_Integer tempNbDimens;
54   Standard_Integer tempDimOrientFlag;
55   Standard_Real tempAngle;
56   Handle(IGESData_IGESEntity) tempDimen;
57   Handle(IGESData_HArray1OfIGESEntity) tempGeomEnts;
58   Handle(TColStd_HArray1OfInteger) tempDimLocFlags;
59   Handle(TColgp_HArray1OfXYZ) tempPoints;
60
61   if (PR.DefinedElseSkip())
62     PR.ReadInteger(PR.Current(), "Number of Dimensions", tempNbDimens); //szv#4:S4163:12Mar99 `st=` not needed
63   else
64     tempNbDimens = 1;
65
66   Standard_Boolean st = PR.ReadInteger(PR.Current(), "Number of Geometries", num);
67   if (st && num > 0)
68     {
69       tempGeomEnts    = new IGESData_HArray1OfIGESEntity(1, num);
70       tempDimLocFlags = new TColStd_HArray1OfInteger(1, num);
71       tempPoints      = new TColgp_HArray1OfXYZ(1, num);
72     }
73   else  PR.AddFail("Number of Geometries: Not Positive");
74
75   //szv#4:S4163:12Mar99 `st=` not needed
76   PR.ReadEntity(IR, PR.Current(), "Dimension Entity", tempDimen);
77   PR.ReadInteger(PR.Current(), "Dimension Orientation Flag", tempDimOrientFlag);
78   PR.ReadReal(PR.Current(), "Angle Value", tempAngle);
79
80   if (!tempGeomEnts.IsNull())
81     for ( i = 1; i <= num; i++)
82       {
83         Handle(IGESData_IGESEntity) tempEnt;
84         //szv#4:S4163:12Mar99 `st=` not needed
85         PR.ReadEntity(IR, PR.Current(), "Geometry Entity", tempEnt, (i == num)); // The last one may be Null
86         tempGeomEnts->SetValue(i, tempEnt);
87
88         Standard_Integer tempInt;
89         PR.ReadInteger(PR.Current(), "Dimension Location Flag", tempInt); //szv#4:S4163:12Mar99 `st=` not needed
90         tempDimLocFlags->SetValue(i, tempInt);
91
92         gp_XYZ tempPnt;
93         PR.ReadXYZ(PR.CurrentList(1, 3), "Point", tempPnt); //szv#4:S4163:12Mar99 `st=` not needed
94         tempPoints->SetValue(i, tempPnt);
95       }
96
97   DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
98   ent->Init
99     (tempNbDimens, tempDimen, tempDimOrientFlag, tempAngle,
100      tempGeomEnts, tempDimLocFlags, tempPoints);
101 }
102
103 void  IGESDimen_ToolNewDimensionedGeometry::WriteOwnParams
104   (const Handle(IGESDimen_NewDimensionedGeometry)& ent, IGESData_IGESWriter& IW) const
105 {
106   Standard_Integer i, num;
107   IW.Send(ent->NbDimensions());
108   IW.Send(ent->NbGeometries());
109   IW.Send(ent->DimensionEntity());
110   IW.Send(ent->DimensionOrientationFlag());
111   IW.Send(ent->AngleValue());
112   for ( num = ent->NbGeometries(), i = 1; i <= num; i++ )
113     {
114       IW.Send(ent->GeometryEntity(i));
115       IW.Send(ent->DimensionLocationFlag(i));
116       IW.Send(ent->Point(i).X());
117       IW.Send(ent->Point(i).Y());
118       IW.Send(ent->Point(i).Z());
119     }
120 }
121
122 void  IGESDimen_ToolNewDimensionedGeometry::OwnShared
123   (const Handle(IGESDimen_NewDimensionedGeometry)& ent, Interface_EntityIterator& iter) const
124 {
125   Standard_Integer i, num;
126   iter.GetOneItem(ent->DimensionEntity());
127   for ( num = ent->NbGeometries(), i = 1; i <= num; i++ )
128     iter.GetOneItem(ent->GeometryEntity(i));
129 }
130
131 void  IGESDimen_ToolNewDimensionedGeometry::OwnCopy
132   (const Handle(IGESDimen_NewDimensionedGeometry)& another,
133    const Handle(IGESDimen_NewDimensionedGeometry)& ent, Interface_CopyTool& TC) const
134 {
135   Standard_Integer num = another->NbGeometries();
136   Standard_Integer tempNbDimens = another->NbDimensions();
137   Standard_Integer tempDimOrientFlag = another->DimensionOrientationFlag();
138   Standard_Real tempAngle = another->AngleValue();
139   DeclareAndCast(IGESData_IGESEntity, tempDimen,
140                  TC.Transferred(another->DimensionEntity()));
141
142   Handle(IGESData_HArray1OfIGESEntity) tempGeomEnts =
143     new IGESData_HArray1OfIGESEntity(1, num);
144   Handle(TColStd_HArray1OfInteger) tempDimLocFlags =
145     new TColStd_HArray1OfInteger(1, num);
146   Handle(TColgp_HArray1OfXYZ) tempPoints = new TColgp_HArray1OfXYZ(1, num);
147
148   for (Standard_Integer i = 1; i <= num; i++)
149     {
150       DeclareAndCast(IGESData_IGESEntity, tempEnt,
151                      TC.Transferred(another->GeometryEntity(i)));
152       tempGeomEnts->SetValue(i, tempEnt);
153       tempDimLocFlags->SetValue(i, another->DimensionLocationFlag(i));
154       tempPoints->SetValue(i, another->Point(i).XYZ());
155     }
156   ent->Init (tempNbDimens, tempDimen, tempDimOrientFlag, tempAngle,
157              tempGeomEnts, tempDimLocFlags, tempPoints);
158 }
159
160 Standard_Boolean  IGESDimen_ToolNewDimensionedGeometry::OwnCorrect
161   (const Handle(IGESDimen_NewDimensionedGeometry)& ent) const
162 {
163   Standard_Boolean res = ent->HasTransf();
164   if (res) {
165     Handle(IGESData_TransfEntity) nultransf;
166     ent->InitTransf(nultransf);
167   }
168   if (ent->NbDimensions() == 1) return res;
169 //   Forcer NbDimensions = 1 -> reconstruire
170   Standard_Integer nb = ent->NbGeometries();
171   Handle(IGESData_HArray1OfIGESEntity) tempGeomEnts =
172     new IGESData_HArray1OfIGESEntity(1, nb);
173   Handle(TColStd_HArray1OfInteger) tempDimLocFlags =
174     new TColStd_HArray1OfInteger(1, nb);
175   Handle(TColgp_HArray1OfXYZ) tempPoints = new TColgp_HArray1OfXYZ (1,nb);
176
177   for (Standard_Integer i = 1; i <= nb; i ++) {
178     tempGeomEnts->SetValue(i, ent->GeometryEntity(i));
179     tempDimLocFlags->SetValue(i, ent->DimensionLocationFlag(i));
180     tempPoints->SetValue(i, ent->Point(i).XYZ());
181   }
182   ent->Init (1,ent->DimensionEntity(),ent->DimensionOrientationFlag(),
183              ent->AngleValue(), tempGeomEnts, tempDimLocFlags, tempPoints);
184   return Standard_True;
185 }
186
187 IGESData_DirChecker  IGESDimen_ToolNewDimensionedGeometry::DirChecker
188   (const Handle(IGESDimen_NewDimensionedGeometry)& /* ent */ ) const
189 {
190   IGESData_DirChecker DC(402, 21);
191   DC.Structure(IGESData_DefVoid);
192   DC.GraphicsIgnored();
193   DC.LineFont(IGESData_DefVoid);
194   DC.LineWeight(IGESData_DefVoid);
195   DC.Color(IGESData_DefVoid);
196   DC.BlankStatusIgnored();
197   DC.SubordinateStatusRequired(1);
198   DC.UseFlagRequired(2);
199   DC.HierarchyStatusIgnored();
200   return DC;
201 }
202
203 void  IGESDimen_ToolNewDimensionedGeometry::OwnCheck
204   (const Handle(IGESDimen_NewDimensionedGeometry)& ent,
205    const Interface_ShareTool& , Handle(Interface_Check)& ach) const
206 {
207   if (ent->NbDimensions() != 1)
208     ach->AddFail("Number of Dimensions != 1");
209   if (ent->HasTransf())
210     ach->AddWarning("Transformation Matrix exists, ignored");
211 }
212
213 void  IGESDimen_ToolNewDimensionedGeometry::OwnDump
214   (const Handle(IGESDimen_NewDimensionedGeometry)& ent, const IGESData_IGESDumper& dumper,
215    Standard_OStream& S, const Standard_Integer level) const
216 {
217   Standard_Integer i, num, sublevel = (level > 4) ? 1 : 0;
218   S << "IGESDimen_NewDimensionedGeometry\n"
219     << "Number of Dimensions : " << ent->NbDimensions() << "\n"
220     << "Dimension Entity : ";
221   dumper.Dump(ent->DimensionEntity(),S, sublevel);
222   S << "\n"
223     << "Dimension Orientation Flag : " << ent->DimensionOrientationFlag() << "\n"
224     << "Angle Value Flag : " << ent->AngleValue() << "\n"
225     << "Geometry Entities :\n"
226     << "Dimension Location Flags :\n"
227     << "Points : ";
228   IGESData_DumpEntities(S,dumper,-level,1, ent->NbGeometries(),ent->GeometryEntity);
229   S << "\n";
230   if (level > 4)
231     for ( num = ent->NbGeometries(), i = 1; i <= num; i++ )
232       {
233         S << "[" << i << "]:\n"
234           << "Geometry Entity : ";
235         dumper.Dump (ent->GeometryEntity(i),S, 1);
236         S << "\n"
237           << "Dimension Location Flag : " << ent->DimensionLocationFlag(i) << "\n"
238           << "Point : ";
239         IGESData_DumpXYZL(S,level, ent->Point(i), ent->Location());
240       }
241   S << std::endl;
242 }