| 447 | |
| 448 | Nato zapišemo še funkcijo ''createNewPanel'', ki se izvede ob pritisku na gumb ''Apply'', in izdela zasukane panele. Omenjena funkcija kot vhodne argumente prejme tri spremenljivke tipa **QLineEdit**. V našem primeru je ''lin1'' objekt razreda **QLineEdit**, ki sprejme tekst, ki predstavlja ime zasukanih panelov, ''lin2'' predstavlja kot rotacije panelov, ''lin3'' pa število zasukanih panelov. Do teskta dostopamo z metodo `QLineEdit.text()`, npr. `lin1.text()` vrne spremenljivko, ki vsebuje vnešen tekst v omenjeni **QLineEdit()**. Omenjena funkcija bo zdelala zasukane panele, če bo uporabnik predhodno izdelal panel, ki ga definira gumb ''Create panel''. |
| 449 | |
| 450 | {{{ |
| 451 | #!python |
| 452 | def createNewPanel(lin1, lin2, lin3): |
| 453 | # If panel is not made, there is nothing to rotate |
| 454 | # If lin2.text() is not float, angle cannot be determined |
| 455 | # If lin3.text() is not int, number of rotated panels cannot be determined |
| 456 | if panelIsMade and float(lin2.text()) and int(lin3.text()): |
| 457 | p1 = geompy.MakeVertex(0, 0, 0) |
| 458 | p2 = geompy.MakeVertex(0, 0, 1) |
| 459 | v = geompy.MakeVector(p1, p2) |
| 460 | # This for loop iterates over number of roteted panels and |
| 461 | # adds angle to every new panel. Result is panel_FW_rotated |
| 462 | # Name of panel is given by user + angle of rotation |
| 463 | for nr in range(1,int(lin3.text())+1): |
| 464 | panel_FW_rotated = geompy.MakeRotation(panel_FW, v, math.pi/180*nr*float(str(lin2.text()))) |
| 465 | panel_name = str(lin1.text())+"_rotated_"+str(float(str(lin2.text()))*nr)+"_deg" |
| 466 | geompy.addToStudy(panel_FW_rotated,panel_name) |
| 467 | salome.sg.updateObjBrowser(True) |
| 468 | }}} |
| 469 | |
| 470 | Sedaj lahko izdelamo uporabniški vmesnik. Vsak uporabniški vmesnik je definiran kot objekt. Pri knjižnici ''PyQt5'' je to objekt, definiran kot **QtWidgets.QWidget()**. Objekt ima svoje metode, kot so npr. `setFixedSize()`, ki definira točno velikost dialoga, ter `setWindowTitle()`, ki definira naslov dialoga. |
| 471 | |
| 472 | {{{ |
| 473 | #!python |
| 474 | widgetHDF = QtWidgets.QWidget() |
| 475 | widgetHDF.setFixedSize(500, 250) |
| 476 | widgetHDF.setWindowTitle('Rotate panel') |
| 477 | }}} |
| 478 | |
| 479 | Nato definiramo uporabljene grafične elemente. Spremenljivka panelIsMade je uporabljena v funkciji ''createNewPanel''. Če je njena vrednost `False`, se funkcija ne izvede, saj to pomeni, da predhodni panel, ki ga kopiramo, ni bil izdelan. |
| 480 | |
| 481 | {{{ |
| 482 | #!python |
| 483 | lblPanel = QLabel('Create panel:') |
| 484 | btnPanel = QPushButton('Create Panel') |
| 485 | lbl1 = QLabel('Set name for rotation panels:') |
| 486 | lin1 = QLineEdit('panel4') |
| 487 | lbl2 = QLabel('Set rotation angle:') |
| 488 | lin2 = QLineEdit('0') |
| 489 | lbl3 = QLabel('Set number of rotations:') |
| 490 | lin3 = QLineEdit('1') |
| 491 | btn = QPushButton('Apply') |
| 492 | panelIsMade = False |
| 493 | }}} |
| 494 | |
| 495 | Metoda `setToolTip` prikaže namig, če kurzor premaknemo na gumb. Ko kliknemo na gumb, se mora izvesti neka funkcija. V ''PyQt5'' knjižnici ima gumb metodo `clicked.connect()`, ki kot vhodni argument sprejme ime funkcije, ki se mora izvesti. Gumb ''btnPanel'' razreda **QPushButton** pokliče funkcijo ''createPanel()'', ki ne sprejme nobenega vhodnega argumenta, saj je njena naloga samo izrisati predhodno določen in pozicioniran panel. Drugače je pri gumbu ''btn''. Ta kliče funkcijo ''createNewPanel()'', ki sprejme tri vhodne argumente, ki so ime panelov, kot in število panelov. Metoda `clicked.connect()` pa sprejme samo en argument. To rešimo s funkcijo `partial`. Prvi argument te funkcije je ''createNewPanel'', ostali argumenti pa so vhodni argumenti za našo funkcijo. Funkcija `partial()` tako vhodne argumente poda v ''createNewPanel''. in rezultat prenese v `clicked.connect()`. |
| 496 | |
| 497 | {{{ |
| 498 | #!python |
| 499 | btnPanel.setToolTip('Create panel') |
| 500 | btn.setToolTip('Create rotated panels') |
| 501 | btnPanel.clicked.connect(btnPanel.clicked.connect(createPanel)) |
| 502 | btn.clicked.connect(partial(createNewPanel,lin1,lin2,lin3)) |
| 503 | }}} |
| 504 | |
| 505 | Sedaj lahko definiramo razporeditev grafičnih elementov v našem dialogu. Možne izbire so **QGridLayout()**, kar pomeni mrežna razporeditev elementov, **QHBoxLayout()**, ki elemente razporedi horizontalno in **QVBoxLayout()**, ki elemente razporedi vertikalno. V našem primeru uporabimo **QVBoxLayout()**, ki grafične elemente glede na zaporedje dodajanja v dialog razvršča vertikalno od zgoraj navzdol (prvi element, ki je dodan v dialog, v našem primeru ''lblPanel'' tipa **QLabel**, je na vrhu, nato sledijo drugi). |
| 506 | |
| 507 | {{{ |
| 508 | #!python |
| 509 | layout = QtWidgets.QVBoxLayout() |
| 510 | layout.addWidget(lblPanel) |
| 511 | layout.addWidget(btnPanel) |
| 512 | layout.addWidget(lbl1) |
| 513 | layout.addWidget(lin1) |
| 514 | layout.addWidget(lbl2) |
| 515 | layout.addWidget(lin2) |
| 516 | layout.addWidget(lbl3) |
| 517 | layout.addWidget(lin3) |
| 518 | layout.addWidget(btn) |
| 519 | }}} |
| 520 | |
| 521 | Na koncu v objekt, ki definira dialog, namestimo porazdelitev grafičnih elementov. Z metodo `move()` lahko določimo, kje na ekranu bo pozicioniran dialog, z metodo `show()` pa dokončno prikažemo dialog na zaslonu. |
| 522 | |
| 523 | {{{ |
| 524 | #!python |
| 525 | widgetHDF.setLayout(layout) |
| 526 | widgetHDF.move(500, 500) |
| 527 | widgetHDF.show() |
| 528 | }}} |