簡體   English   中英

C#中的IronPython和Nodebox

[英]IronPython and Nodebox in C#

我的計划:

我正在嘗試設置我的C#項目與Nodebox通信以調用某個函數,該函數填充圖形並在新窗口中繪制它。

現狀:[修復...見Update2]

我已經包含了所有需要的python-modules,但我仍然得到了

Library 'GL' not found

似乎pyglet模塊需要引用GL/gl.h ,但由於IronPython行為而無法找到它。

需求:

在不安裝新軟件包的情況下,項目需要盡可能小。 這就是為什么我將我的所有模塊復制到項目文件夾中並希望保持它或類似的方式。

我的問題:

是否有針對我的問題的某種解決方法或庫文件夾錯誤的修復。 已經閱讀了一些關於Tao-OpenglOpenTK文章,但找不到一個好的解決方案。

UPDATE1:

使用一個小的pyglet窗口渲染示例更新了我的源代碼。 問題出在pyglet和引用的c-Objects中。 我如何將它們包含在我要調用的c#項目中? 到目前為止還不知道......現在正在試驗。 保持更新。

SampleCode C#:

ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(null);
ScriptRuntime runtime = new ScriptRuntime(setup);
ScriptEngine engine = Python.GetEngine(runtime);

ScriptSource source = engine.CreateScriptSourceFromFile("test.py");
ScriptScope scope = engine.CreateScope();
source.Execute(scope);

SampleCode Python(test.py):

from nodebox.graphics import *
from nodebox.graphics.physics import Vector, Boid, Flock, Obstacle

flock = Flock(50, x=-50, y=-50, width=700, height=400)
flock.sight(80)

def draw(canvas):
    canvas.clear()
    flock.update(separation=0.4, cohesion=0.6, alignment=0.1, teleport=True)
    for boid in flock:
        push()
        translate(boid.x, boid.y)
        scale(0.5 + boid.depth)
        rotate(boid.heading)
        arrow(0, 0, 15)
        pop()

canvas.size = 600, 300

def main(canvas):
    canvas.run(draw)

UPDATE2:

第139行[pyglet / lib.py] sys.platform不是win32 ...有錯誤。 通過使用該行修復它:

from pyglet.gl.lib_wgl import link_GL, link_GLU, link_WGL

現在出現以下錯誤:

'module' object has no attribute '_getframe'

有點痛苦要解決它。 更新結果...

UPDATE3:

通過在C#-Code中的第一行之后添加以下行來修復:

setup.Options["Frames"] = true;

當前問題:

No module named unicodedata ,但在Python26/DLLs中只是一個*.pyd `。 那么..我現在如何實現它?!

UPDATE4:

通過沖浪修復: 鏈接文本並將unicodedata.py'.pyd添加到C#Projectfolder。

當前問題:

'libGL.so not found'...伙計們...我幾乎放棄了節點盒的C#..繼續

Update5:

我放棄了:/ workaround:c#通過xml和filesystemwatchers與nodebox進行通信。 不是最佳的,但案例已解決。

-X:Frames使frame選項成為運行時(它會使代碼慢一點,以便始終可以訪問Python幀)。

要在托管時啟用框架,您只需執行以下操作:

ScriptRuntimeSetup setup = Python.CreateRuntimeSetup(new Dictionary<string, object>() {
    { "Frames", true }
});

而不是你現在傳遞的null。 這只是為選項字典創建一個新的字典,其內容“Frames”設置為true。 您也可以在其中設置其他選項,通常-X:Name選項與命令行相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM