Jump to content

Efficient Mesh Creation for Multi-Scan Data in ZEISS Inspect X-Ray


---
 Share

Recommended Posts

Hi Community,

I’m currently looking for a solution to create a mesh from a multi-scan file, ideally with a fast and efficient workflow for separating and analyzing each part.

The method I’m using now involves separating the volume into individual parts, creating a mesh for each one, and then analyzing in ZEISS Inspect. I’ve tried a few approaches:

  • Separating the volume and generate stages.
  • Splitting the components into new parts.
  • Using the clipboard .

However, there are some drawbacks with these methods. For example, the first and third options are time-consuming when creating meshes for each part in serial production. The second approach requires analyzing each part separately, which also slows down the process.

In summary, I’m looking for a way to generate a mesh from the raw data and then split it into separate meshes efficiently. (a way to seperate the volume with mesh and not to seperate and then create the mesh for each seperated part) Does anyone have suggestions for improving our workflow to save time, especially when working with files containing multiple parts (sometimes 8 or more)?

Thanks in advance for any advice!

Link to comment
Share on other sites

Do you care about keeping track of what part is where in the scan? For example, do you need to maintain traceability or do you just want to automatically separate the polygonised volume?

Link to comment
Share on other sites

Hello, no, I don’t. We have badges for each part so we can read and identify the parts. As you mentioned, I want to automatically separate the polygonized volume. (The Extract Volume Areas Automatically function is only applicable to volumes and not meshes, that’s the problem.)

Link to comment
Share on other sites

# -*- coding: utf-8 -*-

import gom

###### changes
# check if user selected points
# if multiple patches have been selected, use the smallest one to define min number of points
######


# dialogue to define if part based or stage based project
# will also ask to select a part to define the default number of points for one part
# should ask if only surfaces or also cavities should be kept

RESULT=gom.script.sys.execute_user_defined_dialog (content='<dialog>' \
' <title>Separation v3</title>' \
' <style></style>' \
' <control id="OkCancel"/>' \
' <position>automatic</position>' \
' <embedding>always_toplevel</embedding>' \
' <sizemode>automatic</sizemode>' \
' <size height="400" width="563"/>' \
' <content columns="2" rows="5">' \
'  <widget type="display::text" row="0" columnspan="2" rowspan="1" column="0">' \
'   <name>text</name>' \
'   <tooltip></tooltip>' \
'   <text>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">' \
'&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">' \
'p, li { white-space: pre-wrap; }' \
'&lt;/style>&lt;/head>&lt;body style="    ">' \
'&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Requirement:&lt;/p>' \
'&lt;ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;">&lt;li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">There has to be only one part in this project, containing only one mesh!&lt;/li>' \
'&lt;li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">(optional) \tA CAD can be used to align the individual parts.&lt;br />\tThis CAD has to be within the part.&lt;br />\tAll parts have to be of the same type.&lt;/li>&lt;/ul>&lt;/body>&lt;/html></text>' \
'   <wordwrap>false</wordwrap>' \
'  </widget>' \
'  <widget type="separator" row="1" columnspan="2" rowspan="1" column="0">' \
'   <name>separator</name>' \
'   <tooltip></tooltip>' \
'   <title></title>' \
'  </widget>' \
'  <widget type="label" row="2" columnspan="1" rowspan="1" column="0">' \
'   <name>label</name>' \
'   <tooltip></tooltip>' \
'   <text>Devide mesh into multiple</text>' \
'   <word_wrap>false</word_wrap>' \
'  </widget>' \
'  <widget type="input::radiobutton" row="2" columnspan="1" rowspan="1" column="1">' \
'   <name>PartOrStage</name>' \
'   <tooltip></tooltip>' \
'   <items>' \
'    <item description="Parts" state="1"/>' \
'    <item description="Stages" state="2"/>' \
'   </items>' \
'   <default>1</default>' \
'  </widget>' \
'  <widget type="label" row="3" columnspan="1" rowspan="1" column="0">' \
'   <name>label_1</name>' \
'   <tooltip></tooltip>' \
'   <text>Keep</text>' \
'   <word_wrap>false</word_wrap>' \
'  </widget>' \
'  <widget type="input::radiobutton" row="3" columnspan="1" rowspan="1" column="1">' \
'   <name>SurfaceOrAll</name>' \
'   <tooltip></tooltip>' \
'   <items>' \
'    <item description="Only outer surface" state="1"/>' \
'    <item description="Outer surface and cavities" state="2"/>' \
'   </items>' \
'   <default>1</default>' \
'  </widget>' \
'  <widget type="spacer::horizontal" row="4" columnspan="1" rowspan="1" column="0">' \
'   <name>spacer</name>' \
'   <tooltip></tooltip>' \
'   <minimum_size>0</minimum_size>' \
'   <maximum_size>-1</maximum_size>' \
'  </widget>' \
'  <widget type="input::checkbox" row="4" columnspan="1" rowspan="1" column="1">' \
'   <name>CAD</name>' \
'   <tooltip></tooltip>' \
'   <value>false</value>' \
'   <title>use CAD for alignment</title>' \
'  </widget>' \
' </content>' \
'</dialog>')

