1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-01 10:26:12 +03:00
occt/src/TopOpeBRepBuild/TopOpeBRepBuild_PaveSet.cxx
abv 1d0a9d4d46 0023664: Eliminate linker warnings on import of local symbol
Standard_IMPORT removed or replaced by 'export' where it applies to a symbol defined in the same toolkit
2013-02-01 15:42:05 +04:00

471 lines
14 KiB
C++
Executable File

// Created on: 1993-06-17
// Created by: Jean Yves LEBEY
// Copyright (c) 1993-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 <TopOpeBRepBuild_PaveSet.ixx>
#include <TopoDS.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopExp_Explorer.hxx>
#include <Precision.hxx>
#include <Geom_Curve.hxx>
#include <BRep_Tool.hxx>
#include <TCollection_AsciiString.hxx>
#include <TopExp.hxx>
#include <gp_Pnt.hxx>
#ifdef DEB
extern Standard_Boolean TopOpeBRepTool_GettraceVC();
#include <TopOpeBRepBuild_Builder.hxx>
#include <gp_Pnt.hxx>
#endif
//=======================================================================
//function : TopOpeBRepBuild_PaveSet
//purpose :
//=======================================================================
TopOpeBRepBuild_PaveSet::TopOpeBRepBuild_PaveSet(const TopoDS_Shape& E) :
myEdge(TopoDS::Edge(E)),
myHasEqualParameters(Standard_False),
myClosed(Standard_False),
myPrepareDone(Standard_False),
myRemovePV(Standard_True)
{
}
//=======================================================================
//function : RemovePV
//purpose :
//=======================================================================
void TopOpeBRepBuild_PaveSet::RemovePV(const Standard_Boolean B)
{
myRemovePV = B;
}
//=======================================================================
//function : Append
//purpose :
//=======================================================================
void TopOpeBRepBuild_PaveSet::Append
(const Handle(TopOpeBRepBuild_Pave)& PV)
{
myVertices.Append(PV);
myPrepareDone = Standard_False;
}
#include <TColStd_HArray1OfBoolean.hxx>
#include <TColStd_Array1OfBoolean.hxx>
//=======================================================================
//function : SortPave
//purpose :
//=======================================================================
void TopOpeBRepBuild_PaveSet::SortPave(const TopOpeBRepBuild_ListOfPave& List,
TopOpeBRepBuild_ListOfPave& SortedList)
{
// NYI : sort a list o Items, giving a sorting function is impossible
// NYI : --> foobar method complexity n2.
Standard_Integer iPV=0,nPV = List.Extent();
Handle(TColStd_HArray1OfBoolean) HT =
new TColStd_HArray1OfBoolean(0,nPV,Standard_False);
TColStd_Array1OfBoolean& T = HT->ChangeArray1();
Handle(TopOpeBRepBuild_Pave) PV1;
for (Standard_Integer i = 1; i <= nPV; i++) {
Standard_Real parmin = RealLast();
TopOpeBRepBuild_ListIteratorOfListOfPave it(List);
for (Standard_Integer itest = 1; it.More(); it.Next(),itest++) {
if ( ! T(itest) ) {
const Handle(TopOpeBRepBuild_Pave)& PV2 = it.Value();
Standard_Real par = PV2->Parameter();
if (par < parmin) {
parmin = par;
PV1 = PV2;
iPV = itest;
}
}
}
SortedList.Append(PV1);
T(iPV) = Standard_True;
}
// tete = FORWARD
// modifier TopOpeBRepBuild_DataStructure::SortOnParameter
Standard_Boolean found = Standard_False;
TopOpeBRepBuild_ListIteratorOfListOfPave it(SortedList);
TopOpeBRepBuild_ListOfPave L1,L2;
for (; it.More(); it.Next() ) {
const Handle(TopOpeBRepBuild_Pave)& PV = it.Value();
if ( ! found) {
TopAbs_Orientation o = PV->Vertex().Orientation();
if (o == TopAbs_FORWARD) {
found = Standard_True;
L1.Append(PV);
}
else L2.Append(PV);
}
else L1.Append(PV);
}
SortedList.Clear();
SortedList.Append(L1);
SortedList.Append(L2);
}
static Standard_Boolean FUN_islook(const TopoDS_Edge& e)
{
TopoDS_Vertex v1,v2;
TopExp::Vertices(e,v1,v2);
gp_Pnt p1 = BRep_Tool::Pnt(v1);
gp_Pnt p2 = BRep_Tool::Pnt(v2);
Standard_Real dp1p2 = p1.Distance(p2);
Standard_Boolean islook = (Abs(dp1p2) > 1.e-8) ? Standard_True : Standard_False;
return islook;
}
//=======================================================================
//function : Prepare
//purpose :
//=======================================================================
void TopOpeBRepBuild_PaveSet::Prepare()
{
// add the edge vertices to the list of interference
// if an edge vertex VE is already in the list as interference VI :
// - do not add VE in the list,
// - if VI is INTERNAL, set VI orientation to VE orientation.
// - remove VI from the list if :
// VI is EXTERNAL or VE and VI have opposite orientations.
//
if (myPrepareDone) {
return;
}
#ifdef DEB
Standard_Boolean trc = Standard_False;
trc = trc || TopOpeBRepTool_GettraceVC();
Standard_Integer iv=0;//,nv=myVertices.Extent();
if (trc) {
TopOpeBRepBuild_ListIteratorOfListOfPave itd(myVertices);
cout<<endl;
for(;itd.More();itd.Next() ) {
const Handle(TopOpeBRepBuild_Pave)& PV = itd.Value();
TopoDS_Vertex& VI = TopoDS::Vertex(PV->ChangeVertex());
Standard_Boolean hasVSD = PV->HasSameDomain();
TopoDS_Vertex VSD; if (hasVSD) VSD = TopoDS::Vertex(PV->SameDomain());
TopAbs_Orientation VIori = VI.Orientation();
Standard_Real p = PV->Parameter();
cout<<"pvs : v "<<++iv<<" par "<<p<<" ";TopAbs::Print(VIori,cout);cout<<endl;
}
}
#endif
Standard_Boolean isEd = BRep_Tool::Degenerated(myEdge);
Standard_Integer EdgeVertexCount = 0;
if (myRemovePV) { // jyl + 980217
TopExp_Explorer EVexp(myEdge,TopAbs_VERTEX);
for (; EVexp.More(); EVexp.Next() ) {
// VE = edge vertex
const TopoDS_Vertex& VE = TopoDS::Vertex(EVexp.Current());
TopAbs_Orientation VEori = VE.Orientation();
Standard_Boolean VEbound=(VEori==TopAbs_FORWARD)||(VEori==TopAbs_REVERSED);
Standard_Integer EdgeVertexIndex = 0;
Standard_Boolean addVE = Standard_True;
Standard_Boolean add = Standard_False;//ofv
TopOpeBRepBuild_ListIteratorOfListOfPave it(myVertices);
for(;it.More();it.Next() ) {
EdgeVertexIndex++; // skip edge vertices inserted at the head of the list
if (EdgeVertexIndex <= EdgeVertexCount) continue;
// PV = Parametrized vertex, VI = interference vertex
const Handle(TopOpeBRepBuild_Pave)& PV = it.Value();
TopoDS_Vertex& VI = TopoDS::Vertex(PV->ChangeVertex());
Standard_Boolean hasVSD = PV->HasSameDomain();
TopoDS_Vertex VSD; if (hasVSD) VSD = TopoDS::Vertex(PV->SameDomain());
TopAbs_Orientation VIori = VI.Orientation();
Standard_Boolean visameve = (VI.IsSame(VE));
Standard_Boolean vsdsameve = Standard_False;
if (hasVSD) vsdsameve = (VSD.IsSame(VE));
Standard_Boolean samevertexprocessing = (visameve || vsdsameve) && !isEd;
if (samevertexprocessing) {
// if (VEbound) { // xpu: 29-05-97
if (VEbound || vsdsameve) {
switch (VIori ) {
case TopAbs_EXTERNAL :
myVertices.Remove(it);
break;
case TopAbs_INTERNAL :
VI.Orientation(VEori);
break;
case TopAbs_FORWARD : case TopAbs_REVERSED :
//ofv:
//if (VIori != VEori) myVertices.Remove(it);
if (VIori != VEori)//ofv
{ myVertices.Remove(it);//ofv
Standard_Boolean islook = FUN_islook(myEdge);
if((VEbound && (vsdsameve ||visameve)) && islook) add = Standard_True;//ofv
}
break;
}
}
//ofv:
//addVE = Standard_False;
addVE = (!add) ? Standard_False : Standard_True;
break;
}
}
// if VE not found in the list, add it
if ( addVE ) {
Standard_Real parVE = BRep_Tool::Parameter(VE,myEdge);
Handle(TopOpeBRepBuild_Pave) newPV =
new TopOpeBRepBuild_Pave(VE,parVE,Standard_True);
myVertices.Prepend(newPV);
EdgeVertexCount++;
}
}
} // myRemovePV
Standard_Integer ll = myVertices.Extent();
// if no more interferences vertices, clear the list
if (ll == EdgeVertexCount) {
myVertices.Clear();
}
else if ( ll >= 2 ) {
// sort the parametrized vertices on Parameter() value.
TopOpeBRepBuild_ListOfPave List;
List = myVertices;
myVertices.Clear();
SortPave(List,myVertices);
}
#ifdef DEB
if ( TopOpeBRepTool_GettraceVC() ) {
myVerticesIt.Initialize(myVertices);
if ( MoreLoop() ) cout<<"--- PaveSet : Prepare"<<endl;
for (; MoreLoop(); NextLoop() ) {
const Handle(TopOpeBRepBuild_Pave)& PV =
*((Handle(TopOpeBRepBuild_Pave)*)&(Loop()));
const TopoDS_Vertex& v = TopoDS::Vertex(PV->Vertex());
Standard_Real p = PV->Parameter();
Standard_Boolean b = PV->IsShape();
TopOpeBRepBuild_Builder::GdumpORIPARPNT(v.Orientation(),p,BRep_Tool::Pnt(v));
if (b) cout<<" is bound"; else cout<<" is not bound";
cout<<endl;
}
}
#endif
myPrepareDone = Standard_True;
return;
}
//=======================================================================
//function : InitLoop
//purpose :
//=======================================================================
void TopOpeBRepBuild_PaveSet::InitLoop()
{
if ( ! myPrepareDone ) Prepare();
myVerticesIt.Initialize(myVertices);
}
//=======================================================================
//function : MoreLoop
//purpose :
//=======================================================================
Standard_Boolean TopOpeBRepBuild_PaveSet::MoreLoop()const
{
Standard_Boolean b = myVerticesIt.More();
return b;
}
//=======================================================================
//function : NextLoop
//purpose :
//=======================================================================
void TopOpeBRepBuild_PaveSet::NextLoop()
{
myVerticesIt.Next();
}
//=======================================================================
//function : Loop
//purpose :
//=======================================================================
const Handle(TopOpeBRepBuild_Loop)& TopOpeBRepBuild_PaveSet::Loop()const
{
const Handle(TopOpeBRepBuild_Loop)& L = myVerticesIt.Value();
return L;
}
//=======================================================================
//function : Edge
//purpose :
//=======================================================================
const TopoDS_Edge& TopOpeBRepBuild_PaveSet::Edge()const
{
return myEdge;
}
//=======================================================================
//function : HasEqualParameters
//purpose :
//=======================================================================
Standard_Boolean TopOpeBRepBuild_PaveSet::HasEqualParameters()
{
myHasEqualParameters = Standard_False;
TopOpeBRepBuild_ListIteratorOfListOfPave it1,it2;
Standard_Real p1,p2;
for (it1.Initialize(myVertices);
(! myHasEqualParameters ) && it1.More();
it1.Next()) {
const TopoDS_Shape& v1 = it1.Value()->Vertex();
p1 = it1.Value()->Parameter();
for (it2.Initialize(myVertices);
(! myHasEqualParameters ) && it2.More();
it2.Next()) {
const TopoDS_Shape& v2 = it2.Value()->Vertex();
if ( v2.IsEqual(v1) ) continue;
p2 = it2.Value()->Parameter();
Standard_Real d = Abs(p1-p2);
#ifdef DEB
if (TopOpeBRepTool_GettraceVC()) {
cout<<"VertexSet : p1,p2 d "<<p1<<","<<p2<<" "<<d<<endl;
}
#endif
if (d < Precision::PConfusion()) {
myHasEqualParameters = Standard_True;
myEqualParameters = p1;
}
}
}
if ( !myHasEqualParameters ) {
Standard_Boolean rd; Standard_Real f=0,l;
{
TopLoc_Location loc; Standard_Real ff,ll;
Handle(Geom_Curve) CmyEdge = BRep_Tool::Curve(myEdge,loc,ff,ll);
if ( CmyEdge.IsNull() ) rd = Standard_False;
else { f = ff; l = ll; rd = Standard_True; }
}
if (rd) {
for (it1.Initialize(myVertices);
(! myHasEqualParameters ) && it1.More();
it1.Next()) {
#ifdef DEB
// const TopoDS_Shape& v1 = it1.Value()->Vertex();
#endif
p1 = it1.Value()->Parameter();
Standard_Real d = Abs(p1-f);
if (d < Precision::PConfusion()) {
myHasEqualParameters = Standard_True;
myEqualParameters = f;
#ifdef DEB
if (TopOpeBRepTool_GettraceVC()) {
cout<<"=*=*=*=*=*=*=*=*=*=*=*=*=*=*"<<endl;
cout<<"PaveSet : p1,f d "<<p1<<","<<f<<" "<<d<<endl;
cout<<"=*=*=*=*=*=*=*=*=*=*=*=*=*=*"<<endl;
}
#endif
}
}
}
}
return myHasEqualParameters;
}
//=======================================================================
//function : EqualParameters
//purpose :
//=======================================================================
Standard_Real TopOpeBRepBuild_PaveSet::EqualParameters() const
{
if (myHasEqualParameters) {
return myEqualParameters;
}
else {
// raise NYI
}
return 0.; // windowsNT
}
//=======================================================================
//function : ClosedVertices
//purpose :
//=======================================================================
Standard_Boolean TopOpeBRepBuild_PaveSet::ClosedVertices()
{
if (myVertices.IsEmpty()) return Standard_False;
TopoDS_Shape Vmin,Vmax;
Standard_Real parmin = RealLast(), parmax = RealFirst();
for (TopOpeBRepBuild_ListIteratorOfListOfPave it(myVertices);
it.More();
it.Next()) {
const TopoDS_Shape& V = it.Value()->Vertex();
Standard_Real par = it.Value()->Parameter();
if (par > parmax) { Vmax = V; parmax = par; }
if (par < parmin) { Vmin = V; parmin = par; }
}
myClosed = Vmin.IsSame(Vmax);
return myClosed;
}