Ejemplo n.º 1
0
def Midsurface(dict={}):
    #===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()

    # ===================================================================
    ## Extract midsurface for all parts
    numOfInvisible = 0
    numOfFailed = 0
    numOfMultiple = 0
    numOfCreated = 0
    numOfParts = len(model_1.getParts(recursive=True))
    for Part in model_1.getParts(recursive=True):
        if 'Trajectories' not in Part.getPathName():
            _target = apex.entityCollection()
            if Part.getVisibility():
                try:
                    listOfSolids = Part.getSolids(
                    )  # Get a list of all solids for a given part
                    for Solid in listOfSolids:  # Append this list of solids to the _target variable
                        _target = apex.entityCollection()
                        _target.append(Solid)

                        A_old = apex.catalog.getSectionDictionary()
                        result = apex.geometry.assignConstantThicknessMidSurface(
                            target=_target,
                            autoAssignThickness=True,
                            autoAssignTolerance=5.0e-02)
                        A_new = apex.catalog.getSectionDictionary()
                        new_thickness = {
                            k: A_new[k]
                            for k in set(A_new) - set(A_old)
                        }
                        for key, value in new_thickness.items():
                            nthickness = value.thickness

                        if len(Part.getSurfaces()) > 1:
                            Part.update(name="{0}_CHECK(multiple)".format(
                                Part.getName()))
                            numOfMultiple += 1

                        else:
                            for entity in result:  #'result' comes from the resulting collection of the midsurface extraction
                                if entity.entityType is apex.EntityType.Surface:
                                    CurrPartPath = apex.getPart(
                                        entity.getPath())
                                    CurrPartPath.update(
                                        name="{0}_{1}mm".format(
                                            CurrPartPath.getName(),
                                            str(round(float(nthickness),
                                                      2)).replace(".", ",")))
                                    numOfCreated += 1
                except:
                    Part.update(
                        name="{0}_CHECK(failed)".format(Part.getName()))
                    numOfFailed += 1
            else:
                numOfInvisible += 1
Ejemplo n.º 2
0
def CreateMeshPartitions(dict={}):
    # ===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()

    ## Collect faces to mesh
    _targetFine = apex.entityCollection()
    listOfLengths = []
    listOfDiameters = []

    MeshSize = float(dict["MeshSize"])

    try:
        listOfTrajectories = model_1.getAssembly("Trajectories").getParts(True)
        listOfAllParts = []
        for Part in model_1.getParts(True):
            if "Trajectories" not in Part.getPath():
                listOfAllParts.append(Part)

        for Part in listOfTrajectories:
            if 'RefDiam' in Part.getName():
                _, Diam = Part.getName().split('_')
                listOfDiameters.append(float(Diam))
            else:
                if len(Part.getCurves()) > 0:
                    listOfLengths.append(Part.getCurves()[0].getLength())

        maxDiameter = max(
            listOfDiameters)  #Getting the max diameter to use as search range

        ## Getting all faces from all parts that are not under 'Trajectories'
        facesToMesh = apex.EntityCollection()
        for Part in listOfAllParts:
            for Surface in Part.getSurfaces():
                for Face in Surface.getFaces():
                    if Face.getArea() <= (1.1 * 3.14159 * maxDiameter *
                                          maxDiameter):
                        facesToMesh.append(Face)

        apex.mesh.createSurfaceMesh(
            name="",
            target=facesToMesh,
            meshSize=MeshSize,
            meshType=apex.mesh.SurfaceMeshElementShape.Mixed,
            meshMethod=apex.mesh.SurfaceMeshMethod.Pave,
            mappedMeshDominanceLevel=2,
            elementOrder=apex.mesh.ElementOrder.Linear,
            meshUsingPrincipalAxes=False,
            refineMeshUsingCurvature=True,
            elementGeometryDeviationRatio=0.10,
            elementMinEdgeLengthRatio=0.50,
            createFeatureMeshOnFillets=False,
            createFeatureMeshOnChamfers=False,
            createFeatureMeshOnWashers=False,
            createFeatureMeshOnQuadFaces=False)

    except:
        print("Meshing failed or not performed.")
