diff --git a/volmdlr/core.py b/volmdlr/core.py old mode 100644 new mode 100755 index 3161ef999..05c4c611d --- a/volmdlr/core.py +++ b/volmdlr/core.py @@ -13,7 +13,7 @@ from functools import lru_cache from typing import List, Tuple -# import gmsh +import gmsh import matplotlib.pyplot as plt import numpy as npy @@ -1391,11 +1391,11 @@ def frame_mapping_inplace(self, frame: volmdlr.Frame3D, side: str): primitives.frame_mapping_inplace(frame, side) self.bounding_box = self._bounding_box() - def copy(self, deep=True, memo=None): + def copy(self): """ Specific copy. """ - new_primitives = [primitive.copy(deep=deep, memo=memo) for primitive in self.primitives] + new_primitives = [primitive.copy() for primitive in self.primitives] return VolumeModel(new_primitives, self.name) def plot2d(self, ax=None, color=None): @@ -2044,91 +2044,90 @@ def to_msh(self, mesh_dimension: int, # gmsh.finalize() - # @staticmethod - # def generate_msh_file(file_name, mesh_dimension): - # """ - # Generates a mesh written in a .msh file using GMSH library. - # - # :param file_name: DESCRIPTION - # :type file_name: TYPE - # :param mesh_dimension: DESCRIPTION - # :type mesh_dimension: TYPE - # :return: DESCRIPTION - # :rtype: TYPE - # - # """ - # - # gmsh.initialize() - # gmsh.open(file_name + ".geo") - # - # gmsh.model.geo.synchronize() - # gmsh.model.mesh.generate(mesh_dimension) - # - # gmsh.write(file_name + ".msh") - # - # gmsh.finalize() - # - # def to_msh_stream(self, mesh_dimension: int, - # factor: float, stream: dcf.StringFile, - # file_name: str = '', **kwargs): - # """ - # Gets .msh file for the VolumeModel generated by gmsh. - # - # :param file_name: The msh. file name - # :type file_name: str - # :param mesh_dimension: The mesh dimension (1: 1D-Edge, 2: 2D-Triangle, 3D-Tetrahedra) - # :type mesh_dimension: int - # :param factor: A float, between 0 and 1, that describes the mesh quality - # (1 for coarse mesh - 0 for fine mesh) - # :type factor: float - # :param curvature_mesh_size: Activate the calculation of mesh element sizes based on curvature - # (with curvature_mesh_size elements per 2*Pi radians), defaults to 0 - # :type curvature_mesh_size: int, optional - # :param min_points: Check if there are enough points on small edges (if it is not, we force to have min_points - # on that edge), defaults to None - # :type min_points: int, optional - # :param initial_mesh_size: If factor=1, it will be initial_mesh_size elements per dimension, defaults to 5 - # :type initial_mesh_size: float, optional - # - # :return: A txt file - # :rtype: .txt - # """ - # - # for element in [('curvature_mesh_size', 0), ('min_points', None), ('initial_mesh_size', 5)]: - # if element[0] not in kwargs: - # kwargs[element[0]] = element[1] - # - # if file_name == '': - # with tempfile.NamedTemporaryFile(delete=False) as file: - # file_name = file.name - # - # self.to_geo(file_name=file_name, - # factor=factor, - # curvature_mesh_size=kwargs['curvature_mesh_size'], - # min_points=kwargs['min_points'], - # initial_mesh_size=kwargs['initial_mesh_size']) - # - # gmsh.initialize() - # gmsh.open(file_name + ".geo") - # - # gmsh.model.geo.synchronize() - # gmsh.model.mesh.generate(mesh_dimension) - # - # lines = [] - # lines.append('$MeshFormat') - # lines.append('4.1 0 8') - # lines.append('$EndMeshFormat') - # - # lines.extend(self.get_nodes_lines(gmsh)) - # lines.extend(self.get_elements_lines(gmsh)) - # - # content = '' - # for line in lines: - # content += line + '\n' - # - # stream.write(content) - # - # # gmsh.finalize() + @staticmethod + def generate_msh_file(file_name, mesh_dimension): + """ + Generates a mesh written in a .msh file using GMSH library. + + :param file_name: DESCRIPTION + :type file_name: TYPE + :param mesh_dimension: DESCRIPTION + :type mesh_dimension: TYPE + :return: DESCRIPTION + :rtype: TYPE + """ + + gmsh.initialize() + gmsh.open(file_name + ".geo") + + gmsh.model.geo.synchronize() + gmsh.model.mesh.generate(mesh_dimension) + + gmsh.write(file_name + ".msh") + + gmsh.finalize() + + def to_msh_stream(self, mesh_dimension: int, + factor: float, stream: dcf.StringFile, + file_name: str = '', **kwargs): + """ + Gets .msh file for the VolumeModel generated by gmsh. + + :param file_name: The msh. file name + :type file_name: str + :param mesh_dimension: The mesh dimension (1: 1D-Edge, 2: 2D-Triangle, 3D-Tetrahedra) + :type mesh_dimension: int + :param factor: A float, between 0 and 1, that describes the mesh quality + (1 for coarse mesh - 0 for fine mesh) + :type factor: float + :param curvature_mesh_size: Activate the calculation of mesh element sizes based on curvature + (with curvature_mesh_size elements per 2*Pi radians), defaults to 0 + :type curvature_mesh_size: int, optional + :param min_points: Check if there are enough points on small edges (if it is not, we force to have min_points + on that edge), defaults to None + :type min_points: int, optional + :param initial_mesh_size: If factor=1, it will be initial_mesh_size elements per dimension, defaults to 5 + :type initial_mesh_size: float, optional + + :return: A txt file + :rtype: .txt + """ + + for element in [('curvature_mesh_size', 0), ('min_points', None), ('initial_mesh_size', 5)]: + if element[0] not in kwargs: + kwargs[element[0]] = element[1] + + if file_name == '': + with tempfile.NamedTemporaryFile(delete=False) as file: + file_name = file.name + + self.to_geo(file_name=file_name, + factor=factor, + curvature_mesh_size=kwargs['curvature_mesh_size'], + min_points=kwargs['min_points'], + initial_mesh_size=kwargs['initial_mesh_size']) + + gmsh.initialize() + gmsh.open(file_name + ".geo") + + gmsh.model.geo.synchronize() + gmsh.model.mesh.generate(mesh_dimension) + + lines = [] + lines.append('$MeshFormat') + lines.append('4.1 0 8') + lines.append('$EndMeshFormat') + + lines.extend(self.get_nodes_lines(gmsh)) + lines.extend(self.get_elements_lines(gmsh)) + + content = '' + for line in lines: + content += line + '\n' + + stream.write(content) + + # gmsh.finalize() def to_msh_file(self, mesh_dimension: int, factor: float, file_name: str = '', **kwargs): diff --git a/volmdlr/wires.py b/volmdlr/wires.py index 1757b28b8..5d0d79428 100644 --- a/volmdlr/wires.py +++ b/volmdlr/wires.py @@ -1669,6 +1669,10 @@ def copy(self, deep=True, memo=None): def __hash__(self): return hash(tuple(self.primitives)) + def copy(self): + return self.__class__(primitives=[p.copy() for p in self.primitives], + name=self.name) + def __eq__(self, other_): if id(self) == id(other_): return True