1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
|
// file: TopOpeBRepBuild_makeedges.cxx
// Created: Thu Mar 7 10:49:33 1996
// Author: Jean Yves LEBEY
// <jyl@meteox>
#include <TopOpeBRepBuild_Builder.ixx>
#include <TopExp.hxx>
#include <TopoDS.hxx>
#include <BRep_Tool.hxx>
#include <TopOpeBRepTool_TOOL.hxx>
#include <TopOpeBRepDS_EXPORT.hxx>
#include <TopOpeBRepBuild_define.hxx>
#ifdef DEB
Standard_IMPORT void debfillp(const Standard_Integer i);
Standard_EXPORT void debedbu(const Standard_Integer i) {cout<<"++ debedbu "<<i<<endl;}
#endif
#ifdef DRAW
#include <TopOpeBRepTool_DRAW.hxx>
#endif
//=======================================================================
//function : GPVSMakeEdges
//purpose :
//=======================================================================
void TopOpeBRepBuild_Builder::GPVSMakeEdges
(const TopoDS_Shape& EF,TopOpeBRepBuild_PaveSet& PVS,TopTools_ListOfShape& LOE) const
{
#ifdef DEB
Standard_Integer iE; Standard_Boolean tSPS = GtraceSPS(EF,iE);
if (tSPS) debfillp(iE);
#endif
TopOpeBRepBuild_PaveClassifier VCL(EF);
Standard_Boolean equalpar = PVS.HasEqualParameters();
if (equalpar) VCL.SetFirstParameter(PVS.EqualParameters());
PVS.InitLoop();
Standard_Boolean novertex = ( ! PVS.MoreLoop() );
#ifdef DEB
if(tSPS&&novertex)cout<<"#--- GPVSMakeEdges : no vertex from edge "<<iE<<endl;
#endif
if (novertex) return;
TopOpeBRepBuild_EdgeBuilder EDBU;
Standard_Boolean ForceClass = Standard_False;
EDBU.InitEdgeBuilder(PVS,VCL,ForceClass);
GEDBUMakeEdges(EF,EDBU,LOE);
} // GPVSMakeEdges
//=======================================================================
//function : GEDBUMakeEdges
//purpose :
//=======================================================================
void TopOpeBRepBuild_Builder::GEDBUMakeEdges
(const TopoDS_Shape& EF,TopOpeBRepBuild_EdgeBuilder& EDBU,TopTools_ListOfShape& LOE) const
{
#ifdef DEB
Standard_Integer iE; Standard_Boolean tSPS = GtraceSPS(EF,iE);
if(tSPS){cout<<endl;GdumpSHA(EF, (char *) "#--- GEDBUMakeEdges ");cout<<endl;}
if(tSPS){GdumpEDBU(EDBU);}
if(tSPS){debedbu(iE);}
#endif
TopoDS_Shape newEdge;
for (EDBU.InitEdge(); EDBU.MoreEdge(); EDBU.NextEdge()) {
Standard_Integer nloop = 0;
Standard_Boolean tosplit = Standard_False;
for (EDBU.InitVertex(); EDBU.MoreVertex(); EDBU.NextVertex()) nloop++;
// 0 ou 1 vertex sur edge courante => suppression edge
if ( nloop <= 1 ) continue;
myBuildTool.CopyEdge(EF,newEdge);
Standard_Integer nVF = 0, nVR = 0; // nb vertex FORWARD,REVERSED
TopoDS_Shape VF,VR; // gestion du bit Closed
VF.Nullify();
VR.Nullify();
for (EDBU.InitVertex(); EDBU.MoreVertex(); EDBU.NextVertex()) {
TopoDS_Shape V = EDBU.Vertex();
TopAbs_Orientation Vori = V.Orientation();
Standard_Boolean hassd = myDataStructure->HasSameDomain(V);
if (hassd) { // on prend le vertex reference de V
Standard_Integer iref = myDataStructure->SameDomainReference(V);
V = myDataStructure->Shape(iref);
V.Orientation(Vori);
}
TopAbs_Orientation oriV = V.Orientation();
if ( oriV == TopAbs_EXTERNAL ) continue;
Standard_Boolean equafound = Standard_False;
TopExp_Explorer exE(newEdge,TopAbs_VERTEX);
for (; exE.More(); exE.Next() ) {
const TopoDS_Shape& VE = exE.Current();
TopAbs_Orientation oriVE = VE.Orientation();
if ( V.IsEqual(VE) ) {
equafound = Standard_True;
break;
}
else if (oriVE == TopAbs_FORWARD || oriVE == TopAbs_REVERSED) {
if (oriV == oriVE) {
equafound = Standard_True;
break;
}
}
else if (oriVE == TopAbs_INTERNAL || oriVE == TopAbs_EXTERNAL) {
Standard_Real parV = EDBU.Parameter();
Standard_Real parVE = BRep_Tool::Parameter(TopoDS::Vertex(VE),TopoDS::Edge(newEdge));
if ( parV == parVE ) {
equafound = Standard_True;
break;
}
}
}
if ( !equafound ) {
if (Vori == TopAbs_FORWARD) {
nVF++;
if (nVF == 1) VF = V;
}
if (Vori == TopAbs_REVERSED) {
nVR++;
if (nVR == 1) VR = V;
}
if (oriV == TopAbs_INTERNAL) tosplit = Standard_True;
Standard_Real parV = EDBU.Parameter();
myBuildTool.AddEdgeVertex(newEdge,V);
myBuildTool.Parameter(newEdge,V,parV);
} // !equafound
} // EDBUloop.InitVertex : on vertices of new edge newEdge
Standard_Boolean addedge = (nVF == 1 && nVR == 1);
Standard_Boolean bitclosed = Standard_False;
if (nVF == 1 && nVR == 1) {
bitclosed = VF.IsSame(VR);
newEdge.Closed(bitclosed);
}
if (addedge) {
if (tosplit) {
TopTools_ListOfShape loe; Standard_Boolean ok = TopOpeBRepTool_TOOL::SplitE(TopoDS::Edge(newEdge),loe);
if (!ok) tosplit = Standard_False;
else LOE.Append(loe);
}
if (!tosplit) LOE.Append(newEdge);
}
} // EDBU.InitEdge : loop on EDBU edges
#ifdef DRAW
if(tSPS) {
TCollection_AsciiString str1; str1 = "e";
TCollection_AsciiString str2; str2 = iE;
FDRAW_DINLOE("",LOE,str1,str2);
}
#endif
} // GEDBUMakeEdges
|