]> SALOME platform Git repositories - modules/hydro.git/blob - src/HYDROGUI/HYDROGUI_ImagePrs.cxx
Salome HOME
Separate action "Find bottom" for context menu.
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImagePrs.cxx
1 #include "HYDROGUI_ImagePrs.h"
2
3 #include <Prs3d_Root.hxx>
4
5 #include <SelectMgr_Selection.hxx>
6 #include <SelectMgr_EntityOwner.hxx>
7 #include <Select3D_SensitiveFace.hxx>
8
9 #include <Graphic3d_Group.hxx>
10 #include <Graphic3d_AspectLine3d.hxx>
11 #include <Graphic3d_Texture2Dmanual.hxx>
12 #include <Graphic3d_ArrayOfPolylines.hxx>
13 #include <Graphic3d_ArrayOfTriangles.hxx>
14 #include <Graphic3d_AspectFillArea3d.hxx>
15
16 #include <TColgp_Array1OfPnt.hxx>
17
18 IMPLEMENT_STANDARD_TYPE(HYDROGUI_ImagePrs)
19 IMPLEMENT_STANDARD_SUPERTYPE_ARRAY()
20   STANDARD_TYPE(AIS_InteractiveObject),
21   STANDARD_TYPE(SelectMgr_SelectableObject),
22   STANDARD_TYPE(PrsMgr_PresentableObject),
23   STANDARD_TYPE(MMgt_TShared),
24   STANDARD_TYPE(Standard_Transient),
25 IMPLEMENT_STANDARD_SUPERTYPE_ARRAY_END()
26 IMPLEMENT_STANDARD_TYPE_END(HYDROGUI_ImagePrs)
27
28 IMPLEMENT_DOWNCAST(HYDROGUI_ImagePrs,Standard_Transient)
29 IMPLEMENT_STANDARD_RTTI(HYDROGUI_ImagePrs)
30
31 HYDROGUI_ImagePrs::HYDROGUI_ImagePrs()
32     : AIS_InteractiveObject()
33 {
34 }
35
36 HYDROGUI_ImagePrs::HYDROGUI_ImagePrs( const Handle(Image_PixMap)& theImage, const QPolygonF& theContour )
37     : AIS_InteractiveObject(),
38     myImage( theImage ),
39     myContour( theContour )
40 {
41 }
42
43 HYDROGUI_ImagePrs::~HYDROGUI_ImagePrs()
44 {
45 }
46
47 QPolygonF HYDROGUI_ImagePrs::GetContour() const
48 {
49     return myContour;
50 }
51
52 void HYDROGUI_ImagePrs::SetContour( const QPolygonF& theRect )
53 {
54     if ( myContour != theRect )
55         SetToUpdate();
56
57     myContour = theRect;
58 }
59
60 Handle(Image_PixMap) HYDROGUI_ImagePrs::GetImage() const
61 {
62     return myImage;
63 }
64
65 void HYDROGUI_ImagePrs::SetImage( const Handle(Image_PixMap)& theImage )
66 {
67     if ( myImage != theImage )
68         SetToUpdate();
69
70     myImage = theImage;
71 }
72
73 void HYDROGUI_ImagePrs::ComputeSelection( const Handle(SelectMgr_Selection)& theSelection, const Standard_Integer theMode )
74 {
75     if ( myContour.isEmpty() )
76         return;
77
78     if ( theMode == 0 )
79     {
80         Handle(SelectMgr_EntityOwner) anOwner = new SelectMgr_EntityOwner( this );
81
82         TColgp_Array1OfPnt aPoints( 0, myContour.size() - 1 );
83         for ( int i = 0; i < myContour.size(); i++ )
84             aPoints.SetValue( aPoints.Lower() + i, convert( myContour[i] ) );
85
86         Handle(Select3D_SensitiveFace) aSensitiveFace = new Select3D_SensitiveFace( anOwner, aPoints );
87         theSelection->Add( aSensitiveFace );
88     }
89 }
90
91 void HYDROGUI_ImagePrs::HilightSelected( const Handle(PrsMgr_PresentationManager3d)& aPrsMgr, const SelectMgr_SequenceOfOwner& )
92 {
93     Handle(Prs3d_Presentation) aPrs = GetSelectPresentation( aPrsMgr );
94     if ( aPrs.IsNull() )
95         return;
96
97     Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( aPrs );
98
99     Handle(Graphic3d_AspectLine3d) aLineAspect =
100         new Graphic3d_AspectLine3d( Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0 );
101
102     aGroup->SetGroupPrimitivesAspect( aLineAspect );
103
104     Handle(Graphic3d_ArrayOfPolylines) aSegments = new Graphic3d_ArrayOfPolylines( 5 );
105     aSegments->AddVertex( convert( myContour[0] ) );
106     aSegments->AddVertex( convert( myContour[1] ) );
107     aSegments->AddVertex( convert( myContour[2] ) );
108     aSegments->AddVertex( convert( myContour[3] ) );
109     aSegments->AddVertex( convert( myContour[0] ) );
110
111     aGroup->AddPrimitiveArray( aSegments );
112 }
113
114 void HYDROGUI_ImagePrs::ClearSelected()
115 {
116   Handle(Prs3d_Presentation) aSelectionPrs = GetSelectPresentation( 0 );
117   if ( !aSelectionPrs.IsNull() )
118     aSelectionPrs->Clear();
119 }
120
121 void HYDROGUI_ImagePrs::Compute( const Handle(PrsMgr_PresentationManager3d)&,
122                                  const Handle(Prs3d_Presentation)& aPrs,
123                                  const Standard_Integer theMode )
124 {
125   aPrs->Clear();
126   Handle(Graphic3d_Group) aGroup = Prs3d_Root::CurrentGroup( aPrs );
127
128     if ( aMode == 0 )
129     {
130         Handle(Graphic3d_AspectLine3d) aLineAspect =
131             new Graphic3d_AspectLine3d( Quantity_NOC_WHITE, Aspect_TOL_SOLID, 1.0 );
132
133         aGroup->SetGroupPrimitivesAspect( aLineAspect );
134
135         Handle(Graphic3d_ArrayOfPolylines) aSegments = new Graphic3d_ArrayOfPolylines( 5 );
136         aSegments->AddVertex( convert( myContour[0] ) );
137         aSegments->AddVertex( convert( myContour[1] ) );
138         aSegments->AddVertex( convert( myContour[2] ) );
139         aSegments->AddVertex( convert( myContour[3] ) );
140         aSegments->AddVertex( convert( myContour[0] ) );
141
142         aGroup->AddPrimitiveArray( aSegments );
143     }
144     else if ( aMode == 3 )
145     {
146         Graphic3d_MaterialAspect aMat( Graphic3d_NOM_PLASTIC );
147         Handle(Graphic3d_AspectFillArea3d) aFillAspect =
148       new Graphic3d_AspectFillArea3d( Aspect_IS_SOLID, Quantity_NOC_WHITE, Quantity_NOC_BLACK, Aspect_TOL_SOLID, 1.0, aMat, aMat );
149
150         Handle(Graphic3d_TextureMap) aTex = new Graphic3d_Texture2Dmanual( myImage );
151         aTex->DisableModulate();
152         aFillAspect->SetTextureMapOn();
153         aFillAspect->SetTextureMap( aTex );
154
155         aGroup->SetGroupPrimitivesAspect( aFillAspect );
156
157         Handle(Graphic3d_ArrayOfTriangles) aTriangles = new Graphic3d_ArrayOfTriangles( 6, 0, Standard_False, Standard_False, Standard_True );
158
159         aTriangles->AddVertex( convert( myContour[0] ), gp_Pnt2d( 0, myImage->IsTopDown() ? 0 : 1 ) );
160         aTriangles->AddVertex( convert( myContour[1] ), gp_Pnt2d( 1, myImage->IsTopDown() ? 0 : 1 ) );
161         aTriangles->AddVertex( convert( myContour[2] ), gp_Pnt2d( 1, myImage->IsTopDown() ? 1 : 0 ) );
162
163         aTriangles->AddVertex( convert( myContour[2] ), gp_Pnt2d( 1, myImage->IsTopDown() ? 1 : 0 ) );
164         aTriangles->AddVertex( convert( myContour[3] ), gp_Pnt2d( 0, myImage->IsTopDown() ? 1 : 0 ) );
165         aTriangles->AddVertex( convert( myContour[0] ), gp_Pnt2d( 0, myImage->IsTopDown() ? 0 : 1 ) );
166
167         aGroup->AddPrimitiveArray( aTriangles );
168     }
169 }
170
171 gp_Pnt HYDROGUI_ImagePrs::convert( const QPointF& thePoint ) const
172 {
173     return gp_Pnt( thePoint.x(), thePoint.y(), 0 );
174 }