[vtkusers] Simple molecular model
    John Wooten 
    jwooten at ntplx.net
       
    Mon Jul 14 15:53:44 EDT 2003
    
    
  
I'm trying to build a simple molecular model in Visual Basic so I can use
the ActiveViz component to put the resulting model into a word document.  I
want to have very simple balls ( atoms ) with different potential colors,
but each atom with a label that "sticks" to it.  The balls are connected via
tubes.  i.e. the input data might be
atoms(0) = 0,0,0 ( i.e. position )
atoms(1) = -5, 0, 0
atoms(2) = 0, 0, 5
colors(0) = "Blue"
colors(1) = "Red"
colors(2) = "Green"
labels(0) = "Hydrogen"
labels(1) = "Oxygen"
labels(2) = "Lithium"
connects(0) = 0, 1 ( i.e. 0 is connected to 1 )
connects(1) = 0, 2 ( i.e. 0 is connected to 2 ).
My problem has been the labeling mostly.  Does anyone have a way to adapt
this piece of code or perhaps a better approach?  I'd love the have the
labels "wrapped" onto the surface of the object rather than hanging out in
front.
Code --------------------------------------------
Private Sub CommandButton2_Click()
Set renWin = vtkRenderWindowControl1.GetRenderWindow
Set renCollection = renWin.GetRenderers
renCollection.InitTraversal
Set ren1 = renCollection.GetNextItem
ren1.ResetCamera
renWin.Render
End Sub
Private Sub CommandButton1_Click()
Rem Create the rendering stuff-------------------------------------
Set renWin = vtkRenderWindowControl1.GetRenderWindow
Set renCollection = renWin.GetRenderers
renCollection.InitTraversal
Set ren1 = renCollection.GetNextItem
Rem create the positions of the atoms in a vtkPoints data set
Dim atoms As vtkPoints
Set atoms = New vtkPoints
  atoms.InsertPoint 0, 0, 0, 0
  atoms.InsertPoint 1, 0, 0, 5
  atoms.InsertPoint 2, 10, 0, 0
  atoms.InsertPoint 3, 0, 5, 0
  atoms.InsertPoint 4, 5, 10, 5
  atoms.InsertPoint 5, 5, 10, -5
Rem create the bonds between the atoms as a cell array
Dim bonds As vtkCellArray
Set bonds = New vtkCellArray
  bonds.InsertNextCell_3 2
  bonds.InsertCellPoint 0
  bonds.InsertCellPoint 1
  bonds.InsertNextCell_3 2
  bonds.InsertCellPoint 0
  bonds.InsertCellPoint 2
  bonds.InsertNextCell_3 2
  bonds.InsertCellPoint 0
  bonds.InsertCellPoint 3
  bonds.InsertNextCell_3 2
  bonds.InsertCellPoint 3
  bonds.InsertCellPoint 4
  bonds.InsertNextCell_3 2
  bonds.InsertCellPoint 3
  bonds.InsertCellPoint 5
Rem create the radii for the atoms as a float array
Dim radii As vtkFloatArray
Set radii = New vtkFloatArray
  radii.SetName "Radius"
  radii.InsertNextTuple1 3
  radii.InsertNextTuple1 2
  radii.InsertNextTuple1 1
  radii.InsertNextTuple1 2
  radii.InsertNextTuple1 1
  radii.InsertNextTuple1 1
Rem create a polydata with the atoms as points, bonds as lines and radii as
scalars
Dim Data As vtkPolyData
Set Data = New vtkPolyData
  Data.SetPoints atoms
  Data.SetLines bonds
  Data.GetPointData().SetScalars radii
Rem create a tube filter to create tubes around the lines
Dim Tuber0 As vtkTubeFilter
Set Tuber0 = New vtkTubeFilter
  Tuber0.SetInput Data
  Tuber0.SetNumberOfSides 12
  Tuber0.SetCapping 1
  Tuber0.SetRadius 0.25
  Tuber0.SetVaryRadius 0
  Tuber0.SetRadiusFactor 10
Rem create a mapper for the bonds or tubes output
Dim bondsMapper As vtkPolyDataMapper
Set bondsMapper = New vtkPolyDataMapper
  bondsMapper.SetInput Tuber0.GetOutput
bondsMapper.ScalarVisibilityOff
Rem create an actor for the bonds
Dim bondsActor As vtkActor
Set bondsActor = New vtkActor
  bondsActor.SetMapper bondsMapper
Rem create a sphere source for use with the glypher
Dim Sphere0 As vtkSphereSource
Set Sphere0 = New vtkSphereSource
        Sphere0.SetCenter 0, 0, 0
        Sphere0.SetRadius 0.5
        Sphere0.SetThetaResolution 20
        Sphere0.SetStartTheta 0
        Sphere0.SetEndTheta 360
        Sphere0.SetPhiResolution 20
        Sphere0.SetStartPhi 0
        Sphere0.SetEndPhi 180
Rem Create a glph to display the spheres
Dim Glyph1 As vtkGlyph3D
Set Glyph1 = New vtkGlyph3D
  Glyph1.SetInput Data
  Glyph1.SetSource Sphere0.GetOutput
  Glyph1.SetOrient 0
  Glyph1.SetScaleModeToScaleByScalar
  Glyph1.SetScaleFactor 1.5
Rem create a mapper to display the glyphs or atoms
Dim atomMapper As vtkPolyDataMapper
Set atomMapper = New vtkPolyDataMapper
  atomMapper.SetInput Glyph1.GetOutput
atomMapper.ScalarVisibilityOff
Rem create an actor for the mapper
Dim atomActor As vtkActor
Set atomActor = New vtkActor
  atomActor.SetMapper atomMapper
bondsActor.GetProperty.SetColor 0#, 0#, 1#
Rem add the two actors
  ren1.AddActor bondsActor
  ren1.AddActor atomActor
Rem set the background
ren1.SetBackground 0.1, 0.2, 0.4
Rem  render the image
Set cam = ren1.GetActiveCamera
cam.Zoom 1.5
cam.Azimuth 150
cam.Elevation 30
ren1.ResetCamera
renWin.Render
End Sub
Private Sub CommandButton3_Click()
If renWin Is Nothing Then
Else
Set renWin = vtkRenderWindowControl1.GetRenderWindow
Set renCollection = renWin.GetRenderers
renCollection.InitTraversal
Set ren1 = renCollection.GetNextItem
Set cam = ren1.GetActiveCamera
Dim Angle As Single
For i = 1 To 60
   cam.Azimuth 6
   renWin.Render
Next
End If
End Sub
Private Sub vtkRenderWindowControl1_StartRenderMethod()
End Sub
============================
Thanks in advance,
John Wooten
    
    
More information about the vtkusers
mailing list