如何从NetLogo中的扩展创建海龟

如何从NetLogo中的扩展创建海龟,netlogo,Netlogo,我正试图从我的Java扩展中创建海龟。在默认命令原语中,我执行以下操作: public void perform(Argument[] argmnts, Context cntxt) throws ExtensionException, LogoException { try { Manager.world = (World) cntxt.getAgent().world(); Manager.empirical = readNetwork(new Fil

我正试图从我的Java扩展中创建海龟。在默认命令原语中,我执行以下操作:

public void perform(Argument[] argmnts, Context cntxt) throws ExtensionException, LogoException {
    try {
        Manager.world = (World) cntxt.getAgent().world();
        Manager.empirical = readNetwork(new File(filename));
        AgentSet breed = Manager.world.getBreed("TURTLES");
        for(Vertex v:Manager.empirical.getVertices()){
           Turtle turtle = Manager.world.createTurtle(breed);
           turtle.setTurtleOrLinkVariable("NAME", v.getName());
           turtle.setTurtleOrLinkVariable("TYPEOF", v.getTypeof());
           turtle.setTurtleOrLinkVariable("THRESHOLD", v.getThreshold());
           turtle.setTurtleOrLinkVariable("AGE", v.getAge());
        }
    } catch (AgentException ex) {
        throw new ExtensionException("Problem creating turtle " + ex.toString());
    }
}
但在NetLogo中获取此错误:

error (NullPointerException)
while observer running DIFFCER:CREATE-POTTERS
called by procedure SETUP
called by Button 'setup'

NetLogo is unable to supply you with more details about this error. Please report the problem at https://github.com/NetLogo/NetLogo/issues, or to bugs@ccl.northwestern.edu, and paste the contents of this window into your report.

java.lang.NullPointerException
 at org.nlogo.agent.World.getVariablesArraySize(World.java:1191)
 at org.nlogo.agent.Turtle.<init>(Turtle.java:77)
 at org.nlogo.agent.Turtle.<init>(Turtle.java:72)
 at org.nlogo.agent.World.createTurtle(World.java:384)
 at org.nlogo.extensions.diffceram.LoadNetwork.perform(LoadNetwork.java:84)
 at org.nlogo.prim._extern.perform(_extern.java:54)
 at org.nlogo.nvm.Context.stepConcurrent(Context.java:91)
 at org.nlogo.nvm.ConcurrentJob.step(ConcurrentJob.java:82)
 at org.nlogo.job.JobThread.org$nlogo$job$JobThread$$runPrimaryJobs(JobThread.scala:143)
 at org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:78)
 at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76)
 at org.nlogo.job.JobThread$$anonfun$run$1.apply(JobThread.scala:76)
 at scala.util.control.Exception$Catch.apply(Exception.scala:88)
 at org.nlogo.util.Exceptions$.handling(Exceptions.scala:41)
 at org.nlogo.job.JobThread.run(JobThread.scala:75)

NetLogo 5.2.0
main: org.nlogo.app.AppFrame
thread: JobThread
Java HotSpot(TM) 64-Bit Server VM 1.6.0_65 (Apple Inc.; 1.6.0_65-b14-466.1-11M4716)
operating system: Mac OS X 10.10.3 (x86_64 processor)
Scala version 2.9.2
JOGL: (3D View not initialized)
OpenGL Graphics: (3D View not initialized)
错误(NullPointerException)
观察者运行DIFFCER时:创建POTTERS
由过程设置调用
通过“设置”按钮调用
NetLogo无法向您提供有关此错误的详细信息。请在以下地址报告问题:https://github.com/NetLogo/NetLogo/issues,或bugs@ccl.northwestern.edu,并将此窗口的内容粘贴到报告中。
java.lang.NullPointerException
位于org.nlogo.agent.World.getVariablesArraySize(World.java:1191)
在org.nlogo.agent.Turtle上
在org.nlogo.agent.Turtle上
位于org.nlogo.agent.World.createTurtle(World.java:384)
位于org.nlogo.extensions.diffceram.LoadNetwork.perform(LoadNetwork.java:84)
在org.nlogo.prim.\u extern.perform(\u extern.java:54)
位于org.nlogo.nvm.Context.stepConcurrent(Context.java:91)
位于org.nlogo.nvm.ConcurrentJob.step(ConcurrentJob.java:82)
在org.nlogo.job.JobThread.org$nlogo$job$JobThread$$runPrimaryJobs(JobThread.scala:143)
在org.nlogo.job.JobThread$$anonfun$run$1.apply$mcV$sp(JobThread.scala:78)
在org.nlogo.job.JobThread$$anonfun$run$1.apply上(JobThread.scala:76)
在org.nlogo.job.JobThread$$anonfun$run$1.apply上(JobThread.scala:76)
在scala.util.control.Exception$Catch.apply处(Exception.scala:88)
在org.nlogo.util.Exceptions$.handling上(Exceptions.scala:41)
在org.nlogo.job.JobThread.run上(JobThread.scala:75)
NetLogo 5.2.0
主要:org.nlogo.app.AppFrame
线程:作业线程
Java HotSpot(TM)64位服务器VM 1.6.0_65(苹果公司;1.6.0_65-b14-466.1-11M4716)
操作系统:Mac OS X 10.10.3(x86_64处理器)
Scala版本2.9.2
JOGL:(三维视图未初始化)
OpenGL图形:(三维视图未初始化)

为了避免这个错误,我遗漏了什么?

我用以下代码回答了我的问题:

world = (World) cntxt.getAgent().world();
// in my case, I start with a network
empirical = readNetwork(new File(filename));
AgentSet agentset = new org.nlogo.agent.ArrayAgentSet(Turtle.class, Manager.empirical.getVertexCount(), false, Manager.world);
AgentSet breed = Manager.world.turtles();
// add a turtle for every node that I have in the network
for(Vertex v:Manager.empirical.getVertices()){
    Turtle turtle = Manager.world.createTurtle(breed);
    turtle.setTurtleOrLinkVariable("NAME", v.getName());
    turtle.setTurtleOrLinkVariable("TYPEOF", v.getTypeof());
    turtle.setTurtleOrLinkVariable("THRESHOLD", v.getThreshold());
    turtle.setTurtleOrLinkVariable("AGE", v.getAge());
    turtle.setTurtleOrLinkVariable("XCOR", rescaleX(v.getX()));
    turtle.setTurtleOrLinkVariable("YCOR", rescaleY(v.getY()));
    turtle.setTurtleOrLinkVariable("RELIGION", v.getReligion());
    // you add as many variable you have then
    agentset.add(turtle); 
}

@Sethtue我让它工作了,但这是正确的方法吗?我这样问是因为如果我这样做,我仍然会经历不可复制的跑步。。。所有的海龟都是没有错误的,但是我有什么遗漏吗?当我把它与之比较时,我觉得你在做同样的事情,所以这对我来说是正确的。(好吧,有一点是遗漏的:您没有将每个新的turtle传递到
工作区。JoinForerButtons
。但这只在使用turtle forever按钮的型号中起作用,这是一种晦涩且不受支持的NetLogo功能。)谢谢,我这边缺乏Scala知识。。。如何在Java扩展中获得“工作区”?最重要的是,我如何在Java中复制“context.runExclusiveJob(agentset,next);”?
runExclusiveJob
是运行
create-turtles
的主体,它是海龟的初始化命令。如果你的原语没有,那么你就不需要那个部分。至于对工作区的访问,请参见,例如,实际上我可以指定:extensionContext ec=(extensionContext)cnText;ec.nvmContext().runExclusiveJob(代理集,1);