430e9fa9bf822d51cbf6cefa6d76fd5bbd170bcd
[occt.git] / samples / mfc / standard / Common / LengthParamsEdgesPage.cpp
1 // LenghtParamsEdgesPage.cpp : implementation file
2 //
3
4 #include "stdafx.h"
5 #include "LengthParamsEdgesPage.h"
6 #include "DimensionDlg.h"
7 #include <AIS_InteractiveContext.hxx>
8 #include <AIS_LocalContext.hxx>
9 #include <AIS_LengthDimension.hxx>
10 #include <AIS_AngleDimension.hxx>
11 #include <GC_MakePlane.hxx>
12 // CLengthParamsEdgesPage dialog
13
14 //=======================================================================
15 //function : CLengthParamsEdgesPage
16 //purpose  :
17 //=======================================================================
18
19 CLengthParamsEdgesPage::CLengthParamsEdgesPage (Handle(AIS_InteractiveContext) theAISContext,
20                                                 bool isAngleDimension /*= false*/,
21                                                 CWnd* pParent /*=NULL*/)
22 : CDialog(CLengthParamsEdgesPage::IDD, pParent)
23 {
24   myAISContext = theAISContext;
25   myIsAngleDimension = isAngleDimension;
26 }
27
28 //=======================================================================
29 //function : ~CLengthParamsEdgesPage
30 //purpose  :
31 //=======================================================================
32
33 CLengthParamsEdgesPage::~CLengthParamsEdgesPage()
34 {
35 }
36
37 //=======================================================================
38 //function : DoDataExchange
39 //purpose  :
40 //=======================================================================
41
42 void CLengthParamsEdgesPage::DoDataExchange(CDataExchange* pDX)
43 {
44   CDialog::DoDataExchange(pDX);
45 }
46
47
48 BEGIN_MESSAGE_MAP(CLengthParamsEdgesPage, CDialog)
49   ON_BN_CLICKED(IDC_BUTTON1, &CLengthParamsEdgesPage::OnBnClickedEdge1Btn)
50   ON_BN_CLICKED(IDC_BUTTON3, &CLengthParamsEdgesPage::OnBnClickedEdge2Btn)
51 END_MESSAGE_MAP()
52
53
54 //=======================================================================
55 //function : OnBnClickedEdge1Btn
56 //purpose  :
57 //=======================================================================
58
59 void CLengthParamsEdgesPage::OnBnClickedEdge1Btn()
60 {
61   // Open local context and choose the edge for length dimensions
62   if (!myAISContext->HasOpenedContext())
63   {
64     myAISContext->OpenLocalContext();
65     myAISContext->ActivateStandardMode (TopAbs_EDGE);
66     AfxMessageBox (_T("Local context was not opened. Choose the edge and press the button again"),
67                      MB_ICONINFORMATION | MB_OK);
68     return;
69   }
70
71   // Now it's ok, local context is opened and edge selection mode is activated
72   // Check if some edge is selected
73   myAISContext->LocalContext()->InitSelected();
74   if (!myAISContext->LocalContext()->MoreSelected())
75   {
76     AfxMessageBox(_T("Choose the edge and press the button again"),
77                     MB_ICONINFORMATION | MB_OK);
78     return;
79   }
80
81   // Workaround for AIS_LocalContext::SelectedShape()
82   myFirstEdge = TopoDS::Edge (CDimensionDlg::SelectedShape());
83   //myFirstEdge =  TopoDS::Edge (myAISContext->LocalContext()->SelectedShape());
84
85   myAISContext->LocalContext()->ClearSelected();
86 }
87
88 //=======================================================================
89 //function : OnBnClickedEdge2Btn
90 //purpose  :
91 //=======================================================================
92
93 void CLengthParamsEdgesPage::OnBnClickedEdge2Btn()
94 {
95   myAISContext->LocalContext()->InitSelected();
96   if (!myAISContext->LocalContext()->MoreSelected())
97   {
98     AfxMessageBox (_T("Choose the edge and press the button again"),
99        MB_ICONINFORMATION | MB_OK);
100     return;
101   }
102
103   // Workaround for AIS_LocalContext::SelectedShape()
104   mySecondEdge = TopoDS::Edge (CDimensionDlg::SelectedShape());
105   //mySecondEdge = TopoDS::Edge (myAISContext->LocalContext()->SelectedShape());
106
107   myAISContext->LocalContext()->ClearSelected();
108
109   // Build plane through three points
110   BRepAdaptor_Curve aCurve1 (myFirstEdge);
111   BRepAdaptor_Curve aCurve2 (mySecondEdge);
112
113   gp_Pnt aP1=aCurve1.Value (0.1);
114   gp_Pnt aP2=aCurve1.Value (0.9);
115   gp_Pnt aP3=aCurve2.Value (0.5);
116
117   GC_MakePlane aMkPlane (aP1,aP2,aP3);
118
119   Handle(Geom_Plane) aPlane = aMkPlane.Value();
120
121   CDimensionDlg *aDimDlg = (CDimensionDlg*)(GetParentOwner());
122
123   myAISContext->CloseAllContexts();
124
125   Handle(Prs3d_DimensionAspect) anAspect = new Prs3d_DimensionAspect();
126   anAspect->MakeArrows3d (Standard_False);
127   anAspect->MakeText3d (aDimDlg->GetTextType());
128   anAspect->TextAspect()->SetHeight (aDimDlg->GetFontHeight());
129   anAspect->MakeTextShaded (aDimDlg->IsText3dShaded());
130   anAspect->SetCommonColor (aDimDlg->GetDimensionColor());
131   anAspect->MakeUnitsDisplayed (aDimDlg->IsUnitsDisplayed());
132   if (myIsAngleDimension)
133   {
134     // Build an angle dimension between two non-parallel edges
135     Handle(AIS_AngleDimension) anAngleDim = new AIS_AngleDimension (myFirstEdge, mySecondEdge);
136     anAngleDim->SetDimensionAspect (anAspect);
137     anAngleDim->DimensionAspect()->MakeUnitsDisplayed (aDimDlg->IsUnitsDisplayed());
138     if (aDimDlg->IsUnitsDisplayed())
139     {
140       anAngleDim->SetDisplayUnits (aDimDlg->GetUnits ());
141       if ((anAngleDim->GetDisplayUnits().IsEqual (TCollection_AsciiString ("deg"))))
142       {
143         anAngleDim->DimensionAspect()->MakeUnitsDisplayed (Standard_False);
144       }
145       else
146       {
147         anAngleDim->SetDisplaySpecialSymbol (AIS_DSS_No);
148       }
149     }
150
151     anAngleDim->SetFlyout (aDimDlg->GetFlyout());
152     myAISContext->Display (anAngleDim);
153   }
154   else
155   {
156     Handle(AIS_LengthDimension) aLenDim = new AIS_LengthDimension (myFirstEdge, mySecondEdge, aPlane->Pln());
157     aLenDim->SetDimensionAspect (anAspect);
158     aLenDim->SetFlyout (aDimDlg->GetFlyout());
159     if (aDimDlg->IsUnitsDisplayed())
160     {
161       aLenDim->SetDisplayUnits (aDimDlg->GetUnits());
162     }
163
164     myAISContext->Display (aLenDim);
165   }
166
167   myAISContext->OpenLocalContext();
168   myAISContext->ActivateStandardMode (TopAbs_EDGE);
169 }