Loading files
// Copyright (c) 1999-2014 OPEN CASCADE SAS
//
// This file is part of Open CASCADE Technology software library.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License version 2.1 as published
// by the Free Software Foundation, with special exception defined in the file
// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
// distribution for complete text of the license and disclaimer of any warranty.
//
// Alternatively, this file may be used under the terms of Open CASCADE
// commercial license or contractual agreement.
#include <ChFi2d_ChamferAPI.hxx>
#include <gp_Pnt.hxx>
#include <GC_MakeLine.hxx>
#include <BRep_Tool.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopoDS.hxx>
// An empty constructor.
ChFi2d_ChamferAPI::ChFi2d_ChamferAPI()
: myStart1(0.0),
myEnd1(0.0),
myStart2(0.0),
myEnd2(0.0),
myCommonStart1(false),
myCommonStart2(false)
{
}
// A constructor accepting a wire consisting of two linear edges.
ChFi2d_ChamferAPI::ChFi2d_ChamferAPI(const TopoDS_Wire& theWire)
: myStart1(0.0),
myEnd1(0.0),
myStart2(0.0),
myEnd2(0.0),
myCommonStart1(false),
myCommonStart2(false)
{
Init(theWire);
}
// A constructor accepting two linear edges.
ChFi2d_ChamferAPI::ChFi2d_ChamferAPI(const TopoDS_Edge& theEdge1, const TopoDS_Edge& theEdge2)
: myEdge1(theEdge1),
myEdge2(theEdge2),
myStart1(0.0),
myEnd1(0.0),
myStart2(0.0),
myEnd2(0.0),
myCommonStart1(false),
myCommonStart2(false)
{
}
// Initializes the class by a wire consisting of two libear edges.
void ChFi2d_ChamferAPI::Init(const TopoDS_Wire& theWire)
{
TopoDS_Edge E1, E2;
TopoDS_Iterator itr(theWire);
for (; itr.More(); itr.Next())
{
if (E1.IsNull())
{
E1 = TopoDS::Edge(itr.Value());
}
else if (E2.IsNull())
{
E2 = TopoDS::Edge(itr.Value());
}
else
{
break;
}
}
Init(E1, E2);
}
// Initializes the class by two linear edges.
void ChFi2d_ChamferAPI::Init(const TopoDS_Edge& theEdge1, const TopoDS_Edge& theEdge2)
{
myEdge1 = theEdge1;
myEdge2 = theEdge2;
}
// Constructs a chamfer edge.
// Returns true if the edge is constructed.
bool ChFi2d_ChamferAPI::Perform()
{
myCurve1 = BRep_Tool::Curve(myEdge1, myStart1, myEnd1);
myCurve2 = BRep_Tool::Curve(myEdge2, myStart2, myEnd2);
// searching for common points
if (myCurve1->Value(myStart1).IsEqual(myCurve2->Value(myEnd2), Precision::Confusion()))
{
myCommonStart1 = true;
myCommonStart2 = false;
}
else
{
if (myCurve1->Value(myEnd1).IsEqual(myCurve2->Value(myStart2), Precision::Confusion()))
{
myCommonStart1 = false;
myCommonStart2 = true;
}
else
{
if (myCurve1->Value(myEnd1).IsEqual(myCurve2->Value(myEnd2), Precision::Confusion()))
{
myCommonStart1 = false;
myCommonStart2 = false;
}
else
{
myCommonStart1 = true;
myCommonStart2 = true;
}
}
}
return true;
}
// Returns the result (chamfer edge, modified edge1, modified edge2).
TopoDS_Edge ChFi2d_ChamferAPI::Result(TopoDS_Edge& theEdge1,
TopoDS_Edge& theEdge2,
const double theLength1,
const double theLength2)
{
TopoDS_Edge aResult;
if (std::abs(myEnd1 - myStart1) < theLength1)
{
return aResult;
}
if (std::abs(myEnd2 - myStart2) < theLength2)
{
return aResult;
}
double aCommon1 = (myCommonStart1 ? myStart1 : myEnd1)
+ (((myStart1 > myEnd1) ^ myCommonStart1) ? theLength1 : -theLength1);
double aCommon2 = (myCommonStart2 ? myStart2 : myEnd2)
+ (((myStart2 > myEnd2) ^ myCommonStart2) ? theLength2 : -theLength2);
// make chamfer edge
GC_MakeLine aML(myCurve1->Value(aCommon1), myCurve2->Value(aCommon2));
BRepBuilderAPI_MakeEdge aBuilder(aML.Value(),
myCurve1->Value(aCommon1),
myCurve2->Value(aCommon2));
aResult = aBuilder.Edge();
// divide first edge
BRepBuilderAPI_MakeEdge aDivider1(myCurve1, aCommon1, (myCommonStart1 ? myEnd1 : myStart1));
theEdge1 = aDivider1.Edge();
// divide second edge
BRepBuilderAPI_MakeEdge aDivider2(myCurve2, aCommon2, (myCommonStart2 ? myEnd2 : myStart2));
theEdge2 = aDivider2.Edge();
return aResult;
}
c09a95501This file is pinned to the selected release. Download the original to open it in your design tool.