Difference between revisions of "User:Vladbogolin/qt-display-manager"

From BRL-CAD
(Created page with "=Project Summary= The purpose of this project was to create a new cross-platform 3D display manager using Qt framework that supports all the features of existing display manag...")
 
Line 2: Line 2:
 
The purpose of this project was to create a new cross-platform 3D display manager using Qt framework that supports all the features of existing display manager's.
 
The purpose of this project was to create a new cross-platform 3D display manager using Qt framework that supports all the features of existing display manager's.
  
As BRL-CAD uses Tcl/Tk, the new display manager had to be integrated in Tk windows so this is one of the first features implemented. Then, basic drawing had to be done, more exactly line, points and text drawing.
+
As BRL-CAD uses Tcl/Tk, the new display manager had to be integrated in Tk windows so this was one of the first features implemented. Then, basic drawing had to be done, more exactly line, points and text drawing. To obtain this a QPainter that draws on a QPixmap was used.  
  
 
[[File:Tkqt1.png|200px]][[File:Sph.png|200px]][[File:Tor.png|200px]]
 
[[File:Tkqt1.png|200px]][[File:Sph.png|200px]][[File:Tor.png|200px]]
  
To obtain this a QPainter that draws on a QPixmap was used. At this point the display manager could draw almost anything but there was no event processing involved so user input was ignored. The problem that occurs when talking about event processing is the communication between Qt and Tk, so every time a Qt event occurs the corresponding Tk one needs to be generated to obtain the desired behavior. This was simply done by using the Tcl "event generate" command and by processing Qt events.
+
At this point the display manager could draw almost anything but there was no event processing involved so user input was ignored. The problem that occurs when talking about event processing is the communication between Qt and Tk, so every time a Qt event occurs the corresponding Tk one needs to be generated to obtain the desired behavior. This was simply done by using the Tcl "event generate" command and by processing Qt events.
  
 
The events can be grouped in three categories:
 
The events can be grouped in three categories:
Line 21: Line 21:
 
[[File:Rotate1.png|200px]][[File:Rotate2.png|200px]]
 
[[File:Rotate1.png|200px]][[File:Rotate2.png|200px]]
  
As it comes to key bindings, I've tried to do everything in such a way that new key bindings can be easily added. What adding a new key biding means is adding a function that receives as input a Qt event and returns the corresponding Tk one:
+
As it comes to key bindings, I've tried to do everything in such a way that new key bindings can be easily added. In order to add a new key biding adding a function that receives as input a Qt event and returns the corresponding Tk one is necessary. Below you can find an example:
  
 
     char* qt_mouseButton1Press(QEvent *event) {
 
     char* qt_mouseButton1Press(QEvent *event) {
Line 35: Line 35:
 
     }
 
     }
  
As seen from the images I focused on integrating the display manager in classic mged first so after everything was working accordingly I moved towards integrating the new display manager
+
As seen from the images I focused on integrating the display manager in classic mged first. After everything was working accordingly I moved towards integrating the new display manager
 
*in mged:
 
*in mged:
 
[[File:mged.png|200px]]
 
[[File:mged.png|200px]]

Revision as of 14:08, 14 October 2013

Project Summary

The purpose of this project was to create a new cross-platform 3D display manager using Qt framework that supports all the features of existing display manager's.

As BRL-CAD uses Tcl/Tk, the new display manager had to be integrated in Tk windows so this was one of the first features implemented. Then, basic drawing had to be done, more exactly line, points and text drawing. To obtain this a QPainter that draws on a QPixmap was used.

Tkqt1.pngSph.pngTor.png

At this point the display manager could draw almost anything but there was no event processing involved so user input was ignored. The problem that occurs when talking about event processing is the communication between Qt and Tk, so every time a Qt event occurs the corresponding Tk one needs to be generated to obtain the desired behavior. This was simply done by using the Tcl "event generate" command and by processing Qt events.

The events can be grouped in three categories:

  • mouse events:

Tor1.pngTor2.png

  • keyboard events:

Keyboard.pngKeyboard2.pngMged-c.png

  • mouse + keyboard events:

Rotate1.pngRotate2.png

As it comes to key bindings, I've tried to do everything in such a way that new key bindings can be easily added. In order to add a new key biding adding a function that receives as input a Qt event and returns the corresponding Tk one is necessary. Below you can find an example:

   char* qt_mouseButton1Press(QEvent *event) {
       if (event->type() ==  QEvent::MouseButtonPress) {
           QMouseEvent *mouseEv = (QMouseEvent *)event;
           if (mouseEv->button() == Qt::LeftButton) {
               struct bu_vls str = BU_VLS_INIT_ZERO;
               bu_vls_printf(&str, "<1> -x %d -y %d", mouseEv->x(), mouseEv->y());
               return bu_vls_addr(&str);
           }
       }
       return NULL;
   }

As seen from the images I focused on integrating the display manager in classic mged first. After everything was working accordingly I moved towards integrating the new display manager

  • in mged:

Mged.png

  • and archer:

Archer.png

which is one of the final features implemented.