1 | # -*- coding: utf-8 -*- |
---|
2 | #Uvažanje vseh potrebnih knjižnic |
---|
3 | from OCC.Display.SimpleGui import * |
---|
4 | from OCC.gp import * |
---|
5 | from OCC.BRepBuilderAPI import * |
---|
6 | from OCC.BRepPrimAPI import * |
---|
7 | from OCC.BRepFilletAPI import * |
---|
8 | from OCC.BRep import * |
---|
9 | from OCC.TopExp import * |
---|
10 | from OCC.TopTools import * |
---|
11 | from OCC.TopoDS import * |
---|
12 | from OCC.TColgp import * |
---|
13 | from OCC.TopAbs import * |
---|
14 | |
---|
15 | display, start_display, add_menu, add_function_to_menu = init_display() |
---|
16 | |
---|
17 | #DEFINIRANJE FUNKCIJE, S KATERO BOMO USTVARILI MODEL "cube" |
---|
18 | def 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" |
---|
25 | def zaokrozeno_nic(Event=None): |
---|
26 | display.EraseAll() |
---|
27 | display.DisplayShape(cube, update=True) |
---|
28 | |
---|
29 | #FUNKCIJA ZA ZAOKROŽEVANJE ENEGA ROBA |
---|
30 | def 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 |
---|
42 | def 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 |
---|
91 | def 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 |
---|
109 | def 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 |
---|
137 | def 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 |
---|
173 | def 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 |
---|
207 | def 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 |
---|
241 | def 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 |
---|
250 | def resetiraj_radij(event=None): |
---|
251 | global R |
---|
252 | R = b/5 |
---|
253 | |
---|
254 | #Definiramo osnovno obliko |
---|
255 | kocka(200) |
---|
256 | #Definiramo radij |
---|
257 | global R |
---|
258 | R = b/5 |
---|
259 | |
---|
260 | #Ustvarimo program z meniji |
---|
261 | add_menu("Kocka") #Ustvarimo meni |
---|
262 | add_function_to_menu('Kocka', zaokrozeno_nic) #Izbranemu meniju vstavimo funkcijo za izvedbo (s klikom) |
---|
263 | add_menu('Primeri zaokrožitev') |
---|
264 | add_function_to_menu('Primeri zaokrožitev', zaokrozeno_en_rob_box) |
---|
265 | add_function_to_menu('Primeri zaokrožitev', zaokrozeno_izbrani_robovi) |
---|
266 | add_function_to_menu('Primeri zaokrožitev', zaokrozeno_vse) |
---|
267 | add_function_to_menu('Primeri zaokrožitev', zaokrozeno_smer_Z) |
---|
268 | add_function_to_menu('Primeri zaokrožitev', zaokrozeno_variabilni) |
---|
269 | add_function_to_menu('Primeri zaokrožitev', zaokrozeno_tocka) |
---|
270 | add_menu('Dodatne Funkcije') |
---|
271 | add_function_to_menu('Dodatne Funkcije', povecaj_radij) |
---|
272 | add_function_to_menu('Dodatne Funkcije', resetiraj_radij) |
---|
273 | add_menu('Posnetje') |
---|
274 | add_function_to_menu('Posnetje', posnetje_f) |
---|
275 | |
---|
276 | start_display() |
---|
277 | |
---|
278 | |
---|
279 | |
---|