Grafik Werbung
Grafik Werbung
Grafik Werbung

Programmierung in einer Messsoftware - 2. Variante des Skripts

Die zweite Variante ist ein wenig eine Kombination von ursprünglichem Python Skript für die Messsoftware ATOS und der vorhergehenden Variante. Es gibt erneut ein Hauptprogramm und eine Funktion, es werden von der Funktion bestimmte Informationen ermittelt und an das Hauptprogramm zur Ausgabe im Editorfenster zurückgegeben (oder zur weiteren Verarbeitung innerhalb des Skripts). Gleichzeitig selektiert die Funktion bestimmte Elemente.

Der Ausgangspunkt sind wieder die CAD-Solldaten mit mehreren darauf definierten Soll-Flächenpunkten. Vor der Ausführung des Skripts sind jetzt aber zwei Flächenpunkte selektiert, im Beispiel der Punkt "P4" und der Punkt "P6".

Beide Punkte weisen einen gewissen Abstand zueinander auf, sind also nicht direkt benachbart. Ja, sie könnten es natürlich sein, aber der Aha-Effekt durch das Skript wäre dahin...

Bild mit einem CAD-Körper und neun Messpunkten

Die Funktion des Skripts enthält entgegen den beiden vorhergehenden Varianten zum Ende hin nun einen Abschnitt, in welchem die Schnittmenge aus allen zuvor bestimmten benachbarten Punkten ermittelt wird, wobei sich die benachbarten Punkte auf die vom Anwender zuvor ausgewählten Soll-Flächenpunkte beziehen. Alle Soll-Elemente dieser Schnittmenge werden von der Funktion dann noch selektiert und in Form einer Liste an das Hauptprogramm zur weiteren Verwendung übergeben:


# Funktion
def benachbarte_elemente( liste_soll_elemente, suchradius):
	
	from functools import reduce
	import math
	wurzel = math.sqrt
	
	DEFAULT_NACHKOMMASTELLEN = 3
	
	# interne Funktion zur Berechnung des Abstands zwischen zwei Elementen bzw. zwischen deren "Mittelpunkten"
	def abstand(element1, element2):
		try:
			# Versuchen, die Koordinaten der beiden Elemente zu holen
			x1 = element1.center_coordinate.x
			y1 = element1.center_coordinate.y
			z1 = element1.center_coordinate.z
			x2 = element2.center_coordinate.x
			y2 = element2.center_coordinate.y
			z2 = element2.center_coordinate.z
		except RuntimeError:
			# Fehler: eines der Elemente hat keine "Mittelpunkt"-Koordinaten, also Rueckgabe eines Abstands 
			# nicht moeglich
			return(None)
		else:
			# Koordinaten sind vorhanden, also Abstand zwischen den "Mittelpunkten" berechnen und zurueckgeben
			abstand = wurzel( (x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2 )
			return(round(abstand, DEFAULT_NACHKOMMASTELLEN))
	
	# leere Elementliste oder Suchradius <= Null abfangen
	if len(liste_soll_elemente)==0 or suchradius<=0:
		return(None)
	# Parameter ok
	else:
		# alle Soll-Elemente in eine Liste
		liste_soll_elemente_alle = [i for i in gom.ElementSelection ({'category': ['key', 'elements', 'explorer_category', 'nominal', 'object_family', 'geometrical_element']})]
		
		# Liste erzeugen mit allen Kombinationen aus den beiden Listen (selektierte Soll-Elemente und alle Elemente)
		liste_alle_kombinationen = [(x,y) for x in liste_soll_elemente for y in liste_soll_elemente_alle if (x!=y and abstand(x,y)<suchradius)]
		
		# Dictionary erzeugen und mit Werten fuellen
		dictionary_ergebnis = {i:[] for i in liste_soll_elemente_selektiert}
		for i in liste_soll_elemente_selektiert:
			for j in liste_alle_kombinationen:
				if j[0]==i:
					dictionary_ergebnis[i] = dictionary_ergebnis[i] + [j[1]]
		
		# Schnittmenge aus allen benachbarten Punkten erzeugen
		liste_tmp=[j for i,j in dictionary_ergebnis.items()]
		if len(liste_tmp)>1:
			# Schnittmenge bilden
			liste_schnittmenge = list(reduce(set.intersection, [set(item) for item in liste_tmp]))	
			# Elemente in Schnittmenge selektieren und Liste der Schnittmenge zurueckgeben
			gom.script.explorer.apply_selection (selection=liste_schnittmenge)
			return(liste_schnittmenge)
		else:
			return([])


Die Schnittmenge im gezeigten Beispiel aus den zunächst selektierten Punkten "P4" und "P6" und bei einem Suchradius von 300mm sind die Punkte "P3" und "P5", welche nach dem Skriptablauf auch beide selektiert sind:


Bild mit einem CAD-Körper und neun Messpunkten

Das Hauptprogramm ruft die Funktion auf und verarbeitet die von dort zurückgelieferte Liste mit den Elementen der Schnittmenge, indem es diese Elemente im Editorfenster einfach ausgibt.


# Hauptprogramm
# alle selektierten Soll-Elemente in eine Liste
liste_soll_elemente_selektiert=[i for i in gom.ElementSelection (gom.app.project.inspection.filter( 'is_selected', True))]

# Funktion zur Bestimmung der benachbarten Elemente aufrufen, falls Soll-Elemente selektiert wurden
if len(liste_soll_elemente_selektiert) > 0:
	ergebnis = benachbarte_elemente( liste_soll_elemente_selektiert, 200)

# Ergebnis ausgeben
print('Schnittmenge benachbarter Punkte:')
print(ergebnis)


Die Ausgabe für das dargestellte Beispiel ist dann
Schnittmenge benachbarter Punkte:
[gom.app.project.inspection['P 3'], gom.app.project.inspection['P 5']]
		


Grafik DownloadDownload Skript (Version 3, PY-Datei als ZIP-Datei, ohne Gewähr auf fehlerfreie Funktionalität)