diff --git a/README.md b/README.md index 9b1fdf2..7b725e6 100644 --- a/README.md +++ b/README.md @@ -38,16 +38,16 @@ my_mesh.addEntity(p3) # entities can also directly be added to a mesh: p4 = Entity.Point([0., 1., 0.], mesh=my_mesh) -# create lines -l1 = Entity.Line([p1, p2]) -l2 = Entity.Line([p2, p3]) -l3 = Entity.Line([p3, p4]) -l4 = Entity.Line([p4, p1]) +# create curves +l1 = Entity.Curve([p1, p2]) +l2 = Entity.Curve([p2, p3]) +l3 = Entity.Curve([p3, p4]) +l4 = Entity.Curve([p4, p1]) # entities can also be added in a batch my_mesh.addEntities([l1, l2, l3, l4]) -# create lineloop -ll1 = Entity.LineLoop([l1, l2, l3, l4], mesh=my_mesh) +# create curveloop +ll1 = Entity.CurveLoop([l1, l2, l3, l4], mesh=my_mesh) # create surface s1 = Entity.PlaneSurface([ll1], mesh=my_mesh) @@ -139,7 +139,7 @@ my_mesh.points[4] # <-- returns Point instance number 4 my_mesh.getPointsFromIndex(4) # <-- same as above my_mesh.getPointsFromIndex([1, 2, 3, 4]) # <-- returns list of Point instances # other functions -my_mesh.getLinesFromIndex(...) +my_mesh.getCurvesFromIndex(...) my_mesh.getSurfacesFromIndex(...) my_mesh.getSurfaceLoopsFromIndex(...) my_mesh.getVolumesFromIndex(...) @@ -149,7 +149,7 @@ my_mesh.getGroupsFromIndex(...) This can be used to create other entities, such as: ```python -ll1 = Entity.LineLoop(my_mesh.getLinesFromIndex([1,2,3,4])) +ll1 = Entity.CurveLoop(my_mesh.getCurvesFromIndex([1,2,3,4])) my_mesh.addEntity(ll1) ``` @@ -169,7 +169,7 @@ The geometry variable `my_geometry` must be an object (e.g. class) containing th |--------------|----------------|-----|----------------------------------------------------| | vertices | (np, 3) | no | array of point coordinates | | vertexFlags | (np) | yes | array of point physical group numbers | -| segments | (ns, 2) | yes | array of lines | +| segments | (ns, 2) | yes | array of curves | | segmentFlags | (ns) | yes | array of segment physical group numbers | | facets | (nf, nsf, npf) | yes | array of surfaces (loop of point numbers) | | facetFlags | (nf) | yes | array of facets physical groups | diff --git a/py2gmsh/Entity.py b/py2gmsh/Entity.py index 53f4f54..c5b043b 100644 --- a/py2gmsh/Entity.py +++ b/py2gmsh/Entity.py @@ -16,8 +16,8 @@ def __init__(self, nb=None, name=None, mesh=None): self.nb = nb self.name = name self.points = {} - self.lines = {} - self.lineloops = {} + self.curves = {} + self.curveloops = {} self.surfaces = {} self.surfaceloops = {} self.volumes = {} @@ -31,14 +31,14 @@ def addEntity(self, entity): Parameters ---------- entity: py2gmsh.Entity.Entity - Entity to add to group (e.g. Point, Line, LineLoop). + Entity to add to group (e.g. Point, Curve, CurveLoop). """ if isinstance(entity, Point): assert not self.points.get(entity.nb), 'Point nb '+str(entity.nb)+' already exists!' self.points[entity.nb] = entity - elif isinstance(entity, LineEntity): - assert not self.lines.get(entity.nb), 'Line nb '+str(entity.nb)+' already exists!' - self.lines[entity.nb] = entity + elif isinstance(entity, CurveEntity): + assert not self.curves.get(entity.nb), 'Curve nb '+str(entity.nb)+' already exists!' + self.curves[entity.nb] = entity elif isinstance(entity, SurfaceEntity): assert not self.surfaces.get(entity.nb), 'Surface nb '+str(entity.nb)+' already exists!' self.surfaces[entity.nb] = entity @@ -116,36 +116,36 @@ def _val2str(self): return '{'+str([v for v in self.xyz])[1:-1]+'}' -# LINES +# CURVES -class LineEntity(Entity): - """Parent class for all line type entities. +class CurveEntity(Entity): + """Parent class for all curve type entities. Parameters ---------- nb: Optional[int] Point number. If not set, it will use the class count number (incrementing automatically upon creation of new - lines). + curves). group: Optional[PhysicalGroup] Physical group of Entity. name: Optional[str] - Name of line. + Name of curve. mesh: Optional[py2gmsh.Mesh.Mesh] - Mesh of line. + Mesh of curve. """ def __init__(self, nb=None, group=None, name=None, mesh=None): - super(LineEntity, self).__init__(nb=nb, group=group, name=name, mesh=mesh) + super(CurveEntity, self).__init__(nb=nb, group=group, name=name, mesh=mesh) -class Line(LineEntity): - """Creates a Line. +class Curve(CurveEntity): + """Creates a Curve. Parameters ---------- points: array_like[Points] Points instances (array of length 2) nb: Optional[int] - LineEntity number. If not set, it will use the class count + CurveEntity number. If not set, it will use the class count number (incrementing automatically upon creation of new points). group: Optional[PhysicalGroup] @@ -154,9 +154,9 @@ class Line(LineEntity): Mesh of entity. """ def __init__(self, points, nb=None, group=None, index=False, mesh=None): - assert len(points) == 2, 'points array must be of length 2 when creating a line' + assert len(points) == 2, 'points array must be of length 2 when creating a curve' self.check_instance(points, Point, index, mesh) - super(Line, self).__init__(nb=nb, group=group, name='Line', mesh=mesh) + super(Curve, self).__init__(nb=nb, group=group, name='Curve', mesh=mesh) self.points = points self._index = index @@ -167,7 +167,10 @@ def _val2str(self): return '{'+str([v.nb for v in self.points])[1:-1]+'}' -class Circle(LineEntity): +Line = Curve + + +class Circle(CurveEntity): """Creates a Circle. Parameters @@ -179,7 +182,7 @@ class Circle(LineEntity): end: Point end point of circle arc. nb: Optional[int] - LineEntity number. If not set, it will use the class count + CurveEntity number. If not set, it will use the class count number (incrementing automatically upon creation of new points). group: Optional[PhysicalGroup] @@ -201,7 +204,7 @@ def _val2str(self): return '{'+str([self.start.nb, self.center.nb, self.end.nb])[1:-1]+'}' -class CatmullRom(LineEntity): +class CatmullRom(CurveEntity): def __init__(self, points, nb=None, group=None, index=False, mesh=None): self.check_instance(points, Point, index, mesh) super(Spline, self).__init__(nb=nb, group=group, name='CatmullRom', mesh=mesh) @@ -212,7 +215,7 @@ def _val2str(self): return '{'+str([v.nb for v in self.points])[1:-1]+'}' -class Ellipse(LineEntity): +class Ellipse(CurveEntity): def __init__(self, start, center, axis_point, end, nb=None, group=None, index=False, mesh=None): self.check_instance([start, center, acis_point, end], Point, index, mesh) super(Circle, self).__init__(nb=nb, group=group, name='Ellipse', mesh=mesh) @@ -226,7 +229,7 @@ def _val2str(self): return '{'+str([self.start, self.center, self.axis_point, self.end])[1:-1]+'}' -class BSpline(LineEntity): +class BSpline(CurveEntity): def __init__(self, points, nb=None, group=None, index=False, mesh=None): self.check_instance(points, Point, index, mesh) super(BSpline, self).__init__(nb=nb, group=group, name='BSpline', mesh=mesh) @@ -237,7 +240,7 @@ def _val2str(self): return '{'+str([v.nb for v in self.points])[1:-1]+'}' -class Spline(LineEntity): +class Spline(CurveEntity): def __init__(self, points, nb=None, group=None, index=False, mesh=None): self.check_instance(points, Point, index, mesh) super(Spline, self).__init__(nb=nb, group=group, name='Spline', mesh=mesh) @@ -248,47 +251,54 @@ def _val2str(self): return '{'+str([v.nb for v in self.points])[1:-1]+'}' -class CompoundLine(LineEntity): - def __init__(self, lines, nb=None, group=None, index=False, mesh=None): - self.check_instance(lines, Line, index, mesh) - super(Spline, self).__init__(nb=nb, group=group, name='Compound Line', mesh=mesh) - self.lines = lines +class CompoundCurve(CurveEntity): + def __init__(self, curves, nb=None, group=None, index=False, mesh=None): + self.check_instance(curves, Curve, index, mesh) + super(Spline, self).__init__(nb=nb, group=group, name='Compound Curve', mesh=mesh) + self.curves = curves self._index = index def _val2str(self): - return '{'+str([v.nb for v in self.lines])[1:-1]+'}' + return '{'+str([v.nb for v in self.curves])[1:-1]+'}' + + +CompoundLine = CompoundCurve -# LINE LOOPS +# CURVE LOOPS -class LineLoop(Entity): - def __init__(self, lines, nb=None, group=None, index=False, mesh=None): - self.check_instance(lines, Line, index, mesh) - super(LineLoop, self).__init__(nb=nb, group=group, name='Line Loop', mesh=mesh) - self.lines = lines +class CurveLoop(Entity): + def __init__(self, curves, nb=None, group=None, index=False, mesh=None): + self.check_instance(curves, Curve, index, mesh) + super(CurveLoop, self).__init__(nb=nb, group=group, name='Curve Loop', mesh=mesh) + self.curves = curves self._index = index - def setLines(self, lines): - self.lines[:] = [lines] + def setCurves(self, curves): + self.curves[:] = [curves] def _val2str(self): ll = [] if self._index is False: - for i, line in enumerate(self.lines): - if self.lines[i-1].points[1] == self.lines[i].points[0]: - ll += [self.lines[i].nb] - elif self.lines[i-1].points[1] == self.lines[i].points[1]: - ll += [-self.lines[i].nb] - elif self.lines[i-1].points[0] == self.lines[i].points[0]: - ll += [self.lines[i].nb] - elif self.lines[i-1].points[0] == self.lines[i].points[1]: - ll += [-self.lines[i].nb] + for i, curve in enumerate(self.curves): + if self.curves[i-1].points[1] == self.curves[i].points[0]: + ll += [self.curves[i].nb] + elif self.curves[i-1].points[1] == self.curves[i].points[1]: + ll += [-self.curves[i].nb] + elif self.curves[i-1].points[0] == self.curves[i].points[0]: + ll += [self.curves[i].nb] + elif self.curves[i-1].points[0] == self.curves[i].points[1]: + ll += [-self.curves[i].nb] else: - assert 2<3, 'lineloop is wrong' + assert 2<3, 'curveloop is wrong' else: - ll = self.lines + ll = self.curves return '{'+str(ll)[1:-1]+'}' + +Curveloop = CurveLoop + + # SURFACES class SurfaceEntity(Entity): @@ -300,31 +310,31 @@ def __init__(self, nb=None, group=None, name=None, mesh=None): class PlaneSurface(SurfaceEntity): - def __init__(self, lineloops, nb=None, group=None, index=False, mesh=None): - self.check_instance(lineloops, LineLoop, index, mesh) + def __init__(self, curveloops, nb=None, group=None, index=False, mesh=None): + self.check_instance(curveloops, CurveLoop, index, mesh) super(PlaneSurface, self).__init__(nb=nb, group=group, name='Plane Surface', mesh=mesh) - self.lineloops = lineloops + self.curveloops = curveloops self._index = index - def setLineLoops(self, lineloops): - self.lineloops[:] = [lineloops] + def setCurveLoops(self, curveloops): + self.curveloops[:] = [curveloops] def _val2str(self): - return '{'+str([v.nb for v in self.lineloops])[1:-1]+'}' + return '{'+str([v.nb for v in self.curveloops])[1:-1]+'}' class RuledSurface(SurfaceEntity): - def __init__(self, lineloops, nb=None, group=None, sphere=None, mesh=None): - self.check_instance(lineloops, LineLoop, index, mesh) + def __init__(self, curveloops, nb=None, group=None, sphere=None, mesh=None): + self.check_instance(curveloops, CurveLoop, index, mesh) super(RuledSurface, self).__init__(nb=nb, group=group, name='Ruled Surface', mesh=mesh) - self.lineloops = lineloops + self.curveloops = curveloops self.Sphere = sphere - def setLineLoops(self, lineloops): - self.lineloops[:] = [lineloops] + def setCurveLoops(self, curveloops): + self.curveloops[:] = [curveloops] def _val2str(self): - return '{'+str([v.nb for v in self.lineloops])[1:-1]+'}' + return '{'+str([v.nb for v in self.curveloops])[1:-1]+'}' class CompoundSurface(SurfaceEntity): diff --git a/py2gmsh/Mesh.py b/py2gmsh/Mesh.py index 22e3225..d1fdea3 100644 --- a/py2gmsh/Mesh.py +++ b/py2gmsh/Mesh.py @@ -6,10 +6,10 @@ class Mesh: def __init__(self): self.points = {} self.points_count = 0 - self.lines = {} - self.lines_count = 0 - self.lineloops = {} - self.lineloops_count = 0 + self.curves = {} + self.curves_count = 0 + self.curveloops = {} + self.curveloops_count = 0 self.surfaces = {} self.surfaces_count = 0 self.surfaceloops = {} @@ -35,13 +35,13 @@ def getPointsFromIndex(self, index): points += [self.points[i]] return points - def getLinesFromIndex(self, index): + def getCurvesFromIndex(self, index): if isinstance(index, int): index = [index] - lines = [] + curves = [] for i in index: - lines += [self.lines[i]] - return lines + curves += [self.curves[i]] + return curves def getSurfacesFromIndex(self, index): if isinstance(index, int): @@ -90,18 +90,18 @@ def addEntity(self, entity): entity.nb = self.points_count assert not self.points.get(entity.nb), 'Point nb '+str(entity.nb)+' already exists!' self.points[entity.nb] = entity - elif isinstance(entity, ent.LineEntity): + elif isinstance(entity, ent.CurveEntity): if entity.nb is None: - self.lines_count += 1 - entity.nb = self.lines_count - assert not self.lines.get(entity.nb), 'Line nb '+str(entity.nb)+' already exists!' - self.lines[entity.nb] = entity - elif isinstance(entity, ent.LineLoop): + self.curves_count += 1 + entity.nb = self.curves_count + assert not self.curves.get(entity.nb), 'Curve nb '+str(entity.nb)+' already exists!' + self.curves[entity.nb] = entity + elif isinstance(entity, ent.CurveLoop): if entity.nb is None: - self.lineloops_count += 1 - entity.nb = self.lineloops_count - assert not self.lineloops.get(entity.nb), 'LineLoop nb '+str(entity.nb)+' already exists!' - self.lineloops[entity.nb] = entity + self.curveloops_count += 1 + entity.nb = self.curveloops_count + assert not self.curveloops.get(entity.nb), 'CurveLoop nb '+str(entity.nb)+' already exists!' + self.curveloops[entity.nb] = entity elif isinstance(entity, ent.SurfaceEntity): if entity.nb is None: self.surfaces_count += 1 @@ -156,9 +156,9 @@ def writeGeo(self, filename): geo = open(filename,'w') for key, entity in self.points.items(): geo.write("{0}({1}) = {2};\n".format(entity.name, key, entity._val2str())) - for key, entity in self.lines.items(): + for key, entity in self.curves.items(): geo.write("{0}({1}) = {2};\n".format(entity.name, key, entity._val2str())) - for key, entity in self.lineloops.items(): + for key, entity in self.curveloops.items(): geo.write("{0}({1}) = {2};\n".format(entity.name, key, entity._val2str())) for key, entity in self.surfaces.items(): geo.write("{0}({1}) = {2};\n".format(entity.name, key, entity._val2str())) @@ -179,11 +179,11 @@ def writeGeo(self, filename): for key, point in group.points.items(): points.append(point.nb) geo.write("Physical Point({0}) = {{{1}}};\n".format(name, str(points)[1:-1])) - if group.lines: - lines = [] - for key, line in group.lines.items(): - lines.append(line.nb) - geo.write("Physical Line({0}) = {{{1}}};\n".format(name, str(lines)[1:-1])) + if group.curves: + curves = [] + for key, curve in group.curves.items(): + curves.append(curve.nb) + geo.write("Physical Curve({0}) = {{{1}}};\n".format(name, str(curves)[1:-1])) if group.surfaces: surfaces = [] for key, surface in group.surfaces.items(): @@ -241,7 +241,7 @@ def write_option(class_instance): def geometry2mesh(domain): - lines_dict = {} + curves_dict = {} mesh = Mesh() @@ -261,11 +261,11 @@ def geometry2mesh(domain): g.addEntity(p) nb_points = i+1 for i in range(nb_points): - lines_dict[i] = {} + curves_dict[i] = {} for i, s in enumerate(domain.segments): - lines_dict[s[0]][s[1]] = i - l = ent.Line([mesh.points[s[0]+1], mesh.points[s[1]+1]]) + curves_dict[s[0]][s[1]] = i + l = ent.Curve([mesh.points[s[0]+1], mesh.points[s[1]+1]]) mesh.addEntity(l) g = mesh.groups.get(domain.segmentFlags[i]) if g: @@ -273,24 +273,26 @@ def geometry2mesh(domain): for i, f in enumerate(domain.facets): if domain.nd == 3 or (domain.nd == 2 and i not in domain.holes_ind): - lineloops = [] + curveloops = [] for j, subf in enumerate(f): - lineloop = [] + curveloop = [] # vertices in facet for k, ver in enumerate(subf): - if ver in lines_dict[subf[k-1]].keys(): - lineloop += [lines_dict[subf[k-1]][ver]+1] - elif subf[k-1] in lines_dict[ver].keys(): + if ver in curves_dict[subf[k-1]].keys(): + curveloop += [curves_dict[subf[k-1]][ver]+1] + elif subf[k-1] in curves_dict[ver].keys(): # reversed - lineloop += [(lines_dict[ver][subf[k-1]]+1)] + curveloop += [(curves_dict[ver][subf[k-1]]+1)] else: - l = ent.Line([mesh.points[subf[k-1]+1], mesh.points[ver+1]]) + l = ent.Curve([mesh.points[subf[k-1]+1], mesh.points[ver+1]]) mesh.addEntity(l) - lineloop += [l.nb] - ll = ent.LineLoop(mesh.getLinesFromIndex(lineloop)) + curves_dict[ver][subf[k-1]] = l.nb-1 + curves_dict[subf[k-1]][ver] = l.nb-1 + curveloop += [l.nb] + ll = ent.CurveLoop(mesh.getCurvesFromIndex(curveloop)) mesh.addEntity(ll) - lineloops += [ll.nb] - s = ent.PlaneSurface([mesh.lineloops[loop] for loop in lineloops]) + curveloops += [ll.nb] + s = ent.PlaneSurface([mesh.curveloops[loop] for loop in curveloops]) mesh.addEntity(s) g = mesh.groups.get(domain.facetFlags[i]) if g: @@ -309,4 +311,5 @@ def geometry2mesh(domain): if g: g.addEntity(vol) + print("CREATED") return mesh diff --git a/setup.py b/setup.py index faa800f..51a3511 100644 --- a/setup.py +++ b/setup.py @@ -6,14 +6,14 @@ setup(name='py2gmsh', packages=['py2gmsh'], - version='3.0.6.3', + version='4.2.3.0', description='Python wrappers to gmsh files with object-oriented syntax', long_description=long_description, long_description_content_type='text/markdown', author='Tristan de Lataillade', author_email='delataillade.tristan@gmail.com', url='https://github.com/tridelat/py2gmsh', - download_url='https://github.com/tridelat/py2gmsh/tarball/v3.0.6.3', + download_url='https://github.com/tridelat/py2gmsh/tarball/v4.2.3.0', keywords=['gmsh', 'wrapper', 'mesh', 'python', 'api'], classifiers=["Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License",