This page was generated from unit-4.4-occ/bottle.ipynb.

4.4.1 OpenCascade Bottle-tutorial

Please consult the OCCT - documentation for more explanations:

https://dev.opencascade.org/doc/overview/html/occt__tutorial.html

[1]:
from netgen.occ import *
from netgen.webgui import Draw as DrawGeo
[2]:
myHeight = 70
myWidth = 50
myThickness = 30
[3]:
pnt1 = Pnt(-myWidth / 2., 0, 0);
pnt2 = Pnt(-myWidth / 2., -myThickness / 4., 0);
pnt3 = Pnt(0, -myThickness / 2., 0);
pnt4 = Pnt(myWidth / 2., -myThickness / 4., 0);
pnt5 = Pnt(myWidth / 2., 0, 0);
[4]:
seg1 = Segment(pnt1, pnt2)
arc = ArcOfCircle(pnt2, pnt3, pnt4)
seg2 = Segment(pnt4, pnt5)
[5]:
wire = Wire ([seg1, arc, seg2])
mirrored_wire = wire.Mirror(Axis((0,0,0), X))
w = Wire([wire, mirrored_wire])
[6]:
f = Face (w)
body = f.Extrude( myHeight*Z )
[7]:
body = body.MakeFillet (body.edges, myThickness / 12.)
DrawGeo (body);
[8]:
from ngsolve import Mesh
from ngsolve.webgui import Draw
[9]:
geo = OCCGeometry(body)
mesh = Mesh(geo.GenerateMesh(maxh=5))
retry Surface 10
retry Surface 12
retry Surface 14
retry Surface 15
retry Surface 27
retry Surface 29
retry Surface 31
retry Surface 32
[10]:
Draw (mesh);

Adding the neck:

[11]:
neckax = Axes(body.faces.Max(Z).center, Z)
[12]:
myNeckRadius = myThickness / 4.
myNeckHeight = myHeight / 10
neck = Cylinder(neckax, myNeckRadius, myNeckHeight);
[13]:
body = body+neck
DrawGeo (body);
[14]:
mesh = Mesh(OCCGeometry(body).GenerateMesh(maxh=5))
Draw (mesh);
retry Surface 10
retry Surface 12
retry Surface 14
retry Surface 15
retry Surface 28
retry Surface 30
retry Surface 32
retry Surface 33

find face with maximal z-coordinate:

[15]:
fmax = body.faces.Max(Z)
thickbody = body.MakeThickSolid([fmax], -myThickness / 50, 1.e-3)
DrawGeo (thickbody);
[16]:
mesh = Mesh(OCCGeometry(thickbody).GenerateMesh(maxh=3))
Draw (mesh);
retry Surface 3
loclines.Size = 1
retry Surface 5
retry Surface 10
loclines.Size = 1
retry Surface 13
loclines.Size = 1
retry Surface 14
retry Surface 19
loclines.Size = 1
retry Surface 22
retry Surface 35
retry Surface 37
retry Surface 39
retry Surface 40
retry Surface 53
retry Surface 55
retry Surface 57
retry Surface 58
retry Surface 62

Defining the threading

[17]:
cyl1 = Cylinder(neckax, myNeckRadius * 0.99, 1).faces[0]
cyl2 = Cylinder(neckax, myNeckRadius * 1.05, 1).faces[0]
[18]:
import math
aPnt = Pnt(2.*math.pi, myNeckHeight / 2.)
aDir = Dir( 2.*math.pi, myNeckHeight / 4. )
anAx2d = gp_Ax2d(aPnt, aDir)
[19]:
aMajor = 2. * math.pi
aMinor = myNeckHeight / 10
arc1 = Ellipse(anAx2d, aMajor, aMinor).Trim(0, math.pi)
arc2 = Ellipse(anAx2d, aMajor, aMinor/4).Trim(0, math.pi)
[20]:
seg = Segment(arc1.start, arc1.end)
[21]:
wire1 = Wire( [Edge(arc1, cyl1), Edge(seg, cyl1)] )
wire2 = Wire( [Edge(arc2, cyl2), Edge(seg, cyl2)] )
[22]:
threading = ThruSections ([wire1, wire2])
[23]:
res = thickbody+threading
DrawGeo (res);
[24]:
mesh = Mesh(OCCGeometry(res).GenerateMesh(maxh=3))
Draw (mesh);
divide edge: local h too small
CORRECTED
retry Surface 10
retry Surface 12
loclines.Size = 1
retry Surface 14
retry Surface 15
retry Surface 28
retry Surface 30
loclines.Size = 1
retry Surface 32
loclines.Size = 1
retry Surface 33
retry Surface 47
retry Surface 50
retry Surface 52
retry Surface 55
retry Surface 67
retry Surface 69
retry Surface 70
retry Surface 71
[ ]: