| 153 | |
| 154 | === Primer izdelave panela v fuzijskem reaktorju ITER |
| 155 | |
| 156 | V tem primeru bo prikazana izdelava krivulj v 3D prostoru in izvlek krivulj, s katerim generiramo povrsino v prostoru. Koncni cilj je izdelava panela, prikazanega na sliki. V datoteki data.txt imamo podane koordinate tock (x, y in z), iz katerih bomo generirali krivujo. To krivuljo bomo nato izvlekli v prostor s pomocjo daljic, ki so prav tako definirana s tockami (xe, ye in ze). Podatki so podani v formatu |
| 157 | [[Image(prismSalomePrismExample.png, 300, right)]] |
| 158 | {{{ |
| 159 | x1 y1 z1 xe1 ye1 ze1 |
| 160 | x2 y2 z2 xe2 ye2 ze2 |
| 161 | x3 y3 z3 |
| 162 | ... |
| 163 | xn yn zn |
| 164 | }}} |
| 165 | |
| 166 | 1. Uvoz modulov |
| 167 | |
| 168 | Najprej je potrebno v python uvoziti vse knjiznice, ki jih bomo uporabili v Salome okolju. Nato pa je potrebno definirati novo studijo. |
| 169 | |
| 170 | {{{ |
| 171 | #!python |
| 172 | # Uvoz knjiznic |
| 173 | import salome |
| 174 | import numpy as np |
| 175 | import GEOM |
| 176 | from salome.geom import geomBuilder |
| 177 | geompy = geomBuilder.New(salome.myStudy) |
| 178 | }}} |
| 179 | |
| 180 | 2. Uvoz podatkov v Python |
| 181 | |
| 182 | Podatke v stolpcih v tekstovnem formatu lahko preberemo na vec nacinov, v tem primeru smo uporabili funkcijo `loadtxt()` iz knjiznice `numpy`. Podatke za krivuljo shranimo v spremenljivko tipa `np.array()` z imenoma ''coord_x'' in ''coord_y''. Nato te tocke zrcalimo preko ravnine y-z, da dobimo krivuljo se za levo stran panela, in jih shranimo v spremenljivki `coord_x_mirror` in `coord_y_mirror`. |
| 183 | |
| 184 | {{{ |
| 185 | #!python |
| 186 | # Load data |
| 187 | data = np.loadtxt('/pathtofile/data.txt') |
| 188 | # convert coordinates to mm |
| 189 | coord_x = data[:,0]*(1000) |
| 190 | coord_y = data[:,1]*(1000) |
| 191 | # mirror x coordinates over yz - plane |
| 192 | coord_x_mirror = coord_x[::-1]*(-1) |
| 193 | coord_y_mirror = coord_y[::-1] |
| 194 | }}} |
| 195 | |
| 196 | Nato generiramo B-zlepek krivuljo s pomocjo metode `geompy.MakeInterpol()`, ki sprejme seznam tock, na katerih izvede interpolacijo. rezultat je polinom, ki predstavlja podano krivuljo. Nato izracunano krivuljo dodamo v studijo. |
| 197 | {{{ |
| 198 | #!python |
| 199 | # Create B-Spline curve on the set of points with |
| 200 | # geompy.MakeInterpol() and add curve to Salome study. |
| 201 | b_spline = geompy.MakeInterpol(points_x) |
| 202 | b_splineID = geompy.addToStudy(b_spline,"b_spline_ft") |
| 203 | b_spline_mirror = geompy.MakeInterpol(points_y) |
| 204 | b_splineID_mirror = geompy.addToStudy(b_spline_mirror,"b_spline_ft_mirrored") |
| 205 | }}} |
| 206 | |
| 207 | Sedaj je potrebno kreirati se daljico, s katero bomo povezali obe krivulji (na sliki oznacena z rumeno barvo). |
| 208 | |
| 209 | {{{ |
| 210 | #!python |
| 211 | # Create line between both curves. |
| 212 | ml_point1 = geompy.MakeVertex(-coord_x[0],coord_y[0],0) |
| 213 | ml_point2 = geompy.MakeVertex(coord_x[0],coord_y[0],0) |
| 214 | middle_line = geompy.MakeLineTwoPnt(ml_point1,ml_point2) |
| 215 | middle_lineID = geompy.addToStudy(middle_line,"middle_line") |
| 216 | }}} |
| 217 | |
| 218 | Nato je potrebno vse tri komponente zdruziti v skupen objekt, ki ga bomo izvlekli v prostor. To storimo z metodo `geompy.MakeWire()`, ki sprejme seznam krivulj, robov in daljic, ki jih zelimo zdruziti v en objekt. |
| 219 | |
| 220 | {{{ |
| 221 | #!python |
| 222 | # Create wire out of all three components |
| 223 | wire = geompy.MakeWire([b_spline_mirror,middle_line,b_spline]) |
| 224 | wireID = geompy.addToStudy(wire,"wire_bottom") |
| 225 | }}} |
| 226 | |
| 227 | Nato izdelamo se krivuljo za izvlek, ki je prikazana na sliki. Ponovno uvozimo tocke in jih shranimo v spremenljivke tipa `np.array()`. |
| 228 | |
| 229 | {{{ |
| 230 | #!python |
| 231 | # Load data for extrusion |
| 232 | dataExtrusion = np.loadtxt('/pathtofile/dataExtrusion.txt') |
| 233 | # Read data for extrusion |
| 234 | coord_xe = dataExtrusion[:,0] |
| 235 | coord_ye = dataExtrusion[:,1] |
| 236 | coord_ze = dataExtrusion[:,2] |
| 237 | }}} |
| 238 | |
| 239 | Koordinate ponovno pretvorimo v tocke tipa `geompy` z ukazom `geompy.MakeVertex()` ter nato generiramo polyline. |
| 240 | |
| 241 | {{{ |
| 242 | #!python |
| 243 | # Convert data to geompy point and store it in a list. |
| 244 | points_e = [] |
| 245 | for point_e in range(len(coord_xe)): |
| 246 | point_e = geompy.MakeVertex(coord_xe[point_e],coord_ye[point_e],coord_ze[point_e]) |
| 247 | points_e.append(point_e) |
| 248 | # Create polyline for extrusion and add it to study. |
| 249 | polylineVert = geompy.MakePolyline(points_e) |
| 250 | polylineVertID = geompy.addToStudy(polylineVert,"b_spline_ft_vert") |
| 251 | }}} |
| 252 | |
| 253 | Na koncu ustvarimo izvlek iz obeh danih krivulj. Izvlek dodamo v studijo in posodobimo drevesno strukturo. |
| 254 | |
| 255 | {{{ |
| 256 | #!python |
| 257 | # Create panel shape |
| 258 | panel_FW = geompy.MakePipe(polylineVert, wire) |
| 259 | geompy.addToStudy(panel_FW,'Panel') |
| 260 | salome.sg.updateObjBrowser(True) |
| 261 | }}} |