Changeset 3109 for trunk/packages


Ignore:
Timestamp:
Jul 23, 2012 11:40:05 AM (12 years ago)
Author:
ldelgass
Message:

VTK Molecule: fix atom scale to be consistent with Angstrom units used for
radii. Add method to change bond radius. Set defaults similar to VTK 5.8's
MoleculeMapper?.

Location:
trunk/packages/vizservers/vtkvis
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/packages/vizservers/vtkvis/RpMolecule.cpp

    r3103 r3109  
    2727Molecule::Molecule() :
    2828    VtkGraphicsObject(),
    29     _radiusScale(1.0),
    30     _atomScaling(NO_ATOM_SCALING),
     29    _radiusScale(0.3),
     30    _atomScaling(VAN_DER_WAALS_RADIUS),
    3131    _colorMap(NULL)
    3232{
     
    105105            WARN("No element array in dataset %s", _dataSet->getName().c_str());
    106106            setColorMap(ColorMap::getDefault());
     107            if (_atomScaling != NO_ATOM_SCALING)
     108                _atomScaling = NO_ATOM_SCALING;
    107109        } else {
    108110            TRACE("Using element default colormap");
     
    125127        if (pd->GetNumberOfLines() > 0) {
    126128            // Bonds
    127             vtkSmartPointer<vtkTubeFilter> tuber = vtkSmartPointer<vtkTubeFilter>::New();
    128             tuber->SetInput(pd);
    129             tuber->SetNumberOfSides(12);
    130             tuber->CappingOff();
    131             tuber->SetRadius(.03);
    132             tuber->SetVaryRadiusToVaryRadiusOff();
    133             _bondMapper->SetInputConnection(tuber->GetOutputPort());
     129            if (_tuber == NULL)
     130                _tuber = vtkSmartPointer<vtkTubeFilter>::New();
     131            _tuber->SetInput(pd);
     132            _tuber->SetNumberOfSides(12);
     133            _tuber->CappingOff();
     134            _tuber->SetRadius(0.075);
     135            _tuber->SetVaryRadiusToVaryRadiusOff();
     136            _bondMapper->SetInputConnection(_tuber->GetOutputPort());
    134137            _bondProp->SetMapper(_bondMapper);
    135138            getAssembly()->AddPart(_bondProp);
     
    138141            // Atoms
    139142            vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New();
    140             sphereSource->SetRadius(.08);
     143            sphereSource->SetRadius(1.0);
    141144            sphereSource->SetThetaResolution(14);
    142145            sphereSource->SetPhiResolution(14);
     
    276279        addRadiusArray(ds, _atomScaling, _radiusScale);
    277280        if (_glypher != NULL) {
    278             if (_atomScaling != NO_ATOM_SCALING &&
    279                 ds->GetPointData() != NULL &&
    280                 ds->GetPointData()->GetVectors() != NULL) {
    281                 _glypher->SetScaleModeToScaleByVector();
    282                 _glypher->ScalingOn();
    283             } else {
    284                 _glypher->SetScaleModeToDataScalingOff();
    285                 _glypher->ScalingOff();
    286             }
     281            assert(ds->GetPointData() != NULL &&
     282                   ds->GetPointData()->GetVectors() != NULL);
     283            _glypher->SetScaleModeToScaleByVector();
     284            _glypher->ScalingOn();
    287285        }
    288286    }
     
    303301
    304302/**
     303 * \brief Set the constant radius scaling factor for bonds.
     304 */
     305void Molecule::setBondRadiusScale(double scale)
     306{
     307    if (_tuber != NULL)
     308        _tuber->SetRadius(scale);
     309}
     310
     311/**
    305312 * \brief Add a scalar array to dataSet with sizes for the elements
    306313 * specified in the "element" scalar array
     
    308315void Molecule::addRadiusArray(vtkDataSet *dataSet, AtomScaling scaling, double scaleFactor)
    309316{
    310     if (dataSet->GetPointData() == NULL ||
    311         dataSet->GetPointData()->GetScalars() == NULL) {
    312         return;
    313     }
    314     vtkDataArray *elements = dataSet->GetPointData()->GetScalars();
    315     if (strcmp(elements->GetName(), "element") != 0) {
    316         return;
     317    vtkDataArray *elements = NULL;
     318    if (dataSet->GetPointData() != NULL &&
     319        dataSet->GetPointData()->GetScalars() != NULL &&
     320        strcmp(dataSet->GetPointData()->GetScalars()->GetName(), "element") == 0) {
     321        elements = dataSet->GetPointData()->GetScalars();
     322    } else if (scaling != NO_ATOM_SCALING) {
     323        WARN("Can't use non-constant scaling without an element array");
    317324    }
    318325    const float *radiusSource = NULL;
     
    329336    case NO_ATOM_SCALING:
    330337    default:
    331         return;
     338        ;
    332339    }
    333340    vtkSmartPointer<vtkFloatArray> radii = vtkSmartPointer<vtkFloatArray>::New();
    334341    radii->SetName("radius");
    335342    radii->SetNumberOfComponents(3);
    336     for (int i = 0; i < elements->GetNumberOfTuples(); i++) {
    337         int elt = (int)elements->GetComponent(i, 0);
     343    vtkPolyData *pd = vtkPolyData::SafeDownCast(dataSet);
     344    if (pd == NULL) {
     345        ERROR("DataSet not a PolyData");
     346        return;
     347    }
     348    for (int i = 0; i < pd->GetNumberOfVerts(); i++) {
    338349        float tuple[3];
    339         tuple[0] = radiusSource[elt] * scaleFactor;
    340         tuple[1] = 0;
    341         tuple[2] = 0;
     350        tuple[1] = tuple[2] = 0;
     351        if (elements != NULL && radiusSource != NULL) {
     352            int elt = (int)elements->GetComponent(i, 0);
     353            tuple[0] = radiusSource[elt] * scaleFactor;
     354        } else {
     355            tuple[0] = scaleFactor;
     356        }
    342357        radii->InsertNextTupleValue(tuple);
    343358    }
  • trunk/packages/vizservers/vtkvis/RpMolecule.h

    r3086 r3109  
    1414#include <vtkActor.h>
    1515#include <vtkAssembly.h>
     16#include <vtkTubeFilter.h>
    1617#include <vtkGlyph3D.h>
    1718
     
    7071    void setAtomRadiusScale(double scale);
    7172
     73    void setBondRadiusScale(double scale);
     74
    7275    void setAtomVisibility(bool state);
    7376
     
    9093    vtkSmartPointer<vtkActor> _bondProp;
    9194    vtkSmartPointer<vtkGlyph3D> _glypher;
     95    vtkSmartPointer<vtkTubeFilter> _tuber;
    9296    vtkSmartPointer<vtkPolyDataMapper> _atomMapper;
    9397    vtkSmartPointer<vtkPolyDataMapper> _bondMapper;
Note: See TracChangeset for help on using the changeset viewer.