<h2>DM脚本调用Python脚本</h2>
<p><em>这个答案显示了Python和DM脚本之间的一些通信,但却形成了相反的一面。它还使用持久标记组作为传输代理</em></p>
<h2>从DM脚本向Python内外传递简单值</h2>
<pre><code>// //////////////////////////////////////////////////
// Helper methods
// Build the DM-String representing the PythonScript
// which is then called
// //////////////////////////////////////////////////
string AddPythonValueIN( number val, string valName, string valType )
{
string py
py += "\n#Get value DM->Python via global tags" + "\n"
py += "success, " + valName + " = DM.GetPersistentTagGroup().GetTagAs" + valType + "('Python_temp:in:" + valName + "')" + "\n"
py += "if False == success:" + "\n"
py += " print( 'Error. No value passed in by DM-script sucessfully.' )" + "\n"
py += " exit(0)" + "\n"
return py
}
string AddPythonValueIN( string val, string valName, string valType )
{
string py
py += "\n#Get value DM->Python via global tags" + "\n"
py += "success, " + valName + " = DM.GetPersistentTagGroup().GetTagAs" + valType + "('Python_temp:in:" + valName + "')" + "\n"
py += "if False == success:" + "\n"
py += " print( 'Error. No value passed in by DM-script sucessfully.' )" + "\n"
py += " exit(0)" + "\n"
return py
}
string AddPythonValueOut( string valName, string valType )
{
string py
py += "\n#Get value Python->DM via global tags" + "\n"
py += "DM.GetPersistentTagGroup().SetTagAs" + valType + "('Python_temp:out:" + valName + "'," + valName + ")" + "\n"
return py
}
string AddPythonPrintModifyPrint()
{
string py
py += "\n#Print InValue, modify, print OutValue" + "\n"
py += "print('InValue',InValue)"+ "\n"
py += "OutValue = InValue * 2" + "\n"
py += "print('OutValue',OutValue)"+ "\n"
return py
}
// //////////////////////////////////////////////////
// Example calls
// Demonstrating value passing from DM script to a
// called Python snippet. TagTypes need to be
// explicit in Python.
// //////////////////////////////////////////////////
void PythonValueInAndOut_Float()
{
number value = 13.2
GetPersistentTagGroup().TagGroupSetTagAsFloat("Python_temp:in:InValue",value)
Result( " DM-Script passed value in: " + value + "\n")
string py = "#Script to demonstrate value passing in Hybrid scripts. DM calling Python." + "\n"
py += AddPythonValueIN( value, "InValue", "Float" )
py += AddPythonPrintModifyPrint()
py += AddPythonValueOut( "OutValue", "Float" )
Result( "\n PYTHON CODE EXECUTES\n - \n\n" )
ExecutePythonScriptString( py, 1 )
Result( "\n - \n PYTHON CODE FINISHED \n\n" )
if ( !GetPersistentTagGroup().TagGroupGetTagAsFloat("Python_temp:out:OutValue",value))
Throw("Python value passed out not found.")
Result( "DM-Script received value: " + value + "\n")
GetPersistentTagGroup().TagGroupDeleteTagWithLabel("Python_temp")
}
void PythonValueInAndOut_Double()
{
number value = 13.2
GetPersistentTagGroup().TagGroupSetTagAsDouble("Python_temp:in:InValue",value)
Result( " DM-Script passed value in: " + value + "\n")
string py = "#Script to demonstrate value passing in Hybrid scripts. DM calling Python." + "\n"
py += AddPythonValueIN( value, "InValue", "Double" )
py += AddPythonPrintModifyPrint()
py += AddPythonValueOut( "OutValue", "Double" )
Result( "\n PYTHON CODE EXECUTES\n - \n\n" )
ExecutePythonScriptString( py, 1 )
Result( "\n - \n PYTHON CODE FINISHED \n\n" )
if ( !GetPersistentTagGroup().TagGroupGetTagAsDouble("Python_temp:out:OutValue",value))
Throw("Python value passed out not found.")
Result( "DM-Script received value: " + value + "\n")
GetPersistentTagGroup().TagGroupDeleteTagWithLabel("Python_temp")
}
void PythonValueInAndOut_String()
{
string value = "hallo"
GetPersistentTagGroup().TagGroupSetTagAsString("Python_temp:in:InValue",value)
Result( " DM-Script passed value in: " + value + "\n")
string py = "#Script to demonstrate value passing in Hybrid scripts. DM calling Python." + "\n"
py += AddPythonValueIN( value, "InValue", "String" )
py += AddPythonPrintModifyPrint()
py += AddPythonValueOut( "OutValue", "String" )
Result( "\n PYTHON CODE EXECUTES\n - \n\n" )
ExecutePythonScriptString( py, 1 )
Result( "\n - \n PYTHON CODE FINISHED \n\n" )
if ( !GetPersistentTagGroup().TagGroupGetTagAsString("Python_temp:out:OutValue",value))
Throw("Python value passed out not found.")
Result( "DM-Script received value: " + value + "\n")
GetPersistentTagGroup().TagGroupDeleteTagWithLabel("Python_temp")
}
ClearResults()
PythonValueInAndOut_float()
PythonValueInAndOut_double()
PythonValueInAndOut_string()
</code></pre>
<h2>从DM脚本传入和传出Python中的图像数据</h2>
<pre><code>// Images and other objects which are in memory can be most easily passed
// by passing their ID value and then finding them by ID.
// However, this does not work if the object would go out of scope at the
// end of a script (like an image which is not displayed)
//
// To pass a NumpyArray out of Python without showing an image, one can
// instead write the array to the global tags directly, together with the
// information needed to read the tags out into a DM-image
void PythonImageInOut( )
{
image img := RealImage("test",4,5,5)
img = icol
Result( " DM-Script passed image ["+img.ImageGetLabel()+"] in.\n")
string py
py += "\n#Get image DM->Python via imageLabel" + "\n"
py += "img = DM.FindImageByID("+ img.ImageGetID()+")" + "\n"
py += "if None == img:" + "\n"
py += " print( 'Error.No image passed in by DM-script sucessfully.' )" + "\n"
py += " exit(0)" + "\n"
py += "\n"
py += "print('Image from DM: Label = ', img.GetLabel())" + "\n"
py += "print('Image from DM: Name = ', img.GetName())" + "\n"
py += "print('Image from DM: Value = \\n', img.GetNumArray())" + "\n"
py += "del img #ALWAYS delete DM objects in Python scripts" + "\n"
py += "\n"
py += "\n#Create DM image in Python and pass out as ID via global tags" + "\n"
py += "import numpy as np" + "\n"
py += "data = np.arange(48).reshape(6,8)" + "\n"
py += "outImg = DM.CreateImage(data.copy(order='C'))" + "\n"
py += "DM.GetPersistentTagGroup().SetTagAsLong('Python_temp:out:ID',outImg.GetID())" + "\n"
py += "print('Create new image with ID:',outImg.GetID())"+"\n"
py += "outImg.ShowImage() #Image needs to be shown or it will not stay in memory" + "\n"
py += "del outImg #ALWAYS delete DM objects in Python scripts" + "\n"
Result( "\n PYTHON CODE EXECUTES\n - \n\n" )
ExecutePythonScriptString( py, 1 )
Result( "\n - \n PYTHON CODE FINISHED \n\n" )
number imgID
if ( !GetPersistentTagGroup().TagGroupGetTagAsLong("Python_temp:out:ID",imgID))
Throw("Python imageID value passed out not found.")
image outImg := FindImageByID(imgID)
if ( !outImg.ImageIsValid() )
Throw("Python imageID value passed out but no matching image found.")
Result( "DM-Script received image: " + outImg.ImageGetLabel()+ "\n")
GetPersistentTagGroup().TagGroupDeleteTagWithLabel("Python_temp")
}
void PythonArrayOut( )
{
string py
py += "#Passing Numpy array values via global tags" + "\n"
py += "import numpy as np" + "\n"
py += "data = np.arange(6*8*3).reshape(6,8,3)" + "\n"
py += "outImg = DM.CreateImage(data.copy(order='C'))" + "\n"
py += "DM.GetPersistentTagGroup().SetTagAsArray('Python_temp:out:array',outImg)" + "\n"
py += "DM.GetPersistentTagGroup().SetTagAsLong('Python_temp:out:type',outImg.GetDataType())" + "\n"
py += "for i in range(data.ndim,0,-1):" + "\n"
py += " DM.GetPersistentTagGroup().SetTagAsLong('Python_temp:out:dim:' + str(i-1),data.shape[i-1])" + "\n"
py += "\n"
py += "del outImg #ALWAYS delete DM objects in Python scripts" + "\n"
Result( "\n PYTHON CODE EXECUTES\n - \n\n" )
ExecutePythonScriptString( py, 1 )
Result( "\n - \n PYTHON CODE FINISHED \n\n" )
number dataType
if ( !GetPersistentTagGroup().TagGroupGetTagAsLong("Python_temp:out:type",dataType))
Throw("Python dataType value passed out not found.")
TagGroup dimTG
if ( !GetPersistentTagGroup().TagGroupGetTagAsTagGroup("Python_temp:out:dim",dimTG))
Throw("Python dimensions passed out not found.")
number nDim = dimTG.TagGroupCountTags()
number n0, n1, n2, n3, n4
dimTG.TagGroupGetIndexedTagAsLong(0,n0)
dimTG.TagGroupGetIndexedTagAsLong(1,n1)
dimTG.TagGroupGetIndexedTagAsLong(2,n2)
dimTG.TagGroupGetIndexedTagAsLong(3,n3)
dimTG.TagGroupGetIndexedTagAsLong(4,n4)
image outImg
if ( 1 == nDim )
outImg := NewImage("Test", dataType, n0 )
else if ( 2 == nDim )
outImg := NewImage("Test", dataType, n0, n1 )
else if ( 3 == nDim )
outImg := NewImage("Test", dataType, n0, n1, n2 )
else if ( 4 == nDim )
outImg := NewImage("Test", dataType, n0, n1, n2, n3 )
else if ( 5 == nDim )
outImg := NewImage("Test", dataType, n0, n1, n2, n3, n4 )
if ( !GetPersistentTagGroup().TagGroupGetTagAsArray("Python_temp:out:array",outImg))
Throw("Python array data passed out not found.")
Result("\n DM recreated image from array values: " + outImg.ImageGetLabel()+ "\n")
GetPersistentTagGroup().TagGroupDeleteTagWithLabel("Python_temp")
}
clearresults()
Result("\n\nEXAMPLE Python<->DM image passing\n")
PythonImageInOut()
Result("\n\nEXAMPLE Python >DM array passing\n")
PythonArrayOut( )
</code></pre>