Conveyor3D ist eine Klassenbibliothek zur 3D-Darstellung eines oder mehrerer Förderstrecken-Layouts in einer Visual Basic .NET-Programm. Um eine Implementierung zu demonstrieren, wurde die hier downloadbare Anwendung geschrieben.Es steckt viel Arbeit in der Conveyor3D-Bibliothek. Daher ist der Code nicht frei verfügbar. Es dient vielmehr als Präsentation, um das Potenzial in der angebotenen Leistung zu verdeutlichen.
Screenshots
Demo-ProgrammBild des Demolayouts, gespeichert per Funktion der Conveyor3D-Bibliothek
Beschreibung der Bibliothek
Die Bibliothek lässt sich durch ihre Klassen sehr einfach und flexibel handhaben. Es gibt zwei Hauptklassen, das Modell und den Presenter. Über das Modell werden die Eigenschaften der Streckenelemente definiert, das Streckenlayout aufgebaut und die Geometrie generiert. Der Presenter interagiert mit DirectX, „präsentiert“ das Modell zur Laufzeit in einer PictureBox und bietet Funktionen zur Änderung der Darstellung an. Durch die Funktionstrennung ist eine gewisse Flexibilität gewährleistet und der eigene Code lässt sich effizienter schreiben.
Modell
Das Modell weist folgende Funktionalitäten auf:
Festlegung bei der Initialisierung: Kettenbreite und -teilung sowie Profilhöhe, Farben der jeweiligen Oberflächen, Farbverlauf für die Trumoberfläche (9 verschiedene Verläufe)
Aufbau des Layouts mit folgenden Streckenelementen: Gerade, Horizontale Kurve, Vertikale Kurve, Bogenrad, Antriebseinheit mit IEC-Motor, Umlenkeinheit
Anheften von Pfeilen oder Texturen (z. B. Logos) an die Elemente
Hinzufügen einer Begrenzung: Boden (rechteckig/rund, Farbe/Textur) und/oder Wänden (Textur)
Jedem Streckenelement lässt sich ein prozentualer Start- und Endwert des Farbverlaufs zuordnen. Dadurch ist es möglich Zustandsgrößen wie z. B. einen Zugkraftverlauf visuell auf dem Obertrum darzustellen. Im Demo-Programm wurde dies zur Elementunterscheidung angewandt.
Beispielcode: Modell des Demolayouts generieren
Dim model As Conveyor3DModel Dim motor As ElectricMotor ' Erzeugt ein neues Modell ' Parameter: Kettenbreite, Kettenteilung, Elementhöhe
model =New Conveyor3DModel(90,30,90) ' Startposition festlegen ' Parameter: Punkt, Richtungsvektor, Normalenvektor Obertrum
model.SetStartPosition(New Vector3(0,900,0), _ New Vector3(0,0,1), _ New Vector3(0,1,0)) ' Farben festlegen ' Parameter: Hintergrund, Elementseite, Kette, Anschlußstelle, Motor, Bogenrad
model.SetColors(colorBackground, colorElement, colorChain, _
colorJunction, colorMotor, colorWheel) ' Antriebsmotor festlegen
motor =New ElectricMotor(MotorSize.iec56, MotorType.imB5) ' Getriebegröße und -ausrichtung definieren
motor.SetGearbox(100, GearboxMotorAttachment.Sidewards)
Der Presenter stellt folgende Funktionen bereit:
Drehen der Ansicht
Zoom der Ansicht
Einstellen einer definierten Ansicht
Export des aktuellen Zustand als Bild
Beim Initialisieren ermittelt der Presenter automatisch die hardwaretechnischen Möglichkeiten, entscheidet z. B. zwischen Hardware- oder Softwarebasierten Rendern, wendet Z-Buffering und bis zu vierfachen Antialiasing an.
Beispielcode: Presenter initialisieren
Dim presenter As Conveyor3DPresenter ' Darstellung des Modells initieren und einen Verweis auf die PictureBox erzeugen
presenter =New Conveyor3DPresenter(Me.pictureBox, model) ' Bei Fehlschlag Formular schließen IfNot presenter.Initialized Then
MsgBox("Grafik konnte nicht initialisiert werden.")
Me.Close() EndIf ' Andauernden Thread starten, der die Darstellung in die PictureBox rendert ' Bei Fehlschalg Formular schließen IfNot presenter.StartRenderThread Then
MsgBox("Rendern der Grafik nicht möglich.")
Me.Close() EndIf
Beispielcode: Darstellung per Formular-Tastatureingaben steuern
If e.KeyData = Keys.W Then
presenter.Wireframed =Not presenter.Wireframed ElseIf e.KeyData = Keys.I Then
presenter.SetCameraView(CameraView.Isometric, _
Conveyor3DPresenter.DefaultCameraDistance) ElseIf e.KeyData = Keys.O Then
presenter.SetCameraView(CameraView.Top, _
Conveyor3DPresenter.KeepCameraDistance) ElseIf e.KeyData = Keys.R Then
presenter.SetCameraView(CameraView.Right, _
Conveyor3DPresenter.KeepCameraDistance) ElseIf e.KeyData = Keys.L Then
presenter.SetCameraView(CameraView.Left, _
Conveyor3DPresenter.KeepCameraDistance) ElseIf e.KeyData = Keys.V Then
presenter.SetCameraView(CameraView.Front, _
Conveyor3DPresenter.KeepCameraDistance) ElseIf e.KeyData = Keys.H Then
presenter.SetCameraView(CameraView.Back, _
Conveyor3DPresenter.KeepCameraDistance) ElseIf e.KeyData = Keys.Left Then
presenter.RotateCameraByPercentage(-0.05,0) ElseIf e.KeyData = Keys.Right Then
presenter.RotateCameraByPercentage(0.05,0) ElseIf e.KeyData = Keys.Up Then
presenter.RotateCameraByPercentage(0,0.05) ElseIf e.KeyData = Keys.Down Then
presenter.RotateCameraByPercentage(0,-0.05) ElseIf e.KeyData = Keys.Add Then
presenter.ZoomCameraByPercentage(-0.05) ElseIf e.KeyData = Keys.Subtract Then
presenter.ZoomCameraByPercentage(0.05) ElseIf e.KeyData = Keys.S Then Dim bmp As Bitmap = presenter.GetRenderedBitmap()
bmp.Save("c:\screenshot.png", ImageFormat.Png)
bmp.Dispose() EndIf