Ejemplo n.º 3
0
def ShowNoMeshed(dict={}):
    #===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()

    # ===================================================================
    for Part in model_1.getParts(recursive=True):
        if 'Trajectories' not in Part.getPathName():
            _target = apex.entityCollection()
            if Part.getMeshes():
                Part.hide()
            else:
                Part.show()
Ejemplo n.º 4
0
def SplitByTrajectories(dict={}):
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()
    try:
        listOfParts = model_1.getParts(True)
        _target = apex.entityCollection()
        _face = apex.entityCollection()
        for Part in listOfParts:
            if 'Trajectories' in Part.getPath():
                for Solid in Part.getSolids():
                    _face += Solid.getFaces()
            else:
                _target += Part.getSurfaces()

        apex.geometry.splitOnSurface(
            target=_target,
            face=_face,
            splitBehavior=apex.geometry.GeometrySplitBehavior.Partition)
        entities_1 = apex.EntityCollection()
        assembly_1 = model_1.getAssembly(pathName="Trajectories")
        entities_1.append(assembly_1)
        entities_1.hide()
    except:
        print("Split failed or not performed.")
Ejemplo n.º 5
0
def SuppressEdges(dict={}):
    #===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()
    _target = apex.entityCollection()
    listOfVertices = []

    for part in model_1.getParts(True):
        if part.getVisibility():
            if 'Trajectories' not in part.getPath():
                for Solid in part.getSolids():
                    if Solid.getVisibility():
                        for Vertex in Solid.getVertices():
                            listOfEdges = []
                            listOfLengths = []
                            for Edge in Vertex.getConnectedEdges():
                                listOfEdges.append(Edge.getId())
                                listOfLengths.append(Edge.getLength())
                            if len(
                                    listOfEdges
                            ) > 2:  # Suppress edges with more than 2 connections at the vertex
                                sortedByNumber = [
                                    int(x) for _, x in sorted(
                                        zip(listOfLengths, listOfEdges))
                                ]
                                _target.append(
                                    Solid.getEdge(id=sortedByNumber[0]))
                """
                for surface in part.getSurfaces():
                    if surface.getVisibility():
                        #_target.extend(surface.getEdges())
                        for Vertex in surface.getVertices():
                            listOfEdges = []
                            listOfLengths = []
                            for Edge in Vertex.getConnectedEdges():
                                listOfEdges.append(Edge.getId())
                                listOfLengths.append(Edge.getLength())
                            if len(listOfEdges) > 2:
                                sortedByHeight = [int(x) for _, x in sorted(zip(listOfLengths, listOfEdges))]
                                _target.append(surface.getEdge(id=sortedByHeight[0]))
                """

    result = apex.geometry.suppressOnly(target=_target,
                                        maxEdgeAngle=1.745329251994330e-01,
                                        maxFaceAngle=8.726646259971650e-02,
                                        keepVerticesAtCurvatureChange=False,
                                        cleanupTol=1.000000000000000)
Ejemplo n.º 6
0
def ShowSurfMeshedOnly(dict={}):
    #===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()

    # ===================================================================
    for Part in model_1.getParts(recursive=True):
        if 'Trajectories' not in Part.getPathName():
            _target = apex.entityCollection()
            for Mesh in Part.getMeshes():
                print(Mesh.entityType)
                if Mesh.entityType == apex.EntityType.SurfaceMesh:
                    _target.extend(Part)

    _target.hide()
Ejemplo n.º 7
0
def SuppressFeatures(dict={}):
    #===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()
    _target = apex.entityCollection()
    try:
        for part in model_1.getParts(True):
            if 'Trajectories' not in part.getPath():
                for surface in part.getSurfaces():
                    _target.extend(surface.getEdges())
                    _target.extend(surface.getVertices())

        result = apex.geometry.suppressOnly(
            target=_target,
            maxEdgeAngle=1.745329251994330e-01,
            maxFaceAngle=8.726646259971650e-02,
            keepVerticesAtCurvatureChange=False,
            cleanupTol=1.000000000000000)
    except:
        print("Simplification not performed or failed.")
