summaryrefslogtreecommitdiff
path: root/src/TopOpeBRepBuild/TopOpeBRepBuild_fctwes.cxx
blob: 7f4d73d9e9badd3f20525b4c74416e88c3b41bab (plain)
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
// file:	TopOpeBRepBuild_fctwes.cxx
// Created:	Thu Mar  7 10:49:33 1996
// Author:	Jean Yves LEBEY
//		<jyl@meteox>

#include <TopOpeBRepBuild_Builder.ixx>

#include <TopOpeBRepBuild_define.hxx>
#include <TopOpeBRepDS_EXPORT.hxx>
#include <TopOpeBRepDS.hxx>
#include <TopOpeBRepTool_2d.hxx>
#include <TopOpeBRepTool_EXPORT.hxx>
#include <TopOpeBRepTool_defineG.hxx>
#include <TopoDS.hxx>
#include <BRep_Tool.hxx>
#include <Standard_ProgramError.hxx>

#ifdef DEB
Standard_EXPORT void debfctwes(const Standard_Integer /*i*/) {}
Standard_EXPORT void debfctwesmess(const Standard_Integer i,const TCollection_AsciiString& s = "")
{cout<<"+ + + debfctwes "<<s<<"F"<<i<<endl;debfctwes(i);}
Standard_EXPORT void debaddpwes(const Standard_Integer iFOR,const TopAbs_State TB1,const Standard_Integer iEG,const TopAbs_Orientation neworiE,
				const TopOpeBRepBuild_PBuilder& PB,const TopOpeBRepBuild_PWireEdgeSet& PWES,const TCollection_AsciiString& str1,const TCollection_AsciiString& str2);
#endif

Standard_EXPORT Standard_Boolean TopOpeBRepBuild_FUN_aresamegeom(const TopoDS_Shape& S1,const TopoDS_Shape& S2);

#define M_IN(st )      (st == TopAbs_IN)
#define M_OUT(st)      (st == TopAbs_OUT)
#define M_FORWARD(st ) (st == TopAbs_FORWARD)
#define M_REVERSED(st) (st == TopAbs_REVERSED)
#define M_INTERNAL(st) (st == TopAbs_INTERNAL)
#define M_EXTERNAL(st) (st == TopAbs_EXTERNAL)

//=======================================================================
//function : GFillCurveTopologyWES
//purpose  : 
//=======================================================================
void TopOpeBRepBuild_Builder::GFillCurveTopologyWES(const TopoDS_Shape& F1,const TopOpeBRepBuild_GTopo& G1,TopOpeBRepBuild_WireEdgeSet& WES)
{
  TopAbs_State TB1,TB2; G1.StatesON(TB1,TB2);
  TopAbs_ShapeEnum t1,t2,ShapeInterf; G1.Type(t1,t2); ShapeInterf = t1;
  
#ifdef DEB
  Standard_Integer iF; Standard_Boolean tSPS = GtraceSPS(F1,iF);
  if(tSPS) GdumpSHASTA(iF,TB1,WES,"--- GFillCurveTopologyWES");
  if(tSPS) {cout<<" ShapeInterf ";TopAbs::Print(ShapeInterf,cout);cout<<endl;}
  if(tSPS) {debfctwesmess(iF);}
#endif
  
  TopOpeBRepDS_CurveIterator FCit(myDataStructure->FaceCurves(F1));
  myFaceReference = TopoDS::Face(F1);
  myFaceToFill = TopoDS::Face(F1);
  //modified by NIZHNY-MZV  Thu Feb 24 09:15:33 2000
  //sometimes by the problem of tolerances we have intersection
  //lines between SameDomain faces, but Same domain faces can not
  //have intersection lines other than by its original edges
  //so we skip it if we find that two SameDomain faces have
  //new intersection edge
  Standard_Boolean hsd = myDataStructure->HasSameDomain(F1);
  TopTools_IndexedMapOfShape aSDMap;
  if(hsd) {
    TopTools_ListIteratorOfListOfShape it = myDataStructure -> SameDomain(F1);
    for(; it.More(); it.Next()) {
      const TopoDS_Shape& SDF = it.Value();
      aSDMap.Add(SDF);
    }
  }
  //End modified by NIZHNY-MZV  Thu Feb 24 09:21:08 2000

  for (; FCit.More(); FCit.Next()) {
    if ( ShapeInterf != TopAbs_SHAPE ) {
      const Handle(TopOpeBRepDS_Interference)& I = FCit.Value();
      const TopOpeBRepDS_Transition& T = I->Transition();
      TopAbs_ShapeEnum shab = T.ShapeBefore(),shaa = T.ShapeAfter();
      if ( (shaa != ShapeInterf) || (shab != ShapeInterf) ) continue;
      //modified by NIZHNY-MZV  Thu Feb 24 09:14:31 2000

      Standard_Integer si = I -> Support();
      TopoDS_Shape SS = myDataStructure -> Shape(si);
      //see comment above
      if(aSDMap.Contains(SS))
	continue;
      //End modified by NIZHNY-MZV  Thu Feb 24 09:21:34 2000
    }
    GFillCurveTopologyWES(FCit,G1,WES);
  }

  return;
} // GFillCurveTopologyWES

