Grasshopper

algorithmic modeling for Rhino

Hi,
I am not able to find the source of this failure. What happens is that I give a preview color to a mesh in a custom component, and it looks the default color of gh (red/green when selected) under the given color. Or if there are no color, the default red is like duplicated (have less transparency).
It seems that are being displayed the mesh twice, first with default colors and then with personalized color, but I do not understand why. I would bet that this is a silly mistake but...

What I want do is let the preview by default when the user does not give any color, and give custom color when the color parameter is not empty.

Something strange is that this error does not happen from a script component.


This is the code involved, the parameters _col and _mesh are filled in the solve instance.

Private _mesh As Mesh = Nothing
Private _col As Drawing.Color = Nothing

Public Overrides Sub DrawViewPortMeshes(args As IGH_PreviewArgs)
  MyBase.DrawViewportMeshes(args)

  If (Hidden) Then Return
  If (Locked) Then Return
  Dim mat As New Rhino.Display.DisplayMaterial()
  If (_col = Nothing) Or (_col = Drawing.Color.Empty) Then
    If (Attributes.Selected) Then
      mat = args.ShadeMaterial_Selected
    Else
      mat = args.ShadeMaterial
    End If
  Else
    Dim t As Double = (Convert.ToDouble(_col.A) / 255) * (-1) + 1
    mat = New Rhino.Display.DisplayMaterial(_col, t)
    mat.Shine = 0.3
    mat.Emission = Drawing.Color.Black
    mat.Specular = Drawing.Color.White
  End If
  args.Display.DrawMeshShaded(_mesh, mat)
End Sub

Public Overrides Sub DrawViewportWires(args As IGH_PreviewArgs)
  MyBase.DrawViewportWires(args)

  If (Hidden) Then Return
  If (Locked) Then Return
  Dim color As New System.Drawing.Color()
  If (_col = Nothing) Or (_col = Drawing.Color.Empty) Then
    If (Grasshopper.CentralSettings.PreviewMeshEdges) Then
      If (Attributes.Selected) Then
        color = args.WireColour_Selected
      Else
        color = args.WireColour
      End If
      args.Display.DrawMeshWires(_mesh, color)
    End If
  Else
    If (Grasshopper.CentralSettings.PreviewMeshEdges) Then
      If (MyBase.Attributes.Selected) Then
        color = Drawing.Color.FromArgb(255, 255, 0)
      Else
        color = _col
      End If
      args.Display.DrawMeshWires(_mesh, color)
    End If
  End If
End Sub

Public Overrides ReadOnly Property ClippingBox As BoundingBox
  Get
    Dim box As BoundingBox = MyBase.ClippingBox
    If (_mesh IsNot Nothing) AndAlso (_mesh.IsValid) Then
      box.Union(_mesh.GetBoundingBox(True))
    End If
  Return box
  End Get
End Property

Protected Overrides Sub BeforeSolveInstance()
  MyBase.ClearData()
  _mesh = Nothing
  _col = Nothing
End Sub

Does anyone see what I'm doing wrong?

I hope I explained well, feel free to ask.

Thanks!

Views: 491

Replies to This Discussion

Resolved.
MyBase.DrawViewportMeshes(args) was calling the preview with the defaults values.

Removing this line the problem is corrected. 

It seems that args.Display.DrawMeshShaded(_mesh, mat) also calls the preview.

 

RSS

About

Translate

Search

Photos

  • Add Photos
  • View All

Videos

  • Add Videos
  • View All

© 2024   Created by Scott Davidson.   Powered by

Badges  |  Report an Issue  |  Terms of Service