diff --git a/ShoulderCase/@Humerus/exportHumeralHeadSphere.m b/ShoulderCase/@Humerus/exportHumeralHeadSphere.m new file mode 100644 index 0000000..05a087a --- /dev/null +++ b/ShoulderCase/@Humerus/exportHumeralHeadSphere.m @@ -0,0 +1,9 @@ +function exportHumeralHeadSphere(obj) + exportFilename = fullfile(... + obj.shoulder.SCase.dataSlicerPath,... + "HH_fitted_sphere.ply"); + + humeralHead = Sphere(); + humeralHead.fitTo(obj.landmarks); + humeralHead.exportPly(exportFilename); +end \ No newline at end of file diff --git a/ShoulderCase/@Humerus/loadSlicerLandmarks.m b/ShoulderCase/@Humerus/loadSlicerLandmarks.m new file mode 100644 index 0000000..33251ed --- /dev/null +++ b/ShoulderCase/@Humerus/loadSlicerLandmarks.m @@ -0,0 +1,7 @@ +function loadSlicerLandmarks(obj) + landmarksFilename = fullfile(... + obj.shoulder.SCase.dataSlicerPath,... + "HH_landmarks.mrk.json"); + fileData = jsondecode(fileread(landmarksFilename)); + obj.landmarks = [fileData.markups.controlPoints.position]'; +end \ No newline at end of file diff --git a/ShoulderCase/@ShoulderCase/ShoulderCase.m b/ShoulderCase/@ShoulderCase/ShoulderCase.m index deb1397..9703be5 100755 --- a/ShoulderCase/@ShoulderCase/ShoulderCase.m +++ b/ShoulderCase/@ShoulderCase/ShoulderCase.m @@ -1,839 +1,843 @@ classdef ShoulderCase < handle % Properties and methods associated to the SoulderCase object. % Author: Alexandre Terrier, EPFL-LBO % Matthieu Boubat, EPFL-LBO % Creation date: 2018-07-01 % Revision date: 2020-07-23 % TODO: % Need method to load properties (from amira, matlab, excel, SQL) % Need method to save properties (in matlab, excel, SQL) % Remove datapath from constants % properties id = []; % id of the shoulder case, as it appears in the database (Pnnn) id4C = []; % SCaseId with P/N followed by 3 digits --> 4 char diagnosis = []; treatment = []; outcome = []; patient = []; shoulderManual = []; shoulderAuto = []; study = []; comment = []; dataCTPath = []; end methods (Access = ?ShoulderCaseLoader) function obj = ShoulderCase(SCaseID,dataCTPath) % SCaseID validation rawSCaseID = SCaseIDParser(SCaseID); assert(rawSCaseID.isValidID,'The input argument is not a valid SCaseID.') obj.id = SCaseID; obj.id4C = rawSCaseID.getIDWithNumberOfDigits(3); % path attribution obj.dataCTPath = dataCTPath; % Folder creation if not(isfolder(obj.dataMatlabPath)) mkdir(obj.dataMatlabPath); end % Initialsation obj.patient = Patient(obj); obj.shoulderManual = ShoulderManual(obj); obj.shoulderAuto = ShoulderAuto(obj); end end methods function output = dataPath(obj) output = fileparts(obj.dataCTPath); end function output = dataAmiraPath(obj) output = fullfile(obj.dataCTPath, "amira"); end function output = dataMatlabPath(obj) output = fullfile(obj.dataCTPath, "matlab"); end function output = dataDicomPath(obj) output = fullfile(obj.dataCTPath, "dicom"); end + function output = dataSlicerPath(obj) + output = fullfile(obj.dataCTPath, "slicer"); + end + function outputArg = output(obj, varargin) % Below is copy/past from previous version % This function is used to output the variable Results, used % by scapula_measurePKG the modified funcion scapula_measure. % inputArg could be as in scapula_calculation % 'density', 'References', 'obliqueSlice', 'display' Result.SCase_id = obj.id; % 1 Result.glenoid_Radius = obj.shoulderManual.scapula.glenoid.radius; % 2 Result.glenoid_radiusRMSE = obj.shoulderManual.scapula.glenoid.fittedSphere.RMSE; % 3 % 3 %Result.glenoidSphericity = ' '; %Result.glenoid_biconcave = ' '; Result.glenoid_depth = obj.shoulderManual.scapula.glenoid.depth; % 4 Result.glenoid_width = obj.shoulderManual.scapula.glenoid.width; % 5 Result.glenoid_height = obj.shoulderManual.scapula.glenoid.height; % 6 Result.glenoid_center_PA = obj.shoulderManual.scapula.glenoid.centerLocal(1); % 7 Result.glenoid_center_IS = obj.shoulderManual.scapula.glenoid.centerLocal(2); % 8 Result.glenoid_center_ML = obj.shoulderManual.scapula.glenoid.centerLocal(3); % 9 Result.glenoid_version_ampl = obj.shoulderManual.scapula.glenoid.versionAmplitude; % 10 Result.glenoid_version_orient = obj.shoulderManual.scapula.glenoid.versionOrientation; % 11 Result.glenoid_Version = obj.shoulderManual.scapula.glenoid.version; % 12 Result.glenoid_Inclination = obj.shoulderManual.scapula.glenoid.inclination; % 13 Result.humerus_joint_radius = ' '; % 14 Result.humeral_head_radius = obj.shoulderManual.humerus.radius; % 15 % Result.humerus_GHsublux_2D = ' '; % Result.humerus_SHsublux_2D = ' '; Result.humerus_GHsubluxation_ampl = obj.shoulderManual.humerus.GHSAmpl; % 16 Result.humerus_GHsubluxation_orient = obj.shoulderManual.humerus.GHSOrient; % 17 Result.humerus_SHsubluxation_ampl = obj.shoulderManual.humerus.SHSAmpl; % 18 Result.humerus_SHsubluxation_orient = obj.shoulderManual.humerus.SHSOrient; % 19 Result.scapula_CSA = obj.shoulderManual.scapula.acromion.criticalShoulderAngle; % radCSA; % 5 Lines below should be updated Result.scapula_CTangle = 0; %CTorientation; %20 Result.scapula_CTangleVersion = 0; % WearPlaneAngle; %21 Result.scapula_CTangleSHS = 0; % SHSPlaneAngle; % 22 Result.scapula_CTangleGHS = 0; % GHSPlaneAngle; % 23 Result.scapula_PlaneRMSE = 0; %PlaneRMSE;%24 Result.scapula_AI = obj.shoulderManual.scapula.acromion.acromionIndex; outputArg = Result; end function outputArg = saveMatlab(obj) % Save SCase to matlab file dir = obj.dataMatlabPath; % Create dir if not exist try if ~exist(dir, 'dir') % create directory if it does not exist mkdir(dir); end catch fprintf('Error creating the matlab directory \n'); % Should be in log end % Save SCase in matlab directoty, in a file named SCaseCNNN.m filename = 'SCase'; filename = fullfile(obj.dataMatlabPath, filename + ".mat"); dataCTPath = obj.dataCTPath; try SCase = obj; % Delete CT path wich must be set when loading/creating the % SCase to avoid messing with paths on different systems. SCase.dataCTPath = []; save(filename, 'SCase'); outputArg = 1; catch fprintf('Error creating SCase matlab file \n'); % Should be in log outputArg = -1; end obj.dataCTPath = dataCTPath; end function outputArg = appendToCSV(obj,filename) % Save SCase to csv file logFid = fopen('log/measureSCase.log', 'a'); dataDir = ConfigFileExtractor.getVariable('dataDir'); xlsDir = [dataDir '/Excel/xlsFromMatlab']; fid = fopen([xlsDir '/' filename],'a'); fprintf(fid,[... obj.id ','... % SCase_id obj.shoulderManual.side ','... % shoulder_side num2str(obj.shoulderManual.scapula.glenoid.radius) ','... % glenoid_radius num2str(obj.shoulderManual.scapula.glenoid.fittedSphere.RMSE) ','... % glenoid_sphereRMSE num2str(obj.shoulderManual.scapula.glenoid.depth) ','... % glenoid_depth num2str(obj.shoulderManual.scapula.glenoid.width) ','... % glenoid_width num2str(obj.shoulderManual.scapula.glenoid.height) ','... % glenoid_height num2str(obj.shoulderManual.scapula.glenoid.centerLocal.x) ','... % glenoid_centerPA num2str(obj.shoulderManual.scapula.glenoid.centerLocal.y) ','... % glenoid_centerIS num2str(obj.shoulderManual.scapula.glenoid.centerLocal.z) ','... % glenoid_centerML num2str(obj.shoulderManual.scapula.glenoid.versionAmplitude) ','... % glenoid_versionAmpl num2str(obj.shoulderManual.scapula.glenoid.versionOrientation) ','... % glenoid_versionOrientation num2str(obj.shoulderManual.scapula.glenoid.version) ','... % glenoid_version num2str(obj.shoulderManual.scapula.glenoid.inclination) ','... % glenoid_inclination num2str(obj.shoulderManual.humerus.jointRadius) ','... % humerus_jointRadius num2str(obj.shoulderManual.humerus.radius) ','... % humerus_headRadius num2str(obj.shoulderManual.humerus.GHSAmpl) ','... % humerus_GHSAmpl num2str(obj.shoulderManual.humerus.GHSOrient) ','... % humerus_GHSOrient num2str(obj.shoulderManual.humerus.SHSAmpl) ','... % humerus_SHSAmpl num2str(obj.shoulderManual.humerus.SHSOrient) ','... % humerus_SHSOrient num2str(obj.shoulderManual.humerus.SHSAngle) ','... % humerus_SHSAgle num2str(obj.shoulderManual.humerus.SHSPA) ','... % humerus_SHSPA num2str(obj.shoulderManual.humerus.SHSIS) ','... % humerus_SHSIS num2str(obj.shoulderManual.scapula.acromion.AI) ','... % acromion_AI num2str(obj.shoulderManual.scapula.acromion.CSA) ','... % acromion_CSA num2str(obj.shoulderManual.scapula.acromion.PSA) ','... % acromion_PSA num2str(obj.shoulderManual.scapula.acromion.AAA) '\n'... % acromion_AAA ]); fclose(fid); fclose(logFid); outputArg = 1; end function outputArg = saveExcel(~) % Save SCase to Excel file outputArg = 1; end function outputArg = saveSQL(~) % Save SCase to MySQL database outputArg = 1; end function outputArg = SCaseDataToTable(obj, varargin) % This method export all of the measurements and data of a % SCase to a table, wgich then can be used to export all of the % measurements as csv or excel file (see exportSCaseData function) %char(n), nan(a, b) and "" are where the calculations have not %been done. I used these based on the field of data in other %SCases. For examnple where we want char, I used char(nan). Result.SCase_id = obj.id; if isnan(obj.diagnosis) Result.SCase_diagnosis = char(nan); else Result.SCase_diagnosis = obj.diagnosis; end if isempty(obj.treatment) Result.SCase_treatment = char(nan); elseif isnan(obj.treatment) Result.SCase_treatment = char(nan); else Result.SCase_treatment = obj.treatment; end if isempty(obj.outcome) Result.SCase_outcome = char(nan); else Result.SCase_outcome = obj.outcome; end %Result.patient_id = obj.patient.id; %Result.patient_idMed = obj.patient.idMed; Result.patient_gender = obj.patient.gender; Result.patient_age = obj.patient.age; Result.patient_ethnicity = obj.patient.ethnicity; Result.patient_weight = obj.patient.weight; Result.patient_height = obj.patient.height; if isempty(obj.patient.BMI) Result.patient_BMI = nan; elseif obj.patient.BMI(1) == '#' Result.patient_BMI = nan; else Result.patient_BMI = obj.patient.BMI; end Result.patient_comment = obj.patient.comment; %shoulderManual Result.shoulderManual_side = obj.shoulderManual.side; if isempty(obj.shoulderManual.scapula.angulusInferior) Result.shoulderManual_scapula_angulusInferior = nan(1,3); Result.shoulderManual_scapula_angulusInferiorLocal = nan(1,3); Result.shoulderManual_scapula_trigonumSpinae = nan(1,3); Result.shoulderManual_scapula_processusCoracoideus = nan(1,3); Result.shoulderManual_scapula_acromioClavicular = nan(1,3); Result.shoulderManual_scapula_angulusAcromialis = nan(1,3); Result.shoulderManual_scapula_spinoGlenoidNotch = nan(1,3); else Result.shoulderManual_scapula_angulusInferior = obj.shoulderManual().scapula.angulusInferior; Result.shoulderManual_scapula_angulusInferiorLocal = obj.shoulderManual().scapula.angulusInferiorLocal; Result.shoulderManual_scapula_trigonumSpinae = obj.shoulderManual().scapula.trigonumSpinae; Result.shoulderManual_scapula_processusCoracoideus = obj.shoulderManual().scapula.processusCoracoideus; Result.shoulderManual_scapula_acromioClavicular = obj.shoulderManual().scapula.acromioClavicular; Result.shoulderManual_scapula_angulusAcromialis = obj.shoulderManual().scapula.angulusAcromialis; Result.shoulderManual_scapula_spinoGlenoidNotch = obj.shoulderManual().scapula.spinoGlenoidNotch; end if isempty(obj.shoulderManual.scapula.coordSys.ML) Result.shoulderManual_scapula_coordSys_ML = nan(1,3); Result.shoulderManual_scapula_coordSys_PA = nan(1,3); Result.shoulderManual_scapula_coordSys_IS = nan(1,3); Result.shoulderManual_scapula_coordSys_origin = nan(1,3); else Result.shoulderManual_scapula_coordSys_ML = obj.shoulderManual.scapula.coordSys.ML; Result.shoulderManual_scapula_coordSys_PA = obj.shoulderManual.scapula.coordSys.PA; Result.shoulderManual_scapula_coordSys_IS = obj.shoulderManual.scapula.coordSys.IS; Result.shoulderManual_scapula_coordSys_origin = obj.shoulderManual.scapula.coordSys.origin; end if isempty(obj.shoulderManual.scapula.glenoid.center) Result.shoulderManual_scapula_glenoid_center = nan(1,3); Result.shoulderManual_scapula_glenoid_centerLocal_x = nan; Result.shoulderManual_scapula_glenoid_centerLocal_y = nan; Result.shoulderManual_scapula_glenoid_centerLocal_z = nan; Result.shoulderManual_scapula_glenoid_radius = nan; Result.shoulderManual_scapula_glenoid_centerLine = nan(1,3); else Result.shoulderManual_scapula_glenoid_center = obj.shoulderManual.scapula.glenoid.center; Result.shoulderManual_scapula_glenoid_centerLocal_x = obj.shoulderManual.scapula.glenoid.centerLocal.x; Result.shoulderManual_scapula_glenoid_centerLocal_y = obj.shoulderManual.scapula.glenoid.centerLocal.y; Result.shoulderManual_scapula_glenoid_centerLocal_z = obj.shoulderManual.scapula.glenoid.centerLocal.z; Result.shoulderManual_scapula_glenoid_radius = obj.shoulderManual.scapula.glenoid.radius; Result.shoulderManual_scapula_glenoid_centerLine = obj.shoulderManual.scapula.glenoid.centerLine; end if isempty(obj.shoulderManual.scapula.glenoid.depth) Result.shoulderManual_scapula_glenoid_depth = nan; else Result.shoulderManual_scapula_glenoid_depth = obj.shoulderManual.scapula.glenoid.depth; end if isempty(obj.shoulderManual.scapula.glenoid.width) Result.shoulderManual_scapula_glenoid_width = nan; else Result.shoulderManual_scapula_glenoid_width = obj.shoulderManual.scapula.glenoid.width; end if isempty(obj.shoulderManual.scapula.glenoid.height) Result.shoulderManual_scapula_glenoid_height = nan; else Result.shoulderManual_scapula_glenoid_height = obj.shoulderManual.scapula.glenoid.height; end if isempty(obj.shoulderManual.scapula.glenoid.anteroSuperiorAngle) Result.shoulderManual_scapula_glenoid_anteroSuperiorAngle = nan; else Result.shoulderManual_scapula_glenoid_anteroSuperiorAngle = obj.shoulderManual.scapula.glenoid.anteroSuperiorAngle; end if isempty(obj.shoulderManual.scapula.glenoid.versionAmplitude) Result.shoulderManual_scapula_glenoid_versionAmplitude = nan; Result.shoulderManual_scapula_glenoid_versionOrientation = nan; Result.shoulderManual_scapula_glenoid_version = nan; Result.shoulderManual_scapula_glenoid_inclination = nan; else Result.shoulderManual_scapula_glenoid_versionAmplitude = obj.shoulderManual.scapula.glenoid.versionAmplitude; Result.shoulderManual_scapula_glenoid_versionOrientation = obj.shoulderManual.scapula.glenoid.versionOrientation; Result.shoulderManual_scapula_glenoid_version = obj.shoulderManual.scapula.glenoid.version; Result.shoulderManual_scapula_glenoid_inclination = obj.shoulderManual.scapula.glenoid.inclination; end if isempty(obj.shoulderManual.scapula.glenoid.density) Result.shoulderManual_scapula_glenoid_density = nan(1, 6); else Result.shoulderManual_scapula_glenoid_density = obj.shoulderManual.scapula.glenoid.density; end if isempty(obj.shoulderManual.scapula.glenoid.comment) Result.shoulderManual_scapula_glenoid_comment = nan; else Result.shoulderManual_scapula_glenoid_comment = obj.shoulderManual.scapula.glenoid.comment; end if isempty(obj.shoulderManual.scapula.glenoid.fittedSphere.center) Result.shoulderManual_scapula_glenoid_fittedSphere_center = nan(1,3); Result.shoulderManual_scapula_glenoid_fittedSphere_radius = nan; Result.shoulderManual_scapula_glenoid_fittedSphere_R2 = nan; Result.shoulderManual_scapula_glenoid_fittedSphere_RMSE = nan; else Result.shoulderManual_scapula_glenoid_fittedSphere_center = ... obj.shoulderManual.scapula.glenoid.fittedSphere.center; Result.shoulderManual_scapula_glenoid_fittedSphere_radius = ... obj.shoulderManual.scapula.glenoid.fittedSphere.radius; Result.shoulderManual_scapula_glenoid_fittedSphere_R2 = ... obj.shoulderManual.scapula.glenoid.fittedSphere.R2; Result.shoulderManual_scapula_glenoid_fittedSphere_RMSE = ... obj.shoulderManual.scapula.glenoid.fittedSphere.RMSE; end if isempty(obj.shoulderManual.scapula.glenoid.walch) Result.shoulderManual_scapula_glenoid_walch = char(nan); elseif isnan(obj.shoulderManual.scapula.glenoid.walch) Result.shoulderManual_scapula_glenoid_walch = char(nan); else Result.shoulderManual_scapula_glenoid_walch = obj.shoulderManual.scapula.glenoid.walch; end if isempty(obj.shoulderManual.scapula.acromion.AI) Result.shoulderManual_scapula_acromion_AI = nan; Result.shoulderManual_scapula_acromion_CSA = nan; Result.shoulderManual_scapula_acromion_PSA = nan; Result.shoulderManual_scapula_acromion_PSL = nan; Result.shoulderManual_scapula_acromion_AAA = nan; Result.shoulderManual_scapula_acromion_AAL = nan; Result.shoulderManual_scapula_acromion_AAx = nan; Result.shoulderManual_scapula_acromion_AAy = nan; Result.shoulderManual_scapula_acromion_AAz = nan; Result.shoulderManual_scapula_acromion_ACx = nan; Result.shoulderManual_scapula_acromion_ACy = nan; Result.shoulderManual_scapula_acromion_ACz = nan; else Result.shoulderManual_scapula_acromion_AI = obj.shoulderManual.scapula.acromion.AI; Result.shoulderManual_scapula_acromion_CSA = obj.shoulderManual.scapula.acromion.CSA; Result.shoulderManual_scapula_acromion_PSA = obj.shoulderManual.scapula.acromion.PSA; Result.shoulderManual_scapula_acromion_PSL = obj.shoulderManual.scapula.acromion.PSL; Result.shoulderManual_scapula_acromion_AAA = obj.shoulderManual.scapula.acromion.AAA; Result.shoulderManual_scapula_acromion_AAL = obj.shoulderManual.scapula.acromion.AAL; Result.shoulderManual_scapula_acromion_AAx = obj.shoulderManual.scapula.acromion.AAx; Result.shoulderManual_scapula_acromion_AAy = obj.shoulderManual.scapula.acromion.AAy; Result.shoulderManual_scapula_acromion_AAz = obj.shoulderManual.scapula.acromion.AAz; Result.shoulderManual_scapula_acromion_ACx = obj.shoulderManual.scapula.acromion.ACx; Result.shoulderManual_scapula_acromion_ACy = obj.shoulderManual.scapula.acromion.ACy; Result.shoulderManual_scapula_acromion_ACz = obj.shoulderManual.scapula.acromion.ACz; end if isempty(obj.shoulderManual.humerus.center) Result.shoulderManual_humerus_center = nan(1,3); Result.shoulderManual_humerus_radius = nan; else Result.shoulderManual_humerus_center = obj.shoulderManual.humerus.center; Result.shoulderManual_humerus_radius = obj.shoulderManual.humerus.radius; end if isempty(obj.shoulderManual.humerus.jointRadius) Result.shoulderManual_humerus_jointRadius = nan; else Result.shoulderManual_humerus_jointRadius = obj.shoulderManual.humerus.jointRadius; end if isempty(obj.shoulderManual.humerus.SHSAngle) Result.shoulderManual_humerus_SHSAngle = nan; Result.shoulderManual_humerus_SHSPA = nan; Result.shoulderManual_humerus_SHSIS = nan; Result.shoulderManual_humerus_SHSAmpl = nan; Result.shoulderManual_humerus_SHSOrient = nan; Result.shoulderManual_humerus_GHSAmpl = nan; Result.shoulderManual_humerus_GHSOrient = nan; else Result.shoulderManual_humerus_SHSAngle = obj.shoulderManual.humerus.SHSAngle; Result.shoulderManual_humerus_SHSPA = obj.shoulderManual.humerus.SHSPA; Result.shoulderManual_humerus_SHSIS = obj.shoulderManual.humerus.SHSIS; Result.shoulderManual_humerus_SHSAmpl = obj.shoulderManual.humerus.SHSAmpl; Result.shoulderManual_humerus_SHSOrient = obj.shoulderManual.humerus.SHSOrient; Result.shoulderManual_humerus_GHSAmpl = obj.shoulderManual.humerus.GHSAmpl; Result.shoulderManual_humerus_GHSOrient = obj.shoulderManual.humerus.GHSOrient; end if isempty(obj.shoulderManual.rotatorCuff) Result.shoulderManual_muscles_IS_segmentationSet = char(nan); Result.shoulderManual_muscles_IS_sliceName = char(nan); Result.shoulderManual_muscles_IS_PCSA = ""; Result.shoulderManual_muscles_IS_atrophy = ""; Result.shoulderManual_muscles_IS_fat = ""; Result.shoulderManual_muscles_IS_osteochondroma = ""; Result.shoulderManual_muscles_IS_degeneration = ""; Result.shoulderManual_muscles_SS_segmentationSet = char(nan); Result.shoulderManual_muscles_SS_sliceName = char(nan); Result.shoulderManual_muscles_SS_PCSA = ""; Result.shoulderManual_muscles_SS_atrophy = ""; Result.shoulderManual_muscles_SS_fat = ""; Result.shoulderManual_muscles_SS_osteochondroma = ""; Result.shoulderManual_muscles_SS_degeneration = ""; Result.shoulderManual_muscles_SC_segmentationSet = char(nan); Result.shoulderManual_muscles_SC_sliceName = char(nan); Result.shoulderManual_muscles_SC_PCSA = ""; Result.shoulderManual_muscles_SC_atrophy = ""; Result.shoulderManual_muscles_SC_fat = ""; Result.shoulderManual_muscles_SC_osteochondroma = ""; Result.shoulderManual_muscles_SC_degeneration = ""; Result.shoulderManual_muscles_TM_segmentationSet = char(nan); Result.shoulderManual_muscles_TM_sliceName = char(nan); Result.shoulderManual_muscles_TM_PCSA = ""; Result.shoulderManual_muscles_TM_atrophy = ""; Result.shoulderManual_muscles_TM_fat = ""; Result.shoulderManual_muscles_TM_osteochondroma = ""; Result.shoulderManual_muscles_TM_degeneration = ""; else try Result.shoulderManual_muscles_IS_segmentationSet = obj.shoulderManual.rotatorCuff.IS.segmentationSet; Result.shoulderManual_muscles_IS_sliceName = obj.shoulderManual.rotatorCuff.IS.sliceName; Result.shoulderManual_muscles_IS_PCSA = obj.shoulderManual.rotatorCuff.IS.PCSA; Result.shoulderManual_muscles_IS_atrophy = obj.shoulderManual.rotatorCuff.IS.atrophy; Result.shoulderManual_muscles_IS_fat = obj.shoulderManual.rotatorCuff.IS.fat; Result.shoulderManual_muscles_IS_osteochondroma = obj.shoulderManual.rotatorCuff.IS.osteochondroma; Result.shoulderManual_muscles_IS_degeneration = obj.shoulderManual.rotatorCuff.IS.degeneration; Result.shoulderManual_muscles_SS_segmentationSet = obj.shoulderManual.rotatorCuff.SS.segmentationSet; Result.shoulderManual_muscles_SS_sliceName = obj.shoulderManual.rotatorCuff.SS.sliceName; Result.shoulderManual_muscles_SS_PCSA = obj.shoulderManual.rotatorCuff.SS.PCSA; if isempty(obj.shoulderManual.rotatorCuff.SS.atrophy) Result.shoulderManual_muscles_SS_atrophy = nan; else Result.shoulderManual_muscles_SS_atrophy = obj.shoulderManual.rotatorCuff.SS.atrophy; end if isempty(obj.shoulderManual.rotatorCuff.SS.fat) Result.shoulderManual_muscles_SS_fat = nan; else Result.shoulderManual_muscles_SS_fat = obj.shoulderManual.rotatorCuff.SS.fat; end if isempty(obj.shoulderManual.rotatorCuff.SS.osteochondroma) Result.shoulderManual_muscles_SS_osteochondroma = nan; else Result.shoulderManual_muscles_SS_osteochondroma = obj.shoulderManual.rotatorCuff.SS.osteochondroma; end if isempty(obj.shoulderManual.rotatorCuff.SS.degeneration) Result.shoulderManual_muscles_SS_degeneration = nan; else Result.shoulderManual_muscles_SS_degeneration = obj.shoulderManual.rotatorCuff.SS.degeneration; end Result.shoulderManual_muscles_SC_segmentationSet = obj.shoulderManual.rotatorCuff.SC.segmentationSet; Result.shoulderManual_muscles_SC_sliceName = obj.shoulderManual.rotatorCuff.SC.sliceName; Result.shoulderManual_muscles_SC_PCSA = obj.shoulderManual.rotatorCuff.SC.PCSA; Result.shoulderManual_muscles_SC_atrophy = obj.shoulderManual.rotatorCuff.SC.atrophy; Result.shoulderManual_muscles_SC_fat = obj.shoulderManual.rotatorCuff.SC.fat; Result.shoulderManual_muscles_SC_osteochondroma = obj.shoulderManual.rotatorCuff.SC.osteochondroma; Result.shoulderManual_muscles_SC_degeneration = obj.shoulderManual.rotatorCuff.SC.degeneration; Result.shoulderManual_muscles_TM_segmentationSet = obj.shoulderManual.rotatorCuff.TM.segmentationSet; Result.shoulderManual_muscles_TM_sliceName = obj.shoulderManual.rotatorCuff.TM.sliceName; Result.shoulderManual_muscles_TM_PCSA = obj.shoulderManual.rotatorCuff.TM.PCSA; if isempty(obj.shoulderManual.rotatorCuff.TM.atrophy) Result.shoulderManual_muscles_TM_atrophy = nan; else Result.shoulderManual_muscles_TM_atrophy = obj.shoulderManual.rotatorCuff.TM.atrophy; end if isempty(obj.shoulderManual.rotatorCuff.TM.fat) Result.shoulderManual_muscles_TM_fat = nan; else Result.shoulderManual_muscles_TM_fat = obj.shoulderManual.rotatorCuff.TM.fat; end if isempty(obj.shoulderManual.rotatorCuff.TM.osteochondroma) Result.shoulderManual_muscles_TM_osteochondroma = nan; else Result.shoulderManual_muscles_TM_osteochondroma = obj.shoulderManual.rotatorCuff.TM.osteochondroma; end if isempty(obj.shoulderManual.rotatorCuff.TM.degeneration) Result.shoulderManual_muscles_TM_degeneration = nan; else Result.shoulderManual_muscles_TM_degeneration = obj.shoulderManual.rotatorCuff.TM.degeneration; end catch Result.shoulderManual_muscles_IS_segmentationSet = 0; Result.shoulderManual_muscles_IS_sliceName = 0; Result.shoulderManual_muscles_IS_PCSA = 0; Result.shoulderManual_muscles_IS_atrophy = 0; Result.shoulderManual_muscles_IS_fat = 0; Result.shoulderManual_muscles_IS_osteochondroma = 0; Result.shoulderManual_muscles_IS_degeneration = 0; Result.shoulderManual_muscles_SS_segmentationSet = 0; Result.shoulderManual_muscles_SS_sliceName = 0; Result.shoulderManual_muscles_SS_PCSA = 0; Result.shoulderManual_muscles_SS_atrophy = 0; Result.shoulderManual_muscles_SS_fat = 0; Result.shoulderManual_muscles_SS_osteochondroma = 0; Result.shoulderManual_muscles_SS_degeneration = 0; Result.shoulderManual_muscles_SC_segmentationSet = 0; Result.shoulderManual_muscles_SC_sliceName = 0; Result.shoulderManual_muscles_SC_PCSA = 0; Result.shoulderManual_muscles_SC_atrophy = 0; Result.shoulderManual_muscles_SC_fat = 0; Result.shoulderManual_muscles_SC_osteochondroma = 0; Result.shoulderManual_muscles_SC_degeneration = 0; Result.shoulderManual_muscles_TM_segmentationSet = 0; Result.shoulderManual_muscles_TM_sliceName = 0; Result.shoulderManual_muscles_TM_PCSA = 0; Result.shoulderManual_muscles_TM_atrophy = 0; Result.shoulderManual_muscles_TM_fat = 0; Result.shoulderManual_muscles_TM_osteochondroma = 0; Result.shoulderManual_muscles_TM_degeneration = 0; end end Result.shoulderAuto_side = obj.shoulderAuto().side; if isempty(obj.shoulderAuto().scapula.angulusInferior) Result.shoulderAuto_scapula_angulusInferior = nan(1,3); else Result.shoulderAuto_scapula_angulusInferior = obj.shoulderAuto().scapula.angulusInferior; end if isempty(obj.shoulderAuto().scapula.angulusInferiorLocal) Result.shoulderAuto_scapula_angulusInferiorLocal = nan(1,3); else Result.shoulderAuto_scapula_angulusInferiorLocal = obj.shoulderAuto().scapula.angulusInferiorLocal; end if isempty(obj.shoulderAuto().scapula.trigonumSpinae) Result.shoulderAuto_scapula_trigonumSpinae = nan(1,3); else Result.shoulderAuto_scapula_trigonumSpinae = obj.shoulderAuto().scapula.trigonumSpinae; end if isempty(obj.shoulderAuto().scapula.processusCoracoideus) Result.shoulderAuto_scapula_processusCoracoideus = nan(1,3); Result.shoulderAuto_scapula_acromioClavicular = nan(1,3); Result.shoulderAuto_scapula_angulusAcromialis = nan(1,3); Result.shoulderAuto_scapula_spinoGlenoidNotch = nan(1,3); else Result.shoulderAuto_scapula_processusCoracoideus = obj.shoulderAuto.scapula.processusCoracoideus; Result.shoulderAuto_scapula_acromioClavicular = obj.shoulderAuto.scapula.acromioClavicular; Result.shoulderAuto_scapula_angulusAcromialis = obj.shoulderAuto.scapula.angulusAcromialis; Result.shoulderAuto_scapula_spinoGlenoidNotch = obj.shoulderAuto.scapula.spinoGlenoidNotch; end if isempty(obj.shoulderAuto.scapula.coordSys.ML) Result.shoulderAuto_scapula_coordSys_ML = nan(1,3); else Result.shoulderAuto_scapula_coordSys_ML = obj.shoulderAuto.scapula.coordSys.ML; end if isempty(obj.shoulderAuto.scapula.coordSys.PA) Result.shoulderAuto_scapula_coordSys_PA = nan(1,3); else Result.shoulderAuto_scapula_coordSys_PA = obj.shoulderAuto.scapula.coordSys.PA; end if isempty(obj.shoulderAuto.scapula.coordSys.IS) Result.shoulderAuto_scapula_coordSys_IS = nan(1,3); else Result.shoulderAuto_scapula_coordSys_IS= obj.shoulderAuto.scapula.coordSys.IS; end if isempty(obj.shoulderAuto.scapula.coordSys.origin) Result.shoulderAuto_scapula_coordSys_origin = nan(1,3); else Result.shoulderAuto_scapula_coordSys_origin = obj.shoulderAuto.scapula.coordSys.origin; end if isempty(obj.shoulderAuto.scapula.glenoid.center) Result.shoulderAuto_scapula_glenoid_center = nan(1,3); Result.shoulderAuto_scapula_glenoid_centerLocal_x = nan; Result.shoulderAuto_scapula_glenoid_centerLocal_y = nan; Result.shoulderAuto_scapula_glenoid_centerLocal_z = nan; Result.shoulderAuto_scapula_glenoid_radius = nan; Result.shoulderAuto_scapula_glenoid_centerLine = nan(1,3); Result.shoulderAuto_scapula_glenoid_depth = nan; Result.shoulderAuto_scapula_glenoid_width = nan; Result.shoulderAuto_scapula_glenoid_height = nan; Result.shoulderAuto_scapula_glenoid_anteroSuperiorAngle = nan; Result.shoulderAuto_scapula_glenoid_versionAmplitude = nan; Result.shoulderAuto_scapula_glenoid_versionOrientation = nan; Result.shoulderAuto_scapula_glenoid_version = nan; Result.shoulderAuto_scapula_glenoid_inclination = nan; else Result.shoulderAuto_scapula_glenoid_center = obj.shoulderAuto.scapula.glenoid.center; Result.shoulderAuto_scapula_glenoid_centerLocal_x = obj.shoulderAuto.scapula.glenoid.centerLocal.x; Result.shoulderAuto_scapula_glenoid_centerLocal_y = obj.shoulderAuto.scapula.glenoid.centerLocal.y; Result.shoulderAuto_scapula_glenoid_centerLocal_z = obj.shoulderAuto.scapula.glenoid.centerLocal.z; Result.shoulderAuto_scapula_glenoid_radius = obj.shoulderAuto.scapula.glenoid.radius; Result.shoulderAuto_scapula_glenoid_centerLine = obj.shoulderAuto.scapula.glenoid.centerLine; Result.shoulderAuto_scapula_glenoid_depth = obj.shoulderAuto.scapula.glenoid.depth; Result.shoulderAuto_scapula_glenoid_width = obj.shoulderAuto.scapula.glenoid.width; Result.shoulderAuto_scapula_glenoid_height = obj.shoulderAuto.scapula.glenoid.height; Result.shoulderAuto_scapula_glenoid_anteroSuperiorAngle = obj.shoulderAuto.scapula.glenoid.anteroSuperiorAngle; Result.shoulderAuto_scapula_glenoid_versionAmplitude = obj.shoulderAuto.scapula.glenoid.versionAmplitude; Result.shoulderAuto_scapula_glenoid_versionOrientation = obj.shoulderAuto.scapula.glenoid.versionOrientation; Result.shoulderAuto_scapula_glenoid_version = obj.shoulderAuto.scapula.glenoid.version; Result.shoulderAuto_scapula_glenoid_inclination = obj.shoulderAuto.scapula.glenoid.inclination; end if isempty(obj.shoulderAuto.scapula.glenoid.density) Result.shoulderAuto_scapula_glenoid_density = nan(1, 6); else Result.shoulderAuto_scapula_glenoid_density = obj.shoulderAuto.scapula.glenoid.density; end if isempty(obj.shoulderAuto.scapula.glenoid.comment) Result.shoulderAuto_scapula_glenoid_comment = nan; else Result.shoulderAuto_scapula_glenoid_comment = obj.shoulderAuto.scapula.glenoid.comment; end if isempty(obj.shoulderAuto.scapula.glenoid.fittedSphere.center) Result.shoulderAuto_scapula_glenoid_fittedSphere_center = nan(1,3); Result.shoulderAuto_scapula_glenoid_fittedSphere_radius = nan; Result.shoulderAuto_scapula_glenoid_fittedSphere_R2 = nan; Result.shoulderAuto_scapula_glenoid_fittedSphere_RMSE = nan; else Result.shoulderAuto_scapula_glenoid_fittedSphere_center = ... obj.shoulderAuto.scapula.glenoid.fittedSphere.center; Result.shoulderAuto_scapula_glenoid_fittedSphere_radius = ... obj.shoulderAuto.scapula.glenoid.fittedSphere.radius; Result.shoulderAuto_scapula_glenoid_fittedSphere_R2 = ... obj.shoulderAuto.scapula.glenoid.fittedSphere.R2; Result.shoulderAuto_scapula_glenoid_fittedSphere_RMSE = ... obj.shoulderAuto.scapula.glenoid.fittedSphere.RMSE; end if isempty(obj.shoulderAuto.scapula.glenoid.walch) Result.shoulderAuto_scapula_glenoid_walch = char(nan); elseif isnan(obj.shoulderAuto.scapula.glenoid.walch) Result.shoulderAuto_scapula_glenoid_walch = char(nan); else Result.shoulderAuto_scapula_glenoid_walch = obj.shoulderAuto.scapula.glenoid.walch; end if isempty(obj.shoulderAuto.scapula.acromion.AI) Result.shoulderAuto_scapula_acromion_AI = nan; Result.shoulderAuto_scapula_acromion_CSA = nan; Result.shoulderAuto_scapula_acromion_PSA = nan; Result.shoulderAuto_scapula_acromion_PSL = nan; Result.shoulderAuto_scapula_acromion_AAA = nan; Result.shoulderAuto_scapula_acromion_AAL = nan; Result.shoulderAuto_scapula_acromion_AAx = nan; Result.shoulderAuto_scapula_acromion_AAy = nan; Result.shoulderAuto_scapula_acromion_AAz = nan; Result.shoulderAuto_scapula_acromion_ACx = nan; Result.shoulderAuto_scapula_acromion_ACy = nan; Result.shoulderAuto_scapula_acromion_ACz = nan; else Result.shoulderAuto_scapula_acromion_AI = obj.shoulderAuto.scapula.acromion.AI; Result.shoulderAuto_scapula_acromion_CSA = obj.shoulderAuto.scapula.acromion.CSA; Result.shoulderAuto_scapula_acromion_PSA = obj.shoulderAuto.scapula.acromion.PSA; Result.shoulderAuto_scapula_acromion_PSL = obj.shoulderAuto.scapula.acromion.PSL; Result.shoulderAuto_scapula_acromion_AAA = obj.shoulderAuto.scapula.acromion.AAA; Result.shoulderAuto_scapula_acromion_AAL = obj.shoulderAuto.scapula.acromion.AAL; Result.shoulderAuto_scapula_acromion_AAx = obj.shoulderAuto.scapula.acromion.AAx; Result.shoulderAuto_scapula_acromion_AAy = obj.shoulderAuto.scapula.acromion.AAy; Result.shoulderAuto_scapula_acromion_AAz = obj.shoulderAuto.scapula.acromion.AAz; Result.shoulderAuto_scapula_acromion_ACx = obj.shoulderAuto.scapula.acromion.ACx; Result.shoulderAuto_scapula_acromion_ACy = obj.shoulderAuto.scapula.acromion.ACy; Result.shoulderAuto_scapula_acromion_ACz = obj.shoulderAuto.scapula.acromion.ACz; end if isempty(obj.shoulderAuto.scapula.glenoid.center) Result.shoulderAuto_humerus_center = nan(1,3); Result.shoulderAuto_humerus_radius = nan; else Result.shoulderAuto_humerus_center = obj.shoulderAuto.scapula.glenoid.center; Result.shoulderAuto_humerus_radius = obj.shoulderAuto.scapula.glenoid.radius; end if isempty(obj.shoulderAuto.scapula.glenoid.comment) Result.shoulderAuto_humerus_jointRadius = nan; else Result.shoulderAuto_humerus_jointRadius = obj.shoulderAuto.scapula.glenoid.comment; end if isempty(obj.shoulderAuto.humerus.SHSAngle) Result.shoulderAuto_humerus_SHSAngle = nan; Result.shoulderAuto_humerus_SHSPA = nan; Result.shoulderAuto_humerus_SHSIS = nan; Result.shoulderAuto_humerus_SHSAmpl = nan; Result.shoulderAuto_humerus_SHSOrient = nan; Result.shoulderAuto_humerus_GHSAmpl = nan; Result.shoulderAuto_humerus_GHSOrient = nan; Result.shoulderAuto_humerus_GHSAmpl = nan; else Result.shoulderAuto_humerus_SHSAngle = obj.shoulderAuto.humerus.SHSAngle; Result.shoulderAuto_humerus_SHSPA = obj.shoulderAuto.humerus.SHSPA; Result.shoulderAuto_humerus_SHSIS = obj.shoulderAuto.humerus.SHSIS; Result.shoulderAuto_humerus_SHSAmpl = obj.shoulderAuto.humerus.SHSAmpl; Result.shoulderAuto_humerus_SHSOrient = obj.shoulderAuto.humerus.SHSOrient; Result.shoulderAuto_humerus_GHSAmpl = obj.shoulderAuto.humerus.GHSAmpl; Result.shoulderAuto_humerus_GHSOrient = obj.shoulderAuto.humerus.GHSOrient; Result.shoulderAuto_humerus_GHSAmpl = obj.shoulderAuto.humerus.GHSAmpl; end try Result.shoulderAuto_muscles_IS_segmentationSet = obj.shoulderAuto.rotatorCuff.IS.segmentationSet; Result.shoulderAuto_muscles_IS_sliceName = obj.shoulderAuto.rotatorCuff.IS.sliceName; Result.shoulderAuto_muscles_IS_PCSA = obj.shoulderAuto.rotatorCuff.IS.PCSA; if isempty(obj.shoulderAuto.rotatorCuff.IS.atrophy) Result.shoulderAuto_muscles_IS_atrophy = nan; else Result.shoulderAuto_muscles_IS_atrophy = obj.shoulderAuto.rotatorCuff.IS.atrophy; end if isempty(obj.shoulderAuto.rotatorCuff.IS.fat) Result.shoulderAuto_muscles_IS_fat = nan; else Result.shoulderAuto_muscles_IS_fat = obj.shoulderAuto.rotatorCuff.IS.fat; end if isempty(obj.shoulderAuto.rotatorCuff.IS.osteochondroma) Result.shoulderAuto_muscles_IS_osteochondroma = nan; else Result.shoulderAuto_muscles_IS_osteochondroma = obj.shoulderAuto.rotatorCuff.IS.osteochondroma; end if isempty(obj.shoulderAuto.rotatorCuff.IS.degeneration) Result.shoulderAuto_muscles_IS_degeneration = nan; else Result.shoulderAuto_muscles_IS_degeneration = obj.shoulderAuto.rotatorCuff.IS.degeneration; end Result.shoulderAuto_muscles_SS_segmentationSet = obj.shoulderAuto.rotatorCuff.SS.segmentationSet; Result.shoulderAuto_muscles_SS_sliceName = obj.shoulderAuto.rotatorCuff.SS.sliceName; Result.shoulderAuto_muscles_SS_PCSA = obj.shoulderAuto.rotatorCuff.SS.PCSA; if isempty(obj.shoulderAuto.rotatorCuff.SS.atrophy) Result.shoulderAuto_muscles_SS_atrophy = nan; else Result.shoulderAuto_muscles_SS_atrophy = obj.shoulderAuto.rotatorCuff.SS.atrophy; end if isempty(obj.shoulderAuto.rotatorCuff.SS.fat) Result.shoulderAuto_muscles_SS_fat = nan; else Result.shoulderAuto_muscles_SS_fat = obj.shoulderAuto.rotatorCuff.SS.fat; end if isempty(obj.shoulderAuto.rotatorCuff.SS.osteochondroma) Result.shoulderAuto_muscles_SS_osteochondroma = nan; else Result.shoulderAuto_muscles_SS_osteochondroma = obj.shoulderAuto.rotatorCuff.SS.osteochondroma; end if isempty(obj.shoulderAuto.rotatorCuff.SS.degeneration) Result.shoulderAuto_muscles_SS_degeneration = nan; else Result.shoulderAuto_muscles_SS_degeneration = obj.shoulderAuto.rotatorCuff.SS.degeneration; end Result.shoulderAuto_muscles_SC_segmentationSet = obj.shoulderAuto.rotatorCuff.SC.segmentationSet; Result.shoulderAuto_muscles_SC_sliceName = obj.shoulderAuto.rotatorCuff.SC.sliceName; Result.shoulderAuto_muscles_SC_PCSA = obj.shoulderAuto.rotatorCuff.SC.PCSA; if isempty(obj.shoulderAuto.rotatorCuff.SC.atrophy) Result.shoulderAuto_muscles_SC_atrophy = nan; else Result.shoulderAuto_muscles_SC_atrophy = obj.shoulderAuto.rotatorCuff.SC.atrophy; end if isempty(obj.shoulderAuto.rotatorCuff.SC.fat) Result.shoulderAuto_muscles_SC_fat = nan; else Result.shoulderAuto_muscles_SC_fat = obj.shoulderAuto.rotatorCuff.SC.fat; end if isempty(obj.shoulderAuto.rotatorCuff.SC.osteochondroma) Result.shoulderAuto_muscles_SC_osteochondroma = nan; else Result.shoulderAuto_muscles_SC_osteochondroma = obj.shoulderAuto.rotatorCuff.SC.osteochondroma; end if isempty(obj.shoulderAuto.rotatorCuff.SC.degeneration) Result.shoulderAuto_muscles_SC_degeneration = nan; else Result.shoulderAuto_muscles_SC_degeneration = obj.shoulderAuto.rotatorCuff.SC.degeneration; end Result.shoulderAuto_muscles_TM_segmentationSet = obj.shoulderAuto.rotatorCuff.TM.segmentationSet; Result.shoulderAuto_muscles_TM_sliceName = obj.shoulderAuto.rotatorCuff.TM.sliceName; Result.shoulderAuto_muscles_TM_PCSA = obj.shoulderAuto.rotatorCuff.TM.PCSA; if isempty(obj.shoulderAuto.rotatorCuff.TM.atrophy) Result.shoulderAuto_muscles_TM_atrophy = nan; else Result.shoulderAuto_muscles_TM_atrophy = obj.shoulderAuto.rotatorCuff.TM.atrophy; end if isempty(obj.shoulderAuto.rotatorCuff.TM.fat) Result.shoulderAuto_muscles_TM_fat = nan; else Result.shoulderAuto_muscles_TM_fat = obj.shoulderAuto.rotatorCuff.TM.fat; end if isempty(obj.shoulderAuto.rotatorCuff.TM.osteochondroma) Result.shoulderAuto_muscles_TM_osteochondroma = nan; else Result.shoulderAuto_muscles_TM_osteochondroma = obj.shoulderAuto.rotatorCuff.TM.osteochondroma; end if isempty(obj.shoulderAuto.rotatorCuff.TM.degeneration) Result.shoulderAuto_muscles_TM_degeneration = nan; else Result.shoulderAuto_muscles_TM_degeneration = obj.shoulderAuto.rotatorCuff.TM.degeneration; end catch ME Result.shoulderAuto_muscles_IS_segmentationSet = char(nan); Result.shoulderAuto_muscles_IS_sliceName = char(nan); Result.shoulderAuto_muscles_IS_PCSA = ""; Result.shoulderAuto_muscles_IS_atrophy = ""; Result.shoulderAuto_muscles_IS_fat = ""; Result.shoulderAuto_muscles_IS_osteochondroma = ""; Result.shoulderAuto_muscles_IS_degeneration = ""; Result.shoulderAuto_muscles_SS_segmentationSet = char(nan); Result.shoulderAuto_muscles_SS_sliceName = char(nan); Result.shoulderAuto_muscles_SS_PCSA = ""; Result.shoulderAuto_muscles_SS_atrophy = ""; Result.shoulderAuto_muscles_SS_fat = ""; Result.shoulderAuto_muscles_SS_osteochondroma = ""; Result.shoulderAuto_muscles_SS_degeneration = ""; Result.shoulderAuto_muscles_SC_segmentationSet = char(nan); Result.shoulderAuto_muscles_SC_sliceName = char(nan); Result.shoulderAuto_muscles_SC_PCSA = ""; Result.shoulderAuto_muscles_SC_atrophy = ""; Result.shoulderAuto_muscles_SC_fat = ""; Result.shoulderAuto_muscles_SC_osteochondroma = ""; Result.shoulderAuto_muscles_SC_degeneration = ""; Result.shoulderAuto_muscles_TM_segmentationSet = char(nan); Result.shoulderAuto_muscles_TM_sliceName = char(nan); Result.shoulderAuto_muscles_TM_PCSA = ""; Result.shoulderAuto_muscles_TM_atrophy = ""; Result.shoulderAuto_muscles_TM_fat = ""; Result.shoulderAuto_muscles_TM_osteochondroma = ""; Result.shoulderAuto_muscles_TM_degeneration = ""; end outputArg = struct2table(Result, 'AsArray', 1); end end end \ No newline at end of file diff --git a/ShoulderCase/@Sphere/Sphere.m b/ShoulderCase/@Sphere/Sphere.m index 6ab1ec7..2e7bd92 100644 --- a/ShoulderCase/@Sphere/Sphere.m +++ b/ShoulderCase/@Sphere/Sphere.m @@ -1,54 +1,59 @@ classdef Sphere < handle % Simple sphere object. % Used to be fitted to glenoid points. % % This class could be used elsewhere and the constructor % access might be widen. properties center = []; radius = []; residuals = []; R2 = []; RMSE = []; end methods function obj = Sphere(varargin) if nargin == 2 obj.center = varargin{1}; obj.radius = varargin{2}; end end function fitTo(obj,points) [center,radius,residuals,R2] = fitSphere(points); obj.center = center'; obj.radius = radius; obj.residuals = residuals; obj.R2 = R2; obj.RMSE = norm(residuals)/sqrt(length(residuals)); end function output = isempty(obj) output = any(cellfun(@(field)isempty(obj.(field)),fields(obj))); end function output = polarTangentPoint(obj, polePoint, slicePlaneNormal,... polarPointOrientation) poleToCenter = Vector(polePoint, obj.center); assert(poleToCenter.norm > obj.radius, "Pole point is inside sphere and doesn't have any tangent."); poleToCenterPerpendicular = poleToCenter.cross(slicePlaneNormal).orientToward(polarPointOrientation).direction; tangentPointAngle = acos(obj.radius/poleToCenter.norm); polarTangentPoint = obj.center + ... obj.radius*sin(tangentPointAngle)*poleToCenterPerpendicular + ... obj.radius*cos(tangentPointAngle)*(-poleToCenter.direction); output = polarTangentPoint; end + function exportPly(obj, filename) + sphereToExport = BinarySphere(round(obj.radius), round(obj.center)); + sphereToExport.exportPly(filename); + end + end end