wiki:salome_shaper

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

Add link to example for findinf cylindrical faces from STEP file.

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.

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:

Osnovna orodja za pregledovanje 3D modela v SHAPER oknu


- Aktiviranje načina interakcije z miško (Prvi način omogoča interakcijo z objekti npr. točkami, drugi pa spreminjanje pogleda 3D modela).


- Sprememba pogleda za prikaz na celotnega območje oz. 3D modela.


- Spreminjanje pogleda od strani.


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

# V SALOME aktiviramo SHAPER modul
import SalomePyQt
sgPyQt = SalomePyQt.SalomePyQt()
sgPyQt.activateModule('Shaper')

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

model.do()
model.end()
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 tej povezavi:

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

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:

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

Better image.

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

# 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: 3D odsekoma linearni zlepek (ang. polyline)

Primer izdelave 3D linearnega zlepka:

SHAPER: 3D 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 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()

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

Result of example describing boolean cut method with Shaper module.

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

Seštevanje oz. unija (ang. fuse)

Image for addFuse example.

Podobno kot v prejšnjem primeru odštevanje se izvede seštevanje. Namesto addCut se uporabi ukaz addFuse.

# Izvedba seštevanja geometrij (ang. fuse)
moj_sestevek = model.addFuse(part_dokument,
                     [model.selection("SOLID", "Kocka")],
                     [model.selection("SOLID", "Krogla")])

Celotna koda je na voljo tukaj.

Presek (ang. common)

Image for SHAPER addCommon example.

Podobno kot v prejšnjem primeru odštevanje se izvede seštevanje. Namesto addCut se uporabi ukaz addCommon.

# Izdelava preseka (ang. common)
moj_presek = model.addCommon(part_dokument,
                     [model.selection("SOLID", "Kocka")],
                     [model.selection("SOLID", "Krogla")])

Celotna koda je na voljo tukaj.

Primer: Zaokroževanje robov (ang. fillet)

V nadaljevanju je prikazan način za zaokrožitev vseh robov na primeru kocke. Celotna koda je na voljo tudi tukaj.

Image showing the result of makeFillet.py example.

"""
SALOME SHAPER modul:
Primer izdelave zaokrožitve vseh robov na primeru kocke.
"""

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
moj_part = model.addPart(partSet)
# Kreiranje objekta za dostop do pod-dokumenta, ki se nanaša na part
part_dokument = moj_part.document()
# Dodajanje kocke
kocka = model.addBox(part_dokument, 10, 10, 10)

# Objekt, ki vsebuje lastnosti modela
result = kocka.defaultResult()

# Raziskovalec oblik: robovi (EDGE)
shapeExplorer = GeomAPI_ShapeExplorer(result.shape(), GeomAPI_Shape.EDGE)

# Iteriranje skozi robove, dokler jih "raziskovalec robov" še najde
seznam_robov = []
while shapeExplorer.more():
    # Dodajanje najdenih robov na seznam
    izbor = model.selection(result, shapeExplorer.current().edge())
    seznam_robov.append(izbor)
    # Iteriranje na naslednji najden rob
    shapeExplorer.next()

# Definiranje radija zaokroževanja
radij = 2

# Izvedba zaokrožitve po vseh robovih v seznamu
zaokrozitev = model.addFillet(part_dokument, seznam_robov, radij)

# Zaključevanje in prikaz modela
model.do()
model.end()

Primer: Zaokroževanje robov, ki potekajo v smeri Z osi

V nadaljevanju je prikazan način za zaokrožitev le tistih robov, ki potekajo v smeri Z osi. GeomAPI_ShapeExplorer je tu bistvenega pomena in prikaže, kako se lahko is modela izlušči le tiste elemente, ki ustrezajo določenim pogojem.

Celotna koda je na voljo tudi tukaj.

Image showing the result of makeFillet_Z_aligned_edges.py example.

"""
SALOME SHAPER modul:
Primer izdelave zaokrožitve robov le robov, usmerjenih v smeri Z osi.
"""

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
moj_part = model.addPart(partSet)
# Kreiranje objekta za dostop do pod-dokumenta, ki se nanaša na part
part_dokument = moj_part.document()
# Dodajanje kocke
kocka = model.addBox(part_dokument, 10, 10, 10)

# Objekt, ki vsebuje lastnosti modela
result = kocka.defaultResult()

# Raziskovalec oblik: robovi (EDGE)
shapeExplorer = GeomAPI_ShapeExplorer(result.shape(), GeomAPI_Shape.EDGE)

# Iteriranje skozi robove, dokler jih "raziskovalec robov" še najde
seznam_robov = []
while shapeExplorer.more():
    # Objekt, ki vsebuje lastnosti geometrije trenutno najdenega robu
    rob = shapeExplorer.current().edge()
    # Objekt, ki se navezuje izbor robu na podlagi vmesnika (interface)
    izbor = model.selection(result, rob)

    # XYZ koordinate prve točke robu
    prva_tocka = [rob.firstPoint().x(),
                  rob.firstPoint().y(),
                  rob.firstPoint().z()]
    # XYZ koordinate druge točke robu
    druga_tocka = [rob.lastPoint().x(),
                   rob.lastPoint().y(),
                   rob.lastPoint().z()]

    # Primerjanje prve in druge točke robu. Robovi, ki potekajo v smeri Z osi
    # imajo enaki X in Y koordinati oz. se razlikujejo le po Z koordinati.
    # V primeru da je pogoj izpolnjen, naj program doda rob v naš seznam robov
    if prva_tocka[0] == druga_tocka[0] and \
       prva_tocka[1] == druga_tocka[1]:

        # Dodajanje najdenih robov na seznam
        seznam_robov.append(izbor)
    # Iteriranje na naslednji najden rob
    shapeExplorer.next()

# Definiranje radija zaokroževanja
radij = 2

# Izvedba zaokrožitve po vseh robovih v seznamu
zaokrozitev = model.addFillet(part_dokument, seznam_robov, radij)

# DODATNO:
# Ugotavljanje lastnosti roba na podlagi objekta, ki se navezuje na vmesnik
moj_izbrani_rob = seznam_robov[0]
# Dobimo par "result" in "subShape"
result_rob, subShape_rob = moj_izbrani_rob.resultSubShapePair()
# Objekt, ki definira rob
moj_rob = subShape_rob.edge()
# Izpis koordinat robu
print("Prva tocka izbranega robu: x=%.1f, y=%.1f, z=%.1f" % \
    (moj_rob.firstPoint().x(), moj_rob.firstPoint().y(), moj_rob.firstPoint().z()))
print("Druga tocka izbranega robu: x=%.1f, y=%.1f, z=%.1f" % \
    (moj_rob.lastPoint().x(), moj_rob.lastPoint().y(), moj_rob.lastPoint().z()))

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

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

Primer: Izluščevanje cilindričnih površin iz STEP modela

Celotna koda je na voljo tukaj.

Primer ukaza: izračun volumna modela

Spodaj je prikazan primer sintakse za pridobitev volumna modela s pomočjo knjižnice GeomAlgoAPI.

Definicija funkcije GeomAlgoAPI_ShapeTools.volume() je na voljo tukaj.

from GeomAlgoAPI import GeomAlgoAPI_ShapeTools  as ShapeTools

result = koncni_model.defaultResult() # Vrne objekt tipa ModelAPI.ModelAPI_Result
volumen = ShapeTools.volume(result.shape()))

Attachments (25)

Download all attachments as: .zip