1 // Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
3 // Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
4 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 // This library is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU Lesser General Public
8 // License as published by the Free Software Foundation; either
9 // version 2.1 of the License.
11 // This library is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 // Lesser General Public License for more details.
16 // You should have received a copy of the GNU Lesser General Public
17 // License along with this library; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #include <Standard_Stream.hxx>
24 #include <GEOMImpl_DividedDiskDriver.hxx>
25 #include <GEOMImpl_IDividedDisk.hxx>
26 #include <GEOMImpl_Types.hxx>
27 #include <GEOM_Function.hxx>
33 #include <gp_Circ.hxx>
37 #include <BRep_Builder.hxx>
38 #include <BRepBuilderAPI_MakeFace.hxx>
39 #include <BRepBuilderAPI_MakeEdge.hxx>
40 #include <BRepBuilderAPI_MakeVertex.hxx>
41 #include <BRepBuilderAPI_MakeWire.hxx>
42 #include <BRepBuilderAPI_Transform.hxx>
44 #include <Geom_Plane.hxx>
47 #include <TopoDS_Shape.hxx>
48 #include <TopoDS_Edge.hxx>
50 #include <TFunction_Logbook.hxx>
51 #include <StdFail_NotDone.hxx>
53 #include <utilities.h>
55 //@@ include required header files here @@//
57 //=======================================================================
60 //=======================================================================
61 const Standard_GUID& GEOMImpl_DividedDiskDriver::GetID()
63 static Standard_GUID aGUID("0b01da9a-c5da-11e1-8d80-78e7d1879630");
67 //=======================================================================
68 //function : GEOMImpl_DividedDiskDriver
70 //=======================================================================
71 GEOMImpl_DividedDiskDriver::GEOMImpl_DividedDiskDriver()
75 //=======================================================================
78 //=======================================================================
79 Standard_Integer GEOMImpl_DividedDiskDriver::Execute(TFunction_Logbook& log) const
81 if (Label().IsNull()) return 0;
82 Handle(GEOM_Function) aFunction = GEOM_Function::GetFunction(Label());
84 GEOMImpl_IDividedDisk aData (aFunction);
85 Standard_Integer aType = aFunction->GetType();
90 double R = aData.GetR();
91 double Ratio = aData.GetRatio();
93 // Build reference disk (in the global coordinate system)
94 TopoDS_Shell S = MakeDisk( R, Ratio );
96 if (aType == DIVIDEDDISK_R_RATIO) {
97 int theOrientation = aData.GetOrientation();
98 aShape = TransformShape(S, theOrientation);
100 else if (aType == DIVIDEDDISK_R_VECTOR_PNT){
101 // other construction modes here
102 gp_Pnt P = gp::Origin();
104 aShape = TransformShape(S, P, V);
107 if (aShape.IsNull()) return 0;
109 aFunction->SetValue(aShape);
111 log.SetTouched(Label());
117 //=======================================================================
118 //function : MakeDisk
120 //=======================================================================
121 TopoDS_Shell GEOMImpl_DividedDiskDriver::MakeDisk(double R, double Ratio) const
129 gp_Ax1 Ax1(Orig,ZDir);
130 gp_Ax2 Ax(Orig,ZDir,XDir);
131 gp_Circ aCircle(Ax, R);
134 gp_Pnt P1(0.01*Ratio*R,0,0);
136 gp_Pnt P3 = P2.Rotated(Ax1,M_PI/6.0);
141 gp_Ax2 anAx (gp::XOY());
142 Handle(Geom_Plane) aPlane = new Geom_Plane (anAx);
147 TopoDS_Vertex O = BRepBuilderAPI_MakeVertex(Orig);
148 TopoDS_Vertex V1_init = BRepBuilderAPI_MakeVertex(P1);
149 TopoDS_Vertex V2_init = BRepBuilderAPI_MakeVertex(P2);
150 TopoDS_Vertex V3 = BRepBuilderAPI_MakeVertex(P3);
151 TopoDS_Vertex V4 = BRepBuilderAPI_MakeVertex(P4);
153 TopoDS_Vertex V1 = V1_init;
154 TopoDS_Vertex V2 = V2_init;
158 myTrsf.SetRotation(Ax1, M_PI/3.0);
160 BRepBuilderAPI_Transform xform(myTrsf);
161 xform.Perform(V1,Standard_True);
162 TopoDS_Vertex V1_60 = TopoDS::Vertex(xform.Shape());
163 xform.Perform(V2,Standard_True);
164 TopoDS_Vertex V2_60 = TopoDS::Vertex(xform.Shape());
166 // Declaration of shapes (used in the loop)
167 TopoDS_Edge E1, E2, E3, E4, E5, E6, E7, E8, E9;
168 TopoDS_Wire W1, W2, W3;
169 TopoDS_Face F1, F2, F3;
172 BRep_Builder aBuilder;
173 aBuilder.MakeShell(S);
175 // Initialisation of edges
176 TopoDS_Edge E1_init = BRepBuilderAPI_MakeEdge(V1,TopoDS::Vertex(V2.Reversed()));
178 TopoDS_Edge E8_init = BRepBuilderAPI_MakeEdge(O,TopoDS::Vertex(V1.Reversed()));
181 for (int i=1;i<=6;i++)
185 E2 = BRepBuilderAPI_MakeEdge(aCircle, V2, TopoDS::Vertex(V3.Reversed()));
186 E3 = BRepBuilderAPI_MakeEdge(V3,TopoDS::Vertex(V4.Reversed()));
187 E4 = BRepBuilderAPI_MakeEdge(V4,TopoDS::Vertex(V1.Reversed()));
192 E5 = BRepBuilderAPI_MakeEdge(aCircle, V3, TopoDS::Vertex(V2_init.Reversed()));
193 E7 = BRepBuilderAPI_MakeEdge(V1_init,TopoDS::Vertex(V4.Reversed()));
197 E5 = BRepBuilderAPI_MakeEdge(aCircle, V3, TopoDS::Vertex(V2_60.Reversed()));
198 E7 = BRepBuilderAPI_MakeEdge(V1_60,TopoDS::Vertex(V4.Reversed()));
200 E6 = BRepBuilderAPI_MakeEdge(V2_60,TopoDS::Vertex(V1_60.Reversed()));
203 E9 = BRepBuilderAPI_MakeEdge(V1_60,TopoDS::Vertex(O.Reversed()));
208 aBuilder.MakeWire(W1);
212 aBuilder.Add(W1,TopoDS::Edge(E1.Reversed()));
218 aBuilder.MakeWire(W2);
219 aBuilder.Add(W2,TopoDS::Edge(E3.Reversed()));
222 aBuilder.Add(W2,TopoDS::Edge(E1_init.Reversed()));
228 aBuilder.MakeWire(W3);
232 aBuilder.Add(W3,TopoDS::Edge(E8.Reversed()));
233 aBuilder.Add(W3,TopoDS::Edge(E4.Reversed()));
234 aBuilder.Add(W3,TopoDS::Edge(E7.Reversed()));
236 aBuilder.Add(W3,TopoDS::Edge(E8_init.Reversed()));
241 F1 = BRepBuilderAPI_MakeFace(aPlane,W1);
242 F2 = BRepBuilderAPI_MakeFace(aPlane,W2);
243 F3 = BRepBuilderAPI_MakeFace(aPlane,W3);
254 xform.Perform(V1_60,Standard_True);
255 V1_60 = TopoDS::Vertex(xform.Shape());
256 xform.Perform(V2_60,Standard_True);
257 V2_60 = TopoDS::Vertex(xform.Shape());
258 xform.Perform(V3,Standard_True);
259 V3 = TopoDS::Vertex(xform.Shape());
260 xform.Perform(V4,Standard_True);
261 V4 = TopoDS::Vertex(xform.Shape());
263 // "Increment" of edges
271 //=======================================================================
272 //function : TrasformShape(TopoDS_Shape aShape,int theOrientation)
273 //purpose : Perform shape transformation accordingly with specified
275 //=======================================================================
276 TopoDS_Shape GEOMImpl_DividedDiskDriver::TransformShape(TopoDS_Shape theShape, int theOrientation) const
279 gp_Pnt theOrigin = gp::Origin();
281 switch(theOrientation)
303 gp_Ax3 aWPlane = gp_Ax3(theOrigin, N, Vx);
305 return WPlaneTransform(theShape, aWPlane);
308 //=======================================================================
309 //function : TrasformShape(TopoDS_Shape aShape, gp_Dir V, gp_Pnt P)
310 //purpose : Perform shape transformation accordingly with specified
312 //=======================================================================
313 TopoDS_Shape GEOMImpl_DividedDiskDriver::TransformShape(TopoDS_Shape theShape, gp_Pnt P, gp_Dir V) const
315 gp_Ax3 aWPlane( P, V );
316 return WPlaneTransform(theShape, aWPlane);
319 //=======================================================================
320 //function : WPlaneTransform
321 //purpose : Perform shape transformation accordingly with the given
323 //=======================================================================
324 TopoDS_Shape GEOMImpl_DividedDiskDriver::WPlaneTransform(TopoDS_Shape theShape, gp_Ax3 theWPlane) const
327 aTrans.SetTransformation(theWPlane);
329 BRepBuilderAPI_Transform aTransformation (theShape, aTrans, Standard_False);
330 return aTransformation.Shape();
333 //=======================================================================
334 //function : GEOMImpl_DividedDiskDriver_Type_
336 //=======================================================================
337 Standard_EXPORT Handle_Standard_Type& GEOMImpl_DividedDiskDriver_Type_()
339 static Handle_Standard_Type aType1 = STANDARD_TYPE(TFunction_Driver);
340 if ( aType1.IsNull()) aType1 = STANDARD_TYPE(TFunction_Driver);
341 static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
342 if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
343 static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
344 if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
346 static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
347 static Handle_Standard_Type _aType = new Standard_Type("GEOMImpl_DividedDiskDriver",
348 sizeof(GEOMImpl_DividedDiskDriver),
350 (Standard_Address)_Ancestors,
351 (Standard_Address)NULL);
355 //=======================================================================
356 //function : DownCast
358 //=======================================================================
359 const Handle(GEOMImpl_DividedDiskDriver) Handle(GEOMImpl_DividedDiskDriver)::DownCast(const Handle(Standard_Transient)& AnObject)
361 Handle(GEOMImpl_DividedDiskDriver) _anOtherObject;
363 if (!AnObject.IsNull()) {
364 if (AnObject->IsKind(STANDARD_TYPE(GEOMImpl_DividedDiskDriver))) {
365 _anOtherObject = Handle(GEOMImpl_DividedDiskDriver)((Handle(GEOMImpl_DividedDiskDriver)&)AnObject);
369 return _anOtherObject;