IronPython: Message: expected c_double, got c_double_Array_3

2024-10-03 23:25:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在使用Rhino中的python脚本编辑器开发一个脚本。由于我目前在Windows机器上工作,脚本编辑器使用IronPython作为语言。你知道吗

在同一个脚本中,我想与具有pythonapi的FE软件(Straus7)进行交互。在这样做时,我遇到了一些问题,因为ctypes模块在IronPython中的工作方式与在常规Python中的工作方式不同。尤其是,我在使用以下命令初始化数组时发现了问题:

ctypes.c_double*3

例如,如果我想获得有限元模型中一个节点#1的XYZ坐标,我将编写以下代码:

XYZType = ctypes.c_double*3
XYZ = XYZType()
node_num = 1
st.St7GetNodeXYZ(1,node_num,XYZ)

这将返回一个变量XYZ,它是一个三维数组,这样:

XYZ -> <straus_userfunctions.c_double_Array_3 at 0xc5787b0>
XYZ[0] = -0.7xxxxx -> (X_coord)
XYZ[1] = -0.8xxxxx -> (Y_coord)
XYZ[2] = -0.9xxxxx -> (Z_coord)

另一方面,我在IronPython中复制了相同的脚本,出现以下错误消息

Message: expected c_double, got c_double_Array_3

很明显,如果我把变量XYZ改成c\u double,那么它就变成了一个只包含一个条目的双变量,这个条目对应于数组的第一个元素(在本例中是X坐标)

这种情况是相当恼人的所有有限元软件,矩阵和数组的使用是广泛使用。因此,我想问,现在是否有人对这种情况有一个简单的解决办法。你知道吗

我在考虑使用数组第一个元素的内存分配来获得其余元素,但我不太确定如何做到这一点。你知道吗

非常感谢。杰拉德


Tags: 脚本node元素软件方式数组编辑器ctypes
1条回答
网友
1楼 · 发布于 2024-10-03 23:25:52

我发现在使用IronPython时,需要显式地将“三个double的数组”转换为“指向double的指针”。因此,如果您将Grasshopper与Strand7/Straus7 API一起使用,则需要添加如下额外的位:

import St7API
import ctypes

# Make the pointer conversion functions
PI = ctypes.POINTER(ctypes.c_long)
PD = ctypes.POINTER(ctypes.c_double)

XYZType = ctypes.c_double*3
XYZ = XYZType()
node_num = 1

# Cast arrays whenever you pass them to St7API from IronPython
St7API.St7GetNodeXYZ(1, node_num, PD(XYZ))

目前我还没有访问IronPython或Strand7/Straus7的权限,但是从内存中就可以做到这一点。如果这对你不起作用,你可以发邮件给Strand7支持部门——你通常会在一天左右的时间内收到类似的反馈。你知道吗

相关问题 更多 >