Jump to content

How to Use Widget Input to Trigger Specific Measurement Routines (e.g., Surface Comparison) in Script


---
 Share

Recommended Posts

  • 4 weeks later...

There was an App in 2023 to "Create Surface Defect Checks" which would create a deviation label for every deviation island in a surface defect classification.
we upgraded to 2025 and then realized this script is no longer compatablee (unless SDCL in legacy mode?) 

if you're using 2023
These were the parameters I used for the classification formula (basically how far above the 1.5mm tolerance is it)
image.thumb.png.dd893cf2d7da46d54d9db7ef2403d5ed.png


This is the user defined dialog prompt & results: 
image.thumb.png.697290ad0d74dfc610c4d088984c8d08.png

you can patch the original add on to extract other attributes in the SDCL table (max_depth_heigh(3sigma)) pretty easily. 

I used to use it with kiosk mode to auto label the OOT areas,
I believe I copied the code in the add on and added it as an external module so I could access it through the kiosk interface easier..
here was the function I wrote in "Custom Patches"  
 

	def update_sdcl_labels(self):
		self.reject = False
		for p in gom.app.project.parts:
			if p.part_function == 'used_for_scanning':
				scanpart = p
		
		# ##Delete all existing labels attached to SDCL
		del_list = []
		gom.script.explorer.apply_selection(selection=[])
		for point in gom.ElementSelection ({'category': ['key', 'elements', 'part', scanpart, 'explorer_category', 'actual', 'object_family', 'geometrical_element', 'type', 'point']}):
			gom.script.explorer.apply_selection(selection=[])
			gom.script.explorer.apply_selection(selection=[point])
			for related in gom.ElementSelection({'category': ['key', 'related']}):
				print(related, related.type)
				if related.type == 'inspection_surface_classification' or related.type == 'surface_comparison_actual_mesh':
					del_list.append(point)
			
			print(f'Deleting Elements {del_list}')
			if len(del_list):
				gom.script.cad.delete_element (
					elements=del_list ,
					with_measuring_principle=True)
			del_list = []

					

		###Create New Labels for all SDCLs in Project
		sdcl_label_dict = {}
		for sdcl in gom.ElementSelection ({'category': ['key', 'elements', 'part', scanpart, 'explorer_category', 'inspection', 'object_family', 'surface_comparison', 'type', 'inspection_surface_classification']}):
			gom.script.cad.show_element_exclusively (elements=[sdcl, scanpart.actual])
			sdcl_labels = []
			if sdcl.number_of_defects is not None and sdcl.number_of_defects != 0:
				self.reject = True  ## Detected a defect (Something Over .500mm )
				# export_defect_csv(sdcl)
				for i in range (sdcl.number_of_defects):
				#	print(i)
					point, labels = Create_sdcl_labels.create_surface_defect_checks(
					name="PtIndx",
					classification=sdcl,
					one_or_multi="ONE",
					index=i,
					show_class=True,
					max_depth_height=False,
					avg_depth_height = False,
					area=False,
					volume=False,
					avg_depth_height_3sigma = True,
					max_depth_height_3sigma = True
					)
					##Create a list of actual points and associated labels
					sdcl_labels.append(point)  ##Append the "Actual Point 1"
					for l in labels:
						sdcl_labels.append(l)	##Append all checks "Actual Point 1.maxdev", "Actual Point 1.avgdev"..etc
			sdcl_label_dict[sdcl] = sdcl_labels  ##save that list to a dict[sdcl] - so you can make visble later 
			##i.e. make visible sdcl_label_dict[sdcl] (actual point 1 , actual point 1.maxdev, actual poitn 1.avg dev)


		# ##itterate through the reports, if the report has a SDCL in its page, Restore Page, Make Labels Visible, Overwrite Page. 
		if self.reject:
			gom.script.explorer.apply_selection(selection=[])
			i = 1
			for report in gom.app.project.reports:
				print(report.report_title, ' ', i, ' / ', report.number_of_pages)
				
				i +=1
				for page in report.pages:
					for placeholder in page.placeholders:
						print(f'\t Placeholder: {placeholder}')
						if '3D' in placeholder.get('name'):
							gom.script.explorer.apply_selection(selection=[])
							gom.script.explorer.apply_selection(selection=placeholder)

							for element in gom.ElementSelection({'category': ['key', 'related']}):   
								if element.type == 'inspection_surface_classification':
									print(f'\t\t\tFound SDCL: {element}')
									if len ( sdcl_label_dict[element]): ## if labels were created for this sdcl (i.e. if sdcl.number_of_defects !=0 ):
										print(f'\t\t\t\t...Labels Detected - Restoring View: {placeholder}')
										gom.script.report.restore_3d_view_from_report_page (page=[placeholder])
										for e in  sdcl_label_dict[element]:    ##restore labels associated with this surface defect map
											gom.script.cad.show_element (elements=e)
										gom.script.view.set_auto_hide_labels (enable=True)
										gom.script.sys.switch_to_report_workspace ()
										print(f'\t\t\t\t...Labels Visible - Overwriting Report Page for : {placeholder}')
										gom.script.report.overwrite_report_page (target=[placeholder])
			print('Function: update_sdcl_labels() - self.reject = ', self.reject )


