Source code for Parts.GeometryBuilder

""" Module contains helper functions to build microtubules, centrosomes
and interMT connectors"""
from abaqus import *
from abaqusConstants import *
import section
import regionToolset
import part
import material
import sketch


[docs]def create_MT_part( l, type, i, **kwargs ): """ Create an Abaqus object representing a single microtubule part :param l: Length of the microtuble :type l: float :param type: Type of the MT: aMT or ipMT :type type: str :param i: sequential number of the MT :type i: str :param kwargs: model parameters :type kwargs: dict :return: part object, MTname :rtype: object, str """ modelname = kwargs['modelname'] s = mdb.models[modelname].ConstrainedSketch( name='__profile__', sheetSize=1.0) g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints s.sketchOptions.setValues(decimalPlaces=3) s.setPrimaryObject(option=STANDALONE) # create line s.Line(point1=(0.0, 0.0), point2=(l, 0.0)) # create a name for MT MTname = create_mt_name(l, type, i) # Create part p = mdb.models[modelname].Part( name=MTname, dimensionality=THREE_D, type=DEFORMABLE_BODY) p = mdb.models[modelname].parts[MTname] p.BaseWire(sketch=s) s.unsetPrimaryObject() del mdb.models[modelname].sketches['__profile__'] return p, MTname
[docs]def create_connector_part( connectorname, length, **kwargs ): """ Create an Abaqus object that represents a single connector part :param connectorname: Name of the connector :type connectorname: str :param length: Length of the connector :type length: float :param kwargs: model parameters :type kwargs: dict :return: Part object :rtype: object """ modelname = kwargs['modelname'] s = mdb.models[modelname].ConstrainedSketch( name='__profile__', sheetSize=1) g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints s.sketchOptions.setValues(decimalPlaces=4) s.setPrimaryObject(option=STANDALONE) # create line s.Line(point1=(0.0, 0.0), point2=(0.0, length)) p = mdb.models[modelname].Part( name=connectorname, dimensionality=THREE_D, type=DEFORMABLE_BODY) p = mdb.models[modelname].parts[connectorname] p.BaseWire(sketch=s) s.unsetPrimaryObject() del mdb.models[modelname].sketches['__profile__'] return p
[docs]def create_centrosome_sketch( l, r, **kwargs ): """ Create a 2D sketch of the centrosome middle cross-section :param l: Length of the centrosome, e.g., dimension along z axis :type l: float :param r: Radius of the centrosome, e.g., radius of the centrosome cross-section in x-y plane :type r: float :param kwargs: model parameters :type kwargs: dict :return: Sketch object :rtype: object """ modelname = kwargs['modelname'] s = mdb.models[modelname].ConstrainedSketch( name='__profile__', sheetSize=2.0) g, v, d, c = s.geometry, s.vertices, s.dimensions, s.constraints # Create cross-sectoion s.setPrimaryObject(option=STANDALONE) # Define an axis of revolution s.ConstructionLine(point1=(0.0, -1.0), point2=(0.0, 1.0)) # Create a revolution sketch s.FixedConstraint(entity=g[2]) s.Arc3Points(point1=(0.0, r), point2=(0.0, -r), point3=(l / 2, 0.0)) s.Line(point1=(0.0, -r), point2=(0.0, r)) s.VerticalConstraint(entity=g[4], addUndoState=False) return s
[docs]def create_mt_name( l, type, i ): """ Specify a unique name to each created microtubule :param l: Length of the MT :type l: float :param type: Type of the MT: aMT or ipMT :type type: str :param i: sequential number of the MT :type i: int :return: MTname :rtype: str """ if type == 'ipMT': MTname = 'ipMT_' + str(l * 100)[:3] + '_' + str(i) print(MTname) elif type == 'aMT': MTname = 'aMT_' + str(i) else: raise ValueError('Only interpolar MTs (ipMT) and astral MTs (aMT) are currently supported') return MTname
[docs]def create_section( sectionName, sectionProfile, sectionMaterial, **kwargs ): """ Create a beam section for the microtubule :param sectionName: Name of the section. 'MT-section' :type sectionName: str :param sectionProfile: Type of the section profile. 'MT-profile' :type sectionProfile: str :param sectionMaterial: Name of the material assigned to the section. 'MT_material' :type sectionMaterial: str :param kwargs: model parameters :type kwargs: dict :return: Null :rtype: Null """ modelname = kwargs['modelname'] mdb.models[modelname].BeamSection( name=sectionName, integration=DURING_ANALYSIS, poissonRatio=0.0, profile=sectionProfile, material=sectionMaterial, temperatureVar=LINEAR, consistentMassMatrix=False)
[docs]def define_material( name, E, nu, **kwargs ): """ Define material parameters of microtubules, connectors and centrosomes specifying its module of elasticity and Poisson's ratio :param name: Name of the material :type name: str :param E: Module of elasticity :type E: float :param nu: Poisson's ratio :type nu: float :param kwargs: model parameters :type kwargs: dict :return: Null :rtype: Null """ modelname = kwargs['modelname'] mdb.models[modelname].Material(name=name) mdb.models[modelname].materials[name].Elastic(table=((E, nu),))
[docs]def assign_MT_section( part, MTname, **kwargs ): """ Assign a section to microtubules :param part: Microtubule part to which section to be assigned :type part: object :param MTname: Name of the microtubule :type MTname: str :param kwargs: model parameters :type kwargs: dict :return: Null :rtype: Null """ modelname = kwargs['modelname'] e = part.edges edges = e.getByBoundingSphere((0.0, 0.0, 0.0), (kwargs['spindleLength']), ) region = part.Set(edges=edges, name='MT-set') p = mdb.models[modelname].parts[MTname] p.SectionAssignment( region=region, sectionName='MT-section', offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)
[docs]def assign_MT_section_orientation( MTname, **kwargs ): """ Assign MT section orientation with respect to the local coordinates of the MT :param MTname: Name of the microtubule :type MTname: str :param kwargs: model parameters :type kwargs: dict :return: Null :rtype: Null """ modelname = kwargs['modelname'] p = mdb.models[modelname].parts[MTname] e = p.edges edges = e.getSequenceFromMask(mask=('[#1 ]',), ) region = p.Set(edges=edges, name='MT-set') p = mdb.models[modelname].parts[MTname] p.assignBeamSectionOrientation( region=region, method=N1_COSINES, n1=(0.0, 0.0, -1.0))
[docs]def assign_connector_section( part, name, **kwargs ): """ Assign a section to each connector :param part: Connector part to which section to be assigned :type part: object :param name: Name of the connector :type name: str :param kwargs: model parameters :type kwargs: dict :return: Region containing connector :rtype: object """ e = part.edges edges = e.getByBoundingSphere((0.0, 0.0, 0.0), (kwargs['spindleLength']), ) region = part.Set(edges=edges, name='connector-set') part.SectionAssignment( region=region, sectionName=name, offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION) return region
[docs]def create_centrosome_part( Centrosomesketch, name, **kwargs ): """ Create an Abaqus object containing centrosome geometry part :param Centrosomesketch: Name of the centrosome sketch object :type Centrosomesketch: str :param name: Name of the centrosome part :type name: object :param kwargs: model parameters :type kwargs: str :return: Centrosome part :rtype: object """ modelname = kwargs['modelname'] p = mdb.models[modelname].Part( name=name, dimensionality=THREE_D, type=DEFORMABLE_BODY) p = mdb.models[modelname].parts[name] p.BaseSolidRevolve(sketch=Centrosomesketch, angle=360.0, flipRevolveDirection=OFF) Centrosomesketch.unsetPrimaryObject() p = mdb.models[modelname].parts[name] del mdb.models[modelname].sketches['__profile__'] return p
[docs]def assign_centrosome_section( part, name, sectionName, **kwargs ): """ Assign section to the Centrosome part :param part: Centrosome part to which the section is to be assigned :type part: object :param name: Name of the centrosome :type name: str :param sectionName: Name of the section to be assigned :type sectionName: str :param kwargs: model parameters :type kwargs: dict :return: Null :rtype: Null """ modelname = kwargs['modelname'] c = part.cells cells = c.getByBoundingSphere((0.0, 0.0, 0.0), (kwargs['spindleLength']), ) region = part.Set(cells=cells, name='centrosome-set') p = mdb.models[modelname].parts[name] p.SectionAssignment( region=region, sectionName=sectionName, offset=0.0, offsetType=MIDDLE_SURFACE, offsetField='', thicknessAssignment=FROM_SECTION)
[docs]def model( **kwargs ): """ Create Abaqus model for the mitotic spindle :param kwargs: model parameters :type kwargs: dict :return: Null :rtype: Null """ modelname = kwargs['modelname'] # Create and save model database mdb.Model(name=modelname, modelType=STANDARD_EXPLICIT)