3 #include <User_Cylinder.hxx>
5 // Implementation of Handle and type mgt
7 IMPLEMENT_STANDARD_HANDLE(User_Cylinder,AIS_InteractiveObject)
8 IMPLEMENT_STANDARD_RTTIEXT(User_Cylinder,AIS_InteractiveObject)
10 #include "ColoredMeshDlg.h"
12 #include <Graphic3d_ArrayOfTriangles.hxx>
13 #include <Graphic3d_StructureManager.hxx>
14 #include <PrsMgr_PresentationManager3d.hxx>
15 #include <BRepMesh.hxx>
16 #include <StdPrs_ToolShadedShape.hxx>
17 #include <Poly_Connect.hxx>
18 #include <TColgp_Array1OfPnt.hxx>
19 #include <Poly_Triangulation.hxx>
20 #include <TColgp_Array1OfDir.hxx>
21 #include <GProp_PGProps.hxx>
22 #include <Graphic3d_Array1OfVertex.hxx>
23 #include <Aspect_Array1OfEdge.hxx>
24 #include <Quantity_Color.hxx>
26 #include <AIS_GraphicTool.hxx>
28 // Constructors implementation
31 User_Cylinder::User_Cylinder(const Standard_Real R, const Standard_Real H) :
32 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
34 BRepPrimAPI_MakeCylinder S(R,H);
38 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
39 myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
40 myCylindricalFaceColor = Quantity_NOC_GRAY;
43 User_Cylinder::User_Cylinder(const gp_Ax2 CylAx2, const Standard_Real R, const Standard_Real H) :
44 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
47 BRepPrimAPI_MakeCylinder S(CylAx2,R,H);
48 BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
49 myShape = aNurbsConvert.Shape();
52 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
53 myPlanarFaceColor = Quantity_NOC_FIREBRICK3;
54 myCylindricalFaceColor = Quantity_NOC_KHAKI4;
57 void User_Cylinder::Compute(const Handle_PrsMgr_PresentationManager3d& /*aPresentationManager*/,
58 const Handle_Prs3d_Presentation& aPresentation,
59 const Standard_Integer aMode )
63 StdPrs_WFDeflectionShape::Add(aPresentation,myShape, myDrawer );
68 Standard_Real aTransparency = Transparency();
69 Graphic3d_NameOfMaterial aMaterial = Material();
70 myDrawer->SetShadingAspectGlobal(Standard_False);
72 Handle(Geom_Surface) Surface;
74 for (Ex.Init(myShape,TopAbs_FACE); Ex.More(); Ex.Next())
77 Surface = BRep_Tool::Surface(TopoDS::Face(Ex.Current()));
78 myDrawer->ShadingAspect()->SetMaterial(aMaterial);
79 if (Surface->IsKind(STANDARD_TYPE(Geom_Plane)))
80 myDrawer->ShadingAspect()->SetColor(myPlanarFaceColor);
82 myDrawer->ShadingAspect()->SetColor(myCylindricalFaceColor);
85 myDrawer->ShadingAspect()->SetTransparency (aTransparency);
86 StdPrs_ShadedShape::Add(aPresentation,Ex.Current(), myDrawer);
93 BRepTools::Clean(myShape);
94 BRepTools::Update(myShape);
96 Handle(Graphic3d_StructureManager) aStrucMana = GetContext()->MainPrsMgr()->StructureManager();
98 Handle(Graphic3d_Group) mygroup = Prs3d_Root::CurrentGroup(aPresentation);
99 myAspect = (new Prs3d_ShadingAspect())->Aspect();
100 Graphic3d_MaterialAspect material = myAspect->FrontMaterial();
101 material.SetReflectionModeOff(Graphic3d_TOR_AMBIENT);
102 material.SetReflectionModeOff(Graphic3d_TOR_DIFFUSE);
103 material.SetReflectionModeOff(Graphic3d_TOR_SPECULAR);
104 material.SetReflectionModeOff(Graphic3d_TOR_EMISSION);
105 myAspect->SetFrontMaterial(material);
107 mygroup->SetPrimitivesAspect(myAspect);
108 myAspect->SetEdgeOn();
110 myDeflection = AIS_Shape::GetDeflection(myShape,myDrawer);
111 BRepMesh::Mesh(myShape,myDeflection);
113 myX1OnOff = Standard_False;
114 myXBlueOnOff = Standard_False;
115 myXGreenOnOff =Standard_False;
116 myXRedOnOff = Standard_False;
117 myY1OnOff = Standard_False;
118 myYBlueOnOff = Standard_False;
119 myYGreenOnOff = Standard_False;
120 myYRedOnOff = Standard_False;
121 myZ1OnOff = Standard_False;
122 myZBlueOnOff =Standard_False;
123 myZGreenOnOff = Standard_False;
124 myZRedOnOff = Standard_False;
126 CColoredMeshDlg Dlg(NULL);
129 myX1OnOff = Dlg.X1OnOff;
131 myXBlueOnOff = Dlg.m_CheckXBlueOnOff;
132 myXGreenOnOff = Dlg.m_CheckXGreenOnOff;
133 myXRedOnOff = Dlg.m_CheckXRedOnOff;
135 myY1OnOff = Dlg.Y1OnOff;
137 myYBlueOnOff = Dlg.m_CheckYBlueOnOff;
138 myYGreenOnOff = Dlg.m_CheckYGreenOnOff;
139 myYRedOnOff = Dlg.m_CheckYRedOnOff;
141 myZ1OnOff = Dlg.Z1OnOff;
143 myZBlueOnOff = Dlg.m_CheckZBlueOnOff;
144 myZGreenOnOff = Dlg.m_CheckZGreenOnOff;
145 myZRedOnOff = Dlg.m_CheckZRedOnOff;
147 // Adds a triangulation of the shape myShape to its topological data structure.
148 // This triangulation is computed with the deflection myDeflection.
151 cout <<"Deflection = " << myDeflection << "\n" << endl;
154 StdPrs_ToolShadedShape SST;
156 Standard_Integer NumFace;
157 TopExp_Explorer ExpFace;
162 gp_Pnt B (0,0,1000000000);
163 for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ )
165 TopoDS_Face myFace = TopoDS::Face(ExpFace.Current());
166 TopLoc_Location myLocation = myFace.Location();
169 cout << "J\'explore actuellement la face " << NumFace << "\n" << endl;
171 Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation);
172 // Returns the Triangulation of the face. It is a null handle if there is no triangulation.
177 // cout << "Triangulation of the face "<< i <<" is null \n"<< endl;
182 const TColgp_Array1OfPnt& Nodes= myT->Nodes();
184 const Poly_Array1OfTriangle& triangles = myT->Triangles();
186 Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles
187 Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant
188 // ni : sommet i du triangle courant
189 //recherche du pt "haut" et du pt "bas
190 for (nt = 1; nt <= nnn; nt++)
192 // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
194 if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
195 triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
197 triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
199 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
200 { // Associates a vertexNT to each node
201 gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
202 gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
203 gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
205 if (p.Z() > H.Z()) H=p;
206 if (q.Z() > H.Z()) H=q;
207 if (r.Z() > H.Z()) H=r;
208 if (p.Z() < B.Z()) B=p;
209 if (q.Z() < B.Z()) B=q;
210 if (r.Z() < B.Z()) B=r;
218 for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ )
220 TopoDS_Face myFace = TopoDS::Face(ExpFace.Current());
221 TopLoc_Location myLocation = myFace.Location();
224 cout << "J\'explore actuellement la face " << NumFace << "\n" << endl;
226 Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation);
227 // Returns the Triangulation of the face. It is a null handle if there is no triangulation.
232 //cout << "Triangulation of the face "<< i <<" is null \n"<< endl;
236 Poly_Connect pc(myT);
237 const TColgp_Array1OfPnt& Nodes= myT->Nodes();
238 BAR = GProp_PGProps::Barycentre(Nodes);
241 //const TColgp_Array1OfPnt2d& UVNodes = myT->UVNodes();
242 const Poly_Array1OfTriangle& triangles = myT->Triangles();
243 TColgp_Array1OfDir myNormal(Nodes.Lower(), Nodes.Upper());
245 SST.Normal(myFace, pc, myNormal);
246 BRepTools::UVBounds(myFace,Umin, Umax, Vmin, Vmax);
247 dUmax = (Umax - Umin);
248 dVmax = (Vmax - Vmin);
250 Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles
251 Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant
252 // ni : sommet i du triangle courant
254 //recherche du pt "haut" et du pt "bas
256 // gp_Pnt B (0,0,1000000000);
258 for (nt = 1; nt <= nnn; nt++)
260 // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
261 if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
262 triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
264 triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
266 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
267 { // Associates a vertexNT to each node
268 gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
269 gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
270 gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
274 Handle(Graphic3d_ArrayOfTriangles) aOP = new Graphic3d_ArrayOfTriangles(3 * nnn, 0, Standard_True, Standard_True);
276 for (nt = 1; nt <= nnn; nt++)
279 cout << "On traite actuellement le triangle : "<< nt <<"\n";
281 if (SST.Orientation(myFace) == TopAbs_REVERSED) // si la face est "reversed"
282 triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
284 triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
286 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
287 { // Associates a vertexNT to each node
289 TColgp_Array1OfPnt Points(1,3);
291 gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
292 gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
293 gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
295 Points(1).SetCoord(p.X(), p.Y(), p.Z());
296 Points(2).SetCoord(q.X(), q.Y(), q.Z());
297 Points(3).SetCoord(r.X(), r.Y(), r.Z());
299 aOP->AddVertex(Points(1), myNormal(n1), Color(p,B.Z(),H.Z(),Dlg.Colorization));
300 aOP->AddVertex(Points(2), myNormal(n2), Color(q,B.Z(),H.Z(),Dlg.Colorization));
301 aOP->AddVertex(Points(3), myNormal(n3), Color(r,B.Z(),H.Z(),Dlg.Colorization));
302 } // end of "if the triangle is valid
303 } // end of the "parcours" of the triangles
305 Prs3d_Root::CurrentGroup (aPresentation)->AddPrimitiveArray (aOP);
307 mygroup->SetGroupPrimitivesAspect(myAspect);
308 }// end of the exploration of the shape in faces
315 void User_Cylinder::Compute(const Handle_Prs3d_Projector& aProjector,
316 const Handle_Prs3d_Presentation& aPresentation)
318 myDrawer->EnableDrawHiddenLine();
319 StdPrs_HLRPolyShape::Add(aPresentation,myShape,myDrawer,aProjector);
322 void User_Cylinder::ComputeSelection(const Handle_SelectMgr_Selection& aSelection,
323 const Standard_Integer aMode)
328 StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_SHAPE, 0.01, 0.1);
331 StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_FACE, 0.01, 0.1);
336 Standard_Integer User_Cylinder::NbPossibleSelection() const
341 Standard_Boolean User_Cylinder::AcceptShapeDecomposition() const
343 return Standard_True;
346 void User_Cylinder::SetPlanarFaceColor(const Quantity_Color acolor)
348 myPlanarFaceColor = acolor;
351 void User_Cylinder::SetCylindricalFaceColor(const Quantity_Color acolor)
353 myCylindricalFaceColor = acolor;
356 Standard_Boolean User_Cylinder::TriangleIsValid(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3) const
358 gp_Vec V1(P1,P2);// V1=(P1,P2)
359 gp_Vec V2(P2,P3);// V2=(P2,P3)
360 gp_Vec V3(P3,P1);// V3=(P3,P1)
362 if ((V1.SquareMagnitude() > 1.e-10) && (V2.SquareMagnitude() > 1.e-10) && (V3.SquareMagnitude() > 1.e-10))
364 V1.Cross(V2);// V1 = Normal
365 if (V1.SquareMagnitude() > 1.e-10)
366 return Standard_True;
368 return Standard_False;
371 return Standard_False;
374 Quantity_Color User_Cylinder::Color(gp_Pnt& thePoint,Standard_Real AltMin,Standard_Real AltMax,
375 const Standard_Integer ColorizationMode)
377 red =1; //initializing colors parameters
380 switch ( ColorizationMode)
382 case 0 : //normal, vert/maron
384 Standard_Real Alt= thePoint.Z();
386 Standard_Real AltDelta;
388 AltDelta = AltMax-AltMin;
390 red = 0.5- ((0.5*(AltMax-Alt))/(AltDelta));
391 //Standard_Real A = 7*Alt-7*AltMin;
392 green = (3*AltMax-AltMin)/(3*AltMax-AltMin+(7*Alt-7*AltMin));
395 Quantity_Color color;
396 color.SetValues(red,green,blue, Quantity_TOC_RGB);
403 Standard_Real Alt= thePoint.Z();
405 Standard_Real b =AltMax-AltMin;
406 Standard_Real a= AltMax-thePoint.Z();
411 if (0<a && a <= (b/5))
417 else if ((b/5)<a && a <= (2*b/5))
423 else if ((2*b/5)<a && a <= (18*b/20))
425 green =1/(((7/(3*AltMax-AltMin))*Alt)+(1-(7*AltMin/(3*AltMax-AltMin))));
426 red = 1/(((1000/(AltMax-AltMin))*Alt)+1000*(1-(AltMin/(AltMax-AltMin))));
429 else if ((18*b/20)<a && a <= (18.5*b/20))
436 else if ((18.5*b/20)<a && a <= b)
442 Quantity_Color color;
443 color.SetValues(red,green,blue, Quantity_TOC_RGB);
450 gp_Pnt P (85.,0.,-105.);
451 gp_Vec TheVect ( P, thePoint);
452 Standard_Real CoordX;
453 Standard_Real CoordY;
454 Standard_Real CoordZ;
456 CoordX = TheVect.X();
457 CoordY = TheVect.Y();
458 CoordZ = TheVect.Z();
460 Standard_Real Distance = BAR.Distance ( P);
462 Standard_Real a =fabs(CoordX);
463 Standard_Real b =fabs(CoordY);
464 Standard_Real c =fabs(CoordZ);
466 Standard_Real xx = a / Max(Distance,a); //(Max (Distance, Maxi));
467 Standard_Real yy = b / Max(Distance,b); //(Max (Distance, Maxi));
468 Standard_Real zz = c / Max(Distance,c); //(Max (Distance, Maxi));
473 else if (myXGreenOnOff)
475 else if (myXBlueOnOff)
480 else if (myYGreenOnOff)
482 else if (myYBlueOnOff)
487 else if (myZGreenOnOff)
489 else if (myZBlueOnOff)
491 Quantity_Color color;
492 color.SetValues(red,green,blue, Quantity_TOC_RGB);
502 void User_Cylinder::SetColor(const Quantity_Color &aColor)
504 AIS_InteractiveObject::SetColor(aColor);
505 SetPlanarFaceColor(aColor);
506 SetCylindricalFaceColor(aColor);