Logo ROOT   6.16/01
Reference Guide
TGeoToOCC.cxx
Go to the documentation of this file.
1// @(#)geom/geocad:$Id$
2// Author: Cinzia Luzzi 5/5/2012
3
4/*************************************************************************
5 * Copyright (C) 1995-2012, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TGeoToOCC
13\ingroup Geometry_cad
14
15This class contains implementation of converting ROOT's
16geometry shapes to OpenCascade shapes.
17Each ROOT shape is translated in the corrispondent OCC shape using the
18following methods:
19
20~~~
21TGeoBBox -> OCC_Box(..)
22TGeoSphere -> OCC_Sphere(..)
23TGeoArb8 -> OCC_Arb8(..)
24TGeoConeSeg -> OCC_Cones(..)
25TGeoCone -> OCC_Cones(..)
26TGeoPara -> OCC_ParaTrap(..)
27TGeoTrap -> OCC_ParaTrap(..)
28TGeoGtra -> OCC_ParaTrap(..)
29TGeoTrd1 -> OCC_Trd(..)
30TGeoTrd2 -> OCC_Trd(..)
31TGeoTubeSeg -> OCC_Tube(..)
32TGeoCtub -> OCC_Cuttub(..)
33TGeoTube -> OCC_TubeSeg(..)
34TGeoPcon -> OCC_Pcon(..)
35TGeoTorus -> OCC_Torus(..)
36TGeoPgon -> OCC_Pgon(..)
37TGeoEltu -> OCC_Eltu(..)
38TGeoHype -> OCC_Hype(..)
39TGeoXtru -> OCC_Xtru(..)
40TGeoCompositeShape -> OCC_CompositeShape(..)
41~~~
42
43A log file is created in `/tmp/TGeoCad.log`
44
45*/
46
47#include "TGeoToOCC.h"
48
49
50//Cascade
51
52#include <TopoDS.hxx>
53#include <TopoDS_Shell.hxx>
54#include <TopoDS_Face.hxx>
55#include <TopoDS_Edge.hxx>
56#include <TopoDS_Solid.hxx>
57#include <gp_Pnt.hxx>
58#include <gp_Ax1.hxx>
59#include <gp_Circ.hxx>
60#include <gp_Dir.hxx>
61#include <gp_Hypr.hxx>
62#include <gp_Pln.hxx>
63#include <GC_MakeArcOfCircle.hxx>
64#include <GC_MakeEllipse.hxx>
65#include <BRepBuilderAPI_MakeVertex.hxx>
66#include <BRepBuilderAPI_MakeEdge.hxx>
67#include <BRepBuilderAPI_MakeWire.hxx>
68#include <BRepBuilderAPI_MakeFace.hxx>
69#include <BRepBuilderAPI_MakeShell.hxx>
70#include <BRepBuilderAPI_MakeSolid.hxx>
71#include <BRepBuilderAPI_Transform.hxx>
72#include <BRepBuilderAPI_MakePolygon.hxx>
73#include <BRepBuilderAPI_Sewing.hxx>
74#include <BRepAlgo_Section.hxx>
75#include <BRepPrimAPI_MakeSphere.hxx>
76#include <BRepOffsetAPI_ThruSections.hxx>
77#include <BRepPrimAPI_MakeCylinder.hxx>
78#include <BRepPrimAPI_MakeCone.hxx>
79#include <BRepPrimAPI_MakeTorus.hxx>
80#include <BRepPrimAPI_MakeRevol.hxx>
81#include <BRepPrimAPI_MakePrism.hxx>
82#include <BRepPrimAPI_MakeWedge.hxx>
83#include <BRepPrimAPI_MakeBox.hxx>
84#include <TopExp_Explorer.hxx>
85#include <BRepAlgoAPI_Cut.hxx>
86#include <BRepAlgoAPI_Fuse.hxx>
87#include <BRepAlgoAPI_Common.hxx>
88#include <BRepAlgo_Cut.hxx>
89#include <Geom_Plane.hxx>
90#include <BRepClass3d_SolidClassifier.hxx>
91#include <BRepGProp.hxx>
92#include <GProp_GProps.hxx>
93#include <TColgp_HArray1OfPnt.hxx>
94#include <ShapeFix_ShapeTolerance.hxx>
95
96//ROOT
97#include "TString.h"
98#include "TClass.h"
99#include "TGeoBoolNode.h"
100#include "TGeoShapeAssembly.h"
101#include "TGeoTrd1.h"
102#include "TGeoTrd2.h"
103#include "TGeoArb8.h"
104#include "TGeoPara.h"
105#include "TGeoTorus.h"
106#include "TGeoCone.h"
107#include "TGeoTube.h"
108#include "TGeoEltu.h"
109#include "TGeoSphere.h"
110#include "TGeoPcon.h"
111#include "TGeoPgon.h"
112#include "TGeoHype.h"
113#include "TGeoPolygon.h"
114#include "TGeoMatrix.h"
115
116#include <exception>
117
118
120{
121
122}
123
125{
126
127}
128
130{
131 TString type = TG_Shape->IsA()->GetName();
132 out.open("/tmp/TGeoCad.log",ios::app);
133 out<<"Translating: "<<type<<endl;
134 out.close();
135 if(TG_Shape->IsA()==TGeoTube::Class()) {
136 TGeoTube* TG_Tube=(TGeoTube*)TG_Shape;
137 return OCC_Tube(TG_Tube->GetRmin(), TG_Tube->GetRmax(),TG_Tube->GetDz(),0, 0);
138 } else if(TG_Shape->IsA()==TGeoTubeSeg::Class()) {
139 TGeoTubeSeg* TG_TubeSeg=(TGeoTubeSeg*)TG_Shape;
140 Double_t r = (TG_TubeSeg->GetPhi2()-TG_TubeSeg->GetPhi1());
141 return OCC_Tube(TG_TubeSeg->GetRmin(), TG_TubeSeg->GetRmax(),TG_TubeSeg->GetDz(),(TG_TubeSeg->GetPhi1())*M_PI/180., r*M_PI/180.);
142 } else if(TG_Shape->IsA()==TGeoEltu::Class()) {
143 TGeoEltu* TG_Eltu=(TGeoEltu*)TG_Shape;
144 return OCC_EllTube(TG_Eltu->GetA(),TG_Eltu->GetB() , TG_Eltu->GetDz());
145 } else if(TG_Shape->IsA()==TGeoCtub::Class()) {
146 TGeoCtub* TG_Ctub=(TGeoCtub*)TG_Shape;
147 Double_t r = (TG_Ctub->GetPhi2()-TG_Ctub->GetPhi1());
148 return OCC_Cuttub(TG_Ctub->GetRmin(), TG_Ctub->GetRmax(), TG_Ctub->GetDz(),
149 TG_Ctub->GetPhi1()*M_PI/180.,r*M_PI/180.,TG_Ctub->GetNlow(),TG_Ctub->GetNhigh());
150 } else if(TG_Shape->IsA()==TGeoCone::Class()) {
151 TGeoCone* TG_Cone=(TGeoCone*)TG_Shape;
152 return OCC_Cones(TG_Cone->GetRmin1(),TG_Cone->GetRmax1(),TG_Cone->GetRmin2(), TG_Cone->GetRmax2(),TG_Cone->GetDz(), 0, 2*M_PI);
153 } else if(TG_Shape->IsA()==TGeoConeSeg::Class()) {
154 TGeoConeSeg* TG_ConeSeg=(TGeoConeSeg*)TG_Shape;
155 Double_t r = (TG_ConeSeg->GetPhi2()-TG_ConeSeg->GetPhi1());
156 return OCC_Cones(TG_ConeSeg->GetRmin1(), TG_ConeSeg->GetRmax1(),TG_ConeSeg->GetRmin2(), TG_ConeSeg->GetRmax2(),
157 TG_ConeSeg->GetDz(), (TG_ConeSeg->GetPhi1())*M_PI/180., r*M_PI/180.);
158 } else if(TG_Shape->IsA()==TGeoTorus::Class()) {
159 TGeoTorus* TG_Torus=(TGeoTorus*)TG_Shape;
160 Double_t DPhi=(Double_t)TG_Torus->GetDphi()-TG_Torus->GetPhi1();
161 if (DPhi<0)
162 DPhi=(Double_t)TG_Torus->GetPhi1()-TG_Torus->GetDphi();
163 Double_t Phi1= (Double_t)TG_Torus->GetPhi1();
164 return OCC_Torus((Double_t)TG_Torus->GetRmin(),(Double_t)TG_Torus->GetRmax(),(Double_t)TG_Torus->GetR(),
165 Phi1*M_PI/180., DPhi*M_PI/180.);
166 } else if(TG_Shape->IsA()==TGeoSphere::Class()) {
167 TGeoSphere* TG_Sphere=(TGeoSphere*)TG_Shape;
168 Double_t DPhi = (TG_Sphere->GetPhi2()-TG_Sphere->GetPhi1());
169 Double_t DTheta = (TG_Sphere->GetTheta2()-TG_Sphere->GetTheta1());
170 return OCC_Sphere(TG_Sphere->GetRmin(), TG_Sphere->GetRmax(),(TG_Sphere->GetPhi1())*M_PI/180., DPhi*M_PI/180.,
171 TG_Sphere->GetTheta1()*M_PI/180., DTheta*M_PI/180.);
172 } else if(TG_Shape->IsA()==TGeoPcon::Class()) {
173 TGeoPcon* TG_Pcon=(TGeoPcon*)TG_Shape;
174 return OCC_Pcon((TG_Pcon->GetPhi1())*M_PI/180.,
175 (TG_Pcon->GetDphi())*M_PI/180.,TG_Pcon->GetNz(),TG_Pcon->GetRmin(),TG_Pcon->GetRmax(),TG_Pcon->GetZ());
176 } else if(TG_Shape->IsA()==TGeoPgon::Class()) {
177 TGeoPgon* TG_Pgon=(TGeoPgon*)TG_Shape;
178 Int_t numpoints=TG_Pgon->GetNmeshVertices();
179 Double_t *p = new Double_t[3*numpoints];
180 TG_Pgon->SetPoints(p);
181 return OCC_Pgon(TG_Pgon->GetNsegments(),TG_Pgon->GetNz(),p,TG_Pgon->GetPhi1(),TG_Pgon->GetDphi(),numpoints*3);
182 } else if(TG_Shape->IsA()==TGeoHype::Class()) {
183 TGeoHype* TG_Hype=(TGeoHype*)TG_Shape;
184 return OCC_Hype(TG_Hype->GetRmin(), TG_Hype->GetRmax(), TG_Hype->GetStIn(), TG_Hype->GetStOut(),TG_Hype->GetDz());
185 } else if(TG_Shape->IsA()==TGeoXtru::Class()) {
186 return OCC_Xtru((TGeoXtru*)TG_Shape);
187 } else if (TG_Shape->IsA()==TGeoBBox::Class()) {
188 TGeoBBox * TG_Box=(TGeoBBox*)TG_Shape;
189 const Double_t * Origin = TG_Box->GetOrigin();
190 return OCC_Box(TG_Box->GetDX(),TG_Box->GetDY(),TG_Box->GetDZ(),Origin[0],Origin[1],Origin[2]);
191 } else if (TG_Shape->IsA()==TGeoTrd1::Class()) {
192 TGeoTrd1 * TG_Trd1=(TGeoTrd1*)TG_Shape;
193 return OCC_Trd(TG_Trd1->GetDx1(),TG_Trd1->GetDx2(),TG_Trd1->GetDy(),TG_Trd1->GetDy(),TG_Trd1->GetDz());
194 } else if (TG_Shape->IsA()==TGeoTrd2::Class()) {
195 TGeoTrd2 * TG_Trd2=(TGeoTrd2*)TG_Shape;
196 return OCC_Trd(TG_Trd2->GetDx1(),TG_Trd2->GetDx2(),TG_Trd2->GetDy1(),TG_Trd2->GetDy2(),TG_Trd2->GetDz());
197 } else if (TG_Shape->IsA()==TGeoArb8::Class()) {
198 TGeoArb8 * TG_Arb8=(TGeoArb8*)TG_Shape;
199 Double_t vertex[24];
200 TG_Shape->SetPoints(vertex);
201 return OCC_Arb8(TG_Arb8->GetDz(),TG_Arb8->GetVertices(),vertex);
202 } else if (TG_Shape->IsA()==TGeoShapeAssembly::Class()) {
203 TGeoBBox * TG_Ass=(TGeoBBox*)TG_Shape;
204 return OCC_Box(TG_Ass->GetDX(),TG_Ass->GetDY(),TG_Ass->GetDZ(),0,0,0);
205 } else if (TG_Shape->IsA()==TGeoPara::Class()) {
206 //TGeoPara * TG_Para=(TGeoPara*)TG_Shape;
207 Double_t vertex[24];
208 TG_Shape->SetPoints(vertex);
209 return OCC_ParaTrap(vertex);
210 } else if (TG_Shape->IsA()==TGeoTrap::Class()) {
211 //TGeoTrap * TG_Trap=(TGeoTrap*)TG_Shape;
212 Double_t vertex[24];
213 TG_Shape->SetPoints(vertex);
214 return OCC_ParaTrap(vertex);
215 } else if (TG_Shape->IsA()==TGeoGtra::Class()) {
216 //TGeoGtra * TG_Tra=(TGeoGtra*)TG_Shape;
217 Double_t vertex[24];
218 TG_Shape->SetPoints(vertex);
219 return OCC_ParaTrap(vertex);
220 } else {
221 throw std::domain_error("Unknown Shape");
222 }
223}
224
226{
227 Double_t const *t;
228 Double_t const *r;
229 gp_Trsf Transl;
230 gp_Trsf Transf;
231 out.open("/tmp/TGeoCad.log",ios::app);
232 TopoDS_Shape leftOCCShape;
233 TopoDS_Shape rightOCCShape;
234 TopoDS_Shape result;
235 GProp_GProps System;
236 GProp_GProps System2;
237 TGeoBoolNode *boolNode=comp->GetBoolNode();
238 TGeoShape *rightShape=boolNode->GetRightShape();
239 TString rightSName = rightShape->IsA()->GetName();
240 TGeoShape *leftShape=boolNode->GetLeftShape();
241 TString leftSName = leftShape->IsA()->GetName();
242 TGeoMatrix *leftMtx=boolNode->GetLeftMatrix();
243 TGeoMatrix *rightMtx=boolNode->GetRightMatrix();
244 TGeoHMatrix leftGlobMatx=m*(*leftMtx);
245 if(leftSName == "TGeoCompositeShape") {
246 leftOCCShape=OCC_CompositeShape((TGeoCompositeShape*)leftShape, leftGlobMatx);
247 } else {
248 t=leftGlobMatx.GetTranslation();
249 r=leftGlobMatx.GetRotationMatrix();
250 Transl.SetTranslation(gp_Vec(t[0],t[1],t[2]));
251 Transf.SetValues(r[0],r[1],r[2],0,
252 r[3],r[4],r[5],0,
253 r[6],r[7],r[8],0
254#if OCC_VERSION_MAJOR == 6 && OCC_VERSION_MINOR < 8
255 ,0,1
256#endif
257 );
258 BRepBuilderAPI_Transform Transformation(Transf);
259 BRepBuilderAPI_Transform Translation(Transl);
260 Transformation.Perform(OCC_SimpleShape(leftShape),true);
261 TopoDS_Shape shapeTransf = Transformation.Shape();
262 Translation.Perform(shapeTransf, Standard_True);
263 leftOCCShape = Translation.Shape();
264 }
265 TGeoHMatrix rightGlobMatx=m*(*rightMtx);
266 if(rightSName == "TGeoCompositeShape" ) {
267 rightOCCShape=OCC_CompositeShape((TGeoCompositeShape*)rightShape, leftGlobMatx);
268 } else {
269 t=rightGlobMatx.GetTranslation();
270 r=rightGlobMatx.GetRotationMatrix();
271 Transl.SetTranslation(gp_Vec(t[0],t[1],t[2]));
272 Transf.SetValues(
273 r[0],r[1],r[2],0,
274 r[3],r[4],r[5],0,
275 r[6],r[7],r[8],0
276#if OCC_VERSION_MAJOR == 6 && OCC_VERSION_MINOR < 8
277 ,0,1
278#endif
279 );
280 BRepBuilderAPI_Transform Transformation(Transf);
281 BRepBuilderAPI_Transform Translation(Transl);
282 TopoDS_Shape sh=OCC_SimpleShape(rightShape);
283 Transformation.Perform(sh,true);
284 TopoDS_Shape shapeTransf = Transformation.Shape();
285 Translation.Perform(shapeTransf, Standard_True);
286 rightOCCShape = Translation.Shape();
287 }
289 if(TGeoBoolNode::kGeoUnion == boolOper){
290 if (leftOCCShape.IsNull())out<<"leftshape is null"<<endl;
291 if (rightOCCShape.IsNull())out<<"rightshape is null"<<endl;
292 leftOCCShape.Closed(true);
293 rightOCCShape.Closed(true);
294 BRepAlgoAPI_Fuse Result(leftOCCShape, rightOCCShape);
295 Result.Build();
296 result=Result.Shape();
297 result.Closed(true);
298 return Reverse(result);
299 } else if(TGeoBoolNode::kGeoIntersection == boolOper) {
300 BRepAlgoAPI_Common Result(rightOCCShape,leftOCCShape);
301 Result.Build();
302 result=Result.Shape();
303 result.Closed(true);
304 return Reverse(result);
305 } else if(TGeoBoolNode::kGeoSubtraction ==boolOper) {
306 if (leftOCCShape.IsNull())out<<"leftshape is null"<<endl;
307 if (rightOCCShape.IsNull())out<<"rightshape is null"<<endl;
308 out.close();
309 BRepGProp::VolumeProperties(rightOCCShape, System);
310 if (System.Mass() < 0.0) rightOCCShape.Reverse();
311 BRepGProp::VolumeProperties(leftOCCShape, System2);
312 if (System2.Mass() < 0.0) leftOCCShape.Reverse();
313 BRepAlgoAPI_Cut Result(leftOCCShape,rightOCCShape);
314 Result.Build();
315 result=Result.Shape();
316 return Reverse(result);
317 } else {
318 throw std::domain_error( "Unknown operation" );
319 }
320}
321
323{
324 gp_Pnt p (0.,0.,-dz);
325 gp_Dir d (0,0,1);
326 gp_Ax2 ax2 (p,d);
327 TopoDS_Edge e;
328 TopoDS_Wire w;
329 TopoDS_Face f;
330 if(a>b)
331 e=BRepBuilderAPI_MakeEdge(GC_MakeEllipse (ax2, a, b));
332 else
333 e=BRepBuilderAPI_MakeEdge(GC_MakeEllipse (ax2, b, a));
334 w=BRepBuilderAPI_MakeWire(e);
335 f=BRepBuilderAPI_MakeFace(w);
336 gp_Vec v(0 , 0 , dz*2);
337 fOccShape = BRepPrimAPI_MakePrism(f , v);
338 if(a<b) {
339 gp_Trsf t;
340 t.SetRotation(gp::OZ(), M_PI/2.);
341 BRepBuilderAPI_Transform brepT(fOccShape , t);
342 fOccShape = brepT.Shape();
343 }
344 return Reverse(fOccShape);
345}
346
347TopoDS_Shape TGeoToOCC::OCC_Torus(Double_t Rmin, Double_t Rmax, Double_t Rtor,
348 Double_t SPhi, Double_t DPhi)
349{
350 TopoDS_Solid torMin;
351 TopoDS_Solid torMax;
352 TopoDS_Shape tor;
353 gp_Trsf t;
354 if (Rmin==0) Rmin=0.000001;
355 if (Rmax==0) Rmax=0.000001;
356 if (Rtor==0) Rtor=0.000001;
357 torMin = BRepPrimAPI_MakeTorus(Rtor,Rmin,DPhi);
358 torMax = BRepPrimAPI_MakeTorus(Rtor,Rmax,DPhi);
359 BRepAlgoAPI_Cut cutResult(torMax, torMin);
360 cutResult.Build();
361 tor=cutResult.Shape();
362 TopExp_Explorer anExp1 (tor, TopAbs_SOLID);
363 if (anExp1.More()) {
364 TopoDS_Shape aTmpShape = anExp1.Current();
365 tor = TopoDS::Solid (aTmpShape);
366 }
367 t.SetRotation(gp::OZ(), SPhi);
368 BRepBuilderAPI_Transform brepT(tor , t);
369 fOccShape = brepT.Shape();
370 return Reverse(fOccShape);
371}
372
373
375 Double_t phi1, Double_t Dphi,
376 Double_t theta1, Double_t Dtheta)
377{
378 TopoDS_Edge eO;
379 TopoDS_Edge e1;
380 TopoDS_Edge e2;
381 TopoDS_Edge eI;
382 TopoDS_Face f;
383 TopoDS_Wire w;
384
385
386 if(rmin==0&&phi1==0&&Dphi==2*M_PI&&theta1==0&&Dtheta==M_PI) {
387 TopoDS_Solid s= BRepPrimAPI_MakeSphere(rmax);
388 return s;
389 }
390 Handle(Geom_TrimmedCurve) arcO = GC_MakeArcOfCircle (gp_Circ (gp_Ax2 (gp_Pnt(0., 0., 0.),
391 gp_Dir (0, 1,0)),rmax),theta1,
392 theta1+Dtheta, true);
393 BRepBuilderAPI_MakeEdge makeEO(arcO);
394 eO = TopoDS::Edge(makeEO.Shape());
395 if(rmin>0) {
396 Handle(Geom_TrimmedCurve) arcI = GC_MakeArcOfCircle (gp_Circ (gp_Ax2 (gp_Pnt(0.,0., 0.),
397 gp_Dir (0,1, 0)),rmin),
398 theta1, theta1+Dtheta,true);
399
400 BRepBuilderAPI_MakeEdge makeEI(arcI);
401 eI = TopoDS::Edge(makeEI.Shape());
402 e1 = BRepBuilderAPI_MakeEdge(makeEO.Vertex1(), makeEI.Vertex1());
403 e2 = BRepBuilderAPI_MakeEdge(makeEO.Vertex2(), makeEI.Vertex2());
404 w = BRepBuilderAPI_MakeWire(eO , e2 , eI, e1);
405 f = BRepBuilderAPI_MakeFace(w);
406 } else {
407 gp_Pnt pZero(0.,0.,0.);
408 TopoDS_Vertex vZero = BRepBuilderAPI_MakeVertex(pZero);
409 e1 = BRepBuilderAPI_MakeEdge(makeEO.Vertex1(),vZero );
410 e2 = BRepBuilderAPI_MakeEdge(makeEO.Vertex2(),vZero );
411 w = BRepBuilderAPI_MakeWire(eO , e2 , e1);
412 f = BRepBuilderAPI_MakeFace(w);
413 }
414 gp_Trsf t;
415 t.SetRotation(gp::OZ(), phi1);
416 BRepBuilderAPI_Transform brepT(f , t);
417 fOccShape= brepT.Shape();
418 fOccShape = BRepPrimAPI_MakeRevol(fOccShape,gp::OZ(),Dphi);
419 return Reverse(fOccShape);
420}
421
422TopoDS_Shape TGeoToOCC::OCC_Tube(Double_t rmin, Double_t rmax,
423 Double_t dz, Double_t phi1,
424 Double_t phi2)
425{
426 TopoDS_Solid innerCyl;
427 TopoDS_Solid outerCyl;
428 TopoDS_Shape tubs;
429 TopoDS_Shape tubsT;
430 gp_Trsf TT;
431 gp_Trsf TR;
432 if (rmin==0) rmin=rmin+0.00001;
433 if (rmax==0) rmax=rmax+0.00001;
434 if (phi1==0&&phi2==0) {
435 innerCyl = BRepPrimAPI_MakeCylinder(rmin,dz*2);
436 outerCyl = BRepPrimAPI_MakeCylinder(rmax,dz*2);
437 } else {
438 innerCyl = BRepPrimAPI_MakeCylinder(rmin,dz*2,phi2);
439 outerCyl = BRepPrimAPI_MakeCylinder(rmax,dz*2,phi2);
440 }
441 BRepAlgoAPI_Cut cutResult(outerCyl, innerCyl);
442 cutResult.Build();
443 tubs=cutResult.Shape();
444 TopExp_Explorer anExp1 (tubs, TopAbs_SOLID);
445 if (anExp1.More()) {
446 TopoDS_Shape aTmpShape = anExp1.Current();
447 tubs = TopoDS::Solid (aTmpShape);
448 }
449 TT.SetRotation(gp_Ax1(gp_Pnt(0.,0.,0.), gp_Vec(0., 0., 1.)), phi1);
450 BRepBuilderAPI_Transform theTT(TT);
451 theTT.Perform(tubs, Standard_True);
452 tubsT=theTT.Shape();
453 TR.SetTranslation(gp_Vec(0,0,-dz ));
454 BRepBuilderAPI_Transform theTR(TR);
455 theTR.Perform(tubsT, Standard_True);
456 fOccShape=theTR.Shape();
457 return Reverse(fOccShape);
458}
459
460TopoDS_Shape TGeoToOCC::OCC_Cones(Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t dz, Double_t phi1, Double_t phi2)
461{
462 TopoDS_Solid innerCon;
463 TopoDS_Solid outerCon;
464 TopoDS_Shape cons;
465 gp_Trsf TT;
466 gp_Trsf TR;
467 if (rmin1==0) rmin1=rmin1+0.000001;
468 if (rmax1==0) rmax1=rmax1+0.000001;
469 if(rmin1!=rmin2)
470 innerCon = BRepPrimAPI_MakeCone(rmin1,rmin2,dz*2,phi2);
471 else
472 innerCon = BRepPrimAPI_MakeCylinder(rmin1,dz*2,phi2);
473 if(rmax1!=rmax2)
474 outerCon = BRepPrimAPI_MakeCone(rmax1,rmax2,dz*2,phi2);
475 else
476 outerCon = BRepPrimAPI_MakeCylinder(rmax1,dz*2,phi2);
477 BRepAlgoAPI_Cut cutResult(outerCon, innerCon);
478 cutResult.Build();
479 cons = cutResult.Shape();
480 TT.SetRotation(gp_Ax1(gp_Pnt(0.,0.,0.), gp_Vec(0., 0., 1.)), phi1);
481 BRepBuilderAPI_Transform theTT(TT);
482 theTT.Perform(cons, Standard_True);
483 cons=theTT.Shape();
484 TR.SetTranslation(gp_Vec(0,0,-dz ));
485 BRepBuilderAPI_Transform theTR(TR);
486 theTR.Perform(cons, Standard_True);
487 fOccShape=theTR.Shape();
488 return Reverse(fOccShape);
489}
490
492 Double_t, Double_t Dphi,const Double_t * Nlow,const Double_t * Nhigh)
493{
494 out.open("/tmp/TGeoCad.log",ios::app);
495 out<<"siamo in ctube"<<rmin<<" "<<rmax<<" "<<Dphi<<" "<<dz<<" "<<Nlow[0]<<" "<<Nlow[1]<<" "<<Nlow[2]<<" "<<Nhigh[0]<<" "<<Nhigh[1]<<" "<<Nhigh[2]<<endl;
496 Double_t nlow0=Nlow[0];
497 Double_t nlow1=Nlow[1];
498 Double_t nhigh0=Nhigh[0];
499 Double_t nhigh1=Nhigh[1];
500 TopoDS_Shape tubs;
501 TopoDS_Shell sH, sL;
502 ShapeFix_ShapeTolerance FTol;
503 Double_t tolerance=1;
504
505 gp_Trsf TT;
506 gp_Trsf TR;
507 if (rmin==0) rmin=rmin+0.000001;
508 if (rmax==0) rmax=rmax+0.000001;
509 TopoDS_Solid rminCyl= BRepPrimAPI_MakeCylinder(rmin,2*dz,Dphi);
510 TopoDS_Solid rmaxCyl = BRepPrimAPI_MakeCylinder(rmax,2*dz,Dphi);
511 BRepAlgoAPI_Cut cutResult(rmaxCyl, rminCyl);
512 cutResult.Build();
513 tubs=cutResult.Shape();
514 TopExp_Explorer anExp2 (tubs, TopAbs_SOLID);
515 if (anExp2.More()) {
516 TopoDS_Shape aTmpShape = anExp2.Current();
517 tubs = TopoDS::Solid (aTmpShape);
518 }
519 /*TT.SetRotation(gp_Ax1(gp_Pnt(0.,0.,0.), gp_Vec(0., 0., 1.)),phi1);
520 BRepBuilderAPI_Transform theTT(TT);
521 theTT.Perform(tubs, Standard_True);
522 tubs=theTT.Shape();*/
523 TR.SetTranslation(gp_Vec(0,0,-dz));
524 BRepBuilderAPI_Transform theTR(TR);
525 theTR.Perform(tubs, Standard_True);
526 tubs=theTR.Shape();
527 if ((Nhigh[0]>-1e-4)&&(Nhigh[0]<1e-4)) nhigh0=0;
528 if ((Nhigh[1]>-1e-4)&&(Nhigh[1]<1e-4)) nhigh1=0;
529 if ((Nlow[0]>-1e-4)&&(Nlow[0]<1e-4)) nlow0=0;
530 if ((Nlow[1]>-1e-4)&&(Nlow[1]<1e-4)) nlow1=0;
531 Handle(Geom_Plane) pH = new Geom_Plane (gp_Pnt(0,0,dz), gp_Dir(nhigh0,nhigh1,Nhigh[2]));
532 Handle(Geom_Plane) pL = new Geom_Plane (gp_Pnt(0,0,-dz), gp_Dir(nlow0,nlow1,Nlow[2]));
533
534 /* gp_Dir D(nhigh0,nhigh1,Nhigh[2]);
535 gp_Pnt P(0,0,dz);
536 gp_Pln Plan(P,D);
537 TopoDS_Face maLame = BRepBuilderAPI_MakeFace(Plan);
538 if (maLame.IsNull()) cout<<"null face"<<endl;
539 TopoDS_Shape Inter = BRepAlgo_Section(tubs, maLame);
540 FTol.SetTolerance(maLame, tolerance ,TopAbs_FACE);
541 BRepAlgoAPI_Cut Result(tubs, Inter);*/
542
543 /*gp_Dir D2(nlow0,nlow1,Nlow[2]);
544 gp_Pnt P2(0,0,-dz);
545 gp_Pln Plan2(P,D);
546 TopoDS_Face maLame2 = BRepBuilderAPI_MakeFace(Plan2);
547 TopoDS_Shape Inter2 = BRepAlgo_Section(tubs, maLame2);
548 BRepAlgoAPI_Fuse Result(Inter, Inter2);
549 Result.Build();
550 */
551 BRepBuilderAPI_MakeShell shell(pH);
552 if (shell.IsDone())
553 sH=shell.Shell();
554 else
555 out<<"error shell 1"<<shell.Error()<<endl;
556 BRepBuilderAPI_MakeShell shell2 (pL);
557 if (shell2.IsDone())
558 sL=shell2.Shell();
559 else
560 out<<"error shell 2"<<shell2.Error()<<endl;
561
562 FTol.SetTolerance(sH, tolerance ,TopAbs_SHELL);
563 FTol.SetTolerance(sL, tolerance ,TopAbs_SHELL);
564
565 BRepBuilderAPI_MakeSolid solid (sH, sL);
566 solid.Build();
567 TopoDS_Solid cut=solid.Solid();
568 FTol.SetTolerance(cut, tolerance ,TopAbs_SOLID);
569 BRepBuilderAPI_MakeSolid(sL, sH);
570 if (!solid.IsDone())
571 out<<"error solid"<<endl;
572
573 //BRepAlgoAPI_Cut Result(tubs, cut);
574 BRepAlgoAPI_Cut Result(tubs, cut);
575 Result.Build();
576 out<<"dopo la seconda cut"<<Result.ErrorStatus()<<endl;
577 /* TopoDS_Solid newSolid;
578 TopExp_Explorer anExp1 (tubs, TopAbs_SOLID);
579 if (anExp1.More()) {
580 TopoDS_Shape aTmpShape = anExp1.Current();
581 newSolid = TopoDS::Solid (aTmpShape);
582 }*/
583 return Reverse(Result.Shape());
584 // return maLame;
585}
586
587
588TopoDS_Shape TGeoToOCC::OCC_Xtru(TGeoXtru * TG_Xtru)
589{
590 Int_t vert=TG_Xtru->GetNvert();
591 Int_t nz=TG_Xtru->GetNz();
592 Double_t x [vert];
593 Double_t y [vert];
594 Double_t z [nz];
595 gp_Trsf TR;
596 TopoDS_Wire w;
597 BRepOffsetAPI_ThruSections sect(true,true);
598 for (Int_t i=0;i<nz;i++) {
599 for (Int_t pp=0;pp<vert;pp++) {
600 x[pp]=TG_Xtru->GetXOffset(i)+(TG_Xtru->GetScale(i)*TG_Xtru->GetX(pp));
601 y[pp]=TG_Xtru->GetYOffset(i)+(TG_Xtru->GetScale(i)*TG_Xtru->GetY(pp));
602 }
603 z[i]=TG_Xtru->GetZ(i);
604 w=TGeoToOCC::Polygon(x,y,z[i],vert);
605 sect.AddWire(w);
606 }
607 sect.Build();
608 if (sect.IsDone()) fOccShape = sect.Shape();
609 return fOccShape;
610}
611
612
613TopoDS_Shape TGeoToOCC::OCC_Hype(Double_t rmin, Double_t rmax,Double_t stin, Double_t stout, Double_t dz )
614{
615 gp_Pnt p(0, 0, 0);
616 gp_Dir d(0, 0, 1);
617 TopoDS_Vertex vIn,vOut;
618 TopoDS_Vertex vIn1,vOut1;
619 TopoDS_Edge hyEO;
620 TopoDS_Edge hyEI;
621 TopoDS_Edge eT;
622 TopoDS_Edge eB;
623 TopoDS_Edge eT1;
624 TopoDS_Wire hyW;
625 TopoDS_Face hyF;
626 gp_Trsf t;
627 BRepBuilderAPI_MakeEdge makeHyEO;
628 BRepBuilderAPI_MakeEdge makeHyEI;
629 Double_t xO,xI;
630 if(stout>0) {
631 Double_t aO = rmax;
632 Double_t bO = (rmax/(tan(stout)));
633 xO = aO*sqrt(1+(dz*dz)/(bO*bO));
634 gp_Hypr hyO( gp_Ax2 (p, d ), aO, bO);
635 vOut = BRepBuilderAPI_MakeVertex(gp_Pnt(xO,dz,0));
636 vOut1 = BRepBuilderAPI_MakeVertex(gp_Pnt(xO,-dz,0));
637 makeHyEO=BRepBuilderAPI_MakeEdge(hyO,vOut,vOut1);
638 }
639 else
640 makeHyEO=BRepBuilderAPI_MakeEdge(gp_Pnt(rmax,-dz,0), gp_Pnt(rmax,dz,0));
641 if(stin>0) {
642 Double_t aI = rmin;
643 Double_t bI = (rmin/(tan(stin)));
644 xI = aI*sqrt(1+(dz*dz)/(bI*bI));
645 gp_Hypr hyI( gp_Ax2 (p, d ), aI, bI);
646 vIn = BRepBuilderAPI_MakeVertex(gp_Pnt(xI,dz,0));
647 vIn1 = BRepBuilderAPI_MakeVertex(gp_Pnt(xI,-dz,0));
648 makeHyEI=BRepBuilderAPI_MakeEdge(hyI,vIn,vIn1);
649 }
650 else
651 makeHyEI=BRepBuilderAPI_MakeEdge(gp_Pnt(rmin,-dz,0), gp_Pnt(rmin,dz,0));
652 hyEO=TopoDS::Edge(makeHyEO.Shape());
653 hyEI=TopoDS::Edge(makeHyEI.Shape());
654 eT= BRepBuilderAPI_MakeEdge(makeHyEO.Vertex1(), makeHyEI.Vertex1());
655 eB= BRepBuilderAPI_MakeEdge(makeHyEO.Vertex2(), makeHyEI.Vertex2());
656 eT1 =BRepBuilderAPI_MakeEdge(makeHyEO.Vertex1(), makeHyEO.Vertex2());
657 BRepBuilderAPI_MakeWire WIRE(hyEO,eB,hyEI,eT);
658 WIRE.Add(eT1);
659 hyW=WIRE.Wire();
660 BRepBuilderAPI_MakeFace face(hyW);
661 hyF=face.Face();
662 t.SetRotation(gp::OX(), M_PI/2.);
663 BRepBuilderAPI_Transform TF(t);
664 TF.Perform(hyF,Standard_True);
665 hyF = TopoDS::Face(TF.Shape());
666 fOccShape = BRepPrimAPI_MakeRevol (hyF,gp::OZ(),2*M_PI);
667 return Reverse(fOccShape);
668}
669
671{
672 BRepOffsetAPI_ThruSections sect(true,true);
673 TopoDS_Wire w;
674 TopoDS_Face ff;
675 //Int_t punti=0;
676 Int_t f=0;
677 TopoDS_Edge e1;
678 TopoDS_Edge e2;
679 TopoDS_Edge e3;
680 TopoDS_Edge e4;
681 gp_Pnt p1;
682 gp_Pnt p2;
683 gp_Pnt p3;
684 gp_Pnt p4;
685
686 while (f<24) {
687 p1=gp_Pnt(vertex[f],vertex[f+1],vertex[f+2]);
688 p2=gp_Pnt(vertex[f+3],vertex[f+4],vertex[f+5]);
689 p3=gp_Pnt(vertex[f+6],vertex[f+7],vertex[f+8]);
690 p4=gp_Pnt(vertex[f+9],vertex[f+10],vertex[f+11]);
691 e1=BRepBuilderAPI_MakeEdge(p1,p2 );
692 e2=BRepBuilderAPI_MakeEdge(p2,p3 );
693 e3=BRepBuilderAPI_MakeEdge(p3,p4 );
694 e4=BRepBuilderAPI_MakeEdge(p4,p1 );
695 w = BRepBuilderAPI_MakeWire(e1,e2,e3,e4);
696 sect.AddWire(w);
697 f += 12;
698 }
699 sect.Build();
700 fOccShape=sect.Shape();
701 return fOccShape;
702}
703
704
706{
707 out.open("/tmp/TGeoCad.log",ios::app);
708 TopoDS_Shell newShell;
709 TopoDS_Shape sewedShape;
710 TopoDS_Shape aTmpShape;
711 Int_t count=0;
712 ShapeFix_ShapeTolerance FTol;
713 Double_t tolerance=1;
714 Handle(TColgp_HArray1OfPnt) pathArray =new TColgp_HArray1OfPnt(0,8);
715 BRepBuilderAPI_Sewing sew(1.0);//e-02);
716 TopoDS_Wire wire1,wire2,wire3,wire4,wire5,wire6;
717 TopoDS_Face ff,ff1,ff2,ff3,ff4,ff5;
718 BRepBuilderAPI_MakePolygon poly1,poly2,poly3,poly4,poly5,poly6;
719 Int_t x=0,y=0,z=0;
720 gp_Pnt point;
721 for (Int_t i=0;i<8;i++) {
722
723 x=count++;y=count++;z=count++;
724 point=gp_Pnt(points[x],points[y],points[z]);
725 if (points[x]<=0.1) { tolerance=1;}
726 if (points[y]<=0.1) { tolerance=1;}
727 if (points[z]<=0.1) { tolerance=1;}
728 pathArray->SetValue(i,point);
729 }
730 poly1.Add(pathArray->Value(0));
731 out<<pathArray->Value(0).X()<<" "<<pathArray->Value(0).Y()<<" "<<pathArray->Value(0).Z()<<endl;
732 poly1.Add(pathArray->Value(3));
733 out<<pathArray->Value(3).X()<<pathArray->Value(3).Y()<<pathArray->Value(3).Z()<<endl;
734 poly1.Add(pathArray->Value(2));
735 out<<pathArray->Value(2).X()<<pathArray->Value(2).Y()<<pathArray->Value(2).Z()<<endl;
736 poly1.Add(pathArray->Value(1));
737 out<<pathArray->Value(1).X()<<" "<<pathArray->Value(1).Y()<<" "<<pathArray->Value(1).Z()<<endl;
738 poly1.Close();
739 wire1=poly1.Wire();
740
741 poly2.Add(pathArray->Value(0));
742 out<<pathArray->Value(0).X()<<pathArray->Value(0).Y()<<pathArray->Value(0).Z()<<endl;
743 poly2.Add(pathArray->Value(1));
744 out<<pathArray->Value(1).X()<<pathArray->Value(1).Y()<<pathArray->Value(1).Z()<<endl;
745 poly2.Add(pathArray->Value(5));
746 out<<pathArray->Value(5).X()<<pathArray->Value(5).Y()<<pathArray->Value(5).Z()<<endl;
747 poly2.Add(pathArray->Value(4));
748 out<<pathArray->Value(4).X()<<pathArray->Value(4).Y()<<pathArray->Value(4).Z()<<endl;
749 poly2.Close();
750 wire2=poly2.Wire();
751 poly3.Add(pathArray->Value(0));
752 out<<pathArray->Value(0).X()<<pathArray->Value(0).Y()<<pathArray->Value(0).Z()<<endl;
753 poly3.Add(pathArray->Value(4));
754 out<<pathArray->Value(4).X()<<pathArray->Value(4).Y()<<pathArray->Value(4).Z()<<endl;
755 poly3.Add(pathArray->Value(7));
756 out<<pathArray->Value(7).X()<<pathArray->Value(7).Y()<<pathArray->Value(7).Z()<<endl;
757 poly3.Add(pathArray->Value(3));
758 out<<pathArray->Value(3).X()<<pathArray->Value(3).Y()<<pathArray->Value(3).Z()<<endl;
759 poly3.Close();
760 wire3=poly3.Wire();
761 poly4.Add(pathArray->Value(3));
762 out<<pathArray->Value(3).X()<<pathArray->Value(3).Y()<<pathArray->Value(3).Z()<<endl;
763 poly4.Add(pathArray->Value(2));
764 out<<pathArray->Value(2).X()<<pathArray->Value(2).Y()<<pathArray->Value(2).Z()<<endl;
765 poly4.Add(pathArray->Value(6));
766 out<<pathArray->Value(6).X()<<pathArray->Value(6).Y()<<pathArray->Value(6).Z()<<endl;
767 poly4.Add(pathArray->Value(7));
768 out<<pathArray->Value(7).X()<<pathArray->Value(7).Y()<<pathArray->Value(7).Z()<<endl;
769 poly4.Close();
770 wire4=poly4.Wire();
771 poly5.Add(pathArray->Value(4));
772 out<<pathArray->Value(4).X()<<pathArray->Value(4).Y()<<pathArray->Value(4).Z()<<endl;
773 poly5.Add(pathArray->Value(5));
774 out<<pathArray->Value(5).X()<<pathArray->Value(5).Y()<<pathArray->Value(5).Z()<<endl;
775 poly5.Add(pathArray->Value(6));
776 out<<pathArray->Value(6).X()<<pathArray->Value(6).Y()<<pathArray->Value(6).Z()<<endl;
777 poly5.Add(pathArray->Value(7));
778 out<<pathArray->Value(7).X()<<pathArray->Value(7).Y()<<pathArray->Value(7).Z()<<endl;
779 poly5.Close();
780 wire5=poly5.Wire();
781 poly6.Add(pathArray->Value(1));
782 out<<pathArray->Value(1).X()<<pathArray->Value(1).Y()<<pathArray->Value(1).Z()<<endl;
783 poly6.Add(pathArray->Value(2));
784 out<<pathArray->Value(2).X()<<pathArray->Value(2).Y()<<pathArray->Value(2).Z()<<endl;
785 poly6.Add(pathArray->Value(6));
786 out<<pathArray->Value(6).X()<<pathArray->Value(6).Y()<<pathArray->Value(6).Z()<<endl;
787 poly6.Add(pathArray->Value(5));
788 out<<pathArray->Value(5).X()<<pathArray->Value(5).Y()<<pathArray->Value(5).Z()<<endl;
789
790 poly6.Close();
791 wire6=poly6.Wire();
792
793 FTol.SetTolerance(wire1, tolerance ,TopAbs_WIRE);
794 FTol.SetTolerance(wire2, tolerance ,TopAbs_WIRE);
795 FTol.SetTolerance(wire3, tolerance ,TopAbs_WIRE);
796 FTol.SetTolerance(wire4, tolerance ,TopAbs_WIRE);
797 FTol.SetTolerance(wire5, tolerance ,TopAbs_WIRE);
798 FTol.SetTolerance(wire6, tolerance ,TopAbs_WIRE);
799
800 ff = BRepBuilderAPI_MakeFace(wire1);
801 if (ff.IsNull()) out<<"face1 is null"<<endl;
802 ff1 = BRepBuilderAPI_MakeFace(wire2);
803 if (ff1.IsNull()) out<<"face2 is null"<<endl;
804 ff2 = BRepBuilderAPI_MakeFace(wire3);
805 if (ff2.IsNull()) out<<"face3 is null"<<endl;
806 ff3 = BRepBuilderAPI_MakeFace(wire4);
807 if (ff3.IsNull()) out<<"face4 is null"<<endl;
808 ff4 = BRepBuilderAPI_MakeFace(wire5);
809 if (ff4.IsNull()) out<<"face5 is null"<<endl;
810 ff5 = BRepBuilderAPI_MakeFace(wire6);
811 if (ff5.IsNull()) out<<"face6 is null"<<endl;
812 sew.Add(ff);
813 sew.Add(ff1);
814 sew.Add(ff2);
815 sew.Add(ff3);
816 sew.Add(ff4);
817 sew.Add(ff5);
818
819 sew.Perform();
820 sewedShape=sew.SewedShape();
821
822 if (sewedShape.IsNull()) out<<"Arb8 error"<<endl;
823
824 TopExp_Explorer anExp (sewedShape, TopAbs_SHELL);
825 if (anExp.More()) {
826 aTmpShape = anExp.Current();
827 newShell = TopoDS::Shell (aTmpShape);
828 }
829 BRepBuilderAPI_MakeSolid mySolid(newShell);
830 out.close();
831 return Reverse(mySolid.Solid());
832}
833
834
836 Double_t OX, Double_t OY, Double_t OZ)
837{
838 if (dz == 0.0)
839 dz = 0.1;
840 if (dy == 0.0)
841 dy = 0.1;
842 if (dx == 0.0)
843 dx = 0.1;
844
845 TopoDS_Solid box = BRepPrimAPI_MakeBox(gp_Pnt(OX - dx, OY - dy, OZ - dz),
846 2.0 * dx, 2.0 * dy, 2.0 * dz);
847 return Reverse(box);
848}
849
850
851TopoDS_Shape TGeoToOCC::OCC_Trd(Double_t dx1, Double_t dx2, Double_t dy1, Double_t dy2, Double_t dz)
852{
853 TopoDS_Wire wire;
854 BRepOffsetAPI_ThruSections sect(true,true);
855
856 TopoDS_Edge edge1;
857 TopoDS_Edge edge2;
858 TopoDS_Edge edge3;
859 TopoDS_Edge edge4;
860 gp_Pnt point1;
861 gp_Pnt point2;
862 gp_Pnt point3;
863 gp_Pnt point4;
864 for (Int_t i=0;i<2;i++) {
865 BRepBuilderAPI_MakePolygon poly;
866 if (i==1) {
867 dx1=dx2;
868 dy1=dy2;
869 dz=-dz;
870 }
871 point1=gp_Pnt(-dx1,-dy1,-dz);
872 point2=gp_Pnt(dx1,-dy1,-dz);
873 point3=gp_Pnt(dx1,dy1,-dz);
874 point4=gp_Pnt(-dx1,dy1,-dz);
875 poly.Add(point1);
876 poly.Add(point2);
877 poly.Add(point3);
878 poly.Add(point4);
879 poly.Close();
880 wire=poly.Wire();
881 sect.AddWire(wire);
882 poly.Delete();
883 }
884
885 sect.Build();
886 fOccShape=sect.Shape();
887
888 return fOccShape;
889}
890
892{
893 BRepBuilderAPI_MakePolygon poly;
894 TopoDS_Wire w ;
895 Int_t i;
896 for(i=0; i<num; i++) {
897 poly.Add(gp_Pnt(x[i], y[i],z));
898 }
899 poly.Add(gp_Pnt(x[0], y[0], z));
900 poly.Close();
901 w=poly.Wire();
902 return w;
903}
904
905
906TopoDS_Shape TGeoToOCC::OCC_Pcon(Double_t startPhi, Double_t deltaPhi,
907 Int_t zNum, Double_t *rMin, Double_t *rMax, Double_t *z)
908{
909
910 TopoDS_Shape pCone;
911 TopoDS_Shape cone;
912 Double_t zHalf=0.0;
913 gp_Trsf Transl;
914 gp_Trsf Transf;
915 for(Int_t nCon=0; nCon<zNum-1; nCon++) {
916 zHalf = (z[nCon+1]-z[nCon])/2.;
917 if ((zHalf==0)||(zHalf<0)) zHalf=0.1;
918 cone = OCC_Cones(rMin[nCon], rMax[nCon], rMin[(nCon+1)], rMax[(nCon+1)],zHalf, startPhi, deltaPhi);
919 Double_t r[] = {1,0,0,0,1,0,0,0,1};
920 Double_t t[] = {0,0,zHalf+z[nCon]};
921 Transl.SetTranslation(gp_Vec(t[0],t[1],t[2]));
922 Transf.SetValues(r[0],r[1],r[2],0,
923 r[3],r[4],r[5],0,
924 r[6],r[7],r[8],0
925#if OCC_VERSION_MAJOR == 6 && OCC_VERSION_MINOR < 8
926 ,0,1
927#endif
928 );
929 BRepBuilderAPI_Transform Transformation(Transf);
930 BRepBuilderAPI_Transform Translation(Transl);
931 Transformation.Perform(cone,true);
932 cone = Transformation.Shape();
933 Translation.Perform(cone, Standard_True);
934 cone = Translation.Shape();
935 if(nCon>0) {
936 BRepAlgoAPI_Fuse fuse(pCone, cone);
937 pCone=fuse.Shape();
938 } else
939 pCone=cone;
940 }
941 return Reverse(pCone);
942}
943
944
945TopoDS_Shape TGeoToOCC::OCC_Pgon(Int_t, Int_t nz, Double_t * p, Double_t phi1, Double_t DPhi, Int_t numpoint)
946{
947 BRepOffsetAPI_ThruSections sectInner(true,true);
948 BRepOffsetAPI_ThruSections sectOuter(true,true);
949 BRepLib_MakePolygon aPoly2;
950 TopoDS_Face f;
951 TopoDS_Wire w1,w2;
952 TopoDS_Solid myCut;
953 Int_t i=2;
954 Double_t z=p[2];
955 Int_t nzvert=0;
956 Double_t xx=0.0,yy=0.0,zz=0.0;
957 Double_t Xmax=0.0,Ymax=0.0, Zmax=0.0, max=0.0;
958 Int_t aa=0,bb=1,cc=2;
959 Int_t ind=0;
960 Int_t check=0;
961 //Int_t k=0;
962 gp_Pnt point;
963 gp_Trsf TR;
964 gp_Trsf TT;
965 while (i<numpoint){
966 if (IsEqual(p[i],z))
967 nzvert=nzvert+1;
968 i=i+3;
969 }
970 nzvert=nzvert/2;
971 for(Int_t c=0;c<numpoint;c++){
972 if ((p[check]>-1e-4)&&(p[check]<1e-4))
973 p[check]=0;
974 check=check+1;
975 }
976 for (i=0;i<nz;i++) {
977 for(Int_t j=0; j<2; j++) {
978 BRepLib_MakePolygon aPoly;
979 for (Int_t h=0;h<nzvert;h++){
980 xx=p[ind++];yy=p[ind++];zz=p[ind++];
981 point=gp_Pnt(xx,yy,zz);
982 aPoly.Add(point);
983 }
984 aPoly.Close();
985 if (j==0) {
986 w1 = aPoly.Wire();
987 sectInner.AddWire(w1);
988 }
989 if (j==1) {
990 w2 = aPoly.Wire();
991 sectOuter.AddWire(w2);
992 }
993 aPoly.Delete();
994 }
995 }
996 sectInner.Build();
997 sectOuter.Build();
998
999 BRepAlgoAPI_Cut Result(sectOuter.Shape(),sectInner.Shape() );
1000 Result.Build();
1001
1002 for (Int_t e=0;e<numpoint;e++){
1003 if (fabs(p[aa])>Xmax) {
1004 Xmax=fabs(p[aa]);
1005 }
1006 if (fabs(p[bb])>Ymax) {
1007 Ymax=fabs(p[bb]);
1008 }
1009 if (fabs(p[cc])>Zmax) {
1010 Zmax=fabs(p[cc]);
1011 }
1012 if(numpoint-1==cc) break;
1013 aa=aa+3;
1014 bb=bb+3;
1015 cc=cc+3;
1016 }
1017 if (Xmax>Ymax)
1018 max=Xmax;
1019 else
1020 max=Ymax;
1021 if ((IsEqual(DPhi,360.0))||(IsEqual(DPhi,0.))) {
1022 fOccShape=Result.Shape();
1023 return Reverse(fOccShape);
1024 } else {
1025 myCut=BRepPrimAPI_MakeCylinder (max+1,2*Zmax,(360.-DPhi)*M_PI/180.);
1026 TT.SetRotation(gp_Ax1(gp_Pnt(0.,0.,0.), gp_Vec(0., 0., 1.)), (-90.0+phi1)*M_PI/180.0);
1027 BRepBuilderAPI_Transform theTT(TT);
1028 theTT.Perform(myCut, Standard_True);
1029 fOccShape=theTT.Shape();
1030 TR.SetTranslation(gp_Vec(0,0,-Zmax));
1031 BRepBuilderAPI_Transform theTR(TR);
1032 theTR.Perform(fOccShape, Standard_True);
1033 fOccShape=theTR.Shape();
1034 BRepAlgoAPI_Cut Result2(Result.Shape(),fOccShape );
1035 Result2.Build();
1036 fOccShape=Result2.Shape();
1037 //if (fOccShape.IsNull()) cout<<"The Pgon shae is null. Cut Operation Error: "<<Result2.ErrorStatus()<<endl;
1038 return Reverse(fOccShape);
1039 }
1040}
1041
1042
1043TopoDS_Shape TGeoToOCC::Reverse(TopoDS_Shape Shape)
1044{
1045 BRepClass3d_SolidClassifier * setPrecision= new BRepClass3d_SolidClassifier (Shape);
1046 setPrecision->PerformInfinitePoint(Precision::Confusion());
1047 if (setPrecision->State() == TopAbs_IN) {
1048 //cout<<"reverse"<<endl;
1049 Shape.Reverse();
1050 }
1051 delete(setPrecision);
1052 return Shape;
1053}
1054
void Class()
Definition: Class.C:29
SVector< double, 2 > v
Definition: Dict.h:5
ROOT::R::TRInterface & r
Definition: Object.C:4
#define d(i)
Definition: RSha256.hxx:102
#define b(i)
Definition: RSha256.hxx:100
#define f(i)
Definition: RSha256.hxx:104
#define c(i)
Definition: RSha256.hxx:101
#define h(i)
Definition: RSha256.hxx:106
#define e(i)
Definition: RSha256.hxx:103
static double p3(double t, double a, double b, double c, double d)
static double p1(double t, double a, double b)
static double p2(double t, double a, double b, double c)
#define M_PI
Definition: Rotated.cxx:105
int Int_t
Definition: RtypesCore.h:41
double Double_t
Definition: RtypesCore.h:55
int type
Definition: TGX11.cxx:120
double tan(double)
double sqrt(double)
point * points
Definition: X3DBuffer.c:22
An arbitrary trapezoid with less than 8 vertices standing on two parallel planes perpendicular to Z a...
Definition: TGeoArb8.h:18
Double_t GetDz() const
Definition: TGeoArb8.h:63
Double_t * GetVertices()
Definition: TGeoArb8.h:67
Box class.
Definition: TGeoBBox.h:18
virtual const Double_t * GetOrigin() const
Definition: TGeoBBox.h:73
virtual Double_t GetDX() const
Definition: TGeoBBox.h:70
virtual Double_t GetDZ() const
Definition: TGeoBBox.h:72
virtual Double_t GetDY() const
Definition: TGeoBBox.h:71
Base class for Boolean operations between two shapes.
Definition: TGeoBoolNode.h:25
virtual EGeoBoolType GetBooleanOperator() const =0
TGeoMatrix * GetRightMatrix() const
Definition: TGeoBoolNode.h:79
TGeoShape * GetLeftShape() const
Definition: TGeoBoolNode.h:80
TGeoMatrix * GetLeftMatrix() const
Definition: TGeoBoolNode.h:78
TGeoShape * GetRightShape() const
Definition: TGeoBoolNode.h:81
Class handling Boolean composition of shapes.
TGeoBoolNode * GetBoolNode() const
A phi segment of a conical tube.
Definition: TGeoCone.h:99
Double_t GetPhi1() const
Definition: TGeoCone.h:160
Double_t GetPhi2() const
Definition: TGeoCone.h:161
Conical tube class.
Definition: TGeoCone.h:18
virtual Double_t GetRmax2() const
Definition: TGeoCone.h:76
virtual Double_t GetDz() const
Definition: TGeoCone.h:68
virtual Double_t GetRmin2() const
Definition: TGeoCone.h:75
virtual Double_t GetRmin1() const
Definition: TGeoCone.h:73
virtual Double_t GetRmax1() const
Definition: TGeoCone.h:74
A tube segment cut with 2 planes.
Definition: TGeoTube.h:169
const Double_t * GetNlow() const
Definition: TGeoTube.h:207
const Double_t * GetNhigh() const
Definition: TGeoTube.h:208
Elliptical tube class.
Definition: TGeoEltu.h:18
virtual Double_t GetA() const
Definition: TGeoEltu.h:43
virtual Double_t GetB() const
Definition: TGeoEltu.h:44
Matrix class used for computing global transformations Should NOT be used for node definition.
Definition: TGeoMatrix.h:421
virtual const Double_t * GetTranslation() const
Definition: TGeoMatrix.h:467
virtual const Double_t * GetRotationMatrix() const
Definition: TGeoMatrix.h:468
Hyperboloid class defined by 5 parameters.
Definition: TGeoHype.h:18
Double_t GetStIn() const
Definition: TGeoHype.h:68
Double_t GetStOut() const
Definition: TGeoHype.h:69
Geometrical transformation package.
Definition: TGeoMatrix.h:41
A polycone.
Definition: TGeoPcon.h:18
Double_t * GetRmax() const
Definition: TGeoPcon.h:77
Double_t GetDphi() const
Definition: TGeoPcon.h:72
Double_t * GetZ() const
Definition: TGeoPcon.h:79
Int_t GetNz() const
Definition: TGeoPcon.h:73
Double_t * GetRmin() const
Definition: TGeoPcon.h:75
Double_t GetPhi1() const
Definition: TGeoPcon.h:71
A polygone.
Definition: TGeoPgon.h:20
virtual Int_t GetNsegments() const
Returns number of segments on each mesh circle segment.
Definition: TGeoPgon.h:83
virtual void SetPoints(Double_t *points) const
create polygone mesh points
Definition: TGeoPgon.cxx:1870
virtual Int_t GetNmeshVertices() const
Return number of vertices of the mesh representation.
Definition: TGeoPgon.cxx:1943
Base abstract class for all shapes.
Definition: TGeoShape.h:26
virtual const char * GetName() const
Get the shape name.
Definition: TGeoShape.cxx:248
virtual void SetPoints(Double_t *points) const =0
Spherical shell class.
Definition: TGeoSphere.h:18
Double_t GetPhi1() const
Definition: TGeoSphere.h:71
Double_t GetPhi2() const
Definition: TGeoSphere.h:72
virtual Double_t GetRmin() const
Definition: TGeoSphere.h:67
Double_t GetTheta2() const
Definition: TGeoSphere.h:70
virtual Double_t GetRmax() const
Definition: TGeoSphere.h:68
Double_t GetTheta1() const
Definition: TGeoSphere.h:69
TopoDS_Shape Reverse(TopoDS_Shape Shape)
Definition: TGeoToOCC.cxx:1043
virtual ~TGeoToOCC()
Definition: TGeoToOCC.cxx:124
TopoDS_Shape OCC_Box(Double_t dx, Double_t dy, Double_t dz, Double_t OX, Double_t OY, Double_t OZ)
Definition: TGeoToOCC.cxx:835
TopoDS_Shape OCC_CompositeShape(TGeoCompositeShape *cs, TGeoHMatrix matrix)
Definition: TGeoToOCC.cxx:225
TopoDS_Shape OCC_ParaTrap(Double_t *vertex)
Definition: TGeoToOCC.cxx:670
TopoDS_Shape OCC_EllTube(Double_t Dx, Double_t Dy, Double_t Dz)
Definition: TGeoToOCC.cxx:322
TopoDS_Shape OCC_Torus(Double_t Rmin, Double_t Rmax, Double_t Rtor, Double_t SPhi, Double_t DPhi)
Definition: TGeoToOCC.cxx:347
TopoDS_Shape OCC_Xtru(TGeoXtru *TG_Xtru)
Definition: TGeoToOCC.cxx:588
TopoDS_Shape OCC_Pcon(Double_t startPhi, Double_t deltaPhi, Int_t zNum, Double_t *rMin, Double_t *rMax, Double_t *z)
Definition: TGeoToOCC.cxx:906
TopoDS_Wire Polygon(Double_t *x, Double_t *y, Double_t z, Int_t num)
Definition: TGeoToOCC.cxx:891
TopoDS_Shape OCC_Tube(Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t phi2)
Definition: TGeoToOCC.cxx:422
TopoDS_Shape OCC_Cones(Double_t rmin1, Double_t rmax1, Double_t rmin2, Double_t rmax2, Double_t dz, Double_t phi1, Double_t phi2)
Definition: TGeoToOCC.cxx:460
TopoDS_Shape fOccShape
Definition: TGeoToOCC.h:51
TopoDS_Shape OCC_Hype(Double_t rmin, Double_t rmax, Double_t stin, Double_t stout, Double_t dz)
Definition: TGeoToOCC.cxx:613
TopoDS_Shape OCC_Trd(Double_t dx1, Double_t dx2, Double_t dy1, Double_t dy2, Double_t dz)
Definition: TGeoToOCC.cxx:851
TopoDS_Shape OCC_SimpleShape(TGeoShape *TG_Shape)
Definition: TGeoToOCC.cxx:129
TopoDS_Shape OCC_Sphere(Double_t rmin, Double_t rmax, Double_t phi1, Double_t Dphi, Double_t theta1, Double_t Dtheta)
Definition: TGeoToOCC.cxx:374
TopoDS_Shape OCC_Pgon(Int_t np, Int_t nz, Double_t *p, Double_t phi1, Double_t DPhi, Int_t numpoint)
Definition: TGeoToOCC.cxx:945
ofstream out
Definition: TGeoToOCC.h:50
TopoDS_Shape OCC_Arb8(Double_t dz, Double_t *ivert, Double_t *points)
Definition: TGeoToOCC.cxx:705
TopoDS_Shape OCC_Cuttub(Double_t rmin, Double_t rmax, Double_t dz, Double_t phi1, Double_t Dphi, const Double_t *Nlow, const Double_t *Nhigh)
Definition: TGeoToOCC.cxx:491
Torus segment class.
Definition: TGeoTorus.h:18
Double_t GetRmax() const
Definition: TGeoTorus.h:71
Double_t GetRmin() const
Definition: TGeoTorus.h:70
Double_t GetR() const
Definition: TGeoTorus.h:69
Double_t GetPhi1() const
Definition: TGeoTorus.h:72
Double_t GetDphi() const
Definition: TGeoTorus.h:73
A trapezoid with only x length varying with z.
Definition: TGeoTrd1.h:18
Double_t GetDy() const
Definition: TGeoTrd1.h:57
Double_t GetDx2() const
Definition: TGeoTrd1.h:56
Double_t GetDz() const
Definition: TGeoTrd1.h:58
Double_t GetDx1() const
Definition: TGeoTrd1.h:55
A trapezoid with both x and y lengths varying with z.
Definition: TGeoTrd2.h:18
Double_t GetDy2() const
Definition: TGeoTrd2.h:59
Double_t GetDy1() const
Definition: TGeoTrd2.h:58
Double_t GetDx2() const
Definition: TGeoTrd2.h:57
Double_t GetDz() const
Definition: TGeoTrd2.h:60
Double_t GetDx1() const
Definition: TGeoTrd2.h:56
A phi segment of a tube.
Definition: TGeoTube.h:89
Double_t GetPhi2() const
Definition: TGeoTube.h:149
Double_t GetPhi1() const
Definition: TGeoTube.h:148
Cylindrical tube class.
Definition: TGeoTube.h:18
virtual Double_t GetRmin() const
Definition: TGeoTube.h:66
virtual Double_t GetDz() const
Definition: TGeoTube.h:68
virtual Double_t GetRmax() const
Definition: TGeoTube.h:67
An extrusion with fixed outline shape in x-y and a sequence of z extents (segments).
Definition: TGeoXtru.h:22
Double_t GetYOffset(Int_t i) const
Definition: TGeoXtru.h:98
Double_t * GetZ() const
Definition: TGeoXtru.h:100
Int_t GetNvert() const
Definition: TGeoXtru.h:94
Double_t GetY(Int_t i) const
Definition: TGeoXtru.h:96
Double_t GetScale(Int_t i) const
Definition: TGeoXtru.h:99
Double_t GetXOffset(Int_t i) const
Definition: TGeoXtru.h:97
Int_t GetNz() const
Definition: TGeoXtru.h:93
Double_t GetX(Int_t i) const
Definition: TGeoXtru.h:95
Basic string class.
Definition: TString.h:131
void box(Int_t pat, Double_t x1, Double_t y1, Double_t x2, Double_t y2)
Definition: fillpatterns.C:1
Double_t y[n]
Definition: legend1.C:17
Double_t x[n]
Definition: legend1.C:17
VecExpr< UnaryOp< Fabs< T >, VecExpr< A, T, D >, T >, T, D > fabs(const VecExpr< A, T, D > &rhs)
static constexpr double s
auto * m
Definition: textangle.C:8
auto * a
Definition: textangle.C:12
REAL * vertex
Definition: triangle.c:512