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.
18 #include <BRepSweep_Builder.hxx>
19 #include <BRepSweep_Iterator.hxx>
20 #include <BRepSweep_NumLinearRegularSweep.hxx>
21 #include <BRepSweep_Tool.hxx>
22 #include <Standard_DomainError.hxx>
23 #include <Standard_NoMoreObject.hxx>
24 #include <Standard_NoSuchObject.hxx>
25 #include <Standard_RangeError.hxx>
26 #include <Sweep_NumShape.hxx>
27 #include <Sweep_NumShapeIterator.hxx>
28 #include <Sweep_NumShapeTool.hxx>
30 #include <TopAbs_Orientation.hxx>
31 #include <TopoDS_Shape.hxx>
32 #include <TopTools_SequenceOfShape.hxx>
34 //=======================================================================
35 //function : BRepSweep_NumLinearRegularSweep
36 //purpose : Create a Regular Sweep.
37 //=======================================================================
38 BRepSweep_NumLinearRegularSweep::BRepSweep_NumLinearRegularSweep
39 (const BRepSweep_Builder& aBuilder,
40 const TopoDS_Shape& aGenShape,
41 const Sweep_NumShape& aDirShape):
44 myGenShape(aGenShape),
47 myGenShapeTool(aGenShape),
48 myDirShapeTool(aDirShape),
50 // *****************************************************************
52 // *****************************************************************
54 myShapes(1,myGenShapeTool.NbShapes(),
55 1,myDirShapeTool.NbShapes()),
56 myBuiltShapes(1,myGenShapeTool.NbShapes(),
57 1,myDirShapeTool.NbShapes())
59 myBuiltShapes.Init(Standard_False);
62 //=======================================================================
63 //function : ~BRepSweep_NumLinearRegularSweep
64 //purpose : Destructor
65 //=======================================================================
67 BRepSweep_NumLinearRegularSweep::~BRepSweep_NumLinearRegularSweep()
71 //=======================================================================
73 //purpose : Returns the global Shape.
74 //=======================================================================
76 TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape ()
78 if (HasShape(myGenShape,myDirWire)) return Shape(myGenShape,myDirWire);
86 //=======================================================================
88 //purpose : Returns the Shape generated with aGenS.
89 //=======================================================================
91 TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS)
93 if (myGenShapeTool.Index(aGenS) != 0 &&
94 HasShape(aGenS,myDirWire)) return Shape(aGenS,myDirWire);
102 //=======================================================================
104 //purpose : Returns the Shape indexed by the arguments.
105 //=======================================================================
107 TopoDS_Shape BRepSweep_NumLinearRegularSweep::Shape (const TopoDS_Shape& aGenS,
108 const Sweep_NumShape& aDirS)
110 Standard_Integer iGenS = myGenShapeTool.Index(aGenS);
111 Standard_Integer iDirS = myDirShapeTool.Index(aDirS);
112 if (!myBuiltShapes(iGenS,iDirS)){
113 TopoDS_Shape newShape;
114 TopoDS_Shape bGenS,cGenS,subGenS,subsubGenS;
115 Sweep_NumShape bDirS,subDirS;
116 BRepSweep_Iterator It;
117 Sweep_NumShapeIterator Kt;
118 BRepSweep_Iterator Lt;
119 TopAbs_Orientation Or,Pr;
120 if (myDirShapeTool.Type(aDirS)==TopAbs_VERTEX){
121 //Ici on construit les "planchers" du Shape.
122 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
125 myShapes(iGenS,iDirS)=MakeEmptyVertex(aGenS,aDirS);
128 myShapes(iGenS,iDirS)=MakeEmptyGeneratingEdge(aGenS,aDirS);
131 myBuilder.MakeWire(myShapes(iGenS,iDirS));
134 myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
137 myBuilder.MakeShell(myShapes(iGenS,iDirS));
140 throw Standard_NoSuchObject("Solids are not Processed");
142 case TopAbs_COMPSOLID :
143 throw Standard_NoSuchObject("Solids are not Processed");
145 case TopAbs_COMPOUND :
146 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
149 throw Standard_NoSuchObject("Unknown Shape");
153 myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
154 for (It.Init(bGenS);It.More();It.Next()){
155 subGenS = It.Value();
156 Or = It.Orientation();
157 if(HasShape(subGenS,aDirS)){
158 newShape = Shape(subGenS,aDirS);
159 if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
160 aGenS,subGenS,aDirS)){
161 //Les "planchers" doivent etre construits par les
162 //fonctions de construcion geometrique identiquement
163 //au shape generateur.
164 //On leur recolle juste une orientation pour etre bien
167 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
168 TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
169 if (aGenSType==TopAbs_FACE){
170 if(subGenSType==TopAbs_VERTEX){
171 SetParameters(myShapes(iGenS,iDirS),
172 newShape,aGenS,subGenS,aDirS);
174 else if(subGenSType==TopAbs_EDGE){
175 SetPCurve(myShapes(iGenS,iDirS),newShape,
176 aGenS,subGenS,aDirS,Or);
178 else if(subGenSType==TopAbs_WIRE){
179 BRepSweep_Iterator Jt;
181 myGenShapeTool.SetOrientation(cGenS,TopAbs_FORWARD);
182 for (Jt.Init(cGenS);Jt.More();Jt.Next()){
183 subsubGenS = Jt.Value();
184 Pr = Jt.Orientation();
185 if(HasShape(subsubGenS,aDirS)){
186 TopoDS_Shape newsubEdge = Shape(subsubGenS,aDirS);
187 SetPCurve(myShapes(iGenS,iDirS),newsubEdge,
188 aGenS,subsubGenS,aDirS,Pr);
193 else if(aGenSType==TopAbs_EDGE){
194 SetGeneratingParameter(myShapes(iGenS,iDirS),
195 newShape,bGenS,subGenS,aDirS);
201 else if (myDirShapeTool.Type(aDirS)==TopAbs_EDGE){
202 //Ici on construit les murs du Shape.
203 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
204 TopoDS_Shape newWire,newShell;
205 TopTools_SequenceOfShape WireSeq;
206 Standard_Boolean sepwires = Standard_False;
209 myShapes(iGenS,iDirS)=MakeEmptyDirectingEdge(aGenS,aDirS);
212 //On cree un wire intermediaire qui contient tous les edges
213 //du montant (face) du Shape pour le cas standard, et une
214 //sequence de wires pour les cas merdiques necessitant des
215 //wires independants.
216 myBuilder.MakeWire(newWire);
217 myShapes(iGenS,iDirS)=MakeEmptyFace(aGenS,aDirS);
220 myBuilder.MakeShell(myShapes(iGenS,iDirS));
223 //On cree un shell intermediaire dans lequel on jette toutes
224 //les faces en direct, pour eviter les empilages compliques
225 //de shells et sous shells dans la structure du solide.
226 myBuilder.MakeShell(newShell);
227 myBuilder.MakeSolid(myShapes(iGenS,iDirS));
230 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
233 throw Standard_NoSuchObject("Solids are not Processed");
235 case TopAbs_COMPSOLID :
236 throw Standard_NoSuchObject("Solids are not Processed");
238 case TopAbs_COMPOUND :
239 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
242 throw Standard_NoSuchObject("Unknown Shape");
246 myGenShapeTool.SetOrientation(bGenS,TopAbs_FORWARD);
247 for (It.Init(bGenS);It.More();It.Next()){
248 subGenS = It.Value();
249 if(HasShape(subGenS,aDirS)){
250 newShape = Shape(subGenS,aDirS);
251 if (GGDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
252 aGenS,subGenS,aDirS)){
253 TopAbs_ShapeEnum subGenSType = myGenShapeTool.Type(subGenS);
254 if (aGenSType==TopAbs_EDGE){
255 Or = It.Orientation();
256 if (SeparatedWires(myShapes(iGenS,iDirS),newShape,
257 aGenS,subGenS,aDirS)){
258 sepwires = Standard_True;
260 myBuilder.MakeWire(wi);
261 myBuilder.Add(wi,newShape,Or);
262 wi.Closed(BRep_Tool::IsClosed(wi));
266 myBuilder.Add(newWire,newShape,Or);
268 SetDirectingPCurve (myShapes(iGenS,iDirS),
269 newShape,bGenS,subGenS,aDirS,Or);
271 else if (aGenSType==TopAbs_WIRE){
272 Or = It.Orientation();
273 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
275 else if (aGenSType==TopAbs_FACE){
276 Or = It.Orientation();
277 if(subGenSType == TopAbs_WIRE) {
278 for (Lt.Init(newShape);Lt.More();Lt.Next()){
279 myBuilder.Add(newShell,Lt.Value(),
280 TopAbs::Compose(Lt.Orientation(),Or));
283 else if(subGenSType == TopAbs_EDGE) {
284 myBuilder.Add(newShell,newShape,Or);
287 else if(aGenSType == TopAbs_SHELL){
289 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
291 else if(aGenSType == TopAbs_COMPOUND){
293 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
296 Or = It.Orientation();
297 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
303 for (Kt.Init(bDirS);Kt.More();Kt.Next()){
304 subDirS = Kt.Value();
305 if(HasShape(aGenS,subDirS)){
306 newShape = Shape(aGenS,subDirS);
307 if (GDDShapeIsToAdd(myShapes(iGenS,iDirS),newShape,
308 aGenS,aDirS,subDirS)){
309 if (aGenSType==TopAbs_EDGE){
310 Or = TopAbs::Reverse(Kt.Orientation());
311 myBuilder.Add(newWire,newShape,Or);
313 (myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS,Or);
315 else if(aGenSType==TopAbs_VERTEX){
316 Or = Kt.Orientation();
317 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
318 SetDirectingParameter
319 (myShapes(iGenS,iDirS),newShape,aGenS,aDirS,subDirS);
321 else if(aGenSType==TopAbs_FACE){
322 Or = Kt.Orientation();
323 myBuilder.Add(newShell,newShape,Or);
328 if (aGenSType==TopAbs_EDGE){
330 for(Standard_Integer ij = 1;ij <= WireSeq.Length();ij++){
331 myBuilder.Add(myShapes(iGenS,iDirS),WireSeq.Value(ij));
335 newWire.Closed(BRep_Tool::IsClosed(newWire));
336 myBuilder.Add(myShapes(iGenS,iDirS),newWire);
338 myBuiltShapes(iGenS,iDirS) = Standard_True;
339 SetContinuity(aGenS,aDirS);
341 if (aGenSType==TopAbs_WIRE){
342 SetContinuity(aGenS,aDirS);
344 if (aGenSType==TopAbs_FACE){
345 newShell.Closed (BRep_Tool::IsClosed (newShell));
346 TopoDS_Shape temp = SplitShell(newShell);
347 TopAbs_Orientation ShellOri = DirectSolid(aGenS,aDirS);
349 if(Lt.More()) Lt.Next();
351 for (Lt.Init(temp);Lt.More();Lt.Next()){
352 myBuilder.Add(myShapes(iGenS,iDirS),Lt.Value(), ShellOri);
355 else myBuilder.Add(myShapes(iGenS,iDirS),newShell, ShellOri);
358 else if (myDirShapeTool.Type(aDirS)==TopAbs_WIRE){
359 TopAbs_ShapeEnum aGenSType = myGenShapeTool.Type(aGenS);
362 myBuilder.MakeWire(myShapes(iGenS,iDirS));
365 myBuilder.MakeShell(myShapes(iGenS,iDirS));
368 myBuilder.MakeShell(myShapes(iGenS,iDirS));
371 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
374 myBuilder.MakeCompSolid(myShapes(iGenS,iDirS));
377 throw Standard_NoSuchObject("Solids are not Processed");
379 case TopAbs_COMPSOLID :
380 throw Standard_NoSuchObject("Solids are not Processed");
382 case TopAbs_COMPOUND :
383 myBuilder.MakeCompound(myShapes(iGenS,iDirS));
386 throw Standard_NoSuchObject("Unknown Shape");
390 for (Kt.Init(aDirS);Kt.More();Kt.Next()){
391 subDirS = Kt.Value();
392 if(HasShape(aGenS,subDirS)){
393 Or = Kt.Orientation();
394 newShape = Shape(aGenS,subDirS);
395 myBuilder.Add(myShapes(iGenS,iDirS),newShape,Or);
399 myBuiltShapes(iGenS,iDirS) = Standard_True;
401 // Change the "Closed" flag only for Wires and Shells
402 if (myShapes(iGenS, iDirS).ShapeType() == TopAbs_WIRE ||
403 myShapes(iGenS, iDirS).ShapeType() == TopAbs_SHELL)
404 myShapes(iGenS,iDirS).Closed (BRep_Tool::IsClosed (myShapes(iGenS,iDirS)));
405 return myShapes(iGenS,iDirS);
409 //=======================================================================
410 //function : FirstShape
411 //purpose : Returns the Shape indexed by the arguments.
412 //=======================================================================
414 TopoDS_Shape BRepSweep_NumLinearRegularSweep::FirstShape ()
417 if (myDirShapeTool.HasFirstVertex()){
418 if(HasShape(myGenShape,myDirShapeTool.FirstVertex()))
419 result = Shape(myGenShape,myDirShapeTool.FirstVertex());
425 //=======================================================================
426 //function : LastShape
427 //purpose : Returns the Shape indexed by the arguments.
428 //=======================================================================
430 TopoDS_Shape BRepSweep_NumLinearRegularSweep::LastShape ()
433 if (myDirShapeTool.HasLastVertex()){
434 if(HasShape(myGenShape,myDirShapeTool.LastVertex()))
435 result = Shape(myGenShape,myDirShapeTool.LastVertex());
441 //=======================================================================
442 //function : FirstShape
443 //purpose : Returns the Shape indexed by the arguments.
444 //=======================================================================
446 TopoDS_Shape BRepSweep_NumLinearRegularSweep::FirstShape (const TopoDS_Shape& aGenS)
449 if (myDirShapeTool.HasFirstVertex()){
450 if(HasShape(aGenS,myDirShapeTool.FirstVertex()))
451 result = Shape(aGenS,myDirShapeTool.FirstVertex());
457 //=======================================================================
458 //function : LastShape
459 //purpose : Returns the Shape indexed by the arguments.
460 //=======================================================================
462 TopoDS_Shape BRepSweep_NumLinearRegularSweep::LastShape (const TopoDS_Shape& aGenS)
465 if (myDirShapeTool.HasLastVertex()){
466 if(HasShape(aGenS,myDirShapeTool.LastVertex()))
467 result = Shape(aGenS,myDirShapeTool.LastVertex());
472 //=======================================================================
475 //=======================================================================
477 Standard_Boolean BRepSweep_NumLinearRegularSweep::Closed()const
479 return myDirWire.Closed();
482 //=======================================================================
483 //function : SplitShell
485 //=======================================================================
487 TopoDS_Shape BRepSweep_NumLinearRegularSweep::SplitShell(const TopoDS_Shape& aNewShape)const
490 myBuilder.MakeCompound(comp);
491 myBuilder.Add(comp,aNewShape);