Я пытаюсь обернуть класс btCollisionWorld C++ библиотеки Bullet Physics с помощью Cython. В целом, я добился хорошего успеха с частями библиотеки для моделирования физики, но столкнулся с проблемой, пытаясь обернуть части обнаружения столкновений.
Если вы посмотрите на https://github.com/kripken/bullet/blob/master/src/BulletCollision/CollisionDispatch/btCollisionWorld.h, вы найдете файл .h, содержащий класс btCollisionWorld, который я пытаюсь обернуть . На самом деле это несколько более новая версия, чем та, с которой я работаю, но я считаю, что в важных отношениях она такая же.
(Также, если вы посмотрите на https://github.com/bulletphysics/bullet3/blob/master/examples/Raycast/RaytestDemo.cpp, вы увидите пример программы на C++, которая использует библиотеку. Это может быть полезно. дополнительный контекст, чтобы показать, что я хочу делать в Cython, и что я могу сделать для обычной физической части Bullet Physics.)
Обычно я могу получить доступ к некоторым частям класса btCollisionWorld через Cython. Например, если я помещу в свой файл .pxd следующее:
cdef cppclass btCollisionWorld:
btBroadphaseInterface* getBroadphase()
затем в моем коде Cython я могу успешно скомпилировать и выполнить такие строки:
if cw.getBroadphase():
print "the test passed, we can access a member function in btCollisionWorld"
Однако, когда я пытаюсь расширить свой .pxd, чтобы предоставить доступ (например) к «struct LocalShapeInfo», заставив .pxd выглядеть следующим образом:
cdef cppclass btCollisionWorld:
btBroadphaseInterface* getBroadphase()
struct LocalShapeInfo:
int m_shapePart
затем пытается получить к нему доступ из Cython, используя такой код:
print "can a member of a struct be accessed?", cw.LocalShapeInfo.m_shapePart
выдавать такие ошибки:
print "can a member of a struct be accessed?", cw.LocalShapeInfo.m_shapePart
^
------------------------------------------------------------
fun6.pyx:1428:53: Object of type 'btCollisionWorld' has no attribute 'LocalShapeInfo'
Из приведенного выше файла .h видно, что LocalShapeInfo — это просто структура внутри класса btCollisionWorld. Но я не могу добраться до него с Сайтона!
Я пробовал МНОГИЕ варианты синтаксиса для определения структур в файле .pxd, и ничего не работает. Я НЕ МОГУ ДОСТУПИТЬ К СТРУКТАМ ВНУТРИ КЛАССОВ ИЗ CYTHON!! Я не вижу примеров использования Cython для доступа к структурам, объявленным внутри классов. Это поддерживается? Если да, то как? Я могу получить доступ к функциям-членам и переменным-членам, но не к структурам, независимо от того, как я объявляю их в .pxd и как я получаю к ним доступ из Cython. Я компилирую с параметрами С++.
Я вполне могу делать что-то глупое, но я пробовал много вещей. Вышеупомянутая проблема на самом деле является лишь первым препятствием на пути к решению моих реальных проблем, но, поскольку она казалась довольно фундаментальной и ограниченной, я подумал, что сначала решу ее здесь.
Кстати, в прошлом я спрашивал о создании экземпляра структуры, производной от класса. В этом вопросе структура объявляется внутри класса.
Я думаю, вы просто не различаете имя типа и имя члена. Что-то вроде этого работает для меня (по крайней мере, проходит этап cython):
cdef extern from *:
cdef cppclass btCollisionWorld:
struct LocalShapeInfo:
int m_shapePart
LocalShapeInfo m_shape
cdef f(btCollisionWorld& r):
return r.m_shape.m_shapePart