學習python的x-plane插件編程--PythonInterface的helloworld程序

支 持 本 站: 捐贈伺服器等運維費用,感謝您的支持!

我不是一個程式設計師,也不懂python開發語言,
純粹出於興趣看了看這方面的資料,寫個簡單的入門資料,
希望能夠拋磚引玉,期待今後不斷有更多優秀的python 插件出現。

資源:
1. 本家的開發說明,作為入門很好。本文根據這篇作成。
http://www.xpluginsdk.org/downloads/Using%20Python%20with%20the%20PythonInterface%20Plugin.pdf

2. 本家提供的樣例程序,一切還都是看代碼吧,這是最好的學習方法。http://www.xpluginsdk.org/downloads/PythonScripts.zip

----------------------------------------------------

首先,你應該安裝了PythonInterface吧,如果不知道的話,
這個下載頁面里有最新的版本,你一定要下載適合你機器的Python版本的PythonInterface.zip,
並安裝到plugins目錄下。PythonInterface對應的插件都放在PythonScripts目錄下面。

源程序文件的擴展名應為.py,比如"helloworld.py",
文件放到/Resources/plugins/PythonScipts目錄下面。


支 持 本 站: 捐贈伺服器等運維費用,感謝您的支持!

一個最基本的程序架構如下,


class PythonInterface:
def XPluginStart(self):
self.Name = "Template"
self.Sig = "SandyBarbour.Python.Template"
self.Desc = "A test script for the Python Interface."
return self.Name, self.Sig, self.Desc

def XPluginStop(self):
pass

def XPluginEnable(self):
return 1

def XPluginDisable(self):
pass

def XPluginReceiveMessage(self, inFromWho, inMessage, inParam):
pass


也就是要定義一個PythonInterface類,
由XPluginStart方法來啟動該插件,由XPluginStop來關閉該插件,
由XPluginEnable和XPluginDisable來管理enable和disable該插件,
由XPluginReceiveMessage來接受系統發來的消息並處理。
pass的意思好像是什麼都不做。

下面是可以在畫面上顯示窗口,顯示框和文字所需要的函數,
from XPLMDisplay import *
XPLMCreateWindow() -- 生成窗口
XPLMDestroyWindow() -- 刪除窗口
XPLMGetWindowGeometry() -- 得到窗口的位置資訊

from XPLMGraphics import *
XPLMDrawTranslucentDarkBox() -- 顯示一個半透明的灰色顯示框
XPLMDrawString() -- 顯示字符串


生成窗口的例子如下,一般放到XPluginStart中,
self.WindowId = XPLMCreateWindow(self, 50, 600, 300, 400, 1, self.DrawWindowCB, self.KeyCB, self.MouseClickCB, 0)
並在XPluginStop中刪除這個窗口,self.WindowId 為窗口id,
XPLMDestroyWindow(self, self.WindowId)。
self.DrawWindowCB, self.KeyCB, self.MouseClickCB分別指向窗口,鍵盤和滑鼠的回調函數。

描畫窗口需要定義函數DrawWindowCallback,
def DrawWindowCallback(self, inWindowID, inRefcon):
pass
可以在這個函數中使用
XPLMGetWindowGeometry(inWindowID, lLeft, lTop, lRight, lBottom)
得到窗口的坐標;
使用
gResult = XPLMDrawTranslucentDarkBox(left, top, right, bottom)
在指定的位置上顯示半透明顯示框;
還可以使用指定的顏色,位置和字體
gResult = XPLMDrawString(colour, left + 5, top - 20, Desc, 0, xplmFont_Basic)
來顯示文本。

接受滑鼠操作使用需要定義MouseClickCallback回調函數,
def MouseClickCallback(self, inWindowID, x, y, inMouse, inRefcon):
pass
滑鼠是否按下可以通過inMouse的值來判斷,如下所示:
if ((inMouse == xplm_MouseDown) or (inMouse == xplm_MouseUp)):
self.Clicked = 1 - self.Clicked

類似的,鍵盤操作需要KeyCallback函數,
def KeyCallback(self, inWindowID, inKey, inFlags, inVirtualKey, inRefcon, losingFocus):
pass

最基本的函數就是這些了,讓我們看一下這個helloworld的程序,
它在畫面上顯示一個框,當按下滑鼠是顯示"I'm a plugin 1"文字,
送開滑鼠後會顯示"Hello World1"文字。

----------------------------------------------------------------------

from XPLMDisplay import *
from XPLMGraphics import *

class PythonInterface:
defXPluginStart(self):
self.Name = "Template"
self.Sig = "SandyBarbour.Python.Template"
self.Desc = "A test script for the Python Interface."
self.Clicked = 0
self.DrawWindowCB = self.DrawWindowCallback
self.KeyCB = self.KeyCallback
self.MouseClickCB = self.MouseClickCallback
self.WindowId = XPLMCreateWindow(self, 50, 600, 300, 400, 1, self.DrawWindowCB, self.KeyCB, self.MouseClickCB, 0)
return self.Name, self.Sig, self.Desc

defXPluginStop(self):
XPLMDestroyWindow(self, self.WindowId)
pass

defXPluginEnable(self):
return1

def XPluginDisable(self):
pass

def XPluginReceiveMessage(self, inFromWho, inMessage, inParam):
pass

def DrawWindowCallback(self, inWindowID, inRefcon):
lLeft = []; lTop = []; lRight = []; lBottom = []

XPLMGetWindowGeometry(inWindowID, lLeft, lTop, lRight, lBottom)
left = int(lLeft[0]); top = int(lTop[0]); right = int(lRight[0]); bottom = int(lBottom[0])

gResult = XPLMDrawTranslucentDarkBox(left, top, right, bottom)
colour = 1.0, 1.0, 1.0

if self.Clicked:
Desc = "I'm a plugin 1"
else:
Desc = "Hello World1"

gResult = XPLMDrawString(colour, left + 5, top - 20, Desc, 0, xplmFont_Basic)
pass

def KeyCallback(self, inWindowID, inKey, inFlags, inVirtualKey, inRefcon, losingFocus):
pass

def MouseClickCallback(self, inWindowID, x, y, inMouse, inRefcon):
if ((inMouse == xplm_MouseDown) or (inMouse == xplm_MouseUp)):
self.Clicked = 1- self.Clicked
return1


----------------------------------------------------------------------

支 持 本 站: 捐贈伺服器等運維費用,感謝您的支持!