Ejemplo n.º 8
0
def GenerateStudies(dict={}):
    # ===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()

    # Check existing material and create generic steel if needed
    if "SteelGeneric" not in apex.catalog.getMaterialDictionary().keys():
        apex.setScriptUnitSystem(unitSystemName=r'''m-kg-s-N''')
        SteelMaterial = apex.catalog.createMaterial(name="SteelGeneric",
                                                    description="",
                                                    color=[64, 254, 250])
        SteelMaterial.update(elasticModulus=210.e+9,
                             poissonRatio=0.3,
                             density=7.8e-6)
        apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
        #print("Material data for generic steel created")
    else:
        #print("Material already exists, skipping...")
        pass

    # Assign generic steel material to all Parts
    GenericMaterial = apex.catalog.getMaterial(name="SteelGeneric")
    _target = apex.EntityCollection()
    _target.extend(model_1.getParts(True))
    apex.attribute.assignMaterial(material=GenericMaterial, target=_target)

    # Run body selection
    for selAssy in apex.selection.getCurrentSelection():
        listOfRefSolid = []
        listOfRefSolidPaths = []
        for Part in selAssy.getParts(True):
            Part.update(color=[255, 0, 0])
            Part.show()
            for Solid in Part.getSolids():
                listOfRefSolidPaths.append(Solid.getPathName())
                listOfRefSolid.append(Solid)

        listOfTargetSolids = apex.EntityCollection()
        for Part in model_1.getParts(True):
            for Solid in Part.getSolids():
                if Solid.getPathName() not in listOfRefSolidPaths:
                    listOfTargetSolids.append(Solid)
                    Solid.update(color=[0, 0, 255])
                    Part.addUserAttribute(userAttributeName=Part.getPathName(),
                                          stringValue='Self')

        for refSolid in listOfRefSolid:
            textDisplay = apex.display.displayText(
                text=refSolid.getName(),
                textLocation=refSolid.getCentroid(),
                graphicsFont="Calibri",
                graphicsFontColor=apex.ColorRGB(255, 191, 0),
                graphicsFontSize=16,
                graphicsFontStyle=apex.display.GraphicsFontStyle.Normal,
                graphicsFontUnderlineStyle=apex.display.
                GraphicsFontUnderlineStyle.NoUnderline)
            distance_ = apex.measureDistance(source=refSolid,
                                             target=listOfTargetSolids)

            listOfTouchedBodies = apex.EntityCollection()

            try:
                _ans = refSolid.getParent().removeUserAttributes(
                    userAttributeNames=[])
            except:
                pass

            refSolid.getParent().addUserAttribute(
                userAttributeName=refSolid.getParent().getPathName(),
                stringValue='Self')
            for k in range(len(distance_)):
                if distance_[k] <= 0.0:
                    listOfTouchedBodies.append(listOfTargetSolids[k])
                    refSolid.getParent().addUserAttribute(
                        userAttributeName=listOfTargetSolids[k].getParent(
                        ).getPathName(),
                        stringValue='Touched')
            apex.display.clearAllGraphicsText()

        # Organizing Parts and getting ready for modal analysis
        for refSolid in listOfRefSolid:
            StudyAssy = model_1.createAssembly(name="StudyAssy")
            dictInfo = {"Self": "", "Touched": []}
            solidParent = refSolid.getParent()

            # Moving Parts to the StudyAssy
            for Attribute in solidParent.getUserAttributes():
                if Attribute.getStringValue() == 'Self':
                    dictInfo[Attribute.getStringValue(
                    )] = Attribute.getAttributeName()
                else:
                    dictInfo[Attribute.getStringValue()].append(
                        Attribute.getAttributeName())
                    ans_ = apex.getPart(
                        Attribute.getAttributeName()).setParent(
                            parent=StudyAssy)
            refSolid.getParent().setParent(parent=StudyAssy)

            # Creating ties based on touching bodies
            listOfTies = apex.EntityCollection()
            BeadPath = StudyAssy.getPart(
                dictInfo["Self"][dictInfo["Self"].rfind("/") +
                                 1:]).getPathName()
            for elem in dictInfo["Touched"]:
                compPath = StudyAssy.getPart(elem[elem.rfind("/") +
                                                  1:]).getPathName()
                _entities = apex.getEntities(pathNames=[BeadPath, compPath])
                newTies = apex.attribute.createMeshIndependentTieAutomatic(
                    target=_entities,
                    tiePairTolerance=5.,
                    patchToleranceCalculationMethod=apex.AutoManual.Automatic)
                listOfTies.extend(newTies)

            # --- Running the modal thing
            scenaryName = "Scenario for " + solidParent.getName()
            context_ = StudyAssy
            study = apex.getPrimaryStudy()
            study.createScenario(
                name=scenaryName,
                description="Generated by the Optimization Toolbox - FO",
                scenarioConfiguration=apex.studies.ScenarioConfiguration.
                NormalModes)

            study = apex.getPrimaryStudy()
            scenario1 = study.getScenario(name=scenaryName)
            scenario1.associateModelRep(context_)

            # study = apex.getPrimaryStudy()
            # scenario1 = study.getScenario(name=scenaryName)
            # simSetting1 = scenario1.simulationSettings
            # simSetting1.partReduction = False
            # simSetting1.freqRangeLower = 1000.
            # simSetting1.freqRangeUpper = float('NaN')
            # simSetting1.stopCalculation = True
            # simSetting1.maxModes = 3
            # scenario1.simulationSettings = simSetting1

            #model_1.save()

            scenario1.execute()  # Kick it

            # --- Done with execution

            # Deleting ties
            apex.deleteEntities(listOfTies)

            # Reset the model tree
            for Part in StudyAssy.getParts(True):
                for Attribute in Part.getUserAttributes():
                    if Attribute.getStringValue() == 'Self':
                        index = Attribute.getAttributeName().rfind("/")
                        ParentAssy = Attribute.getAttributeName()[0:index]
                        Part.setParent(parent=apex.getAssembly(ParentAssy))

            # Delete the Assembly used to build the study
            toDelete = apex.EntityCollection()
            toDelete.append(StudyAssy)
            apex.deleteEntities(toDelete)

            # --- Do postprocessing
            result = apex.session.displayMeshCracks(False)
            result = apex.session.display2DSpans(False)
            result = apex.session.display3DSpans(False)
            apex.display.hideRotationCenter()
            result = apex.session.displayMeshCracks(False)
            result = apex.session.displayInteractionMarkers(True)
            result = apex.session.displayConnectionMarkers(True)
            result = apex.session.display2DSpans(False)
            result = apex.session.display3DSpans(True)
            result = apex.session.displayLoadsAndBCMarkers(True)
            result = apex.session.displaySensorMarkers(True)

            study = apex.getPrimaryStudy()
            scenario1 = study.getScenario(name=scenaryName)
            executedscenario_1 = scenario1.getLastExecutedScenario()
            event1 = executedscenario_1.getEvent(
                pathName="/Study/{0}<< -1>>/Event 1".format(scenaryName))
            stateplot_1 = apex.post.createStatePlot(event=event1,
                                                    resultDataSetIndex=[7])

            visualizationTarget1 = apex.entityCollection()
            study = apex.getPrimaryStudy()
            scenario1 = study.getScenario(name=scenaryName)
            executedscenario_1 = scenario1.getLastExecutedScenario()
            visualizationTarget1.append(
                executedscenario_1.getAssembly(
                    pathName=apex.currentModel().name +
                    "/ar:StudyAssy_Default Rep"))
            deformvisualization_1 = stateplot_1.createDeformVisualization(
                target=visualizationTarget1,
                deformScalingMethod=apex.post.DeformScalingMethod.Relative,
                relativeScalingFactor=2.,
                displayUnit="mm")

            result = apex.session.displaySensorMarkers(False)

            colormap_1 = apex.post.createColorMap(
                name="FringeSpectrum",
                colorMapSegmentMethod=apex.post.ColorMapSegmentMethod.Linear,
                start=0.0,
                end=0.0,
                isLocked=False,
                useOutOfRangeColors=False,
                displayContinuousColors=False)

            visualizationTarget1 = apex.entityCollection()
            study = apex.getPrimaryStudy()
            scenario1 = study.getScenario(name=scenaryName)
            executedscenario_1 = scenario1.getLastExecutedScenario()
            visualizationTarget1.append(
                executedscenario_1.getAssembly(
                    pathName=apex.currentModel().name +
                    "/ar:StudyAssy_Default Rep"))
            contourvisualization_1 = stateplot_1.createContourVisualization(
                contourStyle=apex.post.ContourStyle.Fringe,
                target=visualizationTarget1,
                resultQuantity=apex.post.ResultQuantity.
                DisplacementTranslational,
                resultDerivation=apex.post.ResultDerivation.Magnitude,
                layerIdentificationMethod=apex.post.LayerIdentificationMethod.
                Position,
                layers=["NONE"],
                layerEnvelopingMethod=apex.post.LayerEnvelopingMethod.Unknown,
                elementNodalProcessing=apex.post.ElementNodalProcessing.
                Averaged,
                coordinateSystemMethod=apex.post.CoordinateSystemMethod.Global,
                colorMap=colormap_1,
                displayUnit="mm")

            contourvisualization_1.update()
            result = apex.session.display3DSpans(False)
            result = apex.session.displaySensorMarkers(True)
            result = apex.session.display2DSpans(False)
            result = apex.session.display3DSpans(False)
            result = apex.session.displaySensorMarkers(True)

            for i in range(4):
                stateplot_1.update(resultDataSetIndex=[7 + i])
                time.sleep(3)
                capturedImage = apex.display.captureImage(
                    path=
                    r"D:\00-Projects\01-SequenceOptimization\ApexFiles\Images",
                    imageNamePrefix=scenaryName,
                    imageCaptureRegion=apex.display.CaptureRegionType.Viewport,
                    imageFormat=apex.display.ImageType.jpg)

            apex.post.exitPostProcess()
