== SALOME SHAPER == [[PageOutline]] SALOME je odprtokodno okolje, ki vsebuje več integriranih modulov, ter je namenjeno reševanju kompleksnih numeričnih problemov ter izvajanju simulacij. Ti numerični problemi bazirajo na začetnem CAD modelu. SALOME vsebuje tudi orodja, ki omogočajo delo s CAD modeli oz. z značilkami CAD modelov ter tako spremembo CAD modelov (poenostavitev) in pridobitev različnih podatkov iz CAD modelov. {{{ #!html
SALOME SHAPER empty case.
Začetni prikaz SALOME okolja z aktiviranim SHAPER modulom. Izbor modula je nakazan v zgornjem delu (izbor z "drop-down" menujem). Na levi strani se nahaja "Object Browser", ki na podlagi drevesne strukture prikazuje vsebino našega primera. V sredini je pregledovalno okno za 3D prikaz modela. V spodnjem delu se nahaja Python konzola v katerega se lahko vnesuje Python ukazne vrstice.
}}} V nadaljevanju so prikazani primeri uporabe na podlagi vnosa Python kode v SALOME konzolo. Povezave: * [https://events.prace-ri.eu/event/896/sessions/2723/attachments/998/1676/SHAPER_AShortIntro_2.pdf Predstavitev SHAPER modula] * [https://docs.salome-platform.org/latest/gui/SHAPER/index.html SHAPER dokumentacija] * [https://docs.salome-platform.org/latest/tui/SHAPER/ SHAPER dokumentacija (moduli, opis funkcij itd.)] * [https://www.youtube.com/channel/UCm7CSP3v1VF6brzmTlV9c3Q SHAPER primeri na Youtube] * [http://www.learnsalome.org/shaper/interactive_tutorial SHAPER interaktivni tutorial] == Predstavitev SHAPER modula na primerih == = Primer: Postopek izdelave primitivov = V SALOME Python konzolo vnesemo naslednje ukaze: {{{ #!python # Uvozimo potrebne knjižnice from salome.shaper import model # Inicializiramo model model.begin() myPartSet = model.moduleDocument() # Kreiramo part Part = model.addPart(myPartSet) Part_doc = Part.document() # Dodamo kocko Box = model.addBox(Part_doc, 10, 10, 10) }}} {{{ #!html
shaper_example_addBox_PythonShell shaper_example_addBox_result shaper_example_addBox_objectBrowser
Prikaz vnosa kode v SALOME Python konzolo (desno), prikaz pridobljenega modela (v sredini) in prikaz drevesne strukture part-a v t.i. Object Browser-ju (desno).
}}} Primeri sintakse "Add" ukazov za izdelavo drugih primitivov, ki se jih lahko najde tudi na [https://docs.salome-platform.org/latest/tui/SHAPER/group__CPPHighAPI.html#ga0f0cb17c988065dfcd41201b56c789fd, tej povezavi]. V SALOME Python shell vnesemo naslednje ukaze: {{{ #!python # Točka Point = model.addPoint(Part_doc, 10, 10, -10) # Kocka oz. kvader model.addBox(Part_doc, 10, 10, 10) # Stožec model.addCone(Part_doc, 20, 10, 10) # Valj model.addCylinder(Part_doc, 10, 10) # Krogla model.addSphere(Part_doc, 10) # Torus model.addTorus(Part_doc, 20, 10) }}} = Primer: Postopek preprostega izvleka v prostor (Extrude) = V SALOME Python konzolo vnesemo naslednje ukaze: = Primer: Postopek preprostega izvleka v prostor (Extrude) z uporabo linij = {{{ #!python # Uvozimo knjižnice from salome.shaper import model from salome.shaper import geom # Inicializiramo model model.begin() mypartset = model.moduleDocument() # Dodamo novi part mypart = model.addPart(mypartset).document() # Naredimo objekt - skico za našo osnovo kvadra mybase = model.addSketch(mypart, model.defaultPlane("XOY")) # Določimo točke p1 = geom.Pnt2d(0, 0) p2 = geom.Pnt2d(0, 25) p3 = geom.Pnt2d(25, 25) p4 = geom.Pnt2d(25, 0) # Iz točk tvorimo sestavljeno linijo - poligon line = model.addPolygon(mybase, p1, p2, p3, p4) # Line je seznam oz. niz štirih linij # Izpis točk, ki sestavljajo vsako izmed linij for i in range(len(line)): l = line[i] print("Linija #" + str(i) + ":") print("Začetna točka: X:", str(l.startPoint().x()), ", Y: ", str(l.startPoint().y())) print("Končna točka: X:", str(l.endPoint().x()), ", Y: ", str(l.endPoint().y())) # Prikaži dopolnjen model model.do() # Izdelava izvleka mybox = model.addExtrusion(mypart, mybase.selectFace(), 50) # Prikaži dopolnjen model model.do() }}} V SALOME Python konzolo vnesemo naslednje ukaze: {{{ #!python # Uvozimo potrebne knjižnice from salome.shaper import model # Inicializiramo model model.begin() mypartset = model.moduleDocument() # Dodamo novi part mypart = model.addPart(mypartset).document() # Naredimo skico, ki predstavlja osnovo za naš izvlek v prostor sketch_base = model.addSketch(mypart, model.defaultPlane("XOY")) # - Določimo štiri linije l1 = sketch_base.addLine(0, 0, 0, 50) # Linijo, ki leži v trenutni ravnini, se definira z dvema točkama na način (x1,y1, x2, y2) l2 = sketch_base.addLine(0, 50, 50, 50) l3 = sketch_base.addLine(50, 50, 50, 0) l4 = sketch_base.addLine(50, 0, 0, 0) # Prikaži dopolnjen model model.do() # Izvlek v prostor mybox = model.addExtrusion(mypart, sketch_base.selectFace(), 50) # Prikaži dopolnjen model model.do.() }}} = Primer: Postopek izvleka v prostor z uporabo relacij med linijami = Ta primer je podoben prejšnjem z razliko da se bo uporabilo relacije med elementi (sovpadanje točk, vzporednost ipd.). V SALOME Python konzolo vnesemo naslednje ukaze: {{{ #!python # Uvozimo potrebne knjižnice from salome.shaper import model # Inicializiramo model model.begin() mypartset = model.moduleDocument() # Dodamo novi part mypart = model.addPart(mypartset).document() # Naredimo skico, ki predstavlja osnovo za naš izvlek v prostor # V tem primeru bomo naredili "neustrezno" skico, v kateri nam linije ne bodo sovpadale. To se bo kasneje uredilo z relacijami sketch_base = model.addSketch(mypart, model.defaultPlane("XOY")) # - Določimo štiri linije v ravnini l1 = sketch_base.addLine(0, 0, 0, 50) l2 = sketch_base.addLine(0, 123, 50, 50) # neustrezna linija l3 = sketch_base.addLine(50, 50, 50, 0) l4 = sketch_base.addLine(50, 0, 123, 123) # neustrezna linija model.do() # Določevanje relacij med linijami v skici: # - fiksna pozicija točk linij. Linija l1 in l3 so v redu zato jih določimo kot fiksne sketch_base.setFixed(l1.startPoint()) sketch_base.setFixed(l1.endPoint()) sketch_base.setFixed(l3.startPoint()) sketch_base.setFixed(l3.endPoint()) # - stikanje koncev linij sketch_base.setCoincident(l1.endPoint(), l2.startPoint()) sketch_base.setCoincident(l2.endPoint(), l3.startPoint()) sketch_base.setCoincident(l3.endPoint(), l4.startPoint()) sketch_base.setCoincident(l4.endPoint(), l1.startPoint()) # Prikaži dopolnjen model model.do() # Izvlek v prostor mybox = model.addExtrusion(mypart, sketch_base.selectFace(), 50) # Prikaži dopolnjen model model.do() }}} Namesto sikanja koncev točk linij se lahko ureja druge relacije ter lastnosti. Pri tem je treba paziti, da se skico ne predefinira! Spodaj je prikaz, kako se lahko določi druge relacije. {{{ #!python # - vzporednost sketch_base.setParallel(l1, l3) sketch_base.setParallel(l2, l4) # - pravokotnost sketch_base.setPerpendicular(l1, l4) - vertikalnost sketch_base.setVertical(l1) # - fiksna pozicija točk linij sketch_base.setFixed(l1.startPoint()) # Določitev širine linije mywidth = sketch_base.setLength(l1, 50) # Določitev dolžine skice mylength = sketch_base.setDistance(l1.startPoint(), l3.endPoint(), 50) }}} = Primer: Polyline = {{{ #!python # Uvoz potrebnih knjižnice from salome.shaper import model # Kreiranje modela model.begin() partSet = model.moduleDocument() # Kreiranje parta Part_1 = model.addPart(partSet) Part_1_doc = Part_1.document() # Definiranje tock Point_1 = model.addPoint(Part_1_doc, 10, 10, -10) Point_2 = model.addPoint(Part_1_doc, 70, 70, 50) Point_3 = model.addPoint(Part_1_doc, 100, 120, 100) # Definiranje linije, sestavljene iz treh točk Polyline_1 = model.addPolyline3D(Part_1_doc, [model.selection("VERTEX", "Point_1"), model.selection("VERTEX", "Point_2"), model.selection("VERTEX", "Point_3")], False) # Prikaži dopolnjen model model.do() }}} = Primer: Uvoz STEP modela in izluščevanje topoloških elementov = Spodaj je primer kode, kako se lahko iz obstoječe STEP datoteke v SHAPER-ju izlušči topološke elemente, v tem primeru vozlišča, lupine in površine. Za namene tega primera se lahko uporabi test.step datoteko, ki je priložena na tej strani (glej "priloge" oz. ang. "attachments"). {{{ #!python # Uvoz potrebnih knjižnic from salome.shaper import model from GeomAPI import * # Kreiranje SHAPER session-a model.begin() # Kreiranje objekta: t.i. "dokument", ki predstavlja temelje aplikacije # (root document of SHAPER) partSet = model.moduleDocument() # Dodajanje part-a v model Part_1 = model.addPart(partSet) # Kreiranje objekta za dostop do pod-dokumenta, ki se nanaša na part Part_1_doc = Part_1.document() # Importanje STEP datoteke # Opomba: pot se določa na način npr. /mapa/podmapa1/podmapa2/ime_step_datoteke.step Import_1 = model.addImport(Part_1_doc, "/home/penkod/WORK/training/salome_shaper/test.step") # Posodobi prikaz modela model.do() # Objekt, ki vsebuje lastnosti modela result = Import_1.defaultResult() # Izpis imena parta result.data().name() # --- vozlišča --- # Raziskovalec oblik: vozlišča (VERTEX) vertexExplorer = GeomAPI_ShapeExplorer(result.shape(), GeomAPI_Shape.VERTEX) # Kreiranje nove skupine za vozlišča group_vertices = Part_1_doc.addFeature("Group") # Določevanje imena skupine group_vertices.data().setName("Vertex Group") # Iteriranje skozi vozlišča, dokler jih raziskovalec še najde nVertices = 0 while vertexExplorer.more(): # Trenutno vozlišče cv = vertexExplorer.current().vertex() # Prva koordinata trenutnega vozlišča x = cv.point().x() # Druga koordinata trenutnega vozlišča y = cv.point().y() # Tretja koordinata trenutnega vozlišča z = cv.point().z() # Izpis koordinat trenutne točke print("point XYZ: " + str(x) + ", " + str(y) + ", " + str(z) ) # Dodajanje vozlišča v skupino group_vertices.selectionList("group_list").append(result, vertexExplorer.current()) # Dodatno: Način dodajanja vozlišča direktno na part # model.addPoint(Part_1_doc, x,y,z) # Iteriranje na naslednje vozlišče vertexExplorer.next() # Prištevanje +1 k celotnemu seštevku vozlišč nVertices += 1 # Izpis seštevka najdenih vozlišč print("Number of vertices: ", str(nVertices)) # Posodobi prikaz modela model.do() # --- lupine --- # Raziskovalec oblik: lupine (SHELL) shellExplorer = GeomAPI_ShapeExplorer(result.shape(), GeomAPI_Shape.SHELL) # Kreiranje nove skupine za lupine group_shells = Part_1_doc.addFeature("Group") # Določevanje imena skupine group_shells.data().setName("Shell Group") # Iteriranje skozi lupine, dokler jih raziskovalec še najde nShells = 0 while shellExplorer.more(): # Trenutna lupina sh = shellExplorer.current().shell() # Dodajanje lupine v skupino group_shells.selectionList("group_list").append(result, shellExplorer.current()) # Iteriranje na naslednjo lupino shellExplorer.next() # Prištevanje +1 k celotnemu seštevku lupin nShells += 1 # Izpis seštevka najdenih lupin print("Number of shells: ", str(nShells)) # Posodobi prikaz modela model.do() # --- površine --- # Raziskovalec oblik: površine (FACE) faceExplorer = GeomAPI_ShapeExplorer(result.shape(), GeomAPI_Shape.FACE) # Kreiranje nove skupine za površine group_faces = Part_1_doc.addFeature("Group") # Določevanje imena skupine group_faces.data().setName("Faces Group") # Iteriranje skozi površine, dokler jih raziskovalec še najde nFaces = 0 while faceExplorer.more(): # Trenutno najdena površina face = faceExplorer.current().face() # Dodajanje površine v skupino group_faces.selectionList("group_list").append(result, faceExplorer.current()) # Iteriranje na naslednjo površino faceExplorer.next() # Prištevanje +1 k celotnemu seštevku površin nFaces += 1 # Izpis seštevka najdenih površin print("Number of faces: ", str(nFaces)) # Posodobi prikaz modela model.do() }}}