0001 function writeMesh_ply(fileName, vertices, faces, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 if isstruct(vertices)
0032 if nargin > 2
0033 varargin = [{faces} varargin{:}];
0034 end
0035 faces = vertices.faces;
0036 vertices = vertices.vertices;
0037 end
0038
0039
0040 p = inputParser;
0041 addRequired(p,'fileName',@(x) validateattributes(x,{'char'},{'nonempty'}));
0042 suppModes = {'ascii','binary_little_endian'};
0043 addOptional(p,'mode','binary_little_endian',@(x) any(validatestring(x,suppModes)));
0044 parse(p,fileName,varargin{:});
0045 fileName = p.Results.fileName;
0046 mode = suppModes{startsWith(suppModes, p.Results.mode, 'IgnoreCase',1)};
0047
0048
0049
0050
0051 nVertices = size(vertices, 1);
0052 nFaces = size(faces, 1);
0053 if iscell(faces)
0054 nFaces = length(faces);
0055 end
0056
0057
0058 f = fopen(fileName, 'wt');
0059 if (f == -1)
0060 error('Couldn''t open the file %s', fileName);
0061 end
0062
0063
0064
0065
0066
0067 fprintf(f, 'ply\n');
0068
0069
0070 fprintf(f, 'format %s 1.0\n', mode);
0071
0072
0073 fprintf(f, 'comment Created by MatGeom for MATLAB\n');
0074
0075
0076 fprintf(f, 'element vertex %d\n', nVertices);
0077 fprintf(f, 'property double x\n');
0078 fprintf(f, 'property double y\n');
0079 fprintf(f, 'property double z\n');
0080
0081
0082 fprintf(f, 'element face %d\n', nFaces);
0083 fprintf(f, 'property list int int vertex_index\n');
0084
0085
0086 fprintf(f, 'end_header\n');
0087
0088
0089
0090 switch mode
0091 case 'ascii'
0092
0093 format = '%0.17f %0.17f %0.17f\n';
0094 fprintf(f, format, vertices');
0095
0096
0097 if isnumeric(faces)
0098
0099 ns = size(faces, 2);
0100 plyFaces = [ns * ones(nFaces, 1) faces-1];
0101 format = ['%d' repmat(' %d', 1, ns) '\n'];
0102 fprintf(f, format, plyFaces');
0103 else
0104
0105
0106 for iFace = 1:nFaces
0107 ns = length(faces{iFace});
0108 format = ['%d' repmat(' %d', 1, ns) '\n'];
0109 fprintf(f, format, ns, faces{iFace} - 1);
0110 end
0111 end
0112 case 'binary_little_endian'
0113
0114 fclose(f);
0115
0116 f = fopen(fileName,'a','ieee-le');
0117
0118 fwrite(f, vertices', 'double');
0119
0120
0121 if isnumeric(faces)
0122
0123 plyFaces = [size(faces, 2) * ones(nFaces, 1) faces-1];
0124 fwrite(f, plyFaces', 'int');
0125 else
0126
0127
0128 for iFace = 1:nFaces
0129 fwrite(f, [length(faces{iFace}), faces{iFace}-1], 'int');
0130 end
0131 end
0132 otherwise
0133 error(['Format ''' mode ''' is not supported'])
0134 end
0135
0136
0137 fclose(f);
0138
0139 end