Ejemplo n.º 9
0
def CreateMeshPartitions(dict={}):
    # ===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()

    ## Collect faces to mesh
    _targetFine = apex.entityCollection()
    listOfLengths = []
    listOfDiameters = []

    try:
        MeshSize = float(dict["MeshSize"])
    except:
        MeshSize = float(dict["FineMeshSize"])

    #try:
    listOfTrajectories = model_1.getAssembly("Refinement regions").getParts(
        True)
    listOfAllParts = []
    for Part in model_1.getParts(True):
        if "Refinement regions" not in Part.getPath():
            listOfAllParts.append(Part)

    for Part in listOfTrajectories:
        if 'RefDiam' in Part.getName():
            _, Diam = Part.getName().split('_')
            listOfDiameters.append(float(Diam))
        else:
            if len(Part.getCurves()) > 0:
                listOfLengths.append(Part.getCurves()[0].getLength())

    maxDiameter = max(
        listOfDiameters)  #Getting the max diameter to use as search range

    ## Getting all faces from all parts that are not under 'Trajectories'
    proxSearch = apex.utility.ProximitySearch()
    listOfAllPartFaces = []
    for Part in listOfAllParts:
        for Surface in Part.getSurfaces():
            for Face in Surface.getFaces():
                listOfAllPartFaces.append(Face)

    ## Inserting the list of faces into the proximity search
    ans = proxSearch.insertList(listOfAllPartFaces)

    facesToMesh = apex.EntityCollection()

    ## Perform the search
    for Part in model_1.getAssembly('Refinement regions').getParts(
    ):  # Add spots and weld beads to perfom the search
        for Solid in Part.getSolids():
            resSearch = proxSearch.findObjectsWithinDistance(
                location=Solid.getLocation(), distance=1.1 * maxDiameter)
            for elem in resSearch.foundObjects():
                if elem.entityType == apex.EntityType.Face:
                    facesToMesh.append(elem)

    if listOfLengths:
        minLength = min(listOfLengths)
        ## Select everything that is smaller than the minLength * maxDiameter
        for Assy in model_1.getAssemblies():
            if "Refinement regions" not in Assy.getName():
                for Part in Assy.getParts(recursive=True):
                    for Surface in Part.getSurfaces():
                        for Face in Surface.getFaces():
                            if Face.getArea() <= (0.8 * max(listOfLengths) *
                                                  maxDiameter):
                                facesToMesh.append(Face)

    else:
        ## Select everything that is smaller than the minLength * maxDiameter
        for Part in listOfAllParts:
            for Surface in Part.getSurfaces():
                for Face in Surface.getFaces():
                    if Face.getArea() <= (1.1 * 3.14159 *
                                          (maxDiameter / 2)**2):
                        facesToMesh.append(Face)

    apex.mesh.createSurfaceMesh(
        name="",
        target=facesToMesh,
        meshSize=MeshSize,
        meshType=apex.mesh.SurfaceMeshElementShape.Mixed,
        meshMethod=apex.mesh.SurfaceMeshMethod.Pave,
        mappedMeshDominanceLevel=2,
        elementOrder=apex.mesh.ElementOrder.Linear,
        meshUsingPrincipalAxes=False,
        refineMeshUsingCurvature=True,
        elementGeometryDeviationRatio=0.10,
        elementMinEdgeLengthRatio=0.50,
        createFeatureMeshOnFillets=False,
        createFeatureMeshOnChamfers=False,
        createFeatureMeshOnWashers=False,
        createFeatureMeshOnQuadFaces=False)

    try:
        pass
    except:
        print("Meshing failed or not performed.")
