class Ui_MainWindow(object): def setupUi(self, glFormat, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1200, 900) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) MainWindow.setMinimumSize(QtCore.QSize(0, 0)) MainWindow.setMaximumSize(QtCore.QSize(1920, 1080)) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setMinimumSize(QtCore.QSize(400, 300)) self.centralwidget.setMaximumSize(QtCore.QSize(1920, 1080)) self.centralwidget.setObjectName("centralwidget") self.gridLayout_3 = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout_3.setSizeConstraint(QtWidgets.QLayout.SetMinAndMaxSize) self.gridLayout_3.setObjectName("gridLayout_3") self.openGLWidget = GLWidget(glFormat, Robot, self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.openGLWidget.sizePolicy().hasHeightForWidth()) self.openGLWidget.setSizePolicy(sizePolicy) self.openGLWidget.setMinimumSize(QtCore.QSize(400, 300)) self.openGLWidget.setMaximumSize(QtCore.QSize(1920, 1080)) self.openGLWidget.setMouseTracking(True) self.openGLWidget.setObjectName("openGLWidget") self.gridLayout_3.addWidget(self.openGLWidget, 0, 0, 1, 1) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setSizeConstraint( QtWidgets.QLayout.SetDefaultConstraint) self.horizontalLayout.setObjectName("horizontalLayout") self.gridLayout_2 = QtWidgets.QGridLayout() self.gridLayout_2.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint) self.gridLayout_2.setObjectName("gridLayout_2") self.append_button = QtWidgets.QPushButton(self.centralwidget) self.append_button.setMaximumSize(QtCore.QSize(80, 40)) self.append_button.setFlat(False) self.append_button.setObjectName("append_button") self.gridLayout_2.addWidget(self.append_button, 0, 0, 1, 1) self.remove_button = QtWidgets.QPushButton(self.centralwidget) self.remove_button.setMaximumSize(QtCore.QSize(80, 40)) self.remove_button.setObjectName("remove_button") self.gridLayout_2.addWidget(self.remove_button, 1, 1, 1, 1) self.menu_label = QtWidgets.QLabel(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.menu_label.sizePolicy().hasHeightForWidth()) self.menu_label.setSizePolicy(sizePolicy) self.menu_label.setObjectName("menu_label") self.gridLayout_2.addWidget(self.menu_label, 2, 0, 1, 1) self.joint_menu = QtWidgets.QComboBox(self.centralwidget) self.joint_menu.setMaximumSize(QtCore.QSize(40, 40)) self.joint_menu.setEditable(False) self.joint_menu.setObjectName("joint_menu") self.joint_menu.addItem("") self.gridLayout_2.addWidget(self.joint_menu, 2, 1, 1, 1) self.insert_button = QtWidgets.QPushButton(self.centralwidget) self.insert_button.setMaximumSize(QtCore.QSize(80, 40)) self.insert_button.setObjectName("insert_button") self.gridLayout_2.addWidget(self.insert_button, 1, 0, 1, 1) self.pop_button = QtWidgets.QPushButton(self.centralwidget) self.pop_button.setMaximumSize(QtCore.QSize(80, 40)) self.pop_button.setObjectName("pop_button") self.gridLayout_2.addWidget(self.pop_button, 0, 1, 1, 1) self.horizontalLayout.addLayout(self.gridLayout_2) self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setSizeConstraint(QtWidgets.QLayout.SetNoConstraint) self.gridLayout.setObjectName("gridLayout") self.d_label = QtWidgets.QLabel(self.centralwidget) self.d_label.setMaximumSize(QtCore.QSize(40, 20)) self.d_label.setObjectName("d_label") self.gridLayout.addWidget(self.d_label, 0, 2, 1, 1) self.a_input = QtWidgets.QLineEdit(self.centralwidget) self.a_input.setMaximumSize(QtCore.QSize(40, 20)) self.a_input.setObjectName("a_input") self.gridLayout.addWidget(self.a_input, 1, 1, 1, 1) self.theta_label = QtWidgets.QLabel(self.centralwidget) self.theta_label.setMaximumSize(QtCore.QSize(40, 20)) self.theta_label.setObjectName("theta_label") self.gridLayout.addWidget(self.theta_label, 0, 3, 1, 1) self.d_input = QtWidgets.QLineEdit(self.centralwidget) self.d_input.setMaximumSize(QtCore.QSize(40, 20)) self.d_input.setObjectName("d_input") self.gridLayout.addWidget(self.d_input, 1, 2, 1, 1) self.theta_input = QtWidgets.QLineEdit(self.centralwidget) self.theta_input.setMaximumSize(QtCore.QSize(40, 20)) self.theta_input.setObjectName("theta_input") self.gridLayout.addWidget(self.theta_input, 1, 3, 1, 1) self.theta_var = QtWidgets.QCheckBox(self.centralwidget) self.theta_var.setMaximumSize(QtCore.QSize(40, 20)) self.theta_var.setObjectName("theta_var") self.gridLayout.addWidget(self.theta_var, 2, 3, 1, 1) self.a_label = QtWidgets.QLabel(self.centralwidget) self.a_label.setEnabled(True) self.a_label.setMaximumSize(QtCore.QSize(40, 20)) self.a_label.setObjectName("a_label") self.gridLayout.addWidget(self.a_label, 0, 1, 1, 1) self.d_var = QtWidgets.QCheckBox(self.centralwidget) self.d_var.setObjectName("d_var") self.gridLayout.addWidget(self.d_var, 2, 2, 1, 1) self.alpha_input = QtWidgets.QLineEdit(self.centralwidget) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.alpha_input.sizePolicy().hasHeightForWidth()) self.alpha_input.setSizePolicy(sizePolicy) self.alpha_input.setMaximumSize(QtCore.QSize(40, 20)) self.alpha_input.setObjectName("alpha_input") self.gridLayout.addWidget(self.alpha_input, 1, 0, 1, 1) self.alpha_label = QtWidgets.QLabel(self.centralwidget) self.alpha_label.setMaximumSize(QtCore.QSize(40, 20)) self.alpha_label.setObjectName("alpha_label") self.gridLayout.addWidget(self.alpha_label, 0, 0, 1, 1) self.horizontalLayout.addLayout(self.gridLayout) self.gridLayout_3.addLayout(self.horizontalLayout, 1, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.menu_label.setBuddy(self.joint_menu) self.d_label.setBuddy(self.d_input) self.theta_label.setBuddy(self.theta_input) self.a_label.setBuddy(self.a_input) self.alpha_label.setBuddy(self.alpha_input) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) MainWindow.setTabOrder(self.append_button, self.pop_button) MainWindow.setTabOrder(self.pop_button, self.insert_button) MainWindow.setTabOrder(self.insert_button, self.remove_button) MainWindow.setTabOrder(self.remove_button, self.joint_menu) MainWindow.setTabOrder(self.joint_menu, self.alpha_input) MainWindow.setTabOrder(self.alpha_input, self.a_input) MainWindow.setTabOrder(self.a_input, self.d_input) MainWindow.setTabOrder(self.d_input, self.d_var) MainWindow.setTabOrder(self.d_var, self.theta_input) MainWindow.setTabOrder(self.theta_input, self.theta_var) self.connect_all() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "DH Modeler")) self.append_button.setText(_translate("MainWindow", "Append Joint")) self.remove_button.setText(_translate("MainWindow", "Remove Joint")) self.menu_label.setText( _translate( "MainWindow", "<html><head/><body><p align=\"right\">Current Joint</p></body></html>" )) self.joint_menu.setItemText(0, _translate("MainWindow", "1")) self.insert_button.setText(_translate("MainWindow", "Insert Joint")) self.pop_button.setText(_translate("MainWindow", "Pop Joint")) self.d_label.setText( _translate( "MainWindow", "<html><head/><body><p align=\"center\">d</p></body></html>")) self.a_input.setText(_translate("MainWindow", "0.0")) self.theta_label.setText( _translate( "MainWindow", "<html><head/><body><p align=\"center\">θ</p></body></html>" )) self.d_input.setText(_translate("MainWindow", "0.0\n")) self.theta_input.setText(_translate("MainWindow", "0.0\n")) self.theta_var.setText(_translate("MainWindow", "var")) self.a_label.setText( _translate( "MainWindow", "<html><head/><body><p align=\"center\">a</p></body></html>")) self.d_var.setText(_translate("MainWindow", "var")) self.alpha_input.setText(_translate("MainWindow", "0.0")) self.alpha_label.setText( _translate( "MainWindow", "<html><head/><body><p align=\"center\">α</p></body></html>")) # Following methods are not generated by QT def connect_all(self): self.append_button.clicked.connect(self.append_joint) self.insert_button.clicked.connect(self.insert_joint) self.pop_button.clicked.connect(self.pop_joint) self.remove_button.clicked.connect(self.remove_joint) self.joint_menu.currentIndexChanged.connect(self.switch_joint) self.alpha_input.editingFinished.connect(self.change_alpha) self.a_input.editingFinished.connect(self.change_a) self.d_input.editingFinished.connect(self.change_d) self.theta_input.editingFinished.connect(self.change_theta) self.d_var.clicked.connect(self.change_d_var) self.theta_var.clicked.connect(self.change_theta_var) def append_joint(self): if Robot.append_joint(): self.joint_menu.addItem(str(Robot.len - 1)) self.joint_menu.setCurrentIndex(Robot.len - 2) def insert_joint(self): if Robot.insert_joint(self.joint_menu.currentIndex()): self.joint_menu.addItem(str(Robot.len - 1)) self.joint_menu.setCurrentIndex(self.joint_menu.currentIndex() + 1) def pop_joint(self): if Robot.pop_joint(): self.joint_menu.removeItem(self.joint_menu.count() - 1) def remove_joint(self): if Robot.remove_joint(self.joint_menu.currentIndex()): self.joint_menu.removeItem(self.joint_menu.count() - 1) self.switch_joint() def switch_joint(self): i = self.joint_menu.currentIndex() self.alpha_input.setText(str(Robot.return_joint(i).alpha)) self.a_input.setText(str(Robot.return_joint(i).a)) self.d_input.setText(str(Robot.return_joint(i).d)) self.theta_input.setText(str(Robot.return_joint(i).theta)) self.d_var.setChecked(Robot.return_joint(i).d_var) self.theta_var.setChecked(Robot.return_joint(i).theta_var) def change_alpha(self): joint_num = self.joint_menu.currentIndex() joint = Robot.return_joint(joint_num) text = self.alpha_input.text() joint.alpha = float(text if text != "" else 0) Robot.update_joint(joint_num) self.openGLWidget.update() def change_a(self): joint_num = self.joint_menu.currentIndex() joint = Robot.return_joint(joint_num) text = self.a_input.text() joint.a = float(text if text != "" else 0) Robot.update_joint(joint_num) self.openGLWidget.update() def change_d(self): joint_num = self.joint_menu.currentIndex() joint = Robot.return_joint(joint_num) text = self.d_input.text() joint.d = float(text if text != "" else 0) Robot.update_joint(joint_num) self.openGLWidget.update() def change_theta(self): joint_num = self.joint_menu.currentIndex() joint = Robot.return_joint(joint_num) text = self.theta_input.text() joint.theta = float(text if text != "" else 0) Robot.update_joint(joint_num) self.openGLWidget.update() def change_d_var(self): d_on = self.d_var.isChecked() Robot.return_joint(self.joint_menu.currentIndex()).d_var = d_on if d_on: self.theta_var.setChecked(False) self.openGLWidget.update() def change_theta_var(self): theta_on = self.theta_var.isChecked() Robot.return_joint(self.joint_menu.currentIndex()).theta_var = theta_on if theta_on: self.d_var.setChecked(False) self.openGLWidget.update()
class MainWindow(QtGui.QMainWindow): def __init__(self):#inicjalizacja klasy QtGui.QMainWindow.__init__(self) #inicjalizacji glownego ui ui = self.ui = Ui_MainWindow() self.ui.setupUi(self) self.show() self.addWidgets() #dodanie pozostalych widgetow self.connectSignals() #polaczenie sygnalow ze slotami self.flags() #stworzenie/ustawinie flag self.variables() #inicjalizacja zmiennych self.setToolTipsForAll() #ustawia wskazowki do wsyzstkich narzezi self.setWindowTitle("PyCAD") def addWidgets(self):#dodanie widgetow do glownego okna #opengl self.qgl = GLWidget(self) self.ui.horizontalLayout.addWidget(self.qgl) #dodanie widgeta zajmujacego sie obsluga opengl do glownego okna #lista obiektow self.widgetlist = WidgetList() self.ui.horizontalLayout.addWidget(self.widgetlist) self.widgetlist.hide() #przyciski do recznego wprowadzania danych self.widgetxy = WidgetXY() self.ui.verticalLayoutDown.addWidget(self.widgetxy) #self.widgetxy.hide() def flags(self): #flagi self.setMouseTracking(False) #wylaczenie sledzenia myszki w glownym oknie self.f_saved = True #czy plik zostal zapisany self.setAcceptDrops(True) def variables(self): #wykorzystywane zmienne self.markedobjects = [] #zaznaczone obiekty self.nrofconstobjt = 2 self.fname = "" #nazwa pliku self.zoom = 0.5 #o ile bedzie zmienial sie widok self.dxdy = 0.5 #o ile przesuwam scene przy uzyciu strzalek def connectSignals(self):#polaczenie sygnalow i slotow #sygnaly wyemitowane przez qgl przypisanego do jednego slota (nie ma potrzeby rozroznienia tych zdarzen w tym miejscu) self.qgl.s_mousepos.connect(self.qglMouse) #zmiana pozycji self.qgl.s_mousepress.connect(self.qglMouse) #klikniecie self.qgl.s_newobj.connect(self.addedObjWidgetList)#dodano nowy obiekt do listy self.qgl.s_filechanged.connect(self.FileNotSaved) self.qgl.s_zoomend.connect(self.zoomSignal) self.qgl.s_knowpoint.connect(self.knowpoint) #lista self.widgetlist.ui.pushButtonDown.clicked.connect(self.pushButtonDown) self.widgetlist.ui.pushButtonUp.clicked.connect(self.pushButtonUp) self.widgetlist.ui.pushButtonUsun.clicked.connect(self.pushButtonRemove) self.widgetlist.ui.listWidget.itemClicked.connect(self.clickWidgetList) self.widgetlist.ui.listWidget.itemSelectionChanged.connect(self.clickWidgetList) #Przyciski - niestety klasa QSignalMapper nie dziala wec zostaje to self.ui.pushButtonNarz0.clicked.connect(self.pushButtonNarz0) self.ui.pushButtonNarz1.clicked.connect(self.pushButtonNarz1) self.ui.pushButtonNarz2.clicked.connect(self.pushButtonNarz2) self.ui.pushButtonNarz3.clicked.connect(self.pushButtonNarz3) self.ui.pushButtonNarz4.clicked.connect(self.pushButtonNarz4) self.ui.pushButtonNarz5.clicked.connect(self.pushButtonNarz5) self.ui.pushButtonNarz6.clicked.connect(self.pushButtonNarz6) self.ui.pushButtonNarz7.clicked.connect(self.pushButtonNarz7) self.ui.pushButtonNarz8.clicked.connect(self.pushButtonNarz8) #menubar - plik self.ui.actionNowy.triggered.connect(self.newAction) #wcisniecie przycisku nowy self.ui.actionZakoncz.triggered.connect(self.closeEvent) #uwaga dwa razy wola zamkniecie self.ui.actionZapisz.triggered.connect(self.saveFile) #zapisanie self.ui.actionZapisz_jako.triggered.connect(self.saveFileAs) #zapisz jako self.ui.actionOtworz.triggered.connect(self.loadAction) #otwarcie pliku self.ui.actionZakoncz.triggered.connect(self.closeEvent) #wcisniecie przycisku nowy #menubar - edycja self.ui.actionCofnij.triggered.connect(self.menubarBack) self.qgl.s_previous.connect(self.signalMenubarBack) self.ui.actionPonow.triggered.connect(self.menubarForward) self.qgl.s_next.connect(self.signalMenubarNext) #menubar - widok self.ui.actionPowieksz.triggered.connect(self.ZoomInView) self.ui.actionPomniejsz.triggered.connect(self.ZoomOutView) self.ui.actionStandardowy.triggered.connect(self.defaultView) def setToolTipsForAll(self): #ustawia wskazowki do wszystkich narzedzi #--- Ui_MainWindow (glowne ui) ---# self.defaultToolTipStyleForButton(self.ui.pushButtonNarz0,"Zaznaczenie jednego obiektu") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz1,"Linia") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz2,"Linie laczace sie") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz3,"Tworzenie luku") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz4,"Lista obiektow") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz5,"Linia + kat - do wycofania") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz6,"Zaznaczenie wielu obiektow") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz7,"Strzalki (nie zaimplementowane)") self.defaultToolTipStyleForButton(self.ui.pushButtonNarz8,"Przesuwanie punktu") #------------ WIDGETLIST ------------# def markObjectsWidgetList(self): #zanaczenie listy obiektow for nr in self.markedobjects: self.qgl.setMarkedObj(nr) def unmarObjectsWidgetList(self):#odznaczenie listy obiektow for nr in self.markedobjects: self.qgl.setUnmarkedObj(nr) self.markedobjects = [] def addedObjWidgetList(self): #osbluga sygnalu o dodaniu nowego obiektu do sceny self.widgetlist.ui.listWidget.addItem(self.qgl.obj[-1].WhatAmILongTxt()) def clickWidgetList(self):#obsluga klikniecia na listWidget #odznaecznie obiekotw self.unmarObjectsWidgetList() #odczytanie ktory obiekt ma byc zaznaczony nr = self.widgetlist.ui.listWidget.currentIndex().row() nr = nr + self.nrofconstobjt self.markedobjects.append(nr) #zaznaczenie obiektow self.markObjectsWidgetList() def createWidgetList(self):#stworzenie calej listy od zera lengthobj = len(self.qgl.obj) if(lengthobj > self.nrofconstobjt): #cos wiecej niz osie X,Y self.widgetlist.ui.listWidget.clear() for i in range(self.nrofconstobjt,lengthobj): self.widgetlist.ui.listWidget.addItem(self.qgl.obj[i].WhatAmILongTxt()) #objekty sie przedstawia w odpowiednim formacie wystarczy je dodac do listy def pushButtonUp(self): #zmiana kolejnosci obiektow if(len(self.widgetlist.ui.listWidget.selectedItems()) != 0): #numer wybranej linii liczony od 0 nr = self.widgetlist.ui.listWidget.currentIndex().row() if(nr != 0): #zamiana w liscie item = self.widgetlist.ui.listWidget.item(nr-1).text() self.widgetlist.ui.listWidget.item(nr-1).setText(self.widgetlist.ui.listWidget.item(nr).text()) self.widgetlist.ui.listWidget.item(nr).setText(item) self.widgetlist.ui.listWidget.setCurrentItem(self.widgetlist.ui.listWidget.item(nr-1)) #zmiany na obiektach self.unmarObjectsWidgetList() nr = nr + self.nrofconstobjt self.qgl.swapObj(nr,nr-1) self.markedobjects.append(nr-1) self.markObjectsWidgetList() def pushButtonDown(self): #zmiana kolejnosci obiektow if(len(self.widgetlist.ui.listWidget.selectedItems()) != 0): nr = self.widgetlist.ui.listWidget.currentIndex().row() #numer wybranej linii liczony od 0 if(nr != (len(self.widgetlist.ui.listWidget)-1)): #zamiana w liscie item = self.widgetlist.ui.listWidget.item(nr+1).text() self.widgetlist.ui.listWidget.item(nr+1).setText(self.widgetlist.ui.listWidget.item(nr).text()) self.widgetlist.ui.listWidget.item(nr).setText(item) #zmiany na obiektach self.unmarObjectsWidgetList() nr = nr + self.nrofconstobjt self.qgl.swapObj(nr,nr+1) self.widgetlist.ui.listWidget.setCurrentItem(self.widgetlist.ui.listWidget.item(nr+1-self.nrofconstobjt)) def pushButtonRemove(self): #usuwa obiekty ze sceny if(len(self.widgetlist.ui.listWidget.selectedItems()) != 0): #odczytanie indeksu zaznaczonego obiektu na liscie nr = self.widgetlist.ui.listWidget.currentIndex().row() #numer wybranej linii liczony od 0 #usuniecie numeru z listy item = self.widgetlist.ui.listWidget.takeItem(nr) del item #usuniecie obiektu ze sceny self.qgl.removeObj(nr+self.nrofconstobjt) #usuniecie obiektu ze sceny #zaznaczenie kolejnego obiektu na liscie self.clickWidgetList() #odswezenie lsity self.createWidgetList() #------------ PRZYCISKI (TOOLS) ------------# #tool5 - linia + kat (moze bedzie do wycofania) #tool7 - strzalki informujace o poczatku i koncu wszystkich obiektow #tool8 - przesuwanie pkt def defaultToolTipStyleForButton(self,obj,txt): #domyslny styl wskazowek dla przyciskow html = "<font color ='purple'><b><i>" #styl htmlowy wskaozwki - otwarcie html = html + txt #wlozenie stylu txt do html html = html + "</i></b></font>" #styl htmlowy wskaozwki - zamkniecie obj.setToolTip(html) #ustawienie wskazowki wraz ze stworzonym stylem def pushButtonNarz0(self): #klikniecie na obiekt self.qgl.setTool(0) def pushButtonNarz1(self): #linia self.qgl.setTool(1) def pushButtonNarz2(self): #linia-linia self.qgl.setTool(2) def pushButtonNarz3(self): self.qgl.setTool(3) def pushButtonNarz4(self): #lista if(self.widgetlist.isVisible() == True): self.widgetlist.hide() else: self.widgetlist.show() self.qgl.setTool(4) def pushButtonNarz5(self): self.qgl.setTool(5) def pushButtonNarz6(self): #zaznaczanie wielu obiektow na scenie self.qgl.setTool(6) def pushButtonNarz7(self): self.qgl.setTool(7) def pushButtonNarz8(self): self.qgl.setTool(8) #------------ GUI XY ------------# def knowpoint(self,nr): #ustawienie na GUI if(nr == 1): self.widgetxy.setxpyp(self.qgl.obj[-1].xp,self.qgl.obj[-1].yp) elif(nr == 2): self.widgetxy.setxkyk(self.qgl.obj[-1].xk,self.qgl.obj[-1].yk) #------------ MYSZKA ------------# def qglMouse(self): #wczytanie pozycji myszki na scenie i umieszczenie jej w status barze mousepos = self.qgl.mousepos mousepos = "%.4f : %.4f" % (mousepos[0], mousepos[1]) #ustawienie odpowiedniego formatu self.ui.statusbar.showMessage(mousepos,0) #wyswietlenie infromacji w statusbar #------------ KLAWIATURA ------------# def keyPressEvent(self, event): #wcisniecie przycisku key = event.key() #-- usuwanie --# if(key == QtCore.Qt.Key_Delete): if(self.qgl.tool==0): #zaznaczony obiekt self.qgl.removeObjs(self.qgl.listclicked) self.qgl.listclicked = [] self.createWidgetList() elif(self.qgl.tool==4): #sortowanie self.pushButtonRemove() #-- anulowanie akacji --# elif(key == QtCore.Qt.Key_Escape): self.qgl.cancelDraw() #przesuwanie sceny elif(key == QtCore.Qt.Key_Left): self.qgl.changedxView(-self.dxdy) elif(key == QtCore.Qt.Key_Right): self.qgl.changedxView(self.dxdy) elif(key == QtCore.Qt.Key_Up): self.qgl.changedyView(self.dxdy) elif(key == QtCore.Qt.Key_Down): self.qgl.changedyView(-self.dxdy) elif(key == QtCore.Qt.Key_Shift): self.qgl.f_straight = True self.qgl.update() def keyReleaseEvent(self, event): #puszczenie przycisku key = event.key() if(key == QtCore.Qt.Key_Shift): self.qgl.f_straight = False self.qgl.update() #------------ MENUBAR - WIDOK ------------# def defaultView(self): #ustawia standarowy widok self.ui.actionPomniejsz.setEnabled(True) self.ui.actionPowieksz.setEnabled(True) self.qgl.defaultZoomView() def zoomSignal(self,signal): #dba o to czy uzytkownik moze kliknac powieksz lub pomniejsz if(signal == 0): self.ui.actionPowieksz.setEnabled(False) elif(signal == 1): self.ui.actionPomniejsz.setEnabled(False) else: self.ui.actionPomniejsz.setEnabled(True) self.ui.actionPowieksz.setEnabled(True) def ZoomInView(self): #zmienia wielkosc sceny self.qgl.changeZoomView(-self.zoom) def ZoomOutView(self): #zmienia wielkosc sceny self.qgl.changeZoomView(self.zoom) #------------ MENUBAR - EDYCJA ------------# def menubarBack(self): #cofnij ctrl+z self.qgl.previousStepJourney() def signalMenubarBack(self,i): #zablokowuje/odblokowuje przycisk cofnij self.ui.actionCofnij.setEnabled(i) def signalMenubarNext(self,i): #zablokowuje/odblokowuje przycisk naprzod self.ui.actionPonow.setEnabled(i) def menubarForward(self): #naprzod ctrl+z+shift self.qgl.nextStepJourney() #------------ MENUBAR - PLIK ------------# #--- Czy plik zapisany --- def FileNotSaved(self): #zmienia tytul okna gdy wystepuje taka potrzeba if(self.f_saved == True): #ustawienie tytulu okna na niezapisana txt = str(self.windowTitle()) txt = "*"+txt self.setWindowTitle(txt) self.f_saved = False self.ui.actionZapisz.setEnabled(True) #--- Nowy plik --- def newAction(self): #nowa scena if(self.f_saved == False): self.doYouWantToSaveFile("Czy przed stworzeniem nowego pliku chcesz zapsiac?") self.qgl.clearMysefl() self.fname = "" self.f_saved = True self.setWindowTitle("PyCAD") self.widgetlist.ui.listWidget.clear() self.qgl.update() #---Zakmniecie programu --- def closeEvent(self,event): #zamkniecie aplikacji - rowniez przez krzyzyk if(self.f_saved == False): self.doYouWantToSaveFile("Czy przed wyjsciem, chcesz zapisac zmiany?") self.f_saved = True self.close() #--- Zapisanie pliku --- def localAskDialog(self,txt): #Message box ktory pyta czy chcesz zapisac plik mbox = QtGui.QMessageBox() mbox.setWindowTitle("Zapis?") mbox.setText(txt) mbox.setIcon(QtGui.QMessageBox.Warning) mbox.setStandardButtons(QtGui.QMessageBox.Yes) mbox.addButton(QtGui.QMessageBox.No) mbox.setDefaultButton(QtGui.QMessageBox.No) #zmiana wyswietlanych napisow na przyciskach buttons = mbox.buttons() buttons[0].setText("Tak") buttons[1].setText("Nie") if(mbox.exec_() == QtGui.QMessageBox.Yes): return True else: return False def localSaveDialog(self): #dialog wywolywany do wczytania sciezki do pliku przy zapisie fdialog = QtGui.QFileDialog(self) #ustawienie trybu fdialog.setFileMode(QtGui.QFileDialog.AnyFile) #fdialog.setNameFilters(["data exchange format (*.dxf)", "downolny plik (*.*)"]) #jak dodac inne fdialog.setNameFilters(["data exchange format (*.dxf)"]) #filtry do wyboru fdialog.selectNameFilter("data exchange format (*.dxf)") #domyslny filtr #ustawienie tekstu na polski fdialog.setLabelText(QtGui.QFileDialog.LookIn,"aktualny folder") fdialog.setLabelText(QtGui.QFileDialog.FileName,"nazwa pliku") fdialog.setLabelText(QtGui.QFileDialog.FileType,"rozszerzenie") fdialog.setLabelText(QtGui.QFileDialog.Accept,"Zapisz") fdialog.setLabelText(QtGui.QFileDialog.Reject,"Anuluj") #tytul oknas fdialog.setWindowTitle("Zapisywanie pliku") if(fdialog.exec_()): fname = fdialog.selectedFiles()[0] if(fdialog.result() == 1): fname = str(fname) #konwertuje na stirng pythona, bo tak wynikiem jest QString tmp = fname.split(".") if(tmp[-1] != "dxf"): fname = fname + ".dxf" return fname else: return "" def saveFile(self): #zapisuje plik self.qgl.cancelDraw() if(self.fname == ""): #odczytanie sciezki do pliku fname = self.localSaveDialog() if(fname != ""): self.fname = fname if(self.fname != ""): if(self.qgl.DXFSave(self.fname) == True): self.setWindowTitle(self.fname) self.f_saved = True self.ui.actionZapisz.setEnabled(False) def saveFileAs(self): #zapisz jako (korzysta z metody saveFile) self.qgl.cancelDraw() fname = self.localSaveDialog() if(fname != ""): self.fname = fname self.saveFile() def doYouWantToSaveFile(self,txt): if(self.f_saved == False): #zmiany nie zapisane if(self.localAskDialog(txt) == True): if(len(self.qgl.obj) != self.qgl.howmanyignore ): #czy plik zostal wlasnie utworzony? self.saveFile() #--- Wczytanie pliku --- def localLoadDialog(self): #dialog wywolywany do wczytania sciezki do pliku przy otwieraniu pliku fdialog = QtGui.QFileDialog(self) #ustawienie trybu fdialog.setFileMode(QtGui.QFileDialog.AnyFile) #fdialog.setNameFilters(["data exchange format (*.dxf)", "downolny plik (*.*)"]) #jak dodac inne fdialog.setNameFilters(["data exchange format (*.dxf)"]) #filtry do wyboru fdialog.selectNameFilter("data exchange format (*.dxf)") #domyslny filtr #ustawienie tekstu na polski fdialog.setLabelText(QtGui.QFileDialog.LookIn,"aktualny folder") fdialog.setLabelText(QtGui.QFileDialog.FileName,"nazwa pliku") fdialog.setLabelText(QtGui.QFileDialog.FileType,"rozszerzenie") fdialog.setLabelText(QtGui.QFileDialog.Accept,"Wczytaj") fdialog.setLabelText(QtGui.QFileDialog.Reject,"Anuluj") #tytul okna fdialog.setWindowTitle("Wczytywanie pliku") if(fdialog.exec_()): fname = fdialog.selectedFiles()[0] if(fdialog.result() == 1): fname = str(fname) #konwertuje na stirng pythona, bo tak wynikiem jest QString tmp = fname.split(".") if(tmp[-1] != "dxf"): #sprawdza czy znany jest format return "" else: return fname else: return "" def loadDXF(self,fname): #wczytanie pliku self.qgl.clearMysefl() result = self.qgl.DXFLoad(fname) if(result == True): self.fname = fname self.setWindowTitle(fname) self.f_saved = True QtGui.QMessageBox.information(self, 'Wczytywanie', "Plik zostal wczytany pomyslnie",QtGui.QMessageBox.Ok) self.createWidgetList() elif(result == False): self.newAction() QtGui.QMessageBox.information(self, 'Wczytywanie', "Wczytywanie pliku nie powiodlo sie",QtGui.QMessageBox.Ok) def loadAction(self): #wczytywanie self.doYouWantToSaveFile("Czy chcesz zapisac zmiany przed otwraciem pliku") fname = self.localLoadDialog() if(fname != ""): self.loadDXF(fname) #------------ DRAG & DROP (do wczytania) ------------# def loadDrop(self,fname): #wczytanie pliku przy uzyciu drag and drop self.doYouWantToSaveFile("Czy chcesz zapisac zmiany przed otwraciem pliku") self.loadDXF(fname) def dragEnterEvent(self, event): #przesuniecie obiektu na obszar main window if event.mimeData().hasUrls(): event.acceptProposedAction() else: event.ignore() def dropEvent(self, event): #po upuszczeniu obiektu zrob cos z nim if ( len(event.mimeData().urls()) == 1): #sprawdza czy tylko jeden plik zostal upuszczony url = event.mimeData().urls()[0] #konwenture liste QUrl na QUrl url = str(url.path()) #konwertuje Qurl na sciezke a potem na pythonoweg stringa tmp = url.split(".") if(tmp[-1] == "dxf"): #sprawdza czy foramt to "dxf" self.loadDrop(url) else: event.ignore() else: event.ignore() #ignoruje drop jesli wystapi wiecej niz jeden plik