mirror of
https://git.salome-platform.org/gitpub/modules/geom.git
synced 2025-04-24 01:22:05 +05:00
Improve arc creation by two points and center: respect points order.
This commit is contained in:
parent
56d59df6b5
commit
81200c50e6
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user