PythonOcc/primitives: Izdelava_zaokrozitev_in_posnetij.py

File Izdelava_zaokrozitev_in_posnetij.py, 11.1 KB (added by dpenko, 5 years ago)

Primeri zaokroževanj in posnetij kocke z uporabo menijev in funkcijo za spremembo radija.

Line 
1# -*- coding: utf-8 -*-
2#Uvažanje vseh potrebnih knjižnic
3from OCC.Display.SimpleGui import *
4from OCC.gp import *
5from OCC.BRepBuilderAPI import *
6from OCC.BRepPrimAPI import *
7from OCC.BRepFilletAPI import *
8from OCC.BRep import *
9from OCC.TopExp import *
10from OCC.TopTools import *
11from OCC.TopoDS import *
12from OCC.TColgp import *
13from OCC.TopAbs import *
14
15display, start_display, add_menu, add_function_to_menu = init_display()
16
17#DEFINIRANJE FUNKCIJE, S KATERO BOMO USTVARILI MODEL "cube"
18def kocka(a = 100):
19    global cube
20    global b
21    b = a
22    cube = BRepPrimAPI_MakeBox(a,a,a).Shape()
23
24#FUNKCIJA ZA PRIKAZ OSNOVNEGA MODELA "cube"
25def zaokrozeno_nic(Event=None):
26    display.EraseAll()
27    display.DisplayShape(cube, update=True)
28
29#FUNKCIJA ZA ZAOKROŽEVANJE ENEGA ROBA
30def zaokrozeno_en_rob_box(Event=None):
31    afillet = BRepFilletAPI_MakeFillet(cube)             #Definiramo, na katerem modelu se bo izvajalo zaokroževanje
32    anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE)  #Iskalnik robov (EDGE) po modelu "cube"
33    anEdge = topods.Edge(anEdgeExplorer.Current())       #V spremenljivko "anEdge" shranimo v iskalniku trenutno izbran rob
34    #anEdgeExplorer.Next()                               #Tako lahko v iskalnuku robov iščemo naslednji rob
35    afillet.Add(R, anEdge)                               #Izbran rob določimo za zaokrožitev
36    afillet.Build()                                      #Izvedemo zaokroževanje na vseh izbranih robovih
37    cube1 = afillet.Shape()                              #Modelu z zaokrožitvami določimo novo ime, "cube1"
38    display.EraseAll()                                   #Vse že prej prikazane modele izbrišemo
39    display.DisplayShape(cube1, update=True)             #Prikažemo model "cube1"
40
41#FUNKCIJA ZA ZAOKROŽEVANJE IZBRANIH ROBOV S POMOČJO SEZNAMA
42def zaokrozeno_izbrani_robovi(Event=None):
43    #V tem primeru bomo ponovili izdelavo modela oz točk->robovi->mreža->površina->izvlek
44    #(Velikost je enaka kot že prej definiranega modela-kocke "cube")
45    #Izdelava točk v prostoru
46    T1 = gp_Pnt(0 , 0 , 0)
47    T2 = gp_Pnt(b , 0, 0)
48    T3 = gp_Pnt(b , b , 0)
49    T4 = gp_Pnt(0, b , 0)
50
51    #Izdelava robov na podlagi definiranih tock
52    E1 = BRepBuilderAPI_MakeEdge(T1, T2)
53    E2 = BRepBuilderAPI_MakeEdge(T2, T3)
54    E3 = BRepBuilderAPI_MakeEdge(T3, T4)
55    E4 = BRepBuilderAPI_MakeEdge(T4, T1)
56
57    #Izdelava mreznega modela
58    Mreza  = BRepBuilderAPI_MakeWire(E1.Edge() , E2.Edge() ,E3.Edge(), E4.Edge())
59
60    #Izdelava povrsine
61    Povrsina = BRepBuilderAPI_MakeFace(Mreza.Wire())
62
63    #Izdelava vektorja za izvlek v prostor
64    Vektor1 = gp_Vec(0 , 0, b)
65
66    #Izdelava priznaticnega telesa- izvlek povrsine v smeri vektorja
67    izvlek = BRepPrimAPI_MakePrism(Povrsina.Face() , Vektor1).Shape()
68    afillet = BRepFilletAPI_MakeFillet(izvlek)
69
70    #Naredimo array, kateri bo vseboval reference do vseh robov (EDGE)
71    anEdgeExplorer = TopExp_Explorer(izvlek, TopAbs_EDGE)
72    results = []                                        #Definiramo prazen seznam
73    while anEdgeExplorer.More():                        #Ta zanka se bo izvajala, dokler bo zaznala, da je v "anEdgeExplorerju" izbran rob
74       anEdge = topods().Edge(anEdgeExplorer.Current()) #V spremenljivko "anEdge" shranimo referenco za rob
75       results.append(anEdge)                           #V seznam dodamo trenuteno najden rob
76       anEdgeExplorer.Next()                            #Iskalnik robov najde naslednji rob. POZOR! Če tega ukaza ne izvedemo, se bo while zanka izvajala v neskončnost!
77    anEdgeExplorer.ReInit()                             #Za izogibanje izgubi referenc na objekte oz. robove, najdenih v zanki
78
79    #Zaokroževanje izbranih robov iz seznama
80    afillet.Add(R, results[0])
81    afillet.Add(R, results[2])
82    afillet.Add(R, results[4])
83    afillet.Add(R, results[8])
84
85    afillet.Build()
86    cube2 = afillet.Shape()
87    display.EraseAll()
88    display.DisplayShape(cube2, update=True)
89
90#FUNKCIJA ZA ZAOKROŽEVANJE VSEH ROBOV
91def zaokrozeno_vse(Event=None):
92    #Iskalnik robov
93    afillet = BRepFilletAPI_MakeFillet(cube)
94    anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE)
95
96    #Zanka, s katero iščemo in hkrati dodamo zaokrožitev vsakem najdenem robu
97    #(V prejšnem primeru pa smo na podoben način shranejvali reference robov v seznam)
98    while anEdgeExplorer.More():
99        anEdge = topods.Edge(anEdgeExplorer.Current())
100        afillet.Add(R, anEdge)
101        anEdgeExplorer.Next()
102
103    afillet.Build()
104    cube3 = afillet.Shape()
105    display.EraseAll()
106    display.DisplayShape(cube3, update=True)
107
108#FUNKCIJA ZA ZAOKROŽEVANJE ROBOV LE V Z SMERI
109def zaokrozeno_smer_Z(Event=None):
110    topExp = TopExp_Explorer()
111    topExp.Init(cube, TopAbs_VERTEX)
112
113    #Najdemo dva vozlišča, s katerima si bomo pozneje pomagali pravilno izpeljati željeno zaokrožitev
114    vertA = topods_Vertex(topExp.Current())
115    topExp.Next()
116    vertB = topods_Vertex(topExp.Current())
117
118    afillet = BRepFilletAPI_MakeFillet(cube)
119    anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE)
120    #Vpeljemo preprosti test, ki nam pove, če točki robova ležita na isti ravnini (X,Y).
121    while anEdgeExplorer.More():
122        edge = topods.Edge(anEdgeExplorer.Current())
123        first, last = topexp_FirstVertex(edge), topexp_LastVertex(edge)
124        vertex, first_vert, last_vert = BRep_Tool().Pnt(vertA), BRep_Tool().Pnt(first), BRep_Tool().Pnt(last)
125        if first_vert.Z() != last_vert.Z():
126            afillet.Add(R, edge)
127        anEdgeExplorer.Next()
128
129    afillet.Build()
130    cube4 = afillet.Shape()
131
132    display.EraseAll()
133    display.DisplayShape(cube4, update=True)
134
135
136#ZAOKROŽITEV Z VARIABILNIM RADIJEM ZAOKROŽITVE
137def zaokrozeno_variabilni(Event=None):
138    afillet = BRepFilletAPI_MakeFillet(cube) #afillet = zaokrozitev
139
140    #Dolocitev parametrov variabilne zaokrozitve
141
142    TabPoint = TColgp_Array1OfPnt2d(1,6) #2d... 2D tocka. stranico se razdeli na 6 tock (1,6)
143    P1 = gp_Pnt2d(0.,R/3)
144    P2 = gp_Pnt2d(0.2,R/2)
145    P3 = gp_Pnt2d(0.4,R) # (mesto/tocka zaokrozitve gledano od spodaj navzgor, radij zaokrozitve)
146    P4 = gp_Pnt2d(0.6,R/4)
147    P5 = gp_Pnt2d(0.8,R/5)
148    P6 = gp_Pnt2d(1.,R/2)
149    TabPoint.SetValue(1,P1)
150    TabPoint.SetValue(2,P2)
151    TabPoint.SetValue(3,P3)
152    TabPoint.SetValue(4,P4)
153    TabPoint.SetValue(5,P5)
154    TabPoint.SetValue(6,P6)
155
156    #izbira robova na katerem se izvede zaokrozitev
157    exp = TopExp_Explorer(cube, TopAbs_EDGE)
158    exp.Next()  #Iskanje naprej po iskalniku robov
159    exp.Next()
160    exp.Next()
161    exp.Next()
162
163    #apliciranje zaokrozitve na modelu
164    afillet.Add(TabPoint, topods_Edge(exp.Current()))
165    afillet.Build()
166    if afillet.IsDone():
167        cube5 = afillet.Shape()
168
169    display.EraseAll()
170    display.DisplayShape(cube5, update=True)
171
172#ZAOKROŽITEV OKOLI TOČKE
173def zaokrozeno_tocka(Event=None):
174
175    topExp = TopExp_Explorer()
176    topExp.Init(cube, TopAbs_VERTEX)
177    # get two vertices
178    vertA = topods_Vertex(topExp.Current())
179    topExp.Next()
180    vertB = topods_Vertex(topExp.Current())
181
182    #Apliciranje zaokrožitve na obeh koncih roba oz. na vozliščih roba
183    afillet = BRepFilletAPI_MakeFillet(cube)
184    #Iskanje robov
185    _map = TopTools_IndexedDataMapOfShapeListOfShape()
186    topexp_MapShapesAndAncestors(cube, TopAbs_VERTEX, TopAbs_EDGE, _map)
187    results = _map.FindFromKey(vertA)
188    topology_iterator = TopTools_ListIteratorOfListOfShape(results)
189    while topology_iterator.More():
190        edge = topods_Edge(topology_iterator.Value())
191        topology_iterator.Next()
192        first, last = topexp_FirstVertex(edge), topexp_LastVertex(edge)
193        vertex, first_vert, last_vert = BRep_Tool().Pnt(vertA), BRep_Tool().Pnt(first), BRep_Tool().Pnt(last)
194        if edge.Orientation():
195            if not vertex.IsEqual(first_vert, 0.001):
196                afillet.Add(R/5, R, edge) #navpicno
197            else:
198                afillet.Add(R, 0, edge) #vodoravno
199
200    afillet.Build()
201    cube6 = afillet.Shape()
202
203    display.EraseAll()
204    display.DisplayShape(cube6, update=True)
205
206#FUNKCIJA ZA IZVEDBO POSNETJA
207def posnetje_f(event=None):
208    posnetje = BRepFilletAPI_MakeChamfer(cube)
209
210    topExp = TopExp_Explorer()
211    anEdgeExplorer = TopExp_Explorer(cube, TopAbs_EDGE)
212    aFaceExplorer = TopExp_Explorer(cube, TopAbs_FACE)
213    #Definiranje seznama, tokrat z referencami na površine
214    face_results = []
215    while aFaceExplorer.More():
216       aFace = topods().Face(aFaceExplorer.Current())
217       face_results.append(aFace)
218       aFaceExplorer.Next()
219    aFaceExplorer.ReInit()
220    #Apliziranje posnetij
221    while anEdgeExplorer.More():
222        edge = topods.Edge(anEdgeExplorer.Current())
223        first, last = topexp_FirstVertex(edge), topexp_LastVertex(edge)
224        first_vert, last_vert = BRep_Tool().Pnt(first), BRep_Tool().Pnt(last)
225        if first_vert.Z()==b and last_vert.Z()==b: #Za zgornjo površino
226            for face in face_results:
227                posnetje.Add(b/5, edge, face)
228
229        if first_vert.Z()==0 and last_vert.Z()==0: #Za spodnjo površino
230            for face in face_results:
231                posnetje.Add(b/5, edge, face)
232
233        anEdgeExplorer.Next()
234    posnetje.Build()
235    cube7 = posnetje.Shape()
236
237    display.EraseAll()
238    display.DisplayShape(cube7, update=True)
239
240#FUNKCIJA ZA SPREMEMBO RADIJA Z VNOSOM V PROGRAM (ukaz se izvede v "Run" terminalu v PyCharmu
241def povecaj_radij(event=None):
242    global R                                #Globalna spremenljivka za radij
243    R = int(input("Vnesi nov radij: "))     #Ukaz za ročni vnos novega radija
244    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,
245                                            # ki v primeru prevelikega radija zahteva nov vnos ustreznega radija in program to tudi sporoči.
246        print("Vnešen radij je prevelik glede na objekt. ")
247        R = int(input("Vnesi nov radij: "))
248
249#FUNKCIJA ZA RESETIRANEJ RADIJA NA PRVOTNO VREDNOST
250def resetiraj_radij(event=None):
251    global R
252    R = b/5
253
254#Definiramo osnovno obliko
255kocka(200)
256#Definiramo radij
257global R
258R = b/5
259
260#Ustvarimo program z meniji
261add_menu("Kocka")                                                        #Ustvarimo meni
262add_function_to_menu('Kocka', zaokrozeno_nic)                            #Izbranemu meniju vstavimo funkcijo za izvedbo (s klikom)
263add_menu('Primeri zaokrožitev')
264add_function_to_menu('Primeri zaokrožitev', zaokrozeno_en_rob_box)
265add_function_to_menu('Primeri zaokrožitev', zaokrozeno_izbrani_robovi)
266add_function_to_menu('Primeri zaokrožitev', zaokrozeno_vse)
267add_function_to_menu('Primeri zaokrožitev', zaokrozeno_smer_Z)
268add_function_to_menu('Primeri zaokrožitev', zaokrozeno_variabilni)
269add_function_to_menu('Primeri zaokrožitev', zaokrozeno_tocka)
270add_menu('Dodatne Funkcije')
271add_function_to_menu('Dodatne Funkcije', povecaj_radij)
272add_function_to_menu('Dodatne Funkcije', resetiraj_radij)
273add_menu('Posnetje')
274add_function_to_menu('Posnetje', posnetje_f)
275
276start_display()
277
278
279