WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

.stl File importieren

 

odeul
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 12:33     Titel: .stl File importieren
  Antworten mit Zitat      
Servus,

ich möchte gerne eine .stl in Matlab importieren.
Nach ein bisschen Recherche habe ich bereits herausgefunden, dass es einmal ein ASCII stl File gibt und ein Binär stl File.
Erste Frage wäre: Wie finde ich heraus, ob der stl File binär oder ASCII ist (leider ist nicht bekannt, was für ein File es ist)?

Da ich schon nach einem Programmcode in Matlab für den Import gesucht habe, allerdings wohl nur fehlerhafte Befehle im Umlauf sind, hier nochmal die Frage, wie so ein Befehl für Matlab aussehen würde?

Besten Dank

Grüße

Flo
Private Nachricht senden Benutzer-Profile anzeigen


odeul
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 12:42     Titel:
  Antworten mit Zitat      
Nochmal servus,

also ich war grade mal so schlau und hab den .stl File mal mitm Editor geöffnet. Weiß jetzt also, dass es ein Binär .stl File ist.

Jetzt würde mich nur interessieren, ob bzw wie ich das importieren kann?
Private Nachricht senden Benutzer-Profile anzeigen
 
odeul
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.06.2015, 13:44     Titel:
  Antworten mit Zitat      
Servus,

nach ein bissl suchen habe ich folgenden Code gefunden:

Code:
function [v, f, n, c, stltitle] = stlread('6mV #9 9.stl', verbose)
% This function reads an STL file in binary format into vertex and face
% matrices v and f.
%
% USAGE: [v, f, n, c, stltitle] = stlread(filename, verbose);
%
% verbose is an optional logical argument for displaying some loading
%   information (default is false).
%
% v contains the vertices for all triangles [3*n x 3].
% f contains the vertex lists defining each triangle face [n x 3].
% n contains the normals for each triangle face [n x 3].
% c is optional and contains color rgb data in 5 bits [n x 3].
% stltitle contains the title of the specified stl file [1 x 80].
%
% To see plot the 3D surface use:
%   patch('Faces',f,'Vertices',v,'FaceVertexCData',c);
% or
%   plot3(v(:,1),v(:,2),v(:,3),'.');
%
% Duplicate vertices can be removed using:
%   [v, f]=patchslim(v, f);
%
% For more information see:
%  http://www.esmonde-white.com/home/diversions/matlab-program-for-loading-stl-files
%
% Based on code originally written by:
%    Doron Harlev
% and combined with some code by:
%    Eric C. Johnson, 11-Dec-2008
%    Copyright 1999-2008 The MathWorks, Inc.
%
% Re-written and optimized by Francis Esmonde-White, May 2010.

use_color=(nargout>=4);

fid=fopen('6mV #9 9.stl', 'r'); %Open the file, assumes STL Binary format.
if fid == -1
    error('File could not be opened, check name or path.')
end

if ~exist('verbose','var')
    verbose = false;
end

ftitle=fread(fid,80,'uchar=>schar'); % Read file title
numFaces=fread(fid,1,'int32'); % Read number of Faces

T = fread(fid,inf,'uint8=>uint8'); % read the remaining values
fclose(fid);

