Ignore:
Timestamp:
Sep 10, 2011 4:23:33 PM (13 years ago)
Author:
ldelgass
Message:

Add option to send VTK file to be used for streamlines seeds. The seeds can
come from the mesh points or from filling the mesh cells with randomly
placed points. The VTK data file can be any type of dataset that has points
and cells (cells only required if using random placement within cells). Also
add option to use points of main dataset mesh.

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

Legend:

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

    r2467 r2506  
    2626#include <vtkTransform.h>
    2727#include <vtkTransformPolyDataFilter.h>
     28#include <vtkVertexGlyphFilter.h>
    2829
    2930#include "RpStreamlines.h"
     
    123124        _seedActor = vtkSmartPointer<vtkActor>::New();
    124125        _seedActor->GetProperty()->SetColor(_seedColor[0], _seedColor[1], _seedColor[2]);
     126        _seedActor->GetProperty()->SetEdgeColor(_seedColor[0], _seedColor[1], _seedColor[2]);
    125127        _seedActor->GetProperty()->SetLineWidth(1);
    126128        _seedActor->GetProperty()->SetPointSize(2);
     
    218220    // all cells are equal area/volume)
    219221    int cell = rand() % numCells;
    220     double bounds[6];
    221     ds->GetCellBounds(cell, bounds);
    222     // Note: point is inside AABB of cell, but may be outside the cell
    223     getRandomPoint(pt, bounds);
     222    int type = ds->GetCellType(cell);
     223    if (type == VTK_VERTEX) {
     224        vtkSmartPointer<vtkIdList> ptIds = vtkSmartPointer<vtkIdList>::New();
     225        ds->GetCellPoints(cell, ptIds);
     226        assert(ptIds->GetNumberOfIds() == 1);
     227        ds->GetPoint(ptIds->GetId(0), pt);
     228    } else if (type == VTK_LINE) {
     229        double v[2][3];
     230        vtkSmartPointer<vtkIdList> ptIds = vtkSmartPointer<vtkIdList>::New();
     231        ds->GetCellPoints(cell, ptIds);
     232        assert(ptIds->GetNumberOfIds() == 2);
     233        for (int i = 0; i < 2; i++) {
     234            ds->GetPoint(ptIds->GetId(i), v[i]);
     235        }
     236        getRandomPointOnLineSegment(pt, v[0], v[1]);
     237    } else if (type == VTK_TRIANGLE) {
     238        double v[3][3];
     239        vtkSmartPointer<vtkIdList> ptIds = vtkSmartPointer<vtkIdList>::New();
     240        ds->GetCellPoints(cell, ptIds);
     241        assert(ptIds->GetNumberOfIds() == 3);
     242        for (int i = 0; i < 3; i++) {
     243            ds->GetPoint(ptIds->GetId(i), v[i]);
     244        }
     245        getRandomPointInTriangle(pt, v[0], v[1], v[2]);
     246    } else if (type == VTK_QUAD) {
     247        double v[4][3];
     248        vtkSmartPointer<vtkIdList> ptIds = vtkSmartPointer<vtkIdList>::New();
     249        ds->GetCellPoints(cell, ptIds);
     250        assert(ptIds->GetNumberOfIds() == 4);
     251        for (int i = 0; i < 4; i++) {
     252            ds->GetPoint(ptIds->GetId(i), v[i]);
     253        }
     254        int tri = rand() & 0x1;
     255        if (tri) {
     256            getRandomPointInTriangle(pt, v[0], v[1], v[2]);
     257        } else {
     258            getRandomPointInTriangle(pt, v[0], v[2], v[3]);
     259        }
     260    } else {
     261        double bounds[6];
     262        ds->GetCellBounds(cell, bounds);
     263        // Note: point is inside AABB of cell, but may be outside the cell
     264        getRandomPoint(pt, bounds);
     265    }
    224266}
    225267
     
    286328        _seedMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    287329        _seedMapper->SetResolveCoincidentTopologyToPolygonOffset();
     330        _seedMapper->ScalarVisibilityOff();
    288331    }
    289332
    290333    // Set up seed source object
    291     setSeedToRandomPoints(200);
     334    setSeedToFilledMesh(200);
    292335
    293336    switch (_lineType) {
     
    343386
    344387/**
    345  * \brief Use randomly distributed seed points
     388 * \brief Use points of the DataSet associated with this
     389 * Streamlines as seeds
     390 */
     391void Streamlines::setSeedToMeshPoints()
     392{
     393    setSeedToMeshPoints(_dataSet->getVtkDataSet());
     394}
     395
     396/**
     397 * \brief Use seed points randomly distributed within the cells
     398 * of the DataSet associated with this Streamlines
    346399 *
    347400 * Note: The current implementation doesn't give a uniform
     
    351404 * \param[in] numPoints Number of random seed points to generate
    352405 */
    353 void Streamlines::setSeedToRandomPoints(int numPoints)
     406void Streamlines::setSeedToFilledMesh(int numPoints)
     407{
     408    setSeedToFilledMesh(_dataSet->getVtkDataSet(), numPoints);
     409}
     410
     411/**
     412 * \brief Use points of a supplied vtkDataSet as seeds
     413 *
     414 * \param[in] seed vtkDataSet with points to use as seeds
     415 */
     416void Streamlines::setSeedToMeshPoints(vtkDataSet *seed)
     417{
     418    if (_streamTracer != NULL) {
     419        TRACE("Seed points: %d", seed->GetNumberOfPoints());
     420        vtkSmartPointer<vtkDataSet> oldSeed;
     421        if (_streamTracer->GetSource() != NULL) {
     422            oldSeed = _streamTracer->GetSource();
     423        }
     424
     425        _streamTracer->SetSource(seed);
     426        if (oldSeed != NULL) {
     427            oldSeed->SetPipelineInformation(NULL);
     428        }
     429
     430        if (vtkPolyData::SafeDownCast(seed) != NULL) {
     431            _seedMapper->SetInput(vtkPolyData::SafeDownCast(seed));
     432        } else {
     433            vtkSmartPointer<vtkVertexGlyphFilter> vertFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New();
     434            vertFilter->SetInput(seed);
     435            _seedMapper->SetInputConnection(vertFilter->GetOutputPort());
     436        }
     437    }
     438}
     439
     440/**
     441 * \brief Use seed points randomly distributed within the cells
     442 * of a supplied vtkDataSet
     443 *
     444 * Note: The current implementation doesn't give a uniform
     445 * distribution of points, and points outside the mesh bounds
     446 * may be generated
     447 *
     448 * \param[in] ds vtkDataSet containing cells
     449 * \param[in] numPoints Number of random seed points to generate
     450 */
     451void Streamlines::setSeedToFilledMesh(vtkDataSet *ds, int numPoints)
    354452{
    355453    if (_streamTracer != NULL) {
     
    359457        vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();
    360458
     459        if (ds->GetNumberOfCells() < 1) {
     460            ERROR("No cells in mesh");
     461        }
     462
    361463        for (int i = 0; i < numPoints; i++) {
    362464            double pt[3];
    363             getRandomCellPt(pt, _dataSet->getVtkDataSet());
     465            getRandomCellPt(pt, ds);
    364466            TRACE("Seed pt: %g %g %g", pt[0], pt[1], pt[2]);
    365467            pts->InsertNextPoint(pt);
     
    10581160    _seedColor[1] = color[1];
    10591161    _seedColor[2] = color[2];
    1060     if (_seedActor != NULL)
     1162    if (_seedActor != NULL) {
    10611163        _seedActor->GetProperty()->SetColor(_seedColor[0], _seedColor[1], _seedColor[2]);
     1164        _seedActor->GetProperty()->SetEdgeColor(_seedColor[0], _seedColor[1], _seedColor[2]);
     1165    }
    10621166}
    10631167
  • trunk/packages/vizservers/vtkvis/RpStreamlines.h

    r2454 r2506  
    7777    virtual void setClippingPlanes(vtkPlaneCollection *planes);
    7878
    79     void setSeedToRandomPoints(int numPoints);
     79    void setSeedToMeshPoints();
     80
     81    void setSeedToFilledMesh(int numPoints);
     82
     83    void setSeedToMeshPoints(vtkDataSet *ds);
     84
     85    void setSeedToFilledMesh(vtkDataSet *ds, int numPoints);
    8086
    8187    void setSeedToRake(double start[3], double end[3], int numPoints);
  • trunk/packages/vizservers/vtkvis/RpVtkRenderer.cpp

    r2492 r2506  
    60736073
    60746074/**
     6075 * \brief Set the streamlines seed to points of the streamlines DataSet
     6076 */
     6077void Renderer::setStreamlinesSeedToMeshPoints(const DataSetId& id)
     6078{
     6079    StreamlinesHashmap::iterator itr;
     6080
     6081    bool doAll = false;
     6082
     6083    if (id.compare("all") == 0) {
     6084        itr = _streamlines.begin();
     6085        doAll = true;
     6086    } else {
     6087        itr = _streamlines.find(id);
     6088    }
     6089    if (itr == _streamlines.end()) {
     6090        ERROR("Streamlines not found: %s", id.c_str());
     6091        return;
     6092    }
     6093
     6094    do {
     6095        itr->second->setSeedToMeshPoints();
     6096    } while (doAll && ++itr != _streamlines.end());
     6097
     6098    _needsRedraw = true;
     6099}
     6100
     6101/**
     6102 * \brief Set the streamlines seed to points distributed randomly inside
     6103 * cells of the streamlines DataSet
     6104 */
     6105void Renderer::setStreamlinesSeedToFilledMesh(const DataSetId& id, int numPoints)
     6106{
     6107    StreamlinesHashmap::iterator itr;
     6108
     6109    bool doAll = false;
     6110
     6111    if (id.compare("all") == 0) {
     6112        itr = _streamlines.begin();
     6113        doAll = true;
     6114    } else {
     6115        itr = _streamlines.find(id);
     6116    }
     6117    if (itr == _streamlines.end()) {
     6118        ERROR("Streamlines not found: %s", id.c_str());
     6119        return;
     6120    }
     6121
     6122    do {
     6123        itr->second->setSeedToFilledMesh(numPoints);
     6124    } while (doAll && ++itr != _streamlines.end());
     6125
     6126    _needsRedraw = true;
     6127}
     6128
     6129/**
     6130 * \brief Set the streamlines seed to points of a DataSet
     6131 *
     6132 * \param[in] id DataSet identifier
     6133 * \param[in] data Bytes of VTK DataSet file
     6134 * \param[in] nbytes Length of data array
     6135 *
     6136 * \return boolean indicating success or failure
     6137 */
     6138bool Renderer::setStreamlinesSeedToMeshPoints(const DataSetId& id,
     6139                                              char *data, size_t nbytes)
     6140{
     6141    vtkSmartPointer<vtkDataSetReader> reader = vtkSmartPointer<vtkDataSetReader>::New();
     6142    vtkSmartPointer<vtkCharArray> dataSetString = vtkSmartPointer<vtkCharArray>::New();
     6143
     6144    dataSetString->SetArray(data, nbytes, 1);
     6145    reader->SetInputArray(dataSetString);
     6146    reader->ReadFromInputStringOn();
     6147    reader->Update();
     6148
     6149    vtkSmartPointer<vtkDataSet> dataSet = reader->GetOutput();
     6150    if (dataSet == NULL) {
     6151        return false;
     6152    }
     6153    dataSet->SetPipelineInformation(NULL);
     6154
     6155    StreamlinesHashmap::iterator itr;
     6156
     6157    bool doAll = false;
     6158
     6159    if (id.compare("all") == 0) {
     6160        itr = _streamlines.begin();
     6161        doAll = true;
     6162    } else {
     6163        itr = _streamlines.find(id);
     6164    }
     6165    if (itr == _streamlines.end()) {
     6166        ERROR("Streamlines not found: %s", id.c_str());
     6167        return false;
     6168    }
     6169
     6170    do {
     6171        itr->second->setSeedToMeshPoints(dataSet);
     6172    } while (doAll && ++itr != _streamlines.end());
     6173
     6174    _needsRedraw = true;
     6175    return true;
     6176}
     6177
     6178/**
    60756179 * \brief Set the streamlines seed to points distributed randomly inside
    60766180 * cells of DataSet
    6077  */
    6078 void Renderer::setStreamlinesSeedToRandomPoints(const DataSetId& id, int numPoints)
    6079 {
     6181 *
     6182 * \param[in] id DataSet identifier
     6183 * \param[in] data Bytes of VTK DataSet file
     6184 * \param[in] nbytes Length of data array
     6185 * \param[in] numPoints Number of random seed points to generate
     6186 *
     6187 * \return boolean indicating success or failure
     6188 */
     6189bool Renderer::setStreamlinesSeedToFilledMesh(const DataSetId& id,
     6190                                              char *data, size_t nbytes,
     6191                                              int numPoints)
     6192{
     6193    vtkSmartPointer<vtkDataSetReader> reader = vtkSmartPointer<vtkDataSetReader>::New();
     6194    vtkSmartPointer<vtkCharArray> dataSetString = vtkSmartPointer<vtkCharArray>::New();
     6195
     6196    dataSetString->SetArray(data, nbytes, 1);
     6197    reader->SetInputArray(dataSetString);
     6198    reader->ReadFromInputStringOn();
     6199    reader->Update();
     6200
     6201    vtkSmartPointer<vtkDataSet> dataSet = reader->GetOutput();
     6202    if (dataSet == NULL) {
     6203        return false;
     6204    }
     6205    dataSet->SetPipelineInformation(NULL);
     6206
    60806207    StreamlinesHashmap::iterator itr;
    60816208
     
    60906217    if (itr == _streamlines.end()) {
    60916218        ERROR("Streamlines not found: %s", id.c_str());
    6092         return;
    6093     }
    6094 
    6095     do {
    6096         itr->second->setSeedToRandomPoints(numPoints);
     6219        return false;
     6220    }
     6221
     6222    do {
     6223        itr->second->setSeedToFilledMesh(dataSet, numPoints);
    60976224    } while (doAll && ++itr != _streamlines.end());
    60986225
    60996226    _needsRedraw = true;
     6227    return true;
    61006228}
    61016229
  • trunk/packages/vizservers/vtkvis/RpVtkRenderer.h

    r2492 r2506  
    611611    void setStreamlinesVisibility(const DataSetId& id, bool state);
    612612
    613     void setStreamlinesSeedToRandomPoints(const DataSetId& id, int numPoints);
     613    void setStreamlinesSeedToMeshPoints(const DataSetId& id);
     614
     615    void setStreamlinesSeedToFilledMesh(const DataSetId& id, int numPoints);
     616
     617    bool setStreamlinesSeedToMeshPoints(const DataSetId& id,
     618                                        char *data, size_t nbytes);
     619
     620    bool setStreamlinesSeedToFilledMesh(const DataSetId& id,
     621                                        char *data, size_t nbytes,
     622                                        int numPoints);
    614623
    615624    void setStreamlinesSeedToRake(const DataSetId& id,
  • trunk/packages/vizservers/vtkvis/RpVtkRendererCmd.cpp

    r2492 r2506  
    4040    }
    4141    return bytesWritten;
     42}
     43
     44static size_t
     45SocketRead(void *bytes, size_t len)
     46{
     47#ifdef notdef
     48    size_t ofs = 0;
     49    ssize_t bytesRead = 0;
     50    while ((bytesRead = read(g_fdIn, bytes + ofs, len - ofs)) > 0) {
     51        ofs += bytesRead;
     52        if (ofs == len)
     53            break;
     54    }
     55    TRACE("bytesRead: %lu", ofs);
     56    return ofs;
     57#else
     58    size_t bytesRead = fread(bytes, 1, len, g_fIn);
     59    TRACE("bytesRead: %lu", bytesRead);
     60    return bytesRead;
     61#endif
    4262}
    4363
     
    13021322    }
    13031323    char *data = (char *)malloc(nbytes);
    1304 #ifdef notdef
    1305     size_t ofs = 0;
    1306     ssize_t bytesRead = 0;
    1307     while ((bytesRead = read(g_fdIn, data + ofs, nbytes - ofs)) > 0) {
    1308         ofs += bytesRead;
    1309         if (ofs == nbytes)
    1310             break;
    1311     }
    1312     TRACE("bytesRead: %d", ofs);
     1324    size_t bytesRead = SocketRead(data, nbytes);
    13131325    if (bytesRead < 0) {
    13141326        free(data);
    13151327        return TCL_ERROR;
    13161328    }
    1317 #else
    1318     size_t bytesRead = fread(data, 1, nbytes, g_fIn);
    1319     TRACE("bytesRead: %d", bytesRead);
    1320     if (bytesRead < (size_t)nbytes) {
    1321         free(data);
    1322         return TCL_ERROR;
    1323     }
    1324 #endif
    13251329    g_renderer->addDataSet(name);
    13261330    g_renderer->setData(name, data, nbytes);
     
    43184322
    43194323static int
     4324StreamlinesSeedFilledMeshOp(ClientData clientData, Tcl_Interp *interp,
     4325                            int objc, Tcl_Obj *const *objv)
     4326{
     4327    int numPoints = 0;
     4328    if (Tcl_GetIntFromObj(interp, objv[3], &numPoints) != TCL_OK ||
     4329        numPoints < 1) {
     4330        return TCL_ERROR;
     4331    }
     4332    const char *string = Tcl_GetString(objv[4]);
     4333    char c = string[0];
     4334    if ((c != 'd') || (strcmp(string, "data") != 0)) {
     4335        Tcl_AppendResult(interp, "bad streamlines seed fmesh option \"",
     4336                         string, "\": should be data", (char*)NULL);
     4337        return TCL_ERROR;
     4338    }
     4339    string = Tcl_GetString(objv[5]);
     4340    c = string[0];
     4341    if ((c != 'f') || (strcmp(string, "follows") != 0)) {
     4342        Tcl_AppendResult(interp, "bad streamlines seed fmesh option \"",
     4343                         string, "\": should be follows", (char*)NULL);
     4344        return TCL_ERROR;
     4345    }
     4346    int nbytes = 0;
     4347    if (Tcl_GetIntFromObj(interp, objv[6], &nbytes) != TCL_OK ||
     4348        nbytes < 0) {
     4349        return TCL_ERROR;
     4350    }
     4351    char *data = (char *)malloc(nbytes);
     4352    size_t bytesRead = SocketRead(data, nbytes);
     4353    if (bytesRead < 0) {
     4354        free(data);
     4355        return TCL_ERROR;
     4356    }
     4357    if (objc == 8) {
     4358        const char *name = Tcl_GetString(objv[7]);
     4359        if (!g_renderer->setStreamlinesSeedToFilledMesh(name, data, nbytes,
     4360                                                        numPoints)) {
     4361            free(data);
     4362            Tcl_AppendResult(interp, "Couldn't read mesh data or streamlines not found", (char*)NULL);
     4363            return TCL_ERROR;
     4364        }
     4365    } else {
     4366        if (!g_renderer->setStreamlinesSeedToFilledMesh("all", data, nbytes,
     4367                                                        numPoints)) {
     4368            free(data);
     4369            Tcl_AppendResult(interp, "Couldn't read mesh data or streamlines not found", (char*)NULL);
     4370            return TCL_ERROR;
     4371        }
     4372    }
     4373    free(data);
     4374    return TCL_OK;
     4375}
     4376
     4377static int
     4378StreamlinesSeedMeshPointsOp(ClientData clientData, Tcl_Interp *interp,
     4379                            int objc, Tcl_Obj *const *objv)
     4380{
     4381    const char *string = Tcl_GetString(objv[3]);
     4382    char c = string[0];
     4383    if ((c != 'd') || (strcmp(string, "data") != 0)) {
     4384        Tcl_AppendResult(interp, "bad streamlines seed fmesh option \"",
     4385                         string, "\": should be data", (char*)NULL);
     4386        return TCL_ERROR;
     4387    }
     4388    string = Tcl_GetString(objv[4]);
     4389    c = string[0];
     4390    if ((c != 'f') || (strcmp(string, "follows") != 0)) {
     4391        Tcl_AppendResult(interp, "bad streamlines seed fmesh option \"",
     4392                         string, "\": should be follows", (char*)NULL);
     4393        return TCL_ERROR;
     4394    }
     4395    int nbytes = 0;
     4396    if (Tcl_GetIntFromObj(interp, objv[5], &nbytes) != TCL_OK ||
     4397        nbytes < 0) {
     4398        return TCL_ERROR;
     4399    }
     4400    char *data = (char *)malloc(nbytes);
     4401    size_t bytesRead = SocketRead(data, nbytes);
     4402    if (bytesRead < 0) {
     4403        free(data);
     4404        return TCL_ERROR;
     4405    }
     4406    if (objc == 7) {
     4407        const char *name = Tcl_GetString(objv[6]);
     4408        if (!g_renderer->setStreamlinesSeedToMeshPoints(name, data, nbytes)) {
     4409            free(data);
     4410            Tcl_AppendResult(interp, "Couldn't read mesh data or streamlines not found", (char*)NULL);
     4411            return TCL_ERROR;
     4412        }
     4413    } else {
     4414        if (!g_renderer->setStreamlinesSeedToMeshPoints("all", data, nbytes)) {
     4415            free(data);
     4416            Tcl_AppendResult(interp, "Couldn't read mesh data or streamlines not found", (char*)NULL);
     4417            return TCL_ERROR;
     4418        }
     4419    }
     4420    free(data);
     4421    return TCL_OK;
     4422}
     4423
     4424static int
     4425StreamlinesSeedPointsOp(ClientData clientData, Tcl_Interp *interp, int objc,
     4426                        Tcl_Obj *const *objv)
     4427{
     4428    if (objc == 4) {
     4429        const char *name = Tcl_GetString(objv[3]);
     4430        g_renderer->setStreamlinesSeedToMeshPoints(name);
     4431    } else {
     4432        g_renderer->setStreamlinesSeedToMeshPoints("all");
     4433    }
     4434    return TCL_OK;
     4435}
     4436
     4437static int
    43204438StreamlinesSeedPolygonOp(ClientData clientData, Tcl_Interp *interp, int objc,
    43214439                         Tcl_Obj *const *objv)
     
    44304548    if (objc == 5) {
    44314549        const char *name = Tcl_GetString(objv[4]);
    4432         g_renderer->setStreamlinesSeedToRandomPoints(name, numPoints);
    4433     } else {
    4434         g_renderer->setStreamlinesSeedToRandomPoints("all", numPoints);
     4550        g_renderer->setStreamlinesSeedToFilledMesh(name, numPoints);
     4551    } else {
     4552        g_renderer->setStreamlinesSeedToFilledMesh("all", numPoints);
    44354553    }
    44364554    return TCL_OK;
     
    44574575    {"color",   1, StreamlinesSeedColorOp, 6, 7, "r g b ?dataSetName?"},
    44584576    {"disk",    1, StreamlinesSeedDiskOp, 12, 13, "centerX centerY centerZ normalX normalY normalZ radius innerRadius numPoints ?dataSetName?"},
    4459     {"fpoly",   1, StreamlinesSeedFilledPolygonOp, 13, 14, "centerX centerY centerZ normalX normalY normalZ angle radius numSides numPoints ?dataSetName?"},
    4460     {"polygon", 1, StreamlinesSeedPolygonOp, 12, 13, "centerX centerY centerZ normalX normalY normalZ angle radius numSides ?dataSetName?"},
     4577    {"fmesh",   2, StreamlinesSeedFilledMeshOp, 7, 8, "numPoints data follows nbytes ?dataSetName?"},
     4578    {"fpoly",   2, StreamlinesSeedFilledPolygonOp, 13, 14, "centerX centerY centerZ normalX normalY normalZ angle radius numSides numPoints ?dataSetName?"},
     4579    {"mesh",    1, StreamlinesSeedMeshPointsOp, 6, 7, "data follows nbytes ?dataSetName?"},
     4580    {"points",  3, StreamlinesSeedPointsOp, 3, 4, "?dataSetName?"},
     4581    {"polygon", 3, StreamlinesSeedPolygonOp, 12, 13, "centerX centerY centerZ normalX normalY normalZ angle radius numSides ?dataSetName?"},
    44614582    {"rake",    3, StreamlinesSeedRakeOp, 10, 11, "startX startY startZ endX endY endZ numPoints ?dataSetName?"},
    44624583    {"random",  3, StreamlinesSeedRandomOp, 4, 5, "numPoints ?dataSetName?"},
     
    45344655    {"ribbons",   1, StreamlinesRibbonsOp, 4, 5, "width angle ?dataSetName?"},
    45354656    {"scale",     2, StreamlinesScaleOp, 5, 6, "sx sy sz ?dataSetName?"},
    4536     {"seed",      2, StreamlinesSeedOp, 4, 14, "op params... ?dataSetName?"},
     4657    {"seed",      2, StreamlinesSeedOp, 3, 14, "op params... ?dataSetName?"},
    45374658    {"tubes",     1, StreamlinesTubesOp, 4, 5, "numSides radius ?dataSetName?"},
    45384659    {"visible",   1, StreamlinesVisibleOp, 3, 4, "bool ?dataSetName?"}
  • trunk/packages/vizservers/vtkvis/Trace.cpp

    r2100 r2506  
    33 * Copyright (C) 2011, Purdue Research Foundation
    44 *
    5  * Author: ?
     5 * Author: George A. Howlett <gah@purdue.edu>
    66 */
    77
  • trunk/packages/vizservers/vtkvis/Trace.h

    r2100 r2506  
    33 * Copyright (C) 2011, Purdue Research Foundation
    44 *
    5  * Author: ?
     5 * Author: George A. Howlett <gah@purdue.edu>
    66 */
    77
  • trunk/packages/vizservers/vtkvis/protocol.txt

    r2503 r2506  
    306306            Create a disk seed area with optional hole, filled with randomly
    307307            placed points
     308streamlines seed fmesh <numPoints> data follows <nbytes> <?datasetName?>
     309            Fill a mesh supplied as a VTK data file with randomly placed points
    308310streamlines seed fpoly <centerX> <centerY> <centerZ> <normalX> <normalY> <normalZ> <angle> <radius> <numSides> <numPoints> <?dataSetName?>
    309311            Create a regular n-sided polygonal seed area filled with randomly
    310312            placed points
     313streamlines seed mesh data follows <nbytes> <?datasetName?>
     314            Use points of a mesh supplied as a VTK data file
     315streamlines seed points <?datasetName?>
     316            Use points of the streamlines' dataset mesh
    311317streamlines seed polygon <centerX> <centerY> <centerZ> <normalX> <normalY> <normalZ> <angle> <radius> <numSides> <?dataSetName?>
    312318            Create seed points from vertices of a regular n-sided polygon
    313319streamlines seed rake <startX> <startY> <startZ> <endX> <endY> <endZ> <numPoints> <?datasetName?>
    314320streamlines seed random <numPoints> <?datasetName?>
     321            Fill the streamlines' dataset mesh with randomly placed points
    315322streamlines seed visible <bool> <?datasetName?>
    316323streamlines tubes <numSides> <radius> <?datasetName?>
Note: See TracChangeset for help on using the changeset viewer.