.. highlightlang:: us .. _xyzcreate: XYZCreate ========= .. index:: XYZCreate .. us.tag XYZCreate GERMAN Changed534 :ref:`XYZCreate` erzeugt einen 3D-Datensatz. Die Daten können entweder als XYZ-Tripel oder als Matrix vorliegen.Die XYZ-Tripel können beliebig in der XY-Ebene verteilt sein. Es sind mindestens 3 Koordinaten-Tripel erforderlich, um einen 3D-Datensatz erzeugen zu können. Aus den XYZ-Tripeln wird durch Interpolation eine Z-Matrix berechnet. .. function:: hData = XYZCreate(ssName, rvX, rvY, rvZ) hData = XYZCreate(ssName, rvX, rvY, rvZ, bIsoScale) hData = XYZCreate(ssName, rvX, rvY, rvZ, bIsoScale, svWOT) hData = XYZCreate(ssName, rvX, rvY, rmZMatrix) hData = XYZCreate(ssName, rvX, rvY, rmZMatrix, bIsoScale) hData = XYZCreate(ssName, rmZMatrix, rvRect) .. us.return **Returnwert** *hData* ist die Zugriffsnummer (Handle), mit der auf den Datensatz zugegriffen werden kann. Falls der Datensatz nicht erzeugt werden kann, ist *hData* gleich 0. .. us.params **Parameter** .. uparam:: ssName *ssName* ist ein skalarer String. .. uparam:: rvX *rvX* ist ein Vektor mit den X-Koordinaten. .. uparam:: rvY *rvY* ist ein Vektor mit den Y-Koordinaten. .. uparam:: rvZ *rvZ* ist ein Vektor mit den Z-Koordinaten. .. uparam:: rmZMatrix *rmZMatrix* ist eine Matrix mit den Z-Koordinaten. Falls die Abstände der Matrixspalten und -zeilen konstant sind, können die x/y-Koordinaten der Matrix über den Parameter *rvRect* festgelegt werden. Wenn die Abstände der Spalten oder Zeilen nicht konstant sind, werden die Koordinaten über die Parameter *rvX* und *rvY* festgelegt. In diesem Fall ist der Parameter *rvX* ein Vektor mit den X-Koordinaten der Matrixspalten und *rvY* ein Vektor mit den Y-Koordinaten der Matrixzeilen. In diesem Fall wird keine Interpolation durchgeführt. Falls die Matrix ungültige Werte enthält, werden diese Werte durch Interpolation ergänzt. Ungültige Werte am Rand werde für die Bestimmung der Hülle verwendet. .. uparam:: rvRect *rvRect* legt der Wertebereich der Z-Matrix in der XY-Ebene fest. .. list-table:: :header-rows: 1 * - Wert - Bedeutung * - rvRect[1] - xmin der ersten Matrix-Spalte * - rvRect[2] - ymin der ersten Matrix-Zeile * - rvRect[3] - xmax der ersten Matrix-Spalte * - rvRect[4] - ymax der letzten Matrix-Zeile .. uparam:: bIsoScale *bIsoScale* hat den Wert TRUE (1), wenn für den Datensatz automatisch Isolinien erzeugt werden sollen und FALSE (0), wenn keine Isolinien erzeugt werden sollen. Falls die Funktion mit vier Parametern aufgerufen wird, wird für *bIsoScale* TRUE verwendet. .. uparam:: svWOT *svWOT* ist ein String-Vektor, der die Volllastlinie festlegt. Jedes Vektorelement besteht aus einem Zeichen und kann die Werte ``"a"``, ``"e"``, ``"v"``, ``"A"``, ``"E"``, ``"V"``, ``""`` annehmen. Die Zeichen haben folgende Bedeutung: .. list-table:: :header-rows: 1 * - Wert - Bedeutung * - ``"a"`` - Anfang der Volllastlinie ohne Beschriftung. * - ``"e"`` - Ende der Volllastlinie ohne Beschriftung. * - ``"v"`` - Punkt gehört zur Volllastlinie und wird nicht beschriftet. * - ``"A"`` - Anfang der Volllastlinie mit Beschriftung. * - ``"E"`` - Ende der Volllastlinie mit Beschriftung. * - ``"V"`` - Punkt gehört zur Volllastlinie und wird beschriftet. * - ``""`` - (leerer String) Punkt gehört nicht zur Volllastlinie. .. us.comment **Kommentar** Bei XYZ-Tripeln müssen die Vektoren alle die gleiche Anzahl an Elementen haben. Die Punkte dürfen in der x,y-Ebene beliebig verteilt sein. Doppelte Datenpunkte, d.h. Punkte mit den gleichen x,y-Koordinaten werden automatisch entfernt. Es sind mindestens 3 Punkte erforderlich. Wenn der Datensatz von einer Matrix erzeugt wird, sollen die Vektoren *rvX* und *rvY* aufsteigend sortiert sein. Falls das nicht der Fall ist, werden die Vektoren aufsteigend sortiert. Die Matrix wird entsprechend mit sortiert. Wenn der Datensatz von einer Matrix erzeugt wird, kann die Hülle mit Hilfe der Funktion :ref:`XYZSetHullNewData` definiert werden. Wird die Funktion ohne den Parameter *svVolllast* aufgerufen, wird eine konvexe Hülle berechnet. Bevor der Datensatz erzeugt wird, werden Datenpunkte, die in der x/y-Ebene sehr dicht beieinander liegen, entfernt. Dazu wird die Funktion :ref:`reduce3d` aufgerufen. Die Funktion legt ein Netz der Größe 100 mal 100 Netz über die Daten. Fallen mehrere Punkte in ein Rechteck des Netzes, wird nur jeweils ein Punkt aus dieser Gruppe verwendet, wobei der "Median"-Punkt verwendet wird. Bei einem 100 mal 100 Netz ergeben sich dann höchstens 10000 Punkte. Liegen alle Punkte auf einer Geraden ergeben sich 100 Punkte. Um das Filtern abzuschalten kann der folgende Aufruf im Kommandofenster eingegeben werden:: WriteProfileInt("Settings", "XYZFilterCallback_enable", 0); Filter wieder einschalten:: WriteProfileInt("Settings", "XYZFilterCallback_enable", 1); Die Filterfunktion kann im Dialogfeld :ref:`tools-more-options` ein- bzw. ausgeschaltet werden. **Korrektur am Kennfeldrand** Die lineare und nicht-lineare Interpolation basiert auf einer Triangulation der Stützstellen in der X/Y-Ebene. Bei der Triangulation können am Rand sehr flache Dreiecke entstehen, die zu unerwarteten Isolinienverläufen führen können. Das folgende Beispiel zeigt in den beiden oberen Diagrammen den Verlauf der Isolinien bei unkorrigierten Daten und in den unteren beiden Diagrammen den Verlauf bei korrigierten Daten am Rand. Bei der Korrektur werden Datenpunkte in der Nähe des Randes auf die konvexe Hülle verschoben. Durch die Korrektur werden bei der Triangulation sehr flache Dreiecke vermieden. .. image:: S:/uniplot-obj/images/xyz_flat_triangle_correction.* Ohne Korrektur der Randpunkte werden durch die Triangulation am Rand abknickende Ioslinienverläufe berechnet. Im Bild kann man das am rechten und linken Rand des Kennfeldes beobachten. Die Korrektur kann im Dialogfeld :ref:`tools-more-options` ein- bzw. ausgeschaltet werden. Der Defaultwert ist "eingeschaltet". Für die Bestimmung der Randpuntke wird eine Toleranz in Prozent eingegeben. Der Defaultwert beträgt 0.1 % des Wertebereichs in der X/Y-Ebene. Für die Berechnung werden die Daten auf den Bereich von 0 bis 1 skaliert. Das entspricht einer Toleranz von 6 1/min für den Drehzahlbereich von 500 bis 6500 1/min. Die Einstellung kann per Skript wie folgt ausgeschaltet werden:: WriteProfileInt("Settings", "XYZRemoveFlatTriangles", 0); Einschalten:: WriteProfileInt("Settings", "XYZRemoveFlatTriangles", 1); .. us.example **Beispiel** Das folgende Beispiel können Sie in einen Editor kopieren (:ref:`dateineu` **[Programm Editor]**) und dann den Befehl :ref:`uniscriptspeichern/ausfuhren` ausführen. Es wird eine 2 mal 3 Matrix erzeugt. (Die x-Koordinaten legen die Spalten fest und y-Koordinaten legen die Zeilen der Matrix fest.) :: x = [1, 1.5, 2] y = [1, 5] z = [1, 1, 3; 1, 2, 3] hData = XYZCreate("Test", x, y, z); if (hData == 0) { error(); } hLayer = LayerCreate(); hDoc = DocCreate(); hPage = PageCreate(); DocAddPage(hDoc, hPage); PageAddLayer(hPage, hLayer); LayerAddDataset(hLayer, hData); LayerAutoScale(hLayer); PageReplot(hPage); .. us.history **History** .. list-table:: :header-rows: 1 * - Version - Beschreibung * - 5.3.4 - Aufruf mit drei Parametern korrigiert: ``XYZCreate(ssName, rmZMatrix, rvRect)``. .. seealso:: :ref:`uberblick-xyz-datensatze`, :ref:`overview-data-file-informations-for-datasets`, :ref:`LayerAddDataset`, :ref:`XYZDestroy`, :ref:`XYZCreateFromMatrix`, :ref:`XYZGetMatrixRange`, :ref:`XYZGetMatrix`, :ref:`XYZGetData`, :ref:`XYZGetMatrixRowData`, :ref:`XYZGetMatrixColData`, :ref:`reduce3d` :sub:`id-428507`