diff --git a/Packages/MIES/MIES_SweepFormula.ipf b/Packages/MIES/MIES_SweepFormula.ipf index 653900172a..70b329e186 100644 --- a/Packages/MIES/MIES_SweepFormula.ipf +++ b/Packages/MIES/MIES_SweepFormula.ipf @@ -1266,16 +1266,9 @@ static Function [WAVE/WAVE formulaResults, STRUCT SF_PlotMetaData plotMetaData] if(WaveExists(wvXRef)) if(numResultsX == 1) WAVE/Z wvXdata = wvXRef[0] - if(WaveExists(wvXdata) && DimSize(wvXdata, ROWS) == numResultsY && numpnts(wvYdata) == 1) - if(IsTextWave(wvXdata)) - WAVE/T wT = wvXdata - Make/FREE/T wvXnewDataT = {wT[i]} - formulaResults[i][%FORMULAX] = wvXnewDataT - else - WAVE wv = wvXdata - Make/FREE/D wvXnewDataD = {wv[i]} - formulaResults[i][%FORMULAX] = wvXnewDataD - endif + if(WaveExists(wvXdata) && DimSize(wvXdata, ROWS) == numResultsY && numpnts(wvYdata) == 1 && numpnts(wvXdata) != 1) + Duplicate/FREE/T/RMD=[i] wvXdata, wvXnewData + formulaResults[i][%FORMULAX] = wvXnewData else formulaResults[i][%FORMULAX] = wvXRef[0] endif @@ -1302,7 +1295,7 @@ static Function [WAVE/WAVE formulaResults, STRUCT SF_PlotMetaData plotMetaData] dataUnits = "" if(!IsNull(dataUnitCheck)) - dataUnits = SelectString(addDataUnitsInAnnotation && !IsEmpty(dataUnitCheck), "", "(" + dataUnitCheck + ")") + dataUnits = SelectString(addDataUnitsInAnnotation && !IsEmpty(dataUnitCheck), "", SF_FormatUnit(dataUnitCheck)) endif plotMetaData.dataType = JWN_GetStringFromWaveNote(wvYRef, SF_META_DATATYPE) @@ -1314,6 +1307,11 @@ static Function [WAVE/WAVE formulaResults, STRUCT SF_PlotMetaData plotMetaData] return [formulaResults, plotMetaData] End +static Function/S SF_FormatUnit(string unit) + + return "(" + unit + ")" +End + static Function/S SF_GetAnnotationPrefix(string dataType) strswitch(dataType) @@ -1744,48 +1742,59 @@ static Function SF_CommonWindowSetup(string win, string graph) DoWindow/T $win, newTitle End -static Function/WAVE SF_GatherYUnits(WAVE/WAVE formulaResults, string explicitLbl, WAVE/Z/T yUnits) +static Function SF_GatherAxisLabels(WAVE/WAVE formulaResults, string explicitLbl, string formulaLabel, WAVE/T axisLabels) variable i, size, numData + string unit - if(!WaveExists(yUnits)) - Make/FREE/T/N=0 yUnits - endif - - size = DimSize(yUnits, ROWS) + size = DimSize(axisLabels, ROWS) if(!isEmpty(explicitLbl)) - Redimension/N=(size + 1) yUnits - yUnits[size] = explicitLbl - return yUnits + Redimension/N=(size + 1) axisLabels + axisLabels[size] = explicitLbl + return NaN endif numData = DimSize(formulaResults, ROWS) - Redimension/N=(size + numData) yUnits + Redimension/N=(size + numData) axisLabels for(i = 0; i < numData; i += 1) WAVE/Z wvResultY = formulaResults[i][%FORMULAY] if(!WaveExists(wvResultY)) continue endif - yUnits[size] = WaveUnits(wvResultY, COLS) - size += 1 + + strswitch(formulaLabel) + case "FORMULAY": + unit = WaveUnits(wvResultY, COLS) + break + case "FORMULAX": + WAVE/Z wvResultX = formulaResults[i][%FORMULAX] + if(WaveExists(wvResultX)) + unit = WaveUnits(wvResultX, ROWS) + else + unit = WaveUnits(wvResultY, ROWS) + endif + break + default: + ASSERT(0, "Unsupported formulaLabel: " + formulaLabel) + break + endswitch + + // fallback to the unit if present + if(!IsEmpty(unit)) + axisLabels[size] = SF_FormatUnit(unit) + size += 1 + endif endfor - Redimension/N=(size) yUnits - return yUnits + Redimension/N=(size) axisLabels End -static Function/S SF_CombineYUnits(WAVE/T units) - - string separator = " / " - string result = "" +static Function/S SF_CombineAxisLabels(WAVE/T axisLabels) - WAVE/T unique = GetUniqueEntries(units, dontDuplicate = 1) - for(unit : unique) - result += unit + separator - endfor + WAVE/T unique = GetUniqueEntries(axisLabels, dontDuplicate = 1) - return RemoveEndingRegExp(result, separator) + return TextWaveToList(unique, " / ", trailSep = 0) End static Function SF_CheckNumTraces(string graph, variable numTraces) @@ -1869,7 +1878,7 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode variable winDisplayMode, showLegend, tagCounter, overrideMarker variable xMxN, yMxN, xPoints, yPoints, keepUserSelection, numAnnotations, formulasAreDifferent, postPlotPSX variable formulaCounter, gdIndex, markerCode, lineCode, lineStyle, traceToFront, isCategoryAxis - string win, wList, winNameTemplate, exWList, wName, annotation, yAxisLabel, wvName, info, xAxis + string win, wList, winNameTemplate, exWList, wName, annotation, xAxisLabel, yAxisLabel, wvName, info, xAxis string formulasRemain, yAndXFormula, xFormula, yFormula, tagText, name, winHook STRUCT SF_PlotMetaData plotMetaData STRUCT RGBColor color @@ -1897,8 +1906,9 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode postPlotPSX = 0 showLegend = 1 formulaCounter = 0 - WAVE/Z wvX = $"" - WAVE/Z/T yUnits = $"" + WAVE/Z wvX = $"" + + Make/FREE/T/N=0 xAxisLabels, yAxisLabels formulasRemain = graphCode[j] @@ -1930,8 +1940,8 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode Abort endtry - WAVE/T yUnitsResult = SF_GatherYUnits(formulaResults, plotMetaData.yAxisLabel, yUnits) - WAVE/T yUnits = yUnitsResult + SF_GatherAxisLabels(formulaResults, plotMetaData.xAxisLabel, "FORMULAX", xAxisLabels) + SF_GatherAxisLabels(formulaResults, plotMetaData.yAxisLabel, "FORMULAY", yAxisLabels) if(!cmpstr(plotMetaData.dataType, SF_DATATYPE_PSX)) PSX_Plot(win, graph, formulaResults, plotMetaData) @@ -2122,8 +2132,6 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode formulaCounter += 1 while(1) - yAxisLabel = SF_CombineYUnits(yUnits) - if(showLegend) customLegend = JWN_GetStringFromWaveNote(formulaResults, SF_META_CUSTOM_LEGEND) @@ -2263,15 +2271,19 @@ static Function SF_FormulaPlotter(string graph, string formula, [variable dmMode endfor endfor - if(!IsEmpty(plotMetaData.xAxisLabel) && traceCnt > 0) - Label/W=$win bottom, plotMetaData.xAxisLabel - ModifyGraph/W=$win tickUnit(bottom)=1 - endif - if(!IsEmpty(yAxisLabel) && traceCnt > 0) - Label/W=$win left, yAxisLabel - ModifyGraph/W=$win tickUnit(left)=1 - endif if(traceCnt > 0) + xAxisLabel = SF_CombineAxisLabels(xAxisLabels) + if(!IsEmpty(xAxisLabel)) + Label/W=$win bottom, xAxisLabel + ModifyGraph/W=$win tickUnit(bottom)=1 + endif + + yAxisLabel = SF_CombineAxisLabels(yAxisLabels) + if(!IsEmpty(yAxisLabel)) + Label/W=$win left, yAxisLabel + ModifyGraph/W=$win tickUnit(left)=1 + endif + ModifyGraph/W=$win zapTZ(bottom)=1 endif diff --git a/Packages/tests/Basic/UTF_SweepFormula.ipf b/Packages/tests/Basic/UTF_SweepFormula.ipf index 7ffeb0d4a6..f64c306ab5 100644 --- a/Packages/tests/Basic/UTF_SweepFormula.ipf +++ b/Packages/tests/Basic/UTF_SweepFormula.ipf @@ -2122,3 +2122,59 @@ static Function TestVariableReadOnly() KillWaves/Z root:testData End + +static Function TestKeepsUnitsWhenMappingMultipleYToOne() + + string win, graph, xAxis, yAxis, code + + win = GetDataBrowserWithData() + graph = SFH_GetFormulaGraphForBrowser(win) + + Make/O data1 = {1} + SetScale/P x, 0, 1, "x1", data1 + SetScale/P y, 0, 1, "y1", data1 + + Make/O data2 = {2, 3} + SetScale/P x, 0, 1, "x2", data2 + SetScale/P y, 0, 1, "y2", data2 + + code = "dataset(wave(data1), wave(data1)) vs dataset(wave(data2))" + ExecuteSweepFormulaInDB(code, win) + yAxis = AxisLabel(graph, "left") + CHECK_EQUAL_STR(yAxis, "(y1)") + xAxis = AxisLabel(graph, "bottom") + CHECK_EQUAL_STR(xAxis, "(x2)") + + KillWaves/Z data1, data2 +End + +static Function TestAxisLabelGathering() + + string win, graph, xAxis, yAxis, code + + win = GetDataBrowserWithData() + graph = SFH_GetFormulaGraphForBrowser(win) + + Make/O data1 = {1} + SetScale/P x, 0, 1, "x1", data1 + SetScale/P y, 0, 1, "y1", data1 + + Make/O data2 = {2} + SetScale/P x, 0, 1, "x2", data2 + SetScale/P y, 0, 1, "y2", data2 + + Make/O data3 = {3} + SetScale/P x, 0, 1, "x3", data3 + SetScale/P y, 0, 1, "y3", data3 + + code = "wave(data1)\r" + \ + "with \r" + \ + "wave(data2) vs wave(data3)\r" + ExecuteSweepFormulaInDB(code, win) + yAxis = AxisLabel(graph, "left") + CHECK_EQUAL_STR(yAxis, "(y1) / (y2)") + xAxis = AxisLabel(graph, "bottom") + CHECK_EQUAL_STR(xAxis, "(x1) / (x3)") + + KillWaves/Z data1, data2, data3 +End diff --git a/Packages/tests/HardwareBasic/UTF_SweepFormulaHardware.ipf b/Packages/tests/HardwareBasic/UTF_SweepFormulaHardware.ipf index 89de8a301f..97233e23f8 100644 --- a/Packages/tests/HardwareBasic/UTF_SweepFormulaHardware.ipf +++ b/Packages/tests/HardwareBasic/UTF_SweepFormulaHardware.ipf @@ -136,7 +136,7 @@ static Function TestSweepFormulaAxisLabels(string device) // Test combine of different data unit in multiple data waves str = AxisLabel(plotWin, "left") - strRef = "mV / pA" + strRef = "(mV) / (pA)" CHECK_EQUAL_STR(strRef, str) str = AxisLabel(plotWin, "bottom")