# -*- coding: utf-8 -*- #Uvažanje vseh potrebnih knjižnic from OCC.Display.SimpleGui import * from OCC.gp import * from OCC.BRepBuilderAPI import * from OCC.BRepPrimAPI import * from OCC.BRepFilletAPI import * from OCC.BRep import * from OCC.TopExp import * from OCC.TopTools import * from OCC.TopoDS import * from OCC.TColgp import * from OCC.TopAbs import * display, start_display, add_menu, add_function_to_menu = init_display() #DEFINIRANJE FUNKCIJE, S KATERO BOMO USTVARILI MODEL "cube" def kocka(a = 100): global cube global b b = a cube = BRepPrimAPI_MakeBox(a,a,a).Shape() #FUNKCIJA ZA PRIKAZ OSNOVNEGA MODELA "cube" def zaokrozeno_nic(Event=None): display.EraseAll() display.DisplayShape(cube, update=True) #FUNKCIJA ZA ZAOKROŽEVANJE ENEGA ROBA def zaokrozeno_en_rob_box(Event=None): afillet = BRepFilletAPI_MakeFillet(cube) #Definiramo, na katerem modelu se bo izvajalo zaokroževanje anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE) #Iskalnik robov (EDGE) po modelu "cube" anEdge = topods.Edge(anEdgeExplorer.Current()) #V spremenljivko "anEdge" shranimo v iskalniku trenutno izbran rob #anEdgeExplorer.Next() #Tako lahko v iskalnuku robov iščemo naslednji rob afillet.Add(R, anEdge) #Izbran rob določimo za zaokrožitev afillet.Build() #Izvedemo zaokroževanje na vseh izbranih robovih cube1 = afillet.Shape() #Modelu z zaokrožitvami določimo novo ime, "cube1" display.EraseAll() #Vse že prej prikazane modele izbrišemo display.DisplayShape(cube1, update=True) #Prikažemo model "cube1" #FUNKCIJA ZA ZAOKROŽEVANJE IZBRANIH ROBOV S POMOČJO SEZNAMA def zaokrozeno_izbrani_robovi(Event=None): #V tem primeru bomo ponovili izdelavo modela oz točk->robovi->mreža->površina->izvlek #(Velikost je enaka kot že prej definiranega modela-kocke "cube") #Izdelava točk v prostoru T1 = gp_Pnt(0 , 0 , 0) T2 = gp_Pnt(b , 0, 0) T3 = gp_Pnt(b , b , 0) T4 = gp_Pnt(0, b , 0) #Izdelava robov na podlagi definiranih tock E1 = BRepBuilderAPI_MakeEdge(T1, T2) E2 = BRepBuilderAPI_MakeEdge(T2, T3) E3 = BRepBuilderAPI_MakeEdge(T3, T4) E4 = BRepBuilderAPI_MakeEdge(T4, T1) #Izdelava mreznega modela Mreza = BRepBuilderAPI_MakeWire(E1.Edge() , E2.Edge() ,E3.Edge(), E4.Edge()) #Izdelava povrsine Povrsina = BRepBuilderAPI_MakeFace(Mreza.Wire()) #Izdelava vektorja za izvlek v prostor Vektor1 = gp_Vec(0 , 0, b) #Izdelava priznaticnega telesa- izvlek povrsine v smeri vektorja izvlek = BRepPrimAPI_MakePrism(Povrsina.Face() , Vektor1).Shape() afillet = BRepFilletAPI_MakeFillet(izvlek) #Naredimo array, kateri bo vseboval reference do vseh robov (EDGE) anEdgeExplorer = TopExp_Explorer(izvlek, TopAbs_EDGE) results = [] #Definiramo prazen seznam while anEdgeExplorer.More(): #Ta zanka se bo izvajala, dokler bo zaznala, da je v "anEdgeExplorerju" izbran rob anEdge = topods().Edge(anEdgeExplorer.Current()) #V spremenljivko "anEdge" shranimo referenco za rob results.append(anEdge) #V seznam dodamo trenuteno najden rob anEdgeExplorer.Next() #Iskalnik robov najde naslednji rob. POZOR! Če tega ukaza ne izvedemo, se bo while zanka izvajala v neskončnost! anEdgeExplorer.ReInit() #Za izogibanje izgubi referenc na objekte oz. robove, najdenih v zanki #Zaokroževanje izbranih robov iz seznama afillet.Add(R, results[0]) afillet.Add(R, results[2]) afillet.Add(R, results[4]) afillet.Add(R, results[8]) afillet.Build() cube2 = afillet.Shape() display.EraseAll() display.DisplayShape(cube2, update=True) #FUNKCIJA ZA ZAOKROŽEVANJE VSEH ROBOV def zaokrozeno_vse(Event=None): #Iskalnik robov afillet = BRepFilletAPI_MakeFillet(cube) anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE) #Zanka, s katero iščemo in hkrati dodamo zaokrožitev vsakem najdenem robu #(V prejšnem primeru pa smo na podoben način shranejvali reference robov v seznam) while anEdgeExplorer.More(): anEdge = topods.Edge(anEdgeExplorer.Current()) afillet.Add(R, anEdge) anEdgeExplorer.Next() afillet.Build() cube3 = afillet.Shape() display.EraseAll() display.DisplayShape(cube3, update=True) #FUNKCIJA ZA ZAOKROŽEVANJE ROBOV LE V Z SMERI def zaokrozeno_smer_Z(Event=None): topExp = TopExp_Explorer() topExp.Init(cube, TopAbs_VERTEX) #Najdemo dva vozlišča, s katerima si bomo pozneje pomagali pravilno izpeljati željeno zaokrožitev vertA = topods_Vertex(topExp.Current()) topExp.Next() vertB = topods_Vertex(topExp.Current()) afillet = BRepFilletAPI_MakeFillet(cube) anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE) #Vpeljemo preprosti test, ki nam pove, če točki robova ležita na isti ravnini (X,Y). while anEdgeExplorer.More(): edge = topods.Edge(anEdgeExplorer.Current()) first, last = topexp_FirstVertex(edge), topexp_LastVertex(edge) vertex, first_vert, last_vert = BRep_Tool().Pnt(vertA), BRep_Tool().Pnt(first), BRep_Tool().Pnt(last) if first_vert.Z() != last_vert.Z(): afillet.Add(R, edge) anEdgeExplorer.Next() afillet.Build() cube4 = afillet.Shape() display.EraseAll() display.DisplayShape(cube4, update=True) #ZAOKROŽITEV Z VARIABILNIM RADIJEM ZAOKROŽITVE def zaokrozeno_variabilni(Event=None): afillet = BRepFilletAPI_MakeFillet(cube) #afillet = zaokrozitev #Dolocitev parametrov variabilne zaokrozitve TabPoint = TColgp_Array1OfPnt2d(1,6) #2d... 2D tocka. stranico se razdeli na 6 tock (1,6) P1 = gp_Pnt2d(0.,R/3) P2 = gp_Pnt2d(0.2,R/2) P3 = gp_Pnt2d(0.4,R) # (mesto/tocka zaokrozitve gledano od spodaj navzgor, radij zaokrozitve) P4 = gp_Pnt2d(0.6,R/4) P5 = gp_Pnt2d(0.8,R/5) P6 = gp_Pnt2d(1.,R/2) TabPoint.SetValue(1,P1) TabPoint.SetValue(2,P2) TabPoint.SetValue(3,P3) TabPoint.SetValue(4,P4) TabPoint.SetValue(5,P5) TabPoint.SetValue(6,P6) #izbira robova na katerem se izvede zaokrozitev exp = TopExp_Explorer(cube, TopAbs_EDGE) exp.Next() #Iskanje naprej po iskalniku robov exp.Next() exp.Next() exp.Next() #apliciranje zaokrozitve na modelu afillet.Add(TabPoint, topods_Edge(exp.Current())) afillet.Build() if afillet.IsDone(): cube5 = afillet.Shape() display.EraseAll() display.DisplayShape(cube5, update=True) #ZAOKROŽITEV OKOLI TOČKE def zaokrozeno_tocka(Event=None): topExp = TopExp_Explorer() topExp.Init(cube, TopAbs_VERTEX) # get two vertices vertA = topods_Vertex(topExp.Current()) topExp.Next() vertB = topods_Vertex(topExp.Current()) #Apliciranje zaokrožitve na obeh koncih roba oz. na vozliščih roba afillet = BRepFilletAPI_MakeFillet(cube) #Iskanje robov _map = TopTools_IndexedDataMapOfShapeListOfShape() topexp_MapShapesAndAncestors(cube, TopAbs_VERTEX, TopAbs_EDGE, _map) results = _map.FindFromKey(vertA) topology_iterator = TopTools_ListIteratorOfListOfShape(results) while topology_iterator.More(): edge = topods_Edge(topology_iterator.Value()) topology_iterator.Next() first, last = topexp_FirstVertex(edge), topexp_LastVertex(edge) vertex, first_vert, last_vert = BRep_Tool().Pnt(vertA), BRep_Tool().Pnt(first), BRep_Tool().Pnt(last) if edge.Orientation(): if not vertex.IsEqual(first_vert, 0.001): afillet.Add(R/5, R, edge) #navpicno else: afillet.Add(R, 0, edge) #vodoravno afillet.Build() cube6 = afillet.Shape() display.EraseAll() display.DisplayShape(cube6, update=True) #FUNKCIJA ZA IZVEDBO POSNETJA def posnetje_f(event=None): posnetje = BRepFilletAPI_MakeChamfer(cube) topExp = TopExp_Explorer() anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE) aFaceExplorer = TopExp_Explorer(cube, TopAbs_FACE) #Definiranje seznama, tokrat z referencami na površine face_results = [] while aFaceExplorer.More(): aFace = topods().Face(aFaceExplorer.Current()) face_results.append(aFace) aFaceExplorer.Next() aFaceExplorer.ReInit() #Apliziranje posnetij while anEdgeExplorer.More(): edge = topods.Edge(anEdgeExplorer.Current()) first, last = topexp_FirstVertex(edge), topexp_LastVertex(edge) first_vert, last_vert = BRep_Tool().Pnt(first), BRep_Tool().Pnt(last) if first_vert.Z()==b and last_vert.Z()==b: #Za zgornjo površino for face in face_results: posnetje.Add(b/5, edge, face) if first_vert.Z()==0 and last_vert.Z()==0: #Za spodnjo površino for face in face_results: posnetje.Add(b/5, edge, face) anEdgeExplorer.Next() posnetje.Build() cube7 = posnetje.Shape() display.EraseAll() display.DisplayShape(cube7, update=True) #FUNKCIJA ZA SPREMEMBO RADIJA Z VNOSOM V PROGRAM (ukaz se izvede v "Run" terminalu v PyCharmu def povecaj_radij(event=None): global R #Globalna spremenljivka za radij R = int(input("Vnesi nov radij: ")) #Ukaz za ročni vnos novega radija while(R >= 90): #V primeru, da vnešemo prevelik radij (zaradi geometrijskih pravil) se program ne izvede oz. crashne. Da do te ga ne bi prišlo lahko definiramo zanko, # ki v primeru prevelikega radija zahteva nov vnos ustreznega radija in program to tudi sporoči. print("Vnešen radij je prevelik glede na objekt. ") R = int(input("Vnesi nov radij: ")) #FUNKCIJA ZA RESETIRANEJ RADIJA NA PRVOTNO VREDNOST def resetiraj_radij(event=None): global R R = b/5 #Definiramo osnovno obliko kocka(200) #Definiramo radij global R R = b/5 #Ustvarimo program z meniji add_menu("Kocka") #Ustvarimo meni add_function_to_menu('Kocka', zaokrozeno_nic) #Izbranemu meniju vstavimo funkcijo za izvedbo (s klikom) add_menu('Primeri zaokrožitev') add_function_to_menu('Primeri zaokrožitev', zaokrozeno_en_rob_box) add_function_to_menu('Primeri zaokrožitev', zaokrozeno_izbrani_robovi) add_function_to_menu('Primeri zaokrožitev', zaokrozeno_vse) add_function_to_menu('Primeri zaokrožitev', zaokrozeno_smer_Z) add_function_to_menu('Primeri zaokrožitev', zaokrozeno_variabilni) add_function_to_menu('Primeri zaokrožitev', zaokrozeno_tocka) add_menu('Dodatne Funkcije') add_function_to_menu('Dodatne Funkcije', povecaj_radij) add_function_to_menu('Dodatne Funkcije', resetiraj_radij) add_menu('Posnetje') add_function_to_menu('Posnetje', posnetje_f) start_display()