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

来源:http://www.cnblogs.com/fdyjfd/archive/2016/09/06/5844176.html
-Advertisement-
Play Games

C++混合編程輔助工具, 方便將C++功能導出到腳本語言如Lua,Python中使用 ...


上一篇在這 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中都是支持的,如下:

 

bool
char
signed char
unsigned char
wchar_t
short
unsigned short
long    
unsigned long
long long
unsigned long long
int
unsigned int    
float
double
long double

 

考慮到有些類型中間有空格,為腳本使用方便,還為這些類型定義了別名,具體參見pafcore中的Typedef.i

編譯執行,結果如下圖:

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、 將基礎類型轉為byte數組存儲 2.C#中結構體 與 位元組流 相互轉化 3. C# 結構體位元組對齊 在上述結構體與位元組流轉換第二種方法中,獲取結構體長度int size = Marshal.SizeOf(Mystruct);,並不是13,而是16。在記憶體特定類型數據結構起始地址通常有一定的對齊 ...
  • 1、toastr http://www.jq22.com/jquery-info476 2、jquery1.11.1 checkbox前端js代碼: 單獨使用attr方法checked屬性不改變,單獨使用prop方法屬性改變,頁面checkbox不打勾,兩者配合就沒問題,可能是版本問題 3、jque ...
  • 開始接觸 LINQ 序 在此之前曾發表過三篇關於 LINQ 的隨筆: 進階:《LINQ 標準查詢操作概述》(強烈推薦) 技巧:《Linq To Objects - 如何操作字元串》 和 《Linq To Objects - 如何操作文件目錄》 現在,自己打算再整理一篇關於 LINQ 入門的隨筆,也是 ...
  • DataGridView:顯示數據表,通過此控制項中可以實現連接資料庫,實現數據的增刪改查 一、後臺數據綁定: List<xxx> list = new List<xxx>(); dataGridView1.DataSource = list; //設置不自動生成列,此屬性在屬性面板中沒有 dataG ...
  • 介紹創建F#項目,F#中的模塊以及與C#項目互相引用需要註意的問題。 ...
  • 自定義可左右滑動、拖拽滑動的平面柱狀圖 在做這種樣式控制項之前,可先瀏覽我之前預研的控制項: A、自定義左右滑動ScrollViewer(可拖動滑動) B、自定義Bar柱狀圖 OK,現在說下控制項具體設計過程: 1)採用Grid佈局,這樣可以將Y軸的標題設置平均高度,X軸的柱子也可以平均。 當然X軸也會存 ...
  • 一個程式猿在夢中解決的 Bug 沒有人是不做夢的,在所有夢的排行中,白日夢最令人傷感。不知道身為程式猿的大家,有沒有睡了一覺,然後在夢中把睡之前代碼中怎麼也搞不定的 Bug 給解決的經歷?反正我是有過。 什麼是 AOP ? AOP 為 Aspect Oriented Programming 的縮寫, ...
  • 一、概述 WeakHashMap是Map的一種,根據其類的命令可以知道,它結合了WeakReference和HashMap的兩種特點,從而構造出了一種Key可以自動回收的Map。 前面我們已經介紹了WeakReference的特點及實現原理,以及HashMap的實現原理,所以我們本文重點介紹Weak ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...