Ralf Bartsch | Wissenschaftler, Ingenier, Gestalter

Conveyor3D

Klassenbibliothek

Conveyor3D ist eine Klassen­bi­blio­thek zur 3D-Dar­stellung eines oder mehrerer Förder­strecken-Layouts in einer Visual Basic .NET-Pro­gramm. Um eine Imple­men­tie­rung zu de­monst­rieren, wurde die hier down­load­bare Anwendung ge­schrieben. Es steckt viel Arbeit in der Conveyor3D-Biblio­thek. Daher ist der Code nicht frei ver­füg­bar. Es dient viel­mehr als Prä­sen­ta­tion, um das Potenzial in der an­ge­botenen Leistung zu ver­deut­lichen.

Screenshots

Demo-Programm
Bild des Demo­lay­outs, ge­spei­chert per Funk­tion der Conveyor3D-Bi­blio­thek

Beschreibung der Bi­blio­thek

Die Biblio­thek lässt sich durch ihre Klas­sen sehr ein­fach und flexi­bel hand­haben. Es gibt zwei Haupt­klas­sen, das Modell und den Presenter. Über das Modell wer­den die Eigen­schaf­ten der Stre­cken­ele­mente defi­niert, das Stre­cken­lay­out auf­ge­baut und die Geo­me­trie gene­riert. Der Presenter inter­agiert mit DirectX, „prä­sen­tiert“ das Modell zur Lauf­zeit in einer PictureBox und bie­tet Funk­tionen zur Ände­rung der Dar­stel­lung an. Durch die Funk­tions­tren­nung ist eine ge­wisse Fle­xi­bili­tät ge­währ­leis­tet und der ei­gene Code lässt sich ef­fi­zi­enter schrei­ben.

Modell

Das Modell weist fol­gende Funk­tio­na­li­täten auf:

  • Festlegung bei der In­iti­ali­sie­rung: Kettenbreite und -tei­lung sowie Pro­fil­höhe, Far­ben der je­weiligen Ober­flächen, Farb­ver­lauf für die Trum­ober­fläche (9 ver­schie­dene Ver­läufe)
  • Aufbau des Lay­outs mit fol­gen­den Strecken­ele­menten: Ge­ra­de, Hori­zon­tale Kur­ve, Ver­ti­kale Kur­ve, Bogen­rad, An­triebs­ein­heit mit IEC-Motor, Um­lenk­ein­heit
  • Anheften von Pfeilen oder Tex­turen (z. B. Logos) an die Ele­mente
  • Hinzufügen einer Be­gren­zung: Bo­den (recht­eckig/­rund, Far­be/­Textur) und/­oder Wänden (Tex­tur)

Jedem Strecken­ele­ment lässt sich ein pro­zen­tu­aler Start- und End­wert des Farb­ver­laufs zu­ord­nen. Da­durch ist es mög­lich Zu­stands­größen wie z. B. einen Zug­kraft­ver­lauf vi­su­ell auf dem Ober­trum dar­zu­stel­len. Im Demo-Pro­gramm wurde dies zur Ele­ment­unter­schei­dung an­ge­wandt.

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)

' Förderstrecke aufbauen
model.AddReturnUnit(250, 80, _
                    ElementAlignment.BeforeJunction)
model.StickArrow(0, colorArrow, False, 66.6, 300)
model.AddStraight(250)
model.AddHorizontalCurve(650, -33.84)
model.AddHorizontalCurve(650, 33.84)
model.AddStraight(2045.4)
model.AddCurveWheel(160, -180)
model.AddStraight(955)
model.AddHorizontalCurve(310, 90)
model.AddStraight(810)
model.AddCurveWheel(160, -90)
model.AddStraight(250)
model.AddVerticalCurve(2300, 4.7)
model.AddStraight(1776.1)
model.AddVerticalCurve(2300, -4.7)
model.AddStraight(250)
model.AddCurveWheel(160, -90)
model.AddStraight(250)
model.AddVerticalCurve(900, -9.6)
model.AddStraight(812.2)
model.AddVerticalCurve(900, 9.6)
model.AddStraight(250)
model.AddCurveWheel(160, -90)
model.AddStraight(3940)
model.StickArrow(0, colorArrow, False, 66.6, 300)
model.AddDrive(250, 80, _
               motor, ElementSide.Right, _
               ElementAlignment.AfterJunction)

Presenter

Der Presenter stellt fol­gende Funk­tionen be­reit:

  • Drehen der An­sicht
  • Zoom der An­sicht
  • Einstellen einer de­fi­nierten An­sicht
  • Export des aktu­ellen Zu­stand als Bild

Beim Ini­tiali­sie­ren er­mit­telt der Presenter auto­matisch die hard­ware­tech­nischen Mög­lich­keiten, ent­scheidet z. B. zwischen Hard­ware- oder Soft­ware­basierten Rendern, wendet Z-Buffering und bis zu vier­fachen Anti­aliasing 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
If Not presenter.Initialized Then
MsgBox("Grafik konnte nicht initialisiert werden.")
Me.Close()
End If
' Andauernden Thread starten, der die Darstellung in die PictureBox rendert
' Bei Fehlschalg Formular schließen
If Not presenter.StartRenderThread Then
MsgBox("Rendern der Grafik nicht möglich.")
Me.Close()
End If
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()
End If

Voraussetzung

Download

Version 2016-11-14 (Biblio­thek: 2016-10-16, initial 2014-05-24) — Windows — 1.018 kB — kein Setup

Download der Demo