& to export the SDCL defect characteristic table as an excel file: 
 

	def export_excel(sdcl_path):
		try:
			for p in gom.app.project.parts:
				if p.part_function == 'used_for_scanning':
					scanpart = p
			reject = False
			df_list = []
			sdcl_list = gom.ElementSelection ({'category': ['key', 'elements', 'part', scanpart, 'explorer_category', 'inspection', 'object_family', 'surface_comparison', 'type', 'inspection_surface_classification']})
			if len(sdcl_list):  ## if there are SDCL's in the project
				
				for sdcl in sdcl_list:   ##Itterate Through the surfaece defect classifications 
					print(f'SDCL: {sdcl}\n Number of Defects: {sdcl.number_of_defects}')
					if sdcl.number_of_defects is not None and sdcl.number_of_defects > 0:  ##If the SDCL has a defect - Set Reject = True (Combine & Export DFs)
						reject = True
						defect_dict = {}  ## Clear / Create Empty Dict for Dictionary of Values
						defect_list = []  ## Clear / Create Empty List for Defect Values
						##Create the Header with the Attribute Names
						atributes = [
								'index',
								'class_name',
								'class_weight',
								'formula_result',
								'area',
								'volume',
								'width',
								'length',
								'tolerance',
								'max_depth_height',
								'max_depth_height_1sigma',
								'max_depth_height_2sigma',
								'max_depth_height_3sigma',
								'avg_depth_height',
								'avg_depth_height_1sigma',
								'avg_depth_height_2sigma',
								'avg_depth_height_3sigma',
	
								'coordinate',
								'coordinate_of_max_depth_height',
								'coordinate_of_max_depth_height_1sigma',
								'coordinate_of_max_depth_height_2sigma',
								'coordinate_of_max_depth_height_3sigma',
	
								'boundary_line_points',
								'length_boundary_line',
								'length_inner_boundary_line',
	
								'max_depth_height_distance_to_boundary',
								'max_depth_height_distance_to_boundary_at_half_depth',
	
								'max_depth_height_1sigma_distance_to_boundary',
								'max_depth_height_1sigma_distance_to_boundary_at_half_depth',
	
								'max_depth_height_2sigma_distance_to_boundary',
								'max_depth_height_2sigma_distance_to_boundary_at_half_depth',
	
								'max_depth_height_3sigma_distance_to_boundary',
								'max_depth_height_3sigma_distance_to_boundary_at_half_depth',
	
								'max_defect_size_of_surface_defect_map',
								'number_of_grouped_defects',
								'points_out_of_tolerance',
	
								'volume_at_100_of_tolerance_exceedance',
								'volume_at_10_of_tolerance_exceedance',
								'volume_at_20_of_tolerance_exceedance',
								'volume_at_25_of_tolerance_exceedance',
								'volume_at_30_of_tolerance_exceedance',
								'volume_at_40_of_tolerance_exceedance',
								'volume_at_50_of_tolerance_exceedance',
								'volume_at_75_of_tolerance_exceedance'   ]
						defect_dict[sdcl.name] = atributes  ##Add it to the Dictionary for this SDCL
	
						for i in range (sdcl.number_of_defects):   ##Itterate Through the Defects & Add the Defect Characteristics to a List
							defect_list = []
							defect_list.append(i)  ##Add the Index #
							for item in atributes:  ##Itterate Through the Attributes
								if item != 'index':  ##sdcl.defec_char[i].index is not a valid Attribute, but we want it in the CSV, so skip over it
									try: 
										defect_list.append( sdcl.get(f'defect_characteristics[{i}].{item}' ) )  ##Add the arguments to a list
									except:
										pass
								defect_dict[i] = defect_list  ##Add that list to the dictionary for that index[0]
						
						df = pd.DataFrame.from_dict(defect_dict, orient = 'index')	  ### Create a data frame from that dictioanry
						df_list.append(df)  ## Add that Dataframe to a List of Dataframes. 
				
				if reject == True:  ##If Defect Detected - Combine all DFs and Export - Catch for No Dataframe Created- so pd.concat(df_list) will work. 
					combined_df= pd.concat(df_list)  ##Combine The List of DataFrames into 1
					combined_df.to_excel(sdcl_path)  ##Export it to excel 
					print('Succesfully Exported SDCL Excel File')
					return [False, 'Exported SDCL and Excel File Succesfully']  ##Return [False, 'No Errors']
				else:
					return [False, 'No Defects in SDCLs - Did not Export Anything']   ##Return False - No Defects in SDCLs
				
			else:
				return [False, 'No SDCL in Project']  ##Return False, No SDCLs in project, and no problem
		except Exception as Err:
			excp = traceback.format_exc() 
			print(f"Could Not Export SDCL File\nException = {Err}\nTraceback:\n{excp}")
			return [True, excp]  ##Return True(Error) 



if you're working outside kiosk mode and just want to create a report with views, 
 

## Make Something exclusive here: 
gom.script.cad.show_element_exclusively (elements=['colormap / sdcl / labels...etc goes here')
##Set View (sometimes helpful to use local coordinate system for this)
gom.script.view.set_xp_yp_zp (
  up_axis='Z+', 
  use_animation=True, 
  widget='3d_view')
##Adapt Zoom 
gom.script.view.adapt_zoom (
  use_animation=True, 
  widget='3d_view')
##Create Report 
gom.script.report.create_report_page (
  animated_page=False, 
  animation=['snapshot_frame_0', 'Along line "", 10.0s'], 
  imitate_fit_mode='overwrite', 
  master_name='Divergent_letter', 
  template_name='3D', 
  template_orientation='landscape', 
  template_package={'name': 'some company name here_Report_Style', 'uuid': '3f7326ab-d50d-4002-9f7b-6dbd47b789e2', 'version': '1.0.26'}, 
  title='Isometric View')


Seems like all this should be an integrated gom/zeiss inspect function ('create labels and reports for OOT regions of colormap'), but if you need help in the interim, lmk. 

 

Link to comment
Share on other sites

 Share

×
×
  • Create New...