0001 function stl_write(fv, name, type)
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 [folder, label, ext] = fileparts(name);
0029 if isempty(ext), ext = '.stl'; end
0030 if isempty(folder)
0031 name = [label ext];
0032 else
0033 name = [folder filesep label ext];
0034 end
0035
0036 if isfield(fv, 'type') && strcmp(fv.type, 'fwd_model')
0037 fv.vertices = fv.nodes;
0038 if size(fv.elems,2)== 3
0039 fv.faces = fv.elems;
0040 else
0041 try
0042 fv.faces = fv.boundary;
0043 catch
0044 fv.faces = find_boundary(fv);
0045 end
0046 end
0047 end
0048 fv.vertices = double(fv.vertices);
0049 v1 = fv.vertices(fv.faces(:,2),:)-fv.vertices(fv.faces(:,1),:);
0050 v2 = fv.vertices(fv.faces(:,3),:)-fv.vertices(fv.faces(:,2),:);
0051 Norms = cross3(v1,v2);
0052 clear v1 v2
0053 fv.vertices = single(fv.vertices);
0054 v1(:,1:3) = fv.vertices(fv.faces(:,1),1:3);
0055 v2(:,1:3) = fv.vertices(fv.faces(:,2),1:3);
0056 v3(:,1:3) = fv.vertices(fv.faces(:,3),1:3);
0057
0058 if nargin < 3
0059 type = 'bin';
0060 end
0061 switch type
0062 case 'bin'
0063 write_bin_stl(name, label, Norms, v1, v2, v3);
0064 case 'txt'
0065 write_txt_stl(name, label, Norms, v1, v2, v3);
0066 otherwise
0067 error('EIDORS:WrongInput','Type can only be ''bin'' or ''txt''');
0068 end
0069
0070
0071 function write_bin_stl(name, label, Norms, v1, v2, v3)
0072 progress_msg('Writing binary STL file...')
0073 fid = fopen(name,'wb','ieee-le');
0074 header = label;
0075 if length(header) > 80
0076 header = header(1:80);
0077 else
0078 header(end+1:80) = '-';
0079 end
0080 fwrite(fid, header, 'char');
0081 nf = size(v1,1);
0082 fwrite(fid, uint32(nf), 'uint32');
0083 for k = 1:nf
0084 if mod(k,100)==0, progress_msg(k/nf); end
0085 fwrite(fid, [Norms(k,:), v1(k,:), v2(k,:), v3(k,:)], 'float32');
0086 fwrite(fid, 0,'uint16');
0087 end
0088 fclose(fid);
0089 progress_msg(Inf)
0090
0091
0092 function write_txt_stl(name, label, Norms, v1, v2, v3)
0093 progress_msg('Writing ASCII STL file...')
0094 fid = fopen(name,'w');
0095 fprintf(fid,'solid %s\n',label);
0096 nf = size(v1,1);
0097 for k = 1:nf
0098 if mod(k,100)==0, progress_msg(k/nf); end
0099 fprintf(fid,['facet normal %.12g %.12g %.12g\n' ...
0100 '\t' 'outer loop\n' ...
0101 '\t\t' 'vertex %.12g %.12g %.12g\n' ...
0102 '\t\t' 'vertex %.12g %.12g %.12g\n' ...
0103 '\t\t' 'vertex %.12g %.12g %.12g\n' ...
0104 '\t' 'endloop\n' ...
0105 'endfacet\n'], ...
0106 Norms(k,1),Norms(k,2),Norms(k,3), ...
0107 v1(k,1), v1(k,2), v1(k,3), ...
0108 v2(k,1), v2(k,2), v2(k,3), ...
0109 v3(k,1), v3(k,2), v3(k,3) );
0110 end
0111 fprintf(fid,'endsolid %s\n',label);
0112 fclose(fid);
0113 progress_msg(Inf)
0114
0115 function M=cross3(r,F)
0116
0117
0118
0119 M = [(r(:,2).*F(:,3) - r(:,3).*F(:,2)) ...
0120 (r(:,3).*F(:,1) - r(:,1).*F(:,3)) ...
0121 (r(:,1).*F(:,2) - r(:,2).*F(:,1))];
0122 M_mag = sqrt(sum((M.*M)')');
0123 M(:,1) = M(:,1)./M_mag;
0124 M(:,2) = M(:,2)./M_mag;
0125 M(:,3) = M(:,3)./M_mag;