1 // Created on: 1993-10-11
2 // Created by: Christophe MARION
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 // Modified by cma, Fri Nov 10 17:36:13 1995
18
19 #include <BRep_Builder.hxx>
20 #include <BRepLib_MakeEdge2d.hxx>
21 #include <HLRAlgo_EdgeIterator.hxx>
22 #include <HLRAlgo_EdgeStatus.hxx>
23 #include <HLRBRep_BiPnt2D.hxx>
24 #include <HLRBRep_ListIteratorOfListOfBPnt2D.hxx>
25 #include <HLRBRep_PolyAlgo.hxx>
26 #include <HLRBRep_PolyHLRToShape.hxx>
27 #include <TopExp_Explorer.hxx>
28 #include <TopoDS.hxx>
29 #include <TopoDS_Shape.hxx>
30 #include <TopTools_MapOfShape.hxx>
31
32 //=======================================================================
33 //function : HLRBRep_PolyHLRToShape
34 //purpose :
35 //=======================================================================
36
HLRBRep_PolyHLRToShape()37 HLRBRep_PolyHLRToShape::HLRBRep_PolyHLRToShape ()
38 {}
39
40 //=======================================================================
41 //function : Update
42 //purpose :
43 //=======================================================================
44
Update(const Handle (HLRBRep_PolyAlgo)& A)45 void HLRBRep_PolyHLRToShape::Update (const Handle(HLRBRep_PolyAlgo)& A)
46 {
47 myAlgo = A;
48 myHideMode = Standard_True;
49 Standard_Real sta,end;
50 Standard_ShortReal tolsta,tolend;
51 HLRAlgo_EdgeIterator It;
52 myBiPntVis.Clear();
53 myBiPntHid.Clear();
54 TopoDS_Shape S;
55 Standard_Boolean reg1,regn,outl,intl;
56 const gp_Trsf& T = myAlgo->Projector().Transformation();
57 HLRAlgo_EdgeStatus status;
58
59 for (myAlgo->InitHide(); myAlgo->MoreHide(); myAlgo->NextHide()) {
60 HLRAlgo_BiPoint::PointsT& aPoints = myAlgo->Hide(status,S,reg1,regn,outl,intl);
61 gp_XYZ aSta = aPoints.Pnt1;
62 gp_XYZ aEnd = aPoints.Pnt2;
63 T.Transforms(aSta);
64 T.Transforms(aEnd);
65 const gp_XY aSta2D(aSta.X(), aSta.Y());
66 const gp_XY aEnd2D(aEnd.X(), aEnd.Y());
67 const gp_XY aD = aEnd2D - aSta2D;
68 if (aD.Modulus() > 1.e-10) {
69
70 for (It.InitVisible(status);
71 It.MoreVisible();
72 It.NextVisible()) {
73 It.Visible(sta,tolsta,end,tolend);
74 myBiPntVis.Append
75 (HLRBRep_BiPnt2D
76 (aSta2D + sta * aD, aSta2D + end * aD,
77 S,reg1,regn,outl,intl));
78 }
79
80 for (It.InitHidden(status);
81 It.MoreHidden();
82 It.NextHidden()) {
83 It.Hidden(sta,tolsta,end,tolend);
84 myBiPntHid.Append
85 (HLRBRep_BiPnt2D
86 (aSta2D + sta * aD, aSta2D + end * aD,
87 S,reg1,regn,outl,intl));
88 }
89 }
90 }
91 }
92
93 //=======================================================================
94 //function : InternalCompound
95 //purpose :
96 //=======================================================================
97
98 TopoDS_Shape
InternalCompound(const Standard_Integer typ,const Standard_Boolean visible,const TopoDS_Shape & S)99 HLRBRep_PolyHLRToShape::InternalCompound (const Standard_Integer typ,
100 const Standard_Boolean visible,
101 const TopoDS_Shape& S)
102 {
103 TopTools_MapOfShape Map;
104 if (!S.IsNull()) {
105 TopExp_Explorer ex;
106 for (ex.Init(S,TopAbs_EDGE); ex.More(); ex.Next())
107 Map.Add(ex.Current());
108 for (ex.Init(S,TopAbs_FACE); ex.More(); ex.Next())
109 Map.Add(ex.Current());
110 }
111 Standard_Boolean todraw,reg1,regn,outl,intl;
112 Standard_Boolean added = Standard_False;
113 TopoDS_Shape Result;
114 BRep_Builder B;
115 B.MakeCompound(TopoDS::Compound(Result));
116
117 if (myHideMode) {
118 HLRBRep_ListIteratorOfListOfBPnt2D It;
119 if (visible) It.Initialize(myBiPntVis);
120 else It.Initialize(myBiPntHid);
121
122 for (; It.More(); It.Next()) {
123 const HLRBRep_BiPnt2D& BP = It.Value();
124 reg1 = BP.Rg1Line();
125 regn = BP.RgNLine();
126 outl = BP.OutLine();
127 intl = BP.IntLine();
128 if (typ == 1) todraw = intl;
129 else if (typ == 2) todraw = reg1 && !regn && !outl;
130 else if (typ == 3) todraw = regn && !outl;
131 else todraw = !(intl || (reg1 && !outl));
132 if (todraw)
133 if (!S.IsNull()) todraw = Map.Contains(BP.Shape());
134 if (todraw) {
135 const gp_Pnt2d& FirstP2d = BP.P1();
136 const gp_Pnt2d& LastP2d = BP.P2();
137 if (FirstP2d.SquareDistance(LastP2d) > 1.e-20)
138 {
139 B.Add(Result,BRepLib_MakeEdge2d(BP.P1(),BP.P2()));
140 added = Standard_True;
141 }
142 }
143 }
144 }
145 else {
146 const gp_Trsf& T = myAlgo->Projector().Transformation();
147 TopoDS_Shape SBP;
148
149 for (myAlgo->InitShow(); myAlgo->MoreShow(); myAlgo->NextShow()) {
150 HLRAlgo_BiPoint::PointsT& aPoints = myAlgo->Show(SBP,reg1,regn,outl,intl);
151 if (typ == 1) todraw = intl;
152 else if (typ == 2) todraw = reg1 && !regn && !outl;
153 else if (typ == 3) todraw = regn && !outl;
154 else todraw = !(intl || (reg1 && !outl));
155 if (todraw)
156 if (!S.IsNull()) todraw = Map.Contains(SBP);
157 if (todraw) {
158 gp_XYZ aSta = aPoints.Pnt1, aEnd = aPoints.Pnt2;
159 T.Transforms(aSta);
160 T.Transforms(aEnd);
161 const gp_XY aSta2D(aSta.X(), aSta.Y());
162 const gp_XY aEnd2D(aEnd.X(), aEnd.Y());
163 const gp_XY aD = aEnd2D - aSta2D;
164 if (aD.SquareModulus() > 1.e-20) {
165 B.Add(Result,BRepLib_MakeEdge2d(aSta2D, aEnd2D));
166 added = Standard_True;
167 }
168 }
169 }
170 }
171 if (!added) Result = TopoDS_Shape();
172 return Result;
173 }
174