typePartOrStage = int(RESULT.PartOrStage)

typeSurfaceOrAll = int(RESULT.SurfaceOrAll)

CADavailable = int(RESULT.CAD)

#check if points were selected
while gom.app.num_selected_visible_points == 0:
    RESULT=gom.script.sys.execute_user_defined_dialog (content='<dialog>' \
' <title>Message</title>' \
' <style></style>' \
' <control id="OkCancel"/>' \
' <position>automatic</position>' \
' <embedding>always_toplevel</embedding>' \
' <sizemode>automatic</sizemode>' \
' <size height="157" width="536"/>' \
' <content columns="1" rows="1">' \
'  <widget type="display::text" row="0" columnspan="1" rowspan="1" column="0">' \
'   <name>text</name>' \
'   <tooltip></tooltip>' \
'   <text>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">' \
'&lt;html>&lt;head>&lt;meta name="qrichtext" content="1" />&lt;style type="text/css">' \
'p, li { white-space: pre-wrap; }' \
'&lt;/style>&lt;/head>&lt;body style="    ">' \
'&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Please select the reference part using the &amp;quot;Select patch&amp;quot; function.&lt;/p>' \
'&lt;p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">If you have multiple parts of differnt types please select the smallest one.&lt;/p>&lt;/body>&lt;/html></text>' \
'   <wordwrap>false</wordwrap>' \
'  </widget>' \
' </content>' \
'</dialog>')

#rename original Part to "Part"
gom.script.sys.edit_properties (
    data=[gom.app.project.parts[0]],
    elem_name='Part')


# set Original Alignment as initial alignment
try:
    gom.script.manage_alignment.define_original_alignment_as_initial_alignment (part=gom.app.project.parts[0])
except:
    pass