stltitle = char(ftitle');

if verbose
    fprintf('\nTitle: %s\n', stltitle);
    fprintf('Number of Faces: %d\n', numFaces);
    disp('Please wait...');
end

% Each facet is 50 bytes
%  - Three single precision values specifying the face normal vector
%  - Three single precision values specifying the first vertex (XYZ)
%  - Three single precision values specifying the second vertex (XYZ)
%  - Three single precision values specifying the third vertex (XYZ)
%  - Two color bytes (possibly zeroed)

% 3 dimensions x 4 bytes x 4 vertices = 48 bytes for triangle vertices
% 2 bytes = color (if color is specified)

trilist = 1:48;

ind = reshape(repmat(50*(0:(numFaces-1)),[48,1]),[1,48*numFaces])+repmat(trilist,[1,numFaces]);
Tri = reshape(typecast(T(ind),'single'),[3,4,numFaces]);

n=squeeze(Tri(:,1,:))';
n=double(n);

v=Tri(:,2:4,:);
v = reshape(v,[3,3*numFaces]);
v = double(v)';

f = reshape(1:3*numFaces,[3,numFaces])';

if use_color
    c0 = typecast(T(49:50),'uint16');
    if (bitget(c0(1),16)==1)
        trilist = 49:50;
        ind = reshape(repmat(50*(0:(numFaces-1)),[2,1]),[1,2*numFaces])+repmat(trilist,[1,numFaces]);
        c0 = reshape(typecast(T(ind),'uint16'),[1,numFaces]);
       
        r=bitshift(bitand(2^16-1, c0),-10);
        g=bitshift(bitand(2^11-1, c0),-5);
        b=bitand(2^6-1, c0);
        c=[r; g; b]';
    else
        c = zeros(numFaces,3);
    end
end

if verbose
    disp('Done!');
end


 
Diesen habe ich in MATLAB eingelesen.
Ich habe meine .stl Datei in den von MATLAB verwendeten Ordner getan und die 'filename' auf meine Datei umgeschrieben.
Komischerweise spuckt er jetzt folgendes Problem aus:

Error wirting stlread.m.
C:\Users......\stlread.m (Das System kann den angegebenen Pfad nicht finden.)

Hat da jemand ne Idee?

Besten Dank im Voraus
Grüße odeul

[EDITED, Jan, Bitte Code-Umgebung verwenden - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 24.06.2015, 12:00     Titel:
  Antworten mit Zitat      
Hallo odeul,

Der gepostete Code ist merkwürdig:
Code:
function [v, f, n, c, stltitle] = stlread('6mV #9 9.stl', verbose)

In den Input Argumenten können nur Variablen stehen, aber '6mV #9 9.stl' ist ein String. Das ist keine valide Matlab-Syntax.
Ich vermute, Du meinst:

Code:
function [v, f, n, c, stltitle] = stlread(filename, verbose)
fid=fopen(filename, 'r'); %Open the file, assumes STL Binary format.


Zitat:
Ich habe meine .stl Datei in den von MATLAB verwendeten Ordner getan und die 'filename' auf meine Datei umgeschrieben.

Das könnte der Fehler gewesen sein.

Zitat:
Error wirting stlread.m.
C:\Users......\stlread.m (Das System kann den angegebenen Pfad nicht finden.)

"wirting"?! Im gezeigten Code kommt diese Fehlermeldung nicht vor, es geht aber auch nicht ums Schreiben, oder?!
Kontrolliere das nochmal.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
odeul
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2015, 11:56     Titel:
  Antworten mit Zitat      
Grüß Dich Jan,

da ich leider der absolute Matlab-Anfänger bin, habe ich durch diese Veränderung versucht meine .stl einzulesen.

Vielleicht könntest du mir kurz sagen, wo ich in dem Code den Pfad zur .stl-Datei angeben muss Smile

Besten Dank

Odeul
Private Nachricht senden Benutzer-Profile anzeigen
 
odeul
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 23.06.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.06.2015, 12:10     Titel:
  Antworten mit Zitat      
Habs hinbekommen.
So wie du sagtest, hab ich einfach nur oben das '6mv...' rausgenommen Smile
Visualisierung funktioniert auch super.

Noch ne kurze Frage: Die eingelesene .stl-Datei spuckt mir sehr viele Punkte aus, die mir mein Scanner in die .stl Datei geschrieben hat. Wenn ich es mit MATLAB plotte, wirft Matlab mir natürlich nur die Punkte aus. Ist es möglich, dass Matlab ein Volumenkörper daraus herstellt?

Um das vielleicht besser zu verstehen: Ich habe ein Elektronikbauteil abgescannt und die vorhandenen Lichtpunkte in die .stl Datei gespeichert. Ich möchte jetzt natürlich nicht in MATLAB nur die Scannpunkte sehen, sondern das ganze als Volumenkörper, sprich mein Bauteil ausgeben und es bearbeiten.

Hat da jemand ne Idee?

Wäre super, wenn das jemand weiß Smile

Beste Grüße

Odeul

Punktewolke.jpg
 Beschreibung:
Zur Verdeutlichung hier nochmal die Punktewolke.

Download
 Dateiname:  Punktewolke.jpg
 Dateigröße:  28.07 KB
 Heruntergeladen:  419 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 28.06.2015, 02:20     Titel:
  Antworten mit Zitat      
Hallo odeul,

Ein sehr guter Ansatz solche Fragen zu lösen ist im Internet nach bereits vorhandenen Lösungen zu suchen. Z.B. könntest Du in Matlab's FileExchange danach suchen, oder auch Deine Lieblings-Internet-Suchmaschine nach "Matlab points to volume" fragen.

Das Problem ist nicht eindeutig lösbar, wenn Du nicht eine konvexe Hülle meinst. Es könnten zwischen allen Punkten ja auch Löcher liegen. Im FileExchange gibt es einige Lösungen, um Löcher bestimmter Größe ein- oder auszuschließen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.