From 81200c50e6e2f9581c1570a8ef325613a62c67c1 Mon Sep 17 00:00:00 2001 From: jfa Date: Thu, 7 Jun 2007 08:08:00 +0000 Subject: [PATCH] Improve arc creation by two points and center: respect points order. --- src/GEOMImpl/GEOMImpl_ArcDriver.cxx | 59 ++++++++++++++++------------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/src/GEOMImpl/GEOMImpl_ArcDriver.cxx b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx index d25eb2199..d08ae24cc 100644 --- a/src/GEOMImpl/GEOMImpl_ArcDriver.cxx +++ b/src/GEOMImpl/GEOMImpl_ArcDriver.cxx @@ -35,18 +35,16 @@ #include #include +#include #include #include #include #include -#include -#include -#include +#include #include -#include - #include "utilities.h" + //======================================================================= //function : GetID //purpose : @@ -79,46 +77,54 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const Standard_Integer aType = aFunction->GetType(); TopoDS_Shape aShape; - if ((aType == CIRC_ARC_THREE_PNT)||(aType == CIRC_ARC_CENTER)) { + if ((aType == CIRC_ARC_THREE_PNT) || (aType == CIRC_ARC_CENTER)) + { Handle(GEOM_Function) aRefPoint1 = aCI.GetPoint1(); Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2(); Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3(); + TopoDS_Shape aShapePnt1 = aRefPoint1->GetValue(); TopoDS_Shape aShapePnt2 = aRefPoint2->GetValue(); TopoDS_Shape aShapePnt3 = aRefPoint3->GetValue(); + if (aShapePnt1.ShapeType() == TopAbs_VERTEX && aShapePnt2.ShapeType() == TopAbs_VERTEX && - aShapePnt3.ShapeType() == TopAbs_VERTEX) { + aShapePnt3.ShapeType() == TopAbs_VERTEX) + { gp_Pnt aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt1)); gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt2)); gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt3)); + if (aP1.Distance(aP2) < gp::Resolution() || aP1.Distance(aP3) < gp::Resolution() || aP2.Distance(aP3) < gp::Resolution()) Standard_ConstructionError::Raise("Arc creation aborted: coincident points given"); + if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular())) Standard_ConstructionError::Raise("Arc creation aborted: points lay on one line"); - if (aType == CIRC_ARC_THREE_PNT){ - GC_MakeArcOfCircle arc(aP1, aP2, aP3); - aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); + if (aType == CIRC_ARC_THREE_PNT) + { + GC_MakeArcOfCircle arc (aP1, aP2, aP3); + aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); } - if (aType == CIRC_ARC_CENTER){ - Standard_Real Rad = aP1.Distance(aP2); - gce_MakeCirc MC(aP1,gce_MakePln(aP1, aP2, aP3).Value(),Rad); + else // CIRC_ARC_CENTER + { Standard_Boolean sense = aCI.GetSense(); - if (MC.IsDone()) { - const gp_Circ& Circ = MC.Value(); - Standard_Real Alpha1 = ElCLib::Parameter(Circ,aP2); - Standard_Real Alpha2 = ElCLib::Parameter(Circ,aP3); - Handle(Geom_Circle) C = new Geom_Circle(Circ); - Handle(Geom_TrimmedCurve) TheArc; - if (!sense) - TheArc= new Geom_TrimmedCurve(C,Alpha1,Alpha2,false); - if (sense) - TheArc= new Geom_TrimmedCurve(C,Alpha2,Alpha1,false); - aShape = BRepBuilderAPI_MakeEdge(TheArc).Edge(); - } + + Standard_Real aRad = aP1.Distance(aP2); + gp_Vec aV1 (aP1, aP2); + gp_Vec aV2 (aP1, aP3); + gp_Vec aN = aV1 ^ aV2; + + if (sense) + aN = -aN; + + GC_MakeCircle circ (aP1, aN, aRad); + Handle(Geom_Circle) aGeomCirc = circ.Value(); + + GC_MakeArcOfCircle arc (aGeomCirc->Circ(), aP2, aP3, Standard_True); + aShape = BRepBuilderAPI_MakeEdge(arc).Edge(); } } } else { @@ -129,8 +135,7 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const aFunction->SetValue(aShape); log.SetTouched(Label()); - MESSAGE("Out of building step ..."); - return 1; + return 1; } -- 2.39.2