我试图通过扩展程序访问NetLogo模型中的ExtensionManager
对象。 ExtensionManager
可以访问我想要在外部操作的模型的许多部分,例如PlotManager。
我可以将代理或补丁作为参数传递到扩展程序中,然后可以访问World
,Observer
和Program
。但是,这些似乎都没有提供回ExtensionManager
的路径。
我还试图从控制扩展程序的ExtensionManager
和执行扩展程序代码的DefaultClassManager
访问DefaultCommand
。
以下是尝试重置界面上的绘图的示例:
import org.nlogo.api.*;
public class PlotExtensionManager extends DefaultClassManager{
public void load(PrimitiveManager primitiveManager) throws ExtensionException {
primitiveManager.addPrimitive("reset-plot", new ResetPlot());
}
public static class ResetPlot extends DefaultCommand{
public Syntax getSyntax() {
return Syntax.commandSyntax(new int[] { Syntax.StringType(), Syntax.PatchType()});
}
public String getAgentClassString() {
return "OTPL";
}
public void perform(Argument[] args, Context context)
throws ExtensionException, LogoException {
// take in a plotname as a String and a single path (patch 0 0) to access the Model
String plotName = (String) args[0].get();
org.nlogo.agent.Patch patch = (org.nlogo.agent.Patch) args[1].get();
org.nlogo.agent.World world = patch.world();
org.nlogo.agent.Observer observer = world.observer();
org.nlogo.api.Program program = world.program();
// how to access plot on interface and gain control over it?
// looking for access to ExtensionManager object
}
}
}
答案 0 :(得分:1)
你可以get it from the workspace。可以通过将上下文转换为org.nlogo.nvm.ExtensionContext
并使用context.workspace()
从上下文中获取工作空间。所以Java中的代码是:
((ExtensionContext) context).workspace().getExtensionManager()
只是为了警告你,这些都不在扩展API中,因此可能会随着未来的NetLogo版本而改变。