1
+ import os
1
2
import sys
3
+ sys .path .insert (0 , os .path .abspath ('./' ))
4
+ sys .path .insert (0 , os .path .abspath ('../' ))
5
+ sys .path .insert (0 , os .path .abspath ('../Image_based' ))
2
6
3
7
from PyQt5 .QtCore import pyqtSignal , QPoint , QSize , Qt
4
8
from PyQt5 .QtWidgets import (QApplication , QHBoxLayout , QOpenGLWidget , QSlider ,
5
9
QWidget )
6
-
10
+ from PyQt5 . QtGui import QPainter , QBrush , QPen , QFont , QColor
7
11
import OpenGL .GL as GL
8
12
import cv2
9
13
from ctypes import c_uint8
10
14
11
15
from bezier_cyl_3d_with_detail import BezierCyl3DWithDetail
12
16
import numpy as np
13
17
18
+ from SketchesForCurves import SketchesForCurves
19
+
14
20
15
21
class DrawSpline3D (QOpenGLWidget ):
16
22
upDownRotationChanged = pyqtSignal (int )
@@ -36,6 +42,7 @@ def __init__(self, gui, parent=None):
36
42
self .gui = gui
37
43
self .crvs = []
38
44
45
+ self .firstPos = QPoint ()
39
46
self .lastPos = QPoint ()
40
47
41
48
self .show = True
@@ -44,6 +51,8 @@ def __init__(self, gui, parent=None):
44
51
self .aspect_ratio = 1.0
45
52
self .im_size = (0 , 0 )
46
53
54
+ self .sketch_curve = SketchesForCurves ()
55
+
47
56
@staticmethod
48
57
def get_opengl_info ():
49
58
info = """
@@ -379,6 +388,35 @@ def draw_crv_2d(self):
379
388
GL .glMatrixMode (GL .GL_PROJECTION )
380
389
GL .glPopMatrix ()
381
390
391
+ def draw_sketch (self ):
392
+ """ The marks the user made"""
393
+ if not self .gui or not self .gui .crv :
394
+ return
395
+ qp = QPainter ()
396
+ qp .begin (self )
397
+ pen_backbone = QPen (Qt .yellow , 3 , Qt .SolidLine )
398
+ pen_cross = QPen (Qt .blue , 4 , Qt .SolidLine )
399
+ brush = QBrush (Qt .CrossPattern )
400
+ qp .setPen (pen_backbone )
401
+ qp .setBrush (brush )
402
+ for pt in self .sketch_curve .backbone_pts :
403
+ qp .drawLine (int (pt [0 ] - 5 ), int (pt [1 ]), int (pt [0 ] + 5 ), int (pt [1 ]))
404
+ qp .drawLine (int (pt [0 ]), int (pt [1 ] - 5 ), int (pt [0 ]), int (pt [1 ] + 5 ))
405
+
406
+ for pt1 , pt2 in zip (self .sketch_curve .backbone_pts [0 :- 1 ], self .sketch_curve .backbone_pts [1 :]):
407
+ qp .drawLine (int (pt1 [0 ]), int (pt1 [1 ]), int (pt2 [0 ]), int (pt2 [1 ]))
408
+
409
+ qp .setPen (pen_cross )
410
+ for pts in self .sketch_curve .cross_bars :
411
+ for pt in pts :
412
+ qp .drawLine (int (pt [0 ] - 3 ), int (pt [1 ]), int (pt [0 ] + 3 ), int (pt [1 ]))
413
+ qp .drawLine (int (pt [0 ]), int (pt [1 ] - 3 ), int (pt [0 ]), int (pt [1 ] + 3 ))
414
+ if len (pts ) > 1 :
415
+ pt1 = pts [0 ]
416
+ pt2 = pts [1 ]
417
+ qp .drawLine (int (pt1 [0 ]), int (pt1 [1 ]), int (pt2 [0 ]), int (pt2 [1 ]))
418
+ qp .end ()
419
+
382
420
def paintGL (self ):
383
421
GL .glClear (GL .GL_COLOR_BUFFER_BIT | GL .GL_DEPTH_BUFFER_BIT )
384
422
@@ -402,6 +440,8 @@ def paintGL(self):
402
440
if self .show and self .crv_gl_list is not None :
403
441
GL .glCallList (self .crv_gl_list )
404
442
443
+ self .draw_sketch ()
444
+
405
445
@staticmethod
406
446
def resizeGL (width , height ):
407
447
side = min (width , height )
@@ -418,6 +458,7 @@ def resizeGL(width, height):
418
458
DrawSpline3D .gl_inited = True
419
459
420
460
def mousePressEvent (self , event ):
461
+ self .firstPos = event .pos ()
421
462
self .lastPos = event .pos ()
422
463
423
464
def mouseMoveEvent (self , event ):
@@ -430,6 +471,26 @@ def mouseMoveEvent(self, event):
430
471
431
472
self .lastPos = event .pos ()
432
473
474
+ def mouseReleaseEvent (self , event ):
475
+ """Either add a point to the backbone or a point to the crossbar
476
+ Shift: Add a cross bar
477
+ Cntr: Remove a point"""
478
+ dx = event .x () - self .firstPos .x ()
479
+ dy = event .y () - self .firstPos .y ()
480
+ # Not a click
481
+ if abs (dx ) + abs (dy ) > 5 :
482
+ print (f"Big { dx } { dy } " )
483
+ return
484
+
485
+ if event .modifiers () == Qt .ShiftModifier :
486
+ self .sketch_curve .add_crossbar_point (event .x (), event .y ())
487
+ elif event .modifiers () == Qt .ControlModifier :
488
+ self .sketch_curve .remove_point (event .x (), event .y ())
489
+ else :
490
+ self .sketch_curve .add_backbone_point (event .x (), event .y ())
491
+
492
+ self .update ()
493
+
433
494
def make_crv_gl_list (self ):
434
495
if not DrawSpline3D .gl_inited :
435
496
return
0 commit comments