a50c6d160b6fca5bb32a19e5594b45674b3376e8
[occt.git] / src / IGESToBRep / IGESToBRep_Actor.cxx
1 #include <IGESToBRep_Actor.ixx>
2 #include <IGESToBRep.hxx>
3 #include <IGESData_IGESEntity.hxx>
4 #include <IGESData_IGESModel.hxx>
5 #include <IGESData_GlobalSection.hxx>
6 #include <IGESToBRep_CurveAndSurface.hxx>
7
8 #include <BRepLib.hxx>
9
10 #include <Standard_Failure.hxx>
11 #include <Standard_ErrorHandler.hxx>
12 #include <ShapeExtend_Explorer.hxx>
13 #include <ShapeFix_ShapeTolerance.hxx>
14
15 #include <Interface_Macros.hxx>
16 #include <Interface_Static.hxx>
17
18 #include <Message_ProgressSentry.hxx>
19
20 #include <TopoDS_Shape.hxx>
21 #include <TransferBRep.hxx>
22 #include <TransferBRep_ShapeBinder.hxx>
23
24 #include <XSAlgo.hxx>
25 #include <XSAlgo_AlgoContainer.hxx>
26
27 //=======================================================================
28 //function : IGESToBRep_Actor
29 //purpose  : 
30 //=======================================================================
31 IGESToBRep_Actor::IGESToBRep_Actor ()
32 {  thecontinuity = 0;  theeps = 0.0001;  }
33
34
35 //=======================================================================
36 //function : SetModel
37 //purpose  : 
38 //=======================================================================
39 void IGESToBRep_Actor::SetModel (const Handle(Interface_InterfaceModel)& model)
40 {
41   themodel = model;
42   theeps = Handle(IGESData_IGESModel)::DownCast(themodel)->GlobalSection().Resolution();
43 }
44
45
46 //=======================================================================
47 //function : SetContinuity
48 //purpose  : 
49 //=======================================================================
50 void  IGESToBRep_Actor::SetContinuity (const Standard_Integer continuity)
51 {
52   thecontinuity = continuity;
53 }
54
55
56 //=======================================================================
57 //function : GetContinuity
58 //purpose  : 
59 //=======================================================================
60 Standard_Integer  IGESToBRep_Actor::GetContinuity () const
61 {
62   return thecontinuity;
63 }
64
65 //=======================================================================
66 //function : Recognize
67 //purpose  : 
68 //=======================================================================
69 Standard_Boolean  IGESToBRep_Actor::Recognize
70 (const Handle(Standard_Transient)& start)
71 {
72   DeclareAndCast(IGESData_IGESModel,mymodel,themodel);
73   DeclareAndCast(IGESData_IGESEntity,ent,start);
74   if (ent.IsNull()) return Standard_False;
75
76 //   Cas reconnus
77   Standard_Integer typnum = ent->TypeNumber();
78   Standard_Integer fornum = ent->FormNumber();
79   if (IGESToBRep::IsCurveAndSurface(ent) ||
80       (typnum == 402 && (fornum == 1 || fornum == 7 || 
81                          fornum == 14 || fornum == 15)  ||
82       (typnum == 408 ) || (typnum == 308)))
83     return Standard_True;
84
85 //  Cas restants : non reconnus
86   return Standard_False;
87 }
88 //=======================================================================
89 //function : EncodeRegul
90 //purpose  : INTERNAL to encode regularity on edges
91 //=======================================================================
92
93 static Standard_Boolean  EncodeRegul (const TopoDS_Shape& sh)
94 {
95   Standard_Real tolang = Interface_Static::RVal("read.encoderegularity.angle");
96   if (sh.IsNull()) return Standard_True;
97   if (tolang <= 0) return Standard_True;
98   try {
99     OCC_CATCH_SIGNALS
100     BRepLib::EncodeRegularity (sh,tolang);
101   }
102   catch(Standard_Failure) {
103     return Standard_False;
104   }
105   return Standard_True;
106 }
107 //=======================================================================
108 //function : TrimTolerances
109 //purpose  : Trims tolerances of the shape according to static parameters
110 //          
111 //=======================================================================
112
113 static void TrimTolerances (const TopoDS_Shape& shape,
114                             const Standard_Real tol)
115 {
116   if( Interface_Static::IVal("read.maxprecision.mode")==1) {
117     ShapeFix_ShapeTolerance SFST;
118     SFST.LimitTolerance (shape, 0, Max(tol,Interface_Static::RVal ("read.maxprecision.val")));
119   }
120 }
121
122
123
124 //=======================================================================
125 //function : Transfer
126 //purpose  : 
127 //=======================================================================
128 Handle(Transfer_Binder) IGESToBRep_Actor::Transfer
129 (const Handle(Standard_Transient)& start, const Handle(Transfer_TransientProcess)& TP)
130 {
131   DeclareAndCast(IGESData_IGESModel,mymodel,themodel);
132   DeclareAndCast(IGESData_IGESEntity,ent,start);
133   if (mymodel.IsNull() || ent.IsNull()) return NullResult();
134   Standard_Integer anum = mymodel->Number(start);
135   
136   if(!Interface_Static::IVal("read.iges.faulty.entities") && mymodel->IsErrorEntity(anum)) 
137     return NullResult();
138   TopoDS_Shape shape;
139
140 //   appeler le transfert seulement si type OK
141   Standard_Integer typnum = ent->TypeNumber();
142   Standard_Integer fornum = ent->FormNumber();
143   Standard_Real eps;
144   if (IGESToBRep::IsCurveAndSurface(ent) ||
145       (typnum == 402 && (fornum == 1 || fornum == 7|| 
146                          fornum == 14 || fornum == 15)) || 
147       (typnum == 408) || (typnum == 308)) {
148
149     // Start progress scope (no need to check if progress exists -- it is safe)
150     Message_ProgressSentry aPSentry(TP->GetProgress(), "Transfer stage", 0, 2, 1);
151
152     XSAlgo::AlgoContainer()->PrepareForTransfer();
153     IGESToBRep_CurveAndSurface CAS;
154     CAS.SetModel(mymodel);
155     CAS.SetContinuity(thecontinuity);
156     CAS.SetTransferProcess(TP);
157     Standard_Integer Ival = Interface_Static::IVal("read.precision.mode");
158     if ( Ival == 0)
159       eps = mymodel->GlobalSection().Resolution();
160     else
161       eps = Interface_Static::RVal("read.precision.val"); //:10 ABV 11 Nov 97
162 //:10      eps = BRepAPI::Precision(); 
163     Ival = Interface_Static::IVal("read.iges.bspline.approxd1.mode");
164     CAS.SetModeApprox ( (Ival > 0) );
165     Ival = Interface_Static::IVal("read.surfacecurve.mode");
166     CAS.SetSurfaceCurve (Ival);
167
168     if (eps > 1.E-08) {
169       CAS.SetEpsGeom(eps);
170       theeps = eps*CAS.GetUnitFactor();
171 //      Interface_Static::SetRVal("lastpreci",theeps);
172     }
173     Standard_Integer nbTPitems = TP->NbMapped();
174     {
175       try {
176         OCC_CATCH_SIGNALS
177         shape = CAS.TransferGeometry(ent);
178       }
179       catch(Standard_Failure) {
180         shape.Nullify();
181       }
182     }
183
184     // Switch to fix stage.
185     aPSentry.Next();
186     
187     // fixing shape
188     Handle(Standard_Transient) info;
189     shape = XSAlgo::AlgoContainer()->ProcessShape( shape, theeps, CAS.GetMaxTol(), 
190                                                    "read.iges.resource.name", 
191                                                    "read.iges.sequence", info,
192                                                    TP->GetProgress() );
193     XSAlgo::AlgoContainer()->MergeTransferInfo(TP, info, nbTPitems);
194   }
195
196   ShapeExtend_Explorer SBE;
197   if (SBE.ShapeType(shape,Standard_True) != TopAbs_SHAPE) {
198     if (!shape.IsNull()) {
199       EncodeRegul (shape);
200       //#74 rln 03.03.99 S4135
201       TrimTolerances (shape, UsedTolerance());
202    //   Shapes().Append(shape);
203     }
204   }
205   Handle(TransferBRep_ShapeBinder) binder;
206   if (!shape.IsNull()) binder = new TransferBRep_ShapeBinder(shape);
207   return binder;
208 }
209
210
211     Standard_Real  IGESToBRep_Actor::UsedTolerance () const
212       {  return theeps;  }