#include #include // Implementation of Handle and type mgt // IMPLEMENT_STANDARD_HANDLE(User_Cylinder,AIS_InteractiveObject) IMPLEMENT_STANDARD_RTTIEXT(User_Cylinder,AIS_InteractiveObject) #include "ColoredMeshDlg.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include // Constructors implementation // User_Cylinder::User_Cylinder(const Standard_Real R, const Standard_Real H) : AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant) { BRepPrimAPI_MakeCylinder S(R,H); myShape = S.Shape(); SetHilightMode(0); SetSelectionMode(0); myDrawer->SetShadingAspect(new Prs3d_ShadingAspect()); myPlanarFaceColor = Quantity_NOC_FIREBRICK3; myCylindricalFaceColor = Quantity_NOC_GRAY; } User_Cylinder::User_Cylinder(const gp_Ax2 CylAx2, const Standard_Real R, const Standard_Real H) : AIS_InteractiveObject(PrsMgr_TOP_ProjectorDependant) { BRepPrimAPI_MakeCylinder S(CylAx2,R,H); BRepBuilderAPI_NurbsConvert aNurbsConvert(S.Shape()); myShape = aNurbsConvert.Shape(); SetHilightMode(0); SetSelectionMode(0); myDrawer->SetShadingAspect(new Prs3d_ShadingAspect()); myPlanarFaceColor = Quantity_NOC_FIREBRICK3; myCylindricalFaceColor = Quantity_NOC_KHAKI4; } void User_Cylinder::Compute(const Handle_PrsMgr_PresentationManager3d& /*aPresentationManager*/, const Handle_Prs3d_Presentation& aPresentation, const Standard_Integer aMode ) { switch (aMode) { case 0: StdPrs_WFDeflectionShape::Add(aPresentation,myShape, myDrawer ); break; case 1: { Standard_Real aTransparency = Transparency(); Graphic3d_NameOfMaterial aMaterial = Material(); myDrawer->SetShadingAspectGlobal(Standard_False); TopExp_Explorer Ex; Handle(Geom_Surface) Surface; for (Ex.Init(myShape,TopAbs_FACE); Ex.More(); Ex.Next()) { Surface = BRep_Tool::Surface(TopoDS::Face(Ex.Current())); myDrawer->ShadingAspect()->SetMaterial(aMaterial); if (Surface->IsKind(STANDARD_TYPE(Geom_Plane))) myDrawer->ShadingAspect()->SetColor(myPlanarFaceColor); else myDrawer->ShadingAspect()->SetColor(myCylindricalFaceColor); myDrawer->ShadingAspect()->SetTransparency (aTransparency); StdPrs_ShadedShape::Add(aPresentation,Ex.Current(), myDrawer); } break; } case 6: //color { BRepTools::Clean(myShape); BRepTools::Update(myShape); Handle(Graphic3d_StructureManager) aStrucMana = GetContext()->MainPrsMgr()->StructureManager(); Handle(Graphic3d_Group) mygroup = Prs3d_Root::CurrentGroup(aPresentation); myAspect = (new Prs3d_ShadingAspect())->Aspect(); Graphic3d_MaterialAspect material = myAspect->FrontMaterial(); material.SetReflectionModeOff(Graphic3d_TOR_AMBIENT); material.SetReflectionModeOff(Graphic3d_TOR_DIFFUSE); material.SetReflectionModeOff(Graphic3d_TOR_SPECULAR); material.SetReflectionModeOff(Graphic3d_TOR_EMISSION); myAspect->SetFrontMaterial(material); mygroup->SetPrimitivesAspect(myAspect); myAspect->SetEdgeOn(); myDeflection = AIS_Shape::GetDeflection(myShape,myDrawer); BRepMesh_IncrementalMesh(myShape,myDeflection); myX1OnOff = Standard_False; myXBlueOnOff = Standard_False; myXGreenOnOff =Standard_False; myXRedOnOff = Standard_False; myY1OnOff = Standard_False; myYBlueOnOff = Standard_False; myYGreenOnOff = Standard_False; myYRedOnOff = Standard_False; myZ1OnOff = Standard_False; myZBlueOnOff =Standard_False; myZGreenOnOff = Standard_False; myZRedOnOff = Standard_False; CColoredMeshDlg Dlg(NULL); Dlg.DoModal(); myX1OnOff = Dlg.X1OnOff; myXBlueOnOff = Dlg.m_CheckXBlueOnOff; myXGreenOnOff = Dlg.m_CheckXGreenOnOff; myXRedOnOff = Dlg.m_CheckXRedOnOff; myY1OnOff = Dlg.Y1OnOff; myYBlueOnOff = Dlg.m_CheckYBlueOnOff; myYGreenOnOff = Dlg.m_CheckYGreenOnOff; myYRedOnOff = Dlg.m_CheckYRedOnOff; myZ1OnOff = Dlg.Z1OnOff; myZBlueOnOff = Dlg.m_CheckZBlueOnOff; myZGreenOnOff = Dlg.m_CheckZGreenOnOff; myZRedOnOff = Dlg.m_CheckZRedOnOff; // Adds a triangulation of the shape myShape to its topological data structure. // This triangulation is computed with the deflection myDeflection. #ifdef DEBUG cout <<"Deflection = " << myDeflection << "\n" << endl; #endif Standard_Integer NumFace; TopExp_Explorer ExpFace; //khr --> gp_Pnt H (0,0,0); gp_Pnt B (0,0,1000000000); for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ ) { TopoDS_Face myFace = TopoDS::Face(ExpFace.Current()); TopLoc_Location myLocation = myFace.Location(); #ifdef DEBUG cout << "J\'explore actuellement la face " << NumFace << "\n" << endl; #endif Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation); // Returns the Triangulation of the face. It is a null handle if there is no triangulation. if (myT.IsNull()) { #ifdef DEBUG // cout << "Triangulation of the face "<< i <<" is null \n"<< endl; #endif return; } const TColgp_Array1OfPnt& Nodes= myT->Nodes(); const Poly_Array1OfTriangle& triangles = myT->Triangles(); Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant // ni : sommet i du triangle courant //recherche du pt "haut" et du pt "bas for (nt = 1; nt <= nnn; nt++) { // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3 if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed" triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2 else triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) ) { // Associates a vertexNT to each node gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation()); gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation()); gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation()); if (p.Z() > H.Z()) H=p; if (q.Z() > H.Z()) H=q; if (r.Z() > H.Z()) H=r; if (p.Z() < B.Z()) B=p; if (q.Z() < B.Z()) B=q; if (r.Z() < B.Z()) B=r; } } } //khr <-- for( NumFace=0,ExpFace.Init(myShape,TopAbs_FACE); ExpFace.More(); ExpFace.Next(),NumFace++ ) { TopoDS_Face myFace = TopoDS::Face(ExpFace.Current()); TopLoc_Location myLocation = myFace.Location(); #ifdef DEBUG cout << "J\'explore actuellement la face " << NumFace << "\n" << endl; #endif Handle(Poly_Triangulation) myT = BRep_Tool::Triangulation(myFace, myLocation); // Returns the Triangulation of the face. It is a null handle if there is no triangulation. if (myT.IsNull()) { #ifdef DEBUG //cout << "Triangulation of the face "<< i <<" is null \n"<< endl; #endif return; } Poly_Connect pc(myT); const TColgp_Array1OfPnt& Nodes= myT->Nodes(); BAR = GProp_PGProps::Barycentre(Nodes); //const TColgp_Array1OfPnt2d& UVNodes = myT->UVNodes(); const Poly_Array1OfTriangle& triangles = myT->Triangles(); TColgp_Array1OfDir myNormal(Nodes.Lower(), Nodes.Upper()); StdPrs_ToolShadedShape::Normal(myFace, pc, myNormal); BRepTools::UVBounds(myFace,Umin, Umax, Vmin, Vmax); dUmax = (Umax - Umin); dVmax = (Vmax - Vmin); Standard_Integer nnn = myT->NbTriangles(); // nnn : nombre de triangles Standard_Integer nt, n1, n2, n3 = 0;// nt : triangle courant // ni : sommet i du triangle courant //recherche du pt "haut" et du pt "bas // gp_Pnt H (0,0,0); // gp_Pnt B (0,0,1000000000); for (nt = 1; nt <= nnn; nt++) { // triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3 if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed" triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2 else triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) ) { // Associates a vertexNT to each node gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation()); gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation()); gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation()); } } Handle(Graphic3d_ArrayOfTriangles) aOP = new Graphic3d_ArrayOfTriangles(3 * nnn, 0, Standard_True, Standard_True); for (nt = 1; nt <= nnn; nt++) { #ifdef DEBUG cout << "On traite actuellement le triangle : "<< nt <<"\n"; #endif if (myFace.Orientation() == TopAbs_REVERSED) // si la face est "reversed" triangles(nt).Get(n1,n3,n2); // le triangle est n1,n3,n2 else triangles(nt).Get(n1,n2,n3); // le triangle est n1,n2,n3 if (TriangleIsValid (Nodes(n1),Nodes(n2),Nodes(n3)) ) { // Associates a vertexNT to each node TColgp_Array1OfPnt Points(1,3); gp_Pnt p = Nodes(n1).Transformed(myLocation.Transformation()); gp_Pnt q = Nodes(n2).Transformed(myLocation.Transformation()); gp_Pnt r = Nodes(n3).Transformed(myLocation.Transformation()); Points(1).SetCoord(p.X(), p.Y(), p.Z()); Points(2).SetCoord(q.X(), q.Y(), q.Z()); Points(3).SetCoord(r.X(), r.Y(), r.Z()); aOP->AddVertex(Points(1), myNormal(n1), Color(p,B.Z(),H.Z(),Dlg.Colorization)); aOP->AddVertex(Points(2), myNormal(n2), Color(q,B.Z(),H.Z(),Dlg.Colorization)); aOP->AddVertex(Points(3), myNormal(n3), Color(r,B.Z(),H.Z(),Dlg.Colorization)); } // end of "if the triangle is valid } // end of the "parcours" of the triangles Prs3d_Root::CurrentGroup (aPresentation)->AddPrimitiveArray (aOP); mygroup->SetGroupPrimitivesAspect(myAspect); }// end of the exploration of the shape in faces break; } } } void User_Cylinder::Compute(const Handle_Prs3d_Projector& aProjector, const Handle_Prs3d_Presentation& aPresentation) { myDrawer->EnableDrawHiddenLine(); StdPrs_HLRPolyShape::Add(aPresentation,myShape,myDrawer,aProjector); } void User_Cylinder::ComputeSelection(const Handle_SelectMgr_Selection& aSelection, const Standard_Integer aMode) { switch(aMode) { case 0: StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_SHAPE, 0.01, 0.1); break; case 4: StdSelect_BRepSelectionTool::Load(aSelection,this,myShape,TopAbs_FACE, 0.01, 0.1); break; } } Standard_Integer User_Cylinder::NbPossibleSelection() const { return 2; } Standard_Boolean User_Cylinder::AcceptShapeDecomposition() const { return Standard_True; } void User_Cylinder::SetPlanarFaceColor(const Quantity_Color acolor) { myPlanarFaceColor = acolor; } void User_Cylinder::SetCylindricalFaceColor(const Quantity_Color acolor) { myCylindricalFaceColor = acolor; } Standard_Boolean User_Cylinder::TriangleIsValid(const gp_Pnt& P1, const gp_Pnt& P2, const gp_Pnt& P3) const { gp_Vec V1(P1,P2);// V1=(P1,P2) gp_Vec V2(P2,P3);// V2=(P2,P3) gp_Vec V3(P3,P1);// V3=(P3,P1) if ((V1.SquareMagnitude() > 1.e-10) && (V2.SquareMagnitude() > 1.e-10) && (V3.SquareMagnitude() > 1.e-10)) { V1.Cross(V2);// V1 = Normal if (V1.SquareMagnitude() > 1.e-10) return Standard_True; else return Standard_False; } else return Standard_False; } Quantity_Color User_Cylinder::Color(gp_Pnt& thePoint,Standard_Real AltMin,Standard_Real AltMax, const Standard_Integer ColorizationMode) { red =1; //initializing colors parameters green=1; blue =1; switch ( ColorizationMode) { case 0 : //normal, vert/maron { Standard_Real Alt= thePoint.Z(); Standard_Real AltDelta; AltDelta = AltMax-AltMin; red = 0.5- ((0.5*(AltMax-Alt))/(AltDelta)); //Standard_Real A = 7*Alt-7*AltMin; green = (3*AltMax-AltMin)/(3*AltMax-AltMin+(7*Alt-7*AltMin)); blue = 0 ; Quantity_Color color; color.SetValues(red,green,blue, Quantity_TOC_RGB); return color; break; }//end case 0 case 1 : //mer-neige { Standard_Real Alt= thePoint.Z(); Standard_Real b =AltMax-AltMin; Standard_Real a= AltMax-thePoint.Z(); red =1; green=1; blue =1; if (0