Você está na página 1de 5

function [tri] = manipulate_STL()

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%
% ===== Funções disponíveis =====
% tri = STL_read (STL_file,skip) -> Função obrigatória para carregar o
arquivo STL. (usar skip = 0)
% tri = STL_transl(tri,xc,yc,zc) -> Translada o STL de xc,yc,zc
% tri = STL_m_p_mm(tri) -> Converte de metros para
milimetros
% tri = STL_mm_p_m(tri) -> Converte de milimetros para
metros
% plot_patch (tri) -> Plota o STL ( !dependendo
do tamanho do arquivo pode ficar muito pesado! )
% STL_save(tri,name) -> Salva o STL

% ===== Estrutura tri =====


% tri(i) -> dados do i-ésimo triângulo
% tri(i).v1(:) -> coordenadas x,y,z do 1�
v�rtice do i-�simo tri�ngulo
% tri(i).v2(:) -> coordenadas x,y,z do 2�
v�rtice do i-�simo tri�ngulo
% tri(i).v3(:) -> coordenadas x,y,z do 3�
v�rtice do i-�simo tri�ngulo
% tri(i).n(:) -> coordenadas x,y,z da
normal do i-�simo tri�ngulo
% tri(i).g(:) -> coordenadas x,y,z do
centróide do i-�simo tri�ngulo

% ===== Exemplo de uso =====


% STL_file = 'sphmms128.stl';
% skip = 0;
%
% tri = STL_read(STL_file,skip); % lê o arquivo stl
% tri = STL_transl(tri,1,1,1); % translada 1 un. em x, y e z
% tri = STL_mm_p_m(tri); % converte de m para mm
%
% plot_patch (tri) % plota
% STL_save(tri,'sphmms128_teste.stl') % salva

% André Rezende Dessimoni

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%

clear; clc; close all;%#ok<*DEFNU>


tic

STL_file = 'to_stl_temp5.stl';
skip = 10;

tri = STL_read(STL_file,skip);

pts = STL2PTS (tri);

keyboard
% tri = STL_mm_p_m(tri);
% tri = STL_transl(tri,0.805,0.6,0);
% plot_patch (tri)
% STL_save(tri,'side_mirror_7_2mm.stl')

toc
end

%% ========================================================================
function pts = STL2PTS (tri)
k=0;
pts(1,1) = 0;
pts(1,2) = 0;
pts(1,3) = 0;
for ii=1:length(tri)
encontrou_igual=false;
for jj=1:k
if (tri(ii).v1(1)==pts(jj,1) & tri(ii).v1(2)==pts(jj,2) &
tri(ii).v1(3)==pts(jj,3))
encontrou_igual = true;
end
end

if encontrou_igual==false
pts(ii,1) = tri(ii).v1(1);
pts(ii,2) = tri(ii).v1(2);
pts(ii,3) = tri(ii).v1(3);
k=k+1;
end

end

end

%% ========================================================================

function tri = STL_read (STL_file,skip)

fclose all;
arq = fopen(STL_file);

n_txt = 0;
i=0;

V1 = fgetl(arq);

while n_txt~=-1
i = i+1;
n_txt = fgetl(arq);

try
n_txt = strtrim(n_txt);
[tri(i).n] = str2num(n_txt(13:end));

[~] = fgetl(arq);

V_txt= strtrim(fgetl(arq));
[tri(i).v1] = str2num(V_txt(7:end));

V_txt = strtrim(fgetl(arq));
[tri(i).v2] = str2num(V_txt(7:end));

V_txt = strtrim(fgetl(arq));
[tri(i).v3] = str2num(V_txt(7:end));

[~] = fgetl(arq);
[~] = fgetl(arq);

% if (status0==0 || status1==0 || status2==0 || status3==0)


% disp(['Erro na conversão str2num do triângulo',num2str(i)])
% keyboard
% end

for j=1:skip*7
[~] = fgetl(arq);
end
end
end

fclose(arq);
tri(i-1)=[];

% for i=1:length(tri)
% tri(i).g(1) = (tri(i).v1(1) + tri(i).v2(1) + tri(i).v3(1))/3;
% tri(i).g(2) = (tri(i).v1(2) + tri(i).v2(2) + tri(i).v3(2))/3;
% tri(i).g(3) = (tri(i).v1(3) + tri(i).v2(3) + tri(i).v3(3))/3;
% end

