1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using System.Windows.Input;
7 using System.Drawing;
8 
9 namespace IE_WPF_D3D
10 {
11   public enum CurrentAction3d
12   {
13     CurAction3d_Nothing,
14     CurAction3d_DynamicZooming,
15     CurAction3d_WindowZooming,
16     CurAction3d_DynamicPanning,
17     CurAction3d_GlobalPanning,
18     CurAction3d_DynamicRotation
19   }
20   public enum CurrentPressedKey
21   {
22     CurPressedKey_Nothing,
23     CurPressedKey_Ctrl,
24     CurPressedKey_Shift
25   }
26   public enum ModelFormat
27   {
28     BREP,
29     STEP,
30     IGES,
31     VRML,
32     STL,
33     IMAGE
34   }
35 
36   public enum DisplayMode
37   {
38     Wireframe,
39     Shading
40   }
41 
42   public class OCCViewer
43   {
44     public event EventHandler ZoomingFinished;
RaiseZoomingFinished()45     protected void RaiseZoomingFinished ()
46     {
47       if (ZoomingFinished != null)
48       {
49         ZoomingFinished (this, EventArgs.Empty);
50       }
51     }
52 
53     public event EventHandler AvaliabiltyOfOperationsChanged;
RaiseAvaliabiltyOfOperationsChanged()54     protected void RaiseAvaliabiltyOfOperationsChanged ()
55     {
56       if (AvaliabiltyOfOperationsChanged != null)
57       {
58         AvaliabiltyOfOperationsChanged (this, EventArgs.Empty);
59       }
60     }
61 
62     public OCCTProxyD3D View { get; private set; }
63     public CurrentAction3d CurrentMode { get; private set; }
64     private bool IsRectVisible { get; set; }
65     public bool DegenerateMode { get; private set; }
66 
67     public bool IsWireframeEnabled { get; private set; }
68     public bool IsShadingEnabled { get; private set; }
69     public bool IsTransparencyEnabled { get; private set; }
70     public bool IsColorEnabled { get; private set; }
71     public bool IsMaterialEnabled { get; private set; }
72     public bool IsDeleteEnabled { get; private set; }
73 
74     private float myCurZoom;
75     private int myXmin;
76     private int myYmin;
77     private int myXmax;
78     private int myYmax;
79     private int myButtonDownX;
80     private int myButtonDownY;
OCCViewer()81     public OCCViewer()
82     {
83       View = new OCCTProxyD3D ();
84       View.InitOCCTProxy ();
85       CurrentMode = CurrentAction3d.CurAction3d_Nothing;
86       IsRectVisible = false;
87       DegenerateMode = true;
88     }
89 
InitViewer()90     public bool InitViewer()
91     {
92       return View.InitViewer();
93     }
94 
ImportModel(ModelFormat theFormat)95     public void ImportModel (ModelFormat theFormat)
96     {
97       int aFormat = 10;
98       OpenFileDialog anOpenDialog = new OpenFileDialog ();
99       string aDataDir = Environment.GetEnvironmentVariable ("CSF_OCCTDataPath");
100       string aFilter = "";
101 
102       switch (theFormat)
103       {
104         case ModelFormat.BREP:
105           anOpenDialog.InitialDirectory = (aDataDir + "\\occ");
106           aFormat = 0;
107           aFilter = "BREP Files (*.brep *.rle)|*.brep; *.rle";
108           break;
109         case ModelFormat.STEP:
110           anOpenDialog.InitialDirectory = (aDataDir + "\\step");
111           aFormat = 1;
112           aFilter = "STEP Files (*.stp *.step)|*.stp; *.step";
113           break;
114         case ModelFormat.IGES:
115           anOpenDialog.InitialDirectory = (aDataDir + "\\iges");
116           aFormat = 2;
117           aFilter = "IGES Files (*.igs *.iges)|*.igs; *.iges";
118           break;
119         default:
120           break;
121       }
122 
123       anOpenDialog.Filter = aFilter + "|All files (*.*)|*.*";
124       if (anOpenDialog.ShowDialog () == DialogResult.OK)
125       {
126         string aFileName = anOpenDialog.FileName;
127         if (aFileName == "")
128         {
129           return;
130         }
131 
132         if (!View.TranslateModel (aFileName, aFormat, true))
133         {
134           MessageBox.Show ("Can't read this file", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
135         }
136       }
137       View.ZoomAllView ();
138     }
139 
ExportModel(ModelFormat theFormat)140     public void ExportModel (ModelFormat theFormat)
141     {
142       int aFormat = 10;
143       SaveFileDialog saveDialog = new SaveFileDialog ();
144       string aDataDir = Environment.GetEnvironmentVariable ("CSF_OCCTDataPath");
145       string aFilter = "";
146 
147       switch (theFormat)
148       {
149         case ModelFormat.BREP:
150           saveDialog.InitialDirectory = (aDataDir + "\\occ");
151           aFormat = 0;
152           aFilter = "BREP Files (*.brep *.rle)|*.brep; *.rle";
153           break;
154         case ModelFormat.STEP:
155           saveDialog.InitialDirectory = (aDataDir + "\\step");
156           aFormat = 1;
157           aFilter = "STEP Files (*.stp *.step)|*.step; *.stp";
158           break;
159         case ModelFormat.IGES:
160           saveDialog.InitialDirectory = (aDataDir + "\\iges");
161           aFormat = 2;
162           aFilter = "IGES Files (*.igs *.iges)| *.iges; *.igs";
163           break;
164         case ModelFormat.VRML:
165           saveDialog.InitialDirectory = (aDataDir + "\\vrml");
166           aFormat = 3;
167           aFilter = "VRML Files (*.vrml)|*.vrml";
168           break;
169         case ModelFormat.STL:
170           saveDialog.InitialDirectory = (aDataDir + "\\stl");
171           aFormat = 4;
172           aFilter = "STL Files (*.stl)|*.stl";
173           break;
174         case ModelFormat.IMAGE:
175           saveDialog.InitialDirectory = (aDataDir + "\\images");
176           aFormat = 5;
177           aFilter = "Images Files (*.bmp)|*.bmp";
178           break;
179         default:
180           break;
181       }
182 
183       saveDialog.Filter = aFilter;
184       if (saveDialog.ShowDialog () == DialogResult.OK)
185       {
186         string aFileName = saveDialog.FileName;
187         if (aFileName == "")
188         {
189           return;
190         }
191 
192         if (!View.TranslateModel (aFileName, aFormat, false))
193         {
194           MessageBox.Show ("Can not write this file", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
195         }
196       }
197     }
198 
FitAll()199     public void FitAll ()
200     {
201       View.ZoomAllView ();
202     }
203 
ZoomWindow()204     public void ZoomWindow ()
205     {
206       CurrentMode = CurrentAction3d.CurAction3d_WindowZooming;
207     }
208 
DynamicZooming()209     public void DynamicZooming ()
210     {
211       CurrentMode = CurrentAction3d.CurAction3d_DynamicZooming;
212     }
213 
DynamicPanning()214     public void DynamicPanning ()
215     {
216       CurrentMode = CurrentAction3d.CurAction3d_DynamicPanning;
217     }
218 
GlobalPanning()219     public void GlobalPanning ()
220     {
221       myCurZoom = View.Scale ();
222       CurrentMode = CurrentAction3d.CurAction3d_GlobalPanning;
223     }
224 
AxoView()225     public void AxoView ()
226     {
227       View.AxoView ();
228     }
229 
FrontView()230     public void FrontView ()
231     {
232       View.FrontView ();
233     }
234 
TopView()235     public void TopView ()
236     {
237       View.TopView ();
238     }
239 
LeftView()240     public void LeftView ()
241     {
242       View.LeftView ();
243     }
244 
BackView()245     public void BackView ()
246     {
247       View.BackView ();
248     }
249 
RightView()250     public void RightView ()
251     {
252       View.RightView ();
253     }
254 
Reset()255     public void Reset ()
256     {
257       View.Reset ();
258     }
259 
BottomView()260     public void BottomView ()
261     {
262       View.BottomView ();
263     }
264 
HiddenOff()265     public void HiddenOff ()
266     {
267       View.SetDegenerateModeOff ();
268       DegenerateMode = false;
269     }
270 
HiddenOn()271     public void HiddenOn ()
272     {
273       View.SetDegenerateModeOn ();
274       DegenerateMode = true;
275     }
276 
DynamicRotation()277     public void DynamicRotation ()
278     {
279       CurrentMode = CurrentAction3d.CurAction3d_DynamicRotation;
280     }
281 
SelectionChanged()282     public void SelectionChanged ()
283     {
284       switch (View.DisplayMode ())
285       {
286         case -1:
287           IsShadingEnabled = false;
288           IsWireframeEnabled = false;
289           break;
290         case 0:
291           IsWireframeEnabled = false;
292           IsShadingEnabled = true;
293           IsTransparencyEnabled = false;
294           break;
295         case 1:
296           IsWireframeEnabled = true;
297           IsShadingEnabled = false;
298           IsTransparencyEnabled = true;
299           break;
300         case 10:
301           IsWireframeEnabled = true;
302           IsShadingEnabled = true;
303           IsTransparencyEnabled = true;
304           break;
305         default:
306           break;
307       }
308 
309       if (View.IsObjectSelected ())
310       {
311         IsColorEnabled = true;
312         IsMaterialEnabled = true;
313         IsDeleteEnabled = true;
314       }
315       else
316       {
317         IsColorEnabled = false;
318         IsMaterialEnabled = false;
319         IsTransparencyEnabled = false;
320         IsDeleteEnabled = false;
321       }
322 
323       RaiseAvaliabiltyOfOperationsChanged ();
324     }
325 
ChangeColor(bool IsObjectColor)326     public void ChangeColor (bool IsObjectColor)
327     {
328       int r, g, b;
329       if (IsObjectColor)
330       {
331         r = View.GetObjColR ();
332         g = View.GetObjColG ();
333         b = View.GetObjColB ();
334       }
335       else
336       {
337         r = View.GetBGColR ();
338         g = View.GetBGColG ();
339         b = View.GetBGColB ();
340       }
341       System.Windows.Forms.ColorDialog ColDlg = new System.Windows.Forms.ColorDialog ();
342       ColDlg.Color = System.Drawing.Color.FromArgb (r, g, b);
343       if (ColDlg.ShowDialog () == System.Windows.Forms.DialogResult.OK)
344       {
345         System.Drawing.Color c = ColDlg.Color;
346         r = c.R;
347         g = c.G;
348         b = c.B;
349         if (IsObjectColor)
350         {
351           View.SetColor (r, g, b);
352         }
353         else
354         {
355           View.SetBackgroundColor (r, g, b);
356         }
357       }
358       View.UpdateCurrentViewer ();
359     }
360 
Wireframe()361     public void Wireframe ()
362     {
363       View.SetDisplayMode ((int)DisplayMode.Wireframe);
364       View.UpdateCurrentViewer ();
365 
366       SelectionChanged ();
367       RaiseZoomingFinished ();
368     }
369 
Shading()370     public void Shading ()
371     {
372       View.SetDisplayMode ((int)DisplayMode.Shading);
373       View.UpdateCurrentViewer ();
374 
375       SelectionChanged ();
376       RaiseZoomingFinished ();
377     }
378 
Color()379     public void Color ()
380     {
381       ChangeColor (true);
382     }
383 
Background()384     public void Background ()
385     {
386       ChangeColor (false);
387     }
388 
Material()389     public void Material ()
390     {
391       MaterialDlg aDlg = new MaterialDlg (View);
392       aDlg.ShowDialog ();
393     }
394 
Transparency()395     public void Transparency ()
396     {
397       TransparencyDialog dlg = new TransparencyDialog ();
398       dlg.View = View;
399       dlg.ShowDialog ();
400     }
401 
Delete()402     public void Delete ()
403     {
404       View.EraseObjects ();
405       SelectionChanged ();
406     }
407 
MultiDragEvent(int x, int y, int theState)408     protected void MultiDragEvent (int x, int y, int theState)
409     {
410       if (theState == -1) //mouse is down
411       {
412         myButtonDownX = x;
413         myButtonDownY = y;
414       }
415       else if (theState == 1) //mouse is up
416       {
417         View.ShiftSelect (Math.Min (myButtonDownX, x), Math.Min (myButtonDownY, y),
418                           Math.Max (myButtonDownX, x), Math.Max (myButtonDownY, y));
419       }
420     }
421 
DragEvent(int x, int y, int theState)422     protected void DragEvent (int x, int y, int theState)
423     {
424       if (theState == -1) //mouse is down
425       {
426         myButtonDownX = x;
427         myButtonDownY = y;
428       }
429       else if (theState == 1) //mouse is up
430       {
431         View.Select (Math.Min (myButtonDownX, x), Math.Min (myButtonDownY, y),
432                      Math.Max (myButtonDownX, x), Math.Max (myButtonDownY, y));
433       }
434     }
435 
OnMouseDown(System.Windows.IInputElement sender, MouseButtonEventArgs e)436     public void OnMouseDown (System.Windows.IInputElement sender, MouseButtonEventArgs e)
437     {
438       System.Windows.Controls.TabControl aTabControl = sender as System.Windows.Controls.TabControl;
439       System.Windows.Controls.Grid aGrid = aTabControl.SelectedContent as System.Windows.Controls.Grid;
440 
441       Point p = new Point((int)e.GetPosition(aGrid).X, (int)e.GetPosition(aGrid).Y);
442 
443       // to avoid the context menu opening
444       aTabControl.ContextMenu.Visibility = System.Windows.Visibility.Collapsed;
445       aTabControl.ContextMenu.IsOpen = false;
446 
447       if (e.LeftButton == MouseButtonState.Pressed)
448       {
449         myXmin = p.X;
450         myXmax = p.X;
451         myYmin = p.Y;
452         myYmax = p.Y;
453 
454         if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
455         {
456           // start the dynamic zooming....
457           CurrentMode = CurrentAction3d.CurAction3d_DynamicZooming;
458         }
459         else
460         {
461           switch (CurrentMode)
462           {
463             case CurrentAction3d.CurAction3d_Nothing:
464               if (Keyboard.IsKeyDown (Key.LeftShift) || Keyboard.IsKeyDown (Key.RightShift))
465               {
466                 MultiDragEvent (myXmax, myYmax, -1);
467               }
468               else
469               {
470                 DragEvent (myXmax, myYmax, -1);
471               }
472               break;
473             case CurrentAction3d.CurAction3d_DynamicRotation:
474               if (!DegenerateMode)
475               {
476                 View.SetDegenerateModeOn ();
477               }
478               View.StartRotation (p.X, p.Y);
479               break;
480             default:
481               break;
482           }
483         }
484       }
485       else if (e.RightButton == MouseButtonState.Pressed)
486       {
487         if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
488         {
489           if (!DegenerateMode)
490           {
491             View.SetDegenerateModeOn();
492           }
493           View.StartRotation(p.X, p.Y);
494         }
495         else
496         {
497           // show context menu only in this case
498           aTabControl.ContextMenu.Visibility = System.Windows.Visibility.Visible;
499         }
500       }
501     }
502 
OnMouseUp(System.Windows.IInputElement sender, MouseButtonEventArgs e)503     public void OnMouseUp(System.Windows.IInputElement sender, MouseButtonEventArgs e)
504     {
505       Point p = new Point((int)e.GetPosition(sender).X, (int)e.GetPosition(sender).Y);
506 
507       if (e.ChangedButton == MouseButton.Left)
508       {
509         if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
510         {
511           CurrentMode = CurrentAction3d.CurAction3d_Nothing;
512           return;
513         }
514         switch (CurrentMode)
515         {
516           case CurrentAction3d.CurAction3d_Nothing:
517             if (p.X == myXmin && p.Y == myYmin)
518             {
519               myXmax = p.X;
520               myYmax = p.Y;
521               if (Keyboard.IsKeyDown (Key.LeftShift) || Keyboard.IsKeyDown (Key.RightShift))
522               {
523                 View.ShiftSelect ();
524               }
525               else
526               {
527                 View.Select ();
528               }
529             }
530             else
531             {
532               myXmax = p.X;
533               myYmax = p.Y;
534               if (Keyboard.IsKeyDown (Key.LeftShift) || Keyboard.IsKeyDown (Key.RightShift))
535               {
536                 MultiDragEvent (myXmax, myYmax, 1);
537               }
538               else
539               {
540                 DragEvent (myXmax, myYmax, 1);
541               }
542             }
543             break;
544           case CurrentAction3d.CurAction3d_DynamicZooming:
545             CurrentMode = CurrentAction3d.CurAction3d_Nothing;
546             break;
547           case CurrentAction3d.CurAction3d_WindowZooming:
548             myXmax = p.X;
549             myYmax = p.Y;
550             int ValZWMin = 1;
551             if (Math.Abs (myXmax - myXmin) > ValZWMin &&
552                  Math.Abs (myXmax - myYmax) > ValZWMin)
553             {
554               View.WindowFitAll (myXmin, myYmin, myXmax, myYmax);
555             }
556             RaiseZoomingFinished ();
557             CurrentMode = CurrentAction3d.CurAction3d_Nothing;
558             break;
559           case CurrentAction3d.CurAction3d_DynamicPanning:
560             CurrentMode = CurrentAction3d.CurAction3d_Nothing;
561             break;
562           case CurrentAction3d.CurAction3d_GlobalPanning:
563             View.Place (p.X, p.Y, myCurZoom);
564             CurrentMode = CurrentAction3d.CurAction3d_Nothing;
565             break;
566           case CurrentAction3d.CurAction3d_DynamicRotation:
567             CurrentMode = CurrentAction3d.CurAction3d_Nothing;
568             if (!DegenerateMode)
569             {
570               View.SetDegenerateModeOff ();
571             }
572             else
573             {
574               View.SetDegenerateModeOn ();
575             }
576             break;
577           default:
578             break;
579         }
580       }
581       else if (e.ChangedButton == MouseButton.Right)
582       {
583         if (!DegenerateMode)
584         {
585           View.SetDegenerateModeOff ();
586         }
587         else
588         {
589           View.SetDegenerateModeOn ();
590         }
591       }
592 
593       SelectionChanged ();
594     }
595 
OnMouseMove(System.Windows.IInputElement sender, System.Windows.Input.MouseEventArgs e)596     public void OnMouseMove (System.Windows.IInputElement sender, System.Windows.Input.MouseEventArgs e)
597     {
598       Point p = new Point ((int)e.GetPosition (sender).X, (int)e.GetPosition (sender).Y);
599 
600       if (e.LeftButton == MouseButtonState.Pressed) //left button is pressed
601       {
602         if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
603         {
604           View.Zoom (myXmax, myYmax, p.X, p.Y);
605           myXmax = p.X;
606           myYmax = p.Y;
607         }
608         else
609         {
610           switch (CurrentMode)
611           {
612             case CurrentAction3d.CurAction3d_Nothing:
613               myXmax = p.X;
614               myYmax = p.Y;
615               break;
616             case CurrentAction3d.CurAction3d_DynamicZooming:
617               View.Zoom (myXmax, myYmax, p.X, p.Y);
618               myXmax = p.X;
619               myYmax = p.Y;
620               break;
621             case CurrentAction3d.CurAction3d_WindowZooming:
622               myXmax = p.X;
623               myYmax = p.Y;
624               break;
625             case CurrentAction3d.CurAction3d_DynamicPanning:
626               View.Pan (p.X - myXmax, myYmax - p.Y);
627               myXmax = p.X;
628               myYmax = p.Y;
629               break;
630             case CurrentAction3d.CurAction3d_GlobalPanning:
631               break;
632             case CurrentAction3d.CurAction3d_DynamicRotation:
633               View.Rotation (p.X, p.Y);
634               View.RedrawView ();
635               break;
636             default:
637               break;
638           }
639         }
640       }
641       else if (e.MiddleButton == MouseButtonState.Pressed) //middle button is pressed
642       {
643         if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
644         {
645           View.Pan (p.X - myXmax, myYmax - p.Y);
646           myXmax = p.X;
647           myYmax = p.Y;
648         }
649       }
650       else if (e.RightButton == MouseButtonState.Pressed) //right button is pressed
651       {
652         if (Keyboard.IsKeyDown (Key.LeftCtrl) || Keyboard.IsKeyDown (Key.RightCtrl))
653         {
654           View.Rotation (p.X, p.Y);
655         }
656       }
657       else // no buttons are pressed
658       {
659         myXmax = p.X;
660         myYmax = p.Y;
661         View.MoveTo (p.X, p.Y);
662       }
663     }
664   }
665 }
666