здесь.
Извините, я так опаздываю к игре, но вот как я интегрировал IronPython в приложение C ++ / cli в Visual Studio 2008 - .net 3.5. (на самом деле приложение в смешанном режиме с C / C ++)
Я пишу дополнения к приложению для создания карт, написанному на ассемблере. API доступен для написания надстроек на C / C ++. Я смешиваю C / C ++ с C ++ / cli. Некоторые элементы из этого примера взяты из API (например, XPCALL и CmdEnd () - пожалуйста, просто игнорируйте их)
///////////////////////////////////////////////////////////////////////
void XPCALL PythonCmd2(int Result, int Result1, int Result2)
{
if(Result==X_OK)
{
try
{
String^ filename = gcnew String(txtFileName);
String^ path = Assembly::GetExecutingAssembly()->Location;
ScriptEngine^ engine = Python::CreateEngine();
ScriptScope^ scope = engine->CreateScope();
ScriptSource^ source = engine->CreateScriptSourceFromFile(String::Concat(Path::GetDirectoryName(path), "\\scripts\\", filename + ".py"));
scope->SetVariable("DrawingList", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingList::typeid));
scope->SetVariable("DrawingElement", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingElement::typeid));
scope->SetVariable("DrawingPath", DynamicHelpers::GetPythonTypeFromType(AddIn::DrawingPath::typeid));
scope->SetVariable("Node", DynamicHelpers::GetPythonTypeFromType(AddIn::Node::typeid));
source->Execute(scope);
}
catch(Exception ^e)
{
Console::WriteLine(e->ToString());
CmdEnd();
}
}
else
{
CmdEnd();
}
}
///////////////////////////////////////////////////////////////////////////////
Как видите, я выставляю IronPython некоторые объекты (DrawingList, DrawingElement, DrawingPath & Node). Эти объекты являются объектами C ++ / cli, которые я создал, чтобы представить «вещи» IronPython.
Когда вызывается строка C ++ / cli source-> Execute (scope), единственная строка python
запустить - DrawingList.RequestData.
RequestData принимает делегата и тип данных.
Когда код C ++ / cli готов, он вызывает делегата, указывающего на
функция "бриллиант"
В функции diamond извлекает запрошенные данные при вызове
DrawingList.RequestedValue () Вызов DrawingList.AddElement (dp) добавляет
новый элемент в визуальную базу данных приложений.
И, наконец, вызов DrawingList.EndCommand () сообщает движку FastCAD
очистите и завершите работу плагина.
import clr
def diamond(Result1, Result2, Result3):
if(Result1 == 0):
dp = DrawingPath()
dp.drawingStuff.EntityColor = 2
dp.drawingStuff.SecondEntityColor = 2
n = DrawingList.RequestedValue()
dp.Nodes.Add(Node(n.X-50,n.Y+25))
dp.Nodes.Add(Node(n.X-25,n.Y+50))
dp.Nodes.Add(Node(n.X+25,n.Y+50))
dp.Nodes.Add(Node(n.X+50,n.Y+25))
dp.Nodes.Add(Node(n.X,n.Y-40))
DrawingList.AddElement(dp)
DrawingList.EndCommand()
DrawingList.RequestData(diamond, DrawingList.RequestType.PointType)
Надеюсь, это то, что вы искали.