--- a
+++ b/MATLAB/src/VSD_importData.m
@@ -0,0 +1,110 @@
+function VSD_importData(Subject, dbPath, varargin)
+%VSD_IMPORTDATA imports the data of the reconstructions of the VSD.
+%
+% AUTHOR: Maximilian C. M. Fischer
+% COPYRIGHT (C) 2022-2023 Maximilian C. M. Fischer
+% LICENSE: EUPL v1.2
+%
+
+parser = inputParser;
+addOptional(parser,'segNames', {},@iscell);
+parse(parser, varargin{:});
+segNames = parser.Results.segNames;
+
+% Settings
+saveSwitch = false;
+% Names of the bones
+if isempty(segNames)
+    segNames = {...
+        'Sacrum','Hip_R','Hip_L','Femur_R','Femur_L','Patella_R','Patella_L',...
+        'Tibia_R','Tibia_L','Fibula_R','Fibula_L','Talus_R','Talus_L',...
+        'Calcaneus_R','Calcaneus_L','Tarsals_R','Tarsals_L',...
+        'Metatarsals_R','Metatarsals_L','Phalanges_R','Phalanges_L'};
+end
+
+subjectString = Subject.ID{1};
+boneFilename=['..\..\Bones\' subjectString '.mat'];
+
+if exist(boneFilename, 'file')
+    % Check for already existing data
+    load(boneFilename,'B','M')
+else
+    for s=1:length(segNames)
+        B(s).name = segNames{s};
+        B(s).date='';
+        B(s).mesh=[];
+    end
+    % Create empty meta struct
+    M.notes={};
+end
+
+%% Meta data (M)
+% Sex, age, weight, height, comment
+M.sex = Subject.Sex{1};
+M.age = Subject.Age(1);
+M.weight = Subject.Weight(1);
+M.height = Subject.Height(1);
+M.notes = Subject.Comment{1};
+
+%% Bone surface PLY files
+files = dir([dbPath '\' subjectString '\']);
+dirFlags = [files.isdir] &  ~cellfun(@isempty, regexp({files.name}, 'Models'));
+if sum(dirFlags) == 1
+    directory = files(dirFlags).name;
+else
+    error('No subfolder named ''Models'' was found!')
+end
+
+% Import bones (B)
+tempFiles = dir([dbPath '\' subjectString '\' directory '\**\*.ply']);
+if isempty(tempFiles)
+    warning(['No PLY files were found in ' dbPath '\' subjectString '\' directory])
+else
+    for f=1:length(tempFiles)
+        % Same order of the segs for each struct
+        tempName = strrep(tempFiles(f).name, '.ply','');
+        tempIdx = find(ismember(segNames, tempName));
+        if ~isempty(tempIdx)
+            % Replace if mesh date is different
+            importFlag = true;
+            if tempIdx <= length(B)
+                importFlag = ~strcmp(B(tempIdx).date, tempFiles(f).date);
+            end
+            if importFlag
+                meshPath = fullfile(tempFiles(f).folder, tempFiles(f).name);
+                disp(['Importing ' meshPath])
+                % Date
+                B(tempIdx).date = tempFiles(f).date;
+                % Import mesh
+                tempMesh = readMesh(meshPath);
+                % Import only the outer surface
+                tempMesh = keepOnlyOuterSurface(tempMesh);
+                % Remove components below 25 vertices
+                tempMesh = tempMesh(arrayfun(@(x) size(x.vertices,1), tempMesh)>=25);
+                % Remove components with a volume below 1 mm³
+                tempMesh = tempMesh(arrayfun(@(x) meshVolume(x), tempMesh)>=1);
+                % Optimize mesh
+                for m=1:length(tempMesh)
+                    tempMesh(m) = VSD_optimizeMeshWrapper(tempMesh(m));
+                end
+                B(tempIdx).mesh = tempMesh;
+                if length(B(tempIdx).mesh)>1
+                    warning(['Multi-component bone: ' num2str(length(B(tempIdx).mesh)) ' components!'])
+                    B(tempIdx).mesh = concatenateMeshes(B(tempIdx).mesh);
+                end
+                saveSwitch=true;
+            end
+            % Copy name of the bone
+            if ~strcmp(B(tempIdx).name, segNames{tempIdx}) || isa(B(tempIdx).name,'cell')
+                B(tempIdx).name = segNames{tempIdx};
+                saveSwitch = true;
+            end
+        end
+        if saveSwitch
+            save(boneFilename,'B','M')
+        end
+        saveSwitch=false;
+    end
+end
+
+end
\ No newline at end of file