XYZGetIsoline

XYZGetIsoline liefert die x/y-Koordinaten der Isolinie eines XYZ-Datensatzes.

rmXY = XYZGetIsoline(hData, nIsoValue, nLineIndex)

Returnwert

rmXY ist eine zweispaltige Matrix mit den x/y-Koordinaten der Isolinie, oder 0.0 falls die Isolinie nicht gefunden wurde.

Parameter

hData

hData ist die Zugriffsnummer (Handle) des Datensatzes, der mit XYZCreate erzeugt wurde.

nIsoValue

nIsoValue ist die Nummer der gesuchten Isolinie, beginnend mit 1.

nLineIndex

nLineIndex ist die Nummer des gesuchten Isolinienteils, beginnend mit 1.

Beispiel

Das folgende Beispiel konvertiert alle Isolinien eines 3D-Datensatzes in 2D-Datensätze.

def XYZ_to_XY(hXYZData)
{
    hLayer = GetParent(hXYZData)
    nIso = XYZGetNumberOfIsoValues(hXYZData);
    rvValues=XYZGetIsoValues(hXYZData);
    for (i in 1:nIso) {
        j = 1;
        while (1) {
            xy = XYZGetIsoline(hXYZData, i, j);
            if (len(xy) == 1) {
                break;
            }
            hXY = XYCreate(sprintf("%g", rvValues[i]), xy[;1], xy[;2]);
            LayerAddDataset(hLayer, hXY);
            j = j+1;
        }
    }
}

Das folgende Beispiel sichert die x/y-Koordinaten aller Isolinien in einer Excel-Datei. Um die Funktion benutzen zu können, kopieren Sie das Beispiel in eine Datei mit der Erweiterung .ic und speichern die Datei im autoload-Verzeichnis von UniPlot. Markieren Sie einen 3D-Datensatz und wählen Sie aus der Benutzerschalterleiste das Kommando Iso to Excel aus:

RegisterCommand("3D-Datensatz", "__IsoToExcel", "Iso to Excel...");
UserBar_Add("__IsoToExcel");

def <smMatrix, smType> = XYZ_to_XY(hXYZData)
{
     oData = [.];
     oData.MaxN = 0;

     nLine = 0;
     nIso = XYZGetNumberOfIsoValues(hXYZData);
     rvValues = XYZGetIsoValues(hXYZData);
     for (i in 1:nIso) {
          j = 1;
          while (1) {
               rmXY = XYZGetIsoline(hXYZData, i, j);
               if (len(rmXY) == 1) {
                    break;
               }
               if (j == 1) {
                    oValue = [.];
                    oValue.nLine = 0;
               }
               oLine = [.];
               oLine.Value = rvValues[i];
               oLine.rmXY = rmXY;
               oValue[j] = oLine;
               oValue.nLine = oValue.nLine + 1;
               if (oData.MaxN < nr(rmXY)) {
                    oData.MaxN = nr(rmXY);
               }
               j = j+1;
               nLine = nLine + 1;
          }
          if (j > 1) {
               oData[i] = oValue;
          }
     }
     iCol = 1;
     smMatrix = strempty(oData.MaxN+2, nLine*2);
     smType = strempty(oData.MaxN+2, nLine*2) + "s";

     rvKeys = oData.keys(1);
     for (i in rvKeys) {
          oValue = oData[i];
          nLine = oValue.nLine;
          for (j in 1:nLine) {
               iiCol = iCol + (j-1) * 2;
               smMatrix[1; iiCol] = sprintf("%.10lf", oValue[j].Value);
               smMatrix[2; iiCol] = sprintf("%d", j);
               smType[1; iiCol] = "";
               smType[2; iiCol] = "";
               rmXY = oValue[j].rmXY;
               smMatrix[3:nr(rmXY)+2; iiCol, iiCol+1] = smprintf("%.10lf", rmXY);
               smType[3:nr(rmXY)+2; iiCol, iiCol+1] = "";
          }
          iCol = iCol + nLine * 2;
     }
     return;
}

def __IsoToExcel()
{
     hvHandle = GetActiveXYZHandles();
     if (hvHandle[4] == 0) {
          MessageBoxError("Please select a map dataset");
          return 0;
     }

     ssFileName = GetSaveFileName("", "Excel-Tabelle (*.xlsx)|*.xlsx|", 1,
                                             "Save Isoline values...");
     if (ssFileName == "") {
          return;
     }
     ssFileName = _AddFileNameExtension(ssFileName, ".xlsx");
     <smMatrix, smType> = XYZ_to_XY(hvHandle[4]);
     bRet = ExcelWriteEx(ssFileName, smMatrix, smType);
     if (bRet) {
          ShellExecute(ssFileName);
     } else {
          MessageBoxError("Write Excel File failed.")
     }
}

id-877726