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 | |
30 | Sweep_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 | |
54 | void Sweep_LinearRegularSweep::Delete() |
55 | {} |
56 | |
57 | //======================================================================= |
58 | //function : Shape |
59 | //purpose : Returns the global Shape. |
60 | //======================================================================= |
61 | |
62 | TheShape 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 | |
77 | TheShape 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 | |
93 | TheShape 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 | |
393 | TheShape 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 | |
409 | TheShape 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 | |
425 | TheShape 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 | |
441 | TheShape 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 | |
456 | Standard_Boolean Sweep_LinearRegularSweep::Closed()const |
457 | { |
458 | return myDirWire.Closed(); |
459 | } |
460 | |
461 | //======================================================================= |
462 | //function : SplitShell |
463 | //purpose : |
464 | //======================================================================= |
465 | |
466 | TheShape 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 | |