1 // Created on: 1992-07-02
2 // Created by: Philippe DAUTRY
3 // Copyright (c) 1992-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License 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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <BRepSweep_NumLinearRegularSweep.ixx>
19 #include <Standard_RangeError.hxx>
20 #include <Standard_NoSuchObject.hxx>
21 #include <Standard_NoMoreObject.hxx>
22 #include <Standard_DomainError.hxx>
24 #include <TopoDS_Shape.hxx>
25 #include <Sweep_NumShape.hxx>
26 #include <BRepSweep_Builder.hxx>
27 #include <BRepSweep_Tool.hxx>
28 #include <Sweep_NumShapeTool.hxx>
29 #include <BRepSweep_Iterator.hxx>
30 #include <Sweep_NumShapeIterator.hxx>
31 #include <TopTools_SequenceOfShape.hxx>
33 #include <TopAbs_Orientation.hxx>
36 //=======================================================================
37 //function : BRepSweep_NumLinearRegularSweep
38 //purpose : Create a Regular Sweep.
39 //=======================================================================
41 BRepSweep_NumLinearRegularSweep::BRepSweep_NumLinearRegularSweep
42 (const BRepSweep_Builder& aBuilder,
43 const TopoDS_Shape& aGenShape,
44 const Sweep_NumShape& aDirShape):
47 myGenShape(aGenShape),
50 myGenShapeTool(aGenShape),
51 myDirShapeTool(aDirShape),
53 // *****************************************************************
55 // *****************************************************************
57 myShapes(1,myGenShapeTool.NbShapes(),
58 1,myDirShapeTool.NbShapes()),
59 myBuiltShapes(1,myGenShapeTool.NbShapes(),
60 1,myDirShapeTool.NbShapes())
62 myBuiltShapes.Init(Standard_False);
65 void BRepSweep_NumLinearRegularSweep::Delete()
68 //=======================================================================
70 //purpose : Returns the global Shape.
71 //=======================================================================
73 TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape ()
75 if (HasShape(myGenShape,myDirWire)) return Shape(myGenShape,myDirWire);
83 //=======================================================================
85 //purpose : Returns the Shape generated with aGenS.
86 //=======================================================================
88 TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS)
90 if (myGenShapeTool.Index(aGenS) != 0 &&
91 HasShape(aGenS,myDirWire)) return Shape(aGenS,myDirWire);
99 //=======================================================================
101 //purpose : Returns the Shape indexed by the arguments.
102 //=======================================================================
104 TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
105 const Sweep_NumShape& aDirS)
107 Standard_Integer iGenS = myGenShapeTool.Index(aGenS);
108 Standard_Integer iDirS = myDirShapeTool.Index(aDirS);
109 if (!myBuiltShapes(iGenS,iDirS)){
110 TopoDS_Shape newShape;
111 TopoDS_Shape bGenS,cGenS,subGenS,subsubGenS;
112 Sweep_NumShape bDirS,subDirS;
113 BRepSweep_Iterator It;
114 Sweep_NumShapeIterator Kt;
115 BRepSweep_Iterator Lt;
116 TopAbs_Orientation Or,Pr;
117 if (myDirShapeTool.Type(aDirS)==TopAbs_VERTEX){
118 //Ici on construit les "planchers" du Shape.
119 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
122 myShapes(iGenS,iDirS)=MakeEmptyVertex(aGenS,aDirS);
125 myShapes(iGenS,iDirS)=MakeEmptyGeneratingEdge(aGenS,aDirS);
128 myBuilder.MakeWire(myShapes(iGenS,iDirS));
131 myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
134 myBuilder.MakeShell(myShapes(iGenS,iDirS));
137 Standard_NoSuchObject::Raise("Solids are not Processed");
139 case TopAbs_COMPSOLID :
140 Standard_NoSuchObject::Raise("Solids are not Processed");
142 case TopAbs_COMPOUND :
143 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
146 Standard_NoSuchObject::Raise("Unknown Shape");
150 myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
151 for (It.Init(bGenS);It.More();It.Next()){
152 subGenS = It.Value();
153 Or = It.Orientation();
154 if(HasShape(subGenS,aDirS)){
155 newShape = Shape(subGenS,aDirS);
156 if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
157 aGenS,subGenS,aDirS)){
158 //Les "planchers" doivent etre construits par les
159 //fonctions de construcion geometrique identiquement
160 //au shape generateur.
161 //On leur recolle juste une orientation pour etre bien
164 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
165 TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
166 if (aGenSType==TopAbs_FACE){
167 if(subGenSType==TopAbs_VERTEX){
168 SetParameters(myShapes(iGenS,iDirS),
169 newShape,aGenS,subGenS,aDirS);
171 else if(subGenSType==TopAbs_EDGE){
172 SetPCurve(myShapes(iGenS,iDirS),newShape,
173 aGenS,subGenS,aDirS,Or);
175 else if(subGenSType==TopAbs_WIRE){
176 BRepSweep_Iterator Jt;
178 myGenShapeTool.SetOrientation(cGenS,TopAbs_FORWARD);
179 for (Jt.Init(cGenS);Jt.More();Jt.Next()){
180 subsubGenS = Jt.Value();
181 Pr = Jt.Orientation();
182 if(HasShape(subsubGenS,aDirS)){
183 TopoDS_Shape newsubEdge = Shape(subsubGenS,aDirS);
184 SetPCurve(myShapes(iGenS,iDirS),newsubEdge,
185 aGenS,subsubGenS,aDirS,Pr);
190 else if(aGenSType==TopAbs_EDGE){
191 SetGeneratingParameter(myShapes(iGenS,iDirS),
192 newShape,bGenS,subGenS,aDirS);
198 else if (myDirShapeTool.Type(aDirS)==TopAbs_EDGE){
199 //Ici on construit les murs du Shape.
200 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
201 TopoDS_Shape newWire,newShell;
202 TopTools_SequenceOfShape WireSeq;
203 Standard_Boolean sepwires = Standard_False;
206 myShapes(iGenS,iDirS)=MakeEmptyDirectingEdge(aGenS,aDirS);
209 //On cree un wire intermediaire qui contient tous les edges
210 //du montant (face) du Shape pour le cas standard, et une
211 //sequence de wires pour les cas merdiques necessitant des
212 //wires independants.
213 myBuilder.MakeWire(newWire);
214 myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
217 myBuilder.MakeShell(myShapes(iGenS,iDirS));
220 //On cree un shell intermediaire dans lequel on jette toutes
221 //les faces en direct, pour eviter les empilages compliques
222 //de shells et sous shells dans la structure du solide.
223 myBuilder.MakeShell(newShell);
224 myBuilder.MakeSolid(myShapes(iGenS,iDirS));
227 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
230 Standard_NoSuchObject::Raise("Solids are not Processed");
232 case TopAbs_COMPSOLID :
233 Standard_NoSuchObject::Raise("Solids are not Processed");
235 case TopAbs_COMPOUND :
236 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
239 Standard_NoSuchObject::Raise("Unknown Shape");
243 myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
244 for (It.Init(bGenS);It.More();It.Next()){
245 subGenS = It.Value();
246 if(HasShape(subGenS,aDirS)){
247 newShape = Shape(subGenS,aDirS);
248 if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
249 aGenS,subGenS,aDirS)){
250 TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
251 if (aGenSType==TopAbs_EDGE){
252 Or = It.Orientation();
253 if (SeparatedWires(myShapes(iGenS,iDirS),newShape,
254 aGenS,subGenS,aDirS)){
255 sepwires = Standard_True;
257 myBuilder.MakeWire(wi);
258 myBuilder.Add(wi,newShape,Or);
262 myBuilder.Add(newWire,newShape,Or);
264 SetDirectingPCurve (myShapes(iGenS,iDirS),
265 newShape,bGenS,subGenS,aDirS,Or);
267 else if (aGenSType==TopAbs_WIRE){
268 Or = It.Orientation();
269 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
271 else if (aGenSType==TopAbs_FACE){
272 Or = It.Orientation();
273 if(subGenSType == TopAbs_WIRE) {
274 for (Lt.Init(newShape);Lt.More();Lt.Next()){
275 myBuilder.Add(newShell,Lt.Value(),
276 TopAbs::Compose(Lt.Orientation(),Or));
279 else if(subGenSType == TopAbs_EDGE) {
280 myBuilder.Add(newShell,newShape,Or);
283 else if(aGenSType == TopAbs_SHELL){
285 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
287 else if(aGenSType == TopAbs_COMPOUND){
289 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
292 Or = It.Orientation();
293 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
299 for (Kt.Init(bDirS);Kt.More();Kt.Next()){
300 subDirS = Kt.Value();
301 if(HasShape(aGenS,subDirS)){
302 newShape = Shape(aGenS,subDirS);
303 if (GDDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
304 aGenS,aDirS,subDirS)){
305 if (aGenSType==TopAbs_EDGE){
306 Or = TopAbs::Reverse(Kt.Orientation());
307 myBuilder.Add(newWire,newShape,Or);
309 (myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS,Or);
311 else if(aGenSType==TopAbs_VERTEX){
312 Or = Kt.Orientation();
313 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
314 SetDirectingParameter
315 (myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS);
317 else if(aGenSType==TopAbs_FACE){
318 Or = Kt.Orientation();
319 myBuilder.Add(newShell,newShape,Or);
324 if (aGenSType==TopAbs_EDGE){
326 for(Standard_Integer ij = 1;ij <= WireSeq.Length();ij++){
327 myBuilder.Add(myShapes(iGenS,iDirS),WireSeq.Value(ij));
331 myBuilder.Add(myShapes(iGenS,iDirS),newWire);
333 myBuiltShapes(iGenS,iDirS) = Standard_True;
334 SetContinuity(aGenS,aDirS);
336 if (aGenSType==TopAbs_WIRE){
337 SetContinuity(aGenS,aDirS);
339 if (aGenSType==TopAbs_FACE){
340 newShell.Closed (BRep_Tool::IsClosed (newShell));
341 TopoDS_Shape temp = SplitShell(newShell);
342 TopAbs_Orientation Or = DirectSolid(aGenS,aDirS);
344 if(Lt.More()) Lt.Next();
346 for (Lt.Init(temp);Lt.More();Lt.Next()){
347 myBuilder.Add(myShapes(iGenS,iDirS),Lt.Value(),Or);
350 else myBuilder.Add(myShapes(iGenS,iDirS),newShell,Or);
353 else if (myDirShapeTool.Type(aDirS)==TopAbs_WIRE){
354 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
357 myBuilder.MakeWire(myShapes(iGenS,iDirS));
360 myBuilder.MakeShell(myShapes(iGenS,iDirS));
363 myBuilder.MakeShell(myShapes(iGenS,iDirS));
366 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
369 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
372 Standard_NoSuchObject::Raise("Solids are not Processed");
374 case TopAbs_COMPSOLID :
375 Standard_NoSuchObject::Raise("Solids are not Processed");
377 case TopAbs_COMPOUND :
378 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
381 Standard_NoSuchObject::Raise("Unknown Shape");
385 for (Kt.Init(aDirS);Kt.More();Kt.Next()){
386 subDirS = Kt.Value();
387 if(HasShape(aGenS,subDirS)){
388 Or = Kt.Orientation();
389 newShape = Shape(aGenS,subDirS);
390 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
394 myBuiltShapes(iGenS,iDirS) = Standard_True;
396 myShapes(iGenS,iDirS).Closed (BRep_Tool::IsClosed (myShapes(iGenS,iDirS)));
397 return myShapes(iGenS,iDirS);
401 //=======================================================================
402 //function : FirstShape
403 //purpose : Returns the Shape indexed by the arguments.
404 //=======================================================================
406 TopoDS_Shape BRepSweep_NumLinearRegularSweep::FirstShape ()
409 if (myDirShapeTool.HasFirstVertex()){
410 if(HasShape(myGenShape,myDirShapeTool.FirstVertex()))
411 result = Shape(myGenShape,myDirShapeTool.FirstVertex());
417 //=======================================================================
418 //function : LastShape
419 //purpose : Returns the Shape indexed by the arguments.
420 //=======================================================================
422 TopoDS_Shape BRepSweep_NumLinearRegularSweep::LastShape ()
425 if (myDirShapeTool.HasLastVertex()){
426 if(HasShape(myGenShape,myDirShapeTool.LastVertex()))
427 result = Shape(myGenShape,myDirShapeTool.LastVertex());
433 //=======================================================================
434 //function : FirstShape
435 //purpose : Returns the Shape indexed by the arguments.
436 //=======================================================================
438 TopoDS_Shape BRepSweep_NumLinearRegularSweep::FirstShape (const TopoDS_Shape& aGenS)
441 if (myDirShapeTool.HasFirstVertex()){
442 if(HasShape(aGenS,myDirShapeTool.FirstVertex()))
443 result = Shape(aGenS,myDirShapeTool.FirstVertex());
449 //=======================================================================
450 //function : LastShape
451 //purpose : Returns the Shape indexed by the arguments.
452 //=======================================================================
454 TopoDS_Shape BRepSweep_NumLinearRegularSweep::LastShape (const TopoDS_Shape& aGenS)
457 if (myDirShapeTool.HasLastVertex()){
458 if(HasShape(aGenS,myDirShapeTool.LastVertex()))
459 result = Shape(aGenS,myDirShapeTool.LastVertex());
464 //=======================================================================
467 //=======================================================================
469 Standard_Boolean BRepSweep_NumLinearRegularSweep::Closed()const
471 return myDirWire.Closed();
474 //=======================================================================
475 //function : SplitShell
477 //=======================================================================
479 TopoDS_Shape BRepSweep_NumLinearRegularSweep::SplitShell(const TopoDS_Shape& aNewShape)const
482 myBuilder.MakeCompound(comp);
483 myBuilder.Add(comp,aNewShape);