dnawujun 发表于 2015-2-3 15:35

Python调用Flux第四讲:操纵坐标系

本帖最后由 dnawujun 于 2015-2-3 17:22 编辑

上次讲到如何操纵几何参数http://bbs.simol.cn/thread-137181-1-1.html
今天与大家分享下如何用Python操纵FluxServer去新建、修改、获取以及删除坐标系
所有这些操作都是通过调用
H_ERROR FMP_executeJythonCommand (CEDINT32 serverUid,char* commandline)
H_ERROR FMP_getJythonStringArrayValue (CEDINT32 serverUid,TCHAR* jythonVarName,CEDINT32* numberValues,TCHAR*** values)
这个两个函数来实现

一.        新建坐标系

我们在Flux中用命令行建立几何参数是用这样的命令:

CoordSysCartesian(name='CoordSys_1',
                parentCoordSys=Local(coordSys=CoordSys['XY1']),
                origin=['0', '0'],
                rotationAngles=RotationAngles(angleZ='0'))
来建立局部卡氏坐标系

CoordSysCartesian(name='COORDSYS_2',
                parentCoordSys=GlobalUnits(lengthUnit=LengthUnit['MILLIMETER'],
                angleUnit=AngleUnit['DEGREE']),
                origin=['0', '0'],
                rotationAngles=RotationAngles(angleZ='0'))
来建立全局卡氏坐标系
CoordSysCylindrical及CoordSysSpherical用来建立柱坐标和球坐标,参数和CoordSysCartesian一样的

二.        修改坐标系(以卡氏坐标系为例)

修改名称,commandline参数为:
CoordSysCartesian [' CoordSys_1'].name=' CS_ROTOR'
修改注释,commandline参数为:
CoordSysCartesian [' CoordSys_1'].name=' CoordSys_1 : Test'
或者
CoordSysCartesian [' CoordSys _1'].name=' CoordSys _1'
将注释清空
修改其他的参数类似,详见附件代码

三.        获取坐标系(以卡氏坐标系为例)

注意以下代码节选自附件,并做了一定的修改以便讲述,无法单独运行,完整代码请参见附件

3.1        获取名称及注释

command = "temp=CoordSysCartesian ['CoordSys_1'].name"
self._project.executeJythonCommand(command)
nameWithComment = self._project.getJythonStringArrayValue('temp')
name = map(lambda x: x.split(":").strip() if ":" in x else x, nameWithComment)
comment = map(lambda x: x.split(":").strip() if ":" in x else "", nameWithComment)

3.2        获取origin

command = "temp=CoordSysCartesian ['CoordSys_1'].name"
self._project.executeJythonCommand(command)
origin = self._project.getJythonStringArrayValue("temp")

3.3        获取rotationAngles

command = "temp=.rotationAngles.angleX," \            
        "CoordSysCartesian ['CoordSys_1'].rotationAngles.angleY," \                  
        "CoordSysCartesian ['CoordSys_1'].rotationAngles.angleZ]" \                              
self._project.executeJythonCommand(command)                     
rotationAngles = self._project.getJythonStringArrayValue("temp")

3.4        获取parentCoordSys

这个放到最后讲,因为这个操作稍微复杂点
从前面建立坐标系的命令我们可知,parentCoordSys有两种可能:
GlobalUnits或者Local,我们可以在Flux中Hack一下这两个东西以得到更多的信息。

以下以Local为例讲述,GlobalUnits参见附件代码
在Flux中新建一个局部坐标系,然后在命令行输入
CoordSysCartesian['CoordSys_1'].parentCoordSys,得到的输出是Local;
命令行输入Local.__fields,得到输出是coordSys;
然后输入Local.coordSys,得到输出是CoordSysCartesian,这就是XY1那个初始的坐标系
我们可以通过CoordSysCartesian .name来得到其名称
但是,如果存盘后退出然后再打开Project,再次输入Local.coordSys,得到的将是'XY1 : Cartesian system of coordinates.'
这是个字符串对象,是没有name属性的,只能通过分解字符串的方法来得到名称
因此需要首先判断Local.coordSys的对象类型,进而执行相应的操作
command="temp=CoordSysCartesian ['CoordSys_1'].parentCoordSys.coordSys.__class__.__name__"      
self._project.executeJythonCommand(command)                                                      
coordSysTypeName=self._project.getJythonStringArrayValue("temp")                              
if coordSysTypeName=='str':                                                                     
    command = "temp=CoordSysCartesian ['CoordSys_1'].coordSys"                                       
    self._project.executeJythonCommand(command)                                                   
else:#coordSysTypeName=='PyOc':                                                                  
    command = "temp=CoordSysCartesian ['CoordSys_1'].coordSys.name"
    self._project.executeJythonCommand(command)                                                   
parentCoordSysName = self._project.getJythonStringArrayValue("temp").split(":").strip()
       
四.        删除坐标系
删除单个, commandline参数为:
CoordSys [' CoordSys_1'].delete()
删除所有, commandline参数为:
CoordSys .delete()





watchingu 发表于 2015-2-15 09:03

再次学习,楼主强大!

lijo 发表于 2015-2-19 02:43

Thanks for sharing PyFlux learning
页: [1]
查看完整版本: Python调用Flux第四讲:操纵坐标系