www.gusucode.com > mbcdata 工具箱 matlab 源码程序 > mbcdata/@calibrationdata/@mbc2minterface/pRead.m
function calibration = pRead(obj, calibration, filename) %PREAD Private method. % PREAD reads a calibration from a MATLAB file. % % See also ROLLBACK, PWRITE. % Copyright 2000-2011 The MathWorks, Inc. narginchk(3,3); nargoutchk(1,1); pm = obj.ProgressManager; pm.reset; % Read calibration from file by running file [pathname, filename, ~] = fileparts(filename); % Change to file directory to ensure it is top of the MATLAB path if ~isempty(pathname) oldDir = cd(pathname); % store former directory else oldDir = pwd; end % Disable warnings oldWarningState = warning('off','all'); % Keep track of whether read was successful fileLoadSuccess = true; % initialize try % Read dataStructure = iLoad(filename); catch ME % Error fileLoadSuccess = false; end % Clean up operations required regardless of success of read cd(oldDir); warning(oldWarningState); % Rethrow error if read was unsuccessful if ~fileLoadSuccess rethrow(ME); end % Process items to discover their types (value, axis, curve or map) f = fieldnames(dataStructure); % Store codes: 1 = value, 2 = axis, 3 = curve, 4 = map, 0 = unknown t = zeros(size(f)); for i = 1:numel(f), thisS = dataStructure.(f{i}); if isnumeric(thisS) && numel(thisS)==1 % Constant from legacy exporter which could have numeric and even % empty values t(i) = 1; % Convert to correct form dataStructure.(f{i}) = struct('X', thisS); elseif isfield(thisS, 'X') && ~isfield(thisS, 'Y') && ~isfield(thisS, 'Z') % Constant t(i) = 1; elseif isfield(thisS, 'X') && isfield(thisS, 'Y') && ~isfield(thisS, 'Z') % Distinguish axes from curves by looking at monotonicity and rem if all(rem(thisS.Y,1)==0) && ~any(diff(thisS.Y)==0) && all(diff(sign(diff(thisS.Y)))==0) % Axis t(i) = 2; else % Curve t(i) = 3; end elseif isfield(thisS, 'X') && isfield(thisS, 'Y') && isfield(thisS, 'Z') % Map t(i) = 4; else % Unknown t(i) = 0; end end % Store lengths for convenience iValues = find(t==1); iAxes = find(t==2); iCurves = find(t==3); iMaps = find(t==4); nValues = numel(iValues); nAxes = numel(iAxes); nCurves = numel(iCurves); nMaps = numel(iMaps); % Process values if nValues > 0 pm.notify(sprintf('Processing %d values', nValues)); value = mbcutils.handleArray(nValues, 1); % preallocate for i = 1:nValues, thisValueS = dataStructure.(f{iValues(i)}); % Value thisValue = calibrationdata.value; thisValue.Identifier = f{iValues(i)}; thisValue.Value = thisValueS.X; % Store value(i) = thisValue; pm.update(i/(nValues+nAxes+nCurves+nMaps)); end % Add to calibration pm.notify(sprintf('Storing %d values', nValues)); calibration.addValue(value); end % Process axes if nAxes > 0 pm.notify(sprintf('Processing %d axes', nAxes)); axis = mbcutils.handleArray(nAxes, 1); % preallocate for i = 1:nAxes, thisAxisS = dataStructure.(f{iAxes(i)}); % Axis thisAxis = calibrationdata.axis; thisAxis.Identifier = f{iAxes(i)}; thisAxis.Value = thisAxisS.X; thisAxis.Index = thisAxisS.Y+1; % CAGE is 0-based, axis is 1-based % Store axis(i) = thisAxis; pm.update((i+nValues)/(nValues+nAxes+nCurves+nMaps)); end % Add to calibration pm.notify(sprintf('Storing %d axes', nAxes)); calibration.addAxis(axis); end % Process curves if nCurves > 0 pm.notify(sprintf('Processing %d curves', nCurves)); curve = mbcutils.handleArray(nCurves, 1); % preallocate xAxis = mbcutils.handleArray(nCurves, 1); % preallocate for i = 1:nCurves, thisCurveS = dataStructure.(f{iCurves(i)}); % Curve thisCurve = calibrationdata.curve; thisCurve.Identifier = f{iCurves(i)}; thisCurve.Value = thisCurveS.Y; % X axis thisXAxis = calibrationdata.axis; thisXAxis.Identifier = thisCurve.XAxisIdentifier; thisXAxis.Value = thisCurveS.X; % Store curve(i) = thisCurve; xAxis(i) = thisXAxis; pm.update((i+nValues+nAxes)/(nValues+nAxes+nCurves+nMaps)); end % Add to calibration pm.notify(sprintf('Storing %d curves', nCurves)); calibration.addCurve(curve); calibration.setAxis(xAxis); end % Process maps if nMaps > 0 pm.notify(sprintf('Processing %d maps', nMaps)); map = mbcutils.handleArray(nMaps, 1); % preallocate xAxis = mbcutils.handleArray(nMaps, 1); % preallocate yAxis = mbcutils.handleArray(nMaps, 1); % preallocate for i = 1:nMaps, thisMapS = dataStructure.(f{iMaps(i)}); % Map thisMap = calibrationdata.map; thisMap.Identifier = f{iMaps(i)}; thisMap.Value = thisMapS.Z; % X axis thisXAxis = calibrationdata.axis; thisXAxis.Identifier = thisMap.XAxisIdentifier; thisXAxis.Value = thisMapS.X; % Y axis thisYAxis = calibrationdata.axis; thisYAxis.Identifier = thisMap.YAxisIdentifier; thisYAxis.Value = thisMapS.Y; % Store map(i) = thisMap; xAxis(i) = thisXAxis; yAxis(i) = thisYAxis; pm.update((i+nValues+nAxes+nCurves)/(nValues+nAxes+nCurves+nMaps)); end % Add to calibration pm.notify(sprintf('Storing %d maps', nMaps)); calibration.addMap(map); calibration.setAxis(xAxis); calibration.setAxis(yAxis); end pm.update(1); pm.notify('Cleaning up'); % ------------------------------------------------------------------------- function s = iLoad(filename) %ILOAD Load file into a clear function workspace. s = iDoLoad(filename); % ------------------------------------------------------------------------- function s = iDoLoad(filename) %IDOLOAD Implementation of load file. evalin('caller', 'clear'); evalin('caller', filename); s = struct; % initialize varNames = evalin('caller', 'who'); for i = 1:numel(varNames), s.(varNames{i}) = evalin('caller', varNames{i}); end