end

%% ========================================================================

function tri = STL_transl(tri,xc,yc,zc)

for i=1:length(tri)
tri(i).v1(1) = tri(i).v1(1) + xc;
tri(i).v2(1) = tri(i).v2(1) + xc;
tri(i).v3(1) = tri(i).v3(1) + xc;

tri(i).v1(2) = tri(i).v1(2) + yc;


tri(i).v2(2) = tri(i).v2(2) + yc;
tri(i).v3(2) = tri(i).v3(2) + yc;

tri(i).v1(3) = tri(i).v1(3) + zc;


tri(i).v2(3) = tri(i).v2(3) + zc;
tri(i).v3(3) = tri(i).v3(3) + zc;
end

% for i=1:length(tri)
% tri(i).g(1) = (tri(i).v1(1) + tri(i).v2(1) + tri(i).v3(1))/3;
% tri(i).g(2) = (tri(i).v1(2) + tri(i).v2(2) + tri(i).v3(2))/3;
% tri(i).g(3) = (tri(i).v1(3) + tri(i).v2(3) + tri(i).v3(3))/3;
% end

end

%% ========================================================================
function tri = STL_m_p_mm(tri)

for i=1:length(tri)
tri(i).v1(:) = tri(i).v1(:)*1000;
tri(i).v2(:) = tri(i).v2(:)*1000;
tri(i).v3(:) = tri(i).v3(:)*1000;
end
% for i=1:length(tri)
% tri(i).g(1) = (tri(i).v1(1) + tri(i).v2(1) + tri(i).v3(1))/3;
% tri(i).g(2) = (tri(i).v1(2) + tri(i).v2(2) + tri(i).v3(2))/3;
% tri(i).g(3) = (tri(i).v1(3) + tri(i).v2(3) + tri(i).v3(3))/3;
% end

end

%% ========================================================================

function tri = STL_mm_p_m(tri)

for i=1:length(tri)
tri(i).v1(:) = tri(i).v1(:)/1000;
tri(i).v2(:) = tri(i).v2(:)/1000;
tri(i).v3(:) = tri(i).v3(:)/1000;
end
% for i=1:length(tri)
% tri(i).g(1) = (tri(i).v1(1) + tri(i).v2(1) + tri(i).v3(1))/3;
% tri(i).g(2) = (tri(i).v1(2) + tri(i).v2(2) + tri(i).v3(2))/3;
% tri(i).g(3) = (tri(i).v1(3) + tri(i).v2(3) + tri(i).v3(3))/3;
% end

end

%% ========================================================================

function STL_save(tri,name)
arq = fopen(name,'w');

fprintf(arq,'solid solid\n');
for i=1:length(tri)
fprintf(arq,'facet normal %9.6f %9.6f %9.6f\n ',tri(i).n(1),
tri(i).n(2), tri(i).n(3));
fprintf(arq,'\touterloop\n');
fprintf(arq,'\t\tvertex %9.6f %9.6f %9.6f\n',tri(i).v1(1),
tri(i).v1(2), tri(i).v1(3));
fprintf(arq,'\t\tvertex %9.6f %9.6f %9.6f\n',tri(i).v2(1),
tri(i).v2(2), tri(i).v2(3));
fprintf(arq,'\t\tvertex %9.6f %9.6f %9.6f\n',tri(i).v3(1),
tri(i).v3(2), tri(i).v3(3));
fprintf(arq,'\tendloop\n');
fprintf(arq,'endfacet\n');
end
fprintf(arq,'endsolid solid');
end

%% ========================================================================

function plot_patch (tri)


figure('doublebuffer','on'); hold on
for i=1:length(tri)-1
patch([tri(i).v1(1), tri(i).v2(1), tri(i).v3(1)],[tri(i).v1(2),
tri(i).v2(2), tri(i).v3(2)],[tri(i).v1(3), tri(i).v2(3), tri(i).v3(3)],'r')
end
axis equal
end

%% ========================================================================

function plot_normal(tri)
figure('doublebuffer','on'); hold on
for i=1:10:length(tri)-1
quiver3(tri(i).g(1), tri(i).g(2), tri(i).g(3),tri(i).n(1), tri(i).n(2),
tri(i).n(3),'r')
end
end

Você também pode gostar