Formen

Die auf dieser Seite erklärten Attribute und Funktionen sind in der Kategorie Shapes zu finden.

Ein häufiger Anwendungsfall ist die Auswahl bestimmter Bildbereiche durch den Benutzer. Dies kann eine Region of Interest oder die Position eines Objekts sein. Ein anderer verwandter Anwendungsfall ist die benutzerdefinierte Messung von Entfernungen oder Bereichen innerhalb eines Bildes.

Um all diesen Anwendungsfällen Rechnung zu tragen, bieten die Eigenschaften in der Kategorie Shapes eine flexible Funktionalität zum Zeichnen/Bearbeiten verschiedener Formen auf dem Bild und zum Abrufen ihrer jeweiligen geometrischen Beschreibungen.

Eigenschaft: ShapeSelectionActive

Die Auswahl einer Form kann über die Eigenschaft ShapeSelectionActive bzw. über den Shape-Button in der Werkzeugleiste (siehe Kategorie Toolbar) aktiviert werden. Solange diese Eigenschaft aktiv ist, kann die Form durch Klicken auf die Bildoberfläche gezeichnet und durch Ziehen und Ablegen der Eckpunkte oder der Form selbst bearbeitet werden. Wenn diese Eigenschaft auf false gesetzt wird und die Eigenschaft ShapeAutoClear aktiv ist, wird die aktuelle Form zurückgesetzt und geht verloren; eventuell benötigte Daten müssen also vorher extrahiert werden.

Die geometrische Beschreibung der gezeichneten Form kann über die Eigenschaft ShapeData abgerufen werden. Je nach der Eigenschaft ShapeType (siehe unten) haben die Formdaten ein anderes Format. Sie können genau das gleiche Format erwarten, das in den interaktiven Controls selbst verwendet wird (z. B. TcHmiVnPolygon und TcHmiVnRectangle), da das Symbol direkt an das intern verwendete Shape Control gebunden ist. Es ist zu beachten, dass die Formen nicht auf den Bildbereich beschränkt sind und daher z.B. auch negative Werte annehmen können. Dies kann mit der Funktion shapeIsInImageArea abgefragt werden.

Eigenschaften: ShapeType und ShapeData

Es stehen verschiedene Arten von Shapes zur Verfügung, die auf zwei verschiedenen Datentypen basieren. Sie können über die Eigenschaft ShapeType eine der folgenden Formen auswählen:

ShapeType

ShapeData

PLC Declaration

Point

[[x, y]]

ARRAY[0..0] OF TcVnPoint2_REAL or ARRAY[0..0] OF TcVnPoint2_LREAL

Line

[[x1, y1], [x2, y2]]

ARRAY[0..1] OF TcVnPoint2_REAL or ARRAY[0..1] OF TcVnPoint2_LREAL

Square,

Rectangle,

Circle,

Ellipse

{

fAngle: angle,

aCenter: [cx, cy],

stSize: {

fWidth: width,

fHeight: height,

},

}

TcVnRotatedRectangle

Polygon

[[x1, y1], [x2, y2], …, …, [xn, yn]]

ARRAY[0..n] OF TcVnPoint2_REAL or ARRAY[0..n] OF TcVnPoint2_LREAL

Die Werte in ShapeData beziehen sich auf die Bildkoordinaten des Original-Bilds.

Formen 1:

Da die Shape-Typen Quadrat und Kreis per Definition immer die gleiche Höhe und Breite haben, werden sie beim Anklicken der zweiten Position nicht genau an diesen Endpunkt gezeichnet, wenn das Seitenverhältnis nicht gleich ist. In diesem Fall kann die gewünschte Position durch Verschieben der entsprechenden Ecke erreicht werden.

Um die Daten der Shape-Typen Quadrat und Rechteck vom Typ TcVnRotatedRectangle direkt an eine SPS-Variable vom Typ TcVnRectangle_UDINT übergeben und als aufrechtes Begrenzungsrechteck ohne Drehwinkel zu verwenden zu können, steht die Konvertierungsfunktion ToUprightRectangle zur Verfügung. Für den umgekehrten Fall gibt es die ToRotatedRectangle Funktion.

Formen 2:

Programmatisch kann die ShapeData-Eigenschaft per Java Skript wie folgt verändert werden:

let control = TcHmi.Controls.get("TcHmiVnImage")
// Polygon with 4 Points
control.setShapeData([[10, 10], [10, 100], [150, 150], [100, 10]])

// Rectangle
control.setShapeData({"aCenter":[200,200],"fAngle":15,"stSize":{"fWidth":150,"fHeight":150}})

Im ersten Beispiel wird ein Polygon mit einem Array von 4 Punkten geschrieben. Zum Schreiben eines Punkts benötigt man nur das erste Element und für eine Linie die ersten beiden. Im zweiten Beispiel wird ein Rechteck geschrieben. Da die Shape Typen Quadrat, Kreis und Ellipse auf dem gleichen Datentyp basieren, kann die gleiche Schreibweise auch für diese Typen verwendet werden.

