0031501: Foundation Classes, Message_Printer - remove theToPutEndl argument -- prepar...
[occt.git] / src / IGESGeom / IGESGeom_ToolOffsetCurve.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 //:l9 abv 15.01.99: CTS22023 and TEC0278: issue data fail on offset tapered flag 
19 // only if type is not constant
20
21 #include <gp_Vec.hxx>
22 #include <gp_XYZ.hxx>
23 #include <IGESData_DirChecker.hxx>
24 #include <IGESData_Dump.hxx>
25 #include <IGESData_IGESDumper.hxx>
26 #include <IGESData_IGESEntity.hxx>
27 #include <IGESData_IGESReaderData.hxx>
28 #include <IGESData_IGESWriter.hxx>
29 #include <IGESData_ParamCursor.hxx>
30 #include <IGESData_ParamReader.hxx>
31 #include <IGESData_Status.hxx>
32 #include <IGESGeom_OffsetCurve.hxx>
33 #include <IGESGeom_ToolOffsetCurve.hxx>
34 #include <Interface_Check.hxx>
35 #include <Interface_CopyTool.hxx>
36 #include <Interface_EntityIterator.hxx>
37 #include <Interface_Macros.hxx>
38 #include <Interface_ShareTool.hxx>
39 #include <Message_Messenger.hxx>
40 #include <Message_Msg.hxx>
41 #include <Standard_DomainError.hxx>
42
43 // MGE 30/07/98
44 //=======================================================================
45 //function : IGESGeom_ToolOffsetCurve
46 //purpose  : 
47 //=======================================================================
48 IGESGeom_ToolOffsetCurve::IGESGeom_ToolOffsetCurve ()
49 {
50 }
51
52
53 //=======================================================================
54 //function : ReadOwnParams
55 //purpose  : 
56 //=======================================================================
57
58 void IGESGeom_ToolOffsetCurve::ReadOwnParams(const Handle(IGESGeom_OffsetCurve)& ent,
59                                              const Handle(IGESData_IGESReaderData)& IR,
60                                              IGESData_ParamReader& PR) const
61 {
62   // MGE 30/07/98
63   // Building of messages
64   //========================================
65   Message_Msg Msg121("XSTEP_121");
66   //========================================
67
68   Standard_Integer anOffsetType, aFunctionCoord, aTaperedOffsetType; 
69   Standard_Real offDistance1, offDistance2;
70   Standard_Real arcLength1, arcLength2, anOffsetParam, anotherOffsetParam;
71   gp_XYZ aNormalVec;
72   Handle(IGESData_IGESEntity) aBaseCurve;
73   Handle(IGESData_IGESEntity) aFunction;
74   IGESData_Status aStatus;
75   //Standard_Boolean st; //szv#4:S4163:12Mar99 not needed
76
77   // Reading the curve entity to be offset
78   if (!PR.ReadEntity(IR, PR.Current(), aStatus, aBaseCurve)){
79     Message_Msg Msg110("XSTEP_110");
80     switch(aStatus) {
81     case IGESData_ReferenceError: {  
82       Message_Msg Msg216 ("IGES_216");
83       Msg110.Arg(Msg216.Value());
84       PR.SendFail(Msg110);
85       break; }
86     case IGESData_EntityError: {
87       Message_Msg Msg217 ("IGES_217");
88       Msg110.Arg(Msg217.Value());
89       PR.SendFail(Msg110);
90       break; }
91     default:{
92     }
93     }
94   } //szv#4:S4163:12Mar99 `st=` not needed
95   //st = PR.ReadEntity(IR, PR.Current(), "Curve to be offset", aBaseCurve);
96
97   // Reading the offset distance flag
98   if (!PR.ReadInteger(PR.Current(), anOffsetType)){ //szv#4:S4163:12Mar99 `st=` not needed
99     Message_Msg Msg111("XSTEP_111");
100     PR.SendFail(Msg111);
101   }
102   //st = PR.ReadInteger(PR.Current(), "Offset Distance Flag", anOffsetType);
103
104   // Reading the curve entity describing the offset as a function, can be Null
105   if (!PR.ReadEntity(IR, PR.Current(), aStatus, aFunction, Standard_True)){
106     Message_Msg Msg112("XSTEP_112");
107     switch(aStatus) {
108     case IGESData_ReferenceError: {  
109       Message_Msg Msg216 ("IGES_216");
110       Msg112.Arg(Msg216.Value());
111       PR.SendFail(Msg112);
112       break; }
113     case IGESData_EntityError: {
114       Message_Msg Msg217 ("IGES_217");
115       Msg112.Arg(Msg217.Value());
116       PR.SendFail(Msg112);
117       break; }
118     default:{
119     }
120     }
121   } //szv#4:S4163:12Mar99 `st=` not needed
122 /*
123   st = PR.ReadEntity(IR, PR.Current(), "Curve whose coordinate describes the offset", aFunction, Standard_True);
124 */
125
126   // Reading the coordinate describing the offset as a function
127   if (!PR.ReadInteger(PR.Current(), aFunctionCoord)){ //szv#4:S4163:12Mar99 `st=` not needed
128     Message_Msg Msg113("XSTEP_113");
129     PR.SendFail(Msg113);
130   }
131   //st = PR.ReadInteger(PR.Current(), "Coordinate of the curve", aFunctionCoord);
132
133   // Reading the tapered offset type flag
134   if (!PR.ReadInteger(PR.Current(), aTaperedOffsetType)){ //szv#4:S4163:12Mar99 `st=` not needed
135     Message_Msg Msg114("XSTEP_114");
136     PR.SendFail(Msg114);
137   }
138   //st = PR.ReadInteger(PR.Current(), "Tapered offset type flag", aTaperedOffsetType);
139
140   // Reading the first offset distance
141   if (!PR.ReadReal(PR.Current(), offDistance1)){
142     Message_Msg Msg115("XSTEP_115");
143     PR.SendFail(Msg115);
144   } //szv#4:S4163:12Mar99 `st=` not needed
145   //st = PR.ReadReal(PR.Current(), "First Offset distance", offDistance1);
146
147   // Reading the arc length or parameter value of the first offset distance
148   if (!PR.ReadReal(PR.Current(), arcLength1)){
149     Message_Msg Msg116("XSTEP_116");
150     PR.SendFail(Msg116);
151   } //szv#4:S4163:12Mar99 `st=` not needed
152   //st = PR.ReadReal(PR.Current(), "Arc length of first offset distance", arcLength1);
153
154   // Reading the second offset distance
155   if (!PR.ReadReal(PR.Current(),offDistance2)){
156     Message_Msg Msg117("XSTEP_117");
157     PR.SendFail(Msg117);
158   } //szv#4:S4163:12Mar99 `st=` not needed
159   //st = PR.ReadReal(PR.Current(), "Second Offset distance", offDistance2);
160
161   // Reading the arc length or parameter value of the second offset distance
162   if (!PR.ReadReal(PR.Current(), arcLength2)){
163     Message_Msg Msg118("XSTEP_118");
164     PR.SendFail(Msg118);
165   } //szv#4:S4163:12Mar99 `st=` not needed
166   //st = PR.ReadReal(PR.Current(), "Arc length of Second offset distance", arcLength2);
167
168   // Reading the Unit vector normal to plane
169   PR.ReadXYZ (PR.CurrentList(1, 3), Msg121, aNormalVec); //szv#4:S4163:12Mar99 `st=` not needed
170   //st = PR.ReadXYZ (PR.CurrentList(1, 3), "Unit vector normal to plane", aNormalVec);
171
172   // Reading the offset curve starting parameter value
173   if (!PR.ReadReal(PR.Current(), anOffsetParam)){
174     Message_Msg Msg119("XSTEP_119");
175     PR.SendFail(Msg119);
176   } //szv#4:S4163:12Mar99 `st=` not needed
177   //st = PR.ReadReal(PR.Current(), "Starting parameter value of Offset curve", anOffsetParam);
178
179   // Reading the offset curve ending parameter value
180   if (!PR.ReadReal(PR.Current(), anotherOffsetParam)){
181     Message_Msg Msg120("XSTEP_120");
182     PR.SendFail(Msg120);
183   } //szv#4:S4163:12Mar99 `st=` not needed
184   //st = PR.ReadReal(PR.Current(), "Ending parameter value of Offset curve", anotherOffsetParam);
185
186   // Reading the Unit vector normal to plane
187   PR.ReadXYZ (PR.CurrentList(1, 3), Msg121, aNormalVec); //szv#4:S4163:12Mar99 `st=` not needed
188   //st = PR.ReadXYZ (PR.CurrentList(1, 3), "Unit vector normal to plane", aNormalVec);
189
190   DirChecker(ent).CheckTypeAndForm(PR.CCheck(),ent);
191   ent->Init
192     (aBaseCurve, anOffsetType, aFunction, aFunctionCoord,
193      aTaperedOffsetType, offDistance1, arcLength1, offDistance2,
194      arcLength2, aNormalVec, anOffsetParam, anotherOffsetParam);
195 }
196
197
198 //=======================================================================
199 //function : WriteOwnParams
200 //purpose  : 
201 //=======================================================================
202
203 void IGESGeom_ToolOffsetCurve::WriteOwnParams(const Handle(IGESGeom_OffsetCurve)& ent,
204                                               IGESData_IGESWriter& IW)  const
205 {
206   IW.Send(ent->BaseCurve());
207   IW.Send(ent->OffsetType());
208
209   IW.Send(ent->Function());
210
211   IW.Send(ent->FunctionParameter());
212   IW.Send(ent->TaperedOffsetType());
213   IW.Send(ent->FirstOffsetDistance());
214   IW.Send(ent->ArcLength1());
215   IW.Send(ent->SecondOffsetDistance());
216   IW.Send(ent->ArcLength2());
217   IW.Send(ent->NormalVector().X());
218   IW.Send(ent->NormalVector().Y());
219   IW.Send(ent->NormalVector().Z());
220   IW.Send(ent->StartParameter());
221   IW.Send(ent->EndParameter());
222 }
223
224
225 //=======================================================================
226 //function : OwnShared
227 //purpose  : 
228 //=======================================================================
229
230 void IGESGeom_ToolOffsetCurve::OwnShared(const Handle(IGESGeom_OffsetCurve)& ent,
231                                          Interface_EntityIterator& iter) const
232 {
233   iter.GetOneItem(ent->BaseCurve());
234   iter.GetOneItem(ent->Function());
235 }
236
237
238 //=======================================================================
239 //function : OwnCopy
240 //purpose  : 
241 //=======================================================================
242
243 void IGESGeom_ToolOffsetCurve::OwnCopy(const Handle(IGESGeom_OffsetCurve)& another,
244                                        const Handle(IGESGeom_OffsetCurve)& ent,
245                                        Interface_CopyTool& TC) const
246 {
247   Standard_Integer anOffsetType, aFunctionCoord, aTaperedOffsetType; 
248   Standard_Real offDistance1, offDistance2;
249   Standard_Real arcLength1, arcLength2, anOffsetParam1, anOffsetParam2;
250
251   DeclareAndCast(IGESData_IGESEntity, aBaseCurve,
252                  TC.Transferred(another->BaseCurve()));
253   anOffsetType   = another->OffsetType();
254   DeclareAndCast(IGESData_IGESEntity, aFunction,
255                  TC.Transferred(another->Function()));
256   aFunctionCoord = another->FunctionParameter();
257   aTaperedOffsetType = another->TaperedOffsetType();
258   offDistance1   = another->FirstOffsetDistance();
259   arcLength1     = another->ArcLength1();
260   offDistance2   = another->SecondOffsetDistance();
261   arcLength2     = another->ArcLength2();
262   gp_XYZ aNormalVec = (another->NormalVector()).XYZ();
263   anOffsetParam1 = another->StartParameter();
264   anOffsetParam2 = another->EndParameter();
265
266   ent->Init(aBaseCurve, anOffsetType, aFunction, aFunctionCoord,
267             aTaperedOffsetType, offDistance1, arcLength1, offDistance2,
268             arcLength2, aNormalVec, anOffsetParam1, anOffsetParam2);
269 }
270
271
272 //=======================================================================
273 //function : OwnCorrect
274 //purpose  : 
275 //=======================================================================
276
277 Standard_Boolean IGESGeom_ToolOffsetCurve::OwnCorrect
278   (const Handle(IGESGeom_OffsetCurve)& ent) const
279 {
280   if (ent->OffsetType() == 3) return Standard_False;
281   Handle(IGESData_IGESEntity) func = ent->Function();
282   if (func.IsNull()) return Standard_False;
283 //  OffsetType != 3 : reconstruire avec Offset Function Nulle
284   func.Nullify();
285   ent->Init (ent->BaseCurve(), ent->OffsetType(), func,0,  // func+coord Nuls
286              ent->TaperedOffsetType(),
287              ent->FirstOffsetDistance(),  ent->ArcLength1(),
288              ent->SecondOffsetDistance(), ent->ArcLength2(),
289              ent->NormalVector().XYZ(),
290              ent->StartParameter(), ent->EndParameter() );
291   return Standard_True;
292 }
293
294
295 //=======================================================================
296 //function : DirChecker
297 //purpose  : 
298 //=======================================================================
299
300 IGESData_DirChecker IGESGeom_ToolOffsetCurve::DirChecker
301   (const Handle(IGESGeom_OffsetCurve)& /* ent */ )   const
302 {
303   IGESData_DirChecker DC(130, 0);
304   DC.Structure(IGESData_DefVoid);
305   DC.LineFont(IGESData_DefAny);
306 //  DC.LineWeight(IGESData_DefValue);
307   DC.Color(IGESData_DefAny);
308   DC.HierarchyStatusIgnored();
309   return DC;
310 }
311
312
313 //=======================================================================
314 //function : OwnCheck
315 //purpose  : 
316 //=======================================================================
317
318 void IGESGeom_ToolOffsetCurve::OwnCheck(const Handle(IGESGeom_OffsetCurve)& ent,
319                                         const Interface_ShareTool&,
320                                         Handle(Interface_Check)& ach)  const
321 {
322   // MGE 30/07/98
323   // Building of messages
324   //========================================
325   //Message_Msg Msg111("XSTEP_111");
326   //Message_Msg Msg114("XSTEP_114");
327   //========================================
328
329   Standard_Integer ot = ent->OffsetType();
330   if (ot < 1 || ot > 3) {
331     Message_Msg Msg111("XSTEP_111");
332     ach->SendFail(Msg111);
333   }
334 /*  if (ot == 3)  if (ent->Function().IsNull())
335     ach.SendFail("Offset Function Not Defined while Offset Type = 3");
336   if (ot == 3 && (ent->FunctionParameter() < 1 || ent->FunctionParameter() > 3))
337     ach.SendFail("Offset Function Parameter != 1-2 or 3 (rq : for X-Y or Z)");
338 */
339   if (ot !=1 && //:l9 abv 15.01.99: CTS22023 and TEC0278: only if ot is function
340       ((ent->TaperedOffsetType() < 1) || (ent->TaperedOffsetType() > 2))) {
341     Message_Msg Msg114("XSTEP_114");
342     ach->SendFail(Msg114);
343   }
344 }
345
346
347 //=======================================================================
348 //function : OwnDump
349 //purpose  : 
350 //=======================================================================
351
352 void IGESGeom_ToolOffsetCurve::OwnDump(const Handle(IGESGeom_OffsetCurve)& ent,
353                                        const IGESData_IGESDumper& dumper,
354                                        Standard_OStream& S,
355                                        const Standard_Integer level)  const
356 {
357   Standard_Integer sublevel = (level <= 4) ? 0 : 1;
358
359   S << "IGESGeom_OffsetCurve\n"
360     << "The curve to be offset     :\n";
361   dumper.Dump(ent->BaseCurve(),S, sublevel);
362   S << "Offset Distance Flag       : " << ent->OffsetType() << "\n"
363     << "Curve entity whose coordinate defines the offset : ";
364   dumper.Dump(ent->Function(),S, sublevel);
365   S << "\n"
366     << "In which Coordinate to use : " << ent->FunctionParameter()    << "\n"
367     << "Tapered Offset Type Flag   : " << ent->TaperedOffsetType()    << "\n"
368     << "First Offset Distance      : " << ent->FirstOffsetDistance()  << "  "
369     << "Arc Length : " << ent->ArcLength1() << "\n"
370     << "Second Offset Distance     : " << ent->SecondOffsetDistance() << "  "
371     << "Arc Length : " << ent->ArcLength2() << "\n"
372     << "Normal Vector : ";
373   IGESData_DumpXYZL(S,level, ent->NormalVector(), ent->VectorLocation());  S <<"\n";
374   S << "Offset curve Parameters. Starting : " << ent->StartParameter() << "  "
375     << "Ending : " << ent->EndParameter()   << std::endl;
376 }