Please consult the OCCT - documentation for more explanations:

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

[10]:

Draw (mesh);


[11]:

neckax = Axes(body.faces.Max(Z).center, Z)

[12]:

myNeckRadius = myThickness / 4.
myNeckHeight = myHeight / 10

[13]:

body = body+neck
DrawGeo (body);

[14]:

mesh = Mesh(OCCGeometry(body).GenerateMesh(maxh=5))
Draw (mesh);


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


[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. )

[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);

[ ]: