首页 > 代码库 > C++混合编程之idlcpp教程Python篇(9)

C++混合编程之idlcpp教程Python篇(9)

上一篇在这 C++混合编程之idlcpp教程Python篇(8)

第一篇在这 C++混合编程之idlcpp教程(一)

 

与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTutorial7.cpp, Tutorial7.cpp, Tutorial7.i, tutorial7.py 外,Tutorial6.cpp也被加入了此工程中。其中PythonTutorial7.cpp的内容基本和PythonTutorial6.cpp雷同,不再赘述。首先看一下Tutorial7.i的内容:

#import "Tutorial6.i"namespace tutorial{    struct Ray3<T>    {        Ray3();        Ray3(const Vector3<T>& origin, const Vector3<T>& direction);        void getPoint(Vector3<T>& point, T t) const;        Vector3<T> getPoint(T t) const;        Vector3<T> m_origin;        Vector3<T> m_direction;    };    export Ray3<float>;    export Ray3<double>;    typedef Ray3<float> Ray3f;    typedef Ray3<double> Ray3d;    #{    template<typename T>    inline Ray3<T>::Ray3()    {}    template<typename T>    inline Ray3<T>::Ray3(const Vector3<T>& origin, const Vector3<T>& direction) :        m_origin(origin), m_direction(direction)    {}    template<typename T>    inline void Ray3<T>::getPoint(Vector3<T>& point, T t) const    {        point.x = m_origin.x + m_direction.x * t;        point.y = m_origin.y + m_direction.y * t;        point.z = m_origin.z + m_direction.z * t;    }    template<typename T>    inline Vector3<T> Ray3<T>::getPoint(T t) const    {        return Vector3<T>(m_origin.x + m_direction.x * t,            m_origin.y + m_direction.y * t,            m_origin.z + m_direction.z * t);    }    #}}

第一行

#import "Tutorial6.i"

在后面Ray3的定义中使用到了模板类Vector3,所以在此处要先引入此文件。

struct Ray3<T>

此处定义了模板类Ray3。其中有类型为Vector3<T>的两个成员变量m_origin和m_direction。在这个类中以 m_origin + m_direction * t  (t >= 0) 参数方程的形式表示一个射线。有两个名为getPoint的重载函数用来获取射线上的一点坐标。

export Ray3<float>;

export Ray3<double>;

模板实例化,这两行代码指示idlcpp生成相应类型的元数据信息。

typedef Ray3<float> Ray3f;

typedef Ray3<double> Ray3d;

定义类型别名,方便使用。

编译后生成的Tutorial7.h的内容如下:

 

//DO NOT EDIT THIS FILE, it is generated by idlcpp//http://www.idlcpp.org#pragma once#include "./Tutorial6.h"namespace tutorial{    template<typename T>    struct Ray3    {    public:        Ray3();        Ray3(const Vector3<T>& origin,const Vector3<T>& direction);        void getPoint(Vector3<T>& point,T t)const ;        Vector3<T> getPoint(T t)const ;        Vector3<T> m_origin;        Vector3<T> m_direction;    };    typedef Ray3<float> Ray3f;    typedef Ray3<double> Ray3d;    template<typename T>    inline Ray3<T>::Ray3()    {}    template<typename T>    inline Ray3<T>::Ray3(const Vector3<T>& origin, const Vector3<T>& direction) :        m_origin(origin), m_direction(direction)    {}    template<typename T>    inline void Ray3<T>::getPoint(Vector3<T>& point, T t) const    {        point.x = m_origin.x + m_direction.x * t;        point.y = m_origin.y + m_direction.y * t;        point.z = m_origin.z + m_direction.z * t;    }    template<typename T>    inline Vector3<T> Ray3<T>::getPoint(T t) const    {        return Vector3<T>(m_origin.x + m_direction.x * t,            m_origin.y + m_direction.y * t,            m_origin.z + m_direction.z * t);    }    }

 

然后是Tutorial7.cpp

 

#include "Tutorial7.h"#include "Tutorial7.mh"#include "Tutorial7.ic"#include "Tutorial7.mc"

 

因为模板类的代码都写在头文件中了,所以Tutorial7.cpp只需要包含对应的四个文件即可。

另外模板类Ray3用到了模板类Vector3,所以其实例化类型Ray3<float>和Ray3<double>也分别用到Vector3的实例化类型Vector3<float>和Vector3<double>,相应的Ray3<float>元数据中也会用到Vector3<float>的元数据信息。所以在这个工程中需要将Tutorial6.cpp加入进来。

最后看一下Tutorial7.py的内容

 

p = paf.float.NewArray(3);p[0] = 1;p[1] = 2;p[2] = 3;ray = paf.tutorial.Ray3f(paf.tutorial.Vector3f.s_zero, paf.tutorial.Vector3f(p));pt = paf.tutorial.Vector3f(0,0,0);ray.getPoint(pt, 2);print(pt.x._);print(pt.y._);print(pt.z._);pt = ray.getPoint(3);print(pt.x._);print(pt.y._);print(pt.z._);

 

第一行:

p = paf.float.NewArray(3);

创建一个float类型的数组,共三个元素,其中float是内置的类型。C++的原生类型在idlcpp中都是支持的,如下:

 

boolcharsigned charunsigned charwchar_tshortunsigned shortlong    unsigned longlong longunsigned long longintunsigned int    floatdoublelong double

 

考虑到有些类型中间有空格,为脚本使用方便,还为这些类型定义了别名,具体参见pafcore中的Typedef.i

编译执行,结果如下图:

技术分享

 

C++混合编程之idlcpp教程Python篇(9)