Commit 61746c6e authored by hrchilds's avatar hrchilds
Browse files

Add support for custom seed point lists with streamlines

git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@7164 18c085ea-50e0-402c-830e-de6fd14e8384
parent 291aa4e2
......@@ -51,7 +51,7 @@
// Note: Autogenerated by xml2python. Do not modify by hand!
//
// Programmer: xml2python
// Creation: Wed Apr 8 17:09:05 PST 2009
// Creation: Sun May 3 10:26:31 PDT 2009
//
// ****************************************************************************
......@@ -77,7 +77,8 @@ PyStreamlineAttributes_ToString(const StreamlineAttributes *atts, const char *pr
std::string str;
char tmpStr[1000];
const char *sourceType_names = "SpecifiedPoint, SpecifiedLine, SpecifiedPlane, SpecifiedSphere, SpecifiedBox";
const char *sourceType_names = "SpecifiedPoint, SpecifiedLine, SpecifiedPlane, SpecifiedSphere, SpecifiedBox, "
"SpecifiedPointList";
switch (atts->GetSourceType())
{
case StreamlineAttributes::SpecifiedPoint:
......@@ -100,6 +101,10 @@ PyStreamlineAttributes_ToString(const StreamlineAttributes *atts, const char *pr
SNPRINTF(tmpStr, 1000, "%ssourceType = %sSpecifiedBox # %s\n", prefix, prefix, sourceType_names);
str += tmpStr;
break;
case StreamlineAttributes::SpecifiedPointList:
SNPRINTF(tmpStr, 1000, "%ssourceType = %sSpecifiedPointList # %s\n", prefix, prefix, sourceType_names);
str += tmpStr;
break;
default:
break;
}
......@@ -245,6 +250,22 @@ PyStreamlineAttributes_ToString(const StreamlineAttributes *atts, const char *pr
else
SNPRINTF(tmpStr, 1000, "%suseWholeBox = 0\n", prefix);
str += tmpStr;
{ const doubleVector &pointList = atts->GetPointList();
SNPRINTF(tmpStr, 1000, "%spointList = (", prefix);
str += tmpStr;
for(size_t i = 0; i < pointList.size(); ++i)
{
SNPRINTF(tmpStr, 1000, "%g", pointList[i]);
str += tmpStr;
if(i < pointList.size() - 1)
{
SNPRINTF(tmpStr, 1000, ", ");
str += tmpStr;
}
}
SNPRINTF(tmpStr, 1000, ")\n");
str += tmpStr;
}
SNPRINTF(tmpStr, 1000, "%spointDensity = %d\n", prefix, atts->GetPointDensity());
str += tmpStr;
const char *displayMethod_names = "Lines, Tubes, Ribbons";
......@@ -431,15 +452,15 @@ StreamlineAttributes_SetSourceType(PyObject *self, PyObject *args)
return NULL;
// Set the sourceType in the object.
if(ival >= 0 && ival < 5)
if(ival >= 0 && ival < 6)
obj->data->SetSourceType(StreamlineAttributes::SourceType(ival));
else
{
fprintf(stderr, "An invalid sourceType value was given. "
"Valid values are in the range of [0,4]. "
"Valid values are in the range of [0,5]. "
"You can also use the following names: "
"SpecifiedPoint, SpecifiedLine, SpecifiedPlane, SpecifiedSphere, SpecifiedBox"
".");
"SpecifiedPoint, SpecifiedLine, SpecifiedPlane, SpecifiedSphere, SpecifiedBox, "
"SpecifiedPointList.");
return NULL;
}
......@@ -1007,6 +1028,69 @@ StreamlineAttributes_GetUseWholeBox(PyObject *self, PyObject *args)
return retval;
}
/*static*/ PyObject *
StreamlineAttributes_SetPointList(PyObject *self, PyObject *args)
{
StreamlineAttributesObject *obj = (StreamlineAttributesObject *)self;
doubleVector &vec = obj->data->GetPointList();
PyObject *tuple;
if(!PyArg_ParseTuple(args, "O", &tuple))
return NULL;
if(PyTuple_Check(tuple))
{
vec.resize(PyTuple_Size(tuple));
for(int i = 0; i < PyTuple_Size(tuple); ++i)
{
PyObject *item = PyTuple_GET_ITEM(tuple, i);
if(PyFloat_Check(item))
vec[i] = PyFloat_AS_DOUBLE(item);
else if(PyInt_Check(item))
vec[i] = double(PyInt_AS_LONG(item));
else if(PyLong_Check(item))
vec[i] = PyLong_AsDouble(item);
else
vec[i] = 0.;
}
}
else if(PyFloat_Check(tuple))
{
vec.resize(1);
vec[0] = PyFloat_AS_DOUBLE(tuple);
}
else if(PyInt_Check(tuple))
{
vec.resize(1);
vec[0] = double(PyInt_AS_LONG(tuple));
}
else if(PyLong_Check(tuple))
{
vec.resize(1);
vec[0] = PyLong_AsDouble(tuple);
}
else
return NULL;
// Mark the pointList in the object as modified.
obj->data->SelectPointList();
Py_INCREF(Py_None);
return Py_None;
}
/*static*/ PyObject *
StreamlineAttributes_GetPointList(PyObject *self, PyObject *args)
{
StreamlineAttributesObject *obj = (StreamlineAttributesObject *)self;
// Allocate a tuple the with enough entries to hold the pointList.
const doubleVector &pointList = obj->data->GetPointList();
PyObject *retval = PyTuple_New(pointList.size());
for(size_t i = 0; i < pointList.size(); ++i)
PyTuple_SET_ITEM(retval, i, PyFloat_FromDouble(pointList[i]));
return retval;
}
/*static*/ PyObject *
StreamlineAttributes_SetPointDensity(PyObject *self, PyObject *args)
{
......@@ -1627,6 +1711,8 @@ static struct PyMethodDef StreamlineAttributes_methods[] = {
{"GetBoxExtents", StreamlineAttributes_GetBoxExtents, METH_VARARGS},
{"SetUseWholeBox", StreamlineAttributes_SetUseWholeBox, METH_VARARGS},
{"GetUseWholeBox", StreamlineAttributes_GetUseWholeBox, METH_VARARGS},
{"SetPointList", StreamlineAttributes_SetPointList, METH_VARARGS},
{"GetPointList", StreamlineAttributes_GetPointList, METH_VARARGS},
{"SetPointDensity", StreamlineAttributes_SetPointDensity, METH_VARARGS},
{"GetPointDensity", StreamlineAttributes_GetPointDensity, METH_VARARGS},
{"SetDisplayMethod", StreamlineAttributes_SetDisplayMethod, METH_VARARGS},
......@@ -1707,6 +1793,8 @@ StreamlineAttributes_getattr(PyObject *self, char *name)
return PyInt_FromLong(long(StreamlineAttributes::SpecifiedSphere));
if(strcmp(name, "SpecifiedBox") == 0)
return PyInt_FromLong(long(StreamlineAttributes::SpecifiedBox));
if(strcmp(name, "SpecifiedPointList") == 0)
return PyInt_FromLong(long(StreamlineAttributes::SpecifiedPointList));
if(strcmp(name, "maxStepLength") == 0)
return StreamlineAttributes_GetMaxStepLength(self, NULL);
......@@ -1734,6 +1822,8 @@ StreamlineAttributes_getattr(PyObject *self, char *name)
return StreamlineAttributes_GetBoxExtents(self, NULL);
if(strcmp(name, "useWholeBox") == 0)
return StreamlineAttributes_GetUseWholeBox(self, NULL);
if(strcmp(name, "pointList") == 0)
return StreamlineAttributes_GetPointList(self, NULL);
if(strcmp(name, "pointDensity") == 0)
return StreamlineAttributes_GetPointDensity(self, NULL);
if(strcmp(name, "displayMethod") == 0)
......@@ -1862,6 +1952,8 @@ StreamlineAttributes_setattr(PyObject *self, char *name, PyObject *args)
obj = StreamlineAttributes_SetBoxExtents(self, tuple);
else if(strcmp(name, "useWholeBox") == 0)
obj = StreamlineAttributes_SetUseWholeBox(self, tuple);
else if(strcmp(name, "pointList") == 0)
obj = StreamlineAttributes_SetPointList(self, tuple);
else if(strcmp(name, "pointDensity") == 0)
obj = StreamlineAttributes_SetPointDensity(self, tuple);
else if(strcmp(name, "displayMethod") == 0)
......
......@@ -156,6 +156,9 @@ QvisStreamlinePlotWindow::~QvisStreamlinePlotWindow()
// Dave Pugmire, Tue Mar 10 12:41:11 EDT 2009
// Add pathline GUI.
//
// Hank Childs, Sat May 2 22:14:38 PDT 2009
// Add support for point lists.
//
// ****************************************************************************
void
......@@ -216,11 +219,12 @@ QvisStreamlinePlotWindow::CreateWindowContents()
// Create the source type combo box.
hLayout->addWidget(new QLabel(tr("Source type"), topPageSource), 0,0);
sourceType = new QComboBox(topPageSource);
sourceType->addItem(tr("Point"));
sourceType->addItem(tr("Single Point"));
sourceType->addItem(tr("Line"));
sourceType->addItem(tr("Plane"));
sourceType->addItem(tr("Sphere"));
sourceType->addItem(tr("Box"));
sourceType->addItem(tr("Point List"));
connect(sourceType, SIGNAL(activated(int)),
this, SLOT(sourceTypeChanged(int)));
hLayout->addWidget(sourceType, 0,1);
......@@ -352,6 +356,15 @@ QvisStreamlinePlotWindow::CreateWindowContents()
sLayout->addWidget(boxExtentsLabel[2], 15, 0);
sLayout->addWidget(boxExtents[2], 15, 1);
// Create the widgets that specify a point list.
pointList = new QLineEdit(pageSource);
connect(pointList, SIGNAL(returnPressed()),
this, SLOT(pointListProcessText()));
pointListLabel = new QLabel(tr("Format as \"X1 Y1 Z1 X2 Y2 Z2 ...\". For 2D, use 0 for Z."), pageSource);
pointListLabel->setBuddy(pointList);
sLayout->addWidget(pointListLabel,16,0);
sLayout->addWidget(pointList, 17,0);
//
// Create appearance-related widgets.
//
......@@ -682,6 +695,9 @@ QvisStreamlinePlotWindow::UpdateWindow(bool doAll)
temp.setNum(streamAtts->GetSphereRadius());
sphereRadius->setText(temp);
break;
case StreamlineAttributes::ID_pointList:
pointList->setText(DoublesToQString(streamAtts->GetPointList()));
break;
case StreamlineAttributes::ID_boxExtents:
boxExtents[0]->setText(DoublesToQString(streamAtts->GetBoxExtents(),2));
boxExtents[1]->setText(DoublesToQString(streamAtts->GetBoxExtents()+2,2));
......@@ -853,6 +869,9 @@ QvisStreamlinePlotWindow::UpdateWindow(bool doAll)
// Hide/show useWholeBox. Also enable/disable pointDensity if source type
// is point.
//
// Hank Childs, Sat May 2 22:05:56 PDT 2009
// Add support for point lists.
//
// ****************************************************************************
void
......@@ -863,6 +882,7 @@ QvisStreamlinePlotWindow::UpdateSourceAttributes()
bool usePlane = streamAtts->GetSourceType() == StreamlineAttributes::SpecifiedPlane;
bool useSphere = streamAtts->GetSourceType() == StreamlineAttributes::SpecifiedSphere;
bool useBox = streamAtts->GetSourceType() == StreamlineAttributes::SpecifiedBox;
bool usePointList = streamAtts->GetSourceType() == StreamlineAttributes::SpecifiedPointList;
//
// Update the point widgets.
......@@ -874,13 +894,11 @@ QvisStreamlinePlotWindow::UpdateSourceAttributes()
sourceAtts->setTitle(tr("Point"));
pointSource->show();
pointSourceLabel->show();
pointDensity->setEnabled(false);
}
else
{
pointSource->hide();
pointSourceLabel->hide();
pointDensity->setEnabled(true);
}
//
......@@ -994,6 +1012,28 @@ QvisStreamlinePlotWindow::UpdateSourceAttributes()
boxExtentsLabel[i]->hide();
}
}
//
// Update the point list widgets.
//
pointList->setEnabled(usePointList);
pointListLabel->setEnabled(usePointList);
if(usePointList)
{
sourceAtts->setTitle(tr("Point List"));
pointList->show();
pointListLabel->show();
}
else
{
pointList->hide();
pointListLabel->hide();
}
if (usePoint || usePointList)
pointDensity->setEnabled(false);
else
pointDensity->setEnabled(true);
}
// ****************************************************************************
......@@ -1371,6 +1411,35 @@ QvisStreamlinePlotWindow::GetCurrentValues(int which_widget)
streamAtts->SetBoxExtents(d);
}
// Do pointList
if(which_widget == StreamlineAttributes::ID_pointList || doAll)
{
double d[3];
bool allOkay = true;
std::vector<double> pointListV;
if(!LineEditGetDoubles(pointList, pointListV))
allOkay = false;
bool multipleOf3Error = false;
if ((pointListV.size() % 3) != 0)
{
allOkay = false;
multipleOf3Error = true;
}
if(!allOkay)
{
if (multipleOf3Error)
Message(tr("The number of values in the point list was not a multiple"
" of three, so the previous values will be used."));
else
Message(tr("The point list contained errors so the previous "
"values will be used."));
streamAtts->SelectPointList();
}
else
streamAtts->SetPointList(pointListV);
}
// pointDensity
if (which_widget == StreamlineAttributes::ID_pointDensity|| doAll)
{
......@@ -1593,6 +1662,13 @@ QvisStreamlinePlotWindow::lineEndProcessText()
Apply();
}
void
QvisStreamlinePlotWindow::pointListProcessText()
{
GetCurrentValues(StreamlineAttributes::ID_pointList);
Apply();
}
void
QvisStreamlinePlotWindow::planeOriginProcessText()
{
......
......@@ -93,6 +93,9 @@ class StreamlineAttributes;
// Dave Pugmire, Tue Mar 10 12:41:11 EDT 2009
// Add pathline GUI.
//
// Hank Childs, Sat May 2 22:10:26 PDT 2009
// Added option for specifying seed points as a point list.
//
// ****************************************************************************
class QvisStreamlinePlotWindow : public QvisPostableWindowObserver
......@@ -133,6 +136,7 @@ class QvisStreamlinePlotWindow : public QvisPostableWindowObserver
void pointSourceProcessText();
void lineStartProcessText();
void lineEndProcessText();
void pointListProcessText();
void planeOriginProcessText();
void planeNormalProcessText();
void planeUpAxisProcessText();
......@@ -173,6 +177,8 @@ class QvisStreamlinePlotWindow : public QvisPostableWindowObserver
QLabel *lineStartLabel;
QLineEdit *lineEnd;
QLabel *lineEndLabel;
QLineEdit *pointList;
QLabel *pointListLabel;
QLineEdit *planeOrigin;
QLabel *planeOriginLabel;
QLineEdit *planeNormal;
......
......@@ -180,6 +180,9 @@ Definition:
// Hank Childs, Sat Mar 3 09:00:12 PST 2007
// Add support for useWholeBox.
//
// Hank Childs, Sun May 3 11:49:31 CDT 2009
// Add support for point lists.
//
// ****************************************************************************
#define PDIF(p1,p2,i) ((p1)[i] != (p2)[i])
......@@ -213,6 +216,18 @@ StreamlineAttributes::ChangesRequireRecalculation(const StreamlineAttributes &ob
(POINT_DIFFERS(sphereOrigin, obj.sphereOrigin) ||
(sphereRadius != obj.sphereRadius)));
bool sourcePointListDiffers = (sourceType == SpecifiedPointList);
if (sourcePointListDiffers)
{
sourcePointListDiffers = false;
if (pointList.size() != obj.pointList.size())
sourcePointListDiffers = true;
else
for (int i = 0 ; i < pointList.size() ; i++)
if (pointList[i] != obj.pointList[i])
sourcePointListDiffers = true;
}
// If we're in box source mode and the box differs, boxDiffers
// evaluates to true.
bool boxSourceDiffers = (sourceType == SpecifiedBox) &&
......@@ -246,6 +261,7 @@ StreamlineAttributes::ChangesRequireRecalculation(const StreamlineAttributes &ob
sourceLineDiffers ||
sourcePlaneDiffers ||
sourceSphereDiffers ||
sourcePointListDiffers ||
boxSourceDiffers ||
densityMatters ||
radiusMatters;
......
......@@ -11,6 +11,7 @@
SpecifiedPlane
SpecifiedSphere
SpecifiedBox
SpecifiedPointList
</Enum>
<Enum name="ColoringMethod">
Solid
......@@ -105,7 +106,18 @@
<Field name="useWholeBox" label="Use Whole Box" type="bool" enabler="sourceType:SpecifiedBox">
true
</Field>
<Field name="pointDensity" label="Point density" type="int" enabler="sourceType:SpecifiedLine,SpecifiedPlane">
<Field name="pointList" label="List of Points" type="doubleVector" enabler="sourceType:SpecifiedPointList">
0.000000
0.000000
0.000000
1.000000
0.000000
0.000000
0.000000
1.000000
0.000000
</Field>
<Field name="pointDensity" label="Point density" type="int" enabler="sourceType:SpecifiedLine,SpecifiedPlane,SpecifiedSphere,SpecifiedBox">
2
</Field>
<Field name="displayMethod" label="Display method" type="enum" subtype="DisplayMethod">
......
......@@ -51,20 +51,21 @@
static const char *SourceType_strings[] = {
"SpecifiedPoint", "SpecifiedLine", "SpecifiedPlane",
"SpecifiedSphere", "SpecifiedBox"};
"SpecifiedSphere", "SpecifiedBox", "SpecifiedPointList"
};
std::string
StreamlineAttributes::SourceType_ToString(StreamlineAttributes::SourceType t)
{
int index = int(t);
if(index < 0 || index >= 5) index = 0;
if(index < 0 || index >= 6) index = 0;
return SourceType_strings[index];
}
std::string
StreamlineAttributes::SourceType_ToString(int t)
{
int index = (t < 0 || t >= 5) ? 0 : t;
int index = (t < 0 || t >= 6) ? 0 : t;
return SourceType_strings[index];
}
......@@ -72,7 +73,7 @@ bool
StreamlineAttributes::SourceType_FromString(const std::string &s, StreamlineAttributes::SourceType &val)
{
val = StreamlineAttributes::SpecifiedPoint;
for(int i = 0; i < 5; ++i)
for(int i = 0; i < 6; ++i)
{
if(s == SourceType_strings[i])
{
......@@ -312,7 +313,7 @@ StreamlineAttributes::IntegrationType_FromString(const std::string &s, Streamlin
}
// Type map format string
const char *StreamlineAttributes::TypeMapFormatString = "iddDDDDDDdDdDbiibdiisabbiddiiiiiib";
const char *StreamlineAttributes::TypeMapFormatString = "iddDDDDDDdDdDbd*iibdiisabbiddiiiiiib";
// ****************************************************************************
// Method: StreamlineAttributes::StreamlineAttributes
......@@ -366,6 +367,15 @@ StreamlineAttributes::StreamlineAttributes() :
boxExtents[4] = 0;
boxExtents[5] = 1;
useWholeBox = true;
pointList.push_back(0);
pointList.push_back(0);
pointList.push_back(0);
pointList.push_back(1);
pointList.push_back(0);
pointList.push_back(0);
pointList.push_back(0);
pointList.push_back(1);
pointList.push_back(0);
pointDensity = 2;
displayMethod = Lines;
showStart = false;
......@@ -442,6 +452,7 @@ StreamlineAttributes::StreamlineAttributes(const StreamlineAttributes &obj) :
boxExtents[i] = obj.boxExtents[i];
useWholeBox = obj.useWholeBox;
pointList = obj.pointList;
pointDensity = obj.pointDensity;
displayMethod = obj.displayMethod;
showStart = obj.showStart;
......@@ -543,6 +554,7 @@ StreamlineAttributes::operator = (const StreamlineAttributes &obj)
boxExtents[i] = obj.boxExtents[i];
useWholeBox = obj.useWholeBox;
pointList = obj.pointList;
pointDensity = obj.pointDensity;
displayMethod = obj.displayMethod;
showStart = obj.showStart;
......@@ -641,6 +653,7 @@ StreamlineAttributes::operator == (const StreamlineAttributes &obj) const
(sphereRadius == obj.sphereRadius) &&
boxExtents_equal &&
(useWholeBox == obj.useWholeBox) &&
(pointList == obj.pointList) &&
(pointDensity == obj.pointDensity) &&
(displayMethod == obj.displayMethod) &&
(showStart == obj.showStart) &&
......@@ -917,6 +930,7 @@ StreamlineAttributes::SelectAll()
Select(ID_sphereRadius, (void *)&sphereRadius);
Select(ID_boxExtents, (void *)boxExtents, 6);
Select(ID_useWholeBox, (void *)&useWholeBox);
Select(ID_pointList, (void *)&pointList);
Select(ID_pointDensity, (void *)&pointDensity);
Select(ID_displayMethod, (void *)&displayMethod);
Select(ID_showStart, (void *)&showStart);
......@@ -1053,6 +1067,12 @@ StreamlineAttributes::CreateNode(DataNode *parentNode, bool completeSave, bool f
node->AddNode(new DataNode("useWholeBox", useWholeBox));
}
if(completeSave || !FieldsEqual(ID_pointList, &defaultObject))
{
addToParent = true;
node->AddNode(new DataNode("pointList", pointList));
}
if(completeSave || !FieldsEqual(ID_pointDensity, &defaultObject))
{
addToParent = true;
......@@ -1217,7 +1237,7 @@ StreamlineAttributes::SetFromNode(DataNode *parentNode)
if(node->GetNodeType() == INT_NODE)
{
int ival = node->AsInt();
if(ival >= 0 && ival < 5)
if(ival >= 0 && ival < 6)
SetSourceType(SourceType(ival));
}
else if(node->GetNodeType() == STRING_NODE)
......@@ -1253,6 +1273,8 @@ StreamlineAttributes::SetFromNode(DataNode *parentNode)
SetBoxExtents(node->AsDoubleArray());
if((node = searchNode->GetNode("useWholeBox")) != 0)
SetUseWholeBox(node->AsBool());
if((node = searchNode->GetNode("pointList")) != 0)
SetPointList(node->AsDoubleVector());
if((node = searchNode->GetNode("pointDensity")) != 0)
SetPointDensity(node->AsInt());
if((node = searchNode->GetNode("displayMethod")) != 0)
......@@ -1496,6 +1518,13 @@ StreamlineAttributes::SetUseWholeBox(bool useWholeBox_)
Select(ID_useWholeBox, (void *)&useWholeBox);
}
void
StreamlineAttributes::SetPointList(const doubleVector &pointList_)
{
pointList = pointList_;
Select(ID_pointList, (void *)&pointList);
}
void
StreamlineAttributes::SetPointDensity(int pointDensity_)
{
......@@ -1772,6 +1801,18 @@ StreamlineAttributes::GetUseWholeBox() const
return useWholeBox;
}
const doubleVector &
StreamlineAttributes::GetPointList() const
{
return pointList;
}
doubleVector &
StreamlineAttributes::GetPointList()
{
return pointList;
}
int
StreamlineAttributes::GetPointDensity() const
{
......@@ -1956,6 +1997,12 @@ StreamlineAttributes::SelectBoxExtents()
Select(ID_boxExtents, (void *)boxExtents, 6);
}
void
StreamlineAttributes::SelectPointList()
{
Select(ID_pointList, (void *)&pointList);
}
void
StreamlineAttributes::SelectColorTableName()
{
......@@ -2006,6 +2053,7 @@ StreamlineAttributes::GetFieldName(int index) const
case ID_sphereRadius: return "sphereRadius";
case ID_boxExtents: return "boxExtents";
case ID_useWholeBox: return "useWholeBox";
case ID_pointList: return "pointList";
case ID_pointDensity: return "pointDensity";
case ID_displayMethod: return "displayMethod";
case ID_showStart: return "showStart";
......@@ -2064,6 +2112,7 @@ StreamlineAttributes::GetFieldType(int index) const
case ID_sphereRadius: return FieldType_double;
case ID_boxExtents: return FieldType_doubleArray;
case ID_useWholeBox: return FieldType_bool;
case ID_pointList: return FieldType_doubleVector;
case ID_pointDensity: return FieldType_int;
case ID_displayMethod: return FieldType_enum;
case ID_showStart: return FieldType_bool;
......@@ -2122,6 +2171,7 @@ StreamlineAttributes::GetFieldTypeName(int index) const
case ID_sphereRadius: return "double";
case ID_boxExtents: return "doubleArray";
case ID_useWholeBox: return "bool";
case ID_pointList: return "doubleVector";
case ID_pointDensity: return "int";
case ID_displayMethod: return "enum";
case ID_showStart: return "bool";
......@@ -2278,6 +2328,11 @@ StreamlineAttributes::FieldsEqual(int index_, const AttributeGroup *rhs) const
retval = (useWholeBox == obj.useWholeBox);
}
break;
case ID_pointList:
{ // new scope
retval = (