1 // CircleDriver.cpp: implementation of the CircleDriver class.
3 //////////////////////////////////////////////////////////////////////
5 #include "CircleDriver.h"
7 #include <Standard_GUID.hxx>
8 #include <TDF_Reference.hxx>
9 #include <TNaming_Builder.hxx>
10 #include <TNaming_NamedShape.hxx>
11 #include <TDataStd_Real.hxx>
14 #include <gp_Circ.hxx>
15 #include <BRep_Tool.hxx>
16 #include <Precision.hxx>
17 #include <TopoDS_Edge.hxx>
18 #include <TopoDS_Wire.hxx>
19 #include <TopoDS_Face.hxx>
20 #include <BRepBuilderAPI_MakeEdge.hxx>
21 #include <BRepBuilderAPI_MakeWire.hxx>
22 #include <BRepBuilderAPI_MakeFace.hxx>
24 IMPLEMENT_STANDARD_HANDLE(CircleDriver,BaseDriver)
25 IMPLEMENT_STANDARD_RTTIEXT(CircleDriver,BaseDriver)
27 // ID of the function driver
28 const Standard_GUID& CircleDriver::GetID()
30 static const Standard_GUID id("D10515D5-7C4E-4fe3-A7E2-DE2E01859B4D");
35 CircleDriver::CircleDriver()
41 Standard_Integer CircleDriver::Execute(Handle(TFunction_Logbook)& log) const
47 // Take the arguments (radius)
48 Handle(TDataStd_Real) r;
49 if (!Label().FindAttribute(TDataStd_Real::GetID(), r))
51 double radius = r->Get();
52 if (radius < Precision::Confusion())
55 // Take the arguments (center point)
56 Handle(TDF_Reference) ref;
57 TDF_Label Lpoint = Label().FindChild(1).FindChild(1);
58 if (!Lpoint.FindAttribute(TDF_Reference::GetID(), ref))
60 Handle(TNaming_NamedShape) n;
61 if (!ref->Get().FindAttribute(TNaming_NamedShape::GetID(), n) || n->IsEmpty())
63 TopoDS_Vertex V = TopoDS::Vertex(n->Get());
66 gp_Circ C(gp_Ax2(BRep_Tool::Pnt(V), gp::DZ()), radius);
67 TopoDS_Edge E = BRepBuilderAPI_MakeEdge(C);
68 TopoDS_Wire W = BRepBuilderAPI_MakeWire(E);
69 TopoDS_Face F = BRepBuilderAPI_MakeFace(W);
72 TNaming_Builder B(Label());
75 return BaseDriver::Execute(log);