# loop to find smallest selected patch
n = 1
PatchNPoints = []
while 1:
    try:
    
        # all selected points at the moment
        OriginalNPoints = gom.app.num_selected_visible_points
        
        # touch point
        MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
            clearance=1000.0,
            keep_point_selection=True,
            name='Point ' +str(n),
            normal={'direction': gom.Vec3d (0.0, 0.0, 1.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
            point={'point': gom.Vec3d (0.0, 0.0, 0.0)},  
            properties=gom.Binary ('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'),
            radius=1000.0)
        
        # deselect from touch point
        gom.script.selection3d.deselect_patch (
            coordinate=gom.app.project.actual_elements['Point ' +str(n)].center_coordinate,
            target=gom.app.project.parts[0].actual)
        
        # points of patch = all selected points at n-1 - all selected points at n
        PatchNPoints.append(OriginalNPoints - gom.app.num_selected_visible_points)
        
        n = n+1
        
    except:
        break

# reference amount of points. Patches with less points will not be taken as a part.
setnpoints = 0.75 * min(PatchNPoints)

# delete alignment and constructed elements
gom.script.cad.delete_element (
    elements=gom.ElementSelection ({'category': ['key', 'elements', 'part', gom.app.project.parts[0], 'explorer_category', 'actual']}),
    with_measuring_principle=True)

gom.script.cad.delete_element (
    elements=gom.ElementSelection ({'category': ['key', 'elements', 'part', gom.app.project.parts[0], 'explorer_category', 'alignment']}),
    with_measuring_principle=True)

gom.script.selection3d.deselect_all ()


#Number of points that will be used as a part. Everything below is not a part and will be deleted.
#setnpoints = 200000

# copy part and create part-source
gom.script.sys.copy_to_clipboard (elements=[gom.app.project.parts[0].actual])

gom.script.sys.paste_from_clipboard (destination=[gom.app.project.parts[0].actual])

gom.script.part.create_new_part (name='Part_source')

gom.script.part.add_elements_to_part (
    elements=[gom.app.project.clipboard.actual_elements[0]],
    import_mode='new_elements',
    part=gom.app.project.parts['Part_source'])

    
# create original alignment as initial alignment for part-source    
gom.script.manage_alignment.define_original_alignment_as_initial_alignment (part=gom.app.project.parts['Part_source'])

n = 1

while 1:
    
    try:
        # set Part-source explicit
        gom.script.cad.show_element_exclusively (elements=gom.ElementSelection ({'category': ['key', 'elements', 'part', gom.app.project.parts['Part_source']]}))
        
        
        # select only patches with enough points to be a part
        
        gom.script.selection3d.select_patches_by_size (
            elements=[gom.app.project.parts['Part_source'].actual],
            max_points=setnpoints)

        gom.script.selection3d.invert_selection ()

        # create touch point
        MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
            clearance=1000.0,
            name='Point 1',
            normal={'direction': gom.Vec3d (0.0, 0.0, 1.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
            point={'point': gom.Vec3d (0.0, 0.0, 0.0)},  
            properties=gom.Binary ('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'),
            radius=1000.0)
        
        
        # patch select based on touch point position
        gom.script.selection3d.select_patch (
            coordinate=gom.app.project.actual_elements['Point 1'].center_coordinate,
            target=gom.app.project.parts['Part_source'].actual)
            
###################################
# if everything, including cavities, should be used
    
        if typeSurfaceOrAll == 2:    
    
            MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                clearance=1000.0,
                keep_point_selection=True,
                name='Point Xp',
                normal={'direction': gom.Vec3d (1.0, 0.0, 0.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                point=gom.app.project.actual_elements['Point 1'],
                properties=gom.Binary ('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'),
                radius=1000.0)
            
    
            MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                clearance=1000.0,
                keep_point_selection=True,
                name='Point Xn',
                normal={'direction': gom.Vec3d (-1.0, 0.0, 0.0), 'inverted': True, 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                point=gom.app.project.actual_elements['Point 1'],
                properties=gom.Binary ('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'),
                radius=1000.0)
            
    
            MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                clearance=1000.0,
                keep_point_selection=True,
                name='Point Yp',
                normal={'direction': gom.Vec3d (0.0, 1.0, 0.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                point=gom.app.project.actual_elements['Point 1'],
                properties=gom.Binary ('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'),
                radius=1000.0)
            
    
            MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                clearance=1000.0,
                keep_point_selection=True,
                name='Point Yn',
                normal={'direction': gom.Vec3d (0.0, -1.0, 0.0), 'inverted': True, 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                point=gom.app.project.actual_elements['Point 1'],
                properties=gom.Binary ('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'),
                radius=1000.0)
            
    
            MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                clearance=1000.0,
                keep_point_selection=True,
                name='Point Zp',
                normal={'direction': gom.Vec3d (0.0, 0.0, 1.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                point=gom.app.project.actual_elements['Point 1'],
                properties=gom.Binary ('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'),
                radius=1000.0)
            
    
            MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                clearance=500.0,
                name='Point Zn',
                normal={'direction': gom.Vec3d (0.0, 0.0, -1.0), 'inverted': True, 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                point=gom.app.project.actual_elements['Point 1'],
                properties=gom.Binary ('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'),
                radius=1000.0)
        
            
    
            # calculate position and height(z) and width (x + y) of the selection box and select inside the box
    
            dimx = gom.app.project.actual_elements['Point Xp'].center_coordinate.x - gom.app.project.actual_elements['Point Xn'].center_coordinate.x
            dimy = gom.app.project.actual_elements['Point Yp'].center_coordinate.y - gom.app.project.actual_elements['Point Yn'].center_coordinate.y
            dimz = gom.app.project.actual_elements['Point Zp'].center_coordinate.z - gom.app.project.actual_elements['Point Zn'].center_coordinate.z        
            
            centerX = gom.app.project.actual_elements['Point Xn'].center_coordinate.x + dimx /2
            centerY = gom.app.project.actual_elements['Point Yn'].center_coordinate.y + dimy /2
            centerZ = gom.app.project.actual_elements['Point Zn'].center_coordinate.z + dimz /2
            
            
            gom.script.selection3d.select_inside_cube (
                center={'point': gom.Vec3d (centerX, centerY, centerZ)},
                csys=gom.app.project.nominal_elements['system_global_coordinate_system'],
                height=dimz+0.2,
                length=dimx+0.2,
                width=dimy+0.2)
                
                
        
        # copy selected patch and create new part "part n"
        gom.script.cad.copy_selected_points (select_points_in_copy=True)
        
        gom.script.part.create_new_part (name='Part '+ str(n))
        
        gom.script.part.add_elements_to_part (
            elements=gom.ElementSelection ({'category': ['key', 'elements', 'is_element_in_clipboard', 'True', 'explorer_category', 'actual', 'object_family', 'mesh']}),
            import_mode='new_elements',
            part=gom.app.project.parts['Part '+ str(n)])        
        
        
        # set Part_source explicit and delete Part1 Patch from it
        gom.script.cad.show_element_exclusively (elements=gom.ElementSelection ({'category': ['key', 'elements', 'part', gom.app.project.parts['Part_source']]}))

        gom.script.selection3d.deselect_all ()
        
        gom.script.selection3d.select_patch (
            coordinate=gom.app.project.actual_elements['Point 1'].center_coordinate,
            target=gom.app.project.parts['Part_source'].actual)
        
        gom.script.cad.delete_selected_3d_area (reset_deviation_values=True)

        n = n +1    
        
        gom.script.cad.delete_element (
            elements=gom.ElementSelection ({'category': ['key', 'elements', 'part', gom.app.project.parts['Part_source'], 'explorer_category', 'actual']}),
            with_measuring_principle=True)
                    
            
    except:
        break
            
    
gom.script.cad.delete_element (
    elements=gom.ElementSelection ({'category': ['key', 'elements', 'part', gom.app.project.parts['Part_source']]}),
    with_measuring_principle=True)
#

### align to CAD and cut out mor precise
#setnpoints = 100000
n=1
if CADavailable == 1:
    while 1:
        try:    

            # create copy of CAD
            gom.script.sys.copy_to_clipboard (elements=[gom.app.project.parts['Part'].nominal])
            
            gom.script.sys.paste_from_clipboard (destination=[gom.app.project.parts['Part'].nominal])
            
            # add CAD to part n
            gom.script.part.add_elements_to_part (
                elements=[gom.app.project.clipboard.nominal_elements[0]],
                import_mode='new_elements',
                part=gom.app.project.parts['Part ' + str(n)])
            
            # create prealignment
            try:
                CAD_ALIGNMENT=gom.script.alignment.create_prealignment (
                    computation_mode='normal',
                    compute_additional_bestfit=True,
                    name_expression='Prealignment',
                    parent_alignment=gom.app.project.parts['Part ' + str(n)].original_alignment,
                    part=gom.app.project.parts['Part ' + str(n)])
            except:
                try:
                    CAD_ALIGNMENT=gom.script.alignment.create_prealignment (
                        computation_mode='enhanced',
                        compute_additional_bestfit=True,
                        name_expression='Prealignment',
                        parent_alignment=gom.app.project.parts['Part ' + str(n)].original_alignment,
                        part=gom.app.project.parts['Part ' + str(n)])
                except:
                    try:
                        CAD_ALIGNMENT=gom.script.alignment.create_prealignment (
                            computation_mode='advanced',
                            compute_additional_bestfit=True,
                            name_expression='Prealignment',
                            parent_alignment=gom.app.project.parts['Part ' + str(n)].original_alignment,
                            part=gom.app.project.parts['Part ' + str(n)])
                    except:
                        break                                
                        
            # further cutting out is only neccessary if cavities should be kept
            
            if typeSurfaceOrAll == 2:
                
                # set mesh from part n exclusive
                gom.script.cad.show_element_exclusively (elements=[gom.app.project.parts['Part ' + str(n)].actual])
                
                # select only patches with enough points to be a part
                
                gom.script.selection3d.select_patches_by_size (
                    elements=[gom.app.project.parts['Part ' + str(n)].actual],
                    max_points=setnpoints)
                
                gom.script.selection3d.invert_selection ()
                
                # create touch point
                MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                    clearance=1000.0,
                    name='Point 1',
                    normal={'direction': gom.Vec3d (0.0, 0.0, 1.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                    point={'point': gom.Vec3d (0.0, 0.0, 0.0)},  
                    properties=gom.Binary ('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'),
                    radius=1000.0)
                
                
                # patch select based on touch point position
                gom.script.selection3d.select_patch (
                    coordinate=gom.app.project.actual_elements['Point 1'].center_coordinate,
                    target=gom.app.project.parts['Part ' + str(n)].actual)
                            
    
                # if everything, including cavities, should be used                
                    
                MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                    clearance=1000.0,
                    keep_point_selection=True,
                    name='Point Xp',
                    normal={'direction': gom.Vec3d (1.0, 0.0, 0.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                    point=gom.app.project.actual_elements['Point 1'],
                    properties=gom.Binary ('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'),
                    radius=1000.0)
                
                
                MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                    clearance=1000.0,
                    keep_point_selection=True,
                    name='Point Xn',
                    normal={'direction': gom.Vec3d (-1.0, 0.0, 0.0), 'inverted': True, 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                    point=gom.app.project.actual_elements['Point 1'],
                    properties=gom.Binary ('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'),
                    radius=1000.0)
                
                
                MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                    clearance=1000.0,
                    keep_point_selection=True,
                    name='Point Yp',
                    normal={'direction': gom.Vec3d (0.0, 1.0, 0.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                    point=gom.app.project.actual_elements['Point 1'],
                    properties=gom.Binary ('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'),
                    radius=1000.0)
                
                
                MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                    clearance=1000.0,
                    keep_point_selection=True,
                    name='Point Yn',
                    normal={'direction': gom.Vec3d (0.0, -1.0, 0.0), 'inverted': True, 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                    point=gom.app.project.actual_elements['Point 1'],
                    properties=gom.Binary ('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'),
                    radius=1000.0)
                
                
                MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                    clearance=1000.0,
                    keep_point_selection=True,
                    name='Point Zp',
                    normal={'direction': gom.Vec3d (0.0, 0.0, 1.0), 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                    point=gom.app.project.actual_elements['Point 1'],
                    properties=gom.Binary ('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'),
                    radius=1000.0)
                
                
                MCAD_ELEMENT=gom.script.primitive.create_touch_point_disc_on_selection (
                    clearance=1000.0,
                    name='Point Zn',
                    normal={'direction': gom.Vec3d (0.0, 0.0, -1.0), 'inverted': True, 'point': gom.Vec3d (0.0, 0.0, 0.0), 'type': 'projected'},
                    point=gom.app.project.actual_elements['Point 1'],
                    properties=gom.Binary ('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'),
                    radius=1000.0)
                        
                            
                    
                # calculate position and height(z) and width (x + y) of the selection box and select inside the box
                
                dimx = gom.app.project.actual_elements['Point Xp'].center_coordinate.x - gom.app.project.actual_elements['Point Xn'].center_coordinate.x
                dimy = gom.app.project.actual_elements['Point Yp'].center_coordinate.y - gom.app.project.actual_elements['Point Yn'].center_coordinate.y
                dimz = gom.app.project.actual_elements['Point Zp'].center_coordinate.z - gom.app.project.actual_elements['Point Zn'].center_coordinate.z        
                
                centerX = gom.app.project.actual_elements['Point Xn'].center_coordinate.x + dimx /2
                centerY = gom.app.project.actual_elements['Point Yn'].center_coordinate.y + dimy /2
                centerZ = gom.app.project.actual_elements['Point Zn'].center_coordinate.z + dimz /2
                
                
                gom.script.selection3d.select_inside_cube (
                    center={'point': gom.Vec3d (centerX, centerY, centerZ)},
                    csys=gom.app.project.nominal_elements['system_global_coordinate_system'],
                    height=dimz+0.2,
                    length=dimx+0.2,
                    width=dimy+0.2)
                
                # delete all other points of this part
                
                gom.script.selection3d.invert_selection ()
                try:
                    gom.script.cad.delete_selected_3d_area (reset_deviation_values=True)
                except:
                    pass
            
                # delete Touch points
                
                gom.script.cad.delete_element (
                    elements=gom.ElementSelection ({'category': ['key', 'elements', 'part', gom.app.project.parts['Part ' + str(n)], 'explorer_category', 'actual']}),
                    with_measuring_principle=True)
                
            n = n+1            
    
        except:
            break
    
    # Clipboard löschen
    try:
        gom.script.cad.delete_element (
            elements=gom.ElementSelection ({'category': ['key', 'elements', 'is_element_in_clipboard', 'True', 'explorer_category', 'nominal']}),
            with_measuring_principle=True)
    except:
        pass


# transform into stagebased project

if typePartOrStage == 2:
    
    # combine meshes in stage project
    a = gom.app.project.parts[:]
    n = 0
    while 1:
        try:
            a[n] = a[n].actual
            n = n+1
        except:
            break
                
    gom.script.mesh.combine_meshes_in_stage_project (
        destination_mesh=gom.app.project.parts['Part'].actual,
        meshes=a)
    
    # delete all but the first part
    b = gom.app.project.parts[1:]
    gom.script.cad.delete_element (
        elements=b,
        with_measuring_principle=True)

    gom.script.sys.rename_stage (
        name='Part',
        stage=gom.app.project.stages[0])
    
    i = 1
    while 1:
        try:
            gom.script.sys.rename_stage (
                name='Stage'+ str(i),
                stage=gom.app.project.stages[i])
            i = i+1
        except:
            break

    

 

Link to comment
Share on other sites

it worked ! thank u very much! i made some changes by deleting some parts we don't need for our workflow and it worked. 

Link to comment
Share on other sites

@DWC

What in the world is that script doing, I have to know.  I glazed over it and am confused what it is accomplishing.

Link to comment
Share on other sites

it actually uses patch selection  to select a mesh and then with a loop it copies each part and devide it into new parts (individual part). for the alignement part i just deleted it because i don't need it but it normally aligns the created parts with a CAD if CAD is imported . i hope that i clarified the code a little bit .

 

Link to comment
Share on other sites

I don't understand clearly what you are trying to accomplish are you scanning different parts at the same time that are touching each other(ie assembled) and trying to get each one individually or are you scanning the same part in a fixture with let's say 6 parts in total and you need a separate mesh for the 6 parts?

 

There are some things my company would not want me to share, so I can only go so far with some ideas, but I'm trying to identify what you are trying to accomplish before considering any thoughts. Sounds like that script may be your ticket to success, but it looks crazy complicated compared to our approach, but again, I don't know what you are trying to do exactly.

Link to comment
Share on other sites

The main Problem is that we scan multiple parts simultaneously, all originating from serial production. After generating the mesh for these parts, we need an efficient workflow to help our technicians separate them. Zeiss X-Ray offers a function called "Automatic Separate Volume," but this is limited to separating volumes and cannot be applied to the mesh we created with several parts.

To save time and streamline the process, I aimed to find a solution that avoids the need to separate volumes first and then generate meshes for each separated volume individually—each step requiring additional waiting time. 

Typically, we scan between 4 and 8 parts at a time, which is why I tried to find a script to separate the mesh for the entire volume (e.g., for 8 parts). The approach I used before the script was essentially the same: manually copying the selected mesh (using the patch selection function) and then adding it to a new part. 

If you have any better ideas or alternative solutions, I would greatly appreciate your input. I also understand the importance of maintaining confidentiality when discussing internal workflows or company-specific processes.

Link to comment
Share on other sites

I'm sorry my friend, I cannot explain our workflow in detail. If the parts are in the same place in space every time you can cut them out with the picker tool and record the coordinates.

Edited
Link to comment
Share on other sites

 Share

×
×
  • Create New...