我想升级(如果是这样的话)一个100-150个国产的Netlogo 4.1.3程序,最好是通过Perl或另一种脚本语言批量升级,然后进行(必要的)手动检查和完成。
令我沮丧的是,Netlogo 6没有打开Netlogo 4文件,所以我升级了其中的几个文件,在Netlogo 5中打开它们,在Netlogo 6中保存和重新打开它们,然后保存它们。不是一种特别优雅的方式。
有什么建议吗?
发布于 2017-02-25 22:55:36
看上去Netlogo 6之所以不读4.1.3文件是因为它需要12节,而4.1.3文件有10或11节。据我所知,部分是由字符串"@#$#@#$#@“分割的。此外,旧的.nlogo文件具有版本6所不理解的“CC窗口”的参数。最后,Net徽标6中的按钮也需要参数化,值为1或0,以确定该按钮是否被禁用,直到滴答开始。
下面的python3代码在同一个文件夹中获取所有网络徽标文件,并删除“CC窗口”行。它还在每个"Button“块的末尾添加了一个1。当代码读取文件时,它会计数"@#$#@#$#@“中断的数量。如果在文件的末尾,只有不到11,那么它就会附加足够的"@#$#@#$#@“中断,使总数达到11。
如果要运行此代码,我将将要更新的旧文件复制到新文件夹中。将.py文件与下面的代码放在同一个文件夹中,当您运行它时,它将为6.0兼容版本创建新的文件(注意到它不会只更新的4.1.3文件,但是会创建该文件夹中的任何net徽标文件< code >e 211)。这并不适用于每个文件--例如,一个文件没有正确更新,因为原始模型的“图形窗口”没有被正确地参数化。尽管如此,这段代码适用于我测试的大多数4.1.3模型库模型。另外,我只知道它允许你打开Netlogo 6中的文件,我不知道在那之后要做些什么来确保模型按照你的预期运行。
希望这能帮上忙!如果我对某些问题不清楚,请告诉我。
import os
with open("files_updated.txt", "w") as files:
for filename in os.listdir("."):
if filename.endswith(".nlogo") and not filename.startswith("6"):
files.write(filename + '\n')
opened = open(filename, "r")
n = 0
printat = -1
cut_count = 0
count_breakers = 0
new_file_name = ("6_"+filename.strip(".txt") + ".nlogo")
print(new_file_name)
with open(new_file_name, "w") as out:
for line in opened:
n += 1
if line == "@#$#@#$#@\n":
count_breakers += 1
if line == "CC-WINDOW\n":
cut_count = 8
cut_count -= 1
if cut_count < 0:
out.write(line)
if line == "BUTTON\n" :
printat = n + 14
if printat == n:
out.write("1\n")
if count_breakers < 11:
out.write("@#$#@#$#@\n" * (11 - count_breakers))发布于 2017-08-02 20:49:24
这是一个简单转换脚本。请随意提出改进建议。
https://stackoverflow.com/questions/42442640
复制相似问题