3 #include <User_Cylinder.hxx>
5 // Implementation of Handle and type mgt
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 <StdPrs_ToolTriangulatedShape.hxx>
16 #include <Poly_Connect.hxx>
17 #include <TColgp_Array1OfPnt.hxx>
18 #include <Poly_Triangulation.hxx>
19 #include <TColgp_Array1OfDir.hxx>
20 #include <GProp_PGProps.hxx>
21 #include <Quantity_Color.hxx>
22 #include <BRepMesh_IncrementalMesh.hxx>
25 #include <AIS_GraphicTool.hxx>
27 // Constructors implementation
30 User_Cylinder::User_Cylinder(const Standard_Real R, const Standard_Real H) :
31 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
33 BRepPrimAPI_MakeCylinder S(R,H);
36 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
37 myColor = Quantity_NOC_GRAY;
40 User_Cylinder::User_Cylinder(const gp_Ax2 CylAx2, const Standard_Real R, const Standard_Real H) :
41 AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant)
44 BRepPrimAPI_MakeCylinder S(CylAx2,R,H);
45 BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape());
46 myShape = aNurbsConvert.Shape();
48 myDrawer->SetShadingAspect(new Prs3d_ShadingAspect());
49 myColor = Quantity_NOC_KHAKI4;
52 void User_Cylinder::Compute(const Handle(PrsMgr_PresentationManager3d)& /*aPresentationManager*/,
53 const Handle(Prs3d_Presentation)& aPresentation,
54 const Standard_Integer aMode )
59 StdPrs_WFShape::Add(aPresentation,myShape, myDrawer );
64 Standard_Real aTransparency = Transparency();
65 Graphic3d_NameOfMaterial aMaterial = Material();
66 myDrawer->ShadingAspect()->SetMaterial(aMaterial);
67 myDrawer->ShadingAspect()->SetColor(myColor);
68 myDrawer->ShadingAspect()->SetTransparency (aTransparency);
69 StdPrs_ShadedShape::Add(aPresentation,myShape, myDrawer);
74 BRepTools::Clean(myShape);
75 BRepTools::Update(myShape);
77 Handle(Graphic3d_StructureManager) aStrucMana = GetContext()->MainPrsMgr()->StructureManager();
79 Handle(Graphic3d_Group) mygroup = Prs3d_Root::CurrentGroup(aPresentation);
80 myAspect = (new Prs3d_ShadingAspect())->Aspect();
81 Graphic3d_MaterialAspect material = myAspect->FrontMaterial();
82 material.SetAmbientColor (Quantity_NOC_BLACK);
83 material.SetDiffuseColor (Quantity_NOC_BLACK);
84 material.SetSpecularColor(Quantity_NOC_BLACK);
85 material.SetEmissiveColor(Quantity_NOC_BLACK);
86 myAspect->SetFrontMaterial(material);
88 mygroup->SetPrimitivesAspect(myAspect);
89 myAspect->SetEdgeOn();
91 myDeflection = Prs3d::GetDeflection(myShape,myDrawer);
92 BRepMesh_IncrementalMesh(myShape,myDeflection);
94 myX1OnOff = Standard_False;
95 myXBlueOnOff = Standard_False;
96 myXGreenOnOff =Standard_False;
97 myXRedOnOff = Standard_False;
98 myY1OnOff = Standard_False;
99 myYBlueOnOff = Standard_False;
100 myYGreenOnOff = Standard_False;
101 myYRedOnOff = Standard_False;
102 myZ1OnOff = Standard_False;
103 myZBlueOnOff =Standard_False;
104 myZGreenOnOff = Standard_False;
105 myZRedOnOff = Standard_False;
107 CColoredMeshDlg Dlg(NULL);
110 myX1OnOff = Dlg.X1OnOff;
112 myXBlueOnOff = Dlg.m_CheckXBlueOnOff != 0;
113 myXGreenOnOff = Dlg.m_CheckXGreenOnOff != 0;
114 myXRedOnOff = Dlg.m_CheckXRedOnOff != 0;
116 myY1OnOff = Dlg.Y1OnOff;
118 myYBlueOnOff = Dlg.m_CheckYBlueOnOff != 0;
119 myYGreenOnOff = Dlg.m_CheckYGreenOnOff != 0;
120 myYRedOnOff = Dlg.m_CheckYRedOnOff != 0;
122 myZ1OnOff = Dlg.Z1OnOff;
124 myZBlueOnOff = Dlg.m_CheckZBlueOnOff != 0;
125 myZGreenOnOff = Dlg.m_CheckZGreenOnOff != 0;
126 myZRedOnOff = Dlg.m_CheckZRedOnOff != 0;
128 // Adds a triangulation of the shape myShape to its topological data structure.
129 // This triangulation is computed with the deflection myDeflection.
132 std::cout <<"Deflection = " << myDeflection << "\n" << std::endl;
135 Standard_Integer NumFace;
136 TopExp_Explorer ExpFace;
141 gp_Pnt B (0,0,1000000000);
142 for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ )
144 TopoDS_Face myFace = TopoDS::Face(ExpFace.Current());
145 TopLoc_Location myLocation = myFace.Location();
148 std::cout << "J\'explore actuellement la face " << NumFace << "\n" << std::endl;
150 Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation);
151 // Returns the Triangulation of the face. It is a null handle if there is no triangulation.
156 // std::cout << "Triangulation of the face "<< i <<" is null \n"<< std::endl;
161 const TColgp_Array1OfPnt& Nodes= myT->Nodes();
163 const Poly_Array1OfTriangle& triangles = myT->Triangles();
165 Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles
166 Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant
167 // ni : sommet i du triangle courant
168 //recherche du pt "haut" et du pt "bas
169 for (nt = 1; nt <= nnn; nt++)
171 // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
173 if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed"
174 triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
176 triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
178 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
179 { // Associates a vertexNT to each node
180 gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
181 gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
182 gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
184 if (p.Z() > H.Z()) H=p;
185 if (q.Z() > H.Z()) H=q;
186 if (r.Z() > H.Z()) H=r;
187 if (p.Z() < B.Z()) B=p;
188 if (q.Z() < B.Z()) B=q;
189 if (r.Z() < B.Z()) B=r;
197 for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ )
199 TopoDS_Face myFace = TopoDS::Face(ExpFace.Current());
200 TopLoc_Location myLocation = myFace.Location();
203 std::cout << "J\'explore actuellement la face " << NumFace << "\n" << std::endl;
205 Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation);
206 // Returns the Triangulation of the face. It is a null handle if there is no triangulation.
211 //std::cout << "Triangulation of the face "<< i <<" is null \n"<< std::endl;
215 Poly_Connect pc(myT);
216 const TColgp_Array1OfPnt& Nodes= myT->Nodes();
217 BAR = GProp_PGProps::Barycentre(Nodes);
220 //const TColgp_Array1OfPnt2d& UVNodes = myT->UVNodes();
221 const Poly_Array1OfTriangle& triangles = myT->Triangles();
222 TColgp_Array1OfDir myNormal(Nodes.Lower(), Nodes.Upper());
224 StdPrs_ToolTriangulatedShape::Normal(myFace, pc, myNormal);
225 BRepTools::UVBounds(myFace,Umin, Umax, Vmin, Vmax);
226 dUmax = (Umax - Umin);
227 dVmax = (Vmax - Vmin);
229 Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles
230 Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant
231 // ni : sommet i du triangle courant
233 //recherche du pt "haut" et du pt "bas
235 // gp_Pnt B (0,0,1000000000);
237 for (nt = 1; nt <= nnn; nt++)
239 // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
240 if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed"
241 triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
243 triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
245 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
246 { // Associates a vertexNT to each node
247 gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
248 gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
249 gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
253 Handle(Graphic3d_ArrayOfTriangles) aOP = new Graphic3d_ArrayOfTriangles(3 * nnn, 0, Standard_True, Standard_True);
255 for (nt = 1; nt <= nnn; nt++)
258 std::cout << "On traite actuellement le triangle : "<< nt <<"\n";
260 if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed"
261 triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2
263 triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3
265 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) )
266 { // Associates a vertexNT to each node
268 TColgp_Array1OfPnt Points(1,3);
270 gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation());
271 gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation());
272 gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation());
274 Points(1).SetCoord(p.X(), p.Y(), p.Z());
275 Points(2).SetCoord(q.X(), q.Y(), q.Z());
276 Points(3).SetCoord(r.X(), r.Y(), r.Z());
278 aOP->AddVertex(Points(1), myNormal(n1), Color(p,B.Z(),H.Z(),Dlg.Colorization));
279 aOP->AddVertex(Points(2), myNormal(n2), Color(q,B.Z(),H.Z(),Dlg.Colorization));
280 aOP->AddVertex(Points(3), myNormal(n3), Color(r,B.Z(),H.Z(),Dlg.Colorization));
281 } // end of "if the triangle is valid
282 } // end of the "parcours" of the triangles
284 Prs3d_Root::CurrentGroup (aPresentation)->AddPrimitiveArray (aOP);
286 mygroup->SetGroupPrimitivesAspect(myAspect);
287 }// end of the exploration of the shape in faces
294 void User_Cylinder::Compute(const Handle(Prs3d_Projector)& aProjector,
295 const Handle(Prs3d_Presentation)& aPresentation)
297 Handle (Prs3d_Drawer) aDefDrawer = GetContext()->DefaultDrawer();
298 if (aDefDrawer->DrawHiddenLine())
299 myDrawer->EnableDrawHiddenLine();
301 myDrawer->DisableDrawHiddenLine();
302 StdPrs_HLRPolyShape::Add(aPresentation,myShape,myDrawer,aProjector);
305 void User_Cylinder::ComputeSelection(const Handle(SelectMgr_Selection)& aSelection,
306 const Standard_Integer aMode)
311 StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_SHAPE, 0.01, 0.1);
314 StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_FACE, 0.01, 0.1);
319 Standard_Integer User_Cylinder::NbPossibleSelection() const
324 Standard_Boolean User_Cylinder::AcceptShapeDecomposition() const
326 return Standard_True;
329 Standard_Boolean User_Cylinder::TriangleIsValid(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3) const
331 gp_Vec V1(P1,P2);// V1=(P1,P2)
332 gp_Vec V2(P2,P3);// V2=(P2,P3)
333 gp_Vec V3(P3,P1);// V3=(P3,P1)
335 if ((V1.SquareMagnitude() > 1.e-10) && (V2.SquareMagnitude() > 1.e-10) && (V3.SquareMagnitude() > 1.e-10))
337 V1.Cross(V2);// V1 = Normal
338 if (V1.SquareMagnitude() > 1.e-10)
339 return Standard_True;
341 return Standard_False;
344 return Standard_False;
347 Quantity_Color User_Cylinder::Color(gp_Pnt& thePoint,Standard_Real AltMin,Standard_Real AltMax,
348 const Standard_Integer ColorizationMode)
350 red =1; //initializing colors parameters
353 switch ( ColorizationMode)
355 case 0 : //normal, vert/maron
357 Standard_Real Alt= thePoint.Z();
359 Standard_Real AltDelta;
361 AltDelta = AltMax-AltMin;
363 red = 0.5- ((0.5*(AltMax-Alt))/(AltDelta));
364 //Standard_Real A = 7*Alt-7*AltMin;
365 green = (3*AltMax-AltMin)/(3*AltMax-AltMin+(7*Alt-7*AltMin));
368 Quantity_Color color;
369 color.SetValues(red,green,blue, Quantity_TOC_RGB);
376 Standard_Real Alt= thePoint.Z();
378 Standard_Real b =AltMax-AltMin;
379 Standard_Real a= AltMax-thePoint.Z();
384 if (0<a && a <= (b/5))
390 else if ((b/5)<a && a <= (2*b/5))
396 else if ((2*b/5)<a && a <= (18*b/20))
398 green =1/(((7/(3*AltMax-AltMin))*Alt)+(1-(7*AltMin/(3*AltMax-AltMin))));
399 red = 1/(((1000/(AltMax-AltMin))*Alt)+1000*(1-(AltMin/(AltMax-AltMin))));
402 else if ((18*b/20)<a && a <= (18.5*b/20))
409 else if ((18.5*b/20)<a && a <= b)
415 Quantity_Color color;
416 color.SetValues(red,green,blue, Quantity_TOC_RGB);
423 gp_Pnt P (85.,0.,-105.);
424 gp_Vec TheVect ( P, thePoint);
425 Standard_Real CoordX;
426 Standard_Real CoordY;
427 Standard_Real CoordZ;
429 CoordX = TheVect.X();
430 CoordY = TheVect.Y();
431 CoordZ = TheVect.Z();
433 Standard_Real Distance = BAR.Distance ( P);
435 Standard_Real a =fabs(CoordX);
436 Standard_Real b =fabs(CoordY);
437 Standard_Real c =fabs(CoordZ);
439 Standard_Real xx = a / Max(Distance,a); //(Max (Distance, Maxi));
440 Standard_Real yy = b / Max(Distance,b); //(Max (Distance, Maxi));
441 Standard_Real zz = c / Max(Distance,c); //(Max (Distance, Maxi));
446 else if (myXGreenOnOff)
448 else if (myXBlueOnOff)
453 else if (myYGreenOnOff)
455 else if (myYBlueOnOff)
460 else if (myZGreenOnOff)
462 else if (myZBlueOnOff)
464 Quantity_Color color;
465 color.SetValues(red,green,blue, Quantity_TOC_RGB);
475 void User_Cylinder::SetColor(const Quantity_Color &aColor)
477 AIS_InteractiveObject::SetColor(aColor);