# This file has a ton of convienance methods for generating extra XML for# the pvpluginss__all__=['get_python_path_property','get_reader_time_step_values','get_vtk_type_map','get_property_xml','get_file_reader_xml','get_drop_down_xml','_help_arrays_xml','get_input_array_xml',]from.importerrorsas_helpers
[docs]defget_python_path_property():"""Get the XML content for setting the Python path when making a ParaView plugin. """return''' <StringVectorProperty command="SetPythonPath" name="PythonPath" number_of_elements="1" panel_visibility="advanced"> <Documentation>A semi-colon (;) separated list of directories to add to the python library search path.</Documentation> </StringVectorProperty>'''
[docs]defget_reader_time_step_values(extensions,reader_description):"""Get the XML content for reader time step values the Python path when making a ParaView plugin. """return'''<DoubleVectorProperty name="TimestepValues" repeatable="1" information_only="1"> <TimeStepsInformationHelper/> <Documentation> Available timestep values. </Documentation> </DoubleVectorProperty> <Hints> <ReaderFactory extensions="%s" file_description="%s" /> </Hints> '''%(extensions,reader_description,)
[docs]defget_vtk_type_map():"""Get the the VTK Type Map as specified in ``vtkType.h``"""return{'':8,# same as input'vtkPolyData':0,'vtkStructuredPoints':1,'vtkStructuredGrid':2,'vtkRectilinearGrid':3,'vtkUnstructuredGrid':4,'vtkPiecewiseFunction':5,'vtkImageData':6,'vtkDataObject':7,'vtkPointSet':9,'vtkUniformGrid':10,'vtkCompositeDataSet':11,#'vtkMultiGroupDataSet': 12, # obsolete'vtkMultiBlockDataSet':13,#'vtkHierarchicalDataSet': 14, # obsolete#'vtkHierarchicalBoxDataSet': 15, # obsolete# 'vtkGenericDataSet': 16, # obsolete'vtkHyperOctree':17,#'vtkTemporalDataSet': 18, # obsolete'vtkTable':19,'vtkGraph':20,'vtkTree':21,}
[docs]defget_property_xml(name,command,default_values,panel_visibility='default',help=''):"""Get the XML content for a property of a parameter for a python data object when making a ParaView plugin. """# A helper to build XML for any data type/methodvalue=default_valuesdef_prop_xml(typ,panel_visibility,name,command,default_values,num,help,extra=''):return''' <%sVectorProperty panel_visibility="%s" name="%s" label="%s" command="%s" default_values="%s" number_of_elements="%s">%s <Documentation>%s</Documentation> </%sVectorProperty>'''%(typ,panel_visibility,command,name,command,default_values,num,extra,help,typ,)ifisinstance(value,list):num=len(value)ifnotnum>0:raiseAssertionError('length of values must be grater than 0')propertyType=type(value[0])default_values=' '.join([str(v)forvinvalue])else:num=1propertyType=type(value)default_values=str(value)typ=''extra=''ifpropertyTypeisbool:typ='Int'extra='<BooleanDomain name="bool" />'default_values=default_values.replace('True','1').replace('False','0')elifpropertyTypeisfloat:typ='Double'elifpropertyTypeisstr:typ='String'elifpropertyTypeisint:typ='Int'else:raiseRuntimeError('get_property_xml(): Unknown property type: %r'%propertyType)return_prop_xml(typ,panel_visibility,name,command,default_values,num,help,extra)
[docs]defget_file_reader_xml(extensions,reader_description='',command="AddFileName"):"""Get the XML for a selectectable file for a reader when building a ParaView plugin Note: * Thanks: `Daan van Vugt`_ and for `his work here`_ * Modified by `Bane Sullivan`_ .. _Daan van Vugt: daanvanvugt@gmail.com .. _his work here: https://github.com/Exteris/paraview-python-file-reader .. _Bane Sullivan: info@pvgeo.org """return''' <StringVectorProperty name="FileNames" label="File Names" animateable="0" number_of_elements="0" command="%s" clean_command="clear_file_names" repeat_command="1" panel_visibility="never"> <FileListDomain name="files"/> <Documentation> The list of files to be read by the reader. </Documentation> </StringVectorProperty> <Hints> <ReaderFactory extensions="%s" file_description="%s" /> </Hints>'''%(command,extensions,reader_description,)
[docs]defget_drop_down_xml(name,command,labels,help='',values=None):"""Get the XML content for a drop down menu when making a ParaView plugin."""def_enum(labels,values=None):ifvaluesisNone:values=range(len(labels))els=[]fori,labinenumerate(labels):els.append('<Entry value="%d" text="%s"/>'%(values[i],lab))# formatter = r'%s\n'*len(els)dom='''\ <EnumerationDomain name="enum">'''forelinels:dom+=(''' %s'''%el)dom+=''' </EnumerationDomain>'''returndom,valuesdomain,values=_enum(labels,values)return'''\ <IntVectorProperty name="%s" command="%s" number_of_elements="1" default_values="%d">%s <Documentation>%s </Documentation> </IntVectorProperty>'''%(name,command,values[0],domain,help,)
[docs]defget_input_array_xml(labels=None,nInputPorts=1,n_arrays=1,input_names='Input'):"""Get the XML content for an array selection drop down menu."""defget_labels(labels):iflabelsisNoneandnInputPorts>1:labels=[None]*nInputPortsreturnlabelsifnInputPorts>1:forlinlabels:ifnotisinstance(l,list):raise_helpers.PVGeoError('`InputArrayLabels` is improperly structured. Must be a list of lists.')returnlabelslabels=get_labels(labels)deffix_array_labels(labels,n_arrays):ifn_arrays==0:return''iflabelsisNone:labels=['Array %d'%(i+1)foriinrange(n_arrays)]returnlabelsiflen(labels)<n_arrays:toadd=n_arrays-len(labels)foriinrange(toadd):labels.append('Array %d'%(i+len(labels)+1))returnlabels# Recursively call for each inputifnInputPorts>1:ifnotisinstance(n_arrays,list):raise_helpers.PVGeoError('When multiple inputs, the `NumberOfInputArrayChoices` must be a list of ints for the number of arrays from each input.')iflen(n_arrays)!=nInputPorts:raise_helpers.PVGeoError('You must spectify how many arrays come from each input. `len(NumberOfInputArrayChoices) != nInputPorts`.')# Now perform recursionout=[]foriinrange(nInputPorts):# Fix labelslabs=fix_array_labels(labels[i],n_arrays[i])xml=''forjinrange(n_arrays[i]):xml+=_help_arrays_xml(i+j,input_name=input_names[i],label=labs[j])out.append(xml)outstr="\n".join(inpforinpinout)returnoutstrelse:# Get parameters from info and call:labs=fix_array_labels(labels,n_arrays)xml=''forjinrange(n_arrays):xml+=_help_arrays_xml(j,input_name=None,label=labs[j])returnxml