mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-06 18:26:22 +03:00
Removed #ifndef DEB ... #else ... #endif directives where the variables were being initialized only in release mode. Removed unused part of code.
2258 lines
69 KiB
C++
Executable File
2258 lines
69 KiB
C++
Executable File
// Created on: 1995-04-26
|
|
// Created by: Flore Lantheaume
|
|
// Copyright (c) 1995-1999 Matra Datavision
|
|
// Copyright (c) 1999-2012 OPEN CASCADE SAS
|
|
//
|
|
// The content of this file is subject to the Open CASCADE Technology Public
|
|
// License Version 6.5 (the "License"). You may not use the content of this file
|
|
// except in compliance with the License. Please obtain a copy of the License
|
|
// at http://www.opencascade.org and read it completely before using this file.
|
|
//
|
|
// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
|
|
// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
|
|
//
|
|
// The Original Code and all software distributed under the License is
|
|
// distributed on an "AS IS" basis, without warranty of any kind, and the
|
|
// Initial Developer hereby disclaims all such warranties, including without
|
|
// limitation, any warranties of merchantability, fitness for a particular
|
|
// purpose or non-infringement. Please see the License for the specific terms
|
|
// and conditions governing the rights and limitations under the License.
|
|
|
|
|
|
#include <ChFi3d_ChBuilder.ixx>
|
|
#include <ChFi3d.hxx>
|
|
#include <ChFi3d_Builder_0.hxx>
|
|
|
|
#include <TopOpeBRepDS_HDataStructure.hxx>
|
|
#include <TopOpeBRepBuild_HBuilder.hxx>
|
|
#include <ChFiDS_Spine.hxx>
|
|
#include <ChFiDS_ChamfSpine.hxx>
|
|
#include <ChFiDS_Stripe.hxx>
|
|
#include <ChFiDS_ListOfStripe.hxx>
|
|
#include <ChFiDS_ListIteratorOfListOfStripe.hxx>
|
|
#include <ChFiDS_Regul.hxx>
|
|
#include <ChFiDS_ListIteratorOfRegularities.hxx>
|
|
#include <ChFiDS_SecHArray1.hxx>
|
|
#include <ChFiDS_HData.hxx>
|
|
#include <ChFiDS_CircSection.hxx>
|
|
|
|
#include <Blend_Point.hxx>
|
|
#include <BRepBlend_Line.hxx>
|
|
#include <BRepBlend_Chamfer.hxx>
|
|
#include <BRepBlend_ChamfInv.hxx>
|
|
#include <BRepBlend_ChAsym.hxx>
|
|
#include <BRepBlend_ChAsymInv.hxx>
|
|
#include <BlendFunc_SectionShape.hxx>
|
|
#include <BRepBlend_Walking.hxx>
|
|
#include <BRepAdaptor_HSurface.hxx>
|
|
#include <BRepAdaptor_Curve2d.hxx>
|
|
#include <GeomAdaptor_HCurve.hxx>
|
|
|
|
|
|
#include <Extrema_GenLocateExtPS.hxx>
|
|
#include <BRepAdaptor_Surface.hxx>
|
|
#include <TopTools_ListIteratorOfListOfShape.hxx>
|
|
#include <TopAbs.hxx>
|
|
|
|
#include <ElSLib.hxx>
|
|
#include <BRepTools.hxx>
|
|
|
|
#include <Standard_NotImplemented.hxx>
|
|
#include <Standard_DomainError.hxx>
|
|
|
|
#ifdef DEB
|
|
extern Standard_Boolean ChFi3d_GettraceCHRON();
|
|
#endif
|
|
|
|
//=======================================================================
|
|
//function : SearchCommonFaces
|
|
//purpose : search the 2 common faces <F1> and <F2> of the edge <E>
|
|
// uses the EFMap and take the 2 first good faces
|
|
//=======================================================================
|
|
|
|
void SearchCommonFaces(const ChFiDS_Map& EFMap,
|
|
const TopoDS_Edge& E,
|
|
TopoDS_Face& F1,
|
|
TopoDS_Face& F2)
|
|
{
|
|
TopoDS_Face Fc;
|
|
TopTools_ListIteratorOfListOfShape It;
|
|
|
|
F1.Nullify();
|
|
F2.Nullify();
|
|
for ( It.Initialize(EFMap(E)); It.More(); It.Next() ) {
|
|
Fc = TopoDS::Face(It.Value());
|
|
if ( F1.IsNull() )
|
|
F1 = Fc;
|
|
else if ( !Fc.IsSame(F1) ) {
|
|
F2 = Fc;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!F1.IsNull() && F2.IsNull() && BRepTools::IsReallyClosed( E, F1 ))
|
|
F2 = F1;
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : ExtentSpinesOnCommonFace
|
|
//purpose : Extend spines of two chamfers by distance dis1,dis2
|
|
// on their common face
|
|
// Two guide lines Spine1 and Spine2 cross in V
|
|
// isfirst(i) = False if Spine(i) is oriented to V (i = 1,2)
|
|
//=======================================================================
|
|
|
|
void ExtentSpineOnCommonFace(Handle(ChFiDS_Spine)& Spine1,
|
|
Handle(ChFiDS_Spine)& Spine2,
|
|
const TopoDS_Vertex& V,
|
|
const Standard_Real dis1,
|
|
const Standard_Real dis2,
|
|
const Standard_Boolean isfirst1,
|
|
const Standard_Boolean isfirst2)
|
|
{
|
|
Standard_Real tolesp = 1.e-7;
|
|
|
|
// alpha, the opening angle between two
|
|
// tangents of two guidelines in V is found
|
|
Standard_Real tga1,tga2;
|
|
Standard_Real d1plus = 0., d2plus = 0.;
|
|
|
|
gp_Pnt tmp;
|
|
gp_Vec tg1, tg2;
|
|
Spine1->D1(Spine1->Absc(V),tmp,tg1);
|
|
Spine2->D1(Spine2->Absc(V),tmp,tg2);
|
|
tg1.Normalize();
|
|
tg2.Normalize();
|
|
if (isfirst1)
|
|
tg1.Reverse();
|
|
if (isfirst2)
|
|
tg2.Reverse();
|
|
|
|
Standard_Real cosalpha,sinalpha;
|
|
cosalpha = tg1.Dot(tg2);
|
|
sinalpha = sqrt(1-cosalpha*cosalpha);
|
|
|
|
//a1+a2 = alpha
|
|
Standard_Real temp;
|
|
temp = cosalpha+dis2/dis1;
|
|
if( Abs(temp) > tolesp ){
|
|
tga1 = sinalpha/temp;
|
|
d1plus = dis1/tga1;
|
|
}
|
|
temp = cosalpha+dis1/dis2;
|
|
if( Abs(temp) > tolesp ){
|
|
tga2 = sinalpha/temp;
|
|
d2plus = dis2/tga2;
|
|
}
|
|
|
|
//extension by the calculated distance
|
|
if (d1plus > 0.) {
|
|
d1plus *= 3.;
|
|
if (isfirst1){
|
|
Spine1->SetFirstParameter(-d1plus);
|
|
Spine1->SetFirstTgt(0.);
|
|
}
|
|
else{
|
|
Standard_Real param = Spine1->LastParameter(Spine1->NbEdges());
|
|
Spine1->SetLastParameter(d1plus+param);
|
|
Spine1->SetLastTgt(param);
|
|
}
|
|
}
|
|
if (d2plus > 0.) {
|
|
d2plus *= 1.5;
|
|
if (isfirst2){
|
|
Spine2->SetFirstParameter(-d2plus);
|
|
Spine2->SetFirstTgt(0.);
|
|
}
|
|
else{
|
|
Standard_Real param = Spine2->LastParameter(Spine2->NbEdges());
|
|
Spine2->SetLastParameter(d2plus+param);
|
|
Spine2->SetLastTgt(param);
|
|
}
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : ChFi3d_ChBuilder
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
ChFi3d_ChBuilder::ChFi3d_ChBuilder(const TopoDS_Shape& S,
|
|
const Standard_Real Ta) :
|
|
ChFi3d_Builder(S, Ta)
|
|
{
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : Add
|
|
//purpose : create a new stripe with a spine containing the edge <E>
|
|
// add on the spine the tangential edges to <E>
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::Add(const TopoDS_Edge& E)
|
|
{
|
|
|
|
if(!Contains(E) && myEFMap.Contains(E)){
|
|
Handle(ChFiDS_Stripe) Stripe = new ChFiDS_Stripe();
|
|
Handle(ChFiDS_Spine)& Sp = Stripe->ChangeSpine();
|
|
Sp = new ChFiDS_ChamfSpine(tolesp);
|
|
Handle(ChFiDS_ChamfSpine) Spine = Handle(ChFiDS_ChamfSpine)::DownCast(Sp);
|
|
|
|
TopoDS_Edge E_wnt = E;
|
|
E_wnt.Orientation(TopAbs_FORWARD);
|
|
Spine->SetEdges(E_wnt);
|
|
if(PerformElement(Spine)){
|
|
PerformExtremity(Spine);
|
|
Spine->Load();
|
|
myListStripe.Append(Stripe);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : Add
|
|
//purpose : create a new stripe with a ChamfSpine containing the edge <E>
|
|
// with the distance <Dis> on the face <F>
|
|
// . Add the tangential edges continuous to E in the spine
|
|
//
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::Add(const Standard_Real Dis,
|
|
const TopoDS_Edge& E,
|
|
const TopoDS_Face& F)
|
|
{
|
|
if (!Contains(E) && myEFMap.Contains(E)) {
|
|
|
|
// Take the 2 common faces of the egde <E>
|
|
TopoDS_Face F1,F2;
|
|
SearchCommonFaces(myEFMap,E,F1,F2);
|
|
|
|
if (! F1.IsSame(F) && F2.IsSame(F) ) {
|
|
F2 = F1;
|
|
F1 = F;
|
|
}
|
|
|
|
if ( F1.IsSame(F)) {
|
|
TopoDS_Edge E_wnt = E;
|
|
E_wnt.Orientation(TopAbs_FORWARD);
|
|
BRepAdaptor_Surface Sb1,Sb2;
|
|
Sb1.Initialize(F1);
|
|
Sb2.Initialize(F2);
|
|
TopAbs_Orientation Or1,Or2;
|
|
ChFi3d::ConcaveSide(Sb1,Sb2,E_wnt,Or1,Or2);
|
|
Handle(ChFiDS_Stripe) Stripe = new ChFiDS_Stripe();
|
|
Handle(ChFiDS_Spine)& Sp = Stripe->ChangeSpine();
|
|
Sp = new ChFiDS_ChamfSpine(tolesp);
|
|
Handle(ChFiDS_ChamfSpine)
|
|
Spine = Handle(ChFiDS_ChamfSpine)::DownCast(Sp);
|
|
|
|
Spine->SetEdges(E_wnt);
|
|
if(PerformElement(Spine)){
|
|
Spine->Load();
|
|
myListStripe.Append(Stripe);
|
|
|
|
Spine->SetDist(Dis);
|
|
|
|
PerformExtremity(Spine);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : SetDist
|
|
//purpose : set the distances <Dis>of the contour of
|
|
// index IC
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::SetDist(const Standard_Real Dis,
|
|
const Standard_Integer IC,
|
|
const TopoDS_Face& F)
|
|
{
|
|
|
|
if(IC <= NbElements()) {
|
|
Handle(ChFiDS_ChamfSpine) csp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
|
|
// Search the first edge which has a common face equal to F
|
|
TopoDS_Face F1,F2,FirstF1,FirstF2;
|
|
//TopAbs_Orientation Or1,Or2;
|
|
//Standard_Integer Choix, ChoixConge;
|
|
BRepAdaptor_Surface Sb1,Sb2;
|
|
Standard_Integer i = 1;
|
|
Standard_Boolean Found = Standard_False;
|
|
while ( (i <= csp->NbEdges()) && (!Found) ) {
|
|
SearchCommonFaces(myEFMap,csp->Edges(i),F1,F2);
|
|
if ( i == 1) {
|
|
FirstF1 = F1;
|
|
FirstF2 = F2;
|
|
}
|
|
Found = ( F1.IsSame(F) || F2.IsSame(F) );
|
|
i++;
|
|
}
|
|
|
|
if (Found) {
|
|
if ( F2.IsSame(F) ) {
|
|
F2 = F1;
|
|
F1 = F;
|
|
}
|
|
csp->SetDist(Dis);
|
|
|
|
}
|
|
else
|
|
Standard_DomainError::Raise("the face is not common to any of edges of the contour");
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : GetDist
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::GetDist(const Standard_Integer IC,
|
|
Standard_Real& Dis) const
|
|
{
|
|
Handle(ChFiDS_ChamfSpine) chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
chsp->GetDist(Dis);
|
|
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : Add
|
|
//purpose : create a new stripe with a ChAsymSpine containing the edge <E>
|
|
// with the distance <Dis> and the angle Angle on the face <F>
|
|
// . Add the tangential edges continuous to E in the spine
|
|
//
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::Add(const Standard_Real Dis1,
|
|
const Standard_Real Dis2,
|
|
const TopoDS_Edge& E,
|
|
const TopoDS_Face& F)
|
|
{
|
|
if (!Contains(E) && myEFMap.Contains(E)) {
|
|
|
|
// Take the 2 common faces of the egde <E>
|
|
TopoDS_Face F1,F2;
|
|
SearchCommonFaces(myEFMap,E,F1,F2);
|
|
|
|
if (! F1.IsSame(F) && F2.IsSame(F) ) {
|
|
F2 = F1;
|
|
F1 = F;
|
|
}
|
|
|
|
if ( F1.IsSame(F)) {
|
|
TopoDS_Edge E_wnt = E;
|
|
E_wnt.Orientation(TopAbs_FORWARD);
|
|
BRepAdaptor_Surface Sb1,Sb2;
|
|
Sb1.Initialize(F1);
|
|
Sb2.Initialize(F2);
|
|
TopAbs_Orientation Or1,Or2;
|
|
Standard_Integer Choix = ChFi3d::ConcaveSide(Sb1,Sb2,E_wnt,Or1,Or2);
|
|
|
|
Handle(ChFiDS_Stripe) Stripe = new ChFiDS_Stripe();
|
|
Handle(ChFiDS_Spine)& Sp = Stripe->ChangeSpine();
|
|
Sp = new ChFiDS_ChamfSpine(tolesp);
|
|
Handle(ChFiDS_ChamfSpine)
|
|
Spine = Handle(ChFiDS_ChamfSpine)::DownCast(Sp);
|
|
|
|
Spine->SetEdges(E_wnt);
|
|
if(PerformElement(Spine)){
|
|
Spine->Load();
|
|
myListStripe.Append(Stripe);
|
|
|
|
Standard_Integer ChoixConge;
|
|
SearchCommonFaces(myEFMap,Spine->Edges(1),F1,F2);
|
|
Sb1.Initialize(F1);
|
|
Sb2.Initialize(F2);
|
|
ChoixConge = ChFi3d::ConcaveSide(Sb1,Sb2,
|
|
Spine->Edges(1),
|
|
Or1,Or2);
|
|
|
|
|
|
// compare the 2 computed choices to know how to set the
|
|
// distances of the Spine according to the choice done
|
|
// on the added edge <e>
|
|
if ( ChoixConge%2 != Choix%2 )
|
|
Spine->SetDists(Dis2, Dis1);
|
|
else Spine->SetDists(Dis1, Dis2);
|
|
|
|
PerformExtremity(Spine);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : SetDists
|
|
//purpose : set the distances <Dis1> and <Dis2> of the contour of
|
|
// index IC
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::SetDists(const Standard_Real Dis1,
|
|
const Standard_Real Dis2,
|
|
const Standard_Integer IC,
|
|
const TopoDS_Face& F)
|
|
{
|
|
|
|
if(IC <= NbElements()) {
|
|
Handle(ChFiDS_ChamfSpine) csp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
|
|
// Search the first edge which has a common face equal to F
|
|
TopoDS_Face F1,F2,FirstF1,FirstF2;
|
|
TopAbs_Orientation Or1,Or2;
|
|
Standard_Integer Choix, ChoixConge;
|
|
BRepAdaptor_Surface Sb1,Sb2;
|
|
Standard_Integer i = 1;
|
|
Standard_Boolean Found = Standard_False;
|
|
while ( (i <= csp->NbEdges()) && (!Found) ) {
|
|
SearchCommonFaces(myEFMap,csp->Edges(i),F1,F2);
|
|
if ( i == 1) {
|
|
FirstF1 = F1;
|
|
FirstF2 = F2;
|
|
}
|
|
Found = ( F1.IsSame(F) || F2.IsSame(F) );
|
|
i++;
|
|
}
|
|
|
|
if (Found) {
|
|
if ( F2.IsSame(F) ) {
|
|
F2 = F1;
|
|
F1 = F;
|
|
}
|
|
Sb1.Initialize(F1);
|
|
Sb2.Initialize(F2);
|
|
Choix = ChFi3d::ConcaveSide(Sb1,Sb2,
|
|
csp->Edges(i-1),
|
|
Or1,Or2);
|
|
Sb1.Initialize(FirstF1);
|
|
Sb2.Initialize(FirstF2);
|
|
ChoixConge = ChFi3d::ConcaveSide(Sb1,Sb2,
|
|
csp->Edges(1),
|
|
Or1,Or2);
|
|
if ( ChoixConge%2 != Choix%2 )
|
|
csp->SetDists(Dis2,Dis1);
|
|
else csp->SetDists(Dis1,Dis2);
|
|
}
|
|
else
|
|
Standard_DomainError::Raise("the face is not common to any of edges of the contour");
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : Dists
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::Dists(const Standard_Integer IC,
|
|
Standard_Real& dis1,
|
|
Standard_Real& dis2) const
|
|
{
|
|
Handle(ChFiDS_ChamfSpine) chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
Standard_Real temp1, temp2;
|
|
chsp->Dists(temp1,temp2);
|
|
dis1 = temp1;
|
|
dis2 = temp2;
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : Add
|
|
//purpose : create a new stripe with a ChAsymSpine containing the edge <E>
|
|
// with the distance <Dis> and the angle Angle on the face <F>
|
|
// . Add the tangential edges continuous to E in the spine
|
|
//
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::AddDA(const Standard_Real Dis1,
|
|
const Standard_Real Angle,
|
|
const TopoDS_Edge& E,
|
|
const TopoDS_Face& F)
|
|
{
|
|
if (!Contains(E) && myEFMap.Contains(E)) {
|
|
|
|
// Take the 2 common faces of the egde <E>
|
|
TopoDS_Face F1,F2;
|
|
SearchCommonFaces(myEFMap,E,F1,F2);
|
|
|
|
if (! F1.IsSame(F) && F2.IsSame(F) ) {
|
|
F2 = F1;
|
|
F1 = F;
|
|
}
|
|
|
|
if ( F1.IsSame(F)) {
|
|
TopoDS_Edge E_wnt = E;
|
|
E_wnt.Orientation(TopAbs_FORWARD);
|
|
BRepAdaptor_Surface Sb1,Sb2;
|
|
Sb1.Initialize(F1);
|
|
Sb2.Initialize(F2);
|
|
TopAbs_Orientation Or1,Or2;
|
|
Standard_Integer Choix = ChFi3d::ConcaveSide(Sb1,Sb2,E_wnt,Or1,Or2);
|
|
|
|
Handle(ChFiDS_Stripe) Stripe = new ChFiDS_Stripe();
|
|
Handle(ChFiDS_Spine)& Sp = Stripe->ChangeSpine();
|
|
Sp = new ChFiDS_ChamfSpine(tolesp);
|
|
Handle(ChFiDS_ChamfSpine)
|
|
Spine = Handle(ChFiDS_ChamfSpine)::DownCast(Sp);
|
|
|
|
Spine->SetEdges(E_wnt);
|
|
if(PerformElement(Spine)){
|
|
Spine->Load();
|
|
myListStripe.Append(Stripe);
|
|
|
|
Standard_Integer ChoixConge;
|
|
SearchCommonFaces(myEFMap,Spine->Edges(1),F1,F2);
|
|
Sb1.Initialize(F1);
|
|
Sb2.Initialize(F2);
|
|
ChoixConge = ChFi3d::ConcaveSide(Sb1,Sb2,
|
|
Spine->Edges(1),
|
|
Or1,Or2);
|
|
|
|
// compare the 2 computed choices to know how to set the
|
|
// distances of the Spine according to the choice done
|
|
// on the added edge <e>
|
|
if ( ChoixConge%2 != Choix%2 ) {
|
|
Spine->SetDistAngle(Dis1, Angle, Standard_False);
|
|
}
|
|
else {
|
|
Spine->SetDistAngle(Dis1, Angle, Standard_True);
|
|
}
|
|
|
|
PerformExtremity(Spine);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : SetDistAngle
|
|
//purpose : set the distances <Dis> and <Angle> of the contour of
|
|
// index IC
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::SetDistAngle(const Standard_Real Dis,
|
|
const Standard_Real Angle,
|
|
const Standard_Integer IC,
|
|
const TopoDS_Face& F)
|
|
{
|
|
|
|
if(IC <= NbElements()) {
|
|
Handle(ChFiDS_ChamfSpine) csp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
|
|
// Search the first edge which has a common face equal to F
|
|
TopoDS_Face F1,F2,FirstF1,FirstF2;
|
|
TopAbs_Orientation Or1,Or2;
|
|
Standard_Integer Choix, ChoixConge;
|
|
BRepAdaptor_Surface Sb1,Sb2;
|
|
Standard_Integer i = 1;
|
|
Standard_Boolean Found = Standard_False;
|
|
// Standard_Boolean DisOnF1 = Standard_True;
|
|
|
|
while ( (i <= csp->NbEdges()) && (!Found) ) {
|
|
SearchCommonFaces(myEFMap,csp->Edges(i),F1,F2);
|
|
if ( i == 1) {
|
|
FirstF1 = F1;
|
|
FirstF2 = F2;
|
|
}
|
|
Found = ( F1.IsSame(F) || F2.IsSame(F) );
|
|
i++;
|
|
}
|
|
|
|
if (Found) {
|
|
if ( F2.IsSame(F) ) {
|
|
F2 = F1;
|
|
F1 = F;
|
|
}
|
|
Sb1.Initialize(F1);
|
|
Sb2.Initialize(F2);
|
|
Choix = ChFi3d::ConcaveSide(Sb1,Sb2,
|
|
csp->Edges(i-1),
|
|
Or1,Or2);
|
|
Sb1.Initialize(FirstF1);
|
|
Sb2.Initialize(FirstF2);
|
|
ChoixConge = ChFi3d::ConcaveSide(Sb1,Sb2,
|
|
csp->Edges(1),
|
|
Or1,Or2);
|
|
if ( ChoixConge%2 != Choix%2 ) {
|
|
csp->SetDistAngle(Dis, Angle, Standard_False);
|
|
}
|
|
else {
|
|
csp->SetDistAngle(Dis, Angle, Standard_True);
|
|
}
|
|
}
|
|
else
|
|
Standard_DomainError::Raise("the face is not common to any edges of the contour");
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : GetDistAngle
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::GetDistAngle(const Standard_Integer IC,
|
|
Standard_Real& Dis,
|
|
Standard_Real& Angle,
|
|
Standard_Boolean& DisOnFace1) const
|
|
{
|
|
Handle(ChFiDS_ChamfSpine) chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
|
|
chsp->GetDistAngle(Dis, Angle, DisOnFace1);
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : IsChamfer
|
|
//purpose :
|
|
//=======================================================================
|
|
ChFiDS_ChamfMethod ChFi3d_ChBuilder::IsChamfer(const Standard_Integer IC) const
|
|
{
|
|
Handle(ChFiDS_ChamfSpine) chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
|
|
ChFiDS_ChamfMethod ret = chsp->IsChamfer();
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : ResetContour
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::ResetContour(const Standard_Integer IC)
|
|
{
|
|
if(IC <= NbElements()) {
|
|
Handle(ChFiDS_ChamfSpine) chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Value(IC));
|
|
chsp->Reset(Standard_True);
|
|
}
|
|
}
|
|
|
|
//--------------------------------AJOUT----------------------------------
|
|
//=======================================================================
|
|
//function : Simulate
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::Simulate (const Standard_Integer IC)
|
|
{
|
|
#ifdef DEB
|
|
if(ChFi3d_GettraceCHRON()){
|
|
simul.Reset();elspine.Reset();chemine.Reset();
|
|
simul.Start();
|
|
}
|
|
#endif
|
|
ChFiDS_ListIteratorOfListOfStripe itel;
|
|
Standard_Integer i = 1;
|
|
for (itel.Initialize(myListStripe);itel.More(); itel.Next(), i++) {
|
|
if(i == IC){
|
|
PerformSetOfSurf(itel.Value(), Standard_True);
|
|
break;
|
|
}
|
|
}
|
|
#ifdef DEB
|
|
if(ChFi3d_GettraceCHRON()){
|
|
simul.Stop();
|
|
cout<<"Total simulation time : ";
|
|
simul.Show();
|
|
cout<<"Spine construction time : ";
|
|
elspine.Show();
|
|
cout<<"and progression time : ";
|
|
chemine.Show();
|
|
}
|
|
#endif
|
|
}
|
|
|
|
//---------------------------AJOUT---------------------------------------
|
|
//=======================================================================
|
|
//function : NbSurf
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Integer ChFi3d_ChBuilder::NbSurf (const Standard_Integer IC) const
|
|
{
|
|
ChFiDS_ListIteratorOfListOfStripe itel;
|
|
Standard_Integer i = 1;
|
|
for (itel.Initialize(myListStripe);itel.More(); itel.Next(), i++) {
|
|
if(i == IC){
|
|
return itel.Value()->SetOfSurfData()->Length();
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
//--------------------------AJOUT---------------------------------------
|
|
//=======================================================================
|
|
//function : Sect
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Handle(ChFiDS_SecHArray1) ChFi3d_ChBuilder::Sect (const Standard_Integer IC,
|
|
const Standard_Integer IS) const
|
|
{
|
|
ChFiDS_ListIteratorOfListOfStripe itel;
|
|
Standard_Integer i = 1;
|
|
Handle(ChFiDS_SecHArray1) res;
|
|
for (itel.Initialize(myListStripe);itel.More(); itel.Next(), i++) {
|
|
if(i == IC){
|
|
Handle(MMgt_TShared) bid = itel.Value()->SetOfSurfData()->Value(IS)->Simul();
|
|
res = Handle(ChFiDS_SecHArray1)::DownCast(bid);
|
|
return res;
|
|
}
|
|
}
|
|
return Handle(ChFiDS_SecHArray1)();
|
|
}
|
|
|
|
|
|
//-------------------MODIFS---------------------------------------------
|
|
//=======================================================================
|
|
//function : SimulKPart
|
|
//purpose : Stores simulating sections in simul
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::SimulKPart(const Handle(ChFiDS_SurfData)& SD ) const
|
|
{
|
|
TopOpeBRepDS_DataStructure& DStr = myDS->ChangeDS();
|
|
Handle(Geom_Surface) S = DStr.Surface(SD->Surf()).Surface();
|
|
gp_Pnt2d p1f = SD->InterferenceOnS1().PCurveOnSurf()->
|
|
Value(SD->InterferenceOnS1().FirstParameter());
|
|
gp_Pnt2d p1l = SD->InterferenceOnS1().PCurveOnSurf()->
|
|
Value(SD->InterferenceOnS1().LastParameter());
|
|
gp_Pnt2d p2f = SD->InterferenceOnS2().PCurveOnSurf()->
|
|
Value(SD->InterferenceOnS2().FirstParameter());
|
|
gp_Pnt2d p2l = SD->InterferenceOnS2().PCurveOnSurf()->
|
|
Value(SD->InterferenceOnS2().LastParameter());
|
|
GeomAdaptor_Surface AS(S);
|
|
Handle(ChFiDS_SecHArray1) sec;
|
|
Standard_Real u1,v1,u2,v2;
|
|
GeomAbs_SurfaceType typ = AS.GetType();
|
|
switch (typ){
|
|
case GeomAbs_Plane:
|
|
{
|
|
v1 = p1f.Y();
|
|
v2 = p2f.Y();
|
|
u1 = Max(p1f.X(),p2f.X());
|
|
u2 = Min(p1l.X(),p2l.X());
|
|
sec = new ChFiDS_SecHArray1(1,2);
|
|
gp_Pln Pl = AS.Plane();
|
|
ChFiDS_CircSection& sec1 = sec->ChangeValue(1);
|
|
ChFiDS_CircSection& sec2 = sec->ChangeValue(2);
|
|
sec1.Set(ElSLib::PlaneUIso(Pl.Position(),u1),v1,v2);
|
|
sec2.Set(ElSLib::PlaneUIso(Pl.Position(),u2),v1,v2);
|
|
}
|
|
break;
|
|
case GeomAbs_Cone:
|
|
{
|
|
v1 = p1f.Y();
|
|
v2 = p2f.Y();
|
|
u1 = Max(p1f.X(),p2f.X());
|
|
u2 = Min(p1l.X(),p2l.X());
|
|
Standard_Real ang = (u2-u1);
|
|
gp_Cone Co = AS.Cone();
|
|
Standard_Real rad = Co.RefRadius(), sang = Co.SemiAngle();
|
|
Standard_Integer n = (Standard_Integer) (36.*ang/M_PI + 1);
|
|
if(n<2) n = 2;
|
|
sec = new ChFiDS_SecHArray1(1, n);
|
|
for (Standard_Integer i = 1; i <= n; i++) {
|
|
ChFiDS_CircSection& isec = sec->ChangeValue(i);
|
|
Standard_Real u = u1 + (i - 1)*(u2 - u1)/(n-1);
|
|
isec.Set(ElSLib::ConeUIso(Co.Position(), rad, sang, u), v1, v2);
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
SD->SetSimul(sec);
|
|
}
|
|
|
|
//------------------------MODIFS---------------------------------------
|
|
//=======================================================================
|
|
//function : SimulSurf
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Boolean
|
|
ChFi3d_ChBuilder::SimulSurf(Handle(ChFiDS_SurfData)& Data,
|
|
const Handle(ChFiDS_HElSpine)& HGuide,
|
|
const Handle(ChFiDS_Spine)& Spine,
|
|
const Standard_Integer Choix,
|
|
const Handle(BRepAdaptor_HSurface)& S1,
|
|
const Handle(Adaptor3d_TopolTool)& I1,
|
|
const Handle(BRepAdaptor_HSurface)& S2,
|
|
const Handle(Adaptor3d_TopolTool)& I2,
|
|
const Standard_Real TolGuide,
|
|
Standard_Real& First,
|
|
Standard_Real& Last,
|
|
const Standard_Boolean Inside,
|
|
const Standard_Boolean Appro,
|
|
const Standard_Boolean Forward,
|
|
const Standard_Boolean RecOnS1,
|
|
const Standard_Boolean RecOnS2,
|
|
const math_Vector& Soldep,
|
|
Standard_Boolean& intf,
|
|
Standard_Boolean& intl)
|
|
|
|
{
|
|
Handle(ChFiDS_ChamfSpine)
|
|
chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Spine);
|
|
|
|
if (chsp.IsNull())
|
|
Standard_ConstructionError::Raise
|
|
("SimulSurf : this is not the spine of a chamfer");
|
|
|
|
|
|
Standard_Real radius;
|
|
// Flexible parameters!
|
|
Standard_Real la = HGuide->LastParameter(), fi = HGuide->FirstParameter();
|
|
Standard_Real longueur = la - fi;
|
|
Standard_Real MaxStep = longueur * 0.05;
|
|
Standard_Real radiusspine = 0, locfleche, w;
|
|
gp_Pnt Pbid;
|
|
gp_Vec d1,d2;
|
|
// As ElSpine is parameterized by a curvilinear quasi-abscissa,
|
|
// the min radius is estimated as 1/D2 max;
|
|
//for(Standard_Integer i = 0; i <= 20; i++){
|
|
Standard_Integer i;
|
|
for( i = 0; i <= 20; i++){
|
|
w = fi + i*MaxStep;
|
|
HGuide->D2(w,Pbid,d1,d2);
|
|
Standard_Real temp = d2.SquareMagnitude();
|
|
if(temp>radiusspine) radiusspine = temp;
|
|
}
|
|
|
|
Handle(BRepBlend_Line) lin;
|
|
Standard_Real PFirst = First;
|
|
if(intf) First = chsp->FirstParameter(1);
|
|
if(intl) Last = chsp->LastParameter(chsp->NbEdges());
|
|
|
|
|
|
|
|
if (chsp->IsChamfer() == ChFiDS_Sym) {
|
|
Standard_Real dis;
|
|
chsp->GetDist(dis);
|
|
radius = Max(dis, radiusspine);
|
|
locfleche = radius*1.e-2; //graphic criterion
|
|
|
|
BRepBlend_Chamfer Func(S1,S2,HGuide);
|
|
BRepBlend_ChamfInv FInv(S1,S2,HGuide);
|
|
Func.Set(dis, dis, Choix);
|
|
FInv.Set(dis, dis, Choix);
|
|
|
|
done = SimulData(Data,HGuide,lin,S1,I1,S2,I2,
|
|
Func,FInv,PFirst,MaxStep,locfleche,
|
|
TolGuide,First,Last,Inside,Appro,Forward,
|
|
Soldep,4,RecOnS1,RecOnS2);
|
|
|
|
if ( !done ) return Standard_False;
|
|
Handle(ChFiDS_SecHArray1) sec;
|
|
gp_Pnt2d pf1,pl1,pf2,pl2;
|
|
|
|
Standard_Integer nbp = lin->NbPoints();
|
|
sec = new ChFiDS_SecHArray1(1,nbp);
|
|
for( i = 1; i <= nbp; i++ ){
|
|
ChFiDS_CircSection& isec = sec->ChangeValue(i);
|
|
Standard_Real u1,v1,u2,v2,ww,p1,p2;
|
|
gp_Lin line;
|
|
const Blend_Point& p = lin->Point(i);
|
|
p.ParametersOnS1(u1,v1);
|
|
p.ParametersOnS2(u2,v2);
|
|
ww = p.Parameter();
|
|
Func.Section(ww,u1,v1,u2,v2,p1,p2,line);
|
|
isec.Set(line,p1,p2);
|
|
if(i == 1) {pf1.SetCoord(u1,v1); pf2.SetCoord(u2,v2);}
|
|
if(i == nbp) {pl1.SetCoord(u1,v1); pl2.SetCoord(u2,v2);}
|
|
}
|
|
|
|
Data->SetSimul(sec);
|
|
Data->Set2dPoints(pf1,pl1,pf2,pl2);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_False,Data->ChangeVertexLastOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_False, Data->ChangeVertexLastOnS2(),tolesp);
|
|
|
|
Standard_Boolean reverse = (!Forward || Inside);
|
|
if(intf && reverse){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexFirstOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intf = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexFirstOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intf = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
if(intl){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexLastOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intl = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexLastOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intl = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
}
|
|
else if (chsp->IsChamfer() == ChFiDS_TwoDist) {
|
|
Standard_Real dis1, dis2;
|
|
chsp->Dists(dis1, dis2);
|
|
radius = Max(dis1, dis2);
|
|
radius = Max(radius, radiusspine);
|
|
locfleche = radius*1.e-2; //graphic criterion
|
|
|
|
BRepBlend_Chamfer Func(S1,S2,HGuide);
|
|
BRepBlend_ChamfInv FInv(S1,S2,HGuide);
|
|
Func.Set(dis1,dis2,Choix);
|
|
FInv.Set(dis1,dis2,Choix);
|
|
|
|
done = SimulData(Data,HGuide,lin,S1,I1,S2,I2,
|
|
Func,FInv,PFirst,MaxStep,locfleche,
|
|
TolGuide,First,Last,Inside,Appro,Forward,
|
|
Soldep,4,RecOnS1,RecOnS2);
|
|
|
|
if ( !done ) return Standard_False;
|
|
Handle(ChFiDS_SecHArray1) sec;
|
|
gp_Pnt2d pf1,pl1,pf2,pl2;
|
|
|
|
Standard_Integer nbp = lin->NbPoints();
|
|
sec = new ChFiDS_SecHArray1(1,nbp);
|
|
for( i = 1; i <= nbp; i++ ){
|
|
ChFiDS_CircSection& isec = sec->ChangeValue(i);
|
|
Standard_Real u1,v1,u2,v2,ww,p1,p2;
|
|
gp_Lin line;
|
|
const Blend_Point& p = lin->Point(i);
|
|
p.ParametersOnS1(u1,v1);
|
|
p.ParametersOnS2(u2,v2);
|
|
ww = p.Parameter();
|
|
Func.Section(ww,u1,v1,u2,v2,p1,p2,line);
|
|
isec.Set(line,p1,p2);
|
|
if(i == 1) {pf1.SetCoord(u1,v1); pf2.SetCoord(u2,v2);}
|
|
if(i == nbp) {pl1.SetCoord(u1,v1); pl2.SetCoord(u2,v2);}
|
|
}
|
|
|
|
Data->SetSimul(sec);
|
|
Data->Set2dPoints(pf1,pl1,pf2,pl2);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_False,Data->ChangeVertexLastOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_False, Data->ChangeVertexLastOnS2(),tolesp);
|
|
|
|
Standard_Boolean reverse = (!Forward || Inside);
|
|
if(intf && reverse){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexFirstOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intf = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexFirstOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intf = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
if(intl){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexLastOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intl = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexLastOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intl = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
Standard_Real dis, angle;
|
|
Standard_Boolean disonF1;
|
|
chsp->GetDistAngle(dis, angle, disonF1);
|
|
radius = Max(dis, dis * tan(angle));
|
|
radius = Max(radius, radiusspine);
|
|
locfleche = radius*1.e-2; //graphic criterion
|
|
|
|
Standard_Integer Ch = FindChoiceDistAngle(Choix, disonF1);
|
|
|
|
if (disonF1) {
|
|
BRepBlend_ChAsym Func(S1,S2,HGuide);
|
|
BRepBlend_ChAsymInv FInv(S1,S2,HGuide);
|
|
|
|
Func.Set(dis, angle, Ch);
|
|
FInv.Set(dis, angle, Ch);
|
|
|
|
done = SimulData(Data,HGuide,lin,S1,I1,S2,I2,
|
|
Func,FInv,PFirst,MaxStep,locfleche,
|
|
TolGuide,First,Last,Inside,Appro,Forward,
|
|
Soldep,4,RecOnS1,RecOnS2);
|
|
|
|
if ( !done ) return Standard_False;
|
|
Handle(ChFiDS_SecHArray1) sec;
|
|
gp_Pnt2d pf1,pl1,pf2,pl2;
|
|
|
|
Standard_Integer nbp = lin->NbPoints();
|
|
sec = new ChFiDS_SecHArray1(1,nbp);
|
|
for( i = 1; i <= nbp; i++ ){
|
|
ChFiDS_CircSection& isec = sec->ChangeValue(i);
|
|
Standard_Real u1,v1,u2,v2,ww,p1,p2;
|
|
gp_Lin line;
|
|
const Blend_Point& p = lin->Point(i);
|
|
p.ParametersOnS1(u1,v1);
|
|
p.ParametersOnS2(u2,v2);
|
|
ww = p.Parameter();
|
|
Func.Section(ww,u1,v1,u2,v2,p1,p2,line);
|
|
isec.Set(line,p1,p2);
|
|
if(i == 1) {pf1.SetCoord(u1,v1); pf2.SetCoord(u2,v2);}
|
|
if(i == nbp) {pl1.SetCoord(u1,v1); pl2.SetCoord(u2,v2);}
|
|
}
|
|
|
|
Data->SetSimul(sec);
|
|
Data->Set2dPoints(pf1,pl1,pf2,pl2);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_False,Data->ChangeVertexLastOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_False, Data->ChangeVertexLastOnS2(),tolesp);
|
|
|
|
Standard_Boolean reverse = (!Forward || Inside);
|
|
if(intf && reverse){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexFirstOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intf = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexFirstOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intf = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
|
|
if(intl){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexLastOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intl = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexLastOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intl = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
BRepBlend_ChAsym Func(S2,S1,HGuide);
|
|
BRepBlend_ChAsymInv FInv(S2,S1,HGuide);
|
|
|
|
Func.Set(dis, angle, Ch);
|
|
FInv.Set(dis, angle, Ch);
|
|
|
|
Standard_Real Rtemp;
|
|
Rtemp = Soldep(1);
|
|
Soldep(1) = Soldep(3);
|
|
Soldep(3) = Rtemp;
|
|
Rtemp = Soldep(2);
|
|
Soldep(2) = Soldep(4);
|
|
Soldep(4) = Rtemp;
|
|
|
|
done = SimulData(Data,HGuide,lin,S2,I2,S1,I1,
|
|
Func,FInv,PFirst,MaxStep,locfleche,
|
|
TolGuide,First,Last,Inside,Appro,Forward,
|
|
Soldep,4,RecOnS2,RecOnS1);
|
|
|
|
if ( !done ) return Standard_False;
|
|
Handle(ChFiDS_SecHArray1) sec;
|
|
gp_Pnt2d pf1,pl1,pf2,pl2;
|
|
|
|
Standard_Integer nbp = lin->NbPoints();
|
|
sec = new ChFiDS_SecHArray1(1,nbp);
|
|
for( i = 1; i <= nbp; i++ ){
|
|
ChFiDS_CircSection& isec = sec->ChangeValue(i);
|
|
Standard_Real u1,v1,u2,v2,ww,p1,p2;
|
|
gp_Lin line;
|
|
const Blend_Point& p = lin->Point(i);
|
|
p.ParametersOnS1(u1,v1);
|
|
p.ParametersOnS2(u2,v2);
|
|
ww = p.Parameter();
|
|
Func.Section(ww,u1,v1,u2,v2,p1,p2,line);
|
|
isec.Set(line,p1,p2);
|
|
if(i == 1) {pf1.SetCoord(u1,v1); pf2.SetCoord(u2,v2);}
|
|
if(i == nbp) {pl1.SetCoord(u1,v1); pl2.SetCoord(u2,v2);}
|
|
}
|
|
|
|
Data->SetSimul(sec);
|
|
Data->Set2dPoints(pf1,pl1,pf2,pl2);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_True, Data->ChangeVertexFirstOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnFirst(),lin->TransitionOnS1(),
|
|
Standard_False,Data->ChangeVertexLastOnS1(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->StartPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_True, Data->ChangeVertexFirstOnS2(),tolesp);
|
|
ChFi3d_FilCommonPoint(lin->EndPointOnSecond(),lin->TransitionOnS2(),
|
|
Standard_False, Data->ChangeVertexLastOnS2(),tolesp);
|
|
|
|
Standard_Boolean reverse = (!Forward || Inside);
|
|
if(intf && reverse){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexFirstOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intf = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexFirstOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intf = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
|
|
if(intl){
|
|
Standard_Boolean ok = 0;
|
|
const ChFiDS_CommonPoint& cp1 = Data->VertexLastOnS1();
|
|
if(cp1.IsOnArc()){
|
|
TopoDS_Face F1 = S1->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
ok = intl = !SearchFace(Spine,cp1,F1,bid);
|
|
}
|
|
const ChFiDS_CommonPoint& cp2 = Data->VertexLastOnS2();
|
|
if(cp2.IsOnArc() && !ok){
|
|
TopoDS_Face F2 = S2->ChangeSurface().Face();
|
|
TopoDS_Face bid;
|
|
intl = !SearchFace(Spine,cp2,F2,bid);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return Standard_True;
|
|
}
|
|
|
|
void ChFi3d_ChBuilder::SimulSurf(Handle(ChFiDS_SurfData)& ,
|
|
const Handle(ChFiDS_HElSpine)& ,
|
|
const Handle(ChFiDS_Spine)& ,
|
|
const Standard_Integer ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const TopAbs_Orientation ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
Standard_Real& ,
|
|
Standard_Real& ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const math_Vector& )
|
|
{
|
|
Standard_Failure::Raise("SimulSurf Not Implemented");
|
|
}
|
|
void ChFi3d_ChBuilder::SimulSurf(Handle(ChFiDS_SurfData)& ,
|
|
const Handle(ChFiDS_HElSpine)& ,
|
|
const Handle(ChFiDS_Spine)& ,
|
|
const Standard_Integer ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const TopAbs_Orientation ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
Standard_Real& ,
|
|
Standard_Real& ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const math_Vector& )
|
|
{
|
|
Standard_Failure::Raise("SimulSurf Not Implemented");
|
|
}
|
|
void ChFi3d_ChBuilder::SimulSurf(Handle(ChFiDS_SurfData)& ,
|
|
const Handle(ChFiDS_HElSpine)& ,
|
|
const Handle(ChFiDS_Spine)& ,
|
|
const Standard_Integer ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const TopAbs_Orientation ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const TopAbs_Orientation ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
Standard_Real& ,
|
|
Standard_Real& ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const math_Vector& )
|
|
{
|
|
Standard_Failure::Raise("SimulSurf Not Implemented");
|
|
}
|
|
//------------------------MODIFS---------------------------------------
|
|
//=======================================================================
|
|
//function : PerformFirstSection
|
|
//purpose : to implement the first section if there is no KPart
|
|
//=======================================================================
|
|
|
|
Standard_Boolean ChFi3d_ChBuilder::PerformFirstSection
|
|
(const Handle(ChFiDS_Spine)& Spine,
|
|
const Handle(ChFiDS_HElSpine)& HGuide,
|
|
const Standard_Integer Choix,
|
|
Handle(BRepAdaptor_HSurface)& S1,
|
|
Handle(BRepAdaptor_HSurface)& S2,
|
|
const Handle(Adaptor3d_TopolTool)& I1,
|
|
const Handle(Adaptor3d_TopolTool)& I2,
|
|
const Standard_Real Par,
|
|
math_Vector& SolDep,
|
|
TopAbs_State& Pos1,
|
|
TopAbs_State& Pos2) const
|
|
{
|
|
Handle(ChFiDS_ChamfSpine)
|
|
chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Spine);
|
|
|
|
if (chsp.IsNull())
|
|
Standard_ConstructionError::Raise
|
|
("PerformSurf : this is not the spine of a chamfer");
|
|
|
|
Standard_Real TolGuide = HGuide->Resolution(tolesp) ;
|
|
|
|
|
|
if (chsp->IsChamfer() == ChFiDS_Sym) {
|
|
Standard_Real dis;
|
|
chsp->GetDist(dis);
|
|
|
|
BRepBlend_Chamfer Func(S1,S2,HGuide);
|
|
Func.Set(dis,dis,Choix);
|
|
BRepBlend_Walking TheWalk(S1,S2,I1,I2);
|
|
|
|
//calculate an approximate starting solution
|
|
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
|
|
gp_Pnt pt1, pt2, ptgui;
|
|
gp_XYZ temp;
|
|
|
|
( HGuide->Curve() ).D1(Par,ptgui,d1gui);
|
|
// ptgui = (S1->Surface()).Value(SolDep(1),SolDep(2));
|
|
|
|
Func.Set(Par);
|
|
Func.Tangent(SolDep(1),SolDep(2),SolDep(3),SolDep(4),TgF,TgL,tmp1,tmp2);
|
|
|
|
Standard_Boolean rev1 = Standard_False;
|
|
Standard_Boolean rev2 = Standard_False;
|
|
Standard_Real sign = (TgF.Crossed(d1gui)).Dot(TgL);
|
|
|
|
if( Choix%2 == 1 )
|
|
rev1 = Standard_True;
|
|
else
|
|
rev2 = Standard_True;
|
|
|
|
if( sign < 0. ){
|
|
rev1 = !rev1;
|
|
rev2 = !rev2;
|
|
}
|
|
|
|
if( rev1 )
|
|
TgF.Reverse();
|
|
if( rev2 )
|
|
TgL.Reverse();
|
|
|
|
temp = (TgF.XYZ()).Multiplied(dis);
|
|
pt1.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
temp = (TgL.XYZ()).Multiplied(dis);
|
|
pt2.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
|
|
Standard_Real tol = tolesp*1.e2;
|
|
// Standard_Real u,v;
|
|
Extrema_GenLocateExtPS proj1(pt1,S1->Surface(),SolDep(1),SolDep(2),tol,tol);
|
|
Extrema_GenLocateExtPS proj2(pt2,S2->Surface(),SolDep(3),SolDep(4),tol,tol);
|
|
if( proj1.IsDone() ){
|
|
(proj1.Point()).Parameter(SolDep(1),SolDep(2));
|
|
}
|
|
if( proj2.IsDone() ){
|
|
(proj2.Point()).Parameter(SolDep(3),SolDep(4));
|
|
}
|
|
|
|
return TheWalk.PerformFirstSection(Func,Par,SolDep,
|
|
tolesp,TolGuide,Pos1,Pos2);
|
|
}
|
|
else if (chsp->IsChamfer() == ChFiDS_TwoDist) {
|
|
Standard_Real dis1, dis2;
|
|
chsp->Dists(dis1, dis2);
|
|
|
|
BRepBlend_Chamfer Func(S1,S2,HGuide);
|
|
Func.Set(dis1,dis2,Choix);
|
|
BRepBlend_Walking TheWalk(S1,S2,I1,I2);
|
|
|
|
//calculate an approximate starting solution
|
|
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
|
|
gp_Pnt pt1, pt2, ptgui;
|
|
gp_XYZ temp;
|
|
|
|
( HGuide->Curve() ).D1(Par,ptgui,d1gui);
|
|
// ptgui = (S1->Surface()).Value(SolDep(1),SolDep(2));
|
|
|
|
Func.Set(Par);
|
|
Func.Tangent(SolDep(1),SolDep(2),SolDep(3),SolDep(4),TgF,TgL,tmp1,tmp2);
|
|
|
|
Standard_Boolean rev1 = Standard_False;
|
|
Standard_Boolean rev2 = Standard_False;
|
|
Standard_Real sign = (TgF.Crossed(d1gui)).Dot(TgL);
|
|
|
|
if( Choix%2 == 1 )
|
|
rev1 = Standard_True;
|
|
else
|
|
rev2 = Standard_True;
|
|
|
|
if( sign < 0. ){
|
|
rev1 = !rev1;
|
|
rev2 = !rev2;
|
|
}
|
|
|
|
if( rev1 )
|
|
TgF.Reverse();
|
|
if( rev2 )
|
|
TgL.Reverse();
|
|
|
|
temp = (TgF.XYZ()).Multiplied(dis1);
|
|
pt1.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
temp = (TgL.XYZ()).Multiplied(dis2);
|
|
pt2.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
|
|
Standard_Real tol = tolesp*1.e2;
|
|
// Standard_Real u,v;
|
|
Extrema_GenLocateExtPS proj1(pt1,S1->Surface(),SolDep(1),SolDep(2),tol,tol);
|
|
Extrema_GenLocateExtPS proj2(pt2,S2->Surface(),SolDep(3),SolDep(4),tol,tol);
|
|
if( proj1.IsDone() ){
|
|
(proj1.Point()).Parameter(SolDep(1),SolDep(2));
|
|
}
|
|
if( proj2.IsDone() ){
|
|
(proj2.Point()).Parameter(SolDep(3),SolDep(4));
|
|
}
|
|
|
|
return TheWalk.PerformFirstSection(Func,Par,SolDep,
|
|
tolesp,TolGuide,Pos1,Pos2);
|
|
}
|
|
else {
|
|
Standard_Real dis1, angle;
|
|
Standard_Boolean disonF1;
|
|
chsp->GetDistAngle(dis1, angle, disonF1);
|
|
|
|
Standard_Integer Ch = FindChoiceDistAngle(Choix, disonF1);
|
|
|
|
if (disonF1) {
|
|
BRepBlend_ChAsym Func(S1,S2,HGuide);
|
|
Func.Set(dis1, angle, Ch);
|
|
BRepBlend_Walking TheWalk(S1,S2,I1,I2);
|
|
|
|
//calculate an approximate starting solution
|
|
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
|
|
gp_Pnt pt1, pt2, ptgui;
|
|
gp_XYZ temp;
|
|
|
|
( HGuide->Curve() ).D1(Par,ptgui,d1gui);
|
|
// ptgui = (S1->Surface()).Value(SolDep(1),SolDep(2));
|
|
|
|
Func.Set(Par);
|
|
Func.Tangent(SolDep(1),SolDep(2),SolDep(3),SolDep(4),TgF,TgL,tmp1,tmp2);
|
|
|
|
Standard_Boolean rev1 = Standard_False;
|
|
Standard_Boolean rev2 = Standard_False;
|
|
Standard_Real sign = (TgF.Crossed(d1gui)).Dot(TgL);
|
|
|
|
if( Ch%2 == 1 )
|
|
rev1 = Standard_True;
|
|
else
|
|
rev2 = Standard_True;
|
|
|
|
if( sign < 0. ){
|
|
rev1 = !rev1;
|
|
rev2 = !rev2;
|
|
}
|
|
|
|
if( rev1 )
|
|
TgF.Reverse();
|
|
if( rev2 )
|
|
TgL.Reverse();
|
|
|
|
temp = (TgF.XYZ()).Multiplied(dis1);
|
|
pt1.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
|
|
Standard_Real dis2, tmpcos, tmpsin;
|
|
tmpcos = TgF.Dot(TgL);
|
|
tmpsin = sqrt(1. - tmpcos * tmpcos);
|
|
|
|
dis2 = dis1 / (tmpcos + tmpsin / tan(angle));
|
|
|
|
temp = (TgL.XYZ()).Multiplied(dis2);
|
|
pt2.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
|
|
Standard_Real tol = tolesp*1.e2;
|
|
// Standard_Real u,v;
|
|
Extrema_GenLocateExtPS proj1(pt1,S1->Surface(),SolDep(1),SolDep(2),tol,tol);
|
|
Extrema_GenLocateExtPS proj2(pt2,S2->Surface(),SolDep(3),SolDep(4),tol,tol);
|
|
if( proj1.IsDone() ){
|
|
(proj1.Point()).Parameter(SolDep(1),SolDep(2));
|
|
}
|
|
if( proj2.IsDone() ){
|
|
(proj2.Point()).Parameter(SolDep(3),SolDep(4));
|
|
}
|
|
|
|
return TheWalk.PerformFirstSection(Func,Par,SolDep,
|
|
tolesp,TolGuide,Pos1,Pos2);
|
|
}
|
|
else {
|
|
Standard_Real Rtemp;
|
|
BRepBlend_ChAsym Func(S2,S1,HGuide);
|
|
Func.Set(dis1, angle, Ch);
|
|
BRepBlend_Walking TheWalk(S2,S1,I2,I1);
|
|
|
|
//calculate an approximate starting solution
|
|
gp_Vec TgF, TgL, tmp1, tmp2, d1gui;
|
|
gp_Pnt pt1, pt2, ptgui;
|
|
gp_XYZ temp;
|
|
|
|
( HGuide->Curve() ).D1(Par,ptgui,d1gui);
|
|
// ptgui = (S1->Surface()).Value(SolDep(1),SolDep(2));
|
|
Rtemp = SolDep(1);
|
|
SolDep(1) = SolDep(3);
|
|
SolDep(3) = Rtemp;
|
|
Rtemp = SolDep(2);
|
|
SolDep(2) = SolDep(4);
|
|
SolDep(4) = Rtemp;
|
|
Func.Set(Par);
|
|
|
|
Func.Tangent(SolDep(1),SolDep(2),SolDep(3),SolDep(4),TgF,TgL,tmp1,tmp2);
|
|
|
|
Standard_Boolean rev1 = Standard_False;
|
|
Standard_Boolean rev2 = Standard_False;
|
|
Standard_Real sign = (TgF.Crossed(d1gui)).Dot(TgL);
|
|
|
|
if( Ch%2 == 1 )
|
|
rev1 = Standard_True;
|
|
else
|
|
rev2 = Standard_True;
|
|
|
|
if( sign < 0. ){
|
|
rev1 = !rev1;
|
|
rev2 = !rev2;
|
|
}
|
|
|
|
if( rev1 )
|
|
TgF.Reverse();
|
|
if( rev2 )
|
|
TgL.Reverse();
|
|
|
|
temp = (TgF.XYZ()).Multiplied(dis1);
|
|
pt1.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
|
|
Standard_Real dis2, tmpcos, tmpsin;
|
|
tmpcos = TgF.Dot(TgL);
|
|
tmpsin = sqrt(1. - tmpcos * tmpcos);
|
|
|
|
dis2 = dis1 / (tmpcos + tmpsin / tan(angle));
|
|
|
|
temp = (TgL.XYZ()).Multiplied(dis2);
|
|
pt2.SetXYZ( (ptgui.XYZ()).Added(temp) );
|
|
|
|
Standard_Real tol = tolesp*1.e2;
|
|
// Standard_Real u,v;
|
|
Extrema_GenLocateExtPS proj1(pt1,S2->Surface(),SolDep(1),SolDep(2),tol,tol);
|
|
Extrema_GenLocateExtPS proj2(pt2,S1->Surface(),SolDep(3),SolDep(4),tol,tol);
|
|
if( proj1.IsDone() ) {
|
|
(proj1.Point()).Parameter(SolDep(1),SolDep(2));
|
|
}
|
|
if( proj2.IsDone() ){
|
|
(proj2.Point()).Parameter(SolDep(3),SolDep(4));
|
|
}
|
|
|
|
Standard_Boolean RetWalk = TheWalk.PerformFirstSection(Func,Par,SolDep,
|
|
tolesp,TolGuide,Pos2,Pos1);
|
|
Rtemp = SolDep(1);
|
|
SolDep(1) = SolDep(3);
|
|
SolDep(3) = Rtemp;
|
|
Rtemp = SolDep(2);
|
|
SolDep(2) = SolDep(4);
|
|
SolDep(4) = Rtemp;
|
|
|
|
return RetWalk;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : PerformSurf
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
Standard_Boolean
|
|
ChFi3d_ChBuilder::PerformSurf(ChFiDS_SequenceOfSurfData& SeqData,
|
|
const Handle(ChFiDS_HElSpine)& HGuide,
|
|
const Handle(ChFiDS_Spine)& Spine,
|
|
const Standard_Integer Choix,
|
|
const Handle(BRepAdaptor_HSurface)& S1,
|
|
const Handle(Adaptor3d_TopolTool)& I1,
|
|
const Handle(BRepAdaptor_HSurface)& S2,
|
|
const Handle(Adaptor3d_TopolTool)& I2,
|
|
const Standard_Real MaxStep,
|
|
const Standard_Real Fleche,
|
|
const Standard_Real TolGuide,
|
|
Standard_Real& First,
|
|
Standard_Real& Last,
|
|
const Standard_Boolean Inside,
|
|
const Standard_Boolean Appro,
|
|
const Standard_Boolean Forward,
|
|
const Standard_Boolean RecOnS1,
|
|
const Standard_Boolean RecOnS2,
|
|
const math_Vector& Soldep,
|
|
Standard_Boolean& intf,
|
|
Standard_Boolean& intl)
|
|
|
|
{
|
|
Handle(ChFiDS_SurfData) Data = SeqData(1);
|
|
Handle(ChFiDS_ChamfSpine)
|
|
chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Spine);
|
|
|
|
if (chsp.IsNull())
|
|
Standard_ConstructionError::Raise
|
|
("PerformSurf : this is not the spine of a chamfer");
|
|
|
|
Standard_Boolean gd1,gd2,gf1,gf2;
|
|
Handle(BRepBlend_Line) lin;
|
|
TopAbs_Orientation Or = S1->ChangeSurface().Face().Orientation();
|
|
Standard_Real PFirst = First;
|
|
if(intf) First = chsp->FirstParameter(1);
|
|
if(intl) Last = chsp->LastParameter(chsp->NbEdges());
|
|
|
|
if (chsp->IsChamfer() == ChFiDS_Sym) {
|
|
BRepBlend_Chamfer Func(S1,S2,HGuide);
|
|
BRepBlend_ChamfInv FInv(S1,S2,HGuide);
|
|
Standard_Real dis;
|
|
chsp->GetDist(dis);
|
|
Func.Set(dis, dis, Choix);
|
|
FInv.Set(dis, dis, Choix);
|
|
|
|
done = ComputeData(Data,HGuide,Spine,lin,S1,I1,S2,I2,Func,FInv,
|
|
PFirst,MaxStep,Fleche,TolGuide,First,Last,
|
|
Inside,Appro,Forward,Soldep,intf,intl,
|
|
gd1,gd2,gf1,gf2,RecOnS1,RecOnS2);
|
|
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
|
|
done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
|
|
if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
|
|
}
|
|
else if (chsp->IsChamfer() == ChFiDS_TwoDist) {
|
|
BRepBlend_Chamfer Func(S1,S2,HGuide);
|
|
BRepBlend_ChamfInv FInv(S1,S2,HGuide);
|
|
Standard_Real d1, d2;
|
|
chsp->Dists(d1,d2);
|
|
Func.Set(d1,d2,Choix);
|
|
FInv.Set(d1,d2,Choix);
|
|
|
|
done = ComputeData(Data,HGuide,Spine,lin,S1,I1,S2,I2,Func,FInv,
|
|
PFirst,MaxStep,Fleche,TolGuide,First,Last,
|
|
Inside,Appro,Forward,Soldep,intf,intl,
|
|
gd1,gd2,gf1,gf2,RecOnS1,RecOnS2);
|
|
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
|
|
done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
|
|
if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
|
|
}
|
|
else {
|
|
Standard_Real d1, angle;
|
|
Standard_Boolean disonF1;
|
|
chsp->GetDistAngle(d1, angle, disonF1);
|
|
|
|
Standard_Integer Ch = FindChoiceDistAngle(Choix, disonF1);
|
|
|
|
if (disonF1) {
|
|
BRepBlend_ChAsym Func(S1,S2,HGuide);
|
|
BRepBlend_ChAsymInv FInv(S1,S2,HGuide);
|
|
Func.Set(d1, angle, Ch);
|
|
FInv.Set(d1, angle, Ch);
|
|
|
|
done = ComputeData(Data,HGuide,Spine,lin,S1,I1,S2,I2,Func,FInv,
|
|
PFirst,MaxStep,Fleche,TolGuide,First,Last,
|
|
Inside,Appro,Forward,Soldep,intf,intl,
|
|
gd1,gd2,gf1,gf2,RecOnS1,RecOnS2);
|
|
|
|
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
|
|
done = CompleteData(Data,Func,lin,S1,S2,Or,gd1,gd2,gf1,gf2);
|
|
if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
|
|
}
|
|
else {
|
|
Standard_Real Rtemp;
|
|
BRepBlend_ChAsym Func(S2, S1, HGuide);
|
|
BRepBlend_ChAsymInv FInv(S2, S1,HGuide);
|
|
Func.Set(d1, angle, Ch);
|
|
FInv.Set(d1, angle, Ch);
|
|
|
|
Rtemp = Soldep(1);
|
|
Soldep(1) = Soldep(3);
|
|
Soldep(3) = Rtemp;
|
|
Rtemp = Soldep(2);
|
|
Soldep(2) = Soldep(4);
|
|
Soldep(4) = Rtemp;
|
|
|
|
TopAbs_Orientation Or2 = S2->ChangeSurface().Face().Orientation();
|
|
|
|
done = ComputeData(Data,HGuide,Spine,lin,S2,I2,S1,I1,Func,FInv,
|
|
PFirst,MaxStep,Fleche,TolGuide,First,Last,
|
|
Inside,Appro,Forward,Soldep,intf,intl,
|
|
gd2,gd1,gf2,gf1,RecOnS2,RecOnS1);
|
|
|
|
ChFiDS_CommonPoint tmp = Data->VertexFirstOnS1();
|
|
Data->ChangeVertexFirstOnS1() = Data->VertexFirstOnS2();
|
|
Data->ChangeVertexFirstOnS2() = tmp;
|
|
tmp = Data->VertexLastOnS1();
|
|
Data->ChangeVertexLastOnS1() = Data->VertexLastOnS2();
|
|
Data->ChangeVertexLastOnS2() = tmp;
|
|
if(!done) return Standard_False; // ratrappage possible PMN 14/05/1998
|
|
done = CompleteData(Data,Func,lin,S1,S2,Or2,gd1,gd2,gf1,gf2, Standard_True);
|
|
if(!done) Standard_Failure::Raise("PerformSurf : Fail of approximation!");
|
|
}
|
|
|
|
}
|
|
return Standard_True;
|
|
}
|
|
void ChFi3d_ChBuilder::PerformSurf(ChFiDS_SequenceOfSurfData& ,
|
|
const Handle(ChFiDS_HElSpine)& ,
|
|
const Handle(ChFiDS_Spine)& ,
|
|
const Standard_Integer ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const TopAbs_Orientation ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
Standard_Real& ,
|
|
Standard_Real& ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const math_Vector& )
|
|
{
|
|
Standard_Failure::Raise("PerformSurf Not Implemented");
|
|
}
|
|
void ChFi3d_ChBuilder::PerformSurf(ChFiDS_SequenceOfSurfData& ,
|
|
const Handle(ChFiDS_HElSpine)& ,
|
|
const Handle(ChFiDS_Spine)& ,
|
|
const Standard_Integer ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const TopAbs_Orientation ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
Standard_Real& ,
|
|
Standard_Real& ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const math_Vector& )
|
|
{
|
|
Standard_Failure::Raise("PerformSurf Not Implemented");
|
|
|
|
}
|
|
void ChFi3d_ChBuilder::PerformSurf(ChFiDS_SequenceOfSurfData& ,
|
|
const Handle(ChFiDS_HElSpine)& ,
|
|
const Handle(ChFiDS_Spine)& ,
|
|
const Standard_Integer ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const TopAbs_Orientation ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(Adaptor3d_TopolTool)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
const Handle(BRepAdaptor_HSurface)& ,
|
|
const Handle(BRepAdaptor_HCurve2d)& ,
|
|
Standard_Boolean& ,
|
|
const TopAbs_Orientation ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
const Standard_Real ,
|
|
Standard_Real& ,
|
|
Standard_Real& ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const Standard_Boolean ,
|
|
const math_Vector& )
|
|
{
|
|
Standard_Failure::Raise("PerformSurf Not Implemented");
|
|
|
|
}
|
|
//=======================================================================
|
|
//function : ExtentOneCorner
|
|
//purpose : extends the spine of the stripe S on the side of the vertex V
|
|
// PMN : 28/11/97 : Reproduces the code of fillets, and it seems to work better...
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::ExtentOneCorner(const TopoDS_Vertex& V,
|
|
const Handle(ChFiDS_Stripe)& S)
|
|
{
|
|
Standard_Integer Sens = 0;
|
|
Standard_Real Coeff = 0.5;
|
|
Handle(ChFiDS_Spine) Spine = S->Spine();
|
|
ChFi3d_IndexOfSurfData(V,S,Sens);
|
|
if (Spine->IsTangencyExtremity((Sens == 1))) return; //No extension on queue
|
|
Standard_Real dU = Spine->LastParameter(Spine->NbEdges());
|
|
if (Sens == 1) {
|
|
Spine->SetFirstParameter(-dU*Coeff);
|
|
Spine->SetFirstTgt(0.);
|
|
}
|
|
else {
|
|
Spine->SetLastParameter(dU*(1.+Coeff));
|
|
Spine->SetLastTgt(dU);
|
|
}
|
|
/*
|
|
Standard_Integer Sens;
|
|
Standard_Boolean isfirst;
|
|
Standard_Integer Iedge = 1;
|
|
Standard_Real d1, d2;
|
|
|
|
Handle(ChFiDS_Spine) Spine = S->Spine();
|
|
Handle(ChFiDS_ChamfSpine)
|
|
chsp = Handle(ChFiDS_ChamfSpine)::DownCast(Spine);
|
|
chsp->Dists(d1,d2);
|
|
Standard_Integer IE = ChFi3d_IndexOfSurfData(V,S,Sens);
|
|
isfirst = (Sens == 1);
|
|
if (!isfirst)
|
|
Iedge = Spine->NbEdges();
|
|
|
|
TopTools_ListIteratorOfListOfShape It, Jt;
|
|
TopoDS_Edge E1, E2, Ec;
|
|
TopoDS_Face F1, F2, Fc;
|
|
TopoDS_Edge EdgeSp = Spine->Edges(Iedge);
|
|
|
|
ConexFaces(Spine,Iedge,F1,F2);
|
|
|
|
for (Jt.Initialize(myVEMap(V));Jt.More();Jt.Next()) {
|
|
Ec = TopoDS::Edge(Jt.Value());
|
|
if (!Ec.IsSame(EdgeSp)){
|
|
for (It.Initialize(myEFMap(Ec));It.More();It.Next()) {
|
|
Fc = TopoDS::Face(It.Value());
|
|
if (Fc.IsSame(F1))
|
|
E1 = Ec;
|
|
else if (Fc.IsSame(F2))
|
|
E2 = Ec;
|
|
}
|
|
}
|
|
}
|
|
|
|
gp_Vec tg1, tg2, tgsp;
|
|
gp_Pnt tmp, ptgui;
|
|
Spine->D1(Spine->Absc(V),ptgui,tgsp);
|
|
if (isfirst)
|
|
tgsp.Reverse();
|
|
|
|
// tg1
|
|
BRepAdaptor_Curve curv;
|
|
curv.Initialize(E1);
|
|
curv.D1(curv.FirstParameter(),tmp,tg1); //pour eviter les projections
|
|
tg1.Reverse();
|
|
// pbm d'erreurs d'approx : baisser la tolerance
|
|
if( !tmp.IsEqual(ptgui,tolesp*1.e2) )
|
|
curv.D1(curv.LastParameter(),tmp,tg1);
|
|
|
|
// tg2
|
|
curv.Initialize(E2);
|
|
curv.D1(curv.FirstParameter(),tmp,tg2);
|
|
tg2.Reverse();
|
|
if( !tmp.IsEqual(ptgui,tolesp*1.e2) )
|
|
curv.D1(curv.LastParameter(),tmp,tg2);
|
|
|
|
// calcul de dspine
|
|
Standard_Real dspine;
|
|
Standard_Real d1plus = 0.;
|
|
Standard_Real d2plus = 0.;
|
|
|
|
Standard_Real sinalpha = tg1.Dot(tgsp);
|
|
if (sinalpha < 0.){
|
|
Standard_Real cosalpha = Sqrt(1 - sinalpha*sinalpha);
|
|
d1plus = -d1*sinalpha/cosalpha;
|
|
}
|
|
sinalpha = tg2.Dot(tgsp);
|
|
if (sinalpha < 0.){
|
|
Standard_Real cosalpha = Sqrt(1 - sinalpha*sinalpha);
|
|
d2plus = -d2*sinalpha/cosalpha;
|
|
}
|
|
dspine = d1plus;
|
|
if (d2plus > d1plus)
|
|
dspine = d2plus;
|
|
|
|
dspine *=1.5;
|
|
|
|
// ExtentOneCorner
|
|
if (isfirst) {
|
|
Spine->SetFirstParameter(-dspine);
|
|
Spine->SetFirstTgt(0.);
|
|
}
|
|
else{
|
|
Standard_Real param = Spine->LastParameter(Spine->NbEdges());
|
|
Spine->SetLastParameter(param+dspine);
|
|
Spine->SetLastTgt(param);
|
|
} */
|
|
}
|
|
|
|
|
|
|
|
//=======================================================================
|
|
//function : ExtentTwoCorner
|
|
//purpose : extends the spines of the stripes contained in the list LS,
|
|
// on the side of the vertex V
|
|
//=======================================================================
|
|
|
|
|
|
void ChFi3d_ChBuilder::ExtentTwoCorner(const TopoDS_Vertex& V,
|
|
const ChFiDS_ListOfStripe& LS)
|
|
{
|
|
Standard_Integer Sens = 0;
|
|
ChFiDS_ListIteratorOfListOfStripe itel(LS);
|
|
Standard_Boolean FF = Standard_True;
|
|
Standard_Boolean isfirst[2];
|
|
Standard_Integer Iedge[2];
|
|
Iedge[0] = 1;
|
|
Iedge[1] = 1;
|
|
Handle(ChFiDS_Stripe) Stripe[2];
|
|
Handle(ChFiDS_Spine) Spine[2];
|
|
|
|
Standard_Integer i = 0;
|
|
for (; itel.More(); itel.Next(),i++) {
|
|
ChFi3d_IndexOfSurfData(V,itel.Value(),Sens);
|
|
if (!FF)
|
|
if ( Stripe[1] == itel.Value())
|
|
Sens = -Sens;
|
|
|
|
Stripe[i] = itel.Value();
|
|
isfirst[i] = (Sens == 1);
|
|
Spine[i] = Stripe[i]->Spine();
|
|
if( !isfirst[i] )
|
|
Iedge[i] = Spine[i]->NbEdges();
|
|
FF = Standard_False;
|
|
}
|
|
|
|
|
|
Handle(ChFiDS_ChamfSpine) chsp[2];
|
|
Standard_Real d[4], dis[2];
|
|
Standard_Integer j;
|
|
TopoDS_Face F[4];
|
|
Standard_Real tmpang, tmd;
|
|
Standard_Boolean disonF1;
|
|
|
|
|
|
for (i=0, j=0; i<2; i++, j += 2) {
|
|
chsp[i] = Handle(ChFiDS_ChamfSpine)::DownCast(Spine[i]);
|
|
ConexFaces(Spine[i],Iedge[i],F[j],F[j+1]);
|
|
|
|
if (chsp[i]->IsChamfer() == ChFiDS_Sym) {
|
|
chsp[i]->GetDist(d[j]);
|
|
d[j+1] = d[j];
|
|
}
|
|
else if (chsp[i]->IsChamfer() == ChFiDS_TwoDist) {
|
|
chsp[i]->Dists(d[j],d[j+1]);
|
|
}
|
|
else {
|
|
chsp[i]->GetDistAngle(tmd, tmpang, disonF1);
|
|
// an approximate calculation of distance 2 is done
|
|
if (disonF1) {
|
|
d[j] = tmd;
|
|
d[j+1] = tmd * tan(tmpang);
|
|
}
|
|
else
|
|
{
|
|
d[j] = tmd * tan(tmpang);
|
|
d[j+1] = tmd;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
Standard_Boolean notfound = Standard_True;
|
|
i = 0;
|
|
while (notfound && (i<2)) {
|
|
j = 0;
|
|
while (notfound && (j<2)) {
|
|
if (F[i].IsSame(F[j+2])) {
|
|
dis[0] = d[i];
|
|
// dOnArc[0] = d[(i+1)%2];
|
|
|
|
dis[1] = d[j + 2];
|
|
// dOnArc[1] = d[(j+1)%2 + 2];
|
|
notfound = Standard_False;
|
|
}
|
|
j++;
|
|
}
|
|
i++;
|
|
}
|
|
// ExtentTwoCorner
|
|
|
|
ChFiDS_State State[2];
|
|
|
|
for (i=0; i<2; i++) {
|
|
if (isfirst[i])
|
|
State[i] = Spine[i]->FirstStatus();
|
|
else
|
|
State[i] = Spine[i]->LastStatus();
|
|
}
|
|
|
|
if (State[0] == ChFiDS_AllSame ){
|
|
/*
|
|
// The greatest intersection of the chamfer is found (on the incident edge)
|
|
// with the face at end
|
|
i = 0;
|
|
j = 1;
|
|
if(dOnArc[j] > dOnArc[i]) {
|
|
Standard_Integer temp = i;
|
|
i = j;
|
|
j = temp;
|
|
}
|
|
ExtentOneCorner( V, Stripe[i] ); */
|
|
|
|
// it is necessary that two chamfers touch the face at end
|
|
for (j=0; j<2; j++)
|
|
ExtentOneCorner( V, Stripe[j] );
|
|
}
|
|
else if ((State[0] == ChFiDS_OnSame) && (State[1] == ChFiDS_OnSame)) {
|
|
|
|
ExtentSpineOnCommonFace(Spine[0],Spine[1],V,dis[0],dis[1],
|
|
isfirst[0],isfirst[1]);
|
|
}
|
|
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : ExtentThreeCorner
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::ExtentThreeCorner(const TopoDS_Vertex& V,
|
|
const ChFiDS_ListOfStripe& LS)
|
|
{
|
|
Standard_Integer Sens = 0;
|
|
ChFiDS_ListOfStripe check;
|
|
Standard_Boolean isfirst[3];
|
|
Standard_Integer Iedge[3];
|
|
Iedge[0] = 1;
|
|
Iedge[1] = 1;
|
|
Iedge[2] = 1;
|
|
Handle(ChFiDS_Spine) Spine[3];
|
|
|
|
Standard_Integer i = 0;
|
|
for(ChFiDS_ListIteratorOfListOfStripe itel(LS); itel.More(); itel.Next(), i++) {
|
|
Handle(ChFiDS_Stripe) Stripe = itel.Value();
|
|
ChFi3d_IndexOfSurfData(V,Stripe,Sens);
|
|
for(ChFiDS_ListIteratorOfListOfStripe ich(check); ich.More(); ich.Next()){
|
|
if(Stripe == ich.Value()){
|
|
Sens = -Sens;
|
|
break;
|
|
}
|
|
}
|
|
|
|
isfirst[i] = (Sens == 1);
|
|
Spine[i] = Stripe->Spine();
|
|
if( !isfirst[i] )
|
|
Iedge[i] = Spine[i]->NbEdges();
|
|
|
|
check.Append(Stripe);
|
|
}
|
|
|
|
Standard_Real d[3][2], tmd, tmpangle;
|
|
Standard_Boolean disonF1;
|
|
Standard_Integer j;
|
|
TopoDS_Face F[3][2];
|
|
|
|
Handle(ChFiDS_ChamfSpine) chsp[3];
|
|
|
|
for (i=0; i<3; i++) {
|
|
chsp[i] = Handle(ChFiDS_ChamfSpine)::DownCast(Spine[i]);
|
|
ConexFaces(Spine[i],Iedge[i],F[i][0],F[i][1]);
|
|
|
|
if (chsp[i]->IsChamfer() == ChFiDS_Sym) {
|
|
chsp[i]->GetDist(d[i][0]);
|
|
d[i][1] = d[i][0];
|
|
}
|
|
else if (chsp[i]->IsChamfer() == ChFiDS_TwoDist) {
|
|
chsp[i]->Dists(d[i][0],d[i][1]);
|
|
}
|
|
else {
|
|
chsp[i]->GetDistAngle(tmd, tmpangle, disonF1);
|
|
// an approximate calculation of distance 2 is done
|
|
|
|
if (disonF1) {
|
|
d[i][0] = tmd;
|
|
d[i][1] = tmd * tan(tmpangle);
|
|
}
|
|
else {
|
|
d[i][0] = tmd * tan(tmpangle);
|
|
d[i][1] = tmd;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
// dis[i][j] distance from chamfer i on the common face with
|
|
// chamfer j
|
|
Standard_Real dis[3][3];
|
|
|
|
for (i=0; i<3; i++) {
|
|
// for (Standard_Integer ii=0; ii<3; ii++) {
|
|
// j = (i+ii)%3;
|
|
j = (i+1)%3;
|
|
Standard_Boolean notfound = Standard_True;
|
|
Standard_Integer k, l;
|
|
k = 0;
|
|
while (notfound && (k<2)) {
|
|
l = 0;
|
|
while (notfound && (l<2)) {
|
|
if (F[i][k].IsSame(F[j][l])) {
|
|
dis[i][j] = d[i][k];
|
|
dis[j][i] = d[j][l];
|
|
notfound = Standard_False;
|
|
}
|
|
l++;
|
|
}
|
|
k++;
|
|
}
|
|
// }
|
|
}
|
|
|
|
//ExtentThreeCorner
|
|
for (i=0; i<3; i++) {
|
|
j = (i+1)%3;
|
|
ExtentSpineOnCommonFace(Spine[i],Spine[j],V,dis[i][j],dis[j][i],
|
|
isfirst[i],isfirst[j]);
|
|
}
|
|
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : SetRegul
|
|
//purpose :
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::SetRegul()
|
|
|
|
{
|
|
ChFiDS_ListIteratorOfRegularities it;
|
|
TopTools_ListIteratorOfListOfShape itc;
|
|
TopTools_ListIteratorOfListOfShape its1;
|
|
TopTools_ListIteratorOfListOfShape its2;
|
|
BRepAdaptor_Surface S;
|
|
BRepAdaptor_Curve2d PC;
|
|
Standard_Real u,v,t;
|
|
gp_Pnt p;
|
|
gp_Vec n1,n2,du,dv;
|
|
BRep_Builder B;
|
|
Standard_Real Seuil = M_PI/360.;
|
|
Standard_Real Seuil2 = Seuil * Seuil;
|
|
for (it.Initialize(myRegul); it.More(); it.Next()){
|
|
const ChFiDS_Regul& reg = it.Value();
|
|
itc.Initialize(myCoup->NewEdges(reg.Curve()));
|
|
if(itc.More()){
|
|
TopoDS_Edge E = TopoDS::Edge(itc.Value());
|
|
if(reg.IsSurface1() && reg.IsSurface2()){
|
|
its1.Initialize(myCoup->NewFaces(reg.S1()));
|
|
its2.Initialize(myCoup->NewFaces(reg.S2()));
|
|
if(its1.More() && its2.More()){
|
|
TopoDS_Face F1 = TopoDS::Face(its1.Value());
|
|
TopoDS_Face F2 = TopoDS::Face(its2.Value());
|
|
S.Initialize(F1,Standard_False);
|
|
PC.Initialize(E,F1);
|
|
t = 0.5*(PC.FirstParameter() + PC.LastParameter());
|
|
PC.Value(t).Coord(u,v);
|
|
S.D1(u,v,p,du,dv);
|
|
n1 = du.Crossed(dv);
|
|
|
|
S.Initialize(F2,Standard_False);
|
|
PC.Initialize(E,F2);
|
|
PC.Value(t).Coord(u,v);
|
|
S.D1(u,v,p,du,dv);
|
|
n2 = du.Crossed(dv);
|
|
|
|
if(n1.SquareMagnitude() > 1.e-14 && n2.SquareMagnitude() > 1.e-14){
|
|
n1.Normalize();
|
|
n2.Normalize();
|
|
Standard_Real sina2 = n1.Crossed(n2).SquareMagnitude();
|
|
if(sina2 < Seuil2) {
|
|
GeomAbs_Shape cont = ChFi3d_evalconti(E,F1,F2);
|
|
B.Continuity(E,F1,F2,cont);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//=======================================================================
|
|
//function : ConexFaces
|
|
//purpose : F1, F2 are connected to edge so that F1 corresponds to distance
|
|
//=======================================================================
|
|
|
|
void ChFi3d_ChBuilder::ConexFaces (const Handle(ChFiDS_Spine)& Spine,
|
|
const Standard_Integer IEdge,
|
|
TopoDS_Face& F1,
|
|
TopoDS_Face& F2) const
|
|
{
|
|
BRepAdaptor_Surface Sb1,Sb2;
|
|
TopAbs_Orientation tmp1,tmp2;
|
|
Standard_Integer RC,Choix;
|
|
TopoDS_Face f1,f2,ff1,ff2;
|
|
|
|
//calculate the reference orientation
|
|
// ChFi3d_Builder::StripeOrientations is private
|
|
SearchCommonFaces(myEFMap,Spine->Edges(1),ff1,ff2);
|
|
ff1.Orientation(TopAbs_FORWARD);
|
|
Sb1.Initialize(ff1);
|
|
ff2.Orientation(TopAbs_FORWARD);
|
|
Sb2.Initialize(ff2);
|
|
RC = ChFi3d::ConcaveSide(Sb1,Sb2,Spine->Edges(1),tmp1,tmp2);
|
|
|
|
//calculate the connected faces
|
|
SearchCommonFaces(myEFMap,Spine->Edges(IEdge),f1,f2);
|
|
Sb1.Initialize(f1);
|
|
Sb2.Initialize(f2);
|
|
Choix = ChFi3d::ConcaveSide(Sb1,Sb2,Spine->Edges(IEdge),tmp1,tmp2);
|
|
|
|
if (RC%2 != Choix%2) {
|
|
F1 = f2;
|
|
F2 = f1;
|
|
}
|
|
else {
|
|
F1 = f1;
|
|
F2 = f2;
|
|
}
|
|
}
|
|
|
|
|
|
//=======================================================================
|
|
//function : FindChoiceDistAngle
|
|
//purpose : F1, F2 connected to the edge so that F1 corresponds to distance
|
|
//=======================================================================
|
|
|
|
Standard_Integer ChFi3d_ChBuilder::FindChoiceDistAngle(const Standard_Integer Choice,
|
|
const Standard_Boolean DisOnF1) const
|
|
{
|
|
Standard_Integer ch = 0;
|
|
if (!DisOnF1) {
|
|
|
|
switch (Choice) {
|
|
case 1 : ch = 2;
|
|
break;
|
|
case 2 : ch = 1;
|
|
break;
|
|
case 3 : ch = 8;
|
|
break;
|
|
case 4 : ch = 7;
|
|
break;
|
|
case 5 : ch = 6;
|
|
break;
|
|
case 6 : ch = 5;
|
|
break;
|
|
case 7 : ch = 4;
|
|
break;
|
|
case 8 : ch = 3;
|
|
break;
|
|
}
|
|
|
|
}
|
|
else
|
|
ch = Choice;
|
|
|
|
return ch;
|
|
}
|