Die Daten können auch per WriteToSymbol-Aktion an ShapeData geschrieben werden. Dazu kopieren Sie den Teil innerhalb der runden Klammern der setShapeData() Funktion und fügen ihn als Objektwert ein.

Eigenschaft: ShapeAutoClear

Wenn die Eigenschaft ShapeAutoClear aktiv ist und der ShapeType geändert wird, während ShapeSelectionActive true ist, wird die aktuelle Form zurückgesetzt und eine neue Form des ausgewählten Formtyps kann gezeichnet werden. Wenn ShapeAutoClear nicht aktiv ist, bleiben die Daten beim Umschalten des ShapeType erhalten und werden erst mit anklicken oder neu zeichnen einer Form aktualisiert. Wenn zwischen Formtypen des gleichen Basis-Controls umgeschaltet wird, wird direkt die neue Form angezeigt, ansonsten wird nichts angezeigt. Die Typen Punkt, Linie und Polygon gehören dabei zu einer Gruppe, die Typen Quadrat, Rechteck, Kreis und Ellipse zu der anderen.

Eigenschaften: Erscheinungsbild

Das Aussehen der Form und der Bedienpunkte kann durch Einstellen der Farbe und der Größe/Dicke der Kontur geändert werden:

Eigenschaft: Rotierbar

Wenn ShapeIsRotatable aktiv ist, wird bei geeigneten Formen (Linie, Rechteck, Quadrat, Ellipse, Polygon) ein zusätzliches Handle angezeigt, mit dem die Form rotiert werden kann. Über die ShapeAngleInterval Eigenschaft kann die Schrittgröße, in der die Rotation der Form geändert werden kann, in Grad eingestellt werden. Bei dem Defaultwert 0° kann die Form beliebig gedreht werden. Wenn die Form z. B. nur in 4 Positionen platziert werden darf, würde man 90° als Wert eintragen.

Methode: clearShape()

Die gezeichnete Form kann programmatisch durch Aufruf der Methode clearShape gelöscht werden.

Anzeigeelement

Um den Anwendungsfall der Messung von Entfernungen oder Flächen innerhalb des Bildes zu bedienen, bietet die Infobar (siehe Kategorie Infobar) ein Element zur Anzeige von Text, der die aktuell gezeichnete Form repräsentiert. Standardmäßig wird für den Formtyp "Punkt" die Koordinate, für "Linie" die Linienlänge, für "Polygon" die Anzahl der Punkte und für die Formtypen "Quadrat ", "Rechteck", "Kreis" und "Ellipse" die Fläche angezeigt.

Abfrage der Formtypen und Datenwerte

Abhängig vom ausgewählten Formtyp können die Daten in ShapeData verschiedene Formate haben. Um festzustellen welches Format vorliegt, kann entweder der aktuelle ShapeType abgefragt oder anhand der Datenwerte ermittelt werden, z. B. ob die Eigenschaft fAngle definiert ist. Wenn das der Fall ist, liegt ein TcVnRotatedRectangle Typ vor, ansonsten ein Array von Punkten. Um abzufragen, wie viele Punkte im Array enthalten sind, kann die Länge abgefragt werden. Über die Anzahl kann dann festgestellt werden, ob ein Punkt, eine Linie oder ein Polygon mit welcher Anzahl von Punkten vorliegt.

Weiterhin kann durch Abfrage der einzelnen Werte geprüft werden, ob valide Daten vorliegen. Beim Löschen oder Zurücksetzen der Formdaten werden die einzelnen Werte mit 0 beschrieben, was einen ungültigen Wert darstellt.

Über diese Abfragen kann sichergestellt werden, dass die verschiedenen Formtypen jeweils an eine dafür vorgesehene SPS-Variable vom gleichen Typ geschrieben werden und dass nur gültige Daten in das Steuerungsprogramm übernommen werden können.

Formen 3:

Eigenschaft: shapeIsInImageArea

Häufig ist es erforderlich, dass die Formen vollständig innerhalb des Bildes liegen, z. B.um eine Region of Interest setzen zu können. Ob dies der Fall ist, kann über die ReadOnly Eigenschaft shapeIsInImageArea abgefragt werden. Diese gibt true nur dann zurück, wenn aktuell valide ShapeData vorliegen und wenn alle Eckpunkte dieser Form innerhalb des Bildbereichs liegen. Um zwischen einem nicht vorhandenen und einem nicht im Bild liegenden Shape unterscheiden zu können, sollte zusätzlich auf ShapeSelectionActive und valide ShapeData abgefragt werden.

Erweiterte Nutzung von Shapes

Die Shape-Funktionalität wird über separate Controls implementiert, die in das Image Watch Control eingebunden sind. Diese Shape-Controls besitzen einige Properties, die nicht direkt über das ImageWatch Control verfügbar sind. Dazu zählt z. B. das exakte Seitenverhältnis eines Rechtecks. Auf diese Properties kann entweder programmatisch oder durch separate Verwendung der Shape-Controls zugegriffen werden.