62e1beed |
1 | #include <windows.h> |
15534713 |
2 | |
3 | // include required OCCT headers |
4 | #include <Standard_Version.hxx> |
5 | #include <Message_ProgressIndicator.hxx> |
6 | //for OCC graphic |
15534713 |
7 | #include <WNT_Window.hxx> |
62e1beed |
8 | #include <WNT_WClass.hxx> |
15534713 |
9 | #include <Graphic3d_CView.hxx> |
10 | #include <Graphic3d_Camera.hxx> |
11 | #include <Graphic3d_TextureParams.hxx> |
62e1beed |
12 | #include <D3DHost_GraphicDriver.hxx> |
c357e426 |
13 | #include <D3DHost_View.hxx> |
15534713 |
14 | //for object display |
15 | #include <V3d_Viewer.hxx> |
16 | #include <V3d_View.hxx> |
15534713 |
17 | #include <AIS_InteractiveContext.hxx> |
18 | #include <AIS_Shape.hxx> |
19 | //topology |
20 | #include <TopoDS_Shape.hxx> |
21 | #include <TopoDS_Compound.hxx> |
22 | //brep tools |
23 | #include <BRep_Builder.hxx> |
24 | #include <BRepTools.hxx> |
15534713 |
25 | // iges I/E |
26 | #include <IGESControl_Reader.hxx> |
27 | #include <IGESControl_Controller.hxx> |
28 | #include <IGESControl_Writer.hxx> |
29 | #include <IFSelect_ReturnStatus.hxx> |
30 | #include <Interface_Static.hxx> |
31 | //step I/E |
32 | #include <STEPControl_Reader.hxx> |
33 | #include <STEPControl_Writer.hxx> |
34 | //for stl export |
35 | #include <StlAPI_Writer.hxx> |
36 | //for vrml export |
37 | #include <VrmlAPI_Writer.hxx> |
38 | //wrapper of pure C++ classes to ref classes |
39 | #include <NCollection_Haft.h> |
40 | |
41 | // list of required OCCT libraries |
42 | #pragma comment(lib, "TKernel.lib") |
43 | #pragma comment(lib, "TKMath.lib") |
44 | #pragma comment(lib, "TKBRep.lib") |
15534713 |
45 | #pragma comment(lib, "TKXSBase.lib") |
46 | #pragma comment(lib, "TKService.lib") |
47 | #pragma comment(lib, "TKV3d.lib") |
48 | #pragma comment(lib, "TKOpenGl.lib") |
62e1beed |
49 | #pragma comment(lib, "TKD3dHost.lib") |
15534713 |
50 | #pragma comment(lib, "TKIGES.lib") |
51 | #pragma comment(lib, "TKSTEP.lib") |
52 | #pragma comment(lib, "TKStl.lib") |
53 | #pragma comment(lib, "TKVrml.lib") |
54 | |
62e1beed |
55 | #pragma comment(lib, "D3D9.lib") |
56 | |
15534713 |
57 | /// <summary> |
58 | /// Proxy class encapsulating calls to OCCT C++ classes within |
59 | /// C++/CLI class visible from .Net (CSharp) |
60 | /// </summary> |
61 | public ref class OCCTProxyD3D |
62 | { |
63 | public: |
64 | |
62e1beed |
65 | OCCTProxyD3D() {} |
15534713 |
66 | |
67 | // ============================================ |
68 | // Viewer functionality |
69 | // ============================================ |
70 | |
71 | /// <summary> |
72 | ///Initialize a viewer |
73 | /// </summary> |
74 | /// <param name="theWnd">System.IntPtr that contains the window handle (HWND) of the control</param> |
62e1beed |
75 | bool InitViewer() |
15534713 |
76 | { |
62e1beed |
77 | myGraphicDriver() = new D3DHost_GraphicDriver(); |
78 | myGraphicDriver()->ChangeOptions().buffersNoSwap = true; |
15534713 |
79 | //myGraphicDriver()->ChangeOptions().contextDebug = true; |
80 | |
81 | TCollection_ExtendedString a3DName ("Visu3D"); |
82 | myViewer() = new V3d_Viewer (myGraphicDriver(), a3DName.ToExtString(), "", 1000.0, |
83 | V3d_XposYnegZpos, Quantity_NOC_GRAY30, |
84 | V3d_ZBUFFER, V3d_GOURAUD, V3d_WAIT, |
85 | Standard_True, Standard_False); |
86 | |
87 | myViewer()->SetDefaultLights(); |
88 | myViewer()->SetLightOn(); |
89 | myView() = myViewer()->CreateView(); |
62e1beed |
90 | |
91 | static Handle(WNT_WClass) aWClass = new WNT_WClass ("OCC_Viewer", NULL, CS_OWNDC); |
92 | Handle(WNT_Window) aWNTWindow = new WNT_Window ("OCC_Viewer", aWClass, WS_POPUP, 64, 64, 64, 64); |
93 | aWNTWindow->SetVirtual (Standard_True); |
15534713 |
94 | myView()->SetWindow(aWNTWindow); |
15534713 |
95 | myAISContext() = new AIS_InteractiveContext (myViewer()); |
96 | myAISContext()->UpdateCurrentViewer(); |
97 | myView()->MustBeResized(); |
98 | return true; |
99 | } |
100 | |
15534713 |
101 | /// <summary> Resizes custom FBO for Direct3D output. </summary> |
62e1beed |
102 | System::IntPtr ResizeBridgeFBO (int theWinSizeX, |
103 | int theWinSizeY) |
15534713 |
104 | { |
62e1beed |
105 | Handle(WNT_Window) aWNTWindow = Handle(WNT_Window)::DownCast (myView()->Window()); |
106 | aWNTWindow->SetPos (0, 0, theWinSizeX, theWinSizeY); |
107 | myView()->MustBeResized(); |
108 | myView()->Invalidate(); |
c357e426 |
109 | return System::IntPtr(Handle(D3DHost_View)::DownCast (myView()->View())->D3dColorSurface()); |
15534713 |
110 | } |
111 | |
112 | /// <summary> |
113 | /// Make dump of current view to file |
114 | /// </summary> |
115 | /// <param name="theFileName">Name of dump file</param> |
116 | bool Dump (const char* theFileName) |
117 | { |
118 | if (myView().IsNull()) |
119 | { |
120 | return false; |
121 | } |
122 | myView()->Redraw(); |
123 | return myView()->Dump (theFileName) != Standard_False; |
124 | } |
125 | |
126 | /// <summary> |
127 | ///Redraw view |
128 | /// </summary> |
129 | void RedrawView() |
130 | { |
131 | if (!myView().IsNull()) |
132 | { |
133 | myView()->Redraw(); |
134 | } |
135 | } |
136 | |
137 | /// <summary> |
138 | ///Update view |
139 | /// </summary> |
140 | void UpdateView(void) |
141 | { |
142 | if (!myView().IsNull()) |
143 | { |
144 | myView()->MustBeResized(); |
145 | } |
146 | } |
147 | |
148 | /// <summary> |
149 | ///Set computed mode in false |
150 | /// </summary> |
151 | void SetDegenerateModeOn() |
152 | { |
153 | if (!myView().IsNull()) |
154 | { |
155 | myView()->SetComputedMode (Standard_False); |
156 | } |
157 | } |
158 | |
159 | /// <summary> |
160 | ///Set computed mode in true |
161 | /// </summary> |
162 | void SetDegenerateModeOff() |
163 | { |
164 | if (!myView().IsNull()) |
165 | { |
166 | myView()->SetComputedMode (Standard_True); |
167 | } |
168 | } |
169 | |
170 | /// <summary> |
171 | ///Fit all |
172 | /// </summary> |
173 | void WindowFitAll (int theXmin, int theYmin, |
174 | int theXmax, int theYmax) |
175 | { |
176 | if (!myView().IsNull()) |
177 | { |
178 | myView()->WindowFitAll (theXmin, theYmin, theXmax, theYmax); |
179 | } |
180 | } |
181 | |
182 | /// <summary> |
183 | ///Current place of window |
184 | /// </summary> |
185 | /// <param name="theZoomFactor">Current zoom</param> |
186 | void Place (int theX, int theY, float theZoomFactor) |
187 | { |
188 | Quantity_Factor aZoomFactor = theZoomFactor; |
189 | if (!myView().IsNull()) |
190 | { |
191 | myView()->Place (theX, theY, aZoomFactor); |
192 | } |
193 | } |
194 | |
195 | /// <summary> |
196 | ///Set Zoom |
197 | /// </summary> |
198 | void Zoom (int theX1, int theY1, int theX2, int theY2) |
199 | { |
200 | if (!myView().IsNull()) |
201 | { |
202 | myView()->Zoom (theX1, theY1, theX2, theY2); |
203 | } |
204 | } |
205 | |
206 | /// <summary> |
207 | ///Set Pan |
208 | /// </summary> |
209 | void Pan (int theX, int theY) |
210 | { |
211 | if (!myView().IsNull()) |
212 | { |
213 | myView()->Pan (theX, theY); |
214 | } |
215 | } |
216 | |
217 | /// <summary> |
218 | ///Rotation |
219 | /// </summary> |
220 | void Rotation (int theX, int theY) |
221 | { |
222 | if (!myView().IsNull()) |
223 | { |
224 | myView()->Rotation (theX, theY); |
225 | } |
226 | } |
227 | |
228 | /// <summary> |
229 | ///Start rotation |
230 | /// </summary> |
231 | void StartRotation (int theX, int theY) |
232 | { |
233 | if (!myView().IsNull()) |
234 | { |
235 | myView()->StartRotation (theX, theY); |
236 | } |
237 | } |
238 | |
239 | /// <summary> |
240 | ///Select by rectangle |
241 | /// </summary> |
242 | void Select (int theX1, int theY1, int theX2, int theY2) |
243 | { |
244 | if (!myAISContext().IsNull()) |
245 | { |
246 | myAISContext()->Select (theX1, theY1, theX2, theY2, myView()); |
247 | } |
248 | } |
249 | |
250 | /// <summary> |
251 | ///Select by click |
252 | /// </summary> |
253 | void Select() |
254 | { |
255 | if (!myAISContext().IsNull()) |
256 | { |
257 | myAISContext()->Select(); |
258 | } |
259 | } |
260 | |
261 | /// <summary> |
262 | ///Move view |
263 | /// </summary> |
264 | void MoveTo (int theX, int theY) |
265 | { |
266 | if (!myAISContext().IsNull() && !myView().IsNull()) |
267 | { |
268 | myAISContext()->MoveTo (theX, theY, myView()); |
269 | } |
270 | } |
271 | |
272 | /// <summary> |
273 | ///Select by rectangle with pressed "Shift" key |
274 | /// </summary> |
275 | void ShiftSelect (int theX1, int theY1, int theX2, int theY2) |
276 | { |
277 | if (!myAISContext().IsNull() && !myView().IsNull()) |
278 | { |
279 | myAISContext()->ShiftSelect (theX1, theY1, theX2, theY2, myView()); |
280 | } |
281 | } |
282 | |
283 | /// <summary> |
284 | ///Select by "Shift" key |
285 | /// </summary> |
286 | void ShiftSelect() |
287 | { |
288 | if (!myAISContext().IsNull()) |
289 | { |
290 | myAISContext()->ShiftSelect(); |
291 | } |
292 | } |
293 | |
294 | /// <summary> |
295 | ///Set background color |
296 | /// </summary> |
297 | void BackgroundColor (int& theRed, int& theGreen, int& theBlue) |
298 | { |
299 | if (!myView().IsNull()) |
300 | { |
301 | Quantity_Color aColor = myView()->BackgroundColor(); |
302 | theRed = (int )aColor.Red() * 255; |
303 | theGreen = (int )aColor.Green() * 255; |
304 | theBlue = (int )aColor.Blue() * 255; |
305 | } |
306 | } |
307 | |
308 | /// <summary> |
309 | ///Get background color Red |
310 | /// </summary> |
311 | int GetBGColR() |
312 | { |
313 | int anRgb[3]; |
314 | BackgroundColor (anRgb[0], anRgb[1], anRgb[2]); |
315 | return anRgb[0]; |
316 | } |
317 | |
318 | /// <summary> |
319 | ///Get background color Green |
320 | /// </summary> |
321 | int GetBGColG() |
322 | { |
323 | int anRgb[3]; |
324 | BackgroundColor (anRgb[0], anRgb[1], anRgb[2]); |
325 | return anRgb[1]; |
326 | } |
327 | |
328 | /// <summary> |
329 | ///Get background color Blue |
330 | /// </summary> |
331 | int GetBGColB() |
332 | { |
333 | int anRgb[3]; |
334 | BackgroundColor (anRgb[0], anRgb[1], anRgb[2]); |
335 | return anRgb[2]; |
336 | } |
337 | |
338 | /// <summary> |
339 | ///Update current viewer |
340 | /// </summary> |
341 | void UpdateCurrentViewer() |
342 | { |
343 | if (!myAISContext().IsNull()) |
344 | { |
345 | myAISContext()->UpdateCurrentViewer(); |
346 | } |
347 | } |
348 | |
349 | /// <summary> |
350 | ///Front side |
351 | /// </summary> |
352 | void FrontView() |
353 | { |
354 | if (!myView().IsNull()) |
355 | { |
356 | myView()->SetProj (V3d_Xpos); |
357 | } |
358 | } |
359 | |
360 | /// <summary> |
361 | ///Top side |
362 | /// </summary> |
363 | void TopView() |
364 | { |
365 | if (!myView().IsNull()) |
366 | { |
367 | myView()->SetProj (V3d_Zpos); |
368 | } |
369 | } |
370 | |
371 | /// <summary> |
372 | ///Left side |
373 | /// </summary> |
374 | void LeftView() |
375 | { |
376 | if (!myView().IsNull()) |
377 | { |
378 | myView()->SetProj (V3d_Ypos); |
379 | } |
380 | } |
381 | |
382 | /// <summary> |
383 | ///Back side |
384 | /// </summary> |
385 | void BackView() |
386 | { |
387 | if (!myView().IsNull()) |
388 | { |
389 | myView()->SetProj (V3d_Xneg); |
390 | } |
391 | } |
392 | |
393 | /// <summary> |
394 | ///Right side |
395 | /// </summary> |
396 | void RightView() |
397 | { |
398 | if (!myView().IsNull()) |
399 | { |
400 | myView()->SetProj (V3d_Yneg); |
401 | } |
402 | } |
403 | |
404 | /// <summary> |
405 | ///Bottom side |
406 | /// </summary> |
407 | void BottomView() |
408 | { |
409 | if (!myView().IsNull()) |
410 | { |
411 | myView()->SetProj (V3d_Zneg); |
412 | } |
413 | } |
414 | |
415 | /// <summary> |
416 | ///Axo side |
417 | /// </summary> |
418 | void AxoView() |
419 | { |
420 | if (!myView().IsNull()) |
421 | { |
422 | myView()->SetProj (V3d_XposYnegZpos); |
423 | } |
424 | } |
425 | |
426 | /// <summary> |
427 | ///Scale |
428 | /// </summary> |
429 | float Scale() |
430 | { |
431 | return myView().IsNull() |
432 | ? -1.0f |
433 | : float(myView()->Scale()); |
434 | } |
435 | |
436 | /// <summary> |
437 | ///Zoom in all view |
438 | /// </summary> |
439 | void ZoomAllView() |
440 | { |
441 | if (!myView().IsNull()) |
442 | { |
443 | myView()->FitAll(); |
444 | myView()->ZFitAll(); |
445 | } |
446 | } |
447 | |
448 | /// <summary> |
449 | ///Reset view |
450 | /// </summary> |
451 | void Reset() |
452 | { |
453 | if (!myView().IsNull()) |
454 | { |
455 | myView()->Reset(); |
456 | } |
457 | } |
458 | |
459 | /// <summary> |
460 | ///Set display mode of objects |
461 | /// </summary> |
462 | /// <param name="theMode">Set current mode</param> |
463 | void SetDisplayMode (int theMode) |
464 | { |
465 | if (myAISContext().IsNull()) |
466 | { |
467 | return; |
468 | } |
469 | |
470 | AIS_DisplayMode aCurrentMode = theMode == 0 |
471 | ? AIS_WireFrame |
472 | : AIS_Shaded; |
473 | if (myAISContext()->NbCurrents() == 0 |
474 | || myAISContext()->NbSelected() == 0) |
475 | { |
476 | myAISContext()->SetDisplayMode (aCurrentMode); |
477 | } |
478 | else |
479 | { |
480 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
481 | { |
482 | myAISContext()->SetDisplayMode (myAISContext()->Current(), theMode, Standard_False); |
483 | } |
484 | } |
485 | myAISContext()->UpdateCurrentViewer(); |
486 | } |
487 | |
488 | /// <summary> |
489 | ///Set color |
490 | /// </summary> |
491 | void SetColor (int theR, int theG, int theB) |
492 | { |
493 | if (myAISContext().IsNull()) |
494 | { |
495 | return; |
496 | } |
497 | |
498 | Quantity_Color aCol (theR / 255.0, theG / 255.0, theB / 255.0, Quantity_TOC_RGB); |
499 | for (; myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
500 | { |
501 | myAISContext()->SetColor (myAISContext()->Current(), aCol.Name()); |
502 | } |
503 | } |
504 | |
505 | /// <summary> |
506 | ///Get object color red |
507 | /// </summary> |
508 | int GetObjColR() |
509 | { |
510 | int anRgb[3]; |
511 | ObjectColor (anRgb[0], anRgb[1], anRgb[2]); |
512 | return anRgb[0]; |
513 | } |
514 | |
515 | /// <summary> |
516 | ///Get object color green |
517 | /// </summary> |
518 | int GetObjColG() |
519 | { |
520 | int anRgb[3]; |
521 | ObjectColor (anRgb[0], anRgb[1], anRgb[2]); |
522 | return anRgb[1]; |
523 | } |
524 | |
525 | /// <summary> |
526 | ///Get object color blue |
527 | /// </summary> |
528 | int GetObjColB() |
529 | { |
530 | int anRgb[3]; |
531 | ObjectColor (anRgb[0], anRgb[1], anRgb[2]); |
532 | return anRgb[2]; |
533 | } |
534 | |
535 | /// <summary> |
536 | ///Get object color R/G/B |
537 | /// </summary> |
538 | void ObjectColor (int& theRed, int& theGreen, int& theBlue) |
539 | { |
540 | if (myAISContext().IsNull()) |
541 | { |
542 | return; |
543 | } |
544 | |
545 | theRed = 255; |
546 | theGreen = 255; |
547 | theBlue = 255; |
548 | myAISContext()->InitCurrent(); |
549 | if (!myAISContext()->MoreCurrent()) |
550 | { |
551 | return; |
552 | } |
553 | |
554 | Handle(AIS_InteractiveObject) aCurrent = myAISContext()->Current(); |
555 | if (aCurrent->HasColor()) |
556 | { |
557 | Quantity_Color anObjCol = myAISContext()->Color (myAISContext()->Current()); |
558 | theRed = int(anObjCol.Red() * 255.0); |
559 | theGreen = int(anObjCol.Green() * 255.0); |
560 | theBlue = int(anObjCol.Blue() * 255.0); |
561 | } |
562 | } |
563 | |
564 | /// <summary> |
565 | ///Set background color R/G/B |
566 | /// </summary> |
567 | void SetBackgroundColor (int theRed, int theGreen, int theBlue) |
568 | { |
569 | if (!myView().IsNull()) |
570 | { |
571 | myView()->SetBackgroundColor (Quantity_TOC_RGB, theRed / 255.0, theGreen / 255.0, theBlue / 255.0); |
572 | } |
573 | } |
574 | |
575 | /// <summary> |
576 | ///Erase objects |
577 | /// </summary> |
578 | void EraseObjects() |
579 | { |
580 | if (myAISContext().IsNull()) |
581 | { |
582 | return; |
583 | } |
7140edaf |
584 | |
585 | myAISContext()->EraseSelected (Standard_True); |
15534713 |
586 | myAISContext()->ClearCurrents(); |
587 | } |
588 | |
589 | /// <summary> |
590 | ///Get version |
591 | /// </summary> |
592 | float GetOCCVersion() |
593 | { |
594 | return (float )OCC_VERSION; |
595 | } |
596 | |
597 | /// <summary> |
598 | ///set material |
599 | /// </summary> |
600 | void SetMaterial (int theMaterial) |
601 | { |
602 | if (myAISContext().IsNull()) |
603 | { |
604 | return; |
605 | } |
606 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
607 | { |
608 | myAISContext()->SetMaterial (myAISContext()->Current(), (Graphic3d_NameOfMaterial )theMaterial); |
609 | } |
610 | myAISContext()->UpdateCurrentViewer(); |
611 | } |
612 | |
613 | /// <summary> |
614 | ///set transparency |
615 | /// </summary> |
616 | void SetTransparency (int theTrans) |
617 | { |
618 | if (myAISContext().IsNull()) |
619 | { |
620 | return; |
621 | } |
622 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextSelected()) |
623 | { |
624 | myAISContext()->SetTransparency (myAISContext()->Current(), ((Standard_Real )theTrans) / 10.0); |
625 | } |
626 | } |
627 | |
628 | /// <summary> |
629 | ///Return true if object is selected |
630 | /// </summary> |
631 | bool IsObjectSelected() |
632 | { |
633 | if (myAISContext().IsNull()) |
634 | { |
635 | return false; |
636 | } |
637 | myAISContext()->InitCurrent(); |
638 | return myAISContext()->MoreCurrent() != Standard_False; |
639 | } |
640 | |
641 | /// <summary> |
642 | ///Return display mode |
643 | /// </summary> |
644 | int DisplayMode() |
645 | { |
646 | if (myAISContext().IsNull()) |
647 | { |
648 | return -1; |
649 | } |
650 | |
651 | bool isOneOrMoreInShading = false; |
652 | bool isOneOrMoreInWireframe = false; |
653 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
654 | { |
655 | if (myAISContext()->IsDisplayed (myAISContext()->Current(), AIS_Shaded)) |
656 | { |
657 | isOneOrMoreInShading = true; |
658 | } |
659 | if (myAISContext()->IsDisplayed (myAISContext()->Current(), AIS_WireFrame)) |
660 | { |
661 | isOneOrMoreInWireframe = true; |
662 | } |
663 | } |
664 | if (isOneOrMoreInShading |
665 | && isOneOrMoreInWireframe) |
666 | { |
667 | return 10; |
668 | } |
669 | else if (isOneOrMoreInShading) |
670 | { |
671 | return 1; |
672 | } |
673 | else if (isOneOrMoreInWireframe) |
674 | { |
675 | return 0; |
676 | } |
677 | return -1; |
678 | } |
679 | |
15534713 |
680 | /// <summary> |
681 | ///Set AISContext |
682 | /// </summary> |
683 | bool SetAISContext (OCCTProxyD3D^ theViewer) |
684 | { |
685 | this->myAISContext() = theViewer->GetContext(); |
686 | if (myAISContext().IsNull()) |
687 | { |
688 | return false; |
689 | } |
690 | return true; |
691 | } |
692 | |
693 | /// <summary> |
694 | ///Get AISContext |
695 | /// </summary> |
696 | Handle_AIS_InteractiveContext GetContext() |
697 | { |
698 | return myAISContext(); |
699 | } |
700 | |
701 | public: |
702 | // ============================================ |
703 | // Import / export functionality |
704 | // ============================================ |
705 | |
706 | /// <summary> |
707 | ///Import BRep file |
708 | /// </summary> |
709 | /// <param name="theFileName">Name of import file</param> |
710 | bool ImportBrep (System::String^ theFileName) |
711 | { |
712 | bool isResult = false; |
713 | int aLength = theFileName->Length; |
714 | char* aFilename = new char[aLength + 1]; |
715 | for(int i = 0; i < aLength; ++i) |
716 | { |
717 | aFilename[i] = (char )theFileName->ToCharArray()[i]; |
718 | } |
719 | aFilename[aLength] = '\0'; |
720 | isResult = ImportBrep (aFilename); |
721 | delete[] aFilename; |
722 | return isResult; |
723 | } |
724 | |
725 | /// <summary> |
726 | ///Import BRep file |
727 | /// </summary> |
728 | /// <param name="theFileName">Name of import file</param> |
729 | bool ImportBrep (char* theFileName) |
730 | { |
731 | TopoDS_Shape aShape; |
732 | BRep_Builder aBuilder; |
733 | if (!BRepTools::Read (aShape, theFileName, aBuilder)) |
734 | { |
735 | return false; |
736 | } |
737 | if (myAISContext()->HasOpenedContext()) |
738 | { |
739 | myAISContext()->CloseLocalContext(); |
740 | } |
741 | Handle(AIS_Shape) aPrs = new AIS_Shape (aShape); |
742 | myAISContext()->SetMaterial (aPrs, Graphic3d_NOM_GOLD); |
743 | myAISContext()->SetDisplayMode(aPrs, AIS_Shaded, Standard_False); |
744 | myAISContext()->Display (aPrs); |
745 | return true; |
746 | } |
747 | |
15534713 |
748 | /// <summary> |
749 | ///Import Step file |
750 | /// </summary> |
751 | /// <param name="theFileName">Name of import file</param> |
752 | bool ImportStep (char* theFileName) |
753 | { |
754 | STEPControl_Reader aReader; |
755 | if (aReader.ReadFile (theFileName) != IFSelect_RetDone) |
756 | { |
757 | return false; |
758 | } |
759 | |
760 | bool isFailsonly = false; |
761 | aReader.PrintCheckLoad( isFailsonly, IFSelect_ItemsByEntity ); |
762 | |
763 | int aNbRoot = aReader.NbRootsForTransfer(); |
764 | aReader.PrintCheckTransfer (isFailsonly, IFSelect_ItemsByEntity); |
765 | for (Standard_Integer aRootIter = 1; aRootIter <= aNbRoot; ++aRootIter) |
766 | { |
767 | aReader.TransferRoot (aRootIter); |
768 | int aNbShap = aReader.NbShapes(); |
769 | if (aNbShap > 0) |
770 | { |
771 | for (int aShapeIter = 1; aShapeIter <= aNbShap; ++aShapeIter) |
772 | { |
773 | myAISContext()->Display (new AIS_Shape (aReader.Shape (aShapeIter)), Standard_True); |
774 | } |
775 | } |
776 | } |
777 | return true; |
778 | } |
779 | |
780 | /// <summary> |
781 | ///Import Iges file |
782 | /// </summary> |
783 | /// <param name="theFileName">Name of import file</param> |
784 | bool ImportIges (char* theFileName) |
785 | { |
786 | IGESControl_Reader aReader; |
787 | if (aReader.ReadFile (theFileName) != IFSelect_RetDone) |
788 | { |
789 | return false; |
790 | } |
791 | |
792 | aReader.TransferRoots(); |
793 | TopoDS_Shape aShape = aReader.OneShape(); |
794 | myAISContext()->Display (new AIS_Shape (aShape), Standard_False); |
795 | myAISContext()->UpdateCurrentViewer(); |
796 | return true; |
797 | } |
798 | |
799 | /// <summary> |
800 | ///Export BRep file |
801 | /// </summary> |
802 | /// <param name="theFileName">Name of export file</param> |
803 | bool ExportBRep (char* theFileName) |
804 | { |
805 | myAISContext()->InitCurrent(); |
806 | if (!myAISContext()->MoreCurrent()) |
807 | { |
808 | return false; |
809 | } |
810 | |
811 | Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); |
812 | return !anIS.IsNull() |
813 | && BRepTools::Write (anIS->Shape(), theFileName); |
814 | } |
815 | |
816 | /// <summary> |
817 | ///Export Step file |
818 | /// </summary> |
819 | /// <param name="theFileName">Name of export file</param> |
820 | bool ExportStep (char* theFileName) |
821 | { |
822 | STEPControl_StepModelType aType = STEPControl_AsIs; |
823 | STEPControl_Writer aWriter; |
824 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
825 | { |
826 | Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); |
827 | if (anIS.IsNull()) |
828 | { |
829 | return false; |
830 | } |
831 | |
832 | TopoDS_Shape aShape = anIS->Shape(); |
833 | if (aWriter.Transfer (aShape, aType) != IFSelect_RetDone) |
834 | { |
835 | return false; |
836 | } |
837 | } |
838 | return aWriter.Write (theFileName) == IFSelect_RetDone; |
839 | } |
840 | |
841 | /// <summary> |
842 | ///Export Iges file |
843 | /// </summary> |
844 | /// <param name="theFileName">Name of export file</param> |
845 | bool ExportIges (char* theFileName) |
846 | { |
847 | IGESControl_Controller::Init(); |
848 | IGESControl_Writer aWriter (Interface_Static::CVal ("XSTEP.iges.unit"), |
849 | Interface_Static::IVal ("XSTEP.iges.writebrep.mode")); |
850 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
851 | { |
852 | Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); |
853 | if (anIS.IsNull()) |
854 | { |
855 | return false; |
856 | } |
857 | |
858 | aWriter.AddShape (anIS->Shape()); |
859 | } |
860 | |
861 | aWriter.ComputeModel(); |
862 | return aWriter.Write (theFileName) != Standard_False; |
863 | } |
864 | |
865 | /// <summary> |
866 | ///Export Vrml file |
867 | /// </summary> |
868 | /// <param name="theFileName">Name of export file</param> |
869 | bool ExportVrml (char* theFileName) |
870 | { |
871 | TopoDS_Compound aRes; |
872 | BRep_Builder aBuilder; |
873 | aBuilder.MakeCompound (aRes); |
874 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
875 | { |
876 | Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); |
877 | if (anIS.IsNull()) |
878 | { |
879 | return false; |
880 | } |
881 | aBuilder.Add (aRes, anIS->Shape()); |
882 | } |
883 | |
884 | VrmlAPI_Writer aWriter; |
885 | aWriter.Write (aRes, theFileName); |
886 | return true; |
887 | } |
888 | |
889 | /// <summary> |
890 | ///Export Stl file |
891 | /// </summary> |
892 | /// <param name="theFileName">Name of export file</param> |
893 | bool ExportStl (char* theFileName) |
894 | { |
895 | TopoDS_Compound aComp; |
896 | BRep_Builder aBuilder; |
897 | aBuilder.MakeCompound (aComp); |
898 | for (myAISContext()->InitCurrent(); myAISContext()->MoreCurrent(); myAISContext()->NextCurrent()) |
899 | { |
900 | Handle(AIS_Shape) anIS = Handle(AIS_Shape)::DownCast (myAISContext()->Current()); |
901 | if (anIS.IsNull()) |
902 | { |
903 | return false; |
904 | } |
905 | aBuilder.Add (aComp, anIS->Shape()); |
906 | } |
907 | |
908 | StlAPI_Writer aWriter; |
909 | aWriter.Write (aComp, theFileName); |
910 | return true; |
911 | } |
912 | |
913 | /// <summary> |
914 | ///Define which Import/Export function must be called |
915 | /// </summary> |
916 | /// <param name="theFileName">Name of Import/Export file</param> |
917 | /// <param name="theFormat">Determines format of Import/Export file</param> |
918 | /// <param name="theIsImport">Determines is Import or not</param> |
919 | bool TranslateModel (System::String^ theFileName, int theFormat, bool theIsImport) |
920 | { |
921 | bool isResult = false; |
922 | int aLength = theFileName->Length; |
923 | char* aFilename = new char[aLength + 1]; |
924 | for (int aCharIter = 0; aCharIter < aLength; ++aCharIter) |
925 | { |
926 | aFilename[aCharIter] = (char)theFileName->ToCharArray()[aCharIter]; |
927 | } |
928 | aFilename[aLength] = '\0'; |
929 | |
930 | if (theIsImport) |
931 | { |
932 | switch (theFormat) |
933 | { |
934 | case 0: isResult = ImportBrep (aFilename); break; |
41f03605 |
935 | case 1: isResult = ImportStep (aFilename); break; |
936 | case 2: isResult = ImportIges (aFilename); break; |
15534713 |
937 | } |
938 | } |
939 | else |
940 | { |
941 | switch (theFormat) |
942 | { |
943 | case 0: isResult = ExportBRep (aFilename); break; |
41f03605 |
944 | case 1: isResult = ExportStep (aFilename); break; |
945 | case 2: isResult = ExportIges (aFilename); break; |
946 | case 3: isResult = ExportVrml (aFilename); break; |
947 | case 4: isResult = ExportStl (aFilename); break; |
948 | case 5: isResult = Dump (aFilename); break; |
15534713 |
949 | } |
950 | } |
951 | delete[] aFilename; |
952 | return isResult; |
953 | } |
954 | |
955 | /// <summary> |
956 | ///Initialize OCCTProxyD3D |
957 | /// </summary> |
958 | void InitOCCTProxy() |
959 | { |
960 | myGraphicDriver().Nullify(); |
961 | myViewer().Nullify(); |
962 | myView().Nullify(); |
963 | myAISContext().Nullify(); |
964 | } |
965 | |
966 | private: |
967 | |
968 | NCollection_Haft<Handle_V3d_Viewer> myViewer; |
969 | NCollection_Haft<Handle_V3d_View> myView; |
970 | NCollection_Haft<Handle_AIS_InteractiveContext> myAISContext; |
62e1beed |
971 | NCollection_Haft<Handle_D3DHost_GraphicDriver> myGraphicDriver; |
15534713 |
972 | |
973 | }; |