Доступ/обертка структуры внутри класса в Cython

Я пытаюсь обернуть класс 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. Я компилирую с параметрами С++.

Я вполне могу делать что-то глупое, но я пробовал много вещей. Вышеупомянутая проблема на самом деле является лишь первым препятствием на пути к решению моих реальных проблем, но, поскольку она казалась довольно фундаментальной и ограниченной, я подумал, что сначала решу ее здесь.

Кстати, в прошлом я спрашивал о создании экземпляра структуры, производной от класса. В этом вопросе структура объявляется внутри класса.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
175
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы просто не различаете имя типа и имя члена. Что-то вроде этого работает для меня (по крайней мере, проходит этап 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

Другие вопросы по теме