== 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.
Slika: 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.
}}} ---- Povezave: * [https://www.salome-platform.org/downloads/current-version Povezave za prenos SALOME programa] * [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] = Osnovna orodja za pregledovanje 3D modela v SHAPER oknu = [[Image(SHAPER_UI_mouse_interaction_style_button.png,left,height=40px)]] \\ - Aktiviranje načina interakcije z miško (Prvi način omogoča interakcijo z objekti npr. točkami, drugi pa spreminjanje pogleda 3D modela). \\ [[Image(SHAPER_UI_fit_all_button.png,left,height=40px)]] \\ - Sprememba pogleda za prikaz na celotnega območje oz. 3D modela. [[Image(SHAPER_UI_3D_view_operations_buttons.png,left,height=40px)]] \\ - Spreminjanje pogleda od strani. [[Image(SHAPER_UI_reset_view_button.png,left,height=40px)]] \\ - Resetiranje pogleda na prvotni pogled. == Predstavitev SHAPER modula na primerih == V nadaljevanju so prikazani primeri uporabe na podlagi vnosa Python ukazov v SALOME Python konzolo. === 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 dimenzij 10x10x10 Box = model.addBox(Part_doc, 10, 10, 10) }}} {{{ #!html
shaper_example_addBox_PythonShell shaper_example_addBox_result shaper_example_addBox_objectBrowser
Slika: 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).
}}} Spodaj so prikazani primeri "add" ukazov za dodajanje točk in drugih primitivov, ki se jih lahko najde tudi na [https://docs.salome-platform.org/latest/tui/SHAPER/group__CPPHighAPI.html#ga0f0cb17c988065dfcd41201b56c789fd, tej povezavi]: {{{ #!python # Točka s koordinatami x=-50, y=70, z=20 Point = model.addPoint(Part_doc, -50, 70, 20) # Kocka oz. kvader z ogliščem v izhodiščni točki T(0,0,0), # dimenzija v X osi = 40, v Y osi = 45, v Z osi = 60 model.addBox(Part_doc, 40, 45, 60) # Stožec, z zunanji radij=50, notranji radij=0 (z vrednostjo večje od 0 se difinira prisekan stožec), višina=100 model.addCone(Part_doc, 50, 0, 90) # Valj, polmer=60, višina=70 model.addCylinder(Part_doc, 60, 70) # Krogla, polmer=60 model.addSphere(Part_doc, 60) # Torus, razdalja od središča cevi torusa=20 , polmer cevi torusa=10 model.addTorus(Part_doc, 20, 10) }}} {{{ #!html
Alt text Alt text Alt text Alt text Alt text Alt text
Slika: Od leve proti desni: Točka (prikazana s "+"), kvader, stožec, valj, krogla in torus v SHAPERju.
}}} === Primer: Izdelava izvleka v prostor (Extrude) === V SALOME Python konzolo vnesemo naslednje ukaze: {{{ #!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() # Dodamo objekt - skico za našo osnovo kvadra mySketch = 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) # Izdelava robov iz točk na podlagi točk lines = model.addPolygon(mySketch, p1, p2, p3, p4) # "lines" je seznam oz. niz štirih robov # Prikaži dopolnjen model - prikaži robove model.do() # Dodatno: Izpis točk, ki sestavljajo vsako izmed linij for i in range(len(lines)): l = lines[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())) # Izdelava izvleka mybox = model.addExtrusion(mypart, mySketch.selectFace(), 50) # Prikaži dopolnjen model model.do() }}} {{{ #!html
Alt text Alt text
Slika: Prikaz določenih robov spodnje ploskve in izvlek v prostor.
}}} === Primer: Izdelava izvleka v prostor (Extrude) z dodajanjem robov v skici === V SALOME Python konzolo vnesemo naslednje ukaze: [[Image(SHAPER_example_box_50x50.png,right,300px)]] {{{ #!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")) # - Risanje po skici: dodamo š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: Uporaba relacij med linijami === Ta primer je podoben prejšnjemu 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: 3D odsekoma linearni zlepek (ang. polyline) === Primer izdelave 3D linearnega zlepka: [[Image(SHAPER_example_3D_polyline.png,right,300px)]] {{{ #!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 linearnega zlepka, sestavljene iz treh točk (oz. dveh linij) 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: Boolova algebra: odštevanje (ang. cut) === Spodaj je prikazan primer boolove algebre na primeru kocke in krogle. Pri tem je kot za dodatek prikazano tudi, kako se lahko spreminja barvo in prosojnost modela, da dobimo enak rezultat kot je prikazano na sliki. V SALOME Python konzolo vnesemo naslednje ukaze: [[Image(SHAPER_example_cut.png,right,400px)]] {{{ #!python from salome.shaper import model model.begin() # Dodajanje novega dokumenta partSet = model.moduleDocument() moj_part = model.addPart(partSet) # Dodajanje novega part-a part_dokument = moj_part.document() # Dodajanje kocke: moja_kocka = model.addBox(part_dokument, 10, 10, 10) # - Določevanje refenc do kocke ter imena kocke (spremembe se lahko opazi tudi v # Object Browserju (GUI) moja_kocka.setName("Kocka") moja_kocka.result().setName("Kocka") # Dodajanje nove točke # To točko se bo uporabilo za definiranje pozicijo središča krogle moja_tocka = model.addPoint(part_dokument, 0, 0, 10) # - Določevanje referenc to točke ter imena točke moja_tocka.setName("Tocka") moja_tocka.result().setName("Tocka") # Dodajanje krogle s središčem v točki (vozlišče -> ang. vertex) moja_krogla = model.addSphere(part_dokument, model.selection("VERTEX", "Tocka"), 5) # - Določevanje referenc to krogle ter imena krogle moja_krogla.setName("Krogla") moja_krogla.result().setName("Krogla") # Izdelava izreza oz. odštevanja (ang. cut) moj_izrez = model.addCut(part_dokument, [model.selection("SOLID", "Kocka")], [model.selection("SOLID", "Krogla")]) # - Določevanje primernih referenc to krogle ter imena krogle # (SHAPER samodejno določi ime oz. referenco tega izreza -> "Kocka") moj_izrez.setName("Izrez") moj_izrez.result().setName("Izrez") # Dodatno: UREJANJE PRIKAZA MODELA # Določimo barvo - modro # Opomba: Barvo ne bo prikazalo takoj. V Object Broserju je potrebno model # skriti ter zopet prikazati ter se bo tako posodobila barva modela. # Drugi način je uporaba part_dokument.setAcive(False/True), kot je prikazano # proti koncu kode tega primera moj_izrez.result().setColor(255,255,0) # Prejšnja krogla nam ni več na voljo. Naredimo novo # Dodajanje krogle s središčem v točki (vozlišče -> ang. vertex) moja_krogla2 = model.addSphere(part_dokument, model.selection("VERTEX", "Tocka"), 5) # - Določevanje referenc to krogle ter imena krogle moja_krogla2.setName("Krogla2") moja_krogla2.result().setName("Krogla2") moja_krogla2.result().setColor(255,255,0) moja_krogla2.result().setTransparency(0.7) # Posodobitev barv in transparentnosti v oknu za ogled modela part_dokument.setActive(False) part_dokument.setActive(True) # Zaključevanje in prikaz modela model.do() model.end() }}} === 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() }}}