summaryrefslogtreecommitdiff
path: root/src/V3d/V3d_Plane.cxx
blob: db245a510728d78ee4c1942fc9bb0693ca095510 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
// File         V3d_Plane.cxx
// Created      September 1992
// Author       GG

//-Copyright    MatraDatavision 1991,1992

//-Version

//-Design

//-Warning

//-References

//-Language     C++ 2.1

#include <V3d.hxx>
#include <V3d_Plane.ixx>
#include <Viewer_BadValue.hxx>

#include <Graphic3d_Group.hxx>
#include <Graphic3d_Array1OfVertex.hxx>
#include <Graphic3d_AspectFillArea3d.hxx>
#include <gp_Pln.hxx>

//-Constructors

V3d_Plane::V3d_Plane(const Standard_Real A, const Standard_Real B, const Standard_Real C, const Standard_Real D) {

  Viewer_BadValue_Raise_if( sqrt(A*A + B*B + C*C) <= 0., "V3d_Plane::V3d_Plane, bad plane coefficients");

  MyPlane = new Visual3d_ClipPlane(A,B,C,D) ;
}

//-Methods, in order

void V3d_Plane::SetPlane( const Standard_Real A, const Standard_Real B, const Standard_Real C, const Standard_Real D) {

  Viewer_BadValue_Raise_if( sqrt(A*A + B*B + C*C) <= 0., "V3d_Plane::SetPlane, bad plane coefficients");

  MyPlane->SetPlane(A,B,C,D) ;

  if( IsDisplayed() ) {
    Update();
  }
}

void V3d_Plane::Display(const Handle(V3d_View)& aView,
			const Quantity_Color& aColor) {
    Handle(V3d_Viewer) theViewer = aView->Viewer();
    if (!MyGraphicStructure.IsNull()) {
      MyGraphicStructure->Clear();
    }
    Standard_Real size = theViewer->DefaultViewSize();
    Standard_Real offset = size/10000.;
    MyGraphicStructure = new Graphic3d_Structure(theViewer->Viewer());
    Handle(Graphic3d_Group) group = new Graphic3d_Group(MyGraphicStructure);
    Handle(Graphic3d_AspectFillArea3d) aspect =
				new Graphic3d_AspectFillArea3d();
    Graphic3d_MaterialAspect plastic(Graphic3d_NOM_PLASTIC);
    plastic.SetColor(aColor);
    plastic.SetTransparency(0.5);
    aView->SetTransparency(Standard_True);
    aspect->SetFrontMaterial(plastic);
//    aspect->SetInteriorStyle (Aspect_IS_SOLID);
    aspect->SetInteriorStyle (Aspect_IS_HATCH);
    aspect->SetHatchStyle (Aspect_HS_GRID_DIAGONAL_WIDE);
    MyGraphicStructure->SetPrimitivesAspect(aspect);
    Graphic3d_Array1OfVertex p(1,4);
    p(1).SetCoord(-size/2.,-size/2.,offset);
    p(2).SetCoord(-size/2., size/2.,offset);
    p(3).SetCoord( size/2., size/2.,offset);
    p(4).SetCoord( size/2.,-size/2.,offset);
    group->Polygon(p);
    MyGraphicStructure->Display(0);
    Update();
}

void V3d_Plane::Erase() {
  if (!MyGraphicStructure.IsNull()) MyGraphicStructure->Erase();
}

void V3d_Plane::Plane(Standard_Real& A, Standard_Real& B, Standard_Real& C, Standard_Real& D)const  {

  MyPlane->Plane(A,B,C,D) ;
}

Handle(Visual3d_ClipPlane) V3d_Plane::Plane()const  {

  return MyPlane ;
}

Standard_Boolean V3d_Plane::IsDisplayed() const {

  if( MyGraphicStructure.IsNull() ) return Standard_False;
  return MyGraphicStructure->IsDisplayed();
}

void V3d_Plane::Update() {

  if( !MyGraphicStructure.IsNull() ) {
    TColStd_Array2OfReal matrix(1,4,1,4);
    Standard_Real A,B,C,D;
    MyPlane->Plane(A,B,C,D) ;
    gp_Pln plan(A,B,C,D);
    gp_Trsf trsf;
    trsf.SetTransformation(plan.Position());
    trsf.Invert();
    for (Standard_Integer i=1; i<=3; i++){
      for (Standard_Integer j=1; j<=4; j++){
        matrix.SetValue(i,j,trsf.Value(i,j));
      }
    }
    matrix.SetValue(4,1,0.);
    matrix.SetValue(4,2,0.);
    matrix.SetValue(4,3,0.);
    matrix.SetValue(4,4,1.);
    MyGraphicStructure->SetTransform(matrix,Graphic3d_TOC_REPLACE);
  }
}