Ejemplo n.º 10
0
def Midsurface(dict={}):
    #===================================================================
    ## Initializing Apex code
    apex.setScriptUnitSystem(unitSystemName=r'''mm-kg-s-N''')
    model_1 = apex.currentModel()

    # ===================================================================
    ## Extract midsurface for all parts
    numOfInvisible = 0
    numOfFailed = 0
    numOfMultiple = 0
    numOfCreated = 0
    numOfParts = len(model_1.getParts(recursive=True))

    model_1 = apex.currentModel()
    for Assembly in apex.selection.getCurrentSelection():
        for Part in Assembly.getParts(True):
            _target = apex.entityCollection()
            if Part.getVisibility():
                try:
                    listOfSolids = Part.getSolids(
                    )  # Get a list of all solids for a given part
                    for Solid in listOfSolids:  # Append this list of solids to the _target variable
                        _target = apex.entityCollection()
                        if Solid.getVisibility():
                            _target.append(Solid)

                        A_old = apex.catalog.getSectionDictionary()
                        result = apex.geometry.assignConstantThicknessMidSurface(
                            target=_target,
                            autoAssignThickness=True,
                            autoAssignTolerance=5.0e-02)
                        A_new = apex.catalog.getSectionDictionary()
                        new_thickness = {
                            k: A_new[k]
                            for k in set(A_new) - set(A_old)
                        }
                        for key, value in new_thickness.items():
                            nthickness = value.thickness

                        if len(Part.getSurfaces()) > 1:
                            Part.update(
                                name="{0}_(multiple)".format(Part.getName()))
                            numOfMultiple += 1

                        else:
                            for entity in result:  #'result' comes from the resulting collection of the midsurface extraction
                                if entity.entityType is apex.EntityType.Surface:
                                    CurrPartPath = apex.getPart(
                                        entity.getPath())
                                    CurrPartPath.update(
                                        name="{0}_{1}mm".format(
                                            CurrPartPath.getName(),
                                            str(round(float(nthickness),
                                                      2)).replace(".", ",")))
                                    numOfCreated += 1
                                    Solid.hide()
                except:
                    Part.update(name="{0}_(failed)".format(Part.getName()))
                    numOfFailed += 1
                    apex.enableShowOutput()
            else:
                numOfInvisible += 1
    print(
        "Found {4} parts with solids in total.\nThere were {0} parts not visible, only visible parts are processed: created {1} midsurfaces.\nParts with multple thickness: {2} \nFailed parts: {3}"
        .format(numOfInvisible, numOfCreated, numOfMultiple, numOfFailed,
                numOfParts))