如何从NetLogo中的扩展创建海龟
我正试图从我的Java扩展中创建海龟。在默认命令原语中,我执行以下操作:如何从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
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);