0027350: Support for Universal Windows Platform
[occt.git] / samples / xaml / MainPage.xaml.cpp
1 //
2 // MainPage.xaml.cpp
3 // Implementation of the MainPage class.
4 //
5
6 #include "pch.h"
7 #include "MainPage.xaml.h"
8
9 using namespace uwp;
10
11 using namespace Platform;
12 using namespace Windows::Foundation;
13 using namespace Windows::Foundation::Collections;
14 using namespace Windows::UI::ViewManagement;
15 using namespace Windows::UI::Xaml;
16 using namespace Windows::UI::Xaml::Controls;
17 using namespace Windows::UI::Xaml::Controls::Primitives;
18 using namespace Windows::UI::Xaml::Data;
19 using namespace Windows::UI::Xaml::Input;
20 using namespace Windows::UI::Xaml::Media;
21 using namespace Windows::UI::Xaml::Navigation;
22
23 using namespace Windows::UI::Popups;
24
25 #include <BRepAlgo.hxx>
26 #include <BRepAlgoAPI_Fuse.hxx>
27 #include <BRepMesh_IncrementalMesh.hxx>
28 #include <BRepPrimAPI_MakeBox.hxx>
29 #include <BRepPrimAPI_MakeSphere.hxx>
30 #include <BRepTools.hxx>
31 #include <Geom2dAPI_PointsToBSpline.hxx>
32 #include <Geom2d_BSplineCurve.hxx>
33 #include <Geom2d_OffsetCurve.hxx>
34 #include <gp_Pnt.hxx>
35 #include <IGESControl_Controller.hxx>
36 #include <IGESControl_Reader.hxx>
37 #include <IGESControl_Writer.hxx>
38 #include <Interface_Static.hxx>
39 #include <OSD_Directory.hxx>
40 #include <OSD_File.hxx>
41 #include <OSD_Path.hxx>
42 #include <OSD_Protection.hxx>
43 #include <STEPControl_Reader.hxx>
44 #include <STEPControl_Writer.hxx>
45 #include <StlAPI_Writer.hxx>
46 #include <TCollection_AsciiString.hxx>
47 #include <TCollection_ExtendedString.hxx>
48 #include <TopExp_Explorer.hxx>
49 #include <TopoDS.hxx>
50 #include <TopoDS_Shape.hxx>
51 #include <VrmlAPI_Writer.hxx>
52
53 #include <Strsafe.h>
54
55 //=======================================================================
56 //function : MainPage
57 //purpose  :
58 //=======================================================================
59 MainPage::MainPage()
60 {
61   InitializeComponent();
62   ApplicationView::PreferredLaunchViewSize = Size(1000, 500);
63   ApplicationView::PreferredLaunchWindowingMode = ApplicationViewWindowingMode::PreferredLaunchViewSize;
64 }
65
66 //=======================================================================
67 //function : Throw
68 //purpose  : Test offset functionality
69 //=======================================================================
70 void MainPage::OnClickOffset(Platform::Object^  theSender,
71   Windows::UI::Xaml::Input::PointerRoutedEventArgs^ theEvent)
72 {
73   TColgp_Array1OfPnt2d array(1, 5); // sizing array
74   array.SetValue(1, gp_Pnt2d(-4, 0)); array.SetValue(2, gp_Pnt2d(-7, 2));
75   array.SetValue(3, gp_Pnt2d(-6, 3)); array.SetValue(4, gp_Pnt2d(-4, 3));
76   array.SetValue(5, gp_Pnt2d(-3, 5));
77   Handle(Geom2d_BSplineCurve) SPL1 = Geom2dAPI_PointsToBSpline(array);
78
79   Standard_Real dist = 1;
80   Handle(Geom2d_OffsetCurve) OC =
81     new Geom2d_OffsetCurve(SPL1, dist);
82   Standard_Real dist2 = 1.5;
83   Handle(Geom2d_OffsetCurve) OC2 =
84     new Geom2d_OffsetCurve(SPL1, dist2);
85
86   Platform::String ^aMessage;
87
88   if (OC.IsNull()) {
89     aMessage = "Error: could not create offset curve with offset distance " + dist;
90   } else if (OC2.IsNull()) {
91     aMessage = "Error: could not create offset curve with offset distance 1.5" + dist2;
92   } else {
93     aMessage = "Result: Two offset curves OC and OC2 were successfully created from source curve SPL1. \n";
94   }
95   Output_TextBlock->Text = aMessage;
96 }
97
98 //=======================================================================
99 //function : OnClickMesh
100 //purpose  : Test mesh functionality
101 //=======================================================================
102 void MainPage::OnClickMesh(Platform::Object^  theSender,
103   Windows::UI::Xaml::Input::PointerRoutedEventArgs^ theEvent)
104 {
105   TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200, 60, 60);
106   TopoDS_Shape theSphere = BRepPrimAPI_MakeSphere(gp_Pnt(100, 20, 20), 80);
107   TopoDS_Shape ShapeFused = BRepAlgoAPI_Fuse(theSphere, theBox);
108   BRepMesh_IncrementalMesh(ShapeFused, 1);
109
110   Standard_Integer result(0);
111
112   for (TopExp_Explorer ex(ShapeFused, TopAbs_FACE); ex.More(); ex.Next()) {
113     TopoDS_Face F = TopoDS::Face(ex.Current());
114     TopLoc_Location L;
115     Handle(Poly_Triangulation) facing = BRep_Tool::Triangulation(F, L);
116     result = result + facing->NbTriangles();
117   }
118
119   Platform::String ^aMessage;
120   if (ShapeFused.IsNull()) {
121     aMessage = "Error: could not fuse source shapes";
122   } else if (result == 0) {
123     aMessage = "Error: mesh could not be created";
124   } else {
125     aMessage = "Result: Mesh was created\
126 --- Number of created triangles ---\n";
127
128     aMessage += result;
129     aMessage += ("\n\n");
130   }
131   Output_TextBlock->Text = aMessage;
132 }
133
134 //=======================================================================
135 //function : OnClickBoolean
136 //purpose  : Test boolean operations
137 //=======================================================================
138 void MainPage::OnClickBoolean(Platform::Object^  theSender,
139   Windows::UI::Xaml::Input::PointerRoutedEventArgs^ theEvent)
140 {
141   TCollection_AsciiString asd;
142   gp_Pnt P(-5, 5, -5);
143   TopoDS_Shape theBox1 = BRepPrimAPI_MakeBox(60, 200, 70).Shape();
144
145   TopoDS_Shape theBox2 = BRepPrimAPI_MakeBox(P, 20, 150, 110).Shape();
146
147   TopoDS_Shape FusedShape = BRepAlgoAPI_Fuse(theBox1, theBox2);
148
149   Platform::String ^aMessage;
150
151   if (FusedShape.IsNull()) {
152     aMessage = "Error: could not fuse shapes theBox1 and theBox2";
153   } else {
154     aMessage = "Result: Shapes were successfully fused. \n";
155   }
156   Output_TextBlock->Text = aMessage;
157 }
158
159 //=======================================================================
160 //function : OnClickBuildTemporary
161 //purpose  : Test OSD_File::BuildTemporary() method
162 //=======================================================================
163 void MainPage::OnClickBuildTemporary(Platform::Object^  theSender,
164   Windows::UI::Xaml::Input::PointerRoutedEventArgs^ theEvent)
165 {
166   OSD_File theTmpFile;
167   theTmpFile.BuildTemporary();
168   Standard_Boolean fKO = theTmpFile.Failed();
169   if (fKO)
170   {
171     Output_TextBlock->Text = "Error: cannot create temporary file";
172   } else {
173     OSD_Path theTmpFilepath;
174     theTmpFile.Path(theTmpFilepath);
175     TCollection_AsciiString theTmpFilepathTrek;
176     theTmpFilepath.SystemName(theTmpFilepathTrek);
177     wchar_t wchar_str[MAX_PATH];
178     StringCchCopy(wchar_str, _countof(wchar_str), L"Result: ");
179     TCollection_ExtendedString aWName(theTmpFilepathTrek);
180     StringCchCat(wchar_str, _countof(wchar_str), (const wchar_t*)aWName.ToExtString());
181     Platform::String^ p_string = ref new Platform::String(wchar_str);
182     Output_TextBlock->Text = p_string;
183   }
184 }
185
186 //=======================================================================
187 //function : OnClickDataExchange
188 //purpose  : Test data exchange functionality
189 //=======================================================================
190 void MainPage::OnClickDataExchange(Platform::Object^  theSender,
191     Windows::UI::Xaml::Input::PointerRoutedEventArgs^ theEvent)
192 {
193   Output_TextBlock->Text = "";
194
195   // Create box for export
196   TopoDS_Shape theBox = BRepPrimAPI_MakeBox(200, 60, 60);
197
198   // Create temporary directory
199   wchar_t tmpPath[MAX_PATH];
200   wchar_t filePath[MAX_PATH];
201   char tmpPathA[MAX_PATH];
202
203   if (!GetTempPathW(_countof(tmpPath), tmpPath)) {
204     StringCchCopyW(tmpPath, _countof(tmpPath), L"./");
205   }
206
207   WideCharToMultiByte(CP_UTF8, 0, tmpPath, -1, tmpPathA, sizeof(tmpPathA), NULL, NULL);
208   OSD_Path tmpDirPath(tmpPathA);
209   OSD_Directory tmpDir(tmpDirPath);
210
211   OSD_Protection srt;
212   tmpDir.Build(srt);
213
214   // Export box to .brep
215   StringCchCopyW(filePath, _countof(filePath), tmpPath);
216   StringCchCatW(filePath, _countof(filePath), L"/box.brep");
217   if (SaveBREP(filePath, theBox))
218     Output_TextBlock->Text += L"OK: export to .brep\n";
219   // Import from .brep
220   TopoDS_Shape theBoxFromBrep;
221   if (ReadBREP(filePath, theBoxFromBrep))
222     Output_TextBlock->Text += L"OK: import from .brep\n";
223   else
224     Output_TextBlock->Text += L"Error: import from .brep\n";
225
226   // Export box to .iges
227   StringCchCopyW(filePath, _countof(filePath), tmpPath);
228   StringCchCatW(filePath, _countof(filePath), L"/box.iges");
229   if (SaveIGES(filePath, theBox))
230     Output_TextBlock->Text += L"OK: export to .iges\n";
231   // Import from .iges
232   TopoDS_Shape theBoxFromIges;
233   if (ReadIGES(filePath, theBoxFromIges))
234     Output_TextBlock->Text += L"OK: import from .iges\n";
235   else
236     Output_TextBlock->Text += L"Error: import from .iges\n";
237
238   // Export box to .step
239   StringCchCopyW(filePath, _countof(filePath), tmpPath);
240   StringCchCatW(filePath, _countof(filePath), L"/box.step");
241
242   STEPControl_StepModelType aSelection = STEPControl_AsIs;
243   if (SaveSTEP(filePath, theBox, aSelection))
244     Output_TextBlock->Text += L"OK: export to .iges\n";
245   // Import from .iges
246   TopoDS_Shape theBoxFromStep;
247   if (ReadSTEP(filePath, theBoxFromStep))
248     Output_TextBlock->Text += L"OK: import from .step\n";
249   else
250     Output_TextBlock->Text += L"Error: import from .step\n";
251
252   // Export box to .stl
253   StringCchCopyW(filePath, _countof(filePath), tmpPath);
254   StringCchCatW(filePath, _countof(filePath), L"/box.stl");
255
256   if (SaveSTL(filePath, theBox))
257     Output_TextBlock->Text += L"OK: export to .stl\n";
258
259 /*
260   // Export box to .vrml
261   StringCchCopyW(filePath, _countof(filePath), tmpPath);
262   StringCchCatW(filePath, _countof(filePath), L"/box.vrml");
263
264   if (SaveVRML(filePath, theBox))
265     Output_TextBlock->Text += L"OK: export to .vrml\n";
266 */
267 }
268
269 //=======================================================================
270 //function : SaveBREP
271 //purpose  : Export shape to .brep
272 //=======================================================================
273 Standard_Boolean MainPage::SaveBREP(const wchar_t* theFilePath, const TopoDS_Shape& theShape)
274 {
275   std::filebuf aFileBuf;
276   std::ostream aStream(&aFileBuf);
277
278   if (!aFileBuf.open(theFilePath, ios::out)) {
279     Output_TextBlock->Text += L"Error: cannot open file for export (brep)\n";
280     return Standard_False;
281   }
282
283   BRepTools::Write(theShape, aStream);
284   return Standard_True;
285 }
286
287 //=======================================================================
288 //function : SaveIGES
289 //purpose  : Export shape to .iges
290 //=======================================================================
291 Standard_Boolean MainPage::SaveIGES(const wchar_t* theFilePath, const TopoDS_Shape& theShape)
292 {
293   std::filebuf aFileBuf;
294   std::ostream aStream(&aFileBuf);
295
296   if (!aFileBuf.open(theFilePath, ios::out)) {
297     Output_TextBlock->Text += L"Error: cannot open file for export (iges)\n";
298     return Standard_False;
299   }
300
301   IGESControl_Controller::Init();
302   IGESControl_Writer ICW(Interface_Static::CVal("XSTEP.iges.unit"), Interface_Static::IVal("XSTEP.iges.writebrep.mode"));
303
304   ICW.AddShape(theShape);
305   ICW.ComputeModel();
306
307   if (!ICW.Write(aStream)) {
308     Output_TextBlock->Text += L"Error: cannot export box to .iges\n";
309     return Standard_False;
310   }
311
312   return Standard_True;
313 }
314
315 //=======================================================================
316 //function : SaveSTEP
317 //purpose  : Export shape to .step
318 //=======================================================================
319 Standard_Boolean MainPage::SaveSTEP(const wchar_t* theFilePath, const TopoDS_Shape& theShape, const STEPControl_StepModelType theValue)
320 {
321   std::filebuf aFileBuf;
322   std::ostream aStream(&aFileBuf);
323
324   if (!aFileBuf.open(theFilePath, ios::out)) {
325     Output_TextBlock->Text += L"Error: cannot open file for export (step)\n";
326     return Standard_False;
327   }
328
329   STEPControl_Writer aWriter;
330
331   if (aWriter.Transfer(theShape, theValue) != IFSelect_RetDone) {
332     Output_TextBlock->Text += L"Error: cannot translate shape to STEP\n";
333     return Standard_False;
334   }
335
336   char theFilePathA[MAX_PATH];
337   WideCharToMultiByte(CP_UTF8, 0, theFilePath, -1, theFilePathA, sizeof(theFilePathA), NULL, NULL);
338
339   switch (aWriter.Write(theFilePathA))
340   {
341   case IFSelect_RetError:
342     Output_TextBlock->Text += L"Error: Incorrect Data\n";
343     break;
344   case IFSelect_RetFail:
345     Output_TextBlock->Text += L"Error: Writing has failed\n";
346     break;
347   case IFSelect_RetVoid:
348     Output_TextBlock->Text += L"Error: Nothing to transfer\n";
349     break;
350   default:
351     return Standard_True;
352   }
353   return Standard_False;
354 }
355
356 //=======================================================================
357 //function : SaveSTL
358 //purpose  : Export shape to .stl
359 //=======================================================================
360 Standard_Boolean MainPage::SaveSTL(const wchar_t* theFilePath, const TopoDS_Shape& theShape)
361 {
362   StlAPI_Writer myStlWriter;
363
364   char theFilePathA[MAX_PATH];
365   WideCharToMultiByte(CP_UTF8, 0, theFilePath, -1, theFilePathA, sizeof(theFilePathA), NULL, NULL);
366
367   return myStlWriter.Write(theShape, theFilePathA) == StlAPI_StatusOK;
368 }
369
370 //=======================================================================
371 //function : SaveVRML
372 //purpose  : Export shape to .vrml
373 //=======================================================================
374 /*
375 Standard_Boolean MainPage::SaveVRML(const wchar_t* theFilePath, const TopoDS_Shape& theShape)
376 {
377   VrmlAPI_Writer aWriter;
378
379   char theFilePathA[MAX_PATH];
380   WideCharToMultiByte(CP_UTF8, 0, theFilePath, -1, theFilePathA, sizeof(theFilePathA), NULL, NULL);
381
382   aWriter.Write(theShape, theFilePathA);
383
384   return Standard_True;
385 }
386 */
387
388 //=======================================================================
389 //function : ReadBREP
390 //purpose  : Import shape from .brep
391 //=======================================================================
392 Standard_Boolean MainPage::ReadBREP(const wchar_t* theFilePath, TopoDS_Shape& theShape)
393 {
394   theShape.Nullify();
395
396   BRep_Builder aBuilder;
397
398   char theFilePathA[MAX_PATH];
399   WideCharToMultiByte(CP_UTF8, 0, theFilePath, -1, theFilePathA, sizeof(theFilePathA), NULL, NULL);
400
401   if (!BRepTools::Read(theShape, theFilePathA, aBuilder))
402     return Standard_False;
403
404   return !theShape.IsNull() && BRepAlgo::IsValid(theShape);
405 }
406
407 //=======================================================================
408 //function : ReadIGES
409 //purpose  : Import shape from .iges
410 //=======================================================================
411 Standard_Boolean MainPage::ReadIGES(const wchar_t* theFilePath, TopoDS_Shape& theShape)
412 {
413   theShape.Nullify();
414
415   IGESControl_Reader Reader;
416
417   char theFilePathA[MAX_PATH];
418   WideCharToMultiByte(CP_UTF8, 0, theFilePath, -1, theFilePathA, sizeof(theFilePathA), NULL, NULL);
419
420   if (Reader.ReadFile(theFilePathA) != IFSelect_RetDone)
421     return Standard_False;
422
423   Reader.TransferRoots();
424   theShape = Reader.OneShape();
425
426   return !theShape.IsNull();
427 }
428
429 //=======================================================================
430 //function : ReadSTEP
431 //purpose  : Import shape from .step
432 //=======================================================================
433 Standard_Boolean MainPage::ReadSTEP(const wchar_t* theFilePath, TopoDS_Shape& theShape)
434 {
435   theShape.Nullify();
436
437   STEPControl_Reader aReader;
438
439   char theFilePathA[MAX_PATH];
440   WideCharToMultiByte(CP_UTF8, 0, theFilePath, -1, theFilePathA, sizeof(theFilePathA), NULL, NULL);
441
442   switch (aReader.ReadFile(theFilePathA))
443   {
444   case IFSelect_RetError:
445     Output_TextBlock->Text += L"Error: Not a valid Step file\n";
446     break;
447   case IFSelect_RetFail:
448     Output_TextBlock->Text += L"Error: Reading has failed\n";
449     break;
450   case IFSelect_RetVoid:
451     Output_TextBlock->Text += L"Error: Nothing to transfer\n";
452     break;
453   default:
454     return Standard_True;
455   }
456   return Standard_False;
457 }