[gelöst] Viewer für STL Dateien erstellen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

[gelöst] Viewer für STL Dateien erstellen?

Beitrag von GreyEnt »

Hallo Progger.
Frohes Neues Jahr. :)

Stelle mir vor das mit den Befehlen aus der Mesh Librarie ein Viewer für STL Dateien zu erstellen ist.
Hab leider nicht das Zeug das ich mit den Mesh Befehlen umgehen kann. :(

Eine kleine Beschreibung für das STL Format:
Eingesetzt meist für die Bearbeitung im 3D Druck Bereich.
Aus einem 3D CAD Modell werden sämtliche Aussenflächen in Dreiecke beschrieben.
Fast jedes 3D CAD Programm hat heutzutage eine Schnittstelle um ein Modell in STL zu exportieren.
Das Format gibt es Standardmäßig als ASCII und Binär.
Würde mir gern die erzeugten STL Dateien im eigenen Viewer anzeigen lassen.
Hat jemand Lust mir aufs Pferd zu helfen? :)
Könnte mir auch ein Beispiel Code vorstellen.
Falls Ihr ein STL benötigt so ist es kein Problem.

Hier ein kleiner Auszug einer STL.
solid Model
facet normal -6.4e-001 -6.9e-001 3.4e-001
outer loop
vertex -5.7e-001 -1.4e+000 -1.2e+001
vertex -5.8e-001 -1.4e+000 -1.2e+001
vertex -5.8e-001 -1.4e+000 -1.2e+001
endloop
endfacet
.
.
.
endsolid Model
Gruß
GreyEnt
Zuletzt geändert von GreyEnt am 20.01.2019 11:48, insgesamt 1-mal geändert.
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Update

Beitrag von GreyEnt »

Guten Morgen.

Hab ein Super Beispiel gefunden.
...\Examples\3D\MeshManualCube.pb
Einfach Geil. :)

Daraus lässt sich mein Vorhaben ableiten. :)

Gruß
GreyEnt
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Benutzeravatar
GreyEnt
Beiträge: 376
Registriert: 20.07.2006 19:41

Re: Viewer für STL Dateien erstellen?

Beitrag von GreyEnt »

Hier das Grundgerüst.
Alle STL im ASCII Format sollten geladen werden.
Es könnte sein das div. CAD Programme mit anderen "SPACE" einrückungen arbeiten.

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;  Grundgerüst "STL Import" aufgebaut von PureBasic - Manual Mesh
; Geschrieben in PB 5.62
; Jan. 2019 by GreyEnt
;
; Thanks a lot PB Team :)
;
; ------------------------------------------------------------
;
; 

datei$=OpenFileRequester("STL-Datei","*.stl","*.stl",0)

If datei$=""
  End
EndIf

Structure vertex
  vx1_x.d
  vx1_y.d
  vx1_z.d
  vx2_x.d
  vx2_y.d
  vx2_z.d
  vx3_x.d
  vx3_y.d
  vx3_z.d
  normal_x.d
  normal_y.d
  normal_z.d
EndStructure

Global NewList vxL.vertex()

z.l=0

If ReadFile(0, datei$)   ; wenn die Datei geöffnet werden konnte, setzen wir fort...
  While Eof(0) = 0       ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
    TextZ$= ReadString(0);
    
    Posi = FindString(TextZ$, "facet normal")
    If Posi > 0
      AddElement(vxL())
      
      Ergebnis$ = StringField(TextZ$, 3, " ")
      vxL()\normal_x=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 4, " ")
      vxL()\normal_y=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 5, " ")
      vxL()\normal_z=ValD(Ergebnis$)
      
      TextZ$= ReadString(0)
      TextZ$= ReadString(0)
      Ergebnis$ = StringField(TextZ$, 10, " ")
      vxL()\vx1_x=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 11, " ")
      vxL()\vx1_y=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 12, " ")
      vxL()\vx1_z=ValD(Ergebnis$)
      TextZ$= ReadString(0)
      Ergebnis$ = StringField(TextZ$, 10, " ")
      vxL()\vx2_x=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 11, " ")
      vxL()\vx2_y=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 12, " ")
      vxL()\vx2_z=ValD(Ergebnis$)
      TextZ$= ReadString(0)
      Ergebnis$ = StringField(TextZ$, 10, " ")
      vxL()\vx3_x=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 11, " ")
      vxL()\vx3_y=ValD(Ergebnis$)
      Ergebnis$ = StringField(TextZ$, 12, " ")
      vxL()\vx3_z=ValD(Ergebnis$)
      
      Goto marke1
      Debug vxL()\normal_x
      Debug vxL()\normal_y
      Debug vxL()\normal_z
      Debug vxL()\vx1_x
      Debug vxL()\vx1_y
      Debug vxL()\vx1_z
      Debug vxL()\vx2_x
      Debug vxL()\vx2_y
      Debug vxL()\vx2_z
      Debug vxL()\vx3_x
      Debug vxL()\vx3_y
      Debug vxL()\vx3_z
      Debug " "
      marke1:
      
    EndIf
    
    z+1
    ;If z>150000 ;for Debug in Long Files
    ;  Break
    ;EndIf
    
  Wend
  
  CloseFile(0)               ; schließen der zuvor geöffneten Datei
