Commit f52e2ffa authored by js9's avatar js9

Adding correct support for array variables in parallel coordinates plot.

Added support for varying horizontal positions of array vars axes.
Extending support for high-dimensional extents.
Added support for disabling snap-to-horizontal-grid to axis array navigate.



git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@3175 18c085ea-50e0-402c-830e-de6fd14e8384
parent e037718e
......@@ -78,7 +78,7 @@ InteractorAttributes::NavigationMode_FromString(const std::string &s, Interactor
}
// Type map format string
const char *InteractorAttributes::TypeMapFormatString = "bbbi";
const char *InteractorAttributes::TypeMapFormatString = "bbbib";
// ****************************************************************************
// Method: InteractorAttributes::InteractorAttributes
......@@ -89,7 +89,7 @@ const char *InteractorAttributes::TypeMapFormatString = "bbbi";
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -102,6 +102,7 @@ InteractorAttributes::InteractorAttributes() :
clampSquare = false;
fillViewportOnZoom = true;
navigationMode = Trackball;
axisArraySnap = true;
}
// ****************************************************************************
......@@ -113,7 +114,7 @@ InteractorAttributes::InteractorAttributes() :
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -126,6 +127,7 @@ InteractorAttributes::InteractorAttributes(const InteractorAttributes &obj) :
clampSquare = obj.clampSquare;
fillViewportOnZoom = obj.fillViewportOnZoom;
navigationMode = obj.navigationMode;
axisArraySnap = obj.axisArraySnap;
SelectAll();
}
......@@ -139,7 +141,7 @@ InteractorAttributes::InteractorAttributes(const InteractorAttributes &obj) :
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -159,7 +161,7 @@ InteractorAttributes::~InteractorAttributes()
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -173,6 +175,7 @@ InteractorAttributes::operator = (const InteractorAttributes &obj)
clampSquare = obj.clampSquare;
fillViewportOnZoom = obj.fillViewportOnZoom;
navigationMode = obj.navigationMode;
axisArraySnap = obj.axisArraySnap;
SelectAll();
return *this;
......@@ -187,7 +190,7 @@ InteractorAttributes::operator = (const InteractorAttributes &obj)
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -200,7 +203,8 @@ InteractorAttributes::operator == (const InteractorAttributes &obj) const
return ((showGuidelines == obj.showGuidelines) &&
(clampSquare == obj.clampSquare) &&
(fillViewportOnZoom == obj.fillViewportOnZoom) &&
(navigationMode == obj.navigationMode));
(navigationMode == obj.navigationMode) &&
(axisArraySnap == obj.axisArraySnap));
}
// ****************************************************************************
......@@ -212,7 +216,7 @@ InteractorAttributes::operator == (const InteractorAttributes &obj) const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -233,7 +237,7 @@ InteractorAttributes::operator != (const InteractorAttributes &obj) const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -254,7 +258,7 @@ InteractorAttributes::TypeName() const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -282,7 +286,7 @@ InteractorAttributes::CopyAttributes(const AttributeGroup *atts)
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -308,7 +312,7 @@ InteractorAttributes::CreateCompatible(const std::string &tname) const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -335,7 +339,7 @@ InteractorAttributes::NewInstance(bool copy) const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -348,6 +352,7 @@ InteractorAttributes::SelectAll()
Select(ID_clampSquare, (void *)&clampSquare);
Select(ID_fillViewportOnZoom, (void *)&fillViewportOnZoom);
Select(ID_navigationMode, (void *)&navigationMode);
Select(ID_axisArraySnap, (void *)&axisArraySnap);
}
///////////////////////////////////////////////////////////////////////////////
......@@ -363,7 +368,7 @@ InteractorAttributes::SelectAll()
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -404,6 +409,12 @@ InteractorAttributes::CreateNode(DataNode *parentNode, bool completeSave, bool f
node->AddNode(new DataNode("navigationMode", NavigationMode_ToString(navigationMode)));
}
if(completeSave || !FieldsEqual(ID_axisArraySnap, &defaultObject))
{
addToParent = true;
node->AddNode(new DataNode("axisArraySnap", axisArraySnap));
}
// Add the node to the parent node.
if(addToParent || forceAdd)
......@@ -423,7 +434,7 @@ InteractorAttributes::CreateNode(DataNode *parentNode, bool completeSave, bool f
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -463,6 +474,8 @@ InteractorAttributes::SetFromNode(DataNode *parentNode)
SetNavigationMode(value);
}
}
if((node = searchNode->GetNode("axisArraySnap")) != 0)
SetAxisArraySnap(node->AsBool());
}
///////////////////////////////////////////////////////////////////////////////
......@@ -497,6 +510,13 @@ InteractorAttributes::SetNavigationMode(InteractorAttributes::NavigationMode nav
Select(ID_navigationMode, (void *)&navigationMode);
}
void
InteractorAttributes::SetAxisArraySnap(bool axisArraySnap_)
{
axisArraySnap = axisArraySnap_;
Select(ID_axisArraySnap, (void *)&axisArraySnap);
}
///////////////////////////////////////////////////////////////////////////////
// Get property methods
///////////////////////////////////////////////////////////////////////////////
......@@ -525,6 +545,12 @@ InteractorAttributes::GetNavigationMode() const
return NavigationMode(navigationMode);
}
bool
InteractorAttributes::GetAxisArraySnap() const
{
return axisArraySnap;
}
///////////////////////////////////////////////////////////////////////////////
// Keyframing methods
///////////////////////////////////////////////////////////////////////////////
......@@ -538,7 +564,7 @@ InteractorAttributes::GetNavigationMode() const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -553,6 +579,7 @@ InteractorAttributes::GetFieldName(int index) const
case ID_clampSquare: return "clampSquare";
case ID_fillViewportOnZoom: return "fillViewportOnZoom";
case ID_navigationMode: return "navigationMode";
case ID_axisArraySnap: return "axisArraySnap";
default: return "invalid index";
}
}
......@@ -566,7 +593,7 @@ InteractorAttributes::GetFieldName(int index) const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -581,6 +608,7 @@ InteractorAttributes::GetFieldType(int index) const
case ID_clampSquare: return FieldType_bool;
case ID_fillViewportOnZoom: return FieldType_bool;
case ID_navigationMode: return FieldType_enum;
case ID_axisArraySnap: return FieldType_bool;
default: return FieldType_unknown;
}
}
......@@ -594,7 +622,7 @@ InteractorAttributes::GetFieldType(int index) const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -609,6 +637,7 @@ InteractorAttributes::GetFieldTypeName(int index) const
case ID_clampSquare: return "bool";
case ID_fillViewportOnZoom: return "bool";
case ID_navigationMode: return "enum";
case ID_axisArraySnap: return "bool";
default: return "invalid index";
}
}
......@@ -622,7 +651,7 @@ InteractorAttributes::GetFieldTypeName(int index) const
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -655,6 +684,11 @@ InteractorAttributes::FieldsEqual(int index_, const AttributeGroup *rhs) const
retval = (navigationMode == obj.navigationMode);
}
break;
case ID_axisArraySnap:
{ // new scope
retval = (axisArraySnap == obj.axisArraySnap);
}
break;
default: retval = false;
}
......
......@@ -51,7 +51,7 @@
// Notes: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: Thu Dec 20 09:40:38 PDT 2007
// Creation: Thu Feb 7 17:28:24 PST 2008
//
// Modifications:
//
......@@ -88,12 +88,14 @@ public:
void SetClampSquare(bool clampSquare_);
void SetFillViewportOnZoom(bool fillViewportOnZoom_);
void SetNavigationMode(NavigationMode navigationMode_);
void SetAxisArraySnap(bool axisArraySnap_);
// Property getting methods
bool GetShowGuidelines() const;
bool GetClampSquare() const;
bool GetFillViewportOnZoom() const;
NavigationMode GetNavigationMode() const;
bool GetAxisArraySnap() const;
// Persistence methods
virtual bool CreateNode(DataNode *node, bool completeSave, bool forceAdd);
......@@ -118,7 +120,8 @@ public:
ID_showGuidelines = 0,
ID_clampSquare,
ID_fillViewportOnZoom,
ID_navigationMode
ID_navigationMode,
ID_axisArraySnap
};
private:
......@@ -126,6 +129,7 @@ private:
bool clampSquare;
bool fillViewportOnZoom;
int navigationMode;
bool axisArraySnap;
// Static class format string for type map.
static const char *TypeMapFormatString;
......
......@@ -17,4 +17,7 @@
<Field name="navigationMode" label="navigationMode" type="enum" subtype="NavigationMode">
Trackball
</Field>
<Field name="axisArraySnap" label="axisArraySnap" type="bool">
true
</Field>
</Attribute>
......@@ -270,8 +270,11 @@ avtExpressionFilter::PostExecute(void)
//
// Modifications:
//
// Thomas R. Treadway, Fri Dec 1 14:03:54 PST 2006
// Added check for GhostNodes in addition to the GhostZones
// Thomas R. Treadway, Fri Dec 1 14:03:54 PST 2006
// Added check for GhostNodes in addition to the GhostZones
//
// Jeremy Meredith, Thu Feb 7 18:02:12 EST 2008
// Added support for updating the component extents of array variables.
//
// ****************************************************************************
......@@ -301,61 +304,84 @@ avtExpressionFilter::UpdateExtents(avtDataTree_p tree)
}
int nvars = dat->GetNumberOfComponents();
if (nvars <= 3 || nvars == 9)
double *compexts = new double[nvars*2];
for (int d=0; d<nvars; d++)
{
double exts[6];
unsigned char *ghosts = NULL;
if (isPoint)
compexts[d*2+0] = DBL_MAX;
compexts[d*2+1] = -DBL_MAX;
}
double exts[6];
unsigned char *ghosts = NULL;
if (isPoint)
{
vtkUnsignedCharArray *g = (vtkUnsignedCharArray *)
ds->GetPointData()->GetArray("avtGhostNodes");
if (g != NULL)
{
vtkUnsignedCharArray *g = (vtkUnsignedCharArray *)
ds->GetPointData()->GetArray("avtGhostNodes");
if (g != NULL)
{
ghosts = g->GetPointer(0);
}
ghosts = g->GetPointer(0);
}
else
}
else
{
vtkUnsignedCharArray *g = (vtkUnsignedCharArray *)
ds->GetCellData()->GetArray("avtGhostZones");
if (g != NULL)
{
vtkUnsignedCharArray *g = (vtkUnsignedCharArray *)
ds->GetCellData()->GetArray("avtGhostZones");
if (g != NULL)
{
ghosts = g->GetPointer(0);
}
ghosts = g->GetPointer(0);
}
int ntuples = dat->GetNumberOfTuples();
exts[0] = +FLT_MAX;
exts[1] = -FLT_MAX;
for (int i = 0 ; i < ntuples ; i++)
}
int ntuples = dat->GetNumberOfTuples();
exts[0] = +FLT_MAX;
exts[1] = -FLT_MAX;
for (int i = 0 ; i < ntuples ; i++)
{
if (ghosts != NULL && ghosts[i] > 0)
{
if (ghosts != NULL && ghosts[i] > 0)
{
continue;
}
double *val = dat->GetTuple(i);
double value = 0;
if (nvars == 1)
value = *val;
else if (nvars == 3)
value = val[0]*val[0] + val[1] * val[1] + val[2] *val[2];
else if (nvars == 9)
// This function is found in avtCommonDataFunctions.
value = MajorEigenvalue(val);
// else ... array variable
if (value < exts[0])
exts[0] = value;
if (value > exts[1])
exts[1] = value;
continue;
}
if (nvars == 3)
double *val = dat->GetTuple(i);
double value = 0;
if (nvars == 1)
value = *val;
else if (nvars == 3)
value = val[0]*val[0] + val[1] * val[1] + val[2] *val[2];
else if (nvars == 9)
// This function is found in avtCommonDataFunctions.
value = MajorEigenvalue(val);
// else ... we handle array variables below
if (value < exts[0])
exts[0] = value;
if (value > exts[1])
exts[1] = value;
// For array variables, update extents here
for (int d=0; d<nvars; d++)
{
exts[0] = sqrt(exts[0]);
exts[1] = sqrt(exts[1]);
if (val[d] < compexts[d*2+0])
compexts[d*2+0] = val[d];
if (val[d] > compexts[d*2+1])
compexts[d*2+1] = val[d];
}
GetOutput()->GetInfo().GetAttributes().
GetCumulativeTrueDataExtents(outputVariableName)->Merge(exts);
}
if (nvars == 3)
{
exts[0] = sqrt(exts[0]);
exts[1] = sqrt(exts[1]);
}
avtDataAttributes &outatts = GetOutput()->GetInfo().GetAttributes();
outatts.GetCumulativeTrueDataExtents(outputVariableName)->Merge(exts);
// Update component extents in array variables
if (outatts.GetVariableType(outputVariableName) == AVT_ARRAY_VAR)
{
outatts.GetVariableComponentExtents(outputVariableName)->
Merge(compexts);
}
delete[] compexts;
}
else if (nc > 0)
for (int i = 0 ; i < nc ; i++)
......
......@@ -208,6 +208,11 @@ avtArrayComposeFilter::ProcessArguments(ArgsExpr *args,
// Programmer: Hank Childs
// Creation: August 5, 2005
//
// Modifications:
// Jeremy Meredith, Thu Feb 7 18:01:29 EST 2008
// This wasn't setting the dimension of the output variable, which
// was necessary, so I added it.
//
// ****************************************************************************
void
......@@ -225,6 +230,7 @@ avtArrayComposeFilter::RefashionDataObjectInfo(void)
subnames[i] = varnames[i];
avtDataAttributes &outAtts = GetOutput()->GetInfo().GetAttributes();
outAtts.SetVariableDimension(varnames.size(), outputVariableName);
outAtts.SetVariableSubnames(subnames, outputVariableName);
}
......@@ -256,6 +256,11 @@ avtArrayComposeWithBinsFilter::ProcessArguments(ArgsExpr *args,
// Programmer: Hank Childs
// Creation: January 12, 2007
//
// Modifications:
// Jeremy Meredith, Thu Feb 7 18:01:29 EST 2008
// This wasn't setting the dimension of the output variable, which
// was necessary, so I added it.
//
// ****************************************************************************
void
......@@ -273,6 +278,7 @@ avtArrayComposeWithBinsFilter::RefashionDataObjectInfo(void)
subnames[i] = varnames[i];
avtDataAttributes &outAtts = GetOutput()->GetInfo().GetAttributes();
outAtts.SetVariableDimension(varnames.size(), outputVariableName);
outAtts.SetVariableSubnames(subnames, outputVariableName);
outAtts.SetVariableBinRanges(binRanges, outputVariableName);
}
......
......@@ -1335,6 +1335,149 @@ GetDataScalarRange(vtkDataSet *ds, double *exts, const char *vname,
}
// ****************************************************************************
// Function: GetDataScalarRange
//
// Purpose:
// Gets the full individual component ranges from a VTK dataset
//
// Arguments:
// ds The dataset to determine the range for.
// exts The extents in <min, max> form. There may be many 3 sets of
// extents for vector data.
// vname The variable name to get the range for.
// ignoreGhost A Boolean. True if we should ignore ghosts, else false.
//
// Returns: true if it found real data, false otherwise.
//
// Programmer: Jeremy Meredith
// Creation: February 7, 2008
//
// Modifications:
//
// ****************************************************************************
template <class T> static bool
GetComponentRange(T *buf, int n, int c, int nc, double *exts, unsigned char *ghosts)
{
T min;
T max;
bool setOne = false;
buf += c;
for (int i = c; i < n*nc; i+=nc, buf+=nc)
{
if ((ghosts != NULL) && (ghosts[i] != '\0'))
continue;
if (!setOne)
{
min = *buf;
max = *buf;
setOne = true;
continue;
}
if (*buf < min)
{
min = *buf;
}
else
{
if (*buf > max)
max = *buf;
}
}
exts[0] = (double) min;
exts[1] = (double) max;
return setOne;
}
void
GetDataAllComponentsRange(vtkDataSet *ds, double *exts, const char *vname,
bool ignoreGhost)
{
vtkDataArray *da = NULL;
unsigned char *ghosts = NULL;
if (ds->GetPointData()->GetArray(vname))
{
da = ds->GetPointData()->GetArray(vname);
}
else
{
da = ds->GetCellData()->GetArray(vname);
if (ignoreGhost)
{
vtkUnsignedCharArray *ga = (vtkUnsignedCharArray *)
ds->GetCellData()->GetArray("avtGhostZones");
if (ga != NULL)
ghosts = ga->GetPointer(0);
}
}
if (da == NULL)
return;
int ntuples = da->GetNumberOfTuples();
int ncomps = da->GetNumberOfComponents();
for (int comp=0; comp<ncomps; comp++)
{
double *compexts = &(exts[2*comp]);
compexts[0] = +FLT_MAX;
compexts[1] = -FLT_MAX;
switch (da->GetDataType())
{
case VTK_CHAR:
GetComponentRange((char*) da->GetVoidPointer(0), ntuples,
comp, ncomps, compexts, ghosts);
break;
case VTK_UNSIGNED_CHAR:
GetComponentRange((unsigned char*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_SHORT:
GetComponentRange((short*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_UNSIGNED_SHORT:
GetComponentRange((unsigned short*) da->GetVoidPointer(0),
ntuples, comp, ncomps,compexts, ghosts);
break;
case VTK_INT:
GetComponentRange((int*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_UNSIGNED_INT:
GetComponentRange((unsigned int*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_LONG:
GetComponentRange((long*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_UNSIGNED_LONG:
GetComponentRange((unsigned long*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_FLOAT:
GetComponentRange((float*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_DOUBLE:
GetComponentRange((double*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
case VTK_ID_TYPE:
GetComponentRange((vtkIdType*) da->GetVoidPointer(0),
ntuples, comp, ncomps, compexts, ghosts);
break;
}
}
}
// ****************************************************************************
// Function: GetDataMagnitudeRange
//
......
......@@ -116,6 +116,9 @@ class vtkDataArray;
// Hank Childs, Sun Jan 13 14:36:38 PST 2008
// Added CExpandSingletonConstants.
//
// Jeremy Meredith, Thu Feb 7 17:54:34 EST 2008
// Added GetDataAllComponentsRange.
//
// ****************************************************************************
//
......@@ -155,6 +158,9 @@ PIPELINE_API void CInsertRectilinearTransformInfoIntoDataset(
PIPELINE_API void GetDataRange(vtkDataSet *, double *, const char *,
bool ignoreGhost = false);
PIPELINE_API void GetDataAllComponentsRange(vtkDataSet *, double *,
const char *,
bool ignoreGhost = false);
PIPELINE_API double MajorEigenvalue(float *);
PIPELINE_API double MajorEigenvalue(double *);
......
......@@ -283,6 +283,9 @@ avtDataAttributes::~avtDataAttributes()
// Kathleen Bonnell, Tue Jun 20 16:02:38 PDT 2006
// Added plotInfoAtts.
//
// Jeremy Meredith, Thu Feb 7 17:52:59 EST 2008
// Added component extents for array variables.
//
// ****************************************************************************
void
......@@ -342,6 +345,11 @@ avtDataAttributes::DestructSelf(void)
delete variables[i].cumulativeCurrentData;
variables[i].cumulativeCurrentData = NULL;
}
if (variables[i].componentExtents != NULL)
{
delete variables[i].componentExtents;
variables[i].componentExtents = NULL;
}
}
variables.clear();
......@@ -446,6 +454,9 @@ avtDataAttributes::DestructSelf(void)
// Added new axis array window mode.
// Added ability for variables to be associated with an axis.
//
// Jeremy Meredith, Thu Feb 7 17:52:59 EST 2008
// Added component extents for array variables.
//
// ****************************************************************************
void
......@@ -699,6 +710,11 @@ avtDataAttributes::Print(ostream &out)
out << "Cumulative current data = " << endl;
variables[i].cumulativeCurrentData->Print(out);
}
if (variables[i].componentExtents != NULL)
{
out << "Component extents = " << endl;
variables[i].componentExtents->Print(out);