0029559: Samples - wrong copyright statement in FuncDemo
[occt.git] / samples / qt / FuncDemo / src / CircleDriver.cpp
1 // CircleDriver.cpp: implementation of the CircleDriver class.
2 //
3 //////////////////////////////////////////////////////////////////////
4
5 #include "CircleDriver.h"
6
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>
12
13 #include <TopoDS.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>
23
24 IMPLEMENT_STANDARD_HANDLE(CircleDriver,BaseDriver)
25 IMPLEMENT_STANDARD_RTTIEXT(CircleDriver,BaseDriver)
26
27 // ID of the function driver
28 const Standard_GUID& CircleDriver::GetID()
29 {
30     static const Standard_GUID id("D10515D5-7C4E-4fe3-A7E2-DE2E01859B4D");
31     return id;
32 }
33
34 // Constructor
35 CircleDriver::CircleDriver()
36 {
37
38 }
39
40 // Execution.
41 Standard_Integer CircleDriver::Execute(Handle(TFunction_Logbook)& log) const
42 {
43     // Usual check...
44     if (Label().IsNull())
45         return 1;
46
47     // Take the arguments (radius)
48     Handle(TDataStd_Real) r;
49     if (!Label().FindAttribute(TDataStd_Real::GetID(), r))
50         return 2;
51     double radius = r->Get();
52     if (radius < Precision::Confusion())
53         return 3;
54
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))
59         return 4;
60     Handle(TNaming_NamedShape) n;
61     if (!ref->Get().FindAttribute(TNaming_NamedShape::GetID(), n) || n->IsEmpty())
62         return 5;
63     TopoDS_Vertex V = TopoDS::Vertex(n->Get());
64
65     // Make the result
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);
70
71     // Set the result
72     TNaming_Builder B(Label());
73     B.Generated(F);
74
75     return BaseDriver::Execute(log);
76 }