做了一下午这个程序,搞得我快要呕血了!Python语法十分严谨,严到变态的地步!少一个缩进,运行就失败,真是让人无语!这一点还是Javascript比较好!
下面是一个正常格式的Python函数(Python里面没有花括号,全靠缩进表示)
def cal():
k = float(ArrayCan[0].Text);
u = float(ArrayCan[1].Text);
o = float(ArrayCan[2].Text);
f = float(ArrayCan[3].Text);
w = float(ArrayCan[4].Text);
if u < 10:
return 0.2014 + 0.086 * log10(k) - 0.053 * log10(u) - 0.0155 * o + 0.001 * f + 0.3567 * w;
else:
return 0.1893 + 0.075 * log10(k / u) - 0.01264 * o + 0.0005 * f + 0.3355 * w;
看见了吧,def是定义一个函数,cal是函数名,它是无参的,下面缩进的部分是函数体,在Python中非常喜欢使用冒号,冒号之后的内容相当于C#花括号中的内容
下面变态的部分来了,要把这一段代码放入XML的属性值中,这里面有空格,换行,还有小于号,我需要下面这些预备知识才能完成这个任务
首先是一些特殊字符在XML里面如何书写
< < 小于号
> > 大于号
& & 和
' ' 单引号
" " 双引号
接着是换行,空格等在XML里面的写法
空格 (& #x0020;)
Tab (& #x0009;)
回车 (& #x000D;)
换行 (& #x000A;)
记得用得时候要把"&"和"#"之间的" "去掉
预备知识整理完毕,下面开始干活,下图就是上面Python代码存入XML属性里的代码,之所以用图片是因为那些特殊定义符贴不进页面中,只得截图了!,下面的这个格式让我鏖战了一下午,唉~~ var xmlDoc = _thisView.ReadEmpiricalXml();
if (xmlDoc != null)
{
var xElement = xmlDoc.Element("Property");
if (xElement != null)
{
var formulaName =
xElement.Elements("FormulaInfo").Where(test => test.Attribute("FormulaName").Value == JYGSNAME);
var formulaElements = formulaName as IList<XElement> ?? formulaName.ToList();
if (formulaElements.Count > 0)
{
var code = formulaElements[0].Attribute("Code").Value;
if (!string.IsNullOrEmpty(code))
{
ScriptEngine engine = Python.CreateEngine();
ScriptScope scope = engine.CreateScope();
//导入Python中的Math模块
ScriptSource source =
engine.CreateScriptSourceFromString("from math import *", SourceCodeKind.AutoDetect);
source.Execute(scope);
//执行公式
source = engine.CreateScriptSourceFromString(code);
//给Python中的变量赋值,ArrayCan是一个TextBox数组
scope.SetVariable("ArrayCan", ArrayCan);
source.Execute(scope);
//找到Python脚本中定义的cal函数
var func = scope.GetVariable<Func<double>>("cal");
//执行函数并返回结果
var result = func();
}
}
}
}
特别注意导入Python模块(类似c#命名空间)时,不能跟下面函数的脚本写在一起,要像上面一样,用二段代码分别导