Improve arc creation by two points and center: respect points order.

This commit is contained in:
jfa 2007-06-07 08:08:00 +00:00
parent 56d59df6b5
commit 81200c50e6

View File

@ -35,18 +35,16 @@
#include <TopExp.hxx> #include <TopExp.hxx>
#include <GC_MakeArcOfCircle.hxx> #include <GC_MakeArcOfCircle.hxx>
#include <GC_MakeCircle.hxx>
#include <Standard_ConstructionError.hxx> #include <Standard_ConstructionError.hxx>
#include <Precision.hxx> #include <Precision.hxx>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <gp_Vec.hxx> #include <gp_Vec.hxx>
#include <gce_MakeCirc.hxx> #include <gp_Circ.hxx>
#include <gce_MakePln.hxx>
#include <ElCLib.hxx>
#include <Geom_Circle.hxx> #include <Geom_Circle.hxx>
#include <Geom_TrimmedCurve.hxx>
#include "utilities.h" #include "utilities.h"
//======================================================================= //=======================================================================
//function : GetID //function : GetID
//purpose : //purpose :
@ -79,46 +77,54 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const
Standard_Integer aType = aFunction->GetType(); Standard_Integer aType = aFunction->GetType();
TopoDS_Shape aShape; 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) aRefPoint1 = aCI.GetPoint1();
Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2(); Handle(GEOM_Function) aRefPoint2 = aCI.GetPoint2();
Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3(); Handle(GEOM_Function) aRefPoint3 = aCI.GetPoint3();
TopoDS_Shape aShapePnt1 = aRefPoint1->GetValue(); TopoDS_Shape aShapePnt1 = aRefPoint1->GetValue();
TopoDS_Shape aShapePnt2 = aRefPoint2->GetValue(); TopoDS_Shape aShapePnt2 = aRefPoint2->GetValue();
TopoDS_Shape aShapePnt3 = aRefPoint3->GetValue(); TopoDS_Shape aShapePnt3 = aRefPoint3->GetValue();
if (aShapePnt1.ShapeType() == TopAbs_VERTEX && if (aShapePnt1.ShapeType() == TopAbs_VERTEX &&
aShapePnt2.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 aP1 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt1));
gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt2)); gp_Pnt aP2 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt2));
gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt3)); gp_Pnt aP3 = BRep_Tool::Pnt(TopoDS::Vertex(aShapePnt3));
if (aP1.Distance(aP2) < gp::Resolution() || if (aP1.Distance(aP2) < gp::Resolution() ||
aP1.Distance(aP3) < gp::Resolution() || aP1.Distance(aP3) < gp::Resolution() ||
aP2.Distance(aP3) < gp::Resolution()) aP2.Distance(aP3) < gp::Resolution())
Standard_ConstructionError::Raise("Arc creation aborted: coincident points given"); Standard_ConstructionError::Raise("Arc creation aborted: coincident points given");
if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular())) if (gp_Vec(aP1, aP2).IsParallel(gp_Vec(aP1, aP3), Precision::Angular()))
Standard_ConstructionError::Raise("Arc creation aborted: points lay on one line"); 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){ else // CIRC_ARC_CENTER
Standard_Real Rad = aP1.Distance(aP2); {
gce_MakeCirc MC(aP1,gce_MakePln(aP1, aP2, aP3).Value(),Rad);
Standard_Boolean sense = aCI.GetSense(); Standard_Boolean sense = aCI.GetSense();
if (MC.IsDone()) {
const gp_Circ& Circ = MC.Value(); Standard_Real aRad = aP1.Distance(aP2);
Standard_Real Alpha1 = ElCLib::Parameter(Circ,aP2); gp_Vec aV1 (aP1, aP2);
Standard_Real Alpha2 = ElCLib::Parameter(Circ,aP3); gp_Vec aV2 (aP1, aP3);
Handle(Geom_Circle) C = new Geom_Circle(Circ); gp_Vec aN = aV1 ^ aV2;
Handle(Geom_TrimmedCurve) TheArc;
if (!sense) if (sense)
TheArc= new Geom_TrimmedCurve(C,Alpha1,Alpha2,false); aN = -aN;
if (sense)
TheArc= new Geom_TrimmedCurve(C,Alpha2,Alpha1,false); GC_MakeCircle circ (aP1, aN, aRad);
aShape = BRepBuilderAPI_MakeEdge(TheArc).Edge(); Handle(Geom_Circle) aGeomCirc = circ.Value();
}
GC_MakeArcOfCircle arc (aGeomCirc->Circ(), aP2, aP3, Standard_True);
aShape = BRepBuilderAPI_MakeEdge(arc).Edge();
} }
} }
} else { } else {
@ -129,8 +135,7 @@ Standard_Integer GEOMImpl_ArcDriver::Execute(TFunction_Logbook& log) const
aFunction->SetValue(aShape); aFunction->SetValue(aShape);
log.SetTouched(Label()); log.SetTouched(Label());
MESSAGE("Out of building step ..."); return 1;
return 1;
} }