0024530: TKMesh - remove unused package IntPoly
[occt.git] / src / Sweep / Sweep_LinearRegularSweep.gxx
CommitLineData
b311480e 1// Created on: 1992-07-02
2// Created by: Philippe DAUTRY
3// Copyright (c) 1992-1999 Matra Datavision
973c2be1 4// Copyright (c) 1999-2014 OPEN CASCADE SAS
b311480e 5//
973c2be1 6// This file is part of Open CASCADE Technology software library.
b311480e 7//
973c2be1 8// This library is free software; you can redistribute it and / or modify it
9// under the terms of the GNU Lesser General Public version 2.1 as published
10// by the Free Software Foundation, with special exception defined in the file
11// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12// distribution for complete text of the license and disclaimer of any warranty.
b311480e 13//
973c2be1 14// Alternatively, this file may be used under the terms of Open CASCADE
15// commercial license or contractual agreement.
7fd59977 16
17#include <Standard_RangeError.hxx>
18#include <Standard_NoSuchObject.hxx>
19#include <Standard_NoMoreObject.hxx>
20#include <Standard_DomainError.hxx>
21
22#include <TopAbs_Orientation.hxx>
23#include <TopAbs.hxx>
24
25//=======================================================================
26//function : Sweep_LinearRegularSweep
27//purpose : Create a Regular Sweep.
28//=======================================================================
29
30Sweep_LinearRegularSweep::Sweep_LinearRegularSweep
31 (const TheBuilder& aBuilder,
32 const TheGenShape& aGenShape,
33 const TheDirShape& aDirShape):
34
35 myBuilder(aBuilder),
36 myGenShape(aGenShape),
37 myDirWire(aDirShape),
38
39 myGenShapeTool(aGenShape),
40 myDirShapeTool(aDirShape),
41
42 // *****************************************************************
43 // Les Tableaux
44 // *****************************************************************
45
46 myShapes(1,myGenShapeTool.NbShapes(),
47 1,myDirShapeTool.NbShapes()),
48 myBuiltShapes(1,myGenShapeTool.NbShapes(),
49 1,myDirShapeTool.NbShapes())
50{
51 myBuiltShapes.Init(Standard_False);
52}
53
54void Sweep_LinearRegularSweep::Delete()
55{}
56
57//=======================================================================
58//function : Shape
59//purpose : Returns the global Shape.
60//=======================================================================
61
62TheShape Sweep_LinearRegularSweep::Shape ()
63{
64 if (HasShape(myGenShape,myDirWire)) return Shape(myGenShape,myDirWire);
65 else {
66 TheShape bidon;
67 return bidon;
68 }
69}
70
71
72//=======================================================================
73//function : Shape
74//purpose : Returns the Shape generated with aGenS.
75//=======================================================================
76
77TheShape Sweep_LinearRegularSweep::Shape (const TheGenShape& aGenS)
78{
79 if (myGenShapeTool.Index(aGenS) != 0 &&
80 HasShape(aGenS,myDirWire)) return Shape(aGenS,myDirWire);
81 else {
82 TheShape bidon;
83 return bidon;
84 }
85}
86
87
88//=======================================================================
89//function : Shape
90//purpose : Returns the Shape indexed by the arguments.
91//=======================================================================
92
93TheShape Sweep_LinearRegularSweep::Shape (const TheGenShape& aGenS,
94 const TheDirShape& aDirS)
95{
96 Standard_Integer iGenS = myGenShapeTool.Index(aGenS);
97 Standard_Integer iDirS = myDirShapeTool.Index(aDirS);
98 if (!myBuiltShapes(iGenS,iDirS)){
99 TheShape newShape;
100 TheGenShape bGenS,cGenS,subGenS,subsubGenS;
101 TheDirShape bDirS,subDirS;
102 TheGenShapeIterator It;
103 TheDirShapeIterator Kt;
104 TheShapeIterator Lt;
105 TopAbs_Orientation Or,Pr;
106 if (myDirShapeTool.Type(aDirS)==TopAbs_VERTEX){
107 //Ici on construit les "planchers" du Shape.
108 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
109 switch (aGenSType){
110 case TopAbs_VERTEX :
111 myShapes(iGenS,iDirS)=MakeEmptyVertex(aGenS,aDirS);
112 break;
113 case TopAbs_EDGE :
114 myShapes(iGenS,iDirS)=MakeEmptyGeneratingEdge(aGenS,aDirS);
115 break;
116 case TopAbs_WIRE :
117 myBuilder.MakeWire(myShapes(iGenS,iDirS));
118 break;
119 case TopAbs_FACE :
120 myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
121 break;
122 case TopAbs_SHELL :
123 myBuilder.MakeShell(myShapes(iGenS,iDirS));
124 break;
125 case TopAbs_SOLID :
126 Standard_NoSuchObject::Raise("Solids are not Processed");
127 break;
128 case TopAbs_COMPSOLID :
129 Standard_NoSuchObject::Raise("Solids are not Processed");
130 break;
131 case TopAbs_COMPOUND :
132 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
133 break;
134 default:
135 Standard_NoSuchObject::Raise("Unknown Shape");
136 break;
137 }
138 bGenS = aGenS;
139 myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
140 for (It.Init(bGenS);It.More();It.Next()){
141 subGenS = It.Value();
142 Or = It.Orientation();
143 if(HasShape(subGenS,aDirS)){
144 newShape = Shape(subGenS,aDirS);
145 if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
146 aGenS,subGenS,aDirS)){
147 //Les "planchers" doivent etre construits par les
148 //fonctions de construcion geometrique identiquement
149 //au shape generateur.
150 //On leur recolle juste une orientation pour etre bien
151 //sur.
152
153 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
154 TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
155 if (aGenSType==TopAbs_FACE){
156 if(subGenSType==TopAbs_VERTEX){
157 SetParameters(myShapes(iGenS,iDirS),
158 newShape,aGenS,subGenS,aDirS);
159 }
160 else if(subGenSType==TopAbs_EDGE){
161 SetPCurve(myShapes(iGenS,iDirS),newShape,
162 aGenS,subGenS,aDirS,Or);
163 }
164 else if(subGenSType==TopAbs_WIRE){
165 TheGenShapeIterator Jt;
166 cGenS = subGenS;
167 myGenShapeTool.SetOrientation(cGenS,TopAbs_FORWARD);
168 for (Jt.Init(cGenS);Jt.More();Jt.Next()){
169 subsubGenS = Jt.Value();
170 Pr = Jt.Orientation();
171 if(HasShape(subsubGenS,aDirS)){
172 TheShape newsubEdge = Shape(subsubGenS,aDirS);
173 SetPCurve(myShapes(iGenS,iDirS),newsubEdge,
174 aGenS,subsubGenS,aDirS,Pr);
175 }
176 }
177 }
178 }
179 else if(aGenSType==TopAbs_EDGE){
180 SetGeneratingParameter(myShapes(iGenS,iDirS),
181 newShape,bGenS,subGenS,aDirS);
182 }
183 }
184 }
185 }
186 }
187 else if (myDirShapeTool.Type(aDirS)==TopAbs_EDGE){
188 //Ici on construit les murs du Shape.
189 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
190 TheShape newWire,newShell;
191 Sweep_SequenceOfShapes WireSeq;
192 Standard_Boolean sepwires = Standard_False;
193 switch (aGenSType){
194 case TopAbs_VERTEX :
195 myShapes(iGenS,iDirS)=MakeEmptyDirectingEdge(aGenS,aDirS);
196 break;
197 case TopAbs_EDGE :
198 //On cree un wire intermediaire qui contient tous les edges
199 //du montant (face) du Shape pour le cas standard, et une
200 //sequence de wires pour les cas merdiques necessitant des
201 //wires independants.
202 myBuilder.MakeWire(newWire);
203 myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
204 break;
205 case TopAbs_WIRE :
206 myBuilder.MakeShell(myShapes(iGenS,iDirS));
207 break;
208 case TopAbs_FACE :
209 //On cree un shell intermediaire dans lequel on jette toutes
210 //les faces en direct, pour eviter les empilages compliques
211 //de shells et sous shells dans la structure du solide.
212 myBuilder.MakeShell(newShell);
213 myBuilder.MakeSolid(myShapes(iGenS,iDirS));
214 break;
215 case TopAbs_SHELL :
216 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
217 break;
218 case TopAbs_SOLID :
219 Standard_NoSuchObject::Raise("Solids are not Processed");
220 break;
221 case TopAbs_COMPSOLID :
222 Standard_NoSuchObject::Raise("Solids are not Processed");
223 break;
224 case TopAbs_COMPOUND :
225 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
226 break;
227 default:
228 Standard_NoSuchObject::Raise("Unknown Shape");
229 break;
230 }
231 bGenS = aGenS;
232 myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
233 for (It.Init(bGenS);It.More();It.Next()){
234 subGenS = It.Value();
235 if(HasShape(subGenS,aDirS)){
236 newShape = Shape(subGenS,aDirS);
237 if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
238 aGenS,subGenS,aDirS)){
239 TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
240 if (aGenSType==TopAbs_EDGE){
241 Or = It.Orientation();
242 if (SeparatedWires(myShapes(iGenS,iDirS),newShape,
243 aGenS,subGenS,aDirS)){
244 sepwires = Standard_True;
245 TheShape wi;
246 myBuilder.MakeWire(wi);
247 myBuilder.Add(wi,newShape,Or);
248 WireSeq.Append(wi);
249 }
250 else{
251 myBuilder.Add(newWire,newShape,Or);
252 }
253 SetDirectingPCurve (myShapes(iGenS,iDirS),
254 newShape,bGenS,subGenS,aDirS,Or);
255 }
256 else if (aGenSType==TopAbs_WIRE){
257 Or = It.Orientation();
258 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
259 }
260 else if (aGenSType==TopAbs_FACE){
261 Or = It.Orientation();
262 if(subGenSType == TopAbs_WIRE) {
263 for (Lt.Init(newShape);Lt.More();Lt.Next()){
264 myBuilder.Add(newShell,Lt.Value(),
265 TopAbs::Compose(Lt.Orientation(),Or));
266 }
267 }
268 else if(subGenSType == TopAbs_EDGE) {
269 myBuilder.Add(newShell,newShape,Or);
270 }
271 }
272 else if(aGenSType == TopAbs_SHELL){
273 Or = TopAbs_FORWARD;
274 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
275 }
276 else if(aGenSType == TopAbs_COMPOUND){
277 Or = TopAbs_FORWARD;
278 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
279 }
280 else{
281 Or = It.Orientation();
282 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
283 }
284 }
285 }
286 }
287 bDirS = aDirS;
288 for (Kt.Init(bDirS);Kt.More();Kt.Next()){
289 subDirS = Kt.Value();
290 if(HasShape(aGenS,subDirS)){
291 newShape = Shape(aGenS,subDirS);
292 if (GDDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
293 aGenS,aDirS,subDirS)){
294 if (aGenSType==TopAbs_EDGE){
295 Or = TopAbs::Reverse(Kt.Orientation());
296 myBuilder.Add(newWire,newShape,Or);
297 SetGeneratingPCurve
298 (myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS,Or);
299 }
300 else if(aGenSType==TopAbs_VERTEX){
301 Or = Kt.Orientation();
302 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
303 SetDirectingParameter
304 (myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS);
305 }
306 else if(aGenSType==TopAbs_FACE){
307 Or = Kt.Orientation();
308 myBuilder.Add(newShell,newShape,Or);
309 }
310 }
311 }
312 }
313 if (aGenSType==TopAbs_EDGE){
314 if (sepwires){
315 for(Standard_Integer ij = 1;ij <= WireSeq.Length();ij++){
316 myBuilder.Add(myShapes(iGenS,iDirS),WireSeq.Value(ij));
317 }
318 }
319 else{
320 myBuilder.Add(myShapes(iGenS,iDirS),newWire);
321 }
322 myBuiltShapes(iGenS,iDirS) = Standard_True;
323 SetContinuity(aGenS,aDirS);
324 }
325 if (aGenSType==TopAbs_WIRE){
326 SetContinuity(aGenS,aDirS);
327 }
328 if (aGenSType==TopAbs_FACE){
329 TheShape temp = SplitShell(newShell);
330 TopAbs_Orientation Or = DirectSolid(aGenS,aDirS);
331 Lt.Init(temp);
332 if(Lt.More()) Lt.Next();
333 if(Lt.More()){
334 for (Lt.Init(temp);Lt.More();Lt.Next()){
335 myBuilder.Add(myShapes(iGenS,iDirS),Lt.Value(),Or);
336 }
337 }
338 else myBuilder.Add(myShapes(iGenS,iDirS),newShell,Or);
339 }
340 }
341 else if (myDirShapeTool.Type(aDirS)==TopAbs_WIRE){
342 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
343 switch (aGenSType){
344 case TopAbs_VERTEX :
345 myBuilder.MakeWire(myShapes(iGenS,iDirS));
346 break;
347 case TopAbs_EDGE :
348 myBuilder.MakeShell(myShapes(iGenS,iDirS));
349 break;
350 case TopAbs_WIRE :
351 myBuilder.MakeShell(myShapes(iGenS,iDirS));
352 break;
353 case TopAbs_FACE :
354 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
355 break;
356 case TopAbs_SHELL :
357 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
358 break;
359 case TopAbs_SOLID :
360 Standard_NoSuchObject::Raise("Solids are not Processed");
361 break;
362 case TopAbs_COMPSOLID :
363 Standard_NoSuchObject::Raise("Solids are not Processed");
364 break;
365 case TopAbs_COMPOUND :
366 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
367 break;
368 default:
369 Standard_NoSuchObject::Raise("Unknown Shape");
370 break;
371 }
372 bDirS = aDirS;
373 for (Kt.Init(aDirS);Kt.More();Kt.Next()){
374 subDirS = Kt.Value();
375 if(HasShape(aGenS,subDirS)){
376 Or = Kt.Orientation();
377 newShape = Shape(aGenS,subDirS);
378 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
379 }
380 }
381 }
382 myBuiltShapes(iGenS,iDirS) = Standard_True;
383 }
384 return myShapes(iGenS,iDirS);
385}
386
387
388//=======================================================================
389//function : FirstShape
390//purpose : Returns the Shape indexed by the arguments.
391//=======================================================================
392
393TheShape Sweep_LinearRegularSweep::FirstShape ()
394{
395 TheShape result;
396 if (myDirShapeTool.HasFirstVertex()){
397 if(HasShape(myGenShape,myDirShapeTool.FirstVertex()))
398 result = Shape(myGenShape,myDirShapeTool.FirstVertex());
399 }
400 return result;
401}
402
403
404//=======================================================================
405//function : LastShape
406//purpose : Returns the Shape indexed by the arguments.
407//=======================================================================
408
409TheShape Sweep_LinearRegularSweep::LastShape ()
410{
411 TheShape result;
412 if (myDirShapeTool.HasLastVertex()){
413 if(HasShape(myGenShape,myDirShapeTool.LastVertex()))
414 result = Shape(myGenShape,myDirShapeTool.LastVertex());
415 }
416 return result;
417}
418
419
420//=======================================================================
421//function : FirstShape
422//purpose : Returns the Shape indexed by the arguments.
423//=======================================================================
424
425TheShape Sweep_LinearRegularSweep::FirstShape (const TheGenShape& aGenS)
426{
427 TheShape result;
428 if (myDirShapeTool.HasFirstVertex()){
429 if(HasShape(aGenS,myDirShapeTool.FirstVertex()))
430 result = Shape(aGenS,myDirShapeTool.FirstVertex());
431 }
432 return result;
433}
434
435
436//=======================================================================
437//function : LastShape
438//purpose : Returns the Shape indexed by the arguments.
439//=======================================================================
440
441TheShape Sweep_LinearRegularSweep::LastShape (const TheGenShape& aGenS)
442{
443 TheShape result;
444 if (myDirShapeTool.HasLastVertex()){
445 if(HasShape(aGenS,myDirShapeTool.LastVertex()))
446 result = Shape(aGenS,myDirShapeTool.LastVertex());
447 }
448 return result;
449}
450
451//=======================================================================
452//function : Closed
453//purpose :
454//=======================================================================
455
456Standard_Boolean Sweep_LinearRegularSweep::Closed()const
457{
458 return myDirWire.Closed();
459}
460
461//=======================================================================
462//function : SplitShell
463//purpose :
464//=======================================================================
465
466TheShape Sweep_LinearRegularSweep::SplitShell(const TheShape& aNewShape)const
467{
468 TheShape comp;
469 myBuilder.MakeCompound(comp);
470 myBuilder.Add(comp,aNewShape);
471 return comp;
472}
473