none
Viewport3D löschen/leeren - Aber wie? RRS feed

  • Frage

  • Hallo,

    in meinem Viewport3D befinden sich eine Reihe mit Hilfe der ScreenSpaceLines3D gezeichneter Linien. Wenn ich jedoch versuche, diese wieder zu löschen, bekomme ich die Meldung: "Für die aktuelle Position ist kein Quellcode verfügbar." bzw. "NullReferenceException wurde nicht behandelt".

    Vielleicht einmal zum Quelltext:

    XAML:
    <Window x:Class="Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="700" Width="700" AllowsTransparency="False" WindowStyle="ThreeDBorderWindow">

    <Grid>
    <StackPanel Name="PanelMenu" Orientation="Horizontal" Height="30" VerticalAlignment="Top">
    <Button Height="26" Name="Button1" Width="106">Button</Button>
    </StackPanel>
    <DockPanel Name="PanelViewport" Margin="0,30,0,100">
    <!-- MainViewport für die Zeichnung-->
    <Viewport3D Name="mainViewport" Width="500" Height="500" DockPanel.Dock="Right">
    <Viewport3D.Camera>
    <PerspectiveCamera Position="-10,10,0" LookDirection="10,-10,0" UpDirection="0,0,1" />
    </Viewport3D.Camera>
    <ModelVisual3D>
    <ModelVisual3D.Content>
    <AmbientLight />
    </ModelVisual3D.Content>
    </ModelVisual3D>
    </Viewport3D>
    <!-- NavViewPort für das KOS, welches parallel zur Zeichnung rotiert-->
    <Viewport3D Name="navViewport" Height="150" Width="150" DockPanel.Dock="Left" VerticalAlignment="Bottom">
    <Viewport3D.Camera>
    <PerspectiveCamera Position="1.5,1.5,1.5" LookDirection="-1.5,-1.5,-1.5" UpDirection="0,0,1" NearPlaneDistance="0" />
    </Viewport3D.Camera>
    <ModelVisual3D>
    <ModelVisual3D.Content>
    <Model3DGroup>
    <AmbientLight Color="White" />
    <GeometryModel3D>
    <GeometryModel3D.Geometry><!-- 0/0 1/1 2/2 3/3
    0/4 1/5 4/6 5/7
    1/8 2/9 5/10 6/11
    0/12 1/13 2/14 3/15
    0/16 1/17 4/18 5/19
    1/20 2/21 5/22 6/23-->
    <MeshGeometry3D Positions=" 0,0,1 0,0,0 1,0,0 1,0,1
    0,0,1 0,0,0 0,1,1 0,1,0
    0,0,0 1,0,0 0,1,0 0,1,0"
    TriangleIndices=" 1 0 3 3 2 1
    4 5 7 7 6 4
    8 9 11 11 10 8

    3 0 1 1 2 3
    4 6 7 7 5 4
    11 9 8 8 10 11
    "
    TextureCoordinates="0,0 0,1 1,1 1,0
    0,0 0,1 1,0 1,1
    0,1 1,1 1,0 0,0"
    /><!-- TEXTUR BEARBEITEN!!!-->
    </GeometryModel3D.Geometry>
    <GeometryModel3D.Material>
    <DiffuseMaterial>
    <DiffuseMaterial.Brush>
    <ImageBrush ImageSource="KOS.png" ViewportUnits="Absolute" />
    <!--<SolidColorBrush Color="Red" />-->
    </DiffuseMaterial.Brush>
    </DiffuseMaterial>
    </GeometryModel3D.Material>
    </GeometryModel3D>
    </Model3DGroup>
    </ModelVisual3D.Content>
    </ModelVisual3D>
    </Viewport3D>
    </DockPanel>
    </Grid>
    </Window>
    Ich habe die gesamten Steuerelemente entfernt und nur das "Wichtigste" belassen.

    Und nun zum VB-Code:

    Class Window1

    Private myModel As New ModelVisual3D
    Private Line As New ScreenSpaceLines3D
    Public colLines As New Collection

    Private Sub Anzeige()
    ' Hinzufügen des Models mit den Linien zum mainViewport
    Dim tempBalken As New clBalken

    ' Jeder Balken wird einzeln in den ViewPort gezeichnet
    For Each tempBalken In colBalken

    Line = Balken(tempBalken.Anfx, tempBalken.Anfy, tempBalken.Anfz, tempBalken.Endx, tempBalken.Endy, tempBalken.Endz, tempBalken.Dicke)
    colLines.Add(Line)
    myModel.Children.Add(Line) ' <-- Hinzufügen der Linie zum Model

    Next
    tempBalken = Nothing

    Me.mainViewport.Children.Add(myModel) ' <-- Hinzufügen zum mainViewport

    End Sub

    Function Balken(ByVal x1 As Double, ByVal y1 As Double, ByVal z1 As Double, ByVal x2 As Double, ByVal y2 As Double, ByVal z2 As Double, ByVal Dicke As Double) As ScreenSpaceLines3D
    ' Gibt mir ein Visual3D zurück, welches aussieht wie ein Balken
    Dim Farbe As New Color
    Dim lines As New ScreenSpaceLines3D
    Dim gridLines As New Point3DCollection



    'Start-/Endpunkt festlegen
    gridLines.Add(New Point3D(x1, y1, z1))
    gridLines.Add(New Point3D(x2, y2, z2))

    lines.Points = gridLines

    ' so dick wird der Balken dargestellt
    lines.Thickness = 5

    ' Farbdarstellung: über den Lab-Farbraum, damit ist es mit Veränderung einer Größe (hier: a) möglich
    ' die Farben von Grün über Gelb bis Rot darzustellen
    ' siehe: Farbwähler in z.B. Photoshop mit L=90, a = variabel, b = 120
    ' -128 <= a <= 127
    Dim a As Double = ((Dicke - kDicke) / (gDicke - kDicke)) * 255 - 128

    Dim cR As Double
    Dim cG As Double

    ' Veränderung des Rot-/Grüntons beginnt bei a = 0
    If a >= 0 Then
    cR = 255
    cG = 255 - 2 * a
    Else
    cR = 255 + 2 * a
    cG = 255
    End If

    ' Da Werte >255 und <0 zu Fehlern führen und die Berechnung etwas unexakt (jedoch ausreichend) ist:
    If cR > 255 Then
    cR = 255
    ElseIf cR < 0 Then
    cR = 0
    End If

    If cG > 255 Then
    cG = 255
    ElseIf cG < 0 Then
    cG = 0
    End If

    ' kein Blauanteile nötig
    Farbe = Color.FromRgb(cR, cG, 0)

    lines.Color = Farbe

    Return lines

    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click

    Me.mainViewport.Children.RemoveAt(1) ' <-- Hier tritt der Fehler auf, obwohl ich WEISS, dass das Children mit Index 1 meine Zeichnung ist!

    End Sub

    End Class
    Ihr könnt das Codebeispiel nicht nachvollziehen, weil euch die Balken Fehlen, aber vielleicht findet ihr den prinzipiellen Fehler.

    Zusammengefasst passiert ja folgendes:

    • In den mainViewport (in dem bereits ein Children, Index 0, das AmbientLight vorhanden ist) wird ein weiteres Model hinzugefügt (myModel)
    • Entfernt werden soll das ganze eigentlich nur im "Rückwärtsverfahren", also über RemoveAt. Der Index des hinzugefügten Models ist stets 1...
    Also warum kommt diese NullReferenceException, obwohl myModel nicht NULL ist?

    Stellt bitte Fragen, wenn etwas nicht klar geworden ist.

    Hoffentlich könnt ihr mir helfen, denn ich sehe keine Verfahrensfehler...

    Viele Grüße

    daGrossa
    Sonntag, 31. Januar 2010 14:39

Alle Antworten