EndIf

#CameraSpeed = 1

IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"

Define.f KeyX, KeyY, MouseX, MouseY

If InitEngine3D()
  
  Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
  
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  If Screen3DRequester()
    
    CreateMesh(0)
    z.l=0
    ForEach vxL()
      z+3
      MeshVertexPosition(vxL()\vx1_x, vxL()\vx1_y, vxL()\vx1_z)
      MeshVertexColor(RGB(255, 0, 0))
      
      MeshVertexPosition(vxL()\vx2_x, vxL()\vx2_y, vxL()\vx2_z)
      MeshVertexColor(RGB(0, 200, 0))
      
      MeshVertexPosition(vxL()\vx3_x, vxL()\vx3_y, vxL()\vx3_z)
      MeshVertexColor(RGB(0, 200, 0))
      
      MeshFace(z-3, z-2, z-1)
    Next
    
    FinishMesh(1)
    
    CreateTexture(0, 16, 16)
    TextureID = TextureID(0)
    
    CreateMaterial(0, LoadTexture(0, "clouds.jpg"))
    
    SetMaterialColor(0, #PB_Material_DiffuseColor, RGB(100,100,100))
    
    MaterialShadingMode(0, #PB_Material_Phong|#PB_Material_Wireframe    )
    
    MaterialShininess(0, 5)
    
    CreateEntity(0, MeshID(0), MaterialID(0))
    EntityRenderMode(0, #PB_Entity_CastShadow       )
    
    CreateCamera(0, 0, 0, 100, 100)
    MoveCamera(0, 0, 0, 500, #PB_Absolute)
    CameraProjectionMode(0, #PB_Camera_Perspective )
    
    CreateWater(0, 0, -150, 0, 150, #PB_World_WaterHighQuality|#PB_World_WaterSun|#PB_World_WaterCaustics                    )
    Sun(-200, 200, -100, RGB(255,128,0))
    SkyDome("clouds.jpg", 500)
    CreateLight(1, RGB(128,128,128),  -200, 200, -100)
    DisableLightShadows(1, #False)
    
    Repeat
      Screen3DEvents()
      
      If ExamineMouse()
        MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
        MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
      EndIf
      
      If ExamineKeyboard()
        
        If KeyboardPushed(#PB_Key_Left)
          RotateEntity(0, 0, -5, 0, #PB_Relative)
          
        ElseIf KeyboardPushed(#PB_Key_Right)
          RotateEntity(0, 0, 5, 0, #PB_Relative)
          
        Else
          KeyX = 0
        EndIf
        
        If KeyboardPushed(#PB_Key_Up)
          RotateEntity(0, -5, 0, 0, #PB_Relative)
          
        ElseIf KeyboardPushed(#PB_Key_Down)
          RotateEntity(0, 5, 0, 0, #PB_Relative)
          
        Else
          KeyY = 0
        EndIf
        
      EndIf
      
      RotateCamera(0, MouseY, MouseX, 0, #PB_Relative)
      MoveCamera  (0, KeyX, 0, KeyY)
      
      RenderWorld()
      Screen3DStats()      
      FlipBuffers()
    Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
  EndIf
  
Else
  MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf

End
Ich progge PureBasic weil Jägermeister nen dicken Kopf macht.
Antworten