| | 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 | }}} |