//=======================================================================
//function : GFillCurveTopologyWES
//purpose  : 
//=======================================================================
void TopOpeBRepBuild_Builder::GFillCurveTopologyWES(const TopOpeBRepDS_CurveIterator& FCit,const TopOpeBRepBuild_GTopo& G1,TopOpeBRepBuild_WireEdgeSet& WES) const 
{
  Standard_Boolean more = FCit.More();
  if (!more) return;

  TopAbs_State TB1,TB2; G1.StatesON(TB1,TB2);
  TopOpeBRepDS_Config Conf = G1.Config1();
  TopAbs_State TB = TB1;
  if ( Conf == TopOpeBRepDS_DIFFORIENTED ) { // -jyl980525
//    if      (TB1 == TopAbs_OUT) TB = TopAbs_IN;
//    else if (TB1 == TopAbs_IN ) TB = TopAbs_OUT;
  }

  TopoDS_Face& WESF = *((TopoDS_Face*)((void*)&WES.Face()));
  TopoDS_Face& FTF = *((TopoDS_Face*)((void*)&myFaceToFill));
#ifdef DEB
//  Standard_Boolean FTFeqWESF = myFaceReference.IsEqual(WESF);
#endif

#ifdef DEB
  Standard_Integer iWESF = myDataStructure->Shape(WESF);
  Standard_Integer iref = myDataStructure->Shape(myFaceReference);
  Standard_Integer ifil = myDataStructure->Shape(myFaceToFill);
#endif

  Standard_Boolean opeCut = Opec12() || Opec21();
  Standard_Boolean ComOfCut = opeCut && (TB1 == TB2)&& (TB1 == TopAbs_IN);

  const TopOpeBRepDS_Transition& T = FCit.Value()->Transition();
  TopAbs_Orientation neworiE = T.Orientation(TB);
  Standard_Boolean samegeom = TopOpeBRepBuild_FUN_aresamegeom(FTF,WESF);
  if (!samegeom) {
    neworiE = TopAbs::Complement(neworiE);
  }
  
#ifdef DEB
  Standard_Boolean tSPS = GtraceSPS(iWESF);
  if(tSPS){
    cout<<"ifil : "<<ifil<<" iref : "<<iref<<" iwes : "<<iWESF<<endl;
    cout<<"face "<<ifil<<" is ";TopOpeBRepDS::Print(Conf,cout);cout<<endl;
    cout<<"ComOfCut "<<ComOfCut<<endl;
    debfctwesmess(iWESF);
  }
#endif
  
  if (ComOfCut) return;

  Standard_Integer iG = FCit.Current();
  const TopTools_ListOfShape& LnewE = NewEdges(iG);
  TopTools_ListIteratorOfListOfShape Iti(LnewE);
  for (; Iti.More(); Iti.Next()) {
    TopoDS_Shape EE = Iti.Value();
    TopoDS_Edge& E = TopoDS::Edge(EE);

    //modified by NIZHNY-MZV  Fri Mar 17 12:51:03 2000
    if(BRep_Tool::Degenerated(E))
      continue;

//    TopAbs_Orientation neworiE = FCit.Orientation(TB);
    E.Orientation(neworiE);

    const Handle(Geom2d_Curve)& PC = FCit.PCurve();

    Standard_Boolean EhasPConFTF =
     
                      FC2D_HasCurveOnSurface(E,FTF);
    //modified by NIZHNY-MZV  Mon Mar 27 15:24:39 2000
    if(!EhasPConFTF)
      myBuildTool.PCurve(FTF,E,PC);
    
    Standard_Boolean EhasPConWESF = FC2D_HasCurveOnSurface(E,WESF);
    
    if ( !EhasPConWESF) {
//      Standard_Real tolE = BRep_Tool::Tolerance(E);
      Standard_Real f2,l2,tolpc; Handle(Geom2d_Curve) C2D;
      C2D = FC2D_CurveOnSurface(E,WESF,f2,l2,tolpc);
      if (C2D.IsNull()) Standard_ProgramError::Raise("GFillCurveTopologyWES");
#ifdef DEB
//      Standard_Real tol = Max(tolE,tolpc);
#endif
      
      myBuildTool.PCurve(WESF,E,C2D);

#ifdef DEB
      EhasPConWESF = FC2D_HasCurveOnSurface(E,WESF);
      if (!EhasPConWESF) cout<<"TopOpeBRepBuild_Builder::GFillCurveTopologyWES : Null PCurve on F"<<iWESF<<endl;
#endif
    }

#ifdef DEB
    if (tSPS) debaddpwes(iWESF,TB,iG,neworiE,(TopOpeBRepBuild_Builder* const)this,&WES,"GFillCurveTopology " ,"WES+ EofC ");
#endif

    WES.AddStartElement(E);
  }
  
} // GFillCurveTopologyWES