mirror_mesh Module

This file defines:
  • model, nid_offset, eid_offset = bdf_mirror(bdf_filename, plane=’xz’)

  • model, nid_offset, eid_offset = write_bdf_symmetric(

    bdf_filename, out_filename=None, encoding=None, size=8, is_double=False, enddata=None, close=True, plane=’xz’)

pyNastran.bdf.mesh_utils.mirror_mesh.__mirror_elements(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, nid_offset: int, eid_offset: int, cid_offset: int, plane: str = 'xz') → None[source]

mirrors model.elements

pyNastran.bdf.mesh_utils.mirror_mesh.__mirror_masses(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, nid_offset: int, eid_offset: int) → None[source]

mirrors model.masses

pyNastran.bdf.mesh_utils.mirror_mesh.__mirror_mpcs(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, nid_offset: int) → None[source]

mirrors model.rigid_elements

pyNastran.bdf.mesh_utils.mirror_mesh.__mirror_rigid_elements(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, nid_offset: int, eid_offset: int) → None[source]

mirrors model.rigid_elements

pyNastran.bdf.mesh_utils.mirror_mesh._asymmetrically_mirror_coords(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, cids_nominal_set: Set[int], cid_offset: int, plane: str = 'xz') → None[source]

we’ll leave i the same, flip j, and invert k

pyNastran.bdf.mesh_utils.mirror_mesh._asymmetrically_mirror_coords2(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, cids_nominal_set: Set[int], cid_offset: int, plane: str = 'xz') → None[source]

We’ll invert i, but not j, which will invert k.

This will allow us to mirror material coordinate systems (defined in x). Additionally, we can mirror CGAP coordinate systems (defined in x) as well as some arbitrary y-direction. We’ll try to make y look mirrored.

pyNastran.bdf.mesh_utils.mirror_mesh._get_cid_offset(model: pyNastran.bdf.bdf.BDF, use_cid_offset: bool) → int[source]
pyNastran.bdf.mesh_utils.mirror_mesh._get_eid_offset(model: pyNastran.bdf.bdf.BDF, use_eid_offset: bool) → int[source]
pyNastran.bdf.mesh_utils.mirror_mesh._mirror_aero(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, nid_offset: int, plane: str = 'xz') → None[source]

Mirrors the aero cards

Considers:
  • AEROS

  • doesn’t consider sideslip

  • CAERO1

  • doesn’t consider sideslip

  • considers Cp

  • considers lchord/lspan/nchord/nspan

  • SPLINE1 - handle boxes

  • SET1 - handle nodes

  • AELIST - handle boxes

  • AESURF - only supports names of length 7 or less (appends an M to the name) - handles AELIST - doesn’t handle coords well - doesn’t handle second AESURF

Doesnt consider:
  • AERO

  • AEFORCE

  • AEPRES

  • CAERO2/3/4/5

  • PAERO1/2/3/4/5

  • AESURFS

pyNastran.bdf.mesh_utils.mirror_mesh._mirror_elements(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, nid_offset: int, use_eid_offset: bool = True, plane: str = 'xz') → int[source]

Mirrors the elements

Parameters
modelBDF

the base model

modelBDF

the mirrored model

mirror_modelBDF

the mirrored model

nid_offsetint

the node id offset

use_eid_offsetbool; default=True

what is this for???

elements:
0dCELAS1, CELAS2, CELAS3, CELAS4, CDAMP1, CDAMP2, CDAMP3, CDAMP4, CDAMP5

CFAST, CBUSH, CBUSH1D

1d: CROD, CONROD, CTUBE, CBAR, CBEAM, CBEAM3 2d : CTRIA3, CQUAD4, CTRIA6, CQUAD8, CQUAD, CTRIAR, CQUADR 3d : ??? missing : CVISC, CTRIAX, CTRIAX6, CQUADX, CQUADX8, CCONEAX

rigid_elements:

loaded: RBE2, RBE3, RBAR missing: RBAR1

mass_elements:

loaded: CONM2 missing CONM1, CMASS1, CMASS2, CMASS3, CMASS4

plotels:

loaded: PLOTEL missing: ???

Notes

Doesn’t handle CBAR/CBEAM offsets Doesn’t handle CBEAM SPOINTs Do I need to invert the solids?

pyNastran.bdf.mesh_utils.mirror_mesh._mirror_loads(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, nid_offset: int = 0, eid_offset: int = 0) → None[source]

Mirrors the loads. A mirrored force acts in the same direction.

Considers:
  • PLOAD4
    • no coordinate systems (assumes cid=0)

  • FORCE, FORCE1, FORCE2, MOMENT, MOMENT1, MOMENT2

  • PLOAD, PLOAD2

  • TEMP, QVOL, QHBDY, QBDY1, QBDY2, QBDY3

pyNastran.bdf.mesh_utils.mirror_mesh._mirror_nodes(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, plane: str = 'xz') → Tuple[int, str][source]

Mirrors the GRIDs

Warning

doesn’t consider coordinate systems; it could, but you’d need 20 new coordinate systems

Warning

doesn’t mirror SPOINTs, EPOINTs

pyNastran.bdf.mesh_utils.mirror_mesh._mirror_nodes_plane(model: pyNastran.bdf.bdf.BDF, mirror_model: pyNastran.bdf.bdf.BDF, plane: Any, use_nid_offset: bool = True) → Tuple[int, str][source]

Mirrors the GRIDs about an arbitrary plane

Parameters
modelBDF

the original geometry

mirror_modelBDF

the location of the new geometry

plane(3,3) float ndarray

3 vectors that defines the origin, zaxis and xzplane; same as a CORD2R

use_nid_offsetbool

should the node offset be applied

Returns
nid_offsetint

the node id offset

planestr

the sorted plane; ZX -> xz

Warning

doesn’t consider coordinate systems; it could, but you’d need 20 new coordinate systems

Warning

doesn’t mirror SPOINTs, EPOINTs ..

https://mathinsight.org/distance_point_plane
pyNastran.bdf.mesh_utils.mirror_mesh._plane_to_iy(plane: str) → Tuple[int, str][source]

gets the index fo the mirror plane

pyNastran.bdf.mesh_utils.mirror_mesh.bdf_mirror(bdf_filename: Union[str, pyNastran.bdf.bdf.BDF], plane: str = 'xz', log=None, debug: bool = True)[source]

Mirrors the model about the symmetry plane

Parameters
bdf_filenamestr / BDF()

str : the bdf filename BDF : the BDF model object

planestr; {‘xy’, ‘yz’, ‘xz’}; default=’xz’

the plane to mirror about xz : +y/-y yz : +x/-x xy : +z/-z

Returns
modelBDF()

BDF : the BDF model object

nid_offsetint

the offset node id

eid_offsetint

the offset element id

pyNastran.bdf.mesh_utils.mirror_mesh.bdf_mirror_plane(bdf_filename: Union[str, pyNastran.bdf.bdf.BDF], plane: Any, mirror_model=None, log=None, debug: bool = True, use_nid_offset: bool = True)[source]

mirrors a model about an arbitrary plane

pyNastran.bdf.mesh_utils.mirror_mesh.write_bdf_symmetric(bdf_filename: Union[str, pyNastran.bdf.bdf.BDF], out_filename=None, encoding=None, size: int = 8, is_double: bool = False, enddata: Optional[bool] = None, close: bool = True, plane: str = 'xz', log=None)[source]

Mirrors the model about the symmetry plane

Parameters
bdf_filenamestr / BDF()

str : the bdf filename BDF : the BDF model object

out_filenamevaries; default=None

str - the name to call the output bdf file - a file object StringIO() - a StringIO object None - pops a dialog

encodingstr; default=None -> system specified encoding

the unicode encoding latin1, and utf8 are generally good options

sizeint; {8, 16}

the field size

is_doublebool; default=False

False : small field True : large field

enddatabool; default=None

bool - enable/disable writing ENDDATA None - depends on input BDF

closebool; default=True

should the output file be closed

planestr; {‘xy’, ‘yz’, ‘xz’}; default=’xz’

the plane to mirror about xz : +y/-y yz : +x/-x xy : +z/-z

Returns
modelBDF()

BDF : the BDF model object

nid_offsetint

the offset node id

eid_offsetint

the offset element id

Notes

Updates the BDF object to be symmetric
  • see bdf_mirror if you don’t want to write the model

Doesn’t equivalence nodes on the centerline.

Considers
  • nodes : GRID

  • elements, rigid_elements, mass_elements : see _mirror_elements

  • loads : see _mirror_loads

  • aero cards : see _mirror_aero