wiki:salome_shaper

Version 7 (modified by dpenko, 5 years ago) (diff)

Include image material for the addBox example. Use HTML instead of TRAC syntax for adding images as TRAC does not support image captions.

SALOME SHAPER

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.

V nadaljevanju so

Povezave:

Predstavitev SHAPER modula na primerih

Primer: Postopek izdelave primitivov

V SALOME Python konzolo vnesemo naslednje ukaze:

# 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)
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 tej povezavi.

V SALOME Python shell vnesemo naslednje ukaze:

# 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

# 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:

# 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:

# 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.

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

# 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").

# 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()

Attachments (25)

Download all attachments as: .zip