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...
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:
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']]
Download Skript (Version 3, PY-Datei als ZIP-Datei, ohne Gewähr auf fehlerfreie Funktionalität)