Commit 8b7e9f71 authored by hrchilds's avatar hrchilds
Browse files

Refactor DeferExpression so it is easier for other filters to re-use its logic.

Add three new operators that generate expressions on the fly.


git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@12611 18c085ea-50e0-402c-830e-de6fd14e8384
parent 6ec74e86
......@@ -51,6 +51,9 @@
# Hank Childs, Sat Aug 21 14:05:14 PDT 2010
# Rename ApplyDDFExpression to ApplyDataBinningExpression.
#
# Hank Childs, Thu Sep 23 16:00:56 PDT 2010
# Added avtDeferExpressionBaseFilter.
#
#****************************************************************************/
SET(ABSTRACT_SOURCES
......@@ -175,6 +178,7 @@ ImageProcessing/avtMedianFilterExpression.C
SET(MANAGEMENT_SOURCES
Management/avtConstantCreatorExpression.C
Management/avtDeferExpressionBaseFilter.C
Management/avtExecuteThenTimeLoopFilter.C
Management/avtExpressionEvaluatorFilter.C
Management/avtExprNode.C
......
/*****************************************************************************
*
* Copyright (c) 2000 - 2010, Lawrence Livermore National Security, LLC
* Produced at the Lawrence Livermore National Laboratory
* LLNL-CODE-442911
* All rights reserved.
*
* This file is part of VisIt. For details, see https://visit.llnl.gov/. The
* full copyright notice is contained in the file COPYRIGHT located at the root
* of the VisIt distribution or at http://www.llnl.gov/visit/copyright.html.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the disclaimer (as noted below) in the
* documentation and/or other materials provided with the distribution.
* - Neither the name of the LLNS/LLNL nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY,
* LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
*****************************************************************************/
// ************************************************************************* //
// File: avtDeferExpressionBaseFilter.C
// ************************************************************************* //
#include <avtDeferExpressionBaseFilter.h>
#include <ExpressionList.h>
#include <ParsingExprList.h>
#include <InvalidVariableException.h>
// ****************************************************************************
// Method: avtDeferExpressionBaseFilter constructor
//
// Programmer: childs -- generated by xml2avt
// Creation: Thu Sep 1 06:35:41 PDT 2005
//
// ****************************************************************************
avtDeferExpressionBaseFilter::avtDeferExpressionBaseFilter()
{
}
// ****************************************************************************
// Method: avtDeferExpressionBaseFilter destructor
//
// Programmer: childs -- generated by xml2avt
// Creation: Thu Sep 1 06:35:41 PDT 2005
//
// Modifications:
//
// ****************************************************************************
avtDeferExpressionBaseFilter::~avtDeferExpressionBaseFilter()
{
}
// ****************************************************************************
// Method: avtDeferExpressionBaseListFilter::SetupExpressionList
//
// Purpose:
// Sets up the expression list of what this filter should modify.
//
// Programmer: Hank Childs
// Creation: September 23, 2010
//
// ****************************************************************************
void
avtDeferExpressionBaseFilter::SetupExpressionList(void)
{
int i, j, k;
std::vector<std::string> varsToEvaluate;
GetVariablesToEvaluate(varsToEvaluate);
std::vector<Expression> customExpressions;
GetCustomExpressions(customExpressions);
//
// The pipeline specification may already contain two flavors of
// expressions. Expressions whose evaluation should be deferred and
// expressions that will be evaluated at the top of the pipeline.
//
// The EEF determines which variables an expression depends on and adds
// those expressions to the contract. We want to perform
// this duty for only those expression whose evaluation we are deferring.
//
// The easiest way to do this is to modify the expression list. We can
// make the expressions that are being deferred appear to be the only
// expressions that exist. That way, this instance of the EEF will not
// interfere with the expressions that should be processed normally
// (ie at the top of the pipeline).
//
ExpressionList *el = ParsingExprList::Instance()->GetList();
ExpressionList new_el;
for (j = 0 ; j < varsToEvaluate.size() ; j++)
{
bool foundMatch = false;
for (i = 0 ; i < el->GetNumExpressions() ; i++)
if (varsToEvaluate[j] == el->GetExpressions(i).GetName())
{
bool replacedByCustom = false;
for (k = 0 ; k < customExpressions.size() ; k++)
if (varsToEvaluate[j] == customExpressions[k].GetName())
{
new_el.AddExpressions(customExpressions[k]);
replacedByCustom = true;
break;
}
if (!replacedByCustom)
new_el.AddExpressions(el->GetExpressions(i));
foundMatch = true;
break;
}
if (!foundMatch)
EXCEPTION1(InvalidVariableException, varsToEvaluate[j].c_str());
// If this is a vector, then look for the magnitude as well.
std::string newName = varsToEvaluate[j] + "_AVT_mag";
for (i = 0 ; i < el->GetNumExpressions() ; i++)
if (newName == el->GetExpressions(i).GetName())
new_el.AddExpressions(el->GetExpressions(i));
}
orig_el = *el;
*el = new_el;
}
// ****************************************************************************
// Method: avtDeferExpressionBaseListFilter::ExamineContract
//
// Purpose:
// A hook that allows the derived types to infer the name of the
// variable we are processing (for operators that generate
// expressions).
//
// Programmer: Hank Childs
// Creation: September 23, 2010
//
// ****************************************************************************
void
avtDeferExpressionBaseFilter::ExamineContract(avtContract_p c)
{
InferVariableNameFromContract(c);
avtExpressionEvaluatorFilter::ExamineContract(c);
}
// ****************************************************************************
// Method: avtDeferExpressionBaseFilter::ModifyContract
//
// Purpose:
// Allows the EEF to declare which variables it needs for the expressions
// whose evaluation are being deferred.
//
// Programmer: Hank Childs
// Creation: September 1, 2005
//
// Modifications:
// Brad Whitlock, Fri Mar 9 17:31:44 PST 2007
// Updated because of small change to ExpressionList.
//
// Mark C. Miller, Wed Jun 17 14:27:08 PDT 2009
// Replaced CATCHALL(...) with CATCHALL.
//
// Hank Childs, Thu Sep 23 16:48:04 PDT 2010
// Refactored method so derived types can set up new expressions.
//
// ****************************************************************************
avtContract_p
avtDeferExpressionBaseFilter::ModifyContract(avtContract_p spec)
{
SetupExpressionList();
avtContract_p rv = spec;
TRY
{
rv = avtExpressionEvaluatorFilter::ModifyContract(spec);
RestoreExpressionList();
}
CATCHALL
{
RestoreExpressionList();
RETHROW;
}
ENDTRY
return rv;
}
// ****************************************************************************
// Method: avtDeferExpressionBaseListFilter::Execute
//
// Purpose:
// Sets up the expressions we want to calculate and then calls execute.
//
// Programmer: Hank Childs
// Creation: September 23, 2010
//
// ****************************************************************************
void
avtDeferExpressionBaseFilter::Execute()
{
SetupExpressionList();
avtExpressionEvaluatorFilter::Execute();
RestoreExpressionList();
}
// ****************************************************************************
// Method: avtDeferExpressionBaseListFilter::RestoreExpressionList
//
// Purpose:
// We set up a custom expression list for execution. This is the method
// to restore that expression list so it doesn't affect the rest of the
// pipeline.
//
// Programmer: Hank Childs
// Creation: September 23, 2010
//
// ****************************************************************************
void
avtDeferExpressionBaseFilter::RestoreExpressionList()
{
ExpressionList *el = ParsingExprList::Instance()->GetList();
*el = orig_el;
}
/*****************************************************************************
*
* Copyright (c) 2000 - 2010, Lawrence Livermore National Security, LLC
* Produced at the Lawrence Livermore National Laboratory
* LLNL-CODE-442911
* All rights reserved.
*
* This file is part of VisIt. For details, see https://visit.llnl.gov/. The
* full copyright notice is contained in the file COPYRIGHT located at the root
* of the VisIt distribution or at http://www.llnl.gov/visit/copyright.html.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the disclaimer (as noted below) in the
* documentation and/or other materials provided with the distribution.
* - Neither the name of the LLNS/LLNL nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY,
* LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
*****************************************************************************/
// ************************************************************************* //
// File: avtDeferExpressionFilter.h
// ************************************************************************* //
#ifndef AVT_DeferExpressionBase_FILTER_H
#define AVT_DeferExpressionBase_FILTER_H
#include <avtExpressionEvaluatorFilter.h>
#include <ExpressionList.h>
// ****************************************************************************
// Class: avtDeferExpressionBaseFilter
//
// Purpose:
// A base class for filters that want to do defer expression operators.
//
// Programmer: Hank Childs
// Creation: September 23, 2010
//
// ****************************************************************************
class avtDeferExpressionBaseFilter : virtual public avtExpressionEvaluatorFilter
{
public:
avtDeferExpressionBaseFilter();
virtual ~avtDeferExpressionBaseFilter();
virtual const char *GetType(void) { return "avtDeferExpressionFilter"; };
protected:
ExpressionList orig_el;
virtual void ExamineContract(avtContract_p);
virtual void InferVariableNameFromContract(avtContract_p) {;};
virtual void GetCustomExpressions(std::vector<Expression> &) {;};
virtual void GetVariablesToEvaluate(std::vector<std::string> &) = 0;
virtual avtContract_p ModifyContract(avtContract_p);
virtual void Execute(void);
void SetupExpressionList(void);
void RestoreExpressionList(void);
};
#endif
......@@ -42,6 +42,9 @@
# Hank Childs, Sat Aug 7 03:39:33 PDT 2010
# Add DataBinning operator.
#
# Hank Childs, Fri Sep 24 08:16:10 PDT 2010
# Add SurfaceNormal, Flux, and ConnectedComponents operators.
#
#****************************************************************************/
IF(NOT WIN32)
SET(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${VISIT_PLUGIN_DIR}/operators)
......@@ -55,6 +58,7 @@ BoundaryOp
Box
Clip
Cone
ConnectedComponents
CoordSwap
CracksClipper
CreateBonds
......@@ -68,6 +72,7 @@ DualMesh
Edge
Elevate
ExternalSurface
Flux
IndexSelect
InverseGhostZone
Isosurface
......@@ -86,6 +91,7 @@ Revolve
Slice
Smooth
SphereSlice
SurfaceNormal
ThreeSlice
Threshold
Transform
......
# DO NOT EDIT THIS FILE! THIS FILE IS AUTOMATICALLY GENERATED BY xml2cmake
PROJECT(ConnectedComponents)
SET(COMMON_SOURCES
ConnectedComponentsPluginInfo.C
ConnectedComponentsCommonPluginInfo.C
ConnectedComponentsAttributes.C
)
SET(LIBI_SOURCES
ConnectedComponentsPluginInfo.C
)
SET(LIBG_SOURCES
ConnectedComponentsGUIPluginInfo.C
QvisConnectedComponentsWindow.C
${COMMON_SOURCES}
)
SET(LIBG_MOC_SOURCES
QvisConnectedComponentsWindow.h
)
QT_WRAP_CPP(GConnectedComponentsOperator LIBG_SOURCES ${LIBG_MOC_SOURCES})
SET(LIBV_SOURCES
ConnectedComponentsViewerPluginInfo.C
${COMMON_SOURCES}
)
SET(LIBE_SOURCES
ConnectedComponentsEnginePluginInfo.C
avtConnectedComponentsFilter.C
${COMMON_SOURCES}
)
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
${VISIT_COMMON_INCLUDES}
${VISIT_INCLUDE_DIR}/avt/DBAtts/MetaData
${VISIT_INCLUDE_DIR}/avt/DBAtts/SIL
${VISIT_INCLUDE_DIR}/avt/Database/Database
${VISIT_INCLUDE_DIR}/avt/Expressions/Abstract
${VISIT_INCLUDE_DIR}/avt/Expressions/CMFE
${VISIT_INCLUDE_DIR}/avt/Expressions/Conditional
${VISIT_INCLUDE_DIR}/avt/Expressions/Derivations
${VISIT_INCLUDE_DIR}/avt/Expressions/General
${VISIT_INCLUDE_DIR}/avt/Expressions/ImageProcessing
${VISIT_INCLUDE_DIR}/avt/Expressions/Management
${VISIT_INCLUDE_DIR}/avt/Expressions/Math
${VISIT_INCLUDE_DIR}/avt/Expressions/MeshQuality
${VISIT_INCLUDE_DIR}/avt/FileWriter
${VISIT_INCLUDE_DIR}/avt/Filters
${VISIT_INCLUDE_DIR}/avt/IVP
${VISIT_INCLUDE_DIR}/avt/Math
${VISIT_INCLUDE_DIR}/avt/Pipeline/AbstractFilters
${VISIT_INCLUDE_DIR}/avt/Pipeline/Data
${VISIT_INCLUDE_DIR}/avt/Pipeline/Pipeline
${VISIT_INCLUDE_DIR}/avt/Pipeline/Sinks
${VISIT_INCLUDE_DIR}/avt/Pipeline/Sources
${VISIT_INCLUDE_DIR}/avt/Plotter
${VISIT_INCLUDE_DIR}/avt/QtVisWindow
${VISIT_INCLUDE_DIR}/avt/View
${VISIT_INCLUDE_DIR}/avt/VisWindow/Colleagues
${VISIT_INCLUDE_DIR}/avt/VisWindow/Interactors
${VISIT_INCLUDE_DIR}/avt/VisWindow/Proxies
${VISIT_INCLUDE_DIR}/avt/VisWindow/Tools
${VISIT_INCLUDE_DIR}/avt/VisWindow/VisWindow
${VISIT_INCLUDE_DIR}/gui
${VISIT_INCLUDE_DIR}/mdserver/proxy
${VISIT_INCLUDE_DIR}/mdserver/rpc
${VISIT_INCLUDE_DIR}/viewer/main
${VISIT_INCLUDE_DIR}/viewer/proxy
${VISIT_INCLUDE_DIR}/viewer/rpc
${VISIT_INCLUDE_DIR}/winutil
${VISIT_INCLUDE_DIR}/visit_vtk/full
${VISIT_INCLUDE_DIR}/visit_vtk/lightweight
${QT_INCLUDE_DIR}
${QT_QTCORE_INCLUDE_DIR}
${QT_QTGUI_INCLUDE_DIR}
${VTK_INCLUDE_DIRS}
${PYTHON_INCLUDE_PATH}
${VISIT_INCLUDE_DIR}/visitpy/visitpy
)
LINK_DIRECTORIES(${VISIT_LIBRARY_DIR} ${QT_LIBRARY_DIR} ${MESA_LIBRARY_DIR} ${GLEW_LIBRARY_DIR} ${VTK_LIBRARY_DIRS})
ADD_LIBRARY(IConnectedComponentsOperator ${LIBI_SOURCES})
TARGET_LINK_LIBRARIES(IConnectedComponentsOperator visitcommon)
SET(INSTALLTARGETS IConnectedComponentsOperator)
IF(NOT VISIT_SERVER_COMPONENTS_ONLY AND NOT VISIT_ENGINE_ONLY AND NOT VISIT_DBIO_ONLY)
ADD_LIBRARY(GConnectedComponentsOperator ${LIBG_SOURCES})
TARGET_LINK_LIBRARIES(GConnectedComponentsOperator visitcommon gui )
ADD_LIBRARY(VConnectedComponentsOperator ${LIBV_SOURCES})
TARGET_LINK_LIBRARIES(VConnectedComponentsOperator visitcommon viewer )
SET(INSTALLTARGETS ${INSTALLTARGETS} GConnectedComponentsOperator VConnectedComponentsOperator)
IF(VISIT_PYTHON_SCRIPTING)
SET(LIBS_SOURCES
ConnectedComponentsScriptingPluginInfo.C
PyConnectedComponentsAttributes.C
${COMMON_SOURCES}
)
ADD_LIBRARY(SConnectedComponentsOperator ${LIBS_SOURCES})
TARGET_LINK_LIBRARIES(SConnectedComponentsOperator visitcommon visitpy ${PYTHON_LIBRARY})
SET(INSTALLTARGETS ${INSTALLTARGETS} SConnectedComponentsOperator)
ENDIF(VISIT_PYTHON_SCRIPTING)
IF(VISIT_JAVA)
ADD_CUSTOM_TARGET(JavaConnectedComponents ALL ${CMAKE_Java_COMPILER} ${CMAKE_Java_FLAGS} -d ${VISIT_BINARY_DIR}/java -classpath ${VISIT_BINARY_DIR}/java ConnectedComponentsAttributes.java)
ADD_DEPENDENCIES(JavaConnectedComponents JavaClient)
ENDIF(VISIT_JAVA)
ENDIF(NOT VISIT_SERVER_COMPONENTS_ONLY AND NOT VISIT_ENGINE_ONLY AND NOT VISIT_DBIO_ONLY)
ADD_LIBRARY(EConnectedComponentsOperator_ser ${LIBE_SOURCES})
TARGET_LINK_LIBRARIES(EConnectedComponentsOperator_ser visitcommon avtexpressions_ser avtfilters_ser avtpipeline_ser )
SET(INSTALLTARGETS ${INSTALLTARGETS} EConnectedComponentsOperator_ser)
IF(VISIT_PARALLEL)
ADD_PARALLEL_LIBRARY(EConnectedComponentsOperator_par ${LIBE_SOURCES})
TARGET_LINK_LIBRARIES(EConnectedComponentsOperator_par visitcommon avtexpressions_par avtfilters_par avtpipeline_par )
SET(INSTALLTARGETS ${INSTALLTARGETS} EConnectedComponentsOperator_par)
ENDIF(VISIT_PARALLEL)
VISIT_INSTALL_OPERATOR_PLUGINS(${INSTALLTARGETS})
VISIT_PLUGIN_TARGET_PREFIX(${INSTALLTARGETS})
<?xml version="1.0"?>
<Plugin name="ConnectedComponents" type="operator" label="ConnectedComponents" version="1.0" enabled="true" mdspecificcode="false" engspecificcode="false" onlyengine="false" noengine="false" category="Analysis">
<Attribute name="ConnectedComponentsAttributes" purpose="Attributes for Connected Components operator" persistent="false" keyframe="true" exportAPI="" exportInclude="">
</Attribute>
</Plugin>
/*****************************************************************************
*
* Copyright (c) 2000 - 2010, Lawrence Livermore National Security, LLC
* Produced at the Lawrence Livermore National Laboratory
* LLNL-CODE-442911
* All rights reserved.
*
* This file is part of VisIt. For details, see https://visit.llnl.gov/. The
* full copyright notice is contained in the file COPYRIGHT located at the root
* of the VisIt distribution or at http://www.llnl.gov/visit/copyright.html.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the disclaimer (as noted below) in the
* documentation and/or other materials provided with the distribution.
* - Neither the name of the LLNS/LLNL nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY,
* LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
*****************************************************************************/
#include <ConnectedComponentsAttributes.h>
#include <DataNode.h>
// ****************************************************************************
// Method: ConnectedComponentsAttributes::ConnectedComponentsAttributes
//
// Purpose:
// Init utility for the ConnectedComponentsAttributes class.
//
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: omitted
//
// Modifications:
//
// ****************************************************************************
void ConnectedComponentsAttributes::Init()
{
ConnectedComponentsAttributes::SelectAll();
}
// ****************************************************************************
// Method: ConnectedComponentsAttributes::ConnectedComponentsAttributes
//
// Purpose:
// Copy utility for the ConnectedComponentsAttributes class.
//
// Note: Autogenerated by xml2atts.
//
// Programmer: xml2atts
// Creation: omitted