You can subscribe to this list here.
2007 |
Jan
|
Feb
(3) |
Mar
|
Apr
|
May
|
Jun
(64) |
Jul
(77) |
Aug
(21) |
Sep
(15) |
Oct
(3) |
Nov
(4) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(1) |
Feb
|
Mar
(12) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
(3) |
Dec
|
From: <ror...@us...> - 2007-07-27 12:51:37
|
Revision: 133 http://roreditor.svn.sourceforge.net/roreditor/?rev=133&view=rev Author: rorthomas Date: 2007-07-27 05:51:32 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * reordered directory structure Modified Paths: -------------- trunk/devtools/setup/setup.nsi trunk/rortoolkit.bat trunk/terraineditor.bat trunk/truckeditor.bat Added Paths: ----------- trunk/terraineditor.pyw trunk/tools/3rdparty/ trunk/tools/3rdparty/dxwebsetup.exe trunk/tools/3rdparty/graphviz-2.12.exe trunk/tools/3rdparty/pyparsing-1.4.6.win32.exe trunk/tools/3rdparty/pywin32-setup.exe trunk/tools/checkmods.bat trunk/tools/checkmods.py trunk/tools/depchecker.bat trunk/tools/depchecker.py trunk/tools/postinstall.bat trunk/tools/postinstall.py trunk/tools/update.bat trunk/tools/update.py trunk/tools/updaterestart.bat trunk/tools/updaterestart.py trunk/truckeditor.pyw Removed Paths: ------------- trunk/checkmods.bat trunk/checkmods.py trunk/depchecker.bat trunk/depchecker.py trunk/postinstall.bat trunk/postinstall.py trunk/rortoolkit.py trunk/terraineditor.py trunk/tools/dxwebsetup.exe trunk/tools/graphviz-2.12.exe trunk/tools/pyparsing-1.4.6.win32.exe trunk/tools/pywin32-setup.exe trunk/truckeditor.py trunk/update.bat trunk/update.py trunk/updaterestart.bat trunk/updaterestart.py Deleted: trunk/checkmods.bat =================================================================== --- trunk/checkmods.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/checkmods.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1,2 +0,0 @@ -...@po...t checkmods -@%systemdrive%\python25\python.exe checkmods.py %* \ No newline at end of file Deleted: trunk/checkmods.py =================================================================== --- trunk/checkmods.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/checkmods.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,45 +0,0 @@ -import os.path, sys, installmod, time - -sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) -from ror.logger import log -from ror.settingsManager import getSettingsManager - -def getFiles(top): - fl = {} - for root, dirs, files in os.walk(top): - for f in files: - fn = os.path.join(root, f) - fl[fn] = {} - for fk in fl.keys(): - log().info("%10s %s" % ("", os.path.basename(fk))) - - log().info("found %d files!" % (len(fl.keys()))) - return fl - -def main(): - dir = sys.argv[1] - mode = sys.argv[2] - files = getFiles(dir) - valid={} - counter = 0 - countervalid = 0 - for file in files.keys(): - log().info("## %s (%d/%d)##################################" % (os.path.basename(file), counter, len(files))) - counter += 1 - mods = installmod.work(mode, file, verbose=(len(sys.argv)== 4 and sys.argv[3] == "--verbose"), dryrun=True) - if len(mods) == 0: - log().info("!!! INVALID: "+ os.path.basename(file)) - else: - log().info("VALID: "+ os.path.basename(file)) - valid[file] = mods - log().info("#######################################################################") - time.sleep(0.01) - log().info("===========================================================") - log().info("===== FINISHED found, valid mods:") - for f in valid.keys(): - log().info( f + str(valid[f])) - log().info("%d of %d files containing valid mods!" % (len(valid), len(files))) - - -if __name__=="__main__": - main() \ No newline at end of file Deleted: trunk/depchecker.bat =================================================================== --- trunk/depchecker.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/depchecker.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1,2 +0,0 @@ -...@po...t depchecker -@%systemdrive%\python25\python.exe depchecker.py %* \ No newline at end of file Deleted: trunk/depchecker.py =================================================================== --- trunk/depchecker.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/depchecker.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,56 +0,0 @@ -#Thomas Fischer 31/05/2007, th...@th... -import sys, os, os.path - -def usage(): - print "usage: %s <path to inspect> <all or unused or missing>" % os.path.basename(sys.argv[0]) - print "for example: %s c:\\ror\\data missing" % os.path.basename(sys.argv[0]) - print " valid modes:" - print " 'all' displays all dependencies, inclusive fulfilled ones" - print " 'missing' displays only unfulfilled dependencies" - print " 'unused' displays resources that are not in use" - print " 'dtree <resourcename>' displays the dependency tree of the given resource name" - print " 'md5sum' creates the md5sums of all files" - sys.exit(0) - - -def main(): - """ - main method - """ - - sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) - import ror.settingsManager - path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isfile(os.path.join(path,"RoR.exe")): - import ror.starter - ror.starter.startApp() - - # Import Psyco if available - try: - import psyco - psyco.full() - except ImportError: - pass - - if len(sys.argv) < 3: - usage() - path = sys.argv[1] - if path.strip() == "rordir": - path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isdir(path): - print "%s is not a valid directory!" % path - usage() - if (len(sys.argv) == 3 and sys.argv[2] in ['all', 'missing', 'unused', 'record']) or (len(sys.argv) == 4 and sys.argv[2] in ['dtree']): - pass - else: - print "%s is not a valid mode, or incorrect arguments!" % sys.argv[2] - usage() - - import ror.depchecker - dependfilename = "" - if len(sys.argv) == 4 and sys.argv[2] in ['dtree'] and sys.argv[3].strip() != "": - dependfilename = sys.argv[3].strip() - ror.depchecker.RoRDepChecker(path , sys.argv[2], dependfilename) - -if __name__=="__main__": - main() \ No newline at end of file Modified: trunk/devtools/setup/setup.nsi =================================================================== --- trunk/devtools/setup/setup.nsi 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/devtools/setup/setup.nsi 2007-07-27 12:51:32 UTC (rev 133) @@ -150,7 +150,7 @@ Function InstallDirectX InitPluginsDir - File /oname=$PLUGINSDIR\dxwebsetup.exe "tools\dxwebsetup.exe" + File /oname=$PLUGINSDIR\dxwebsetup.exe "..\..\tools\3rdparty\dxwebsetup.exe" Banner::show /NOUNLOAD "Installing lastest DirectX ..." ExecWait '"$PLUGINSDIR\dxwebsetup.exe /Q"' Delete $PLUGINSDIR\dxwebsetup.exe @@ -160,7 +160,7 @@ Function InstallPyWin32 InitPluginsDir - File /oname=$PLUGINSDIR\pywin32-setup.exe "tools\pywin32-setup.exe" + File /oname=$PLUGINSDIR\pywin32-setup.exe "..\..\tools\3rdparty\pywin32-setup.exe" Banner::show /NOUNLOAD "Installing Python for Windows ..." ExecWait '"$PLUGINSDIR\pywin32-setup.exe"' Delete $PLUGINSDIR\pywin32-setup.exe @@ -169,7 +169,7 @@ Function InstallPyParsing InitPluginsDir - File /oname=$PLUGINSDIR\pyparsing-1.4.6.win32.exe "tools\pyparsing-1.4.6.win32.exe" + File /oname=$PLUGINSDIR\pyparsing-1.4.6.win32.exe "..\..\tools\3rdparty\pyparsing-1.4.6.win32.exe" Banner::show /NOUNLOAD "Installing PyParsing Python Module ..." ExecWait '"$PLUGINSDIR\pyparsing-1.4.6.win32.exe"' Delete $PLUGINSDIR\pyparsing-1.4.6.win32.exe @@ -178,7 +178,7 @@ Function InstallGraphViz InitPluginsDir - File /oname=$PLUGINSDIR\graphviz-2.12.exe "tools\graphviz-2.12.exe" + File /oname=$PLUGINSDIR\graphviz-2.12.exe "..\..\tools\3rdparty\graphviz-2.12.exe" Banner::show /NOUNLOAD "Installing Graphviz for Windows ..." ExecWait '"$PLUGINSDIR\graphviz-2.12.exe"' Delete $PLUGINSDIR\graphviz-2.12.exe @@ -222,7 +222,7 @@ WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" CreateDirectory "$SMPROGRAMS\RoRToolkit" # CreateShortCut "$SMPROGRAMS\RoRToolkit\RoR Truck Editor.lnk" "$INSTDIR\terraineditor.bat" "" "$INSTDIR\ror.ico" - CreateShortCut "$SMPROGRAMS\RoRToolkit\RoR Toolkit.lnk" "$INSTDIR\rortoolkit.bat" "" "$INSTDIR\ror.ico" + CreateShortCut "$SMPROGRAMS\RoRToolkit\RoR Toolkit.lnk" "%systemdrive%\python25\pythonw.exe $INSTDIR\rortoolkit.pyw" "" "$INSTDIR\ror.ico" CreateShortCut "$SMPROGRAMS\RoRToolkit\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" CreateShortCut "$SMPROGRAMS\RoRToolkit\Uninstall.lnk" "$INSTDIR\uninst.exe" SectionEnd Deleted: trunk/postinstall.bat =================================================================== --- trunk/postinstall.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/postinstall.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1 +0,0 @@ -@%systemdrive%\python25\python.exe postinstall.py %* \ No newline at end of file Deleted: trunk/postinstall.py =================================================================== --- trunk/postinstall.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/postinstall.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,34 +0,0 @@ -import sys, os, os.path, subprocess - -def getBATFiles(): - batfiles = [] - dir = os.path.dirname(os.path.abspath(__file__)) - for filename in os.listdir(dir): - filenameonly, extension = os.path.splitext(filename) - if extension.lower() == ".bat": - batfiles.append(os.path.join(dir, filename)) - return batfiles - -def saveFile(filename, lines): - f = open(filename, 'w') - f.writelines(lines) - f.close() - -def addPath(filename, installpath): - basename = os.path.basename(filename) - filenameonly, extension = os.path.splitext(basename) - thispath = os.path.join(installpath, filenameonly+".py") - pythonpath = "%systemdrive%\python25\pythonw.exe" - content = ["@%s %s %%*" % (pythonpath, thispath)] - saveFile(filename, content) - -def main(): - installpath = os.path.dirname(os.path.abspath(__file__)) - for batfile in getBATFiles(): - addPath(batfile, installpath) - print "Post-Installed all .bat files, please restart the program now!" - cmd = os.path.join(installpath, sys.argv[1]+".bat") - subprocess.Popen(cmd, shell = True) - -if __name__=="__main__": - main() Modified: trunk/rortoolkit.bat =================================================================== --- trunk/rortoolkit.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/rortoolkit.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1,2 +1,2 @@ -...@po...t rortoolkit -@%systemdrive%\python25\python.exe rortoolkit.py %* \ No newline at end of file +@tools\postinstall.bat rortoolkit +@%systemdrive%\python25\pythonw.exe rortoolkit.pyw %* \ No newline at end of file Deleted: trunk/rortoolkit.py =================================================================== --- trunk/rortoolkit.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/rortoolkit.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,25 +0,0 @@ -#Thomas Fischer 31/05/2007, th...@th... -import sys, os, os.path - -def main(): - """ - main method - """ - - sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) - - # Import Psyco if available - try: - import psyco - #psyco.full() - #psyco.log() - #psyco.profile() - except ImportError: - pass - - import ror.starter - ror.starter.startApp() - - -if __name__=="__main__": - main() \ No newline at end of file Modified: trunk/terraineditor.bat =================================================================== --- trunk/terraineditor.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/terraineditor.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1,2 +1,2 @@ @postinstall.bat terraineditor -@%systemdrive%\python25\python.exe terraineditor.py %* \ No newline at end of file +@%systemdrive%\python25\pythonw.exe terraineditor.pyw %* \ No newline at end of file Deleted: trunk/terraineditor.py =================================================================== --- trunk/terraineditor.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/terraineditor.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,28 +0,0 @@ -#Thomas Fischer 31/05/2007, th...@th... -import sys, os, os.path - -def main(): - """ - main method - """ - - sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) - import ror.settingsManager - path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isfile(os.path.join(path,"RoR.exe")): - import ror.starter - ror.starter.startApp() - - # Import Psyco if available - try: - import psyco - psyco.full() - except ImportError: - pass - - import rorterraineditor.MainFrame - rorterraineditor.MainFrame.startApp() - - -if __name__=="__main__": - main() \ No newline at end of file Copied: trunk/terraineditor.pyw (from rev 131, trunk/terraineditor.py) =================================================================== --- trunk/terraineditor.pyw (rev 0) +++ trunk/terraineditor.pyw 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,28 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path + +def main(): + """ + main method + """ + + sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) + import ror.settingsManager + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(path,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + + import rorterraineditor.MainFrame + rorterraineditor.MainFrame.startApp() + + +if __name__=="__main__": + main() \ No newline at end of file Added: trunk/tools/3rdparty/dxwebsetup.exe =================================================================== (Binary files differ) Property changes on: trunk/tools/3rdparty/dxwebsetup.exe ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/tools/3rdparty/graphviz-2.12.exe =================================================================== (Binary files differ) Property changes on: trunk/tools/3rdparty/graphviz-2.12.exe ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/tools/3rdparty/pyparsing-1.4.6.win32.exe =================================================================== (Binary files differ) Property changes on: trunk/tools/3rdparty/pyparsing-1.4.6.win32.exe ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/tools/3rdparty/pywin32-setup.exe =================================================================== (Binary files differ) Property changes on: trunk/tools/3rdparty/pywin32-setup.exe ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/tools/checkmods.bat =================================================================== --- trunk/tools/checkmods.bat (rev 0) +++ trunk/tools/checkmods.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,2 @@ +...@po...t checkmods +@%systemdrive%\python25\python.exe checkmods.py %* \ No newline at end of file Added: trunk/tools/checkmods.py =================================================================== --- trunk/tools/checkmods.py (rev 0) +++ trunk/tools/checkmods.py 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,45 @@ +import os.path, sys, installmod, time + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "lib")) +from ror.logger import log +from ror.settingsManager import getSettingsManager + +def getFiles(top): + fl = {} + for root, dirs, files in os.walk(top): + for f in files: + fn = os.path.join(root, f) + fl[fn] = {} + for fk in fl.keys(): + log().info("%10s %s" % ("", os.path.basename(fk))) + + log().info("found %d files!" % (len(fl.keys()))) + return fl + +def main(): + dir = sys.argv[1] + mode = sys.argv[2] + files = getFiles(dir) + valid={} + counter = 0 + countervalid = 0 + for file in files.keys(): + log().info("## %s (%d/%d)##################################" % (os.path.basename(file), counter, len(files))) + counter += 1 + mods = installmod.work(mode, file, verbose=(len(sys.argv)== 4 and sys.argv[3] == "--verbose"), dryrun=True) + if len(mods) == 0: + log().info("!!! INVALID: "+ os.path.basename(file)) + else: + log().info("VALID: "+ os.path.basename(file)) + valid[file] = mods + log().info("#######################################################################") + time.sleep(0.01) + log().info("===========================================================") + log().info("===== FINISHED found, valid mods:") + for f in valid.keys(): + log().info( f + str(valid[f])) + log().info("%d of %d files containing valid mods!" % (len(valid), len(files))) + + +if __name__=="__main__": + main() \ No newline at end of file Added: trunk/tools/depchecker.bat =================================================================== --- trunk/tools/depchecker.bat (rev 0) +++ trunk/tools/depchecker.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,2 @@ +...@po...t depchecker +@%systemdrive%\python25\python.exe depchecker.py %* \ No newline at end of file Added: trunk/tools/depchecker.py =================================================================== --- trunk/tools/depchecker.py (rev 0) +++ trunk/tools/depchecker.py 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,56 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path + +def usage(): + print "usage: %s <path to inspect> <all or unused or missing>" % os.path.basename(sys.argv[0]) + print "for example: %s c:\\ror\\data missing" % os.path.basename(sys.argv[0]) + print " valid modes:" + print " 'all' displays all dependencies, inclusive fulfilled ones" + print " 'missing' displays only unfulfilled dependencies" + print " 'unused' displays resources that are not in use" + print " 'dtree <resourcename>' displays the dependency tree of the given resource name" + print " 'md5sum' creates the md5sums of all files" + sys.exit(0) + + +def main(): + """ + main method + """ + + sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "lib")) + import ror.settingsManager + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(path,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + + if len(sys.argv) < 3: + usage() + path = sys.argv[1] + if path.strip() == "rordir": + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isdir(path): + print "%s is not a valid directory!" % path + usage() + if (len(sys.argv) == 3 and sys.argv[2] in ['all', 'missing', 'unused', 'record']) or (len(sys.argv) == 4 and sys.argv[2] in ['dtree']): + pass + else: + print "%s is not a valid mode, or incorrect arguments!" % sys.argv[2] + usage() + + import ror.depchecker + dependfilename = "" + if len(sys.argv) == 4 and sys.argv[2] in ['dtree'] and sys.argv[3].strip() != "": + dependfilename = sys.argv[3].strip() + ror.depchecker.RoRDepChecker(path , sys.argv[2], dependfilename) + +if __name__=="__main__": + main() \ No newline at end of file Deleted: trunk/tools/dxwebsetup.exe =================================================================== (Binary files differ) Deleted: trunk/tools/graphviz-2.12.exe =================================================================== (Binary files differ) Added: trunk/tools/postinstall.bat =================================================================== --- trunk/tools/postinstall.bat (rev 0) +++ trunk/tools/postinstall.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1 @@ +@%systemdrive%\python25\python.exe postinstall.py %* \ No newline at end of file Added: trunk/tools/postinstall.py =================================================================== --- trunk/tools/postinstall.py (rev 0) +++ trunk/tools/postinstall.py 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,36 @@ +import sys, os, os.path, subprocess + +def getBATFiles(): + batfiles = [] + dir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")) + for filename in os.listdir(dir): + filenameonly, extension = os.path.splitext(filename) + if extension.lower() == ".bat": + batfiles.append(os.path.join(dir, filename)) + return batfiles + +def saveFile(filename, lines): + f = open(filename, 'w') + f.writelines(lines) + f.close() + +def addPath(filename, installpath): + basename = os.path.basename(filename) + filenameonly, extension = os.path.splitext(basename) + thispath = os.path.join(installpath, filenameonly+".py") + if not os.path.isfile(thispath): + thispath = os.path.join(installpath, filenameonly+".pyw") + pythonpath = "%systemdrive%\python25\pythonw.exe" + content = ["@%s %s %%*" % (pythonpath, thispath)] + saveFile(filename, content) + +def main(): + installpath = os.path.dirname(os.path.abspath(__file__)) + for batfile in getBATFiles(): + addPath(batfile, installpath) + print "Post-Installed all .bat files, please restart the program now!" + cmd = os.path.join(installpath, sys.argv[1]+".bat") + subprocess.Popen(cmd, shell = True) + +if __name__=="__main__": + main() Deleted: trunk/tools/pyparsing-1.4.6.win32.exe =================================================================== (Binary files differ) Deleted: trunk/tools/pywin32-setup.exe =================================================================== (Binary files differ) Added: trunk/tools/update.bat =================================================================== --- trunk/tools/update.bat (rev 0) +++ trunk/tools/update.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,2 @@ +...@po...t update +@%systemdrive%\python25\python.exe update.py %* \ No newline at end of file Added: trunk/tools/update.py =================================================================== --- trunk/tools/update.py (rev 0) +++ trunk/tools/update.py 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,21 @@ +import sys, os, os.path + +def main(): + sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "lib")) + guiVersion = True + if guiVersion: + import wx + + MainApp = wx.PySimpleApp(0) + wx.InitAllImageHandlers() #you may or may not need this + + import ror.svngui + gui = ror.svngui.svnUpdate(False) + del gui + else: + #non-gui version: + import ror.svn + ror.svn.run() + +if __name__=="__main__": + main() \ No newline at end of file Added: trunk/tools/updaterestart.bat =================================================================== --- trunk/tools/updaterestart.bat (rev 0) +++ trunk/tools/updaterestart.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,2 @@ +...@po...t updaterestart +@%systemdrive%\python25\python.exe updaterestart.py %* \ No newline at end of file Added: trunk/tools/updaterestart.py =================================================================== --- trunk/tools/updaterestart.py (rev 0) +++ trunk/tools/updaterestart.py 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,12 @@ +import sys, os, os.path +from subprocess import Popen + +def main(): + import time + time.sleep(1) + path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "rortoolkit.bat") + p = Popen(path, shell = True) + sys.exit(0) + +if __name__=="__main__": + main() \ No newline at end of file Modified: trunk/truckeditor.bat =================================================================== --- trunk/truckeditor.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/truckeditor.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1,2 +1,2 @@ -...@po...t truckeditor -@%systemdrive%\python25\python.exe truckeditor.py %* \ No newline at end of file +@tools\postinstall.bat truckeditor +@%systemdrive%\python25\pythonw.exe truckeditor.pyw %* \ No newline at end of file Deleted: trunk/truckeditor.py =================================================================== --- trunk/truckeditor.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/truckeditor.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,28 +0,0 @@ -#Thomas Fischer 31/05/2007, th...@th... -import sys, os, os.path - -def main(): - """ - main method - """ - - sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) - import ror.settingsManager - path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isfile(os.path.join(path,"RoR.exe")): - import ror.starter - ror.starter.startApp() - - # Import Psyco if available - try: - import psyco - psyco.full() - except ImportError: - pass - - import rortruckeditor.MainFrame - rortruckeditor.MainFrame.startApp() - - -if __name__=="__main__": - main() \ No newline at end of file Copied: trunk/truckeditor.pyw (from rev 131, trunk/truckeditor.py) =================================================================== --- trunk/truckeditor.pyw (rev 0) +++ trunk/truckeditor.pyw 2007-07-27 12:51:32 UTC (rev 133) @@ -0,0 +1,28 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path + +def main(): + """ + main method + """ + + sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) + import ror.settingsManager + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(path,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + + import rortruckeditor.MainFrame + rortruckeditor.MainFrame.startApp() + + +if __name__=="__main__": + main() \ No newline at end of file Deleted: trunk/update.bat =================================================================== --- trunk/update.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/update.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1,2 +0,0 @@ -...@po...t update -@%systemdrive%\python25\python.exe update.py %* \ No newline at end of file Deleted: trunk/update.py =================================================================== --- trunk/update.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/update.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,21 +0,0 @@ -import sys, os, os.path - -def main(): - sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) - guiVersion = True - if guiVersion: - import wx - - MainApp = wx.PySimpleApp(0) - wx.InitAllImageHandlers() #you may or may not need this - - import ror.svngui - gui = ror.svngui.svnUpdate(False) - del gui - else: - #non-gui version: - import ror.svn - ror.svn.run() - -if __name__=="__main__": - main() \ No newline at end of file Deleted: trunk/updaterestart.bat =================================================================== --- trunk/updaterestart.bat 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/updaterestart.bat 2007-07-27 12:51:32 UTC (rev 133) @@ -1,2 +0,0 @@ -...@po...t updaterestart -@%systemdrive%\python25\python.exe updaterestart.py %* \ No newline at end of file Deleted: trunk/updaterestart.py =================================================================== --- trunk/updaterestart.py 2007-07-27 12:29:13 UTC (rev 132) +++ trunk/updaterestart.py 2007-07-27 12:51:32 UTC (rev 133) @@ -1,12 +0,0 @@ -import sys, os, os.path -from subprocess import Popen - -def main(): - import time - time.sleep(1) - path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "rortoolkit.bat") - p = Popen(path, shell = True) - sys.exit(0) - -if __name__=="__main__": - main() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 12:29:16
|
Revision: 132 http://roreditor.svn.sourceforge.net/roreditor/?rev=132&view=rev Author: rorthomas Date: 2007-07-27 05:29:13 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * moved setup to separate folder * added python file extension .reg file Modified Paths: -------------- trunk/postinstall.py Added Paths: ----------- trunk/devtools/python.reg trunk/devtools/setup/ trunk/devtools/setup/readme-installer.txt trunk/devtools/setup/setup.nsi trunk/devtools/setup/splash.bmp Removed Paths: ------------- trunk/readme-installer.txt trunk/setup.nsi trunk/splash.bmp trunk/testunrar.py trunk/testunzip.py Added: trunk/devtools/python.reg =================================================================== (Binary files differ) Property changes on: trunk/devtools/python.reg ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/devtools/setup/readme-installer.txt =================================================================== --- trunk/devtools/setup/readme-installer.txt (rev 0) +++ trunk/devtools/setup/readme-installer.txt 2007-07-27 12:29:13 UTC (rev 132) @@ -0,0 +1,2 @@ +have fun and report bugs and feature requests! :) +http://forum.rigsofrods.com \ No newline at end of file Added: trunk/devtools/setup/setup.nsi =================================================================== --- trunk/devtools/setup/setup.nsi (rev 0) +++ trunk/devtools/setup/setup.nsi 2007-07-27 12:29:13 UTC (rev 132) @@ -0,0 +1,262 @@ +; Script generated by the HM NIS Edit Script Wizard. + +; HM NIS Edit Wizard helper defines +!define PRODUCT_NAME "RoRToolkit" +!define PRODUCT_VERSION "r105" +!define PRODUCT_PUBLISHER "Thomas Fischer" +!define PRODUCT_WEB_SITE "http://wiki.rigsofrods.com/index.php?title=RoRToolkit" +!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" +!define PRODUCT_UNINST_ROOT_KEY "HKLM" + +!define PYTHONVERSION "2.5" +!define PYTHONDLURL "http://python.org/ftp/python/2.5.1/python-2.5.1.msi" +!define PYTHONDLFN "python-2.5.1.msi" + +SetCompressor lzma + +BrandingText "Rigs of Rods Toolkit" +InstProgressFlags smooth colored +XPStyle on +ShowInstDetails show +ShowUninstDetails show +SetDateSave on +#SetDatablockOptimize on +CRCCheck on +#SilentInstall normal + +; MUI 1.67 compatible ------ +!include "MUI.nsh" +!include "LogicLib.nsh" + +; MUI Settings +!define MUI_ABORTWARNING +!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-blue.ico" +!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue.ico" + +; Language Selection Dialog Settings +!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" +!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" +!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" + +; Welcome page +!insertmacro MUI_PAGE_WELCOME +; License page +!insertmacro MUI_PAGE_LICENSE "readme-installer.txt" +; Directory page +!insertmacro MUI_PAGE_DIRECTORY +; Instfiles page +!insertmacro MUI_PAGE_INSTFILES +; Finish page +;!define MUI_FINISHPAGE_RUN "$INSTDIR\rortoolkit.bat" +;!define MUI_FINISHPAGE_RUN_PARAMETERS "" +#!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\Example.file" + +!define MUI_FINISHPAGE_NOAUTOCLOSE +!define MUI_FINISHPAGE_RUN +!define MUI_FINISHPAGE_RUN_NOTCHECKED +!define MUI_FINISHPAGE_RUN_TEXT "Update and start (Can take some time)" +!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchPostInstallation" +!insertmacro MUI_PAGE_FINISH + +; Uninstaller pages +!insertmacro MUI_UNPAGE_INSTFILES + +; Language files +!insertmacro MUI_LANGUAGE "English" +!insertmacro MUI_LANGUAGE "French" +!insertmacro MUI_LANGUAGE "German" +!insertmacro MUI_LANGUAGE "Spanish" +!insertmacro MUI_LANGUAGE "Polish" +!insertmacro MUI_LANGUAGE "Russian" +!insertmacro MUI_LANGUAGE "Ukrainian" +!insertmacro MUI_LANGUAGE "Finnish" +!insertmacro MUI_LANGUAGE "Czech" +!insertmacro MUI_LANGUAGE "Italian" + +; Reserve files +!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS + +; MUI end ------ + +Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" +OutFile "RoRToolkitSetup.exe" +;InstallDir "$PROGRAMFILES\RoRToolkit" +InstallDir "c:\rortoolkit" +ShowInstDetails show +ShowUnInstDetails show + +Var /GLOBAL PYOK +Var /GLOBAL PYPATH +Var /GLOBAL PYINSTALLED + +Function DetectPython + ReadRegStr $R6 HKCU "SOFTWARE\Python\PythonCore\${PYTHONVERSION}\InstallPath" "" + ${If} $R6 == '' + ReadRegStr $R6 HKLM "SOFTWARE\Python\PythonCore\${PYTHONVERSION}\InstallPath" "" + ${If} $R6 == '' + Push "No registry key found" + Push "NOK" + Return + ${EndIf} + ${EndIf} + + ${If} ${FileExists} "$R6\python.exe" + Push "$R6" + Push "OK" + ${Else} + Push "No python.exe found" + Push "NOK" + ${EndIf} +FunctionEnd + +Function CheckForPython + Banner::show /NOUNLOAD "Checking for Python ${PYTHONVERSION} ..." + StrCpy $PYINSTALLED "" + Call DetectPython + Pop $PYOK + Pop $PYPATH + Banner::destroy + ${If} $PYOK == 'OK' + DetailPrint "Detected Python ${PYTHONVERSION}!" + Return + ${Else} + MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION "The installer cannot find Python ${PYTHONVERSION}!$\r$\nWould you like the installer to download and install Python ${PYTHONVERSION} for you?" IDNO abort IDCANCEL abort + DetailPrint "Downloading ${PYTHONDLURL}..." + + NSISdl::download ${PYTHONDLURL} ${PYTHONDLFN} + Pop $R0 ;Get the return value + StrCmp $R0 "success" dlok abort + dlok: + DetailPrint "Installing Python ${PYTHONVERSION}..." + ExecWait '"msiExec" /q /i "${PYTHONDLFN}"' + StrCpy $PYINSTALLED "" + Call DetectPython + Pop $PYOK + Pop $PYPATH + ${If} $PYOK == 'OK' + DetailPrint "Detected Python ${PYTHONVERSION}!" + Return + ${Else} + MessageBox MB_OK "Python ${PYTHONVERSION} installation failed! Please install by hand and restart this installation!" + Abort + ${EndIf} + Return + ${EndIf} + Return + abort: + MessageBox MB_OK "Please install Python ${PYTHONVERSION} and retry this installation!" + Abort +FunctionEnd + +Function InstallDirectX + InitPluginsDir + File /oname=$PLUGINSDIR\dxwebsetup.exe "tools\dxwebsetup.exe" + Banner::show /NOUNLOAD "Installing lastest DirectX ..." + ExecWait '"$PLUGINSDIR\dxwebsetup.exe /Q"' + Delete $PLUGINSDIR\dxwebsetup.exe + Banner::destroy +FunctionEnd + + +Function InstallPyWin32 + InitPluginsDir + File /oname=$PLUGINSDIR\pywin32-setup.exe "tools\pywin32-setup.exe" + Banner::show /NOUNLOAD "Installing Python for Windows ..." + ExecWait '"$PLUGINSDIR\pywin32-setup.exe"' + Delete $PLUGINSDIR\pywin32-setup.exe + Banner::destroy +FunctionEnd + +Function InstallPyParsing + InitPluginsDir + File /oname=$PLUGINSDIR\pyparsing-1.4.6.win32.exe "tools\pyparsing-1.4.6.win32.exe" + Banner::show /NOUNLOAD "Installing PyParsing Python Module ..." + ExecWait '"$PLUGINSDIR\pyparsing-1.4.6.win32.exe"' + Delete $PLUGINSDIR\pyparsing-1.4.6.win32.exe + Banner::destroy +FunctionEnd + +Function InstallGraphViz + InitPluginsDir + File /oname=$PLUGINSDIR\graphviz-2.12.exe "tools\graphviz-2.12.exe" + Banner::show /NOUNLOAD "Installing Graphviz for Windows ..." + ExecWait '"$PLUGINSDIR\graphviz-2.12.exe"' + Delete $PLUGINSDIR\graphviz-2.12.exe + Banner::destroy +FunctionEnd + + +Function .onInit + InitPluginsDir + File /oname=$PLUGINSDIR\..bmp "splash.bmp" + advsplash::show 1000 1300 600 -1 $PLUGINSDIR\splash + Pop $0 + Delete $PLUGINSDIR\splash.bmp + !insertmacro MUI_LANGDLL_DISPLAY +FunctionEnd + +Section "Install Python" SEC01 + Call CheckForPython +SectionEnd + +Section "Install Tools" SEC02 + Call InstallDirectX + Call InstallPyWin32 + Call InstallPyParsing + Call InstallGraphViz +SectionEnd + +Section "Full Installation" SEC03 + SetOutPath "$INSTDIR" + SetOverwrite try + File "/r" "..\..\*" +SectionEnd + +Function "LaunchPostInstallation" + ExecWait '"$INSTDIR\update.bat"' + ExecWait '"$INSTDIR\rortoolkit.bat"' +FunctionEnd + +Section -AdditionalIcons + SetOutPath $INSTDIR + WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" + CreateDirectory "$SMPROGRAMS\RoRToolkit" +# CreateShortCut "$SMPROGRAMS\RoRToolkit\RoR Truck Editor.lnk" "$INSTDIR\terraineditor.bat" "" "$INSTDIR\ror.ico" + CreateShortCut "$SMPROGRAMS\RoRToolkit\RoR Toolkit.lnk" "$INSTDIR\rortoolkit.bat" "" "$INSTDIR\ror.ico" + CreateShortCut "$SMPROGRAMS\RoRToolkit\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" + CreateShortCut "$SMPROGRAMS\RoRToolkit\Uninstall.lnk" "$INSTDIR\uninst.exe" +SectionEnd + +Section -Post + WriteUninstaller "$INSTDIR\uninst.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" + WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" +SectionEnd + + +Function un.onUninstSuccess + HideWindow + MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was uninstalled successfully." +FunctionEnd + +Function un.onInit + MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Do you want to uninstall $(^Name)?" IDYES +2 + Abort +FunctionEnd + +Section Uninstall + Delete "$INSTDIR\${PRODUCT_NAME}.url" + Delete "$INSTDIR\uninst.exe" + #RMDir "/r" "$INSTDIR\media" + RMDir "/r" "$INSTDIR" + + RMDir "/r" "$SMPROGRAMS\RoRToolkit" + Delete "$STARTMENU.lnk" + RMDir "$INSTDIR" + + DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" + SetAutoClose false +SectionEnd \ No newline at end of file Added: trunk/devtools/setup/splash.bmp =================================================================== (Binary files differ) Property changes on: trunk/devtools/setup/splash.bmp ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Modified: trunk/postinstall.py =================================================================== --- trunk/postinstall.py 2007-07-27 12:14:42 UTC (rev 131) +++ trunk/postinstall.py 2007-07-27 12:29:13 UTC (rev 132) @@ -18,7 +18,7 @@ basename = os.path.basename(filename) filenameonly, extension = os.path.splitext(basename) thispath = os.path.join(installpath, filenameonly+".py") - pythonpath = "%systemdrive%\python25\python.exe" + pythonpath = "%systemdrive%\python25\pythonw.exe" content = ["@%s %s %%*" % (pythonpath, thispath)] saveFile(filename, content) Deleted: trunk/readme-installer.txt =================================================================== --- trunk/readme-installer.txt 2007-07-27 12:14:42 UTC (rev 131) +++ trunk/readme-installer.txt 2007-07-27 12:29:13 UTC (rev 132) @@ -1,2 +0,0 @@ -have fun and report bugs and feature requests! :) -http://forum.rigsofrods.com \ No newline at end of file Deleted: trunk/setup.nsi =================================================================== --- trunk/setup.nsi 2007-07-27 12:14:42 UTC (rev 131) +++ trunk/setup.nsi 2007-07-27 12:29:13 UTC (rev 132) @@ -1,262 +0,0 @@ -; Script generated by the HM NIS Edit Script Wizard. - -; HM NIS Edit Wizard helper defines -!define PRODUCT_NAME "RoRToolkit" -!define PRODUCT_VERSION "r105" -!define PRODUCT_PUBLISHER "Thomas Fischer" -!define PRODUCT_WEB_SITE "http://wiki.rigsofrods.com/index.php?title=RoRToolkit" -!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" -!define PRODUCT_UNINST_ROOT_KEY "HKLM" - -!define PYTHONVERSION "2.5" -!define PYTHONDLURL "http://python.org/ftp/python/2.5.1/python-2.5.1.msi" -!define PYTHONDLFN "python-2.5.1.msi" - -SetCompressor lzma - -BrandingText "Rigs of Rods Toolkit" -InstProgressFlags smooth colored -XPStyle on -ShowInstDetails show -ShowUninstDetails show -SetDateSave on -#SetDatablockOptimize on -CRCCheck on -#SilentInstall normal - -; MUI 1.67 compatible ------ -!include "MUI.nsh" -!include "LogicLib.nsh" - -; MUI Settings -!define MUI_ABORTWARNING -!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install-blue.ico" -!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall-blue.ico" - -; Language Selection Dialog Settings -!define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}" -!define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}" -!define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" - -; Welcome page -!insertmacro MUI_PAGE_WELCOME -; License page -!insertmacro MUI_PAGE_LICENSE "readme-installer.txt" -; Directory page -!insertmacro MUI_PAGE_DIRECTORY -; Instfiles page -!insertmacro MUI_PAGE_INSTFILES -; Finish page -;!define MUI_FINISHPAGE_RUN "$INSTDIR\rortoolkit.bat" -;!define MUI_FINISHPAGE_RUN_PARAMETERS "" -#!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\Example.file" - -!define MUI_FINISHPAGE_NOAUTOCLOSE -!define MUI_FINISHPAGE_RUN -!define MUI_FINISHPAGE_RUN_NOTCHECKED -!define MUI_FINISHPAGE_RUN_TEXT "Update and start (Can take some time)" -!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchPostInstallation" -!insertmacro MUI_PAGE_FINISH - -; Uninstaller pages -!insertmacro MUI_UNPAGE_INSTFILES - -; Language files -!insertmacro MUI_LANGUAGE "English" -!insertmacro MUI_LANGUAGE "French" -!insertmacro MUI_LANGUAGE "German" -!insertmacro MUI_LANGUAGE "Spanish" -!insertmacro MUI_LANGUAGE "Polish" -!insertmacro MUI_LANGUAGE "Russian" -!insertmacro MUI_LANGUAGE "Ukrainian" -!insertmacro MUI_LANGUAGE "Finnish" -!insertmacro MUI_LANGUAGE "Czech" -!insertmacro MUI_LANGUAGE "Italian" - -; Reserve files -!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS - -; MUI end ------ - -Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" -OutFile "RoRToolkitSetup.exe" -;InstallDir "$PROGRAMFILES\RoRToolkit" -InstallDir "c:\rortoolkit" -ShowInstDetails show -ShowUnInstDetails show - -Var /GLOBAL PYOK -Var /GLOBAL PYPATH -Var /GLOBAL PYINSTALLED - -Function DetectPython - ReadRegStr $R6 HKCU "SOFTWARE\Python\PythonCore\${PYTHONVERSION}\InstallPath" "" - ${If} $R6 == '' - ReadRegStr $R6 HKLM "SOFTWARE\Python\PythonCore\${PYTHONVERSION}\InstallPath" "" - ${If} $R6 == '' - Push "No registry key found" - Push "NOK" - Return - ${EndIf} - ${EndIf} - - ${If} ${FileExists} "$R6\python.exe" - Push "$R6" - Push "OK" - ${Else} - Push "No python.exe found" - Push "NOK" - ${EndIf} -FunctionEnd - -Function CheckForPython - Banner::show /NOUNLOAD "Checking for Python ${PYTHONVERSION} ..." - StrCpy $PYINSTALLED "" - Call DetectPython - Pop $PYOK - Pop $PYPATH - Banner::destroy - ${If} $PYOK == 'OK' - DetailPrint "Detected Python ${PYTHONVERSION}!" - Return - ${Else} - MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION "The installer cannot find Python ${PYTHONVERSION}!$\r$\nWould you like the installer to download and install Python ${PYTHONVERSION} for you?" IDNO abort IDCANCEL abort - DetailPrint "Downloading ${PYTHONDLURL}..." - - NSISdl::download ${PYTHONDLURL} ${PYTHONDLFN} - Pop $R0 ;Get the return value - StrCmp $R0 "success" dlok abort - dlok: - DetailPrint "Installing Python ${PYTHONVERSION}..." - ExecWait '"msiExec" /q /i "${PYTHONDLFN}"' - StrCpy $PYINSTALLED "" - Call DetectPython - Pop $PYOK - Pop $PYPATH - ${If} $PYOK == 'OK' - DetailPrint "Detected Python ${PYTHONVERSION}!" - Return - ${Else} - MessageBox MB_OK "Python ${PYTHONVERSION} installation failed! Please install by hand and restart this installation!" - Abort - ${EndIf} - Return - ${EndIf} - Return - abort: - MessageBox MB_OK "Please install Python ${PYTHONVERSION} and retry this installation!" - Abort -FunctionEnd - -Function InstallDirectX - InitPluginsDir - File /oname=$PLUGINSDIR\dxwebsetup.exe "tools\dxwebsetup.exe" - Banner::show /NOUNLOAD "Installing lastest DirectX ..." - ExecWait '"$PLUGINSDIR\dxwebsetup.exe /Q"' - Delete $PLUGINSDIR\dxwebsetup.exe - Banner::destroy -FunctionEnd - - -Function InstallPyWin32 - InitPluginsDir - File /oname=$PLUGINSDIR\pywin32-setup.exe "tools\pywin32-setup.exe" - Banner::show /NOUNLOAD "Installing Python for Windows ..." - ExecWait '"$PLUGINSDIR\pywin32-setup.exe"' - Delete $PLUGINSDIR\pywin32-setup.exe - Banner::destroy -FunctionEnd - -Function InstallPyParsing - InitPluginsDir - File /oname=$PLUGINSDIR\pyparsing-1.4.6.win32.exe "tools\pyparsing-1.4.6.win32.exe" - Banner::show /NOUNLOAD "Installing PyParsing Python Module ..." - ExecWait '"$PLUGINSDIR\pyparsing-1.4.6.win32.exe"' - Delete $PLUGINSDIR\pyparsing-1.4.6.win32.exe - Banner::destroy -FunctionEnd - -Function InstallGraphViz - InitPluginsDir - File /oname=$PLUGINSDIR\graphviz-2.12.exe "tools\graphviz-2.12.exe" - Banner::show /NOUNLOAD "Installing Graphviz for Windows ..." - ExecWait '"$PLUGINSDIR\graphviz-2.12.exe"' - Delete $PLUGINSDIR\graphviz-2.12.exe - Banner::destroy -FunctionEnd - - -Function .onInit - InitPluginsDir - File /oname=$PLUGINSDIR\splash.bmp "splash.bmp" - advsplash::show 1000 1300 600 -1 $PLUGINSDIR\splash - Pop $0 - Delete $PLUGINSDIR\splash.bmp - !insertmacro MUI_LANGDLL_DISPLAY -FunctionEnd - -Section "Install Python" SEC01 - Call CheckForPython -SectionEnd - -Section "Install Tools" SEC02 - Call InstallDirectX - Call InstallPyWin32 - Call InstallPyParsing - Call InstallGraphViz -SectionEnd - -Section "Full Installation" SEC03 - SetOutPath "$INSTDIR" - SetOverwrite try - File "/r" "*" -SectionEnd - -Function "LaunchPostInstallation" - ExecWait '"$INSTDIR\update.bat"' - ExecWait '"$INSTDIR\rortoolkit.bat"' -FunctionEnd - -Section -AdditionalIcons - SetOutPath $INSTDIR - WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}" - CreateDirectory "$SMPROGRAMS\RoRToolkit" -# CreateShortCut "$SMPROGRAMS\RoRToolkit\RoR Truck Editor.lnk" "$INSTDIR\terraineditor.bat" "" "$INSTDIR\ror.ico" - CreateShortCut "$SMPROGRAMS\RoRToolkit\RoR Toolkit.lnk" "$INSTDIR\rortoolkit.bat" "" "$INSTDIR\ror.ico" - CreateShortCut "$SMPROGRAMS\RoRToolkit\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url" - CreateShortCut "$SMPROGRAMS\RoRToolkit\Uninstall.lnk" "$INSTDIR\uninst.exe" -SectionEnd - -Section -Post - WriteUninstaller "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}" - WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}" -SectionEnd - - -Function un.onUninstSuccess - HideWindow - MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) was uninstalled successfully." -FunctionEnd - -Function un.onInit - MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Do you want to uninstall $(^Name)?" IDYES +2 - Abort -FunctionEnd - -Section Uninstall - Delete "$INSTDIR\${PRODUCT_NAME}.url" - Delete "$INSTDIR\uninst.exe" - #RMDir "/r" "$INSTDIR\media" - RMDir "/r" "$INSTDIR" - - RMDir "/r" "$SMPROGRAMS\RoRToolkit" - Delete "$STARTMENU.lnk" - RMDir "$INSTDIR" - - DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" - SetAutoClose false -SectionEnd \ No newline at end of file Deleted: trunk/splash.bmp =================================================================== (Binary files differ) Deleted: trunk/testunrar.py =================================================================== --- trunk/testunrar.py 2007-07-27 12:14:42 UTC (rev 131) +++ trunk/testunrar.py 2007-07-27 12:29:13 UTC (rev 132) @@ -1,24 +0,0 @@ -#Thomas Fischer 31/05/2007, th...@th... -import sys, os, os.path, shutil - -def main(): - sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) - - fn = 'MudFest_v1-isc-d.rar' - - import UnRAR - #extract all the files in test.rar - zipdir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "temp") - if os.path.isdir(zipdir): - shutil.rmtree(zipdir) - os.rmdir(zipdir) - os.mkdir(zipdir) - dst = os.path.join(zipdir, fn) - src = os.path.join(os.path.dirname(os.path.abspath(__file__)), fn) - shutil.copyfile(src, dst) - os.chdir(zipdir) - - UnRAR.Archive(fn).extract() - -if __name__=="__main__": - main() \ No newline at end of file Deleted: trunk/testunzip.py =================================================================== --- trunk/testunzip.py 2007-07-27 12:14:42 UTC (rev 131) +++ trunk/testunzip.py 2007-07-27 12:29:13 UTC (rev 132) @@ -1,18 +0,0 @@ -#Thomas Fischer 31/05/2007, th...@th... -import sys, os, os.path, shutil - -def main(): - sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) - - fn = 'daf_swapbody.zip' - - import UnZIP - - zipdir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "temp") - if os.path.isdir(zipdir): - shutil.rmtree(zipdir) - - UnZIP.unzip(fn, zipdir) - -if __name__=="__main__": - main() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 12:14:45
|
Revision: 131 http://roreditor.svn.sourceforge.net/roreditor/?rev=131&view=rev Author: rorthomas Date: 2007-07-27 05:14:42 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * added python windows .pyw extension, so that the console window is hidden Added Paths: ----------- trunk/rortoolkit.pyw Added: trunk/rortoolkit.pyw =================================================================== --- trunk/rortoolkit.pyw (rev 0) +++ trunk/rortoolkit.pyw 2007-07-27 12:14:42 UTC (rev 131) @@ -0,0 +1,25 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path + +def main(): + """ + main method + """ + + sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) + + # Import Psyco if available + try: + import psyco + #psyco.full() + #psyco.log() + #psyco.profile() + except ImportError: + pass + + import ror.starter + ror.starter.startApp() + + +if __name__=="__main__": + main() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 12:08:45
|
Revision: 130 http://roreditor.svn.sourceforge.net/roreditor/?rev=130&view=rev Author: rorthomas Date: 2007-07-27 05:08:44 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * moved depchecker console handling * replaced all "print"'s with log().info()or log().error() Modified Paths: -------------- trunk/depchecker.py trunk/lib/ror/depchecker.py trunk/lib/ror/depcheckerplugins/deptools.py trunk/lib/ror/depcheckerplugins/ror_cfg.py trunk/lib/ror/depcheckerplugins/ror_material.py trunk/lib/ror/depcheckerplugins/ror_mesh.py trunk/lib/ror/depcheckerplugins/ror_terrn.py trunk/lib/ror/depcheckerplugins/ror_truck.py trunk/lib/ror/ogrelogger.py trunk/lib/ror/starter.py trunk/lib/ror/svn.py trunk/lib/ror/truckparser.py Modified: trunk/depchecker.py =================================================================== --- trunk/depchecker.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/depchecker.py 2007-07-27 12:08:44 UTC (rev 130) @@ -1,6 +1,18 @@ #Thomas Fischer 31/05/2007, th...@th... import sys, os, os.path +def usage(): + print "usage: %s <path to inspect> <all or unused or missing>" % os.path.basename(sys.argv[0]) + print "for example: %s c:\\ror\\data missing" % os.path.basename(sys.argv[0]) + print " valid modes:" + print " 'all' displays all dependencies, inclusive fulfilled ones" + print " 'missing' displays only unfulfilled dependencies" + print " 'unused' displays resources that are not in use" + print " 'dtree <resourcename>' displays the dependency tree of the given resource name" + print " 'md5sum' creates the md5sums of all files" + sys.exit(0) + + def main(): """ main method @@ -20,9 +32,25 @@ except ImportError: pass + if len(sys.argv) < 3: + usage() + path = sys.argv[1] + if path.strip() == "rordir": + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isdir(path): + print "%s is not a valid directory!" % path + usage() + if (len(sys.argv) == 3 and sys.argv[2] in ['all', 'missing', 'unused', 'record']) or (len(sys.argv) == 4 and sys.argv[2] in ['dtree']): + pass + else: + print "%s is not a valid mode, or incorrect arguments!" % sys.argv[2] + usage() + import ror.depchecker - ror.depchecker.main() - + dependfilename = "" + if len(sys.argv) == 4 and sys.argv[2] in ['dtree'] and sys.argv[3].strip() != "": + dependfilename = sys.argv[3].strip() + ror.depchecker.RoRDepChecker(path , sys.argv[2], dependfilename) if __name__=="__main__": main() \ No newline at end of file Modified: trunk/lib/ror/depchecker.py =================================================================== --- trunk/lib/ror/depchecker.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/depchecker.py 2007-07-27 12:08:44 UTC (rev 130) @@ -412,37 +412,3 @@ else: log().info("### all files used") -def usage(): - print "usage: %s <path to inspect> <all or unused or missing>" % os.path.basename(sys.argv[0]) - print "for example: %s c:\\ror\\data missing" % os.path.basename(sys.argv[0]) - print " valid modes:" - print " 'all' displays all dependencies, inclusive fulfilled ones" - print " 'missing' displays only unfulfilled dependencies" - print " 'unused' displays resources that are not in use" - print " 'dtree <resourcename>' displays the dependency tree of the given resource name" - print " 'md5sum' creates the md5sums of all files" - sys.exit(0) - -def main(): - import settingsManager - if len(sys.argv) < 3: - usage() - path = sys.argv[1] - if path.strip() == "rordir": - path = settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isdir(path): - print "%s is not a valid directory!" % path - usage() - if (len(sys.argv) == 3 and sys.argv[2] in ['all', 'missing', 'unused', 'record']) or (len(sys.argv) == 4 and sys.argv[2] in ['dtree']): - pass - else: - print "%s is not a valid mode, or incorrect arguments!" % sys.argv[2] - usage() - - dependfilename = "" - if len(sys.argv) == 4 and sys.argv[2] in ['dtree'] and sys.argv[3].strip() != "": - dependfilename = sys.argv[3].strip() - RoRDepChecker(path , sys.argv[2], dependfilename) - -if __name__ == "__main__": - main() Modified: trunk/lib/ror/depcheckerplugins/deptools.py =================================================================== --- trunk/lib/ror/depcheckerplugins/deptools.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/depcheckerplugins/deptools.py 2007-07-27 12:08:44 UTC (rev 130) @@ -1,6 +1,11 @@ #Thomas Fischer 06/07/2007, th...@th... import sys, os, os.path +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")) + +from ror.logger import log +from ror.settingsManager import getSettingsManager + REQUIRES = 'requires' OPTIONAL = 'optional' PROVIDES = 'provides' Modified: trunk/lib/ror/depcheckerplugins/ror_cfg.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_cfg.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/depcheckerplugins/ror_cfg.py 2007-07-27 12:08:44 UTC (rev 130) @@ -36,10 +36,10 @@ if not tmp is None: dep.append(tmp) else: - print "ERROR !!! required value not found in terrain config file %s!" % filename + log().error("ERROR !!! required value not found in terrain config file %s!" % filename) if len(dep) == 0: - print "no configuration found in terrain config file " + filename + log().info("no configuration found in terrain config file " + filename) else: return { OPTIONAL:{ Modified: trunk/lib/ror/depcheckerplugins/ror_material.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_material.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/depcheckerplugins/ror_material.py 2007-07-27 12:08:44 UTC (rev 130) @@ -29,7 +29,7 @@ #print "no texture found in material file " + filename pass if len(prov) == 0: - print "no material found in material file " + filename + log().info("no material found in material file " + filename) else: return { OPTIONAL:{ Modified: trunk/lib/ror/depcheckerplugins/ror_mesh.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_mesh.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/depcheckerplugins/ror_mesh.py 2007-07-27 12:08:44 UTC (rev 130) @@ -16,14 +16,13 @@ def convertToXML(filename): # try to convert to .msh.xml first! cmd = CONVERTERBIN + " \"" + filename+"\"" - print "calling " + cmd + log().info("calling " + cmd) p = subprocess.Popen(cmd, shell = False, cwd = os.path.dirname(CONVERTERBIN), stderr = subprocess.PIPE, stdout = subprocess.PIPE) smart_wait_for_subprocess(p, 10) if not os.path.isfile(os.path.join(os.path.dirname(filename), os.path.basename(filename)+".xml")): - print "conversion of mesh file %s failed!" % filename - - print "mesh converted: " + filename + log().error("conversion of mesh file %s failed!" % filename) + log().info("mesh converted: " + filename) def smart_wait_for_subprocess(sp,timeout=30): """ @@ -89,12 +88,12 @@ convertToXML(filename) try: content = readFile(xmlfilename) - except Exception, e: - print e + except Exception, err: + log().error(str(err)) return dep = parseRE(content) if len(dep) == 0: - print "no material found for file " + filename + log().info("no material found for file " + filename) else: return { OPTIONAL:{ Modified: trunk/lib/ror/depcheckerplugins/ror_terrn.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_terrn.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/depcheckerplugins/ror_terrn.py 2007-07-27 12:08:44 UTC (rev 130) @@ -62,7 +62,7 @@ terrnname, ext = os.path.splitext(os.path.basename(filename)) if len(dep) == 0: - print "no objects found in terrain file " + filename + log().error("no objects found in terrain file " + filename) else: return { OPTIONAL:{ Modified: trunk/lib/ror/depcheckerplugins/ror_truck.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_truck.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/depcheckerplugins/ror_truck.py 2007-07-27 12:08:44 UTC (rev 130) @@ -6,7 +6,7 @@ p = rorparser() p.parse(filename, verbose=False) if not 'globals' in p.tree.keys(): - print "truck parsing error on file " + filename + log().error("truck parsing error on file " + filename) truckfilename = os.path.basename(filename) truckname, ext = os.path.splitext(truckfilename) matname = p.tree['globals'][0]['data'][2] Modified: trunk/lib/ror/ogrelogger.py =================================================================== --- trunk/lib/ror/ogrelogger.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/ogrelogger.py 2007-07-27 12:08:44 UTC (rev 130) @@ -8,8 +8,9 @@ def messageLogged(self, message, level, debug, logName): # This should be called by Ogre instead of logging - print 'Python Logger Called -- Listener works !!!' - print ">>>", message + #print 'Python Logger Called -- Listener works !!!' + #print ">>>", message + pass def initOgreLogging(): # Create the global log manager instance Modified: trunk/lib/ror/starter.py =================================================================== --- trunk/lib/ror/starter.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/starter.py 2007-07-27 12:08:44 UTC (rev 130) @@ -25,7 +25,7 @@ jpg1 = wx.Image(imageFile, wx.BITMAP_TYPE_ANY).ConvertToBitmap() wx.StaticBitmap(self, wx.ID_ANY, jpg1, (0, 0), (jpg1.GetWidth(), jpg1.GetHeight())) except IOError: - print "Image file %s not found" % imageFile + log().error("Image file %s not found" % imageFile) raise SystemExit @@ -128,7 +128,7 @@ import ror.depchecker ror.depchecker.RoRDepChecker(self.rordir, "all", "") file = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..\\..\\graphs\\alldependencies.png")) - print file + #print file if os.path.isfile(file): dlg = wx.MessageDialog(self, "Graph successfully created:\n"+file, "Info", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() Modified: trunk/lib/ror/svn.py =================================================================== --- trunk/lib/ror/svn.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/svn.py 2007-07-27 12:08:44 UTC (rev 130) @@ -23,7 +23,7 @@ global changes changes += 1 #print event_dict - print str(event_dict['action']) + ", " + event_dict['path'] + log().info(str(event_dict['action']) + ", " + event_dict['path']) def getRevision(client=None, path=None): if client is None: @@ -46,7 +46,7 @@ strict_node_history=True, limit=0) for e in log: - print "--- r%d, author: %s:\n%s\n" %(e['revision'].number, e['author'], e['message']) + log().info("--- r%d, author: %s:\n%s\n" %(e['revision'].number, e['author'], e['message'])) if len(log) > 0: return True except: @@ -65,11 +65,11 @@ limit=0) def showLog(client, startrev, endrev): - print "------------------------------------" - print "Changelog from revision %d to revision %d\n" % (startrev, endrev) + log().info("------------------------------------") + log().info("Changelog from revision %d to revision %d\n" % (startrev, endrev)) log = getLog(client, startrev, endrev) for e in log: - print "--- r%d, author: %s:\n%s\n" %(e['revision'].number, e['author'], e['message']) + log().info("--- r%d, author: %s:\n%s\n" %(e['revision'].number, e['author'], e['message'])) def svnupdate(callback = None): global changes @@ -86,7 +86,7 @@ pass revision_before = getRevision(client, path) - print "updating from revision %d ..." % revision_before + log().info("updating from revision %d ..." % revision_before) if callback is None: client.callback_notify = notify else: @@ -97,21 +97,21 @@ revision = pysvn.Revision(pysvn.opt_revision_kind.head), ignore_externals = False) revision_after = getRevision(client, path) - print "updated to revision %d." % revision_after + log().info("updated to revision %d." % revision_after) if revision_before == revision_after and changes == 2: - print "already up to date!" + log().info("already up to date!") elif changes > 2: if revision_before != revision_after: - print "updated! please restart the application!" + log().info("updated! please restart the application!") showLog(client, revision_before + 1, revision_after) else: - print "no files updated, but restored! please restart the application!" + log().info("no files updated, but restored! please restart the application!") except Exception, inst: - print "error while updating: " + str(inst) - print "done." + log().error( "error while updating: " + str(inst)) + log().error("done.") def svncheckout(): - print "checkout" + log().info("checkout") path = getRootPath() changes = 0 try: @@ -119,7 +119,7 @@ client.callback_notify = notify client.checkout(URL, path) except: - print "error while checkout!" + log().error("error while checkout!") def createBackup(): import shutil Modified: trunk/lib/ror/truckparser.py =================================================================== --- trunk/lib/ror/truckparser.py 2007-07-27 11:38:05 UTC (rev 129) +++ trunk/lib/ror/truckparser.py 2007-07-27 12:08:44 UTC (rev 130) @@ -1,10 +1,13 @@ #!/bin/env python # Thomas Fischer 16/05/2007 thomas (at) thomasfischer.biz import sys, os, os.path, tempfile, pickle - ## default values: required:True - ## please note: unkown args are marked with 'WHAT IS THIS' +from ror.logger import log +from ror.settingsManager import getSettingsManager + + # default values: required:True + # please note: unkown args are marked with 'WHAT IS THIS' class rorparser: - ### This specifies all valid commands + # This specifies all valid commands commands = { # set_beam_defaults changes the beams (but also the hydros and ropes) default characteristics that will be used for the beams declared after the line. You can use this line many times to make different groups of beams that have different characteristics (e.g. stronger chassis, softer cab, etc.). This method is better than the globeams command that is now deprecated. The parameters comes on the same line, after set_beam_defaults. You can use the first parameters (most usefull) and safely ignore the last parameters. 'set_beam_defaults':[ @@ -605,7 +608,7 @@ line = content[lineno] # strip line-endings line = line.strip() - #print lineno, line + #log.info(lineno+","+ line) if line.strip() == "": # add blank lines to comments self.addComment(actualsection, line, lineno, False) @@ -741,14 +744,15 @@ def save(self): #(fid, filename) = tempfile.mkstemp(suffix='.RoRObject') filename = self.filename + "_pickle" - print "trying to save Settings to file %s for file %s" % (filename, os.path.basename(self.filename)) + log().info("trying to save Settings to file %s for file %s" % (filename, os.path.basename(self.filename))) try: fh = open(filename, 'w') pickle.dump(self.tree, fh) fh.close() - print "saving successfull!" - except: - print "error while saving settings" + log().info("saving successfull!") + except Exception, err: + log().error("error while saving settings") + log().error(str(err)) def isFloat(self, s): @@ -759,32 +763,34 @@ return i def printtree(self): + rstr = "" for s in self.tree.keys(): if len(self.tree[s]) == 0: continue - print "" - print "===========================================================================================================================================================================" - print "%s: %d" % (s, len(self.tree[s])) + rstr += "\n" + rstr += "===========================================================================================================================================================================\n" + rstr += "%s: %d\n" % (s, len(self.tree[s])) # for non original columns (generated ones) if not self.sections.has_key(s): - print self.tree[s] + rstr += self.tree[s] continue for column in self.sections[s]: - sys.stdout.write("| %-15s" % (column['name'][0:15])) - sys.stdout.write("\n") - print "---------------------------------------------------------------------------------------------------------------------------------------------------------------------------" + rstr += "| %-15s" % (column['name'][0:15]) + rstr += "\n" + rstr += "---------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n" for line in self.tree[s]: for arg in line['data']: try: if arg.isdigit() or self.isFloat(arg): - sys.stdout.write("|%15.3f " % (round(float(arg),4))) + rstr += "|%15.3f " % (round(float(arg),4)) else: - sys.stdout.write("|%15s " % (str(arg)[0:15])) + rstr += "|%15s " % (str(arg)[0:15]) except: - sys.stdout.write("|%15s " % (str(arg)[0:15])) + rstr += "|%15s " % (str(arg)[0:15]) if 'errors' in line.keys(): - sys.stdout.write("[ERRORS: %d] "%(len(line['errors']))) - sys.stdout.write("(origin: %d)\n"%(line['originline'])) + rstr += "[ERRORS: %d] "%(len(line['errors'])) + rstr += "(origin: %d)\n"%(line['originline']) + log().info(rstr) def getLine(self, lineno): for skey in self.tree.keys(): @@ -820,8 +826,8 @@ result.append(data) n = self.getnextLine(n['originline']) - for r in result: - print r + #for r in result: + # print r def getnextLine(self, lineno): value = {'originline':9999999999} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 11:38:09
|
Revision: 129 http://roreditor.svn.sourceforge.net/roreditor/?rev=129&view=rev Author: rorthomas Date: 2007-07-27 04:38:05 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * added message to repoclient Modified Paths: -------------- trunk/lib/ror/repomanager.py Modified: trunk/lib/ror/repomanager.py =================================================================== --- trunk/lib/ror/repomanager.py 2007-07-27 11:05:50 UTC (rev 128) +++ trunk/lib/ror/repomanager.py 2007-07-27 11:38:05 UTC (rev 129) @@ -2,7 +2,7 @@ import repoclient -import wx, wx.grid, wx.html, os, os.path, base64 +import wx, wx.grid, wx.html, os, os.path, base64, sys from datetime import * class HtmlRenderer(wx.grid.PyGridCellRenderer): @@ -79,7 +79,14 @@ kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) self.grid_1 = wx.grid.Grid(self, -1, size=(1, 1)) - self.data = repoclient.getFiles(-1) + try: + self.data = repoclient.getFiles(-1) + except: + dlg = wx.MessageDialog(self, "Repository Server is unavailable right now. Please note that the server is in a beta stage and that it is not online every time.", "Info", wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + self.Close() + return self.__set_properties() self.__do_layout() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 11:05:59
|
Revision: 128 http://roreditor.svn.sourceforge.net/roreditor/?rev=128&view=rev Author: rorthomas Date: 2007-07-27 04:05:50 -0700 (Fri, 27 Jul 2007) Log Message: ----------- Modified Paths: -------------- trunk/lib/ror/ogrelogger.py Modified: trunk/lib/ror/ogrelogger.py =================================================================== --- trunk/lib/ror/ogrelogger.py 2007-07-27 11:05:08 UTC (rev 127) +++ trunk/lib/ror/ogrelogger.py 2007-07-27 11:05:50 UTC (rev 128) @@ -25,5 +25,5 @@ currentLog.addListener ( myLog ) # And test it - ogre.LogManager.getSingletonPtr().logMessage('Should Not Appear', - ogre.LML_CRITICAL, False) + #ogre.LogManager.getSingletonPtr().logMessage('Should Not Appear', + # ogre.LML_CRITICAL, False) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 11:05:14
|
Revision: 127 http://roreditor.svn.sourceforge.net/roreditor/?rev=127&view=rev Author: rorthomas Date: 2007-07-27 04:05:08 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * added missing file Added Paths: ----------- trunk/lib/ror/ogrelogger.py Added: trunk/lib/ror/ogrelogger.py =================================================================== --- trunk/lib/ror/ogrelogger.py (rev 0) +++ trunk/lib/ror/ogrelogger.py 2007-07-27 11:05:08 UTC (rev 127) @@ -0,0 +1,29 @@ +import ogre.renderer.OGRE as ogre +import logger + +class MyLog(ogre.LogListener): + def __init__(self): + # Creates a C++ log that will try and write to console and file + ogre.LogListener.__init__(self) + + def messageLogged(self, message, level, debug, logName): + # This should be called by Ogre instead of logging + print 'Python Logger Called -- Listener works !!!' + print ">>>", message + +def initOgreLogging(): + # Create the global log manager instance + logMgr = ogre.LogManager() + + # create a "log" + currentLog = ogre.LogManager.getSingletonPtr().createLog("ogre.log" ,True, False, False) + + #ogre.LogManager.getSingletonPtr().setDefaultLog(currentLog) + + myLog = MyLog() + # register our listener + currentLog.addListener ( myLog ) + + # And test it + ogre.LogManager.getSingletonPtr().logMessage('Should Not Appear', + ogre.LML_CRITICAL, False) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 10:57:53
|
Revision: 126 http://roreditor.svn.sourceforge.net/roreditor/?rev=126&view=rev Author: rorthomas Date: 2007-07-27 03:57:49 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * reverted changes Modified Paths: -------------- trunk/ogre.cfg Modified: trunk/ogre.cfg =================================================================== --- trunk/ogre.cfg 2007-07-27 10:56:01 UTC (rev 125) +++ trunk/ogre.cfg 2007-07-27 10:57:49 UTC (rev 126) @@ -1,10 +1,10 @@ -Render System=Direct3D9 Rendering Subsystem +Render System=OpenGL Rendering Subsystem -[Direct3D9 Rendering Subsystem] -Allow NVPerfHUD=No -Anti aliasing=None -Floating-point mode=Fastest +[OpenGL Rendering Subsystem] +Colour Depth=32 +Display Frequency=60 +FSAA=6 Full Screen=Yes -Rendering Device=RADEON X850 Series -VSync=No -Video Mode=800 x 600 @ 32-bit colour +RTT Preferred Mode=PBuffer +VSync=Yes +Video Mode=1024 x 480 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 10:56:04
|
Revision: 125 http://roreditor.svn.sourceforge.net/roreditor/?rev=125&view=rev Author: rorthomas Date: 2007-07-27 03:56:01 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * added missing file Modified Paths: -------------- trunk/ogre.cfg Added Paths: ----------- trunk/postinstall.bat Modified: trunk/ogre.cfg =================================================================== --- trunk/ogre.cfg 2007-07-27 10:54:28 UTC (rev 124) +++ trunk/ogre.cfg 2007-07-27 10:56:01 UTC (rev 125) @@ -1,10 +1,10 @@ -Render System=OpenGL Rendering Subsystem +Render System=Direct3D9 Rendering Subsystem -[OpenGL Rendering Subsystem] -Colour Depth=32 -Display Frequency=60 -FSAA=6 +[Direct3D9 Rendering Subsystem] +Allow NVPerfHUD=No +Anti aliasing=None +Floating-point mode=Fastest Full Screen=Yes -RTT Preferred Mode=PBuffer -VSync=Yes -Video Mode=1024 x 480 +Rendering Device=RADEON X850 Series +VSync=No +Video Mode=800 x 600 @ 32-bit colour Added: trunk/postinstall.bat =================================================================== --- trunk/postinstall.bat (rev 0) +++ trunk/postinstall.bat 2007-07-27 10:56:01 UTC (rev 125) @@ -0,0 +1 @@ +@%systemdrive%\python25\python.exe postinstall.py %* \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 10:54:30
|
Revision: 124 http://roreditor.svn.sourceforge.net/roreditor/?rev=124&view=rev Author: rorthomas Date: 2007-07-27 03:54:28 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * added postinstall script: adds the installation path to the .bat files! * updated all .bat files Modified Paths: -------------- trunk/checkmods.bat trunk/depchecker.bat trunk/modtool.bat trunk/rortoolkit.bat trunk/terraineditor.bat trunk/truckeditor.bat trunk/update.bat trunk/updaterestart.bat Added Paths: ----------- trunk/postinstall.py Modified: trunk/checkmods.bat =================================================================== --- trunk/checkmods.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/checkmods.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe checkmods.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t checkmods +@%systemdrive%\python25\python.exe checkmods.py %* \ No newline at end of file Modified: trunk/depchecker.bat =================================================================== --- trunk/depchecker.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/depchecker.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe depchecker.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t depchecker +@%systemdrive%\python25\python.exe depchecker.py %* \ No newline at end of file Modified: trunk/modtool.bat =================================================================== --- trunk/modtool.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/modtool.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t modtool +@%systemdrive%\python25\python.exe modtool.py %* \ No newline at end of file Added: trunk/postinstall.py =================================================================== --- trunk/postinstall.py (rev 0) +++ trunk/postinstall.py 2007-07-27 10:54:28 UTC (rev 124) @@ -0,0 +1,34 @@ +import sys, os, os.path, subprocess + +def getBATFiles(): + batfiles = [] + dir = os.path.dirname(os.path.abspath(__file__)) + for filename in os.listdir(dir): + filenameonly, extension = os.path.splitext(filename) + if extension.lower() == ".bat": + batfiles.append(os.path.join(dir, filename)) + return batfiles + +def saveFile(filename, lines): + f = open(filename, 'w') + f.writelines(lines) + f.close() + +def addPath(filename, installpath): + basename = os.path.basename(filename) + filenameonly, extension = os.path.splitext(basename) + thispath = os.path.join(installpath, filenameonly+".py") + pythonpath = "%systemdrive%\python25\python.exe" + content = ["@%s %s %%*" % (pythonpath, thispath)] + saveFile(filename, content) + +def main(): + installpath = os.path.dirname(os.path.abspath(__file__)) + for batfile in getBATFiles(): + addPath(batfile, installpath) + print "Post-Installed all .bat files, please restart the program now!" + cmd = os.path.join(installpath, sys.argv[1]+".bat") + subprocess.Popen(cmd, shell = True) + +if __name__=="__main__": + main() Modified: trunk/rortoolkit.bat =================================================================== --- trunk/rortoolkit.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/rortoolkit.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe rortoolkit.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t rortoolkit +@%systemdrive%\python25\python.exe rortoolkit.py %* \ No newline at end of file Modified: trunk/terraineditor.bat =================================================================== --- trunk/terraineditor.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/terraineditor.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe terraineditor.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t terraineditor +@%systemdrive%\python25\python.exe terraineditor.py %* \ No newline at end of file Modified: trunk/truckeditor.bat =================================================================== --- trunk/truckeditor.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/truckeditor.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe truckeditor.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t truckeditor +@%systemdrive%\python25\python.exe truckeditor.py %* \ No newline at end of file Modified: trunk/update.bat =================================================================== --- trunk/update.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/update.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe update.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t update +@%systemdrive%\python25\python.exe update.py %* \ No newline at end of file Modified: trunk/updaterestart.bat =================================================================== --- trunk/updaterestart.bat 2007-07-27 10:19:14 UTC (rev 123) +++ trunk/updaterestart.bat 2007-07-27 10:54:28 UTC (rev 124) @@ -1 +1,2 @@ -@%systemdrive%\python25\python.exe updaterestart.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +...@po...t updaterestart +@%systemdrive%\python25\python.exe updaterestart.py %* \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 10:19:21
|
Revision: 123 http://roreditor.svn.sourceforge.net/roreditor/?rev=123&view=rev Author: rorthomas Date: 2007-07-27 03:19:14 -0700 (Fri, 27 Jul 2007) Log Message: ----------- removed path Modified Paths: -------------- trunk/modtool.bat Modified: trunk/modtool.bat =================================================================== --- trunk/modtool.bat 2007-07-27 10:17:33 UTC (rev 122) +++ trunk/modtool.bat 2007-07-27 10:19:14 UTC (rev 123) @@ -1 +1 @@ -@%systemdrive%\python25\python.exe D:\projects\sfproject\svn\trunk\modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-27 10:18:53
|
Revision: 122 http://roreditor.svn.sourceforge.net/roreditor/?rev=122&view=rev Author: rorthomas Date: 2007-07-27 03:17:33 -0700 (Fri, 27 Jul 2007) Log Message: ----------- * modtool moved to class in lib/ror * now supporting installrepo target: downloads a file from the repository and installs it instantly Modified Paths: -------------- trunk/modtool.bat trunk/modtool.py Added Paths: ----------- trunk/devtools/rorrepo.reg trunk/lib/ror/modtool.py Added: trunk/devtools/rorrepo.reg =================================================================== --- trunk/devtools/rorrepo.reg (rev 0) +++ trunk/devtools/rorrepo.reg 2007-07-27 10:17:33 UTC (rev 122) @@ -0,0 +1,12 @@ +REGEDIT4 + +[HKEY_CLASSES_ROOT\RoRRepo] +@="URL:RoRRepo Protocol" +"URL Protocol"="" + +[HKEY_CLASSES_ROOT\RoRRepo\shell] + +[HKEY_CLASSES_ROOT\RoRRepo\shell\open] + +[HKEY_CLASSES_ROOT\RoRRepo\shell\open\command] +@="\"D:\\projects\\sfproject\\svn\\trunk\\modtool.bat\" \"installrepo\" \"%1\"" \ No newline at end of file Added: trunk/lib/ror/modtool.py =================================================================== --- trunk/lib/ror/modtool.py (rev 0) +++ trunk/lib/ror/modtool.py 2007-07-27 10:17:33 UTC (rev 122) @@ -0,0 +1,289 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path, shutil, urllib, re + +from logger import log +from settingsManager import getSettingsManager + +REPOSITORY_URL = "http://repository.rigsofrods.com/files/%(file)s" +TEMPDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "temp")) +DOWNLOADDIR = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..", "downloaded")) + +class ModTool: + def __init__(self): + pass + + def work(self, mode, targetfile, verbose, dryrun, installtarget=None): + self.dryrun = dryrun + self.verbose = verbose + log().info("### modinstaller started with %s, %s" % (mode, targetfile)) + if mode == "install": + filename = os.path.abspath(targetfile) + self.ExtractToTemp(targetfile) + target = installtarget + log().info("### validating target ...") + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.invalid: + log().error("### target invalid!") + log().info("### please use the list mode to get valid targets") + usage() + + log().info("### target valid!") + #print dc.dstree + installcounter = 0 + for file in dc.dstree: + filename = file['filename'] + filenamefound = self.searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + self.installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + self.removetemp(False) + return [target] + + elif mode == "installall": + filename = os.path.abspath(targetfile) + self.ExtractToTemp(targetfile) + validtargets, invalidtargets = self.getTargets(verbose) + log().info("### installing %d found modifications:" % (len(validtargets))) + installcounter = 0 + for target in validtargets: + log().info("### installing modification '%s'" % target) + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.dstree is None: + log().error("no dependenytree for File %s!" % (filename)) + continue + for file in dc.dstree: + filename = file['filename'] + filenamefound = self.searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + self.installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + self.removetemp(False) + return validtargets + + elif mode == "installrepo": + if targetfile.find("://") != -1: + m = re.match(r"^.*://(.*)$", targetfile) + if not m is None and len(m.groups()) > 0: + targetfile = m.groups()[0].rstrip("/") + else: + log().error("error while installing from repo: wrong URL scheme") + return False + else: + log().info("manual use, not parsing URL") + if not self.getRepoFile(targetfile): + log().error("error while installing from repo.") + return False + targetfile = os.path.join(DOWNLOADDIR, targetfile) + return ModTool().work("installall", targetfile, self.verbose, self.dryrun) + + elif mode in ["list", "listall"]: + filename = os.path.abspath(targetfile) + self.ExtractToTemp(targetfile) + validtargets, invalidtargets = self.getTargets(verbose) + if mode == "listall": + if len(invalidtargets) > 0: + log().info("broken modifications found:") + for v in invalidtargets: + log().info(" %-20s" % v) + log().info("use the --verbose flag to find the missing files!") + else: + log().info("no broken modifications found") + + if len(validtargets) > 0: + log().info("installable modifications found:") + for v in validtargets: + log().info(" %-20s" % v) + else: + log().info("no installable modifications found! :(") + # todo : remove workaround! + self.removetemp(False) + return validtargets + + elif mode in ["listinstalled"]: + targets = self.getRoRMods(verbose) + if len(targets) > 0: + log().info("### Found Mods:") + for target in targets: + log().info(" "+target) + else: + log().info("### No Mods found!") + + if mode in ["uninstall"]: + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + log().info("### validating target ...") + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(rorpath, "dtree", targetfile, verbose) + if dc.invalid: + log().error("### target invalid! (Target not found)") + log().info("### please use the 'listinstalled' mode to get valid uninstallation targets") + return None + + log().info("### target valid!") + + #print dc.dstree + newtargets = [] + md5s = dc.readMD5File() + for file in dc.dstree: + filename = file['filename'] + if not os.path.basename(filename) in md5s.keys(): + newtargets.append(filename) + log().info("### removed %d files from dependency tree." % (len(dc.dstree)-len(newtargets))) + #print newtargets + if dryrun: + log().info("### would uninstall %d file(s):" % len(newtargets)) + else: + log().info("### uninstalling %d file(s):" % len(newtargets)) + for target in newtargets: + filenamefound = self.searchFile(target, rorpath) + if filenamefound is None: + log().error("### File not found: %s" % target) + continue + log().info(" %s" % filenamefound) + if not dryrun: + os.unlink(filenamefound) + + return None + + def wgetreporthook(self, *arg): + percentdone = int(((arg[0] * arg[1]) / float(arg[2]))*100) + if percentdone % 10 == 0: + log().info("Downloading, % 4d%% done..." % percentdone) + + def wget(self, url, filename): + file, msg = urllib.urlretrieve(url, filename, self.wgetreporthook) + if os.path.isfile(file): + return True + return False + + + def getRepoFile(self, repofilename): + if not os.path.isdir(DOWNLOADDIR): + os.mkdir(DOWNLOADDIR) + try: + log().info("trying to download the file %s form the repository..." % repofilename) + src = REPOSITORY_URL %{"file":repofilename} + dst = os.path.join(DOWNLOADDIR, repofilename) + #print src, dst + return self.wget(src, dst) + except Exception, err: + log().error("Error while trying to donwload file from the Repository:") + log().error(str(err)) + self.removetemp(False) + return False + + def removetemp(self, reporterrors=True): + if os.path.isdir(TEMPDIR): + try: + shutil.rmtree(TEMPDIR) + #os.rmdir(TEMPDIR) + except Exception, err: + if not reporterrors: + return + log().error(str(err)) + log().error("could not remove temporary diretory: %s! please delete by hand." % TEMPDIR) + sys.exit(1) + + def ExtractToTemp(self, filename): + file, extension = os.path.splitext(filename) + self.removetemp(False) + os.mkdir(TEMPDIR) + if extension.lower() == ".rar": + import UnRAR + dst = os.path.join(TEMPDIR, os.path.basename(filename)) + shutil.copyfile(filename, dst) + os.chdir(TEMPDIR) + UnRAR.Archive(os.path.basename(filename)).extract() + + # remove .rar file instantly + os.unlink(os.path.join(TEMPDIR, os.path.basename(filename))) + + # change back to current path + os.chdir(os.path.dirname(os.path.abspath(__file__))) + return True + elif extension.lower() == ".zip": + import UnZIP + UnZIP.unzip(filename, TEMPDIR) + return True + else: + log().info("copying "+filename+" to "+os.path.join(TEMPDIR, os.path.basename(filename))) + shutil.copyfile(filename, os.path.join(TEMPDIR, os.path.basename(filename))) + return False + + def installfile(self, maintarget, srcfile, dryrun): + file, extension = os.path.splitext(maintarget) + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + + if extension in ['.truck', '.load']: + path = os.path.join(rorpath, "data", "trucks") + elif extension in ['.terrn']: + path = os.path.join(rorpath, "data", "terrains") + else: + path = rorpath + if dryrun: + log().info("would install %s to %s" % (os.path.basename(srcfile), path)) + else: + log().info("installing %s to %s" % (os.path.basename(srcfile), path)) + shutil.copyfile(srcfile, os.path.join(path, os.path.basename(srcfile))) + + def searchFile(self, filename, top): + for root, dirs, files in os.walk(top, topdown=False): + if filename in files: + return os.path.join(root, filename) + return None + + def getTargets(self, verbose): + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", False) + targets = [] + for file in dc.files: + filename, extension = os.path.splitext(file) + if extension.lower() in ['.truck', '.terrn', '.load']: + targets.append(os.path.basename(file)) + + validtargets = [] + invalidtargets = [] + if len(targets) == 0: + log().info("### no targets found") + return validtargets, invalidtargets + + log().info("### found %d targets, checking them separatly now" % len(targets)) + for target in targets: + log().info("### checking target %s..." % target) + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.everythingfound: + validtargets.append(target) + else: + invalidtargets.append(target) + return validtargets, invalidtargets + + def getRoRMods(self, verbose): + import ror.depchecker + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + dc = ror.depchecker.RoRDepChecker(rorpath, "getfiles", "", False) + targets = [] + for file in dc.files: + filename, extension = os.path.splitext(file) + if extension.lower() in ['.truck', '.terrn', '.load']: + targets.append(os.path.basename(file)) + newtargets = [] + md5s = dc.readMD5File() + for target in targets: + if not os.path.basename(target) in md5s.keys(): + newtargets.append(target) + return newtargets + + \ No newline at end of file Modified: trunk/modtool.bat =================================================================== --- trunk/modtool.bat 2007-07-23 16:51:11 UTC (rev 121) +++ trunk/modtool.bat 2007-07-27 10:17:33 UTC (rev 122) @@ -1 +1 @@ -@%systemdrive%\python25\python.exe modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe D:\projects\sfproject\svn\trunk\modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/modtool.py =================================================================== --- trunk/modtool.py 2007-07-23 16:51:11 UTC (rev 121) +++ trunk/modtool.py 2007-07-27 10:17:33 UTC (rev 122) @@ -2,241 +2,7 @@ import sys, os, os.path, shutil sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) -from ror.logger import log -from ror.settingsManager import getSettingsManager -TEMPDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "temp") - -def removetemp(reporterrors=True): - if os.path.isdir(TEMPDIR): - try: - shutil.rmtree(TEMPDIR) - #os.rmdir(TEMPDIR) - except Exception, err: - if not reporterrors: - return - log().error(str(err)) - log().error("could not remove temporary diretory: %s! please delete by hand." % TEMPDIR) - sys.exit(1) - -def ExtractToTemp(filename): - file, extension = os.path.splitext(filename) - removetemp(False) - os.mkdir(TEMPDIR) - if extension.lower() == ".rar": - import UnRAR - dst = os.path.join(TEMPDIR, os.path.basename(filename)) - shutil.copyfile(filename, dst) - os.chdir(TEMPDIR) - UnRAR.Archive(os.path.basename(filename)).extract() - - # remove .rar file instantly - os.unlink(os.path.join(TEMPDIR, os.path.basename(filename))) - - # change back to current path - os.chdir(os.path.dirname(os.path.abspath(__file__))) - return True - elif extension.lower() == ".zip": - import UnZIP - UnZIP.unzip(filename, TEMPDIR) - return True - else: - log().info("copying "+filename+" to "+os.path.join(TEMPDIR, os.path.basename(filename))) - shutil.copyfile(filename, os.path.join(TEMPDIR, os.path.basename(filename))) - return False - -def installfile(maintarget, srcfile, dryrun): - file, extension = os.path.splitext(maintarget) - rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") - - if extension in ['.truck', '.load']: - path = os.path.join(rorpath, "data", "trucks") - elif extension in ['.terrn']: - path = os.path.join(rorpath, "data", "terrains") - else: - path = rorpath - if dryrun: - log().info("would install %s to %s" % (os.path.basename(srcfile), path)) - else: - log().info("installing %s to %s" % (os.path.basename(srcfile), path)) - shutil.copyfile(srcfile, os.path.join(path, os.path.basename(srcfile))) - -def searchFile(filename, top): - for root, dirs, files in os.walk(top, topdown=False): - if filename in files: - return os.path.join(root, filename) - return None - -def getTargets(verbose): - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", False) - targets = [] - for file in dc.files: - filename, extension = os.path.splitext(file) - if extension.lower() in ['.truck', '.terrn', '.load']: - targets.append(os.path.basename(file)) - - validtargets = [] - invalidtargets = [] - if len(targets) == 0: - log().info("### no targets found") - return validtargets, invalidtargets - - log().info("### found %d targets, checking them separatly now" % len(targets)) - for target in targets: - log().info("### checking target %s..." % target) - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) - if dc.everythingfound: - validtargets.append(target) - else: - invalidtargets.append(target) - return validtargets, invalidtargets - -def getRoRMods(verbose): - import ror.depchecker - rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") - dc = ror.depchecker.RoRDepChecker(rorpath, "getfiles", "", False) - targets = [] - for file in dc.files: - filename, extension = os.path.splitext(file) - if extension.lower() in ['.truck', '.terrn', '.load']: - targets.append(os.path.basename(file)) - newtargets = [] - md5s = dc.readMD5File() - for target in targets: - if not os.path.basename(target) in md5s.keys(): - newtargets.append(target) - return newtargets - - -def work(mode, targetfile, verbose, dryrun, installtarget=None): - log().info("### modinstaller started with %s, %s" % (mode, targetfile)) - if mode == "install": - filename = os.path.abspath(targetfile) - ExtractToTemp(targetfile) - target = installtarget - log().info("### validating target ...") - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) - if dc.invalid: - log().error("### target invalid!") - log().info("### please use the list mode to get valid targets") - usage() - - log().info("### target valid!") - #print dc.dstree - installcounter = 0 - for file in dc.dstree: - filename = file['filename'] - filenamefound = searchFile(filename, TEMPDIR) - if filenamefound is None: - log().error("File %s not found in %s!" % (filename, TEMPDIR)) - sys.exit(1) - installfile(target, filenamefound, dryrun) - installcounter += 1 - if dryrun: - log().info("### would install %d files." % installcounter) - else: - log().info("### %d files installed, finished!" % installcounter) - removetemp(False) - return [target] - - elif mode == "installall": - filename = os.path.abspath(targetfile) - ExtractToTemp(targetfile) - validtargets, invalidtargets = getTargets(verbose) - log().info("### installing %d found modifications:" % (len(validtargets))) - installcounter = 0 - for target in validtargets: - log().info("### installing modification '%s'" % target) - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) - if dc.dstree is None: - log().error("no dependenytree for File %s!" % (filename)) - continue - for file in dc.dstree: - filename = file['filename'] - filenamefound = searchFile(filename, TEMPDIR) - if filenamefound is None: - log().error("File %s not found in %s!" % (filename, TEMPDIR)) - sys.exit(1) - installfile(target, filenamefound, dryrun) - installcounter += 1 - if dryrun: - log().info("### would install %d files." % installcounter) - else: - log().info("### %d files installed, finished!" % installcounter) - removetemp(False) - return validtargets - - elif mode in ["list", "listall"]: - filename = os.path.abspath(targetfile) - ExtractToTemp(targetfile) - validtargets, invalidtargets = getTargets(verbose) - if mode == "listall": - if len(invalidtargets) > 0: - log().info("broken modifications found:") - for v in invalidtargets: - log().info(" %-20s" % v) - log().info("use the --verbose flag to find the missing files!") - else: - log().info("no broken modifications found") - - if len(validtargets) > 0: - log().info("installable modifications found:") - for v in validtargets: - log().info(" %-20s" % v) - else: - log().info("no installable modifications found! :(") - # todo : remove workaround! - removetemp(False) - return validtargets - - elif mode in ["listinstalled"]: - targets = getRoRMods(verbose) - if len(targets) > 0: - log().info("### Found Mods:") - for target in targets: - log().info(" "+target) - else: - log().info("### No Mods found!") - - if mode in ["uninstall"]: - rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") - log().info("### validating target ...") - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(rorpath, "dtree", targetfile, verbose) - if dc.invalid: - log().error("### target invalid! (Target not found)") - log().info("### please use the 'listinstalled' mode to get valid uninstallation targets") - return None - - log().info("### target valid!") - - #print dc.dstree - newtargets = [] - md5s = dc.readMD5File() - for file in dc.dstree: - filename = file['filename'] - if not os.path.basename(filename) in md5s.keys(): - newtargets.append(filename) - log().info("### removed %d files from dependency tree." % (len(dc.dstree)-len(newtargets))) - #print newtargets - if dryrun: - log().info("### would uninstall %d file(s):" % len(newtargets)) - else: - log().info("### uninstalling %d file(s):" % len(newtargets)) - for target in newtargets: - filenamefound = searchFile(target, rorpath) - if filenamefound is None: - log().error("### File not found: %s" % target) - continue - log().info(" %s" % filenamefound) - if not dryrun: - os.unlink(filenamefound) - - return None - def usage(): print "usage (general): %s <mode> <additionaloptions> [--verbose] [--dryrun]" % (os.path.basename(sys.argv[0])) print "list <filename>" @@ -248,6 +14,9 @@ print "installall <filename> --verbose --dryrun" print " install all found modifications in filename" print "" + print "installrepo <filename> --verbose --dryrun" + print " install all found modifications in filename that is downloaded from the repository" + print "" print "install <filename> <modification> --verbose --dryrun" print " install a certain modifications in filename (valid and invalid)" print "" @@ -262,7 +31,6 @@ sys.exit(0) def main(): - # check for valid RoR Directory! import ror.settingsManager rorpath = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") @@ -274,7 +42,7 @@ usage() mode = sys.argv[1] - if not mode in ['list', 'listall', 'install', 'installall', 'listinstalled','uninstall']: + if not mode in ['list', 'listall', 'install', 'installall', 'listinstalled','uninstall', 'installrepo']: usage() if len(sys.argv) < 4 and mode in ['install']: usage() @@ -286,11 +54,11 @@ usage() elif mode in ['listinstalled']: targetfile = rorpath + elif mode in ['installrepo']: + targetfile = sys.argv[2] elif mode == 'uninstall': targetfile = sys.argv[2] - - # get optional flags verbose = False dryrun = False @@ -311,9 +79,8 @@ installtarget = sys.argv[3] else: installtarget = None - work(mode, targetfile, verbose, dryrun, installtarget) + import ror.modtool + ror.modtool.ModTool().work(mode, targetfile, verbose, dryrun, installtarget) - - if __name__=="__main__": - main() \ No newline at end of file + main() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 16:51:13
|
Revision: 121 http://roreditor.svn.sourceforge.net/roreditor/?rev=121&view=rev Author: rorthomas Date: 2007-07-23 09:51:11 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * workaround for float numbers in terrain dependencies Modified Paths: -------------- trunk/lib/ror/depcheckerplugins/ror_terrn.py Modified: trunk/lib/ror/depcheckerplugins/ror_terrn.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_terrn.py 2007-07-23 15:39:08 UTC (rev 120) +++ trunk/lib/ror/depcheckerplugins/ror_terrn.py 2007-07-23 16:51:11 UTC (rev 121) @@ -27,7 +27,11 @@ if valname == "truck": valname = valnameg[-1].strip() if not valname in vals: - vals.append(valname) + try: + # workaround to ignore float numbers in here! + str(int(valname.replace(".",""))) == valname.replace(".","") + except: + vals.append(valname) # remove position info if len(vals) > 0: del vals[0] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 15:39:13
|
Revision: 120 http://roreditor.svn.sourceforge.net/roreditor/?rev=120&view=rev Author: rorthomas Date: 2007-07-23 08:39:08 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * added basic repository client Modified Paths: -------------- trunk/lib/ror/starter.py Added Paths: ----------- trunk/lib/ror/repomanager.py Added: trunk/lib/ror/repomanager.py =================================================================== --- trunk/lib/ror/repomanager.py (rev 0) +++ trunk/lib/ror/repomanager.py 2007-07-23 15:39:08 UTC (rev 120) @@ -0,0 +1,137 @@ +#Thomas Fischer 31/05/2007, th...@th... + +import repoclient + +import wx, wx.grid, wx.html, os, os.path, base64 +from datetime import * + +class HtmlRenderer(wx.grid.PyGridCellRenderer): + def Draw(self, grid, attr, dc, rect, row, col, isSelected): + + text = grid.GetCellValue(row, col) + + if isSelected: + bg = grid.GetSelectionBackground() + else: + bg = attr.GetBackgroundColour() + + bmp = wx.EmptyBitmap(*rect[2:4]) + mem_dc = wx.MemoryDC(bmp) + mem_dc.SetBackground(wx.Brush(bg, wx.SOLID)) + mem_dc.Clear() + + renderer = wx.html.HtmlDCRenderer() + renderer.SetDC(mem_dc, 0) + renderer.SetSize(*rect[2:4]) + renderer.SetHtmlText(text) + renderer.Render(0, 0, [0]) + + mem_dc.SelectObject(wx.NullBitmap) + + dc.DrawBitmap(bmp, 0, 0) + +class HtmlImageRenderer(wx.grid.PyGridCellRenderer): + def Draw(self, grid, attr, dc, rect, row, col, isSelected): + + text = grid.GetCellValue(row, col) + + if isSelected: + bg = grid.GetSelectionBackground() + else: + bg = attr.GetBackgroundColour() + + bmp = wx.EmptyBitmap(*rect[2:4]) + mem_dc = wx.MemoryDC(bmp) + mem_dc.SetBackground(wx.Brush(bg, wx.SOLID)) + mem_dc.Clear() + + renderer = wx.html.HtmlDCRenderer() + renderer.SetDC(mem_dc, 0) + renderer.SetSize(*rect[2:4]) + renderer.SetHtmlText("<img src='http://repository.rigsofrods.com/uimages/%s.thumb.png' />" % (text)) + renderer.Render(0, 0, [0]) + + mem_dc.SelectObject(wx.NullBitmap) + + dc.DrawBitmap(bmp, 0, 0) + +class ImageRenderer(wx.grid.PyGridCellRenderer): + def __init__(self, bmp): + wx.grid.PyGridCellRenderer.__init__(self) + self.bmp = bmp + + def Draw(self, grid, attr, dc, rect, row, col, isSelected): + if isSelected: + bg = grid.GetSelectionBackground() + else: + bg = attr.GetBackgroundColour() + dc.DrawRectangle(rect.x - 1, rect.y - 1, rect.width + 2, rect.height + 2) + dc.DrawBitmap(self.bmp, rect.x, rect.y) + + def GetBestSize(self, grid, attr, dc, row, col): + return wx.Size(self.bmp.GetWidth() + 2, self.bmp.GetHeight() + 2) + + def Clone(self): + return ImageRenderer + +class RepoClientTest(wx.Frame): + def __init__(self, *args, **kwds): + kwds["style"] = wx.DEFAULT_FRAME_STYLE + wx.Frame.__init__(self, *args, **kwds) + self.grid_1 = wx.grid.Grid(self, -1, size=(1, 1)) + self.data = repoclient.getFiles(-1) + self.__set_properties() + self.__do_layout() + + def __set_properties(self): + self.SetTitle("Repository Client") + self.SetSize((400, 400)) + self.grid_1.CreateGrid(len(self.data['data']),len(self.data['field'])) + + bmp = wx.Image("ror.ico", wx.BITMAP_TYPE_ANY).ConvertToBitmap() + #self.grid_1.SetCellRenderer(1, 1, ImageRenderer(bmp)) + #self.grid_1.SetCellRenderer(2, 1, ImageRenderer(bmp)) + + index = 0 + for item in self.data['field']: + self.grid_1.SetColLabelValue(index, item[0]) + index += 1 + for row in range(len(self.data['data'])): + #print row + for col in range(len(self.data['data'][row])): + values = self.data['data'][row][col] + if self.data['field'][col][0] == "filesize": + values = "%0.2f MB" % (float(values)/1024/1024) + elif self.data['field'][col][0] == "description": + values = "%s" % (base64.b64decode(values)) + self.grid_1.SetCellRenderer(row, col, wx.grid.GridCellAutoWrapStringRenderer()) + elif self.data['field'][col][0] == "date_added": + reftime = datetime ( 1970, 1, 1, 0, 0, 0 ) + delta = timedelta ( 0, int(values) ) + t = reftime + delta + values = str(t) + #self.grid_1.SetCellRenderer(row, col, ImageRenderer(bmp)) + elif self.data['field'][col][0] == "filesize": + values = "%0.2f MB" % (float(values)/1024/1024) + + self.grid_1.SetCellValue(row, col, str(values)) + + self.grid_1.AutoSize() + + def __do_layout(self): + sizer_1 =wx.BoxSizer(wx.VERTICAL) + sizer_1.Add(self.grid_1, 1, wx.EXPAND, 0) + self.SetAutoLayout(True) + self.SetSizer(sizer_1) + self.Layout() + +def main(): + app = wx.PySimpleApp(0) + wx.InitAllImageHandlers() + frame_1 = RepoClientTest(None, -1, "") + app.SetTopWindow(frame_1) + frame_1.Show() + app.MainLoop() + +if __name__ == "__main__": + main() \ No newline at end of file Modified: trunk/lib/ror/starter.py =================================================================== --- trunk/lib/ror/starter.py 2007-07-23 15:18:26 UTC (rev 119) +++ trunk/lib/ror/starter.py 2007-07-23 15:39:08 UTC (rev 120) @@ -63,6 +63,9 @@ self.btnDepGraph = wx.Button(self.panel, wx.ID_ANY, "Create dependency Graph") self.Bind(wx.EVT_BUTTON, self.OnDepGraph, self.btnDepGraph) + + self.btnRepClient = wx.Button(self.panel, wx.ID_ANY, "Open Repository Client") + self.Bind(wx.EVT_BUTTON, self.OnRepClient, self.btnRepClient) self.btnExit = wx.Button(self.panel, wx.ID_ANY, "Exit") self.Bind(wx.EVT_BUTTON, self.OnExit, self.btnExit) @@ -77,6 +80,10 @@ self.renderSystem = RENDERSYSTEMS[0] + def OnRepClient(self, event=None): + import repomanager + repomanager.main() + def displayRoRDir(self): if self.rordir == "": self.btnStartRoR.Enable(False) @@ -241,6 +248,7 @@ sizer_panel.Add(self.btnBugReport, 0, wx.EXPAND, 0) sizer_panel.Add(self.btnUpdate, 0, wx.EXPAND, 0) sizer_panel.Add(self.btnDepGraph, 0, wx.EXPAND, 0) + sizer_panel.Add(self.btnRepClient, 0, wx.EXPAND, 0) sizer_panel.Add(self.btnExit, 0, wx.EXPAND, 0) self.panel.SetSizer(sizer_panel) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 15:18:27
|
Revision: 119 http://roreditor.svn.sourceforge.net/roreditor/?rev=119&view=rev Author: rorthomas Date: 2007-07-23 08:18:26 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * added @ to .bat files, so the python.exe call is not shown Modified Paths: -------------- trunk/checkmods.bat trunk/depchecker.bat trunk/modtool.bat trunk/rortoolkit.bat trunk/terraineditor.bat trunk/truckeditor.bat trunk/update.bat trunk/updaterestart.bat Modified: trunk/checkmods.bat =================================================================== --- trunk/checkmods.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/checkmods.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe checkmods.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe checkmods.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/depchecker.bat =================================================================== --- trunk/depchecker.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/depchecker.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe depchecker.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe depchecker.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/modtool.bat =================================================================== --- trunk/modtool.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/modtool.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/rortoolkit.bat =================================================================== --- trunk/rortoolkit.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/rortoolkit.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe rortoolkit.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe rortoolkit.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/terraineditor.bat =================================================================== --- trunk/terraineditor.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/terraineditor.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe terraineditor.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe terraineditor.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/truckeditor.bat =================================================================== --- trunk/truckeditor.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/truckeditor.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe truckeditor.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe truckeditor.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/update.bat =================================================================== --- trunk/update.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/update.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe update.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe update.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Modified: trunk/updaterestart.bat =================================================================== --- trunk/updaterestart.bat 2007-07-23 15:15:08 UTC (rev 118) +++ trunk/updaterestart.bat 2007-07-23 15:18:26 UTC (rev 119) @@ -1 +1 @@ -%systemdrive%\python25\python.exe updaterestart.py %1 %2 %3 %4 %5 %6 %7 %8 %9 +@%systemdrive%\python25\python.exe updaterestart.py %1 %2 %3 %4 %5 %6 %7 %8 %9 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 15:15:10
|
Revision: 118 http://roreditor.svn.sourceforge.net/roreditor/?rev=118&view=rev Author: rorthomas Date: 2007-07-23 08:15:08 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * renamed installmod to modtool Added Paths: ----------- trunk/modtool.bat trunk/modtool.py Removed Paths: ------------- trunk/installmod.bat trunk/installmod.py Deleted: trunk/installmod.bat =================================================================== --- trunk/installmod.bat 2007-07-23 15:03:49 UTC (rev 117) +++ trunk/installmod.bat 2007-07-23 15:15:08 UTC (rev 118) @@ -1 +0,0 @@ -%systemdrive%\python25\python.exe installmod.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Deleted: trunk/installmod.py =================================================================== --- trunk/installmod.py 2007-07-23 15:03:49 UTC (rev 117) +++ trunk/installmod.py 2007-07-23 15:15:08 UTC (rev 118) @@ -1,317 +0,0 @@ -#Thomas Fischer 31/05/2007, th...@th... -import sys, os, os.path, shutil - -sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) -from ror.logger import log -from ror.settingsManager import getSettingsManager - -TEMPDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "temp") - -def removetemp(reporterrors=True): - if os.path.isdir(TEMPDIR): - try: - shutil.rmtree(TEMPDIR) - #os.rmdir(TEMPDIR) - except Exception, err: - if not reporterrors: - return - log().error(str(err)) - log().error("could not remove temporary diretory: %s! please delete by hand." % TEMPDIR) - sys.exit(1) - -def ExtractToTemp(filename): - file, extension = os.path.splitext(filename) - removetemp(False) - os.mkdir(TEMPDIR) - if extension.lower() == ".rar": - import UnRAR - dst = os.path.join(TEMPDIR, os.path.basename(filename)) - shutil.copyfile(filename, dst) - os.chdir(TEMPDIR) - UnRAR.Archive(os.path.basename(filename)).extract() - - # remove .rar file instantly - os.unlink(os.path.join(TEMPDIR, os.path.basename(filename))) - - # change back to current path - os.chdir(os.path.dirname(os.path.abspath(__file__))) - return True - elif extension.lower() == ".zip": - import UnZIP - UnZIP.unzip(filename, TEMPDIR) - return True - else: - log().info("copying "+filename+" to "+os.path.join(TEMPDIR, os.path.basename(filename))) - shutil.copyfile(filename, os.path.join(TEMPDIR, os.path.basename(filename))) - return False - -def installfile(maintarget, srcfile, dryrun): - file, extension = os.path.splitext(maintarget) - rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") - - if extension in ['.truck', '.load']: - path = os.path.join(rorpath, "data", "trucks") - elif extension in ['.terrn']: - path = os.path.join(rorpath, "data", "terrains") - else: - path = rorpath - if dryrun: - log().info("would install %s to %s" % (os.path.basename(srcfile), path)) - else: - log().info("installing %s to %s" % (os.path.basename(srcfile), path)) - shutil.copyfile(srcfile, os.path.join(path, os.path.basename(srcfile))) - -def searchFile(filename, top): - for root, dirs, files in os.walk(top, topdown=False): - if filename in files: - return os.path.join(root, filename) - return None - -def getTargets(verbose): - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", False) - targets = [] - for file in dc.files: - filename, extension = os.path.splitext(file) - if extension.lower() in ['.truck', '.terrn', '.load']: - targets.append(os.path.basename(file)) - - validtargets = [] - invalidtargets = [] - if len(targets) == 0: - log().info("### no targets found") - return validtargets, invalidtargets - - log().info("### found %d targets, checking them separatly now" % len(targets)) - for target in targets: - log().info("### checking target %s..." % target) - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) - if dc.everythingfound: - validtargets.append(target) - else: - invalidtargets.append(target) - return validtargets, invalidtargets - -def getRoRMods(verbose): - import ror.depchecker - rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") - dc = ror.depchecker.RoRDepChecker(rorpath, "getfiles", "", False) - targets = [] - for file in dc.files: - filename, extension = os.path.splitext(file) - if extension.lower() in ['.truck', '.terrn', '.load']: - targets.append(os.path.basename(file)) - newtargets = [] - md5s = dc.readMD5File() - for target in targets: - if not os.path.basename(target) in md5s.keys(): - newtargets.append(target) - return newtargets - - -def work(mode, targetfile, verbose, dryrun, installtarget=None): - log().info("### modinstaller started with %s, %s" % (mode, targetfile)) - if mode == "install": - filename = os.path.abspath(targetfile) - ExtractToTemp(targetfile) - target = installtarget - log().info("### validating target ...") - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) - if dc.invalid: - log().error("### target invalid!") - log().info("### please use the list mode to get valid targets") - usage() - - log().info("### target valid!") - #print dc.dstree - installcounter = 0 - for file in dc.dstree: - filename = file['filename'] - filenamefound = searchFile(filename, TEMPDIR) - if filenamefound is None: - log().error("File %s not found in %s!" % (filename, TEMPDIR)) - sys.exit(1) - installfile(target, filenamefound, dryrun) - installcounter += 1 - if dryrun: - log().info("### would install %d files." % installcounter) - else: - log().info("### %d files installed, finished!" % installcounter) - removetemp(False) - return [target] - - elif mode == "installall": - filename = os.path.abspath(targetfile) - ExtractToTemp(targetfile) - validtargets, invalidtargets = getTargets(verbose) - log().info("### installing %d found modifications:" % (len(validtargets))) - installcounter = 0 - for target in validtargets: - log().info("### installing modification '%s'" % target) - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) - if dc.dstree is None: - log().error("no dependenytree for File %s!" % (filename)) - continue - for file in dc.dstree: - filename = file['filename'] - filenamefound = searchFile(filename, TEMPDIR) - if filenamefound is None: - log().error("File %s not found in %s!" % (filename, TEMPDIR)) - sys.exit(1) - installfile(target, filenamefound, dryrun) - installcounter += 1 - if dryrun: - log().info("### would install %d files." % installcounter) - else: - log().info("### %d files installed, finished!" % installcounter) - removetemp(False) - return validtargets - - elif mode in ["list", "listall"]: - filename = os.path.abspath(targetfile) - ExtractToTemp(targetfile) - validtargets, invalidtargets = getTargets(verbose) - if mode == "listall": - if len(invalidtargets) > 0: - log().info("broken modifications found:") - for v in invalidtargets: - log().info(" %-20s" % v) - log().info("use the --verbose flag to find the missing files!") - else: - log().info("no broken modifications found") - - if len(validtargets) > 0: - log().info("installable modifications found:") - for v in validtargets: - log().info(" %-20s" % v) - else: - log().info("no installable modifications found! :(") - # todo : remove workaround! - removetemp(False) - return validtargets - - elif mode in ["listinstalled"]: - targets = getRoRMods(verbose) - log().info("### Found Mods:") - for target in targets: - log().info(" "+target) - if mode in ["uninstall"]: - rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") - log().info("### validating target ...") - import ror.depchecker - dc = ror.depchecker.RoRDepChecker(rorpath, "dtree", targetfile, verbose) - if dc.invalid: - log().error("### target invalid! (Target not found)") - log().info("### please use the 'listinstalled' mode to get valid uninstallation targets") - return None - - log().info("### target valid!") - - #print dc.dstree - newtargets = [] - md5s = dc.readMD5File() - for file in dc.dstree: - filename = file['filename'] - if not os.path.basename(filename) in md5s.keys(): - newtargets.append(filename) - log().info("### removed %d files from dependency tree." % (len(dc.dstree)-len(newtargets))) - #print newtargets - if dryrun: - log().info("### would uninstall %d file(s):" % len(newtargets)) - else: - log().info("### uninstalling %d file(s):" % len(newtargets)) - for target in newtargets: - filenamefound = searchFile(target, rorpath) - if filenamefound is None: - log().error("### File not found: %s" % target) - continue - log().info(" %s" % filenamefound) - if not dryrun: - os.unlink(filenamefound) - - - - return None - -def usage(): - print "usage (general): %s <mode> <additionaloptions> [--verbose] [--dryrun]" % (os.path.basename(sys.argv[0])) - print "list <filename>" - print " list all found and valid modifications in filename" - print "" - print "listall <filename> --verbose" - print " list all found modifications in filename (valid and invalid)" - print "" - print "installall <filename> --verbose --dryrun" - print " install all found modifications in filename" - print "" - print "install <filename> <modification> --verbose --dryrun" - print " install a certain modifications in filename (valid and invalid)" - print "" - print "listinstalled" - print " lists all installed RoR Mods" - print "" - print "uninstall <modname> --verbose --dryrun" - print " uninstalls a mod" - print "" - print "notes: the --verbose option is optional to increase the output for debugging" - print " the --dryrun option is optional and prints out what would be done" - sys.exit(0) - -def main(): - - # check for valid RoR Directory! - import ror.settingsManager - rorpath = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isfile(os.path.join(rorpath,"RoR.exe")): - import ror.starter - ror.starter.startApp() - - if len(sys.argv) < 2: - usage() - - mode = sys.argv[1] - if not mode in ['list', 'listall', 'install', 'installall', 'listinstalled','uninstall']: - usage() - if len(sys.argv) < 4 and mode in ['install']: - usage() - - if mode in ['list', 'listall', 'install', 'installall']: - targetfile = sys.argv[2] - if not os.path.isfile(targetfile): - log().error("%s is not a valid target filename!" % targetfile) - usage() - elif mode in ['listinstalled']: - targetfile = rorpath - elif mode == 'uninstall': - targetfile = sys.argv[2] - - - - # get optional flags - verbose = False - dryrun = False - for option in sys.argv: - if option == "--verbose": - verbose = True - if option == "--dryrun": - dryrun = True - - # Import Psyco if available - try: - import psyco - psyco.full() - except ImportError: - pass - - if len(sys.argv) == 4: - installtarget = sys.argv[3] - else: - installtarget = None - work(mode, targetfile, verbose, dryrun, installtarget) - - - -if __name__=="__main__": - main() \ No newline at end of file Copied: trunk/modtool.bat (from rev 112, trunk/installmod.bat) =================================================================== --- trunk/modtool.bat (rev 0) +++ trunk/modtool.bat 2007-07-23 15:15:08 UTC (rev 118) @@ -0,0 +1 @@ +%systemdrive%\python25\python.exe modtool.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Copied: trunk/modtool.py (from rev 117, trunk/installmod.py) =================================================================== --- trunk/modtool.py (rev 0) +++ trunk/modtool.py 2007-07-23 15:15:08 UTC (rev 118) @@ -0,0 +1,319 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path, shutil + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) +from ror.logger import log +from ror.settingsManager import getSettingsManager + +TEMPDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "temp") + +def removetemp(reporterrors=True): + if os.path.isdir(TEMPDIR): + try: + shutil.rmtree(TEMPDIR) + #os.rmdir(TEMPDIR) + except Exception, err: + if not reporterrors: + return + log().error(str(err)) + log().error("could not remove temporary diretory: %s! please delete by hand." % TEMPDIR) + sys.exit(1) + +def ExtractToTemp(filename): + file, extension = os.path.splitext(filename) + removetemp(False) + os.mkdir(TEMPDIR) + if extension.lower() == ".rar": + import UnRAR + dst = os.path.join(TEMPDIR, os.path.basename(filename)) + shutil.copyfile(filename, dst) + os.chdir(TEMPDIR) + UnRAR.Archive(os.path.basename(filename)).extract() + + # remove .rar file instantly + os.unlink(os.path.join(TEMPDIR, os.path.basename(filename))) + + # change back to current path + os.chdir(os.path.dirname(os.path.abspath(__file__))) + return True + elif extension.lower() == ".zip": + import UnZIP + UnZIP.unzip(filename, TEMPDIR) + return True + else: + log().info("copying "+filename+" to "+os.path.join(TEMPDIR, os.path.basename(filename))) + shutil.copyfile(filename, os.path.join(TEMPDIR, os.path.basename(filename))) + return False + +def installfile(maintarget, srcfile, dryrun): + file, extension = os.path.splitext(maintarget) + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + + if extension in ['.truck', '.load']: + path = os.path.join(rorpath, "data", "trucks") + elif extension in ['.terrn']: + path = os.path.join(rorpath, "data", "terrains") + else: + path = rorpath + if dryrun: + log().info("would install %s to %s" % (os.path.basename(srcfile), path)) + else: + log().info("installing %s to %s" % (os.path.basename(srcfile), path)) + shutil.copyfile(srcfile, os.path.join(path, os.path.basename(srcfile))) + +def searchFile(filename, top): + for root, dirs, files in os.walk(top, topdown=False): + if filename in files: + return os.path.join(root, filename) + return None + +def getTargets(verbose): + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", False) + targets = [] + for file in dc.files: + filename, extension = os.path.splitext(file) + if extension.lower() in ['.truck', '.terrn', '.load']: + targets.append(os.path.basename(file)) + + validtargets = [] + invalidtargets = [] + if len(targets) == 0: + log().info("### no targets found") + return validtargets, invalidtargets + + log().info("### found %d targets, checking them separatly now" % len(targets)) + for target in targets: + log().info("### checking target %s..." % target) + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.everythingfound: + validtargets.append(target) + else: + invalidtargets.append(target) + return validtargets, invalidtargets + +def getRoRMods(verbose): + import ror.depchecker + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + dc = ror.depchecker.RoRDepChecker(rorpath, "getfiles", "", False) + targets = [] + for file in dc.files: + filename, extension = os.path.splitext(file) + if extension.lower() in ['.truck', '.terrn', '.load']: + targets.append(os.path.basename(file)) + newtargets = [] + md5s = dc.readMD5File() + for target in targets: + if not os.path.basename(target) in md5s.keys(): + newtargets.append(target) + return newtargets + + +def work(mode, targetfile, verbose, dryrun, installtarget=None): + log().info("### modinstaller started with %s, %s" % (mode, targetfile)) + if mode == "install": + filename = os.path.abspath(targetfile) + ExtractToTemp(targetfile) + target = installtarget + log().info("### validating target ...") + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.invalid: + log().error("### target invalid!") + log().info("### please use the list mode to get valid targets") + usage() + + log().info("### target valid!") + #print dc.dstree + installcounter = 0 + for file in dc.dstree: + filename = file['filename'] + filenamefound = searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + removetemp(False) + return [target] + + elif mode == "installall": + filename = os.path.abspath(targetfile) + ExtractToTemp(targetfile) + validtargets, invalidtargets = getTargets(verbose) + log().info("### installing %d found modifications:" % (len(validtargets))) + installcounter = 0 + for target in validtargets: + log().info("### installing modification '%s'" % target) + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.dstree is None: + log().error("no dependenytree for File %s!" % (filename)) + continue + for file in dc.dstree: + filename = file['filename'] + filenamefound = searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + removetemp(False) + return validtargets + + elif mode in ["list", "listall"]: + filename = os.path.abspath(targetfile) + ExtractToTemp(targetfile) + validtargets, invalidtargets = getTargets(verbose) + if mode == "listall": + if len(invalidtargets) > 0: + log().info("broken modifications found:") + for v in invalidtargets: + log().info(" %-20s" % v) + log().info("use the --verbose flag to find the missing files!") + else: + log().info("no broken modifications found") + + if len(validtargets) > 0: + log().info("installable modifications found:") + for v in validtargets: + log().info(" %-20s" % v) + else: + log().info("no installable modifications found! :(") + # todo : remove workaround! + removetemp(False) + return validtargets + + elif mode in ["listinstalled"]: + targets = getRoRMods(verbose) + if len(targets) > 0: + log().info("### Found Mods:") + for target in targets: + log().info(" "+target) + else: + log().info("### No Mods found!") + + if mode in ["uninstall"]: + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + log().info("### validating target ...") + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(rorpath, "dtree", targetfile, verbose) + if dc.invalid: + log().error("### target invalid! (Target not found)") + log().info("### please use the 'listinstalled' mode to get valid uninstallation targets") + return None + + log().info("### target valid!") + + #print dc.dstree + newtargets = [] + md5s = dc.readMD5File() + for file in dc.dstree: + filename = file['filename'] + if not os.path.basename(filename) in md5s.keys(): + newtargets.append(filename) + log().info("### removed %d files from dependency tree." % (len(dc.dstree)-len(newtargets))) + #print newtargets + if dryrun: + log().info("### would uninstall %d file(s):" % len(newtargets)) + else: + log().info("### uninstalling %d file(s):" % len(newtargets)) + for target in newtargets: + filenamefound = searchFile(target, rorpath) + if filenamefound is None: + log().error("### File not found: %s" % target) + continue + log().info(" %s" % filenamefound) + if not dryrun: + os.unlink(filenamefound) + + return None + +def usage(): + print "usage (general): %s <mode> <additionaloptions> [--verbose] [--dryrun]" % (os.path.basename(sys.argv[0])) + print "list <filename>" + print " list all found and valid modifications in filename" + print "" + print "listall <filename> --verbose" + print " list all found modifications in filename (valid and invalid)" + print "" + print "installall <filename> --verbose --dryrun" + print " install all found modifications in filename" + print "" + print "install <filename> <modification> --verbose --dryrun" + print " install a certain modifications in filename (valid and invalid)" + print "" + print "listinstalled" + print " lists all installed RoR Mods" + print "" + print "uninstall <modname> --verbose --dryrun" + print " uninstalls a mod" + print "" + print "notes: the --verbose option is optional to increase the output for debugging" + print " the --dryrun option is optional and prints out what would be done" + sys.exit(0) + +def main(): + + # check for valid RoR Directory! + import ror.settingsManager + rorpath = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(rorpath,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + if len(sys.argv) < 2: + usage() + + mode = sys.argv[1] + if not mode in ['list', 'listall', 'install', 'installall', 'listinstalled','uninstall']: + usage() + if len(sys.argv) < 4 and mode in ['install']: + usage() + + if mode in ['list', 'listall', 'install', 'installall']: + targetfile = sys.argv[2] + if not os.path.isfile(targetfile): + log().error("%s is not a valid target filename!" % targetfile) + usage() + elif mode in ['listinstalled']: + targetfile = rorpath + elif mode == 'uninstall': + targetfile = sys.argv[2] + + + + # get optional flags + verbose = False + dryrun = False + for option in sys.argv: + if option == "--verbose": + verbose = True + if option == "--dryrun": + dryrun = True + + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + + if len(sys.argv) == 4: + installtarget = sys.argv[3] + else: + installtarget = None + work(mode, targetfile, verbose, dryrun, installtarget) + + + +if __name__=="__main__": + main() \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 15:03:50
|
Revision: 117 http://roreditor.svn.sourceforge.net/roreditor/?rev=117&view=rev Author: rorthomas Date: 2007-07-23 08:03:49 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * modinstaller can now uninstall mods * fixed cfg parser regarding ogre.cfg - file Modified Paths: -------------- trunk/installmod.py trunk/lib/ror/depchecker.py trunk/lib/ror/depcheckerplugins/ror_cfg.py trunk/lib/ror/depcheckerplugins/ror_material.py Modified: trunk/installmod.py =================================================================== --- trunk/installmod.py 2007-07-23 13:44:24 UTC (rev 116) +++ trunk/installmod.py 2007-07-23 15:03:49 UTC (rev 117) @@ -67,24 +67,6 @@ return os.path.join(root, filename) return None -def usage(): - print "usage (general): %s <filename> <mode> <additionaloptions> [--verbose] [--dryrun]" % (os.path.basename(sys.argv[0])) - print "<filename> list" - print " list all found and valid modifications in filename" - print "" - print "<filename> listall --verbose" - print " list all found modifications in filename (valid and invalid)" - print "" - print "<filename> installall --verbose" - print " install all found modifications in filename" - print "" - print "<filename> install <modification> --verbose" - print " install a certain modifications in filename (valid and invalid)" - print "" - print "notes: the --verbose option is optional to increase the output for debugging" - print " the --dryrun option just prints out which files would be copied/installed." - sys.exit(0) - def getTargets(verbose): import ror.depchecker dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", False) @@ -110,12 +92,28 @@ invalidtargets.append(target) return validtargets, invalidtargets +def getRoRMods(verbose): + import ror.depchecker + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + dc = ror.depchecker.RoRDepChecker(rorpath, "getfiles", "", False) + targets = [] + for file in dc.files: + filename, extension = os.path.splitext(file) + if extension.lower() in ['.truck', '.terrn', '.load']: + targets.append(os.path.basename(file)) + newtargets = [] + md5s = dc.readMD5File() + for target in targets: + if not os.path.basename(target) in md5s.keys(): + newtargets.append(target) + return newtargets + def work(mode, targetfile, verbose, dryrun, installtarget=None): - filename = os.path.abspath(targetfile) - ExtractToTemp(targetfile) log().info("### modinstaller started with %s, %s" % (mode, targetfile)) if mode == "install": + filename = os.path.abspath(targetfile) + ExtractToTemp(targetfile) target = installtarget log().info("### validating target ...") import ror.depchecker @@ -144,6 +142,8 @@ return [target] elif mode == "installall": + filename = os.path.abspath(targetfile) + ExtractToTemp(targetfile) validtargets, invalidtargets = getTargets(verbose) log().info("### installing %d found modifications:" % (len(validtargets))) installcounter = 0 @@ -168,7 +168,10 @@ log().info("### %d files installed, finished!" % installcounter) removetemp(False) return validtargets + elif mode in ["list", "listall"]: + filename = os.path.abspath(targetfile) + ExtractToTemp(targetfile) validtargets, invalidtargets = getTargets(verbose) if mode == "listall": if len(invalidtargets) > 0: @@ -188,23 +191,104 @@ # todo : remove workaround! removetemp(False) return validtargets + + elif mode in ["listinstalled"]: + targets = getRoRMods(verbose) + log().info("### Found Mods:") + for target in targets: + log().info(" "+target) + if mode in ["uninstall"]: + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + log().info("### validating target ...") + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(rorpath, "dtree", targetfile, verbose) + if dc.invalid: + log().error("### target invalid! (Target not found)") + log().info("### please use the 'listinstalled' mode to get valid uninstallation targets") + return None + + log().info("### target valid!") + + #print dc.dstree + newtargets = [] + md5s = dc.readMD5File() + for file in dc.dstree: + filename = file['filename'] + if not os.path.basename(filename) in md5s.keys(): + newtargets.append(filename) + log().info("### removed %d files from dependency tree." % (len(dc.dstree)-len(newtargets))) + #print newtargets + if dryrun: + log().info("### would uninstall %d file(s):" % len(newtargets)) + else: + log().info("### uninstalling %d file(s):" % len(newtargets)) + for target in newtargets: + filenamefound = searchFile(target, rorpath) + if filenamefound is None: + log().error("### File not found: %s" % target) + continue + log().info(" %s" % filenamefound) + if not dryrun: + os.unlink(filenamefound) + + + return None - + +def usage(): + print "usage (general): %s <mode> <additionaloptions> [--verbose] [--dryrun]" % (os.path.basename(sys.argv[0])) + print "list <filename>" + print " list all found and valid modifications in filename" + print "" + print "listall <filename> --verbose" + print " list all found modifications in filename (valid and invalid)" + print "" + print "installall <filename> --verbose --dryrun" + print " install all found modifications in filename" + print "" + print "install <filename> <modification> --verbose --dryrun" + print " install a certain modifications in filename (valid and invalid)" + print "" + print "listinstalled" + print " lists all installed RoR Mods" + print "" + print "uninstall <modname> --verbose --dryrun" + print " uninstalls a mod" + print "" + print "notes: the --verbose option is optional to increase the output for debugging" + print " the --dryrun option is optional and prints out what would be done" + sys.exit(0) + def main(): - if len(sys.argv) < 3: + + # check for valid RoR Directory! + import ror.settingsManager + rorpath = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(rorpath,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + if len(sys.argv) < 2: usage() - - targetfile = sys.argv[1] - if not os.path.isfile(targetfile): - log().error("%s is not a valid target filename!" % targetfile) - usage() - mode = sys.argv[2] - if not mode in ['list', 'listall', 'install', 'installall']: + mode = sys.argv[1] + if not mode in ['list', 'listall', 'install', 'installall', 'listinstalled','uninstall']: usage() if len(sys.argv) < 4 and mode in ['install']: usage() + + if mode in ['list', 'listall', 'install', 'installall']: + targetfile = sys.argv[2] + if not os.path.isfile(targetfile): + log().error("%s is not a valid target filename!" % targetfile) + usage() + elif mode in ['listinstalled']: + targetfile = rorpath + elif mode == 'uninstall': + targetfile = sys.argv[2] + + # get optional flags verbose = False dryrun = False @@ -214,12 +298,6 @@ if option == "--dryrun": dryrun = True - import ror.settingsManager - path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isfile(os.path.join(path,"RoR.exe")): - import ror.starter - ror.starter.startApp() - # Import Psyco if available try: import psyco Modified: trunk/lib/ror/depchecker.py =================================================================== --- trunk/lib/ror/depchecker.py 2007-07-23 13:44:24 UTC (rev 116) +++ trunk/lib/ror/depchecker.py 2007-07-23 15:03:49 UTC (rev 117) @@ -121,6 +121,7 @@ l = line.split(" ") md5s[l[0]] = l[1] self.orgMD5s = md5s + return md5s def readFile(self, filename): f=open(filename, 'rb') Modified: trunk/lib/ror/depcheckerplugins/ror_cfg.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_cfg.py 2007-07-23 13:44:24 UTC (rev 116) +++ trunk/lib/ror/depcheckerplugins/ror_cfg.py 2007-07-23 15:03:49 UTC (rev 117) @@ -27,7 +27,7 @@ # ignore standart configuration files file = os.path.basename(filename).lower() - if file in ['editor.cfg', 'resources.cfg', 'ror.cfg', 'wavefield.cfg', 'plugins.cfg']: + if file in ['editor.cfg', 'resources.cfg', 'ror.cfg', 'wavefield.cfg', 'plugins.cfg', 'ogre.cfg']: return {OPTIONAL:{},REQUIRES:{},PROVIDES:{}} dep = [] Modified: trunk/lib/ror/depcheckerplugins/ror_material.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_material.py 2007-07-23 13:44:24 UTC (rev 116) +++ trunk/lib/ror/depcheckerplugins/ror_material.py 2007-07-23 15:03:49 UTC (rev 117) @@ -26,7 +26,8 @@ dep = parseRE(content, RE1) prov = parseRE(content, RE2) if len(dep) == 0: - print "no texture found in material file " + filename + #print "no texture found in material file " + filename + pass if len(prov) == 0: print "no material found in material file " + filename else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 13:44:27
|
Revision: 116 http://roreditor.svn.sourceforge.net/roreditor/?rev=116&view=rev Author: rorthomas Date: 2007-07-23 06:44:24 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * fixed dependency graph function Modified Paths: -------------- trunk/lib/ror/depchecker.py trunk/lib/ror/starter.py Modified: trunk/lib/ror/depchecker.py =================================================================== --- trunk/lib/ror/depchecker.py 2007-07-23 13:40:41 UTC (rev 115) +++ trunk/lib/ror/depchecker.py 2007-07-23 13:44:24 UTC (rev 116) @@ -157,7 +157,7 @@ for rel in fileA[REQUIRES][FILE]: e = (filenameA, rel) edges.append(e) - os.path.join(GRAPHPATH, 'alldependencies.png') + fn = os.path.join(GRAPHPATH, 'alldependencies.png') else: od = -1 parents = [] Modified: trunk/lib/ror/starter.py =================================================================== --- trunk/lib/ror/starter.py 2007-07-23 13:40:41 UTC (rev 115) +++ trunk/lib/ror/starter.py 2007-07-23 13:44:24 UTC (rev 116) @@ -120,7 +120,7 @@ def OnDepGraph(self, event=None): import ror.depchecker ror.depchecker.RoRDepChecker(self.rordir, "all", "") - file = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..\\..\\dependencies.png")) + file = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..\\..\\graphs\\alldependencies.png")) print file if os.path.isfile(file): dlg = wx.MessageDialog(self, "Graph successfully created:\n"+file, "Info", wx.OK | wx.ICON_INFORMATION) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 13:40:43
|
Revision: 115 http://roreditor.svn.sourceforge.net/roreditor/?rev=115&view=rev Author: rorthomas Date: 2007-07-23 06:40:41 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * improved output Modified Paths: -------------- trunk/installmod.py trunk/lib/ror/depcheckerplugins/ror_cfg.py trunk/lib/ror/truckparser.py Modified: trunk/installmod.py =================================================================== --- trunk/installmod.py 2007-07-23 12:18:36 UTC (rev 114) +++ trunk/installmod.py 2007-07-23 13:40:41 UTC (rev 115) @@ -41,7 +41,7 @@ UnZIP.unzip(filename, TEMPDIR) return True else: - log.info("copying "+filename+" to "+os.path.join(TEMPDIR, os.path.basename(filename))) + log().info("copying "+filename+" to "+os.path.join(TEMPDIR, os.path.basename(filename))) shutil.copyfile(filename, os.path.join(TEMPDIR, os.path.basename(filename))) return False @@ -96,6 +96,10 @@ validtargets = [] invalidtargets = [] + if len(targets) == 0: + log().info("### no targets found") + return validtargets, invalidtargets + log().info("### found %d targets, checking them separatly now" % len(targets)) for target in targets: log().info("### checking target %s..." % target) Modified: trunk/lib/ror/depcheckerplugins/ror_cfg.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_cfg.py 2007-07-23 12:18:36 UTC (rev 114) +++ trunk/lib/ror/depcheckerplugins/ror_cfg.py 2007-07-23 13:40:41 UTC (rev 115) @@ -35,6 +35,8 @@ tmp = parseRE(content, re) if not tmp is None: dep.append(tmp) + else: + print "ERROR !!! required value not found in terrain config file %s!" % filename if len(dep) == 0: print "no configuration found in terrain config file " + filename Modified: trunk/lib/ror/truckparser.py =================================================================== --- trunk/lib/ror/truckparser.py 2007-07-23 12:18:36 UTC (rev 114) +++ trunk/lib/ror/truckparser.py 2007-07-23 13:40:41 UTC (rev 115) @@ -535,6 +535,8 @@ return True def errorMsg(self, filename, lineno, sectionname, sectiontype, argname, line, msgold): + if not self.verbose: + return argpath = "/%s/%s/%s" % (sectiontype, sectionname, argname) msg = "%20s:%04d %-30s | %-40s | %s" % \ (os.path.basename(filename), int(lineno) + 1, argpath, @@ -579,6 +581,7 @@ def parse(self, filename, verbose = True): self.filename = filename + self.verbose = verbose content = None try: infile = open(filename,'r') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 12:18:37
|
Revision: 114 http://roreditor.svn.sourceforge.net/roreditor/?rev=114&view=rev Author: rorthomas Date: 2007-07-23 05:18:36 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * checkmods.py improved * installmod.py output improved * depchecker graphs fixed * truckparser fixed Modified Paths: -------------- trunk/checkmods.py trunk/installmod.py trunk/lib/ror/depchecker.py trunk/lib/ror/depcheckerplugins/ror_truck.py trunk/lib/ror/truckparser.py Modified: trunk/checkmods.py =================================================================== --- trunk/checkmods.py 2007-07-23 10:31:00 UTC (rev 113) +++ trunk/checkmods.py 2007-07-23 12:18:36 UTC (rev 114) @@ -1,5 +1,8 @@ import os.path, sys, installmod, time +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) +from ror.logger import log +from ror.settingsManager import getSettingsManager def getFiles(top): fl = {} @@ -8,9 +11,9 @@ fn = os.path.join(root, f) fl[fn] = {} for fk in fl.keys(): - print "%10s %s" % ("", os.path.basename(fk)) + log().info("%10s %s" % ("", os.path.basename(fk))) - print "found %d files!" % (len(fl.keys())) + log().info("found %d files!" % (len(fl.keys()))) return fl def main(): @@ -21,22 +24,21 @@ counter = 0 countervalid = 0 for file in files.keys(): - print "## %s (%d/%d)##############################################" % (os.path.basename(file), counter, len(files)) + log().info("## %s (%d/%d)##################################" % (os.path.basename(file), counter, len(files))) counter += 1 - mods = installmod.work(mode, file, True, False) + mods = installmod.work(mode, file, verbose=(len(sys.argv)== 4 and sys.argv[3] == "--verbose"), dryrun=True) if len(mods) == 0: - print "!!! INVALID: ", os.path.basename(file) + log().info("!!! INVALID: "+ os.path.basename(file)) else: - print "VALID: ", os.path.basename(file) + log().info("VALID: "+ os.path.basename(file)) valid[file] = mods - print "#######################################################################" + log().info("#######################################################################") time.sleep(0.01) - print "################################################" - print "################################################" - print "################################################" + log().info("===========================================================") + log().info("===== FINISHED found, valid mods:") for f in valid.keys(): - print f, valid[f] - print "%d of %d files containing valid mods!" % (len(valid), len(files)) + log().info( f + str(valid[f])) + log().info("%d of %d files containing valid mods!" % (len(valid), len(files))) if __name__=="__main__": Modified: trunk/installmod.py =================================================================== --- trunk/installmod.py 2007-07-23 10:31:00 UTC (rev 113) +++ trunk/installmod.py 2007-07-23 12:18:36 UTC (rev 114) @@ -41,7 +41,7 @@ UnZIP.unzip(filename, TEMPDIR) return True else: - print filename, " to ", os.path.join(TEMPDIR, os.path.basename(filename)) + log.info("copying "+filename+" to "+os.path.join(TEMPDIR, os.path.basename(filename))) shutil.copyfile(filename, os.path.join(TEMPDIR, os.path.basename(filename))) return False @@ -96,7 +96,9 @@ validtargets = [] invalidtargets = [] + log().info("### found %d targets, checking them separatly now" % len(targets)) for target in targets: + log().info("### checking target %s..." % target) dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) if dc.everythingfound: validtargets.append(target) @@ -108,6 +110,7 @@ def work(mode, targetfile, verbose, dryrun, installtarget=None): filename = os.path.abspath(targetfile) ExtractToTemp(targetfile) + log().info("### modinstaller started with %s, %s" % (mode, targetfile)) if mode == "install": target = installtarget log().info("### validating target ...") Modified: trunk/lib/ror/depchecker.py =================================================================== --- trunk/lib/ror/depchecker.py 2007-07-23 10:31:00 UTC (rev 113) +++ trunk/lib/ror/depchecker.py 2007-07-23 12:18:36 UTC (rev 114) @@ -14,6 +14,7 @@ RORDEPSFILENAME = "031a_deps.bin" MD5FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), MD5FILENAME) RORDEPSFILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), RORDEPSFILENAME) +GRAPHPATH = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", ".." ,"graphs")) class RoRDepChecker: def __init__(self, path, mode, dependfilename, verbose=True): @@ -42,7 +43,7 @@ if dependfilename != "": self.generateSingleDep() - if mode == "all": + if mode == "all" and verbose: self.tryGraph() def saveTree(self, filename): @@ -76,8 +77,10 @@ for rsub in req: if rr['filename'] == rsub['filename']: duplicate = True - #if not duplicate: - req.append(rr) + + # enable for graph functions (allows multiple arrows then) + if not duplicate: + req.append(rr) except: pass return req @@ -105,7 +108,7 @@ self.dstree = tree - if self.verbose: + if self.verbose and len(tree) > 1: self.tryGraph(tree) @@ -144,6 +147,8 @@ def drawGraph(self, tree = None): import pydot + if not os.path.isdir(GRAPHPATH): + os.mkdir(GRAPHPATH) edges = [] if tree is None: for filenameA in self.filedeps.keys(): @@ -152,7 +157,7 @@ for rel in fileA[REQUIRES][FILE]: e = (filenameA, rel) edges.append(e) - fn = 'dependencies.png' + os.path.join(GRAPHPATH, 'alldependencies.png') else: od = -1 parents = [] @@ -165,18 +170,16 @@ edges.append((parents[-1], f)) parents.append(f) elif d == od: - #print "2" - edges.append((parents[-1], f)) + #print "2", (parents[-2], f) + edges.append((parents[-2], f)) elif d < od: for i in range(0, od - d + 1): del parents[-1] #print "3", od - d, (parents[-1], f) edges.append((parents[-1], f)) parents.append(f) - - od = d - fn = 'dependencies_single.png' + fn = os.path.join(GRAPHPATH, self.dependfilename + '_dependencies.png') pass #edges = [(1,2), (1,3), (1,4), (3,4)] @@ -279,7 +282,8 @@ found = True break if not found and relation != OPTIONAL: - notfound[type].append(reqfile) + if not reqfile in notfound[type]: + notfound[type].append(reqfile) self.filedeps = newtree #print newtree self.everythingfound = False Modified: trunk/lib/ror/depcheckerplugins/ror_truck.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_truck.py 2007-07-23 10:31:00 UTC (rev 113) +++ trunk/lib/ror/depcheckerplugins/ror_truck.py 2007-07-23 12:18:36 UTC (rev 114) @@ -16,7 +16,6 @@ if 'props' in p.tree.keys(): for prop in p.tree['props']: props.append(prop['data'][-1]) - #print props #print truckname return { Modified: trunk/lib/ror/truckparser.py =================================================================== --- trunk/lib/ror/truckparser.py 2007-07-23 10:31:00 UTC (rev 113) +++ trunk/lib/ror/truckparser.py 2007-07-23 12:18:36 UTC (rev 114) @@ -521,7 +521,7 @@ # tree of the actual file's data tree = None - ### this will hold all comments + # this will hold all comments comments = None links = [ @@ -654,15 +654,26 @@ newargs.append(args[argnum]) args = newargs #ok + # continue to next line, do not further parse it! + continue else: # no other args except the command itself args = [] + # continue to next line, do not further parse it! + continue argumentsection = self.commands[cmdcheck] argumentsection_str = "command" else: argumentsection = self.sections[actualsection] argumentsection_str = "section" argumenttree = [] + + # debug stuff: + #print actualsection, argnum, args + #print (args), (argumentsection) + #if len(args) < len(argumentsection): + # print "too short!!" + for argnum in range(0, len(argumentsection)): if argnum >= len(args) and not self.argIsRequired(argumentsection[argnum]): continue This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 10:31:04
|
Revision: 113 http://roreditor.svn.sourceforge.net/roreditor/?rev=113&view=rev Author: rorthomas Date: 2007-07-23 03:31:00 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * improved UnZIP * added 'n' option to truckparser.py * improved ror_mesh with timeout for waiting on ogrexmlconverter * installmod now callable from outside * checkmods commands added to automate the installmod command for all the files in it Modified Paths: -------------- trunk/installmod.py trunk/lib/UnZIP/__init__.py trunk/lib/ror/depchecker.py trunk/lib/ror/depcheckerplugins/ror_mesh.py trunk/lib/ror/truckparser.py Added Paths: ----------- trunk/checkmods.bat trunk/checkmods.py Added: trunk/checkmods.bat =================================================================== --- trunk/checkmods.bat (rev 0) +++ trunk/checkmods.bat 2007-07-23 10:31:00 UTC (rev 113) @@ -0,0 +1 @@ +%systemdrive%\python25\python.exe checkmods.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Added: trunk/checkmods.py =================================================================== --- trunk/checkmods.py (rev 0) +++ trunk/checkmods.py 2007-07-23 10:31:00 UTC (rev 113) @@ -0,0 +1,43 @@ +import os.path, sys, installmod, time + + +def getFiles(top): + fl = {} + for root, dirs, files in os.walk(top): + for f in files: + fn = os.path.join(root, f) + fl[fn] = {} + for fk in fl.keys(): + print "%10s %s" % ("", os.path.basename(fk)) + + print "found %d files!" % (len(fl.keys())) + return fl + +def main(): + dir = sys.argv[1] + mode = sys.argv[2] + files = getFiles(dir) + valid={} + counter = 0 + countervalid = 0 + for file in files.keys(): + print "## %s (%d/%d)##############################################" % (os.path.basename(file), counter, len(files)) + counter += 1 + mods = installmod.work(mode, file, True, False) + if len(mods) == 0: + print "!!! INVALID: ", os.path.basename(file) + else: + print "VALID: ", os.path.basename(file) + valid[file] = mods + print "#######################################################################" + time.sleep(0.01) + print "################################################" + print "################################################" + print "################################################" + for f in valid.keys(): + print f, valid[f] + print "%d of %d files containing valid mods!" % (len(valid), len(files)) + + +if __name__=="__main__": + main() \ No newline at end of file Modified: trunk/installmod.py =================================================================== --- trunk/installmod.py 2007-07-23 08:40:03 UTC (rev 112) +++ trunk/installmod.py 2007-07-23 10:31:00 UTC (rev 113) @@ -11,6 +11,7 @@ if os.path.isdir(TEMPDIR): try: shutil.rmtree(TEMPDIR) + #os.rmdir(TEMPDIR) except Exception, err: if not reporterrors: return @@ -20,14 +21,18 @@ def ExtractToTemp(filename): file, extension = os.path.splitext(filename) - removetemp() + removetemp(False) + os.mkdir(TEMPDIR) if extension.lower() == ".rar": import UnRAR - os.mkdir(TEMPDIR) dst = os.path.join(TEMPDIR, os.path.basename(filename)) shutil.copyfile(filename, dst) os.chdir(TEMPDIR) - UnRAR.Archive(os.path.basename(filename)).extract() + UnRAR.Archive(os.path.basename(filename)).extract() + + # remove .rar file instantly + os.unlink(os.path.join(TEMPDIR, os.path.basename(filename))) + # change back to current path os.chdir(os.path.dirname(os.path.abspath(__file__))) return True @@ -36,7 +41,8 @@ UnZIP.unzip(filename, TEMPDIR) return True else: - shutil.copyfile(filename, dst) + print filename, " to ", os.path.join(TEMPDIR, os.path.basename(filename)) + shutil.copyfile(filename, os.path.join(TEMPDIR, os.path.basename(filename))) return False def installfile(maintarget, srcfile, dryrun): @@ -81,7 +87,7 @@ def getTargets(verbose): import ror.depchecker - dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", verbose) + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", False) targets = [] for file in dc.files: filename, extension = os.path.splitext(file) @@ -98,52 +104,14 @@ invalidtargets.append(target) return validtargets, invalidtargets - -def main(): - if len(sys.argv) < 3: - usage() - - targetfile = sys.argv[1] - if not os.path.isfile(targetfile): - log().error("%s is not a valid target filename!" % targetfile) - usage() - mode = sys.argv[2] - if not mode in ['list', 'listall', 'install', 'installall']: - usage() - if len(sys.argv) < 4 and mode in ['install']: - usage() - - # get optional flags - verbose = False - dryrun = False - for option in sys.argv: - if option == "--verbose": - verbose = True - if option == "--dryrun": - dryrun = True - - - import ror.settingsManager - path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") - if not os.path.isfile(os.path.join(path,"RoR.exe")): - import ror.starter - ror.starter.startApp() - - # Import Psyco if available - try: - import psyco - psyco.full() - except ImportError: - pass - +def work(mode, targetfile, verbose, dryrun, installtarget=None): filename = os.path.abspath(targetfile) - ExtractToTemp(filename) - + ExtractToTemp(targetfile) if mode == "install": - target = sys.argv[3] + target = installtarget + log().info("### validating target ...") import ror.depchecker - log().info("### validating target ...") dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) if dc.invalid: log().error("### target invalid!") @@ -165,14 +133,20 @@ log().info("### would install %d files." % installcounter) else: log().info("### %d files installed, finished!" % installcounter) - + removetemp(False) + return [target] + elif mode == "installall": validtargets, invalidtargets = getTargets(verbose) log().info("### installing %d found modifications:" % (len(validtargets))) installcounter = 0 for target in validtargets: log().info("### installing modification '%s'" % target) + import ror.depchecker dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.dstree is None: + log().error("no dependenytree for File %s!" % (filename)) + continue for file in dc.dstree: filename = file['filename'] filenamefound = searchFile(filename, TEMPDIR) @@ -185,26 +159,74 @@ log().info("### would install %d files." % installcounter) else: log().info("### %d files installed, finished!" % installcounter) - + removetemp(False) + return validtargets elif mode in ["list", "listall"]: validtargets, invalidtargets = getTargets(verbose) if mode == "listall": if len(invalidtargets) > 0: - print "broken modifications found:" + log().info("broken modifications found:") for v in invalidtargets: - print " %-20s" % v - print "use the --verbose flag to find the missing files!" + log().info(" %-20s" % v) + log().info("use the --verbose flag to find the missing files!") else: - print "no broken modifications found:" + log().info("no broken modifications found") if len(validtargets) > 0: - print "installable modifications found: " + log().info("installable modifications found:") for v in validtargets: - print " %-20s" % v + log().info(" %-20s" % v) else: - print "no installable modifications found! :(" - removetemp(False) + log().info("no installable modifications found! :(") + # todo : remove workaround! + removetemp(False) + return validtargets + return None + +def main(): + if len(sys.argv) < 3: + usage() + targetfile = sys.argv[1] + if not os.path.isfile(targetfile): + log().error("%s is not a valid target filename!" % targetfile) + usage() + mode = sys.argv[2] + if not mode in ['list', 'listall', 'install', 'installall']: + usage() + if len(sys.argv) < 4 and mode in ['install']: + usage() + + # get optional flags + verbose = False + dryrun = False + for option in sys.argv: + if option == "--verbose": + verbose = True + if option == "--dryrun": + dryrun = True + + import ror.settingsManager + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(path,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + + if len(sys.argv) == 4: + installtarget = sys.argv[3] + else: + installtarget = None + work(mode, targetfile, verbose, dryrun, installtarget) + + + if __name__=="__main__": main() \ No newline at end of file Modified: trunk/lib/UnZIP/__init__.py =================================================================== --- trunk/lib/UnZIP/__init__.py 2007-07-23 08:40:03 UTC (rev 112) +++ trunk/lib/UnZIP/__init__.py 2007-07-23 10:31:00 UTC (rev 113) @@ -1,12 +1,27 @@ import sys, zipfile, os, os.path def unzip(file, dir): - os.mkdir(dir) - zfobj = zipfile.ZipFile(file) - for name in zfobj.namelist(): - if name.endswith('/'): - os.mkdir(os.path.join(dir, name)) - else: - outfile = open(os.path.join(dir, name), 'wb') - outfile.write(zfobj.read(name)) - outfile.close() + try: + os.mkdir(dir) + except: + pass + try: + zfobj = zipfile.ZipFile(file) + for name in zfobj.namelist(): + if name.endswith('/'): + os.mkdir(os.path.join(dir, name)) + else: + dirnow = dir + dirnow = dirnow.replace("/", "\\") + subdirs = name.split("/") + if len(subdirs) > 0: + for subdir in subdirs: + dirnow = os.path.join(dirnow, subdir) + if not os.path.isdir(os.path.dirname(dirnow)): + os.mkdir(os.path.dirname(dirnow)) + outfile = open(dirnow, 'wb') + outfile.write(zfobj.read(name)) + outfile.close() + except Exception, err: + print str(err) + return \ No newline at end of file Modified: trunk/lib/ror/depchecker.py =================================================================== --- trunk/lib/ror/depchecker.py 2007-07-23 08:40:03 UTC (rev 112) +++ trunk/lib/ror/depchecker.py 2007-07-23 10:31:00 UTC (rev 113) @@ -359,7 +359,7 @@ fl[fn]['md5'] = self.md5Sum(fn) if self.verbose: for fk in fl.keys(): - infostr = "%10s %s" % ("", fk) + infostr = "%10s %s" % ("", os.path.basename(fk)) log().info(infostr) log().info("found %d files!" % (len(fl.keys()))) self.files = fl Modified: trunk/lib/ror/depcheckerplugins/ror_mesh.py =================================================================== --- trunk/lib/ror/depcheckerplugins/ror_mesh.py 2007-07-23 08:40:03 UTC (rev 112) +++ trunk/lib/ror/depcheckerplugins/ror_mesh.py 2007-07-23 10:31:00 UTC (rev 113) @@ -1,5 +1,5 @@ import sys, os, os.path, re -import subprocess +import subprocess,os,sys,signal,pty,time,errno,thread from deptools import * @@ -19,12 +19,58 @@ print "calling " + cmd p = subprocess.Popen(cmd, shell = False, cwd = os.path.dirname(CONVERTERBIN), stderr = subprocess.PIPE, stdout = subprocess.PIPE) - p.wait() + smart_wait_for_subprocess(p, 10) if not os.path.isfile(os.path.join(os.path.dirname(filename), os.path.basename(filename)+".xml")): print "conversion of mesh file %s failed!" % filename print "mesh converted: " + filename +def smart_wait_for_subprocess(sp,timeout=30): + """ + Will wait for Process given to expire, and then kill it if + the time elapses (or never if timeout==0). + @param sp: Subprocess to watch + @param timeout: timeout length in seconds + """ + running=1 + try: + sleeps=timeout*4 + #Just wait around for termination... + + while sp.poll()==None: + #print>>efp,"WAITING:",sleeps + sleeps-=1 + time.sleep(.25) + os.kill(sp.pid,0) + if sleeps<=0 and timeout>0: + os.kill(sp.pid,signal.SIGTERM) + break + elif sleeps<=0: + break + #Did it REALLY exit? + try: + os.kill(sp.pid,0) + sleeps=20 + while sp.poll()==None: + #print>>efp,"KILLING:",sleeps + sleeps-=1 + time.sleep(.25) + + #No? KILL IT! + if sleeps<=0 and timeout>0: + #print>>efp,"KILLING2:",sleeps + os.kill(sp.pid,signal.SIGKILL) + break + elif sleeps<=0: + break + except: + running=0 + except: + #Make REALLY effing sure it exited. + os.kill(sp.pid,signal.SIGKILL) + #print>>efp,"KILLING2:",sleeps + + def parseRE(content): deps = [] for line in content: Modified: trunk/lib/ror/truckparser.py =================================================================== --- trunk/lib/ror/truckparser.py 2007-07-23 08:40:03 UTC (rev 112) +++ trunk/lib/ror/truckparser.py 2007-07-23 10:31:00 UTC (rev 113) @@ -169,8 +169,9 @@ {'name':'second node', 'type':'node'}, {'name':'options', 'type':'string', 'required':False, - 'default':None, + 'default':'n', 'validvalues':[ + 'n', # visible, default 'v', # visible, default 'i', # this beam is invisible. Very usefull to hide "cheating" structural beam, or to improve performances once the truck is textured. 'r', # this beam is a rope (opposes no force to compression) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-23 08:40:07
|
Revision: 112 http://roreditor.svn.sourceforge.net/roreditor/?rev=112&view=rev Author: rorthomas Date: 2007-07-23 01:40:03 -0700 (Mon, 23 Jul 2007) Log Message: ----------- * bugreport: added editorlog.log * depchecker: added ability to remove missing files by comparing to original RoR files * added some depchecker 'plugins' * added unzip/unrar ability * terraineditor: removed 'saved' dialog * added installmod script, which is able to install modifications out of a .rar or .zip * 031a_deps.bin : saved dependency tree for Rigs of Rods 0.31a Modified Paths: -------------- trunk/lib/ror/bugreport.py trunk/lib/ror/depchecker.py trunk/lib/ror/depcheckerplugins/ror_mesh.py trunk/lib/ror/depcheckerplugins/ror_overlay.py trunk/lib/ror/depcheckerplugins/ror_terrn.py trunk/lib/ror/repoclient.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py Added Paths: ----------- trunk/installmod.bat trunk/installmod.py trunk/lib/UnRAR/ trunk/lib/UnRAR/__init__.py trunk/lib/UnRAR/unrar.dll trunk/lib/UnZIP/ trunk/lib/UnZIP/__init__.py trunk/lib/ror/031a_deps.bin trunk/lib/ror/depcheckerplugins/ror_afl.py trunk/lib/ror/depcheckerplugins/ror_asm.py trunk/lib/ror/depcheckerplugins/ror_cfg.py trunk/lib/ror/depcheckerplugins/ror_cg.py trunk/lib/ror/depcheckerplugins/ror_compositor.py trunk/lib/ror/depcheckerplugins/ror_dll.py trunk/lib/ror/depcheckerplugins/ror_exe.py trunk/lib/ror/depcheckerplugins/ror_glsl.py trunk/lib/ror/depcheckerplugins/ror_hlsl.py trunk/lib/ror/depcheckerplugins/ror_msi.py trunk/lib/ror/depcheckerplugins/ror_particle.py trunk/lib/ror/depcheckerplugins/ror_psd.py trunk/lib/ror/depcheckerplugins/ror_raw.py trunk/lib/ror/depcheckerplugins/ror_skeleton.py trunk/lib/ror/depcheckerplugins/ror_txt.py trunk/lib/ror/depcheckerplugins/ror_wav.py trunk/lib/ror/depcheckerplugins/ror_xml.py trunk/lib/ror/depcheckerplugins/ror_zip.py trunk/testunrar.py trunk/testunzip.py Added: trunk/installmod.bat =================================================================== --- trunk/installmod.bat (rev 0) +++ trunk/installmod.bat 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1 @@ +%systemdrive%\python25\python.exe installmod.py %1 %2 %3 %4 %5 %6 %7 %8 %9 Added: trunk/installmod.py =================================================================== --- trunk/installmod.py (rev 0) +++ trunk/installmod.py 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,210 @@ +#Thomas Fischer 31/05/2007, th...@th... +import sys, os, os.path, shutil + +sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib")) +from ror.logger import log +from ror.settingsManager import getSettingsManager + +TEMPDIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "temp") + +def removetemp(reporterrors=True): + if os.path.isdir(TEMPDIR): + try: + shutil.rmtree(TEMPDIR) + except Exception, err: + if not reporterrors: + return + log().error(str(err)) + log().error("could not remove temporary diretory: %s! please delete by hand." % TEMPDIR) + sys.exit(1) + +def ExtractToTemp(filename): + file, extension = os.path.splitext(filename) + removetemp() + if extension.lower() == ".rar": + import UnRAR + os.mkdir(TEMPDIR) + dst = os.path.join(TEMPDIR, os.path.basename(filename)) + shutil.copyfile(filename, dst) + os.chdir(TEMPDIR) + UnRAR.Archive(os.path.basename(filename)).extract() + # change back to current path + os.chdir(os.path.dirname(os.path.abspath(__file__))) + return True + elif extension.lower() == ".zip": + import UnZIP + UnZIP.unzip(filename, TEMPDIR) + return True + else: + shutil.copyfile(filename, dst) + return False + +def installfile(maintarget, srcfile, dryrun): + file, extension = os.path.splitext(maintarget) + rorpath = getSettingsManager().getSetting("RigsOfRods", "BasePath") + + if extension in ['.truck', '.load']: + path = os.path.join(rorpath, "data", "trucks") + elif extension in ['.terrn']: + path = os.path.join(rorpath, "data", "terrains") + else: + path = rorpath + if dryrun: + log().info("would install %s to %s" % (os.path.basename(srcfile), path)) + else: + log().info("installing %s to %s" % (os.path.basename(srcfile), path)) + shutil.copyfile(srcfile, os.path.join(path, os.path.basename(srcfile))) + +def searchFile(filename, top): + for root, dirs, files in os.walk(top, topdown=False): + if filename in files: + return os.path.join(root, filename) + return None + +def usage(): + print "usage (general): %s <filename> <mode> <additionaloptions> [--verbose] [--dryrun]" % (os.path.basename(sys.argv[0])) + print "<filename> list" + print " list all found and valid modifications in filename" + print "" + print "<filename> listall --verbose" + print " list all found modifications in filename (valid and invalid)" + print "" + print "<filename> installall --verbose" + print " install all found modifications in filename" + print "" + print "<filename> install <modification> --verbose" + print " install a certain modifications in filename (valid and invalid)" + print "" + print "notes: the --verbose option is optional to increase the output for debugging" + print " the --dryrun option just prints out which files would be copied/installed." + sys.exit(0) + +def getTargets(verbose): + import ror.depchecker + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "getfiles", "", verbose) + targets = [] + for file in dc.files: + filename, extension = os.path.splitext(file) + if extension.lower() in ['.truck', '.terrn', '.load']: + targets.append(os.path.basename(file)) + + validtargets = [] + invalidtargets = [] + for target in targets: + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.everythingfound: + validtargets.append(target) + else: + invalidtargets.append(target) + return validtargets, invalidtargets + + +def main(): + if len(sys.argv) < 3: + usage() + + targetfile = sys.argv[1] + if not os.path.isfile(targetfile): + log().error("%s is not a valid target filename!" % targetfile) + usage() + + mode = sys.argv[2] + if not mode in ['list', 'listall', 'install', 'installall']: + usage() + if len(sys.argv) < 4 and mode in ['install']: + usage() + + # get optional flags + verbose = False + dryrun = False + for option in sys.argv: + if option == "--verbose": + verbose = True + if option == "--dryrun": + dryrun = True + + + import ror.settingsManager + path = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isfile(os.path.join(path,"RoR.exe")): + import ror.starter + ror.starter.startApp() + + # Import Psyco if available + try: + import psyco + psyco.full() + except ImportError: + pass + + filename = os.path.abspath(targetfile) + ExtractToTemp(filename) + + if mode == "install": + target = sys.argv[3] + import ror.depchecker + log().info("### validating target ...") + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + if dc.invalid: + log().error("### target invalid!") + log().info("### please use the list mode to get valid targets") + usage() + + log().info("### target valid!") + #print dc.dstree + installcounter = 0 + for file in dc.dstree: + filename = file['filename'] + filenamefound = searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + + elif mode == "installall": + validtargets, invalidtargets = getTargets(verbose) + log().info("### installing %d found modifications:" % (len(validtargets))) + installcounter = 0 + for target in validtargets: + log().info("### installing modification '%s'" % target) + dc = ror.depchecker.RoRDepChecker(TEMPDIR, "dtree", target, verbose) + for file in dc.dstree: + filename = file['filename'] + filenamefound = searchFile(filename, TEMPDIR) + if filenamefound is None: + log().error("File %s not found in %s!" % (filename, TEMPDIR)) + sys.exit(1) + installfile(target, filenamefound, dryrun) + installcounter += 1 + if dryrun: + log().info("### would install %d files." % installcounter) + else: + log().info("### %d files installed, finished!" % installcounter) + + elif mode in ["list", "listall"]: + validtargets, invalidtargets = getTargets(verbose) + if mode == "listall": + if len(invalidtargets) > 0: + print "broken modifications found:" + for v in invalidtargets: + print " %-20s" % v + print "use the --verbose flag to find the missing files!" + else: + print "no broken modifications found:" + + if len(validtargets) > 0: + print "installable modifications found: " + for v in validtargets: + print " %-20s" % v + else: + print "no installable modifications found! :(" + removetemp(False) + + +if __name__=="__main__": + main() \ No newline at end of file Added: trunk/lib/UnRAR/__init__.py =================================================================== --- trunk/lib/UnRAR/__init__.py (rev 0) +++ trunk/lib/UnRAR/__init__.py 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,524 @@ +# Copyright (c) 2003-2005 Jimmy Retzlaff +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and associated documentation files (the +# "Software"), to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to +# permit persons to whom the Software is furnished to do so, subject to +# the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS +# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +""" +pyUnRAR is a ctypes based wrapper around the free UnRAR.dll. It +enables reading and unpacking of archives created with the +RAR/WinRAR archivers. There is a low-level interface which is very +similar to the C interface provided by UnRAR. There is also a +higher level interface which makes some common operations easier. +""" + +__version__ = '1.0' + +#from __future__ import generators + +import fnmatch +import os +import Queue +import threading +import time + +import ctypes.wintypes + +# Low level interface - see UnRARDLL\UNRARDLL.TXT + +ERAR_END_ARCHIVE = 10 +ERAR_NO_MEMORY = 11 +ERAR_BAD_DATA = 12 +ERAR_BAD_ARCHIVE = 13 +ERAR_UNKNOWN_FORMAT = 14 +ERAR_EOPEN = 15 +ERAR_ECREATE = 16 +ERAR_ECLOSE = 17 +ERAR_EREAD = 18 +ERAR_EWRITE = 19 +ERAR_SMALL_BUF = 20 +ERAR_UNKNOWN = 21 + +RAR_OM_LIST = 0 +RAR_OM_EXTRACT = 1 + +RAR_SKIP = 0 +RAR_TEST = 1 +RAR_EXTRACT = 2 + +RAR_VOL_ASK = 0 +RAR_VOL_NOTIFY = 1 + +RAR_DLL_VERSION = 3 + +# enum UNRARCALLBACK_MESSAGES +UCM_CHANGEVOLUME = 0 +UCM_PROCESSDATA = 1 +UCM_NEEDPASSWORD = 2 + +try: + unrar = ctypes.WinDLL(os.path.join(os.path.split(__file__)[0], 'unrar.dll')) +except WindowsError: + unrar = ctypes.WinDLL('unrar.dll') + +class RAROpenArchiveData(ctypes.Structure): + def __init__(self, ArcName=None, OpenMode=RAR_OM_LIST): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, ArcName=ArcName, OpenMode=OpenMode, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char_p), + ('OpenMode', ctypes.c_uint), + ('OpenResult', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ] + +class RAROpenArchiveDataEx(ctypes.Structure): + def __init__(self, ArcName=None, ArcNameW=u'', OpenMode=RAR_OM_LIST): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, ArcName=ArcName, ArcNameW=ArcNameW, OpenMode=OpenMode, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char_p), + ('ArcNameW', ctypes.c_wchar_p), + ('OpenMode', ctypes.c_uint), + ('OpenResult', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ('Flags', ctypes.c_uint), + ('Reserved', ctypes.c_uint*32), + ] + +class RARHeaderData(ctypes.Structure): + def __init__(self): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char*260), + ('FileName', ctypes.c_char*260), + ('Flags', ctypes.c_uint), + ('PackSize', ctypes.c_uint), + ('UnpSize', ctypes.c_uint), + ('HostOS', ctypes.c_uint), + ('FileCRC', ctypes.c_uint), + ('FileTime', ctypes.c_uint), + ('UnpVer', ctypes.c_uint), + ('Method', ctypes.c_uint), + ('FileAttr', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ] + +class RARHeaderDataEx(ctypes.Structure): + def __init__(self): + self.CmtBuf = ctypes.c_buffer(64*1024) + ctypes.Structure.__init__(self, _CmtBuf=ctypes.addressof(self.CmtBuf), CmtBufSize=ctypes.sizeof(self.CmtBuf)) + + _fields_ = [ + ('ArcName', ctypes.c_char*1024), + ('ArcNameW', ctypes.c_wchar*1024), + ('FileName', ctypes.c_char*1024), + ('FileNameW', ctypes.c_wchar*1024), + ('Flags', ctypes.c_uint), + ('PackSize', ctypes.c_uint), + ('PackSizeHigh', ctypes.c_uint), + ('UnpSize', ctypes.c_uint), + ('UnpSizeHigh', ctypes.c_uint), + ('HostOS', ctypes.c_uint), + ('FileCRC', ctypes.c_uint), + ('FileTime', ctypes.c_uint), + ('UnpVer', ctypes.c_uint), + ('Method', ctypes.c_uint), + ('FileAttr', ctypes.c_uint), + ('_CmtBuf', ctypes.c_voidp), + ('CmtBufSize', ctypes.c_uint), + ('CmtSize', ctypes.c_uint), + ('CmtState', ctypes.c_uint), + ('Reserved', ctypes.c_uint*1024), + ] + +def DosDateTimeToTimeTuple(dosDateTime): + """Convert an MS-DOS format date time to a Python time tuple. + """ + dosDate = dosDateTime >> 16 + dosTime = dosDateTime & 0xffff + day = dosDate & 0x1f + month = (dosDate >> 5) & 0xf + year = 1980 + (dosDate >> 9) + second = 2*(dosTime & 0x1f) + minute = (dosTime >> 5) & 0x3f + hour = dosTime >> 11 + return time.localtime(time.mktime((year, month, day, hour, minute, second, 0, 1, -1))) + +def _wrap(restype, function, argtypes): + result = function + result.argtypes = argtypes + result.restype = restype + return result + +RARGetDllVersion = _wrap(ctypes.c_int, unrar.RARGetDllVersion, []) + +RAROpenArchive = _wrap(ctypes.wintypes.HANDLE, unrar.RAROpenArchive, [ctypes.POINTER(RAROpenArchiveData)]) +RAROpenArchiveEx = _wrap(ctypes.wintypes.HANDLE, unrar.RAROpenArchiveEx, [ctypes.POINTER(RAROpenArchiveDataEx)]) + +RARReadHeader = _wrap(ctypes.c_int, unrar.RARReadHeader, [ctypes.wintypes.HANDLE, ctypes.POINTER(RARHeaderData)]) +RARReadHeaderEx = _wrap(ctypes.c_int, unrar.RARReadHeaderEx, [ctypes.wintypes.HANDLE, ctypes.POINTER(RARHeaderDataEx)]) + +_RARSetPassword = _wrap(ctypes.c_int, unrar.RARSetPassword, [ctypes.wintypes.HANDLE, ctypes.c_char_p]) +def RARSetPassword(*args, **kwargs): + _RARSetPassword(*args, **kwargs) + +RARProcessFile = _wrap(ctypes.c_int, unrar.RARProcessFile, [ctypes.wintypes.HANDLE, ctypes.c_int, ctypes.c_char_p, ctypes.c_char_p]) + +RARCloseArchive = _wrap(ctypes.c_int, unrar.RARCloseArchive, [ctypes.wintypes.HANDLE]) + +UNRARCALLBACK = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_uint, ctypes.c_long, ctypes.c_long, ctypes.c_long) +_RARSetCallback = _wrap(ctypes.c_int, unrar.RARSetCallback, [ctypes.wintypes.HANDLE, UNRARCALLBACK, ctypes.c_long]) +def RARSetCallback(*args, **kwargs): + _RARSetCallback(*args, **kwargs) + + +# Higher level interface + +class ArchiveHeaderBroken(Exception): pass +class InvalidRARArchive(Exception): pass +class FileOpenError(Exception): pass + +RARExceptions = { + ERAR_NO_MEMORY : MemoryError, + ERAR_BAD_DATA : ArchiveHeaderBroken, + ERAR_BAD_ARCHIVE : InvalidRARArchive, + ERAR_EOPEN : FileOpenError, + } + + +class _FileLikeObject: + """Implement a file like object accessible from RARFile.""" + + # UnRAR.dll's thread safety is unknown, so this queue is used + # to serialize access class-wide when using threads. + dllQueue = Queue.Queue(1) + dllQueue.put(None) + + def __init__(self, rarFile, mode): + """Called by RARFile.open, do not call directly.""" + self.rarFile = rarFile + self.mode = mode + self.instructionsForCallback = Queue.Queue() + self.dataFromCallback = Queue.Queue() + self.readBuffer = [] + self.readBufferLength = 0 + self.position = 0 + self.doneReading = False + self.name = self.rarFile.filename + self.lineQueue = Queue.Queue() + + def __del__(self): + self.close() + + def __iter__(self): + while True: + line = self.readline() + if line: + yield line + else: + break + + def close(self): + """Emulate file(...).close().""" + self.instructionsForCallback.put('Quit') + self._thread.join() + self.closed = True + + def flush(self): + """Emulate file(...).flush().""" + pass + + def read(self, size=-1): + """Emulate file(...).read(...).""" + if size < 0: + size = self.rarFile.size + + if not self.doneReading: + while self.readBufferLength < size and not self.doneReading: + if self.dataFromCallback.empty(): + self.instructionsForCallback.put('Read') + self.readBuffer.append(self.dataFromCallback.get()) + if self.readBuffer[-1] is None: + self.doneReading = True + del self.readBuffer[-1] + else: + self.readBufferLength += len(self.readBuffer[-1]) + + result = ''.join(self.readBuffer) + if len(result) <= size: + self.readBuffer = [] + self.readBufferLength = 0 + else: + self.readBuffer = [result[size:]] + self.readBufferLength = len(self.readBuffer[0]) + result = result[:size] + + self.position += len(result) + + if self.mode == 't': + result = result.replace('\r\n', '\n') + + # If threads remain open when Python shuts down them spurious + # exceptions can result. So we automatically try to close the + # file when appropriate (which ends the thread) in case the + # user doesn't. + if self.rarFile.size == self.position: + self.close() + + return result + + def readline(self, size=-1): + """Emulate file(...).readline(...).""" + if self.lineQueue.qsize() < 2: + buffer = self.read(256*1024) + if buffer: + if not self.lineQueue.empty(): + buffer = self.lineQueue.get() + buffer + buffer = buffer.split('\n') + for line in buffer[:-1]: + self.lineQueue.put(line+'\n') + if len(buffer) > 1: + if not buffer[-1]: + self.lineQueue.put(buffer[-1]+'\n') + else: + self.lineQueue.put(buffer[-1]) + + if self.lineQueue.empty(): + result = '' + else: + result = self.lineQueue.get() + + return result + + def readlines(self, sizehint=-1): + """Emulate file(...).readlines(...).""" + if 0 < sizehint < self.rarFile.size: + size = sizehint + else: + size = self.rarFile.size + + lines = [] + sizeRead = 0 + while True: + lines.append(self.readline()) + sizeRead += len(lines[-1]) + if 0 < size <= sizeRead or not lines[-1]: + break + + if not lines[-1]: + del lines[-1] + + return lines + + def xreadlines(self, sizehint=-1): + """Emulate file(...).xreadlines(...).""" + import xreadlines + return xreadlines.xreadlines(self) + + def seek(self, offset, whence=0): + """Emulate file(...).seek(...). + + Seeks cannot move backwards in the file. Seeking forward + requires decompressing the file until the seek-point which + can be time consuming. + """ + position = offset + if whence == 1: + position += self.position + elif whence == 2: + position += self.rarFile.size + + assert position >= self.position + read(position-self.position) + + def tell(self): + """Emulate file(...).tell().""" + return self.position + + def __callback(self, msg, UserData, P1, P2): + if msg == UCM_PROCESSDATA: + self.dllQueue.put(None) + self.dataFromCallback.put((ctypes.c_char*P2).from_address(P1).raw) + instruction = self.instructionsForCallback.get() + self.dllQueue.get() + if instruction == 'Quit': + return -1 + return 1 + + def expansionThread(self): + try: + self._thread = threading.currentThread() + threading.currentThread().setName(threading.currentThread().getName() + ' - ' + self.rarFile.filename) + RARSetCallback(self.rarFile.RAR._handle, UNRARCALLBACK(self.__callback), 0) + self.dllQueue.get() + try: + RARProcessFile(self.rarFile.RAR._handle, RAR_TEST, None, None) + finally: + self.dllQueue.put(None) + finally: + self.dataFromCallback.put(None) + + +class RARFile: + """Represent a file in an archive. Don't instantiate directly. + + Properties: + filename - name of the file in the archive including path (if any) + datetime - file date/time as a struct_time suitable for time.strftime + isdir - True if the file is a directory + size - size in bytes of the uncompressed file + comment - comment associated with the file + + Note - this is not currently intended to be a Python file-like object. + """ + + def __init__(self, RAR, headerData): + self.RAR = RAR + self.filename = headerData.FileName + self.datetime = DosDateTimeToTimeTuple(headerData.FileTime) + self.isdir = ((headerData.Flags & 0xE0) == 0xE0) + self.size = headerData.UnpSize + (headerData.UnpSizeHigh << 32) + if headerData.CmtState == 1: + self.comment = headerData.CmtBuf.value + else: + self.comment = None + + self._extracted = False + + def extract(self, filename=None): + """Extract the file to the file system.""" + + self._extracted = True + RARProcessFile(self.RAR._handle, RAR_EXTRACT, None, filename) + + def open(self, mode='rb'): + """Open a file-like object. + + Because of the style of the UnRAR.dll API for extracting files + without writing to disk, extraction must be done in a background + thread. This is encapsulated by pyUnRAR, but you should be aware + that calling this method results in a thread being spawned. + + >>> for fileInArchive in Archive('test.rar').iterfiles(): + ... if fileInArchive.filename.endswith('test.txt'): + ... print fileInArchive.open('rt').read() + This is only a test. + """ + + assert mode[0] == 'r' and (len(mode) == 1 or (len(mode) ==2 and mode[1] in 'bt')) + if 't' in mode: + mode = 't' + else: + mode = 'b' + + self._extracted = True + fileLikeObject = _FileLikeObject(self, mode) + expansionThread = threading.Thread(target=fileLikeObject.expansionThread) + expansionThread.setDaemon(True) + expansionThread.start() + return fileLikeObject + + def __str__(self): + return '<RARFile "%s" in "%s">' % (self.filename, self.RAR.archiveName) + + def _skip(self): + if not self._extracted: + RARProcessFile(self.RAR._handle, RAR_SKIP, None, None) + + +class Archive: + """Open and operate on an archive.""" + + def __init__(self, archiveName, password=None): + """Instantiate the archive. + + archiveName is the name of the RAR file. + password is used to decrypt the files in the archive. + + Properties: + comment - comment associated with the archive + + >>> print Archive('test.rar').comment + This is a test. + """ + self.archiveName = archiveName + archiveData = RAROpenArchiveDataEx(ArcNameW=self.archiveName, OpenMode=RAR_OM_EXTRACT) + self._handle = RAROpenArchiveEx(ctypes.byref(archiveData)) + + if archiveData.OpenResult != 0: + raise RARExceptions[archiveData.OpenResult] + + if archiveData.CmtState == 1: + self.comment = archiveData.CmtBuf.value + else: + self.comment = None + + if password: + RARSetPassword(self._handle, password) + + def __del__(self): + if self._handle and RARCloseArchive: + RARCloseArchive(self._handle) + + def extract(self, filespec='*'): + """Extract all files in the archive matching the filespec. + + >>> Archive('test.rar').extract('*.pyc') + """ + for rarFile in self.iterfiles(): + if fnmatch.fnmatch(rarFile.filename, filespec): + rarFile.extract() + + def iterfiles(self): + """Iterate over all the files in the archive. + + The yielded RARFile should not be stored, it is not valid once + the next iteration has occurred. + + >>> import os + >>> for fileInArchive in Archive('test.rar').iterfiles(): + ... print os.path.split(fileInArchive.filename)[-1], + ... print fileInArchive.isdir, + ... print fileInArchive.size, + ... print fileInArchive.comment, + ... print fileInArchive.datetime, + ... print time.strftime('%a, %d %b %Y %H:%M:%S', fileInArchive.datetime) + test True 0 None (2003, 6, 30, 1, 59, 48, 0, 181, 1) Mon, 30 Jun 2003 01:59:48 + test.txt False 20 None (2003, 6, 30, 2, 1, 2, 0, 181, 1) Mon, 30 Jun 2003 02:01:02 + this.py False 1030 None (2002, 2, 8, 16, 47, 48, 4, 39, 0) Fri, 08 Feb 2002 16:47:48 + """ + headerData = RARHeaderDataEx() + while not RARReadHeaderEx(self._handle, ctypes.byref(headerData)): + rarFile = RARFile(self, headerData) + yield rarFile + rarFile._skip() Added: trunk/lib/UnRAR/unrar.dll =================================================================== (Binary files differ) Property changes on: trunk/lib/UnRAR/unrar.dll ___________________________________________________________________ Name: svn:mime-type + application/octet-stream Added: trunk/lib/UnZIP/__init__.py =================================================================== --- trunk/lib/UnZIP/__init__.py (rev 0) +++ trunk/lib/UnZIP/__init__.py 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,12 @@ +import sys, zipfile, os, os.path + +def unzip(file, dir): + os.mkdir(dir) + zfobj = zipfile.ZipFile(file) + for name in zfobj.namelist(): + if name.endswith('/'): + os.mkdir(os.path.join(dir, name)) + else: + outfile = open(os.path.join(dir, name), 'wb') + outfile.write(zfobj.read(name)) + outfile.close() Added: trunk/lib/ror/031a_deps.bin =================================================================== --- trunk/lib/ror/031a_deps.bin (rev 0) +++ trunk/lib/ror/031a_deps.bin 2007-07-23 08:40:03 UTC (rev 112) @@ -0,0 +1,18659 @@ +(dp0 +S'SideBar.mesh' +p1 +(dp2 +S'requires' +p3 +(dp4 +S'material' +p5 +(lp6 +S'Grey' +p7 +asS'file' +p8 +(lp9 +S'SideBar.material' +p10 +assS'requiredby' +p11 +(dp12 +g5 +(lp13 +sg8 +(lp14 +S'fl6-volvo.truck' +p15 +ag15 +assS'optional' +p16 +(dp17 +g5 +(lp18 +sg8 +(lp19 +ssS'provides' +p20 +(dp21 +g5 +(lp22 +sg8 +(lp23 +S'SideBar.mesh' +p24 +asssS'sign-dir-john-cast.mesh' +p25 +(dp26 +g3 +(dp27 +g5 +(lp28 +S'sign-nhelens' +p29 +asg8 +(lp30 +S'signs.material' +p31 +assg11 +(dp32 +g5 +(lp33 +sg8 +(lp34 +S'sign-dir-john-cast.odef' +p35 +assg16 +(dp36 +g5 +(lp37 +sg8 +(lp38 +ssg20 +(dp39 +g5 +(lp40 +sg8 +(lp41 +S'sign-dir-john-cast.mesh' +p42 +asssS'derooyrwheelface.png' +p43 +(dp44 +g3 +(dp45 +g5 +(lp46 +sg8 +(lp47 +ssg11 +(dp48 +g5 +(lp49 +sg8 +(lp50 +ssg16 +(dp51 +g5 +(lp52 +sg8 +(lp53 +ssg20 +(dp54 +g5 +(lp55 +sg8 +(lp56 +S'derooyrwheelface.png' +p57 +asssS'locked-off.png' +p58 +(dp59 +g3 +(dp60 +g5 +(lp61 +sg8 +(lp62 +ssg11 +(dp63 +g5 +(lp64 +sg8 +(lp65 +S'tracks.material' +p66 +assg16 +(dp67 +g5 +(lp68 +sg8 +(lp69 +ssg20 +(dp70 +g5 +(lp71 +sg8 +(lp72 +S'locked-off.png' +p73 +asssS'smitmast.mesh.xml' +p74 +(dp75 +g20 +(dp76 +ssS'airneedles.overlay' +p77 +(dp78 +g20 +(dp79 +ssS'EarthClearSkyFog.png' +p80 +(dp81 +g3 +(dp82 +g5 +(lp83 +sg8 +(lp84 +ssg11 +(dp85 +g5 +(lp86 +sg8 +(lp87 +ssg16 +(dp88 +g5 +(lp89 +sg8 +(lp90 +ssg20 +(dp91 +g5 +(lp92 +sg8 +(lp93 +S'EarthClearSkyFog.png' +p94 +asssS'dodgewheelface.png' +p95 +(dp96 +g3 +(dp97 +g5 +(lp98 +sg8 +(lp99 +ssg11 +(dp100 +g5 +(lp101 +sg8 +(lp102 +S'dodge.material' +p103 +assg16 +(dp104 +g5 +(lp105 +sg8 +(lp106 +ssg20 +(dp107 +g5 +(lp108 +sg8 +(lp109 +S'dodgewheelface.png' +p110 +asssS'myobs.mesh.xml' +p111 +(dp112 +g20 +(dp113 +ssS'wahoo.png' +p114 +(dp115 +g3 +(dp116 +g5 +(lp117 +sg8 +(lp118 +ssg11 +(dp119 +g5 +(lp120 +sg8 +(lp121 +S'wahoo.material' +p122 +assg16 +(dp123 +g5 +(lp124 +sg8 +(lp125 +ssg20 +(dp126 +g5 +(lp127 +sg8 +(lp128 +S'wahoo.png' +p129 +asssS'aspen-mini.png' +p130 +(dp131 +g3 +(dp132 +g5 +(lp133 +sg8 +(lp134 +ssg11 +(dp135 +g5 +(lp136 +sg8 +(lp137 +S'aspen.terrn' +p138 +assg16 +(dp139 +g5 +(lp140 +sg8 +(lp141 +ssg20 +(dp142 +g5 +(lp143 +sg8 +(lp144 +S'aspen-mini.png' +p145 +asssS'tatrawheelband.png' +p146 +(dp147 +g3 +(dp148 +g5 +(lp149 +sg8 +(lp150 +ssg11 +(dp151 +g5 +(lp152 +sg8 +(lp153 +S't813.material' +p154 +assg16 +(dp155 +g5 +(lp156 +sg8 +(lp157 +ssg20 +(dp158 +g5 +(lp159 +sg8 +(lp160 +S'tatrawheelband.png' +p161 +asssS'liebherr-mini.png' +p162 +(dp163 +g3 +(dp164 +g5 +(lp165 +sg8 +(lp166 +ssg11 +(dp167 +g5 +(lp168 +sg8 +(lp169 +S'liebherr.truck' +p170 +assg16 +(dp171 +g5 +(lp172 +sg8 +(lp173 +ssg20 +(dp174 +g5 +(lp175 +sg8 +(lp176 +S'liebherr-mini.png' +p177 +asssS'mirror.png' +p178 +(dp179 +g3 +(dp180 +g5 +(lp181 +sg8 +(lp182 +ssg11 +(dp183 +g5 +(lp184 +sg8 +(lp185 +S'common.material' +p186 +assg16 +(dp187 +g5 +(lp188 +sg8 +(lp189 +ssg20 +(dp190 +g5 +(lp191 +sg8 +(lp192 +S'mirror.png' +p193 +asssS'myobs.mesh' +p194 +(dp195 +g3 +(dp196 +g5 +(lp197 +S'myobs-white' +p198 +asg8 +(lp199 +S'myobs.material' +p200 +assg11 +(dp201 +g5 +(lp202 +sg8 +(lp203 +S'myobs.odef' +p204 +assg16 +(dp205 +g5 +(lp206 +sg8 +(lp207 +ssg20 +(dp208 +g5 +(lp209 +sg8 +(lp210 +S'myobs.mesh' +p211 +asssS'roadquay.mesh' +p212 +(dp213 +g3 +(dp214 +g5 +(lp215 +S'road' +p216 +asg8 +(lp217 +S'road.material' +p218 +assg11 +(dp219 +g5 +(lp220 +sg8 +(lp221 +S'roadquay.odef' +p222 +assg16 +(dp223 +g5 +(lp224 +sg8 +(lp225 +ssg20 +(dp226 +g5 +(lp227 +sg8 +(lp228 +S'roadquay.mesh' +p229 +asssS'island-15h.jpg' +p230 +(dp231 +g3 +(dp232 +g5 +(lp233 +sg8 +(lp234 +ssg11 +(dp235 +g5 +(lp236 +sg8 +(lp237 +ssg16 +(dp238 +g5 +(lp239 +sg8 +(lp240 +ssg20 +(dp241 +g5 +(lp242 +sg8 +(lp243 +S'island-15h.jpg' +p244 +asssS'turbotwin-mini.png' +p245 +(dp246 +g3 +(dp247 +g5 +(lp248 +sg8 +(lp249 +ssg11 +(dp250 +g5 +(lp251 +sg8 +(lp252 +S'turbotwin.truck' +p253 +assg16 +(dp254 +g5 +(lp255 +sg8 +(lp256 +ssg20 +(dp257 +g5 +(lp258 +sg8 +(lp259 +S'turbotwin-mini.png' +p260 +asssS'NACA64.1.412.afl' +p261 +(dp262 +g20 +(dp263 +ssS'ae86wheelband.png' +p264 +(dp265 +g3 +(dp266 +g5 +(lp267 +sg8 +(lp268 +ssg11 +(dp269 +g5 +(lp270 +sg8 +(lp271 +S'Toyota86mat.material' +p272 +assg16 +(dp273 +g5 +(lp274 +sg8 +(lp275 +ssg20 +(dp276 +g5 +(lp277 +sg8 +(lp278 +S'ae86wheelband.png' +p279 +asssS'lopress-on.png' +p280 +(dp281 +g3 +(dp282 +g5 +(lp283 +sg8 +(lp284 +ssg11 +(dp285 +g5 +(lp286 +sg8 +(lp287 +g66 +assg16 +(dp288 +g5 +(lp289 +sg8 +(lp290 +ssg20 +(dp291 +g5 +(lp292 +sg8 +(lp293 +S'lopress-on.png' +p294 +asssS'rightmirror.mesh.xml' +p295 +(dp296 +g20 +(dp297 +ssS'sphere.mesh' +p298 +(dp299 +g3 +(dp300 +g5 +(lp301 +S'BaseWhite' +p302 +asg8 +(lp303 +ssg11 +(dp304 +g5 +(lp305 +sg8 +(lp306 +ssg16 +(dp307 +g5 +(lp308 +sg8 +(lp309 +ssg20 +(dp310 +g5 +(lp311 +sg8 +(lp312 +S'sphere.mesh' +p313 +asssS'C1.material' +p314 +(dp315 +g3 +(dp316 +g5 +(lp317 +sg8 +(lp318 +S'C1.jpg' +p319 +aS'C1beam.jpg' +p320 +assg11 +(dp321 +g5 +(lp322 +sg8 +(lp323 +S'C1.truck' +p324 +assg16 +(dp325 +g5 +(lp326 +sg8 +(lp327 +ssg20 +(dp328 +g5 +(lp329 +S'C1' +p330 +aS'C1beam' +p331 +asg8 +(lp332 +S'C1.material' +p333 +asssg324 +(dp334 +g3 +(dp335 +g5 +(lp336 +S'C1' +p337 +asg8 +(lp338 +g314 +assg11 +(dp339 +g5 +(lp340 +sg8 +(lp341 +S'island.terrn' +p342 +assg16 +(dp343 +g5 +(lp344 +S'tracks/C1help' +p345 +asg8 +(lp346 +S'C1-mini.png' +p347 +assg20 +(dp348 +g5 +(lp349 +sg8 +(lp350 +S'C1.truck' +p351 +asssS'semiflat.material' +p352 +(dp353 +g3 +(dp354 +g5 +(lp355 +sg8 +(lp356 +S'semiflat.png' +p357 +assg11 +(dp358 +g5 +(lp359 +sg8 +(lp360 +S'semiflat.load' +p361 +assg16 +(dp362 +g5 +(lp363 +sg8 +(lp364 +ssg20 +(dp365 +g5 +(lp366 +S'tracks/semiflat' +p367 +asg8 +(lp368 +S'semiflat.material' +p369 +asssS'sign-dir-john-cast.mesh.xml' +p370 +(dp371 +g20 +(dp372 +ssS'checkchecked.png' +p373 +(dp374 +g3 +(dp375 +g5 +(lp376 +sg8 +(lp377 +ssg11 +(dp378 +g5 +(lp379 +sg8 +(lp380 +S'truck_editor.material' +p381 +assg16 +(dp382 +g5 +(lp383 +sg8 +(lp384 +ssg20 +(dp385 +g5 +(lp386 +sg8 +(lp387 +S'checkchecked.png' +p388 +asssS'road-block2.mesh' +p389 +(dp390 +g3 +(dp391 +g5 +(lp392 +S'road' +p393 +asg8 +(lp394 +g218 +assg11 +(dp395 +g5 +(lp396 +sg8 +(lp397 +S'road-block2.odef' +p398 +assg16 +(dp399 +g5 +(lp400 +sg8 +(lp401 +ssg20 +(dp402 +g5 +(lp403 +sg8 +(lp404 +S'road-block2.mesh' +p405 +asssS'altimeter.png' +p406 +(dp407 +g3 +(dp408 +g5 +(lp409 +sg8 +(lp410 +ssg11 +(dp411 +g5 +(lp412 +sg8 +(lp413 +S'dashboard.material' +p414 +assg16 +(dp415 +g5 +(lp416 +sg8 +(lp417 +ssg20 +(dp418 +g5 +(lp419 +sg8 +(lp420 +S'altimeter.png' +p421 +asssS'Blur0_vs.glsl' +p422 +(dp423 +g20 +(dp424 +ssS'sign-dir-cold-cast.odef' +p425 +(dp426 +g3 +(dp427 +g5 +(lp428 +sg8 +(lp429 +S'sign-dir-cold-cast.mesh' +p430 +assg11 +(dp431 +g5 +(lp432 +sg8 +(lp433 +S'nhelens.terrn' +p434 +assg16 +(dp435 +g5 +(lp436 +sg8 +(lp437 +ssg20 +(dp438 +g5 +(lp439 +sg8 +(lp440 +S'sign-dir-cold-cast.odef' +p441 +asssS'airintake.mesh.xml' +p442 +(dp443 +g20 +(dp444 +ssS'redarrow.png' +p445 +(dp446 +g3 +(dp447 +g5 +(lp448 +sg8 +(lp449 +ssg11 +(dp450 +g5 +(lp451 +sg8 +(lp452 +g414 +assg16 +(dp453 +g5 +(lp454 +sg8 +(lp455 +ssg20 +(dp456 +g5 +(lp457 +sg8 +(lp458 +S'redarrow.png' +p459 +asssS'nhelens-12h.jpg' +p460 +(dp461 +g3 +(dp462 +g5 +(lp463 +sg8 +(lp464 +ssg11 +(dp465 +g5 +(lp466 +sg8 +(lp467 +ssg16 +(dp468 +g5 +(lp469 +sg8 +(lp470 +ssg20 +(dp471 +g5 +(lp472 +sg8 +(lp473 +S'nhelens-12h.jpg' +p474 +asssS'semi.png' +p475 +(dp476 +g3 +(dp477 +g5 +(lp478 +sg8 +(lp479 +ssg11 +(dp480 +g5 +(lp481 +sg8 +(lp482 +S'semi.material' +p483 +assg16 +(dp484 +g5 +(lp485 +sg8 +(lp486 +ssg20 +(dp487 +g5 +(lp488 +sg8 +(lp489 +S'semi.png' +p490 +asssS'clutch-off.png' +p491 +(dp492 +g3 +(dp493 +g5 +(lp494 +sg8 +(lp495 +ssg11 +(dp496 +g5 +(lp497 +sg8 +(lp498 +g66 +assg16 +(dp499 +g5 +(lp500 +sg8 +(lp501 +ssg20 +(dp502 +g5 +(lp503 +sg8 +(lp504 +S'clutch-off.png' +p505 +asssS'hsi.png' +p506 +(dp507 +g3 +(dp508 +g5 +(lp509 +sg8 +(lp510 +ssg11 +(dp511 +g5 +(lp512 +sg8 +(lp513 +g414 +assg16 +(dp514 +g5 +(lp515 +sg8 +(lp516 +ssg20 +(dp517 +g5 +(lp518 +sg8 +(lp519 +S'hsi.png' +p520 +asssS'boxtrailer.load' +p521 +(dp522 +g3 +(dp523 +g5 +(lp524 +S'tracks/fl6-volvo' +p525 +asg8 +(lp526 +S'fl6-volvo.material' +p527 +assg11 +(dp528 +g5 +(lp529 +sg8 +(lp530 +ssg16 +(dp531 +g5 +(lp532 +S'tracks/boxtrailerhelp' +p533 +asg8 +(lp534 +S'boxtrailer-mini.png' +p535 +assg20 +(dp536 +g5 +(lp537 +sg8 +(lp538 +S'boxtrailer.load' +p539 +asssS'chapel.odef' +p540 +(dp541 +g3 +(dp542 +g5 +(lp543 +sg8 +(lp544 +S'chapel.mesh' +p545 +assg11 +(dp546 +g5 +(lp547 +sg8 +(lp548 +g138 +ag434 +assg16 +(dp549 +g5 +(lp550 +sg8 +(lp551 +ssg20 +(dp552 +g5 +(lp553 +sg8 +(lp554 +S'chapel.odef' +p555 +asssS'sign-descent.png' +p556 +(dp557 +g3 +(dp558 +g5 +(lp559 +sg8 +(lp560 +ssg11 +(dp561 +g5 +(lp562 +sg8 +(lp563 +g31 +assg16 +(dp564 +g5 +(lp565 +sg8 +(lp566 +ssg20 +(dp567 +g5 +(lp568 +sg8 +(lp569 +S'sign-descent.png' +p570 +asssS'wrecker.material' +p571 +(dp572 +g3 +(dp573 +g5 +(lp574 +sg8 +(lp575 +S'wrecker.png' +p576 +aS'wrecker_emissive.png' +p577 +aS'wreckerhelp.png' +p578 +assg11 +(dp579 +g5 +(lp580 +sg8 +(lp581 +S'wrecker.truck' +p582 +ag582 +aS'Scanialoader.truck' +p583 +assg16 +(dp584 +g5 +(lp585 +sg8 +(lp586 +ssg20 +(dp587 +g5 +(lp588 +S'tracks/wrecker' +p589 +aS'tracks/wreckerhelp' +p590 +asg8 +(lp591 +S'wrecker.material' +p592 +asssS'an-12.material' +p593 +(dp594 +g3 +(dp595 +g5 +(lp596 +sg8 +(lp597 +S'an-12.png' +p598 +aS'an12wheelface.png' +p599 +aS'an12wheelband.png' +p600 +aS'prop.png' +p601 +assg11 +(dp602 +g5 +(lp603 +sg8 +(lp604 +S'an12nacelle.mesh' +p605 +aS'an12fairing-right.mesh' +p606 +aS'an-12.truck' +p607 +aS'an12turret.mesh' +p608 +aS'an12fairing-left.mesh' +p609 +aS'pale.mesh' +p610 +assg16 +(dp611 +g5 +(lp612 +sg8 +(lp613 +ssg20 +(dp614 +g5 +(lp615 +S'tracks/An12' +p616 +aS'tracks/an12wheelface' +p617 +aS'tracks/an12wheelband' +p618 +aS'prop' +p619 +asg8 +(lp620 +S'an-12.material' +p621 +asssS'buildicon.png' +p622 +(dp623 +g3 +(dp624 +g5 +(lp625 +sg8 +(lp626 +ssg11 +(dp627 +g5 +(lp628 +sg8 +(lp629 +g381 +assg16 +(dp630 +g5 +(lp631 +sg8 +(lp632 +ssg20 +(dp633 +g5 +(lp634 +sg8 +(lp635 +S'buildicon.png' +p636 +asssS'robot.mesh' +p637 +(dp638 +g3 +(dp639 +g5 +(lp640 +S'Material' +p641 +asg8 +(lp642 +S'robot.material' +p643 +assg11 +(dp644 +g5 +(lp645 +sg8 +(lp646 +ssg16 +(dp647 +g5 +(lp648 +sg8 +(lp649 +ssg20 +(dp650 +g5 +(lp651 +sg8 +(lp652 +S'robot.mesh' +p653 +asssS'resources.cfg' +p654 +(dp655 +g20 +(dp656 +ssS'pbrake-on.png' +p657 +(dp658 +g3 +(dp659 +g5 +(lp660 +sg8 +(lp661 +ssg11 +(dp662 +g5 +(lp663 +sg8 +(lp664 +g66 +assg16 +(dp665 +g5 +(lp666 +sg8 +(lp667 +ssg20 +(dp668 +g5 +(lp669 +sg8 +(lp670 +S'pbrake-on.png' +p671 +asssS'clack.wav' +p672 +(dp673 +g3 +(dp674 +g5 +(lp675 +sg8 +(lp676 +ssg11 +(dp677 +g5 +(lp678 +sg8 +(lp679 +ssg16 +(dp680 +g5 +(lp681 +sg8 +(lp682 +ssg20 +(dp683 +g5 +(lp684 +sg8 +(lp685 +S'clack.wav' +p686 +asssS'dashbar.png' +p687 +(dp688 +g3 +(dp689 +g5 +(lp690 +sg8 +(lp691 +ssg11 +(dp692 +g5 +(lp693 +sg8 +(lp694 +g414 +assg16 +(dp695 +g5 +(lp696 +sg8 +(lp697 +ssg20 +(dp698 +g5 +(lp699 +sg8 +(lp700 +S'dashbar.png' +p701 +asssS'adi.png' +p702 +(dp703 +g3 +(dp704 +g5 +(lp705 +sg8 +(lp706 +ssg11 +(dp707 +g5 +(lp708 +sg8 +(lp709 +g414 +assg16 +(dp710 +g5 +(lp711 +sg8 +(lp712 +ssg20 +(dp713 +g5 +(lp714 +sg8 +(lp715 +S'adi.png' +p716 +asssS'road-slab5.mesh.xml' +p717 +(dp718 +g20 +(dp719 +ssS'roadborderleft.mesh' +p720 +(dp721 +g3 +(dp722 +g5 +(lp723 +S'road' +p724 +asg8 +(lp725 +g218 +assg11 +(dp726 +g5 +(lp727 +sg8 +(lp728 +S'roadborderleft.odef' +p729 +assg16 +(dp730 +g5 +(lp731 +sg8 +(lp732 +ssg20 +(dp733 +g5 +(lp734 +sg8 +(lp735 +S'roadborderleft.mesh' +p736 +asssS'dafwheelband.png' +p737 +(dp738 +g3 +(dp739 +g5 +(lp740 +sg8 +(lp741 +ssg11 +(dp742 +g5 +(lp743 +sg8 +(lp744 +S'flatdaf.material' +p745 +aS'daf.material' +p746 +assg16 +(dp747 +g5 +(lp748 +sg8 +(lp749 +ssg20 +(dp750 +g5 +(lp751 +sg8 +(lp752 +S'dafwheelband.png' +p753 +asssS'starter.wav' +p754 +(dp755 +g3 +(dp756 +g5 +(lp757 +sg8 +(lp758 +ssg11 +(dp759 +g5 +(lp760 +sg8 +(lp761 +ssg16 +(dp762 +g5 +(lp763 +sg8 +(lp764 +ssg20 +(dp765 +g5 +(lp766 +sg8 +(lp767 +S'starter.wav' +p768 +asssS'robot.mesh.xml' +p769 +(dp770 +g20 +(dp771 +ssS'redbeacon.mesh.xml' +p772 +(dp773 +g20 +(dp774 +ssS'aspen-12h.jpg' +p775 +(dp776 +g3 +(dp777 +g5 +(lp778 +sg8 +(lp779 +ssg11 +(dp780 +g5 +(lp781 +sg8 +(lp782 +ssg16 +(dp783 +g5 +(lp784 +sg8 +(lp785 +ssg20 +(dp786 +g5 +(lp787 +sg8 +(lp788 +S'aspen-12h.jpg' +p789 +asssS'wheelprop.mesh' +p790 +(dp791 +g3 +(dp792 +g5 +(lp793 +S'tracks/daffwheelface' +p794 +asg8 +(lp795 +g746 +assg11 +(dp796 +g5 +(lp797 +sg8 +(lp798 +S'daf.truck' +p799 +ag799 +assg16 +(dp800 +g5 +(lp801 +sg8 +(lp802 +ssg20 +(dp803 +g5 +(lp804 +sg8 +(lp805 +S'wheelprop.mesh' +p806 +asssS'acontainer.material' +p807 +(dp808 +g3 +(dp809 +g5 +(lp810 +sg8 +(lp811 +S'acontainer.png' +p812 +assg11 +(dp813 +g5 +(lp814 +sg8 +(lp815 +S'acontainer.load' +p816 +assg16 +(dp817 +g5 +(lp818 +sg8 +(lp819 +ssg20 +(dp820 +g5 +(lp821 +S'tracks/acontainer' +p822 +asg8 +(lp823 +S'acontainer.material' +p824 +asssS'aspen.raw' +p825 +(dp826 +g3 +(dp827 +g5 +(lp828 +sg8 +(lp829 +ssg11 +(dp830 +g5 +(lp831 +sg8 +(lp832 +S'aspen.cfg' +p833 +assg16 +(dp834 +g5 +(lp835 +sg8 +(lp836 +ssg20 +(dp837 +g5 +(lp838 +sg8 +(lp839 +S'aspen.raw' +p840 +asssS'flatdaf.png' +p841 +(dp842 +g3 +(dp843 +g5 +(lp844 +sg8 +(lp845 +ssg11 +(dp846 +g5 +(lp847 +sg8 +(lp848 +g745 +assg16 +(dp849 +g5 +(lp850 +sg8 +(lp851 +ssg20 +(dp852 +g5 +(lp853 +sg8 +(lp854 +S'flatdaf.png' +p855 +asssS'island-14h.jpg' +p856 +(dp857 +g3 +(dp858 +g5 +(lp859 +sg8 +(lp860 +ssg11 +(dp861 +g5 +(lp862 +sg8 +(lp863 +ssg16 +(dp864 +g5 +(lp865 +sg8 +(lp866 +ssg20 +(dp867 +g5 +(lp868 +sg8 +(lp869 +S'island-14h.jpg' +p870 +asssg10 +(dp871 +g3 +(dp872 +g5 +(lp873 +sg8 +(lp874 +ssg11 +(dp875 +g5 +(lp876 +sg8 +(lp877 +g1 +assg16 +(dp878 +g5 +(lp879 +sg8 +(lp880 +ssg20 +(dp881 +g5 +(lp882 +S'Grey' +p883 +asg8 +(lp884 +S'SideBar.material' +p885 +asssS'lab.mesh' +p886 +(dp887 +g3 +(dp888 +g5 +(lp889 +S'lab' +p890 +asg8 +(lp891 +S'lab.material' +p892 +assg11 +(dp893 +g5 +(lp894 +sg8 +(lp895 +S'lab.odef' +p896 +assg16 +(dp897 +g5 +(lp898 +sg8 +(lp899 +ssg20 +(dp900 +g5 +(lp901 +sg8 +(lp902 +S'lab.mesh' +p903 +asssS'road-slab.mesh' +p904 +(dp905 +g3 +(dp906 +g5 +(lp907 +S'road' +p908 +asg8 +(lp909 +g218 +assg11 +(dp910 +g5 +(lp911 +sg8 +(lp912 +S'road-slab.odef' +p913 +assg16 +(dp914 +g5 +(lp915 +sg8 +(lp916 +ssg20 +(dp917 +g5 +(lp918 +sg8 +(lp919 +S'road-slab.mesh' +p920 +asssS'aspen-9h.jpg' +p921 +(dp922 +g3 +(dp923 +g5 +(lp924 +sg8 +(lp925 +ssg11 +(dp926 +g5 +(lp927 +sg8 +(lp928 +ssg16 +(dp929 +g5 +(lp930 +sg8 +(lp931 +ssg20 +(dp932 +g5 +(lp933 +sg8 +(lp934 +S'aspen-9h.jpg' +p935 +asssS'Blur0_ps20.hlsl' +p936 +(dp937 +g20 +(dp938 +ssS'renault-mini.png' +p939 +(dp940 +g3 +(dp941 +g5 +(lp942 +sg8 +(lp943 +ssg11 +(dp944 +g5 +(lp945 +sg8 +(lp946 +S'renault.truck' +p947 +assg16 +(dp948 +g5 +(lp949 +sg8 +(lp950 +ssg20 +(dp951 +g5 +(lp952 +sg8 +(lp953 +S'renault-mini.png' +p954 +asssS'beam.mesh.xml' +p955 +(dp956 +g20 +(dp957 +ssS'daf_emissive.png' +p958 +(dp959 +g3 +(dp960 +g5 +(lp961 +sg8 +(lp962 +ssg11 +(dp963 +g5 +(lp964 +sg8 +(lp965 +g746 +assg16 +(dp966 +g5 +(lp967 +sg8 +(lp968 +ssg20 +(dp969 +g5 +(lp970 +sg8 +(lp971 +S'daf_emissive.png' +p972 +asssS'smallhouse.material' +p973 +(dp974 +g3 +(dp975 +g5 +(lp976 +sg8 +(lp977 +S'smallhouse.jpg' +p978 +assg11 +(dp979 +g5 +(lp980 +sg8 +(lp981 +S'smallhouse.mesh' +p982 +assg16 +(dp983 +g5 +(lp984 +sg8 +(lp985 +ssg20 +(dp986 +g5 +(lp987 +S'tracks/smallhouse' +p988 +asg8 +(lp989 +S'smallhouse.material' +p990 +asssS'road-runway-band.odef' +p991 +(dp992 +g3 +(dp993 +g5 +(lp994 +sg8 +(lp995 +S'road-runway-band.mesh' +p996 +assg11 +(dp997 +g5 +(lp998 +sg8 +(lp999 +g342 +ag138 +ag434 +assg16 +(dp1000 +g5 +(lp1001 +sg8 +(lp1002 +ssg20 +(dp1003 +g5 +(lp1004 +sg8 +(lp1005 +S'road-runway-band.odef' +p1006 +asssS'an-12.png' +p1007 +(dp1008 +g3 +(dp1009 +g5 +(lp1010 +sg8 +(lp1011 +ssg11 +(dp1012 +g5 +(lp1013 +sg8 +(lp1014 +g593 +assg16 +(dp1015 +g5 +(lp1016 +sg8 +(lp1017 +ssg20 +(dp1018 +g5 +(lp1019 +sg8 +(lp1020 +S'an-12.png' +p1021 +asssS'road.odef' +p1022 +(dp1023 +g3 +(dp1024 +g5 +(lp1025 +sg8 +(lp1026 +S'road.mesh' +p1027 +assg11 +(dp1028 +g5 +(lp1029 +sg8 +(lp1030 +g342 +ag138 +ag434 +assg16 +(dp1031 +g5 +(lp1032 +sg8 +(lp1033 +ssg20 +(dp1034 +g5 +(lp1035 +sg8 +(lp1036 +S'road.odef' +p1037 +asssS'sign-bump.odef' +p1038 +(dp1039 +g3 +(dp1040 +g5 +(lp1041 +sg8 +(lp1042 +S'sign-bump.mesh' +p1043 +assg11 +(dp1044 +g5 +(lp1045 +sg8 +(lp1046 +g138 +ag434 +assg16 +(dp1047 +g5 +(lp1048 +sg8 +(lp1049 +ssg20 +(dp1050 +g5 +(lp1051 +sg8 +(lp1052 +S'sign-bump.odef' +p1053 +asssS'hydrostop.wav' +p1054 +(dp1055 +g3 +(dp1056 +g5 +(lp1057 +sg8 +(lp1058 +ssg11 +(dp1059 +g5 +(lp1060 +sg8 +(lp1061 +ssg16 +(dp1062 +g5 +(lp1063 +sg8 +(lp1064 +ssg20 +(dp1065 +g5 +(lp1066 +sg8 +(lp1067 +S'hydrostop.wav' +p1068 +asssS'aspen-17h.jpg' +p1069 +(dp1070 +g3 +(dp1071 +g5 +(lp1072 +sg8 +(lp1073 +ssg11 +(dp1074 +g5 +(lp1075 +sg8 +(lp1076 +ssg16 +(dp1077 +g5 +(lp1078 +sg8 +(lp1079 +ssg20 +(dp1080 +g5 +(lp1081 +sg8 +(lp1082 +S'aspen-17h.jpg' +p1083 +asssS'hangardoor.material' +p1084 +(dp1085 +g3 +(dp1086 +g5 +(lp1087 +sg8 +(lp1088 +S'hangardoor.png' +p1089 +assg11 +(dp1090 +g5 +(lp1091 +sg8 +(lp1092 +S'hangardoor.mesh' +p1093 +assg16 +(dp1094 +g5 +(lp1095 +sg8 +(lp1096 +ssg20 +(dp1097 +g5 +(lp1098 +S'hangardoor' +p1099 +asg8 +(lp1100 +S'hangardoor.material' +p1101 +asssS'liebherr.png' +p1102 +(dp1103 +g3 +(dp1104 +g5 +(lp1105 +sg8 +(lp1106 +ssg11 +(dp1107 +g5 +(lp1108 +sg8 +(lp1109 +S'liebherr.material' +p1110 +assg16 +(dp1111 +g5 +(lp1112 +sg8 +(lp1113 +ssg20 +(dp1114 +g5 +(lp1115 +sg8 +(lp1116 +S'liebherr.png' +p1117 +asssS'multibenne_emissive.png' +p1118 +(dp1119 +g3 +(dp1120 +g5 +(lp1121 +sg8 +(lp1122 +ssg11 +(dp1123 +g5 +(lp1124 +sg8 +(lp1125 +S'multibenne.material' +p1126 +assg16 +(dp1127 +g5 +(lp1128 +sg8 +(lp1129 +ssg20 +(dp1130 +g5 +(lp1131 +sg8 +(lp1132 +S'multibenne_emissive.png' +p1133 +asssS'turbo.wav' +p1134 +(dp1135 +g3 +(dp1136 +g5 +(lp1137 +sg8 +(lp1138 +ssg11 +(dp1139 +g5 +(lp1140 +sg8 +(lp1141 +ssg16 +(dp1142 +g5 +(lp1143 +sg8 +(lp1144 +ssg20 +(dp1145 +g5 +(lp1146 +sg8 +(lp1147 +S'turbo.wav' +p1148 +asssS't813.png' +p1149 +(dp1150 +g3 +(dp1151 +g5 +(lp1152 +sg8 +(lp1153 +ssg11 +(dp1154 +g5 +(lp1155 +sg8 +(lp1156 +g154 +assg16 +(dp1157 +g5 +(lp1158 +sg8 +(lp1159 +ssg20 +(dp1160 +g5 +(lp1161 +sg8 +(lp1162 +S't813.png' +p1163 +asssS'seat.mesh.xml' +p1164 +(dp1165 +g20 +(dp1166 +ssS'island-mini.png' +p1167 +(dp1168 +g3 +(dp1169 +g5 +(lp1170 +sg8 +(lp1171 +ssg11 +(dp1172 +g5 +(lp1173 +sg8 +(lp1174 +g342 +assg16 +(dp1175 +g5 +(lp1176 +sg8 +(lp1177 +ssg20 +(dp1178 +g5 +(lp1179 +sg8 +(lp1180 +S'island-mini.png' +p1181 +asssS'OgreCore.zip' +p1182 +(dp1183 +g20 +(dp1184 +ssS'RenderSystem_Direct3D9.dll' +p1185 +(dp1186 +g20 +(dp1187 +ssS'dodgewheelband.png' +p1188 +(dp1189 +g3 +(dp1190 +g5 +(lp1191 +sg8 +(lp1192 +ssg11 +(dp1193 +g5 +(lp1194 +sg8 +(lp1195 +g103 +assg16 +(dp1196 +g5 +(lp1197 +sg8 +(lp1198 +ssg20 +(dp1199 +g5 +(lp1200 +sg8 +(lp1201 +S'dodgewheelband.png' +p1202 +asssS'sign-dir-cold-cast.mesh.xml' +p1203 +(dp1204 +g20 +(dp1205 +ssS'RustySteel.jpg' +p1206 +(dp1207 +g3 +(dp1208 +g5 +(lp1209 +sg8 +(lp1210 +ssg11 +(dp1211 +g5 +(lp1212 +sg8 +(lp1213 +g186 +assg16 +(dp1214 +g5 +(lp1215 +sg8 +(lp1216 +ssg20 +(dp1217 +g5 +(lp1218 +sg8 +(lp1219 +S'RustySteel.jpg' +p1220 +asssS'island-7h.jpg' +p1221 +(dp1222 +g3 +(dp1223 +g5 +(lp1224 +sg8 +(lp1225 +ssg11 +(dp1226 +g5 +(lp1227 +sg8 +(lp1228 +ssg16 +(dp1229 +g5 +(lp1230 +sg8 +(lp1231 +ssg20 +(dp1232 +g5 +(lp1233 +sg8 +(lp1234 +S'island-7h.jpg' +p1235 +asssS'sign-dir-fish.odef' +p1236 +(dp1237 +g3 +(dp1238 +g5 +(lp1239 +sg8 +(lp1240 +S'sign-dir-fish.mesh' +p1241 +assg11 +(dp1242 +g5 +(lp1243 +sg8 +(lp1244 +g434 +assg16 +(dp1245 +g5 +(lp1246 +sg8 +(lp1247 +ssg20 +(dp1248 +g5 +(lp1249 +sg8 +(lp1250 +S'sign-dir-fish.odef' +p1251 +asssS'island-12h.jpg' +p1252 +(dp1253 +g3 +(dp1254 +g5 +(lp1255 +sg8 +(lp1256 +ssg11 +(dp1257 +g5 +(lp1258 +sg8 +(lp1259 +ssg16 +(dp1260 +g5 +(lp1261 +sg8 +(lp1262 +ssg20 +(dp1263 +g5 +(lp1264 +sg8 +(lp1265 +S'island-12h.jpg' +p1266 +asssS'caliber.png' +p1267 +(dp1268 +g3 +(dp1269 +g5 +(lp1270 +sg8 +(lp1271 +ssg11 +(dp1272 +g5 +(lp1273 +sg8 +(lp1274 +S'caliber.material' +p1275 +assg16 +(dp1276 +g5 +(lp1277 +sg8 +(lp1278 +ssg20 +(dp1279 +g5 +(lp1280 +sg8 +(lp1281 +S'caliber.png' +p1282 +asssS'C1.jpg' +p1283 +(dp1284 +g3 +(dp1285 +g5 +(lp1286 +sg8 +(lp1287 +ssg11 +(dp1288 +g5 +(lp1289 +sg8 +(lp1290 +g314 +assg16 +(dp1291 +g5 +(lp1292 +sg8 +(lp1293 +ssg20 +(dp1294 +g5 +(lp1295 +sg8 +(lp1296 +S'C1.jpg' +p1297 +asssS'wheelband1.jpg' +p1298 +(dp1299 +g3 +(dp1300 +g5 +(lp1301 +sg8 +(lp1302 +ssg11 +(dp1303 +g5 +(lp1304 +sg8 +(lp1305 +g186 +assg16 +(dp1306 +g5 +(lp1307 +sg8 +(lp1308 +ssg20 +(dp1309 +g5 +(lp1310 +sg8 +(lp1311 +S'wheelband1.jpg' +p1312 +asssS'pedal.png' +p1313 +(dp1314 +g3 +(dp1315 +g5 +(lp1316 +sg8 +(lp1317 +ssg11 +(dp1318 +g5 +(lp1319 +sg8 +(lp1320 +g414 +assg16 +(dp1321 +g5 +(lp1322 +sg8 +(lp1323 +ssg20 +(dp1324 +g5 +(lp1325 +sg8 +(lp1326 +S'pedal.png' +p1327 +asssS'mouse.png' +p1328 +(dp1329 +g3 +(dp1330 +g5 +(lp1331 +sg8 +(lp1332 +ssg11 +(dp1333 +g5 +(lp1334 +sg8 +(lp1335 +g381 +assg16 +(dp1336 +g5 +(lp1337 +sg8 +(lp1338 +ssg20 +(dp1339 +g5 +(lp1340 +sg8 +(lp1341 +S'mouse.png' +p1342 +asssS'sign-dir-cold-left.mesh.xml' +p1343 +(dp1344 +g20 +(dp1345 +ssS'ILUT.dll' +p1346 +(dp1347 +g20 +(dp1348 +ssS'door.wav' +p1349 +(dp1350 +g3 +(dp1351 +g5 +(lp1352 +sg8 +(lp1353 +ssg11 +(dp1354 +g5 +(lp1355 +sg8 +(lp1356 +ssg16 +(dp1357 +g5 +(lp1358 +sg8 +(lp1359 +ssg20 +(dp1360 +g5 +(lp1361 +sg8 +(lp1362 +S'door.wav' +p1363 +asssS'nhelens.raw' +p1364 +(dp1365 +g3 +(dp1366 +g5 +(lp1367 +sg8 +(lp1368 +ssg11 +(dp1369 +g5 +(lp1370 +sg8 +(lp1371 +S'nhelens.cfg' +p1372 +assg16 +(dp1373 +g5 +(lp1374 +sg8 +(lp1375 +ssg20 +(dp1376 +g5 +(lp1377 +sg8 +(lp1378 +S'nhelens.raw' +p1379 +asssS'mouse.overlay' +p1380 +(dp1381 +g20 +(dp1382 +ssS'flatdafrwheelface.png' +p1383 +(dp1384 +g3 +(dp1385 +g5 +(lp1386 +sg8 +(lp1387 +ssg11 +(dp1388 +g5 +(lp1389 +sg8 +(lp1390 +g745 +assg16 +(dp1391 +g5 +(lp1392 +sg8 +(lp1393 +ssg20 +(dp1394 +g5 +(lp1395 +sg8 +(lp1396 +S'flatdafrwheelface.png' +p1397 +asssS'ripple.png' +p1398 +(dp1399 +g3 +(dp1400 +g5 +(lp1401 +sg8 +(lp1402 +ssg11 +(dp1403 +g5 +(lp1404 +sg8 +(lp1405 +g66 +assg16 +(dp1406 +g5 +(lp1407 +sg8 +(lp1408 +ssg20 +(dp1409 +g5 +(lp1410 +sg8 +(lp1411 +S'ripple.png' +p1412 +asssS'nhelens-15h.jpg' +p1413 +(dp1414 +g3 +(dp1415 +g5 +(lp1416 +sg8 +(lp1417 +ssg11 +(dp1418 +g5 +(lp1419 +sg8 +(lp1420 +ssg16 +(dp1421 +g5 +(lp1422 +sg8 +(lp1423 +ssg20 +(dp1424 +g5 +(lp1425 +sg8 +(lp1426 +S'nhelens-15h.jpg' +p1427 +asssS'road-block5.odef' +p1428 +(dp1429 +g3 +(dp1430 +g5 +(lp1431 +sg8 +(lp1432 +S'road-block5.mesh' +p1433 +assg11 +(dp1434 +g5 +(lp1435 +sg8 +(lp1436 +ssg16 +(dp1437 +g5 +(lp1438 +sg8 +(lp1439 +ssg20 +(dp1440 +g5 +(lp1441 +sg8 +(lp1442 +S'road-block5.odef' +p1443 +asssS'agoral-mini.png' +p1444 +(dp1445 +g3 +(dp1446 +g5 +(lp1447 +sg8 +(lp1448 +ssg11 +(dp1449 +g5 +(lp1450 +sg8 +(lp1451 +S'agoral.truck' +p1452 +assg16 +(dp1453 +g5 +(lp1454 +sg8 +(lp1455 +ssg20 +(dp1456 +g5 +(lp1457 +sg8 +(lp1458 +S'agoral-mini.png' +p1459 +asssS'blackdot.png' +p1460 +(dp1461 +g3 +(dp1462 +g5 +(lp1463 +sg8 +(lp1464 +ssg11 +(dp1465 +g5 +(lp1466 +sg8 +(lp1467 +g414 +assg16 +(dp1468 +g5 +(lp1469 +sg8 +(lp1470 +ssg20 +(dp1471 +g5 +(lp1472 +sg8 +(lp1473 +S'blackdot.png' +p1474 +asssS'acontainer.png' +p1475 +(dp1476 +g3 +(dp1477 +g5 +(lp1478 +sg8 +(lp1479 +ssg11 +(dp1480 +g5 +(lp1481 +sg8 +(lp1482 +g807 +assg16 +(dp1483 +g5 +(lp1484 +sg8 +(lp1485 +ssg20 +(dp1486 +g5 +(lp1487 +sg8 +(lp1488 +S'acontainer.png' +p1489 +asssS'sign-rocks.odef' +p1490 +(dp1491 +g3 +(dp1492 +g5 +(lp1493 +sg8 +(lp1494 +S'sign-rocks.mesh' +p1495 +assg11 +(dp1496 +g5 +(lp1497 +sg8 +(lp1498 +g138 +ag434 +assg16 +(dp1499 +g5 +(lp1500 +sg8 +(lp1501 +ssg20 +(dp1502 +g5 +(lp1503 +sg8 +(lp1504 +S'sign-rocks.odef' +p1505 +asssS'sign-dir-cargo.mesh' +p1506 +(dp1507 +g3 +(dp1508 +g5 +(lp1509 +S'sign-nhelens' +p1510 +asg8 +(lp1511 +g31 +assg11 +(dp1512 +g5 +(lp1513 +sg8 +(lp1514 +S'sign-dir-cargo.odef' +p1515 +assg16 +(dp1516 +g5 +(lp1517 +sg8 +(lp1518 +ssg20 +(dp1519 +g5 +(lp1520 +sg8 +(lp1521 +S'sign-dir-cargo.mesh' +p1522 +asssS'engine.overlay' +p1523 +(dp1524 +g20 +(dp1525 +ssS'road-park.mesh' +p1526 +(dp1527 +g3 +(dp1528 +g5 +(lp1529 +S'road' +p1530 +asg8 +(lp1531 +g218 +assg11 +(dp1532 +g5 +(lp1533 +sg8 +(lp1534 +S'road-park.odef' +p1535 +assg16 +(dp1536 +g5 +(lp1537 +sg8 +(lp1538 +ssg20 +(dp1539 +g5 +(lp1540 +sg8 +(lp1541 +S'road-park.mesh' +p1542 +asssS'whiteneedle.png' +p1543 +(dp1544 +g3 +(dp1545 +g5 +(lp1546 +sg8 +(lp1547 +ssg11 +(dp1548 +g5 +(lp1549 +sg8 +(lp1550 +g414 +assg16 +(dp1551 +g5 +(lp1552 +sg8 +(lp1553 +ssg20 +(dp1554 +g5 +(lp1555 +sg8 +(lp1556 +S'whiteneedle.png' +p1557 +asssS'secured-on.png' +p1558 +(dp1559 +g3 +(dp1560 +g5 +(lp1561 +sg8 +(lp1562 +ssg11 +(dp1563 +g5 +(lp1564 +sg8 +(lp1565 +g66 +assg16 +(dp1566 +g5 +(lp1567 +sg8 +(lp1568 +ssg20 +(dp1569 +g5 +(lp1570 +sg8 +(lp1571 +S'secured-on.png' +p1572 +asssS'sign-pos-castle.odef' +p1573 +(dp1574 +g3 +(dp1575 +g5 +(lp1576 +sg8 +(lp1577 +S'sign-pos-castle.mesh' +p1578 +assg11 +(dp1579 +g5 +(lp1580 +sg8 +(lp1581 +g434 +assg16 +(dp1582 +g5 +(lp1583 +sg8 +(lp1584 +ssg20 +(dp1585 +g5 +(lp1586 +sg8 +(lp1587 +S'sign-pos-castle.odef' +p1588 +asssS'Caelum.dll' +p1589 +(dp1590 +g20 +(dp1591 +ssS'sign-pos-castle.mesh' +p1592 +(dp1593 +g3 +(dp1594 +g5 +(lp1595 +S'sign-nhelens' +p1596 +asg8 +(lp1597 +g31 +assg11 +(dp1598 +g5 +(lp1599 +sg8 +(lp1600 +g1573 +assg16 +(dp1601 +g5 +(lp1602 +sg8 +(lp1603 +ssg20 +(dp1604 +g5 +(lp1605 +sg8 +(lp1606 +S'sign-pos-castle.mesh' +p1607 +asssS'unknown.png' +p1608 +(dp1609 +g3 +(dp1610 +g5 +(lp1611 +sg8 +(lp1612 +ssg11 +(dp1613 +g5 +(lp1614 +sg8 +(lp1615 +g66 +ag414 +ag381 +assg16 +(dp1616 +g5 +(lp1617 +sg8 +(lp1618 +ssg20 +(dp1619 +g5 +(lp1620 +sg8 +(lp1621 +S'unknown.png' +p1622 +asssS'road-runway-end.odef' +p1623 +(dp1624 +g3 +(dp1625 +g5 +(lp1626 +sg8 +(lp1627 +S'road-runway-end.mesh' +p1628 +assg11 +(dp1629 +g5 +(lp1630 +sg8 +(lp1631 +g342 +ag138 +ag434 +assg16 +(dp1632 +g5 +(lp1633 +sg8 +(lp1634 +ssg20 +(dp1635 +g5 +(lp1636 +sg8 +(lp1637 +S'road-runway-end.odef' +p1638 +asssS'nedlloyd.mesh' +p1639 +(dp1640 +g3 +(dp1641 +g5 +(lp1642 +S'nedlloyd' +p1643 +asg8 +(lp1644 +S'nedlloyd.material' +p1645 +assg11 +(dp1646 +g5 +(lp1647 +sg8 +(lp1648 +S'nedlloyd.odef' +p1649 +assg16 +(dp1650 +g5 +(lp1651 +sg8 +(lp1652 +ssg20 +(dp1653 +g5 +(lp1654 +sg8 +(lp1655 +S'nedlloyd.mesh' +p1656 +asssS'semi.truck' +p1657 +(dp1658 +g3 +(dp1659 +g5 +(lp1660 +S'tracks/semi' +p1661 +asg8 +(lp1662 +S'dashboard.mesh' +p1663 +aS'leftmirror.mesh' +p1664 +aS'rightmirror.mesh' +p1665 +aS'seat.mesh' +p1666 +aS'seat.mesh' +p1667 +ag483 +ag483 +aS'semi-mini.png' +p1668 +assg11 +(dp1669 +g5 +(lp1670 +sg8 +(lp1671 +ssg16 +(dp1672 +g5 +(lp1673 +S'tracks/semihelp' +p1674 +asg8 +(lp1675 +S'semi-mini.png' +p1676 +assg20 +(dp1677 +g5 +(lp1678 +sg8 +(lp1679 +S'semi.truck' +p1680 +asssS'virtualdashboard.png' +p1681 +(dp1682 +g3 +(dp1683 +g5 +(lp1684 +sg8 +(lp1685 +ssg11 +(dp1686 +g5 +(lp1687 +sg8 +(lp1688 +ssg16 +(dp1689 +g5 +(lp1690 +sg8 +(lp1691 +ssg20 +(dp1692 +g5 +(lp1693 +sg8 +(lp1694 +S'virtualdashboard.png' +p1695 +asssg607 +(dp1696 +g3 +(dp1697 +g5 +(lp1698 +S'tracks/An12' +p1699 +asg8 +(lp1700 +S'an12nacelle.mesh' +p1701 +aS'an12nacelle.mesh' +p1702 +aS'an12nacelle.mesh' +p1703 +aS'an12nacelle.mesh' +p1704 +aS'pale.mesh' +p1705 +aS'pale.mesh' +p1706 +aS'pale.mesh' +p1707 +aS'pale.mesh' +p1708 +aS'spinprop.mesh' +p1709 +aS'pale.mesh' +p1710 +aS'pale.mesh' +p1711 +aS'pale.mesh' +p1712 +aS'pale.mesh' +p1713 +aS'spinprop.mesh' +p1714 +aS'pale.mesh' +p1715 +aS'pale.mesh' +p1716 +aS'pale.mesh' +p1717 +aS'pale.mesh' +p1718 +aS'spinprop.mesh' +p1719 +aS'pale.mesh' +p1720 +aS'pale.mesh' +p1721 +aS'pale.mesh' +p1722 +aS'pale.mesh' +p1723 +aS'spinprop.mesh' +p1724 +aS'redbeacon.mesh' +p1725 +aS'redbeacon.mesh' +p1726 +aS'an12turret.mesh' +p1727 +aS'an12fairing-left.mesh' +p1728 +aS'an12fairing-right.mesh' +p1729 +ag593 +aS'an-12-mini.png' +p1730 +assg11 +(dp1731 +g5 +(lp1732 +sg8 +(lp1733 +g342 +ag138 +assg16 +(dp1734 +g5 +(lp1735 +S'tracks/an-12help' +p1736 +asg8 +(lp1737 +S'an-12-mini.png' +p1738 +assg20 +(dp1739 +g5 +(lp1740 +sg8 +(lp1741 +S'an-12.truck' +p1742 +asssS'chp-start.mesh' +p1743 +(dp1744 +g3 +(dp1745 +g5 +(lp1746 +S'chp' +p1747 +asg8 +(lp1748 +S'chp.material' +p1749 +assg11 +(dp1750 +g5 +(lp1751 +sg8 +(lp1752 +S'chp-start.odef' +p1753 +assg16 +(dp1754 +g5 +(lp1755 +sg8 +(lp1756 +ssg20 +(dp1757 +g5 +(lp1758 +sg8 +(lp1759 +S'chp-start.mesh' +p1760 +asssS'starterstart.wav' +p1761 +(dp1762 +g3 +(dp1763 +g5 +(lp1764 +sg8 +(lp1765 +ssg11 +(dp1766 +g5 +(lp1767 +sg8 +(lp1768 +ssg16 +(dp1769 +g5 +(lp1770 +sg8 +(lp1771 +ssg20 +(dp1772 +g5 +(lp1773 +sg8 +(lp1774 +S'starterstart.wav' +p1775 +asssS'sign-leftturn.mesh' +p1776 +(dp1777 +g3 +(dp1778 +g5 +(lp1779 +S'sign-leftturn' +p1780 +asg8 +(lp1781 +g31 +assg11 +(dp1782 +g5 +(lp1783 +sg8 +(lp1784 +S'sign-leftturn.odef' +p1785 +assg16 +(dp1786 +g5 +(lp1787 +sg8 +(lp1788 +ssg20 +(dp1789 +g5 +(lp1790 +sg8 +(lp1791 +S'sign-leftturn.mesh' +p1792 +asssS'challywheelface.png' +p1793 +(dp1794 +g3 +(dp1795 +g5 +(lp1796 +sg8 +(lp1797 +ssg11 +(dp1798 +g5 +(lp1799 +sg8 +(lp1800 +S'challenger.material' +p1801 +assg16 +(dp1802 +g5 +(lp1803 +sg8 +(lp1804 +ssg20 +(dp1805 +g5 +(lp1806 +sg8 +(lp1807 +S'challywheelface.png' +p1808 +asssS'agoras.truck' +p1809 +(dp1810 +g3 +(dp1811 +g5 +(lp1812 +S'tracks/agora' +p1813 +asg8 +(lp1814 +S'dashboard.mesh' +p1815 +aS'leftmirror.mesh' +p1816 +aS'rightmirror.mesh' +p1817 +aS'seat.mesh' +p1818 +aS'agora.material' +p1819 +aS'agoras-mini.png' +p1820 +assg11 +(dp1821 +g5 +(lp1822 +sg8 +(lp1823 +ssg16 +(dp1824 +g5 +(lp1825 +S'tracks/agorashelp' +p1826 +asg8 +(lp1827 +S'agoras-mini.png' +p1828 +assg20 +(dp1829 +g5 +(lp1830 +sg8 +(lp1831 +S'agoras.truck' +p1832 +asssS'beacon.mesh.xml' +p1833 +(dp1834 +g20 +(dp1835 +ssS'flatdaf.truck' +p1836 +(dp1837 +g3 +(dp1838 +g5 +(lp1839 +S'tr... [truncated message content] |
From: <ror...@us...> - 2007-07-20 12:41:41
|
Revision: 111 http://roreditor.svn.sourceforge.net/roreditor/?rev=111&view=rev Author: rorthomas Date: 2007-07-20 05:41:36 -0700 (Fri, 20 Jul 2007) Log Message: ----------- * logging stubs * terrain editor undo/redo function Modified Paths: -------------- trunk/lib/ror/terrainparser.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py trunk/lib/wxogre/OgreManager.py trunk/terrainreadme.txt Modified: trunk/lib/ror/terrainparser.py =================================================================== --- trunk/lib/ror/terrainparser.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/ror/terrainparser.py 2007-07-20 12:41:36 UTC (rev 111) @@ -184,29 +184,6 @@ obj.additionaloptions = objname[1:] self.objects.append(obj) - - - def loadOdef(self, objname): - try: - f=open(self.rordir+"\\data\\objects\\%s.odef" % (objname), 'r') - content = f.readlines() - f.close() - meshname = content[0].strip() - scalearr = content[1].split(",") - self.myODefs[objname] = [] - if len(content) > 2: - for i in range(1,len(content)): - line = content[i] - if line.lower().strip() == "end": - break - self.myODefs[objname].append(line.split(",")) - return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) - else: - return (meshname, 1, 1, 1) - except Exception, err: - print "error while processing odef file of %s" % objname - print str(err) - def getObjectLines(self, object): lines = [] Modified: trunk/lib/rorterraineditor/MainFrame.py =================================================================== --- trunk/lib/rorterraineditor/MainFrame.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/rorterraineditor/MainFrame.py 2007-07-20 12:41:36 UTC (rev 111) @@ -77,8 +77,8 @@ self.ogreTimer.Start(25) #create statusbar - self.statusbar = self.CreateStatusBar(4, 0, wx.ID_ANY, "mainstatusbar") - self.statusbar.SetStatusWidths([-1, 300, 300, 80]) + self.statusbar = self.CreateStatusBar(5, 0, wx.ID_ANY, "mainstatusbar") + self.statusbar.SetStatusWidths([-1, 200, 130, 250, 80]) #self.statusbar.SetStatusText("", 1) #create toolbar @@ -214,10 +214,11 @@ self.terrainOgreWin.stickCurrentObjectToGround = self.btnStickToGround.GetValue() def updateObjPosRot(self, event=None): + self.statusbar.SetStatusText(self.terrainOgreWin.currentStatusMsg, 1) if self.terrainOgreWin.terrain is None: return if self.terrainOgreWin.selectedEntry is None: - self.statusbar.SetStatusText("", 1) + self.statusbar.SetStatusText("Nothing selected", 2) return entry = self.terrainOgreWin.selectedEntry #comment = self.terrainOgreWin.getCommentsForObject(n.getName()).lstrip('/') @@ -225,11 +226,11 @@ # txt = "%s / %s" % (n.getName(), comment) #else: txt = "%s %s" % (entry.data.name, " ".join(entry.data.additionaloptions)) - self.statusbar.SetStatusText(txt, 1) - + self.statusbar.SetStatusText(txt, 2) + posx, posy, posz, rotx, roty, rotz = self.terrainOgreWin.getSelectionPositionRotation() txt = "%0.2f, %0.2f, %0.2f / %0.2f, %0.2f, %0.2f" % (posx, posy, posz, rotx, roty, rotz) - self.statusbar.SetStatusText(txt, 2) + self.statusbar.SetStatusText(txt, 3) #pos = n.getPosition() #self.terrPosX.SetValue(str(round(pos.x,2))) @@ -332,7 +333,7 @@ def OnTimer(self, event): #fill labels with some information, all windows have the same FPS! txt = "%0.2f FPS" % (self.terrainOgreWin.renderWindow.getStatistics().lastFPS) - self.statusbar.SetStatusText(txt, 3) + self.statusbar.SetStatusText(txt, 4) self.updateObjPosRot() def OnExit(self, event): Modified: trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-20 12:41:36 UTC (rev 111) @@ -1,5 +1,5 @@ #Thomas Fischer 31/05/2007, th...@th... -import wx, os, os.path +import wx, os, os.path, copy import ogre.renderer.OGRE as ogre from ror.truckparser import * from ror.terrainparser import * @@ -7,6 +7,7 @@ from wxogre.wxOgreWindow import * from ror.rorcommon import * + ADDEDBY = "//added by the terrrain editor:\n" SHIFT_SPEED_FACTOR = 20 SLOW_DOWN_FACTOR = 0.75 @@ -14,19 +15,28 @@ # this class holds all the needed 3d data and also the underlying object data class Entry: + uuid = None node = None entity = None data = None manual = None +class HistoryEntry: + uuid = None + Position = None + Rotation = None class RoRTerrainOgreWindow(wxOgreWindow): terrain = None - clearlist = {'entity':[]} + commandhistory = [] + historypointer = 0 + selectedEntry = None selectedCoords = None + currentStatusMsg = "" + cameralandcollisionenabled = True entries = {} @@ -322,13 +332,11 @@ entry.node.detachAllObjects() self.sceneManager.destroySceneNode(entry.node.getName()) except: - print "A" pass if not entry.entity is None: try: self.sceneManager.destroyEntity(entry.entity) except: - print "B" pass if not entry.data is None: del entry.data @@ -360,14 +368,14 @@ self.updateDataStructures() if not self.terrain is None: return self.terrain.save(fn) - + def LoadTerrain(self, filename): if not self.terrain is None: self.free() - print filename + #print filename self.terrain = RoRTerrain(filename) - print len(self.terrain.objects) + #print len(self.terrain.objects) cfgfile = os.path.join(os.path.dirname(filename), self.terrain.TerrainConfig) self.sceneManager.setWorldGeometry(cfgfile) @@ -438,6 +446,7 @@ return entry = Entry() + entry.uuid = uuid entry.node = self.sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") entry.entity = self.sceneManager.createEntity(str(uuid)+"entity", meshname) entry.data = data @@ -481,6 +490,7 @@ truckFilename = self.rordir + "\\data\\trucks\\"+truckFilename entry = Entry() + entry.uuid = uuid entry.node, entry.entity, entry.manualobject = self.createTruckMesh(truckFilename, uuid) entry.data = data @@ -683,7 +693,68 @@ def controlSelectedObject(self,action, value): pass + + def addObjectToHistory(self, entry): + if len(self.commandhistory) > 0: + if self.historypointer < len(self.commandhistory): + del self.commandhistory[self.historypointer:] + + pos = entry.node.getPosition() + rot = entry.node.getOrientation() + + if len(self.commandhistory) > 0: + # check if double + hentry = self.commandhistory[-1] + if hentry.position == pos and hentry.rotation == rot: + return + hentry = HistoryEntry() + hentry.uuid = entry.uuid + hentry.position = pos + hentry.rotation = rot + self.commandhistory.append(hentry) + self.historypointer = len(self.commandhistory) + + def undoHistory(self): + if self.historypointer == 0: + return + self.SelectedArrow = None + + + self.historypointer -= 1 + hentry = self.commandhistory[self.historypointer] + self.entries[hentry.uuid].node.setPosition(hentry.position) + self.entries[hentry.uuid].node.setOrientation(hentry.rotation) + + # update node positions + self.TranslateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + self.RotateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + #self.TranslateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + self.RotateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + + #self.entries[obj.uuid].node.setPosition(obj.node.getPosition) + self.currentStatusMsg = "undo step %d of %d" % (self.historypointer+1, len(self.commandhistory)) + + def redoHistory(self): + if self.historypointer + 1 >= len(self.commandhistory): + return + self.SelectedArrow = None + + self.historypointer += 1 + hentry = self.commandhistory[self.historypointer] + self.entries[hentry.uuid].node.setPosition(hentry.position) + self.entries[hentry.uuid].node.setOrientation(hentry.rotation) + + # update node positions + self.TranslateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + self.RotateNode.setPosition(self.entries[hentry.uuid].node.getPosition()) + #self.TranslateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + self.RotateNode.setOrientation(self.entries[hentry.uuid].node.getOrientation()) + + #self.entries[obj.uuid].node.setPosition(obj.node.getPosition) + self.currentStatusMsg = "redo step %d of %d" % (self.historypointer+1, len(self.commandhistory)) + + def controlArrows(self, event): if self.SelectedArrow is None: return @@ -711,6 +782,7 @@ self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'movearrowsY': self.TranslateNode.translate(0,0,forcex,relativeTo=ogre.Node.TransformSpace.TS_LOCAL) @@ -718,6 +790,7 @@ self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'movearrowsZ': self.TranslateNode.translate(0,forcex,0,relativeTo=ogre.Node.TransformSpace.TS_LOCAL) @@ -725,18 +798,22 @@ self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'rotatearrowsX': self.RotateNode.yaw(forceDegree) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.yaw(forceDegree) elif self.SelectedArrow.getName() == 'rotatearrowsY': self.RotateNode.pitch(forceDegree) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.pitch(forceDegree) elif self.SelectedArrow.getName() == 'rotatearrowsZ': self.RotateNode.roll(forceDegree) if self.selectedEntry: + self.addObjectToHistory(self.selectedEntry) self.selectedEntry.node.roll(forceDegree) def onMouseEvent(self,event): @@ -772,6 +849,7 @@ if event.LeftDown() and event.ControlDown() and not self.selectedEntry is None: pos = self.getPointedPosition(event) if not pos is None: + self.addObjectToHistory(self.selectedEntry) self.TranslateNode.setPosition(pos) self.RotateNode.setPosition(pos) self.selectedEntry.node.setPosition(pos) @@ -800,7 +878,7 @@ d = 0.5 if event.ShiftDown(): d *= SHIFT_SPEED_FACTOR - + if event.m_keyCode == 65: # A, wx.WXK_LEFT: self.keyPress.x = -d elif event.m_keyCode == 68: # D, wx.WXK_RIGHT: @@ -809,6 +887,10 @@ self.keyPress.z = -d elif event.m_keyCode == 83: # S, wx.WXK_DOWN: self.keyPress.z = d + elif event.m_keyCode == 70: # F + self.undoHistory() + elif event.m_keyCode == 71: # G + self.redoHistory() elif event.m_keyCode == wx.WXK_PAGEUP: self.keyPress.y = d elif event.m_keyCode == wx.WXK_PAGEDOWN: Modified: trunk/lib/wxogre/OgreManager.py =================================================================== --- trunk/lib/wxogre/OgreManager.py 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/lib/wxogre/OgreManager.py 2007-07-20 12:41:36 UTC (rev 111) @@ -4,6 +4,7 @@ import ogre.renderer.OGRE as ogre from ror.logger import log +from ror.ogrelogger import initOgreLogging from ror.settingsManager import getSettingsManager # singleton implementation of OgreManager @@ -14,6 +15,15 @@ _ogremanager = OgreManager() return _ogremanager +class MyLog(ogre.LogListener): + def __init__(self): + # Creates a C++ log that will try and write to console and file + ogre.LogListener.__init__(self) + + def messageLogged(self, message, level, debug, logName): + print ">>>", message + return True + class OgreManager(): renderWindows = {} @@ -27,7 +37,13 @@ def init(self): #Root creation - self.ogreRoot = ogre.Root(self.getConfigPath('plugins.cfg'), self.getConfigPath('ogre.cfg'), "ogre.log") + self.ogreRoot = ogre.Root(self.getConfigPath('plugins.cfg'), self.getConfigPath('ogre.cfg'), "Ogre.log") + #logMgr = ogre.LogManager() + #currentLog = ogre.LogManager.getSingletonPtr().createLog("ogre.log" ,True, False, False) + #myLog = MyLog() + #currentLog.addListener ( myLog ) + #ogre.LogManager.getSingletonPtr().setDefaultLog(currentLog) + if not self.tryDetectRenderer(): self.ogreRoot.showConfigDialog() self.ogreRoot.initialise(False) Modified: trunk/terrainreadme.txt =================================================================== --- trunk/terrainreadme.txt 2007-07-20 10:00:13 UTC (rev 110) +++ trunk/terrainreadme.txt 2007-07-20 12:41:36 UTC (rev 111) @@ -25,6 +25,10 @@ T switch between bilinear and trilinear filtering R switch between solid, wireframe and point mode +History Functions: +F undo last movement/rotation +G redo last undo + ============================================================ How To Add Things ============================================================ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-20 10:00:15
|
Revision: 110 http://roreditor.svn.sourceforge.net/roreditor/?rev=110&view=rev Author: rorthomas Date: 2007-07-20 03:00:13 -0700 (Fri, 20 Jul 2007) Log Message: ----------- * freeing of objects now working for terraineditor --> open multiple terrains * fixed bug within terrainparser.py Modified Paths: -------------- trunk/lib/ror/terrainparser.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py Modified: trunk/lib/ror/terrainparser.py =================================================================== --- trunk/lib/ror/terrainparser.py 2007-07-20 00:31:37 UTC (rev 109) +++ trunk/lib/ror/terrainparser.py 2007-07-20 10:00:13 UTC (rev 110) @@ -34,7 +34,6 @@ TerrainName = "" TerrainConfig = "" filename = "" - comments = {} trucks = [] loads = [] @@ -62,6 +61,9 @@ def __init__(self, filename): self.filename = filename content = self.loadFile(filename) + self.trucks = [] + self.loads = [] + self.objects = [] log().info("processing terrain file: %s" % filename) self.processTerrnFile(content) self.FixTerrainConfig(os.path.join(os.path.dirname(filename), self.TerrainConfig)) Modified: trunk/lib/rorterraineditor/MainFrame.py =================================================================== --- trunk/lib/rorterraineditor/MainFrame.py 2007-07-20 00:31:37 UTC (rev 109) +++ trunk/lib/rorterraineditor/MainFrame.py 2007-07-20 10:00:13 UTC (rev 110) @@ -214,6 +214,8 @@ self.terrainOgreWin.stickCurrentObjectToGround = self.btnStickToGround.GetValue() def updateObjPosRot(self, event=None): + if self.terrainOgreWin.terrain is None: + return if self.terrainOgreWin.selectedEntry is None: self.statusbar.SetStatusText("", 1) return @@ -242,12 +244,13 @@ # pass def OnChangeTerrainNameChange(self, event=None): - self.terrainOgreWin.TerrainName = self.terrainNamectrl.GetValue() + self.terrainOgreWin.terrain.TerrainName = self.terrainNamectrl.GetValue() def OnChangeWaterLevel(self, event=None): - self.terrainOgreWin.terrain.WaterHeight = self.waterlevelctrl.GetValue() - self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.terrain.WaterHeight) - self.terrainOgreWin.updateWaterPlane() + if not self.terrainOgreWin.terrain is None: + self.terrainOgreWin.terrain.WaterHeight = self.waterlevelctrl.GetValue() + self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.terrain.WaterHeight) + self.terrainOgreWin.updateWaterPlane() def OnChangeOgreSettings(self, event): getOgreManager().getRoot().showConfigDialog() @@ -290,7 +293,7 @@ dialog = wx.FileDialog(self, "Open Terrain", default, "", "Terrain Files (*.terrn)|*.terrn", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) res = dialog.ShowModal() if res == wx.ID_OK: - self.fileopenmenu.Enable(False) + #self.fileopenmenu.Enable(False) self.filesavemenu.Enable(True) self.filesaveasmenu.Enable(True) filename = dialog.GetPath() @@ -305,11 +308,11 @@ #self.sharedOgreWin2 = RoRTerrainSelectedObjectTopOgreWindow(self.viewsplitterdown, wx.ID_ANY, self.terrainOgreWin) self.terrainOgreWin.LoadTerrain(filename) - - #update some controls if finished loading - self.waterlevelctrl.SetValue(self.terrainOgreWin.terrain.WaterHeight) - self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.terrain.WaterHeight) - self.terrainNamectrl.SetValue(self.terrainOgreWin.terrain.TerrainName) + if not self.terrainOgreWin.terrain is None: + #update some controls if finished loading + self.waterlevelctrl.SetValue(self.terrainOgreWin.terrain.WaterHeight) + self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.terrain.WaterHeight) + self.terrainNamectrl.SetValue(self.terrainOgreWin.terrain.TerrainName) def onViewObjectDetails(self, event=None): Modified: trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-20 00:31:37 UTC (rev 109) +++ trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-20 10:00:13 UTC (rev 110) @@ -17,6 +17,7 @@ node = None entity = None data = None + manual = None class RoRTerrainOgreWindow(wxOgreWindow): @@ -219,6 +220,8 @@ self.RotateNode.setPosition(entity.getParentNode().getPosition()) def createArrows(self): + if not self.TranslateNode is None: + return #translation nodes n = self.sceneManager.getRootSceneNode().createChildSceneNode("movearrowsnode") nx = n.createChildSceneNode("movearrowsnodeX") @@ -307,7 +310,42 @@ self.arrowScale = self.selectedEntry.entity.getBoundingRadius() / 100 def free(self): - self.sceneManager.clearScene() + #self.sceneManager.clearScene() + self.sceneManager.destroyAllManualObjects() + + # try to clear things up + #try: + for key in self.entries.keys(): + entry = self.entries[key] + if not entry.node is None: + try: + entry.node.detachAllObjects() + self.sceneManager.destroySceneNode(entry.node.getName()) + except: + print "A" + pass + if not entry.entity is None: + try: + self.sceneManager.destroyEntity(entry.entity) + except: + print "B" + pass + if not entry.data is None: + del entry.data + del self.entries[key] + + + try: + self.waternode.detachAllObjects() + self.sceneManager.destroySceneNode(self.waternode) + self.sceneManager.destroyEntity(self.waterentity) + except: + pass + + self.terrain = None + self.entries = {} + #except: + # pass def updateDataStructures(self): for uuid in self.entries.keys(): @@ -327,7 +365,9 @@ if not self.terrain is None: self.free() + print filename self.terrain = RoRTerrain(filename) + print len(self.terrain.objects) cfgfile = os.path.join(os.path.dirname(filename), self.terrain.TerrainConfig) self.sceneManager.setWorldGeometry(cfgfile) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ror...@us...> - 2007-07-20 00:32:20
|
Revision: 109 http://roreditor.svn.sourceforge.net/roreditor/?rev=109&view=rev Author: rorthomas Date: 2007-07-19 17:31:37 -0700 (Thu, 19 Jul 2007) Log Message: ----------- * depchecker.py added groups * common: added UID function * starter: fixed graph and check rordir on startup * rewrote the terraineditor, mainly how the data is internally saved * ogremanager: now detects the renderer automatically Modified Paths: -------------- trunk/lib/ror/depchecker.py trunk/lib/ror/rorcommon.py trunk/lib/ror/starter.py trunk/lib/rorterraineditor/HelpFrame.py trunk/lib/rorterraineditor/MainFrame.py trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py trunk/lib/wxogre/OgreManager.py Added Paths: ----------- trunk/lib/ror/terrainparser.py trunk/terrainreadme.txt Removed Paths: ------------- trunk/readme.txt Modified: trunk/lib/ror/depchecker.py =================================================================== --- trunk/lib/ror/depchecker.py 2007-07-16 13:18:30 UTC (rev 108) +++ trunk/lib/ror/depchecker.py 2007-07-20 00:31:37 UTC (rev 109) @@ -169,16 +169,25 @@ else: if ext == ".truck": n.set('fillcolor', 'gold') + n.set('group', 'truck') elif ext == ".load": n.set('fillcolor', 'lightyellow') + n.set('group', 'load') elif ext == ".material": n.set('fillcolor', 'lightseagreen') + n.set('group', 'material') elif ext == ".terrn": n.set('fillcolor', 'forestgreen') + n.set('group', 'terrain') elif ext == ".mesh": n.set('fillcolor', 'lightsalmon') + n.set('group', 'mesh') + elif ext == ".odef": + n.set('fillcolor', 'lightsalmon') + n.set('group', 'object') elif ext == ".png" or ext == ".jpg" or ext == ".bmp": n.set('fillcolor', 'lightblue') + n.set('group', 'texture') @@ -335,10 +344,14 @@ sys.exit(0) def main(): + import settingsManager if len(sys.argv) < 3: usage() - if not os.path.isdir(sys.argv[1]): - print "%s is not a valid directory!" % sys.argv[1] + path = sys.argv[1] + if path.strip() == "rordir": + path = settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") + if not os.path.isdir(path): + print "%s is not a valid directory!" % path usage() if (len(sys.argv) == 3 and sys.argv[2] in ['all', 'missing', 'unused', 'md5sum']) or (len(sys.argv) == 4 and sys.argv[2] in ['dtree']): pass @@ -349,8 +362,7 @@ dependfilename = "" if len(sys.argv) == 4 and sys.argv[2] in ['dtree'] and sys.argv[3].strip() != "": dependfilename = sys.argv[3].strip() - - RoRDepChecker(sys.argv[1], sys.argv[2], dependfilename) + RoRDepChecker(path , sys.argv[2], dependfilename) if __name__ == "__main__": main() Modified: trunk/lib/ror/rorcommon.py =================================================================== --- trunk/lib/ror/rorcommon.py 2007-07-16 13:18:30 UTC (rev 108) +++ trunk/lib/ror/rorcommon.py 2007-07-20 00:31:37 UTC (rev 109) @@ -1,4 +1,5 @@ import wx +from random import Random def ShowOnAbout(event = None): rev = "" @@ -12,3 +13,27 @@ "About This", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() + + + +def randomID(num_bits=64): + """Return a string representing a bitfield num_bits long. + Maximum artbitrarily set to 1025""" + + if num_bits < 1: + raise RuntimeError,\ + "randomID called with negative (or zero) number of bits" + if num_bits > 1024: + raise RuntimeError,\ + "randomID called with too many bits (> 1024)" + + # create a num_bits string from random import Random + rnd = Random() + tmp_id = 0L + for i in range(0, num_bits): + tmp_id += long(rnd.randint(0,1)) << i + #rof + + # The 2: removes the '0x' and :-1 removes the L + rnd_id = hex(tmp_id)[2:-1] + return(rnd_id) \ No newline at end of file Modified: trunk/lib/ror/starter.py =================================================================== --- trunk/lib/ror/starter.py 2007-07-16 13:18:30 UTC (rev 108) +++ trunk/lib/ror/starter.py 2007-07-20 00:31:37 UTC (rev 109) @@ -68,7 +68,7 @@ self.Bind(wx.EVT_BUTTON, self.OnExit, self.btnExit) self.rordir = getSettingsManager().getSetting("RigsOfRods", "BasePath") - + self.checkRoRDir(self.rordir) #print self.rordir self.displayRoRDir() @@ -118,8 +118,8 @@ f.close() def OnDepGraph(self, event=None): - from depchecker import * - RoRDepChecker(self.rordir, "all", "") + import ror.depchecker + ror.depchecker.RoRDepChecker(self.rordir, "all", "") file = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), "..\\..\\dependencies.png")) print file if os.path.isfile(file): Added: trunk/lib/ror/terrainparser.py =================================================================== --- trunk/lib/ror/terrainparser.py (rev 0) +++ trunk/lib/ror/terrainparser.py 2007-07-20 00:31:37 UTC (rev 109) @@ -0,0 +1,291 @@ +import wx, os, os.path + +from logger import log +from settingsManager import getSettingsManager + +class Object: + x = None + y = None + z = None + rotx = None + roty = None + rotz = None + name = "" + filename = "" + additionaloptions = [] + comments = [] + mayRotate = True + + error = None + + def setPosition(self, x, y, z): + self.x = x + self.y = y + self.z = z + + def setRotation(self, x, y, z): + self.rotx = x + self.roty = y + self.rotz = z + + +class RoRTerrain: + filename = "" + TerrainName = "" + TerrainConfig = "" + filename = "" + comments = {} + + trucks = [] + loads = [] + objects = [] + + UsingCaelum = False + WaterHeight = None + SkyColor = None + SkyColorLine = None + TruckStartPosition = None + CameraStartPosition = None + CharacterStartPosition = None + + def saveFile(self, filename, lines): + f = open(filename, 'w') + f.writelines(lines) + f.close() + + def loadFile(self,filename): + f=open(filename, 'r') + content = f.readlines() + f.close() + return content + + def __init__(self, filename): + self.filename = filename + content = self.loadFile(filename) + log().info("processing terrain file: %s" % filename) + self.processTerrnFile(content) + self.FixTerrainConfig(os.path.join(os.path.dirname(filename), self.TerrainConfig)) + log().info("processing of terrain finished!") + + def FixTerrainConfig(self, filename): + content = self.loadFile(filename) + for i in range(0, len(content)): + if content[i].lower().find("maxpixelerror") >= 0: + content[i] = "MaxPixelError=0\n" + log().info("fixed terrain's MaxPixelError - error") + break + self.saveFile(filename, content) + + def processTerrnFile(self, content): + linecounter = 0 + comm = [] + for i in range(0, len(content)): + # convert tabs to spaces! + content[i] = content[i].replace("\t", " ") + + if content[i].strip() == "": + comm.append(content[i]) + continue + if content[i].strip()[0:4] == "////": + # ignore editor self made comments (usefull for those error msgs) + continue + if content[i].strip()[0:2] == "//": + comm.append(content[i]) + continue + if content[i].strip()[0:1] == ";": + # bugfix wrong characters! + comm.append(content[i].replace(";","//")) + continue + if content[i].strip().lower() == "end": + continue + + # do not count empty or comment lines! + linecounter += 1 + if linecounter == 1: + #terrain name + self.TerrainName = content[i].strip() + continue + elif linecounter == 2: + # .cfg file + self.TerrainConfig = content[i].strip() + continue + if content[i].strip()[0].lower() == "w": + self.WaterHeight = float(content[i].strip()[2:]) + continue + if content[i].strip().lower() == "caelum": + self.UsingCaelum = True + continue + if linecounter < 10 and len(content[i].split(",")) == 3: + # sky color + sc = content[i].split(",") + self.SkyColor = (float(sc[0]), float(sc[1]), float(sc[2])) + self.SkyColorLine = content[i] + continue + if linecounter < 10 and len(content[i].split(",")) == 9 or len(content[i].split(",")) == 6: + # spawning Position + sp = content[i].split(",") + self.TruckStartPosition = [float(sp[0]), float(sp[1]), float(sp[2])] + + self.CameraStartPosition = [float(sp[3]), float(sp[4]), float(sp[5])] + if len(sp) == 9: + self.CharacterStartPosition = [float(sp[6]), float(sp[7]), float(sp[8])] + continue + + arr = content[i].split(",") + try: + x = float(arr[0]) + y = float(arr[1]) + z = float(arr[2]) + rx = float(arr[3]) + ry = float(arr[4]) + rz = float(arr[5]) + objname = (arr[6]).strip().split(" ") + except: + log().error("unable to parse line: %s. ignoring it!" % content[i]) + continue + + #print objname + if objname[0][0:5].lower() == "truck" and len(objname) > 1: + truck = Object() + truck.name = "truck" + truck.filename = objname[-1].strip() + truck.comments = comm + comm = [] + truck.setPosition(x, y, z) + truck.setRotation(rx, ry, -rz) + truck.additionaloptions = objname[1:] + truck.mayRotate=False + self.trucks.append(truck) + continue + if objname[0][0:4] == "load" and len(objname) > 1: + load = Object() + load.name = "load" + load.filename = objname[-1].strip() + load.comments = comm + comm = [] + load.setPosition(x, y, z) + load.setRotation(rx, ry, -rz) + load.additionaloptions = objname[1:] + load.mayRotate=False + self.loads.append(load) + continue + + # now it can just be an static object + objectname = objname[0].strip() + obj = Object() + obj.name = objectname + obj.filename = objectname + obj.comments = comm + comm = [] + obj.setPosition(x, y, z) + obj.setRotation(rx, ry, rz) + obj.additionaloptions = objname[1:] + self.objects.append(obj) + + + + def loadOdef(self, objname): + try: + f=open(self.rordir+"\\data\\objects\\%s.odef" % (objname), 'r') + content = f.readlines() + f.close() + meshname = content[0].strip() + scalearr = content[1].split(",") + self.myODefs[objname] = [] + if len(content) > 2: + for i in range(1,len(content)): + line = content[i] + if line.lower().strip() == "end": + break + self.myODefs[objname].append(line.split(",")) + return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) + else: + return (meshname, 1, 1, 1) + except Exception, err: + print "error while processing odef file of %s" % objname + print str(err) + + def getObjectLines(self, object): + lines = [] + + # add comments + if len(object.comments) > 0: + for comment in object.comments: + lines.append(comment) + + # construct objects name + objname = object.name + if len(object.additionaloptions) > 0: + tmp = (" " + " ".join(object.additionaloptions)).strip() + objname += " " + tmp + + # add line itself + linearray = [self.formatFloat(object.x), + self.formatFloat(object.y), + self.formatFloat(object.z), + self.formatFloat(object.rotx), + self.formatFloat(object.roty), + self.formatFloat(object.rotz), + objname] + line = ", ".join(linearray) + + if not object.error is None: + lines.append("//// the next object had errors, so the terraineditor commented it out:\n") + lines.append("//"+line.strip()+"\n") + else: + lines.append(line.strip()+"\n") + return lines + + def formatFloat(self, fl): + return "%12s" % ("%0.6f" % (float(fl))) + + + def save(self, filename = None): + if filename is None: + filename = self.filename + lines = [] + lines.append(self.TerrainName+"\n") + lines.append(self.TerrainConfig+"\n") + if not self.WaterHeight is None: + lines.append("w "+str(self.WaterHeight)+"\n") + if self.UsingCaelum: + lines.append("caelum\n") + lines.append(self.SkyColorLine.strip()+"\n") + + ar = [] + ar.append(str(self.TruckStartPosition[0])) + ar.append(str(self.TruckStartPosition[1])) + ar.append(str(self.TruckStartPosition[2])) + ar.append(str(self.CameraStartPosition[0])) + ar.append(str(self.CameraStartPosition[1])) + ar.append(str(self.CameraStartPosition[2])) + if not self.CharacterStartPosition is None: + ar.append(str(self.CharacterStartPosition[0])) + ar.append(str(self.CharacterStartPosition[1])) + ar.append(str(self.CharacterStartPosition[2])) + startline = ", ".join(ar)+"\n" + lines.append(startline) + + + #save trucks + for truck in self.trucks: + trucklines = self.getObjectLines(truck) + for l in trucklines: + lines.append(l) + # save loads + for load in self.loads: + loadlines = self.getObjectLines(load) + for l in loadlines: + lines.append(l) + + # save objects + for object in self.objects: + objectlines = self.getObjectLines(object) + for l in objectlines: + lines.append(l) + + lines.append("end\n") + self.saveFile(filename, lines) + return True + + \ No newline at end of file Modified: trunk/lib/rorterraineditor/HelpFrame.py =================================================================== --- trunk/lib/rorterraineditor/HelpFrame.py 2007-07-16 13:18:30 UTC (rev 108) +++ trunk/lib/rorterraineditor/HelpFrame.py 2007-07-20 00:31:37 UTC (rev 109) @@ -8,7 +8,7 @@ self.btnExit = wx.Button(self, wx.ID_ANY, "OK") self.Bind(wx.EVT_BUTTON, self.onExit , self.btnExit) self.__do_layout() - self.filename = "readme.txt" + self.filename = "terrainreadme.txt" self.LoadHelp() def LoadHelp(self): Modified: trunk/lib/rorterraineditor/MainFrame.py =================================================================== --- trunk/lib/rorterraineditor/MainFrame.py 2007-07-16 13:18:30 UTC (rev 108) +++ trunk/lib/rorterraineditor/MainFrame.py 2007-07-20 00:31:37 UTC (rev 109) @@ -137,7 +137,7 @@ self.mnuterraincollision = view_menu.AppendCheckItem(ID_TERRAINCOLLISION, "Camera collides with Terrain", "") self.mnuterraincollision.Check(True) view_menu.AppendSeparator() - self.viewObjectDetails = view_menu.AppendCheckItem(ID_VIEWOBJ, "&View Objects", "Display object details") + self.viewObjectDetails = view_menu.AppendCheckItem(ID_VIEWOBJ, "&Additional Object View Window", "creates two additional views") self.viewObjectDetails.Check(False) view_menu.AppendSeparator() view_menu.Append(ID_OGRESET, "&Ogre Settings", "Change Ogre Display Settings") @@ -186,11 +186,10 @@ default = "" if self.rordir: default = os.path.join(self.rordir, TRUCKDIR) - print default dialog = wx.FileDialog(self, "Add Truck", default, "", "Truck and Load Files (*.truck,*.load)|*.truck;*.load", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) res = dialog.ShowModal() if res == wx.ID_OK: - if not self.terrainOgreWin.addTruckToTerrain(dialog.GetPath()): + if not self.terrainOgreWin.addTruckToTerrain(truckFilename=dialog.GetPath()): dlg = wx.MessageDialog(self, "You must select a position on the ground first!", "error", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() @@ -199,12 +198,10 @@ default = "" if self.rordir: default = os.path.join(self.rordir, OBJECTDIR) - print default dialog = wx.FileDialog(self, "Add Object", default, "", "RoR Object Definitions (*.odef)|*.odef", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) res = dialog.ShowModal() if res == wx.ID_OK: - print dialog.GetPath() - if not self.terrainOgreWin.addMeshToTerrain(dialog.GetPath()): + if not self.terrainOgreWin.addObjectToTerrain(odefFilename=dialog.GetPath()): dlg = wx.MessageDialog(self, "You must select a position on the ground first!", "error", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() @@ -217,15 +214,15 @@ self.terrainOgreWin.stickCurrentObjectToGround = self.btnStickToGround.GetValue() def updateObjPosRot(self, event=None): - if self.terrainOgreWin.mSelected is None: + if self.terrainOgreWin.selectedEntry is None: self.statusbar.SetStatusText("", 1) return - n = self.terrainOgreWin.mSelected.getParentNode() - comment = self.terrainOgreWin.getCommentsForObject(n.getName()).lstrip('/') - if comment.strip() != "": - txt = "%s / %s" % (n.getName(), comment) - else: - txt = "%s" % n.getName() + entry = self.terrainOgreWin.selectedEntry + #comment = self.terrainOgreWin.getCommentsForObject(n.getName()).lstrip('/') + #if comment.strip() != "": + # txt = "%s / %s" % (n.getName(), comment) + #else: + txt = "%s %s" % (entry.data.name, " ".join(entry.data.additionaloptions)) self.statusbar.SetStatusText(txt, 1) posx, posy, posz, rotx, roty, rotz = self.terrainOgreWin.getSelectionPositionRotation() @@ -248,8 +245,8 @@ self.terrainOgreWin.TerrainName = self.terrainNamectrl.GetValue() def OnChangeWaterLevel(self, event=None): - self.terrainOgreWin.WaterHeight = self.waterlevelctrl.GetValue() - self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.WaterHeight) + self.terrainOgreWin.terrain.WaterHeight = self.waterlevelctrl.GetValue() + self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.terrain.WaterHeight) self.terrainOgreWin.updateWaterPlane() def OnChangeOgreSettings(self, event): @@ -259,7 +256,7 @@ dlg.Destroy() def OnFileSave(self, event): - if self.terrainOgreWin.SaveTerrnFile(): + if self.terrainOgreWin.SaveTerrain(): dlg = wx.MessageDialog(self, "saved","info", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() @@ -275,7 +272,7 @@ dialog = wx.FileDialog(self, "Save Terrain as", default, "", "Terrain Files (*.terrn)|*.terrn", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) res = dialog.ShowModal() if res == wx.ID_OK: - if self.terrainOgreWin.SaveTerrnFile(dialog.GetPath()): + if self.terrainOgreWin.SaveTerrain(dialog.GetPath()): dlg = wx.MessageDialog(self, "saved","info", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() @@ -310,9 +307,9 @@ self.terrainOgreWin.LoadTerrain(filename) #update some controls if finished loading - self.waterlevelctrl.SetValue(self.terrainOgreWin.WaterHeight) - self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.WaterHeight) - self.terrainNamectrl.SetValue(self.terrainOgreWin.TerrainName) + self.waterlevelctrl.SetValue(self.terrainOgreWin.terrain.WaterHeight) + self.waterLevelText.Label = "Water Level: %0.1f" % (self.terrainOgreWin.terrain.WaterHeight) + self.terrainNamectrl.SetValue(self.terrainOgreWin.terrain.TerrainName) def onViewObjectDetails(self, event=None): Modified: trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py =================================================================== --- trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-16 13:18:30 UTC (rev 108) +++ trunk/lib/rorterraineditor/RoRTerrainOgreWindow.py 2007-07-20 00:31:37 UTC (rev 109) @@ -2,44 +2,59 @@ import wx, os, os.path import ogre.renderer.OGRE as ogre from ror.truckparser import * +from ror.terrainparser import * from wxogre.OgreManager import * from wxogre.wxOgreWindow import * -from random import random +from ror.rorcommon import * ADDEDBY = "//added by the terrrain editor:\n" -SHIFT_SPEED_FACTOR = 15 +SHIFT_SPEED_FACTOR = 20 SLOW_DOWN_FACTOR = 0.75 LOW_SPEED_THRESHOLD = 1 +# this class holds all the needed 3d data and also the underlying object data +class Entry: + node = None + entity = None + data = None + + class RoRTerrainOgreWindow(wxOgreWindow): + terrain = None + clearlist = {'entity':[]} + + selectedEntry = None + selectedCoords = None + + cameralandcollisionenabled = True + + entries = {} - #myObjects = {} - myODefs = {} + # movement related + keyPress = ogre.Vector3(0,0,0) + moveVector = ogre.Vector3(0,0,0) + # selection related + selectionMaterial = None + selectionMaterialAnimState = 0 + + + SelectedArrow = None + StartDragLeftX = (0,0) + StartDragLeftY = (0,0) + TranslationRotationMode = False + TranslateNode = None + RotateNode = None + stickCurrentObjectToGround = False + def __init__(self, parent, ID, size = wx.Size(200,200), rordir = "", **kwargs): self.rordir = rordir - self.rand = str(random()) - self.TerrainLoaded = False - self.mCount = 0 - self.rand = str(random()) + self.parent = parent self.size = size self.kwargs = kwargs self.ID = ID - self.mSelected = None - self.selectedCoords = None - self.meshesorder = [] - self.additionaloptions = {} - self.trucksorder = [] - self.myODefs = {} - self.trucks = {} - self.comments = {} - self.cameralandcollisionenabled = True - self.meshes = {} - self.keyPress = ogre.Vector3(0,0,0) - self.moveVector = ogre.Vector3(0,0,0) - self.selectionMaterial = None - self.selectionMaterialAnimState = 0 + wxOgreWindow.__init__(self, self.parent, self.ID, size = self.size, **self.kwargs) def CameraLandCollision(self, value): @@ -48,9 +63,9 @@ def animateSelection(self): if not self.selectionMaterial is None: self.selectionMaterialAnimState += 0.01 - if self.selectionMaterialAnimState >= 0.4: - self.selectionMaterialAnimState = - 0.4 - val = 0.6 + abs(self.selectionMaterialAnimState) + if self.selectionMaterialAnimState >= 0.2: + self.selectionMaterialAnimState = - 0.2 + val = 0.8 + abs(self.selectionMaterialAnimState) #print val self.selectionMaterial.setDiffuse(1, 0.3, 0, val) self.selectionMaterial.setSpecular(1, 0.3, 0, val) @@ -60,7 +75,10 @@ self.cameraLandCollision() self.animateSelection() if not self.TranslateNode is None: - if self.mSelected: + if self.selectedEntry: + if not self.selectedEntry.data.mayRotate and self.TranslationRotationMode: + self.TranslationRotationMode = False + if self.TranslationRotationMode: # rotation mode self.TranslateNode.setScale(0,0,0) @@ -127,7 +145,8 @@ self.sceneManager = getOgreManager().createSceneManager(ogre.ST_EXTERIOR_CLOSE) # create a camera - self.camera = self.sceneManager.createCamera('Camera' + self.rand) + cameraUUID = randomID() + self.camera = self.sceneManager.createCamera(str(cameraUUID)+"camera") self.camera.lookAt(ogre.Vector3(0, 0, 0)) self.camera.setPosition(ogre.Vector3(0, 0, 100)) self.camera.nearClipDistance = 0.1 @@ -149,199 +168,34 @@ #create objects self.populateScene() - def loadOdef(self, objname): - try: - f=open(self.rordir+"\\data\\objects\\%s.odef" % (objname), 'r') - content = f.readlines() - f.close() - meshname = content[0].strip() - scalearr = content[1].split(",") - self.myODefs[objname] = [] - if len(content) > 2: - for i in range(1,len(content)): - line = content[i] - if line.lower().strip() == "end": - break - self.myODefs[objname].append(line.split(",")) - return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) - else: - return (meshname, 1, 1, 1) - except Exception, err: - print "error while processing odef file of %s" % objname - print str(err) - + def updateWaterPlane(self): - self.planenode.setPosition(1500, self.WaterHeight + 200, 1500) + self.waternode.setPosition(1500, self.terrain.WaterHeight + 200, 1500) def createWaterPlane(self): - if self.WaterHeight is None: + if self.terrain.WaterHeight is None: return plane = ogre.Plane() plane.normal = ogre.Vector3(0, 1, 0) plane.d = 200 # see http://www.ogre3d.org/docs/api/html/classOgre_1_1MeshManager.html#Ogre_1_1MeshManagera5 - mesh = ogre.MeshManager.getSingleton().createPlane('WaterPlane' + self.rand, "General", plane, 3000, 3000, + waterid = str(randomID()) + mesh = ogre.MeshManager.getSingleton().createPlane(waterid+'WaterPlane', "General", plane, 3000, 3000, 20, 20, True, 1, 50.0, 50.0, ogre.Vector3(0, 0, 1), ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, ogre.HardwareBuffer.HBU_STATIC_WRITE_ONLY, True, True) - entity = self.sceneManager.createEntity('waterent', 'WaterPlane' + self.rand) - entity.setMaterialName('mysimple/water') - self.planenode = self.sceneManager.getRootSceneNode().createChildSceneNode() - self.planenode.attachObject(entity) + self.waterentity = self.sceneManager.createEntity(waterid+"entity", waterid+'WaterPlane') + self.waterentity.setMaterialName('mysimple/water') + + self.waternode = self.sceneManager.getRootSceneNode().createChildSceneNode() + self.waternode.attachObject(self.waterentity) self.updateWaterPlane() - - def processTerrnFile(self, content): - #self.parent.cbObjects.Clear() - linecounter = 0 - self.UsingCaelum = False - self.WaterHeight = None - comm = [] - for i in range(0, len(content)): - if content[i].strip() == "": - comm.append(content[i]) - continue - if content[i].strip()[0:2] == "//": - comm.append(content[i]) - continue - if content[i].strip()[0:1] == ";": - comm.append(content[i].replace(";","//")) - continue - if content[i].strip().lower() == "end": - continue - linecounter += 1 - if linecounter == 1: - #terrain name - self.TerrainName = content[i].strip() - continue - elif linecounter == 2: - # .cfg file - self.TerrainConfig = content[i].strip() - continue - if content[i].strip()[0].lower() == "w": - self.WaterHeight = float(content[i].strip()[2:]) - continue - if content[i].strip().lower() == "caelum": - self.UsingCaelum = True - continue - if linecounter < 10 and len(content[i].split(",")) == 3: - # sky color - sc = content[i].split(",") - self.SkyColor = (float(sc[0]), float(sc[1]), float(sc[2])) - self.SkyColorLine = content[i] - continue - if linecounter < 10 and len(content[i].split(",")) == 9 or len(content[i].split(",")) == 6: - # spawning Position - sp = content[i].split(",") - self.TruckStartPosition = ogre.Vector3(float(sp[0]), float(sp[1]), float(sp[2])) - - #insert truckshop - # n = self.sceneManager.getRootSceneNode().createChildSceneNode("objectts") - # e = self.sceneManager.createEntity("objentts", "truckshop.mesh") - # n.attachObject(e) - # n.setPosition(self.TruckStartPosition) - # n.rotate(ogre.Vector3.UNIT_X, ogre.Degree(-90).valueRadians()) - # self.myObjects["objectts"] = n - - self.CameraStartPosition = ogre.Vector3(float(sp[3]), float(sp[4]), float(sp[5])) - if len(sp) == 9: - self.CharacterStartPosition = ogre.Vector3(float(sp[6]), float(sp[7]), float(sp[8])) - else: - self.CharacterStartPosition = None - continue - arr = content[i].split(",") - #try: - x = float(arr[0]) - y = float(arr[1]) - z = float(arr[2]) - rx = float(arr[3]) - ry = float(arr[4]) - rz = float(arr[5]) - objname = (arr[6]).strip().split("\t") - if len(objname) == 1: - objname = (arr[6]).strip().split(" ") - #print objname - if objname[0][0:5] == "truck" and len(objname) > 1: - print "loading truck..." - fn = self.rordir + "\\data\\trucks\\"+objname[-1].strip() - n, entname = self.createTruckMesh(fn) - if not n is None: - self.comments[entname] = comm - comm = [] - n.rotate(ogre.Vector3.UNIT_X, ogre.Degree(rx).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) - n.rotate(ogre.Vector3.UNIT_Y, ogre.Degree(ry).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) - n.rotate(ogre.Vector3.UNIT_Z, ogre.Degree(-rz).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) - n.setPosition(x, y, z) - continue - if objname[0][0:4] == "load" and len(objname) > 1: - print "loading load...." - fn = self.rordir + "\\data\\trucks\\"+objname[-1].strip() - n, entname = self.createTruckMesh(fn) - if not n is None: - self.comments[entname] = comm - comm = [] - n.rotate(ogre.Vector3.UNIT_X, ogre.Degree(rx).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) - n.rotate(ogre.Vector3.UNIT_Y, ogre.Degree(ry).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) - n.rotate(ogre.Vector3.UNIT_Z, ogre.Degree(-rz).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) - n.setPosition(x, y, z) - continue - firstobjname = objname[0] - - try: - (meshname, sx, sy, sz) = self.loadOdef(firstobjname) - except Exception, inst: - print inst - print "########## error loading odef of %s" % firstobjname - sx = None - - n = self.sceneManager.getRootSceneNode().createChildSceneNode("object" + str(i)+ firstobjname) - entname = "objent" + str(i)+"_"+firstobjname - e = self.sceneManager.createEntity(entname, meshname) - n.attachObject(e) - - #print "position: ", x,", ", y,", ", z - #print "rotation: ", rx,", ", ry,", ", rz - #print "scale: ", sx,", ", sy,", ", sz - n.setPosition(x, y, z) - n.rotate(ogre.Vector3.UNIT_X, ogre.Degree(-90),relativeTo=ogre.Node.TransformSpace.TS_WORLD) - n.rotate(ogre.Vector3.UNIT_Z, ogre.Degree(rz),relativeTo=ogre.Node.TransformSpace.TS_PARENT) - n.rotate(ogre.Vector3.UNIT_Y, ogre.Degree(ry),relativeTo=ogre.Node.TransformSpace.TS_PARENT) - n.rotate(ogre.Vector3.UNIT_X, ogre.Degree(rx),relativeTo=ogre.Node.TransformSpace.TS_PARENT) - if not sx is None: - n.setScale(sx, sy, sz) - self.comments[entname] = comm - comm = [] - self.meshesorder.append(entname) - if len(objname) > 1: - self.additionaloptions[entname] = objname[1:] - self.meshes[entname] = n - - #except Exception, inst: - # print inst - # print "error parsing line %s" % content[i] - self.createWaterPlane() - self.createArrows() - if not self.CharacterStartPosition is None: - self.camera.setPosition(self.CharacterStartPosition) - else: - self.camera.setPosition(self.CameraStartPosition) - - def formatFloat(self, fl): - return "%12s" % ("%0.6f" % (float(fl))) - - - def getCommentsForObject(self, entname): - if entname in self.comments.keys(): - #print self.comments[entname] - return self.comments[entname]; - else: - return "" - def getSelectionPositionRotation(self): - if not self.mSelected is None: - return self.getPositionRotation(self.mSelected.getParentNode()) + if not self.selectedEntry is None: + return self.getPositionRotation(self.selectedEntry.node) def getPositionRotation(self, obj): scale = obj.getScale() @@ -358,92 +212,6 @@ rotz = -ogre.Radian(rot.getYaw(False)).valueDegrees() return pos.x, pos.y, pos.z, rotx, roty, rotz - def SaveTerrnFile(self, fn = None): - if fn is None: - fn = self.terrnfile - # quick and dirty ;) - #try: - lines = [] - lines.append(self.TerrainName+"\n") - lines.append(self.TerrainConfig+"\n") - if not self.WaterHeight is None: - lines.append("w "+str(self.WaterHeight)+"\n") - if self.UsingCaelum: - lines.append("caelum\n") - lines.append(self.SkyColorLine.strip()+"\n") - - ar = [] - ar.append(str(self.TruckStartPosition.x)) - ar.append(str(self.TruckStartPosition.y)) - ar.append(str(self.TruckStartPosition.z)) - ar.append(str(self.CameraStartPosition.x)) - ar.append(str(self.CameraStartPosition.y)) - ar.append(str(self.CameraStartPosition.z)) - if not self.CharacterStartPosition is None: - ar.append(str(self.CharacterStartPosition.x)) - ar.append(str(self.CharacterStartPosition.y)) - ar.append(str(self.CharacterStartPosition.z)) - startline = ", ".join(ar)+"\n" - lines.append(startline) - - - #save trucks and loads: - - for k in self.trucksorder: - - if k in self.comments.keys(): - for c in self.comments[k]: - lines.append(c) - - posx, posy, posz, rotx, roty, rotz = self.getPositionRotation(self.trucks[k]) - - rotx -= 90 - - truckstring = k.split(".")[-1] + "\t " + k - ar = [self.formatFloat(posx), - self.formatFloat(posy), - self.formatFloat(posz), - self.formatFloat(rotx), - self.formatFloat(roty), - self.formatFloat(rotz), - truckstring] - line = ", ".join(ar) - lines.append(line.strip()+"\n") - - # save meshs - for k in self.meshesorder: - - if k in self.comments.keys(): - for c in self.comments[k]: - lines.append(c) - - posx, posy, posz, rotx, roty, rotz = self.getPositionRotation(self.meshes[k]) - meshstring = k.split("_")[-1] - ar = [self.formatFloat(posx), - self.formatFloat(posy), - self.formatFloat(posz), - self.formatFloat(rotx), - self.formatFloat(roty), - self.formatFloat(rotz), - meshstring] - line = ", ".join(ar) - - if k in self.additionaloptions.keys(): - for ao in self.additionaloptions[k]: - line += " " + ao.strip() - - lines.append(line.strip()+"\n") - - lines.append("end\n") - - f=open(fn, 'w') - f.writelines(lines) - f.close() - return True - #except: - # return False - - def reattachArrows(self, entity): self.TranslateNode.setPosition(entity.getParentNode().getPosition()) self.TranslateNode.setOrientation(entity.getParentNode().getOrientation()) @@ -502,48 +270,282 @@ self.TerrainSelectNode = nt self.TranslateNode = n self.RotateNode = nr - n.setPosition(self.CameraStartPosition) - nr.setPosition(self.CameraStartPosition) + n.setPosition(0,0,0) + nr.setPosition(0,0,0) def deselectSelection(self): - if self.mSelected: - #self.mSelected.getSubEntity(0).setMaterialName(self.oldmaterial) - self.mSelected.setMaterialName(self.oldmaterial) - self.mSelected.getParentSceneNode().showBoundingBox(False) + if self.selectedEntry: + #self.selectedEntry.entity.getSubEntity(0).setMaterialName(self.oldmaterial) + self.selectedEntry.entity.setMaterialName(self.oldmaterial) + self.selectedEntry.entity.getParentSceneNode().showBoundingBox(False) def changeSelection(self, newnode): self.deselectSelection() - self.mSelected = newnode - self.oldmaterial = self.mSelected.getSubEntity(0).getMaterialName() + key = newnode.getName()[:-len("entity")] + self.selectedEntry = self.entries[key] + self.oldmaterial = self.selectedEntry.entity.getSubEntity(0).getMaterialName() + newmatname = "mysimple/selectedobject" selectedmat = ogre.MaterialManager.getSingleton().getByName(newmatname) - mat = ogre.MaterialManager.getSingleton().getByName(self.mSelected.getSubEntity(0).getMaterialName()) + mat = ogre.MaterialManager.getSingleton().getByName(self.selectedEntry.entity.getSubEntity(0).getMaterialName()) if not mat is None: mat.copyDetailsTo(selectedmat) newmat = ogre.MaterialManager.getSingleton().getByName(newmatname) newmat.setSceneBlending(ogre.SceneBlendFactor.SBF_SOURCE_ALPHA, ogre.SceneBlendFactor.SBF_DEST_ALPHA ) newmat.setSelfIllumination(1, 0.3, 0) - newmat.setDiffuse(1, 0.3, 0, 0.5) + newmat.setDiffuse(1, 0.3, 0, 0.9) newmat.setAmbient(1, 0.3, 0) - newmat.setSpecular(1, 0.3, 0, 0.5) + newmat.setSpecular(1, 0.3, 0, 0.9) self.selectionMaterial = newmat - #self.mSelected.getSubEntity(0).setMaterialName(snewmatname) - self.mSelected.setMaterialName(newmatname) - self.mSelected.getParentSceneNode().showBoundingBox(True) - self.reattachArrows(self.mSelected) - self.arrowScale = self.mSelected.getBoundingRadius() / 100 + #self.selectedEntry.entity.getSubEntity(0).setMaterialName(snewmatname) + self.selectedEntry.entity.setMaterialName(newmatname) + self.selectedEntry.entity.getParentSceneNode().showBoundingBox(True) + self.reattachArrows(self.selectedEntry.entity) + self.arrowScale = self.selectedEntry.entity.getBoundingRadius() / 100 + def free(self): + self.sceneManager.clearScene() + + def updateDataStructures(self): + for uuid in self.entries.keys(): + entry = self.entries[uuid] + x, y, z, rotx, roty, rotz = self.getPositionRotation(entry.node) + if entry.data.name.lower() in ['truck', 'load']: + rotx -= 90 + entry.data.setPosition(x, y, z) + entry.data.setRotation(rotx, roty, rotz) + + def SaveTerrain(self, fn = None): + self.updateDataStructures() + if not self.terrain is None: + return self.terrain.save(fn) + + def LoadTerrain(self, filename): + + if not self.terrain is None: + self.free() + self.terrain = RoRTerrain(filename) - def LoadTerrnFile(self, filename): - self.terrnfile = filename - f=open(filename, 'r') + cfgfile = os.path.join(os.path.dirname(filename), self.terrain.TerrainConfig) + self.sceneManager.setWorldGeometry(cfgfile) + + self.createWaterPlane() + self.createArrows() + if not self.terrain.CharacterStartPosition is None: + self.camera.setPosition(self.terrain.CharacterStartPosition) + else: + self.camera.setPosition(self.terrain.CameraStartPosition) + + for truck in self.terrain.trucks: + self.addTruckToTerrain(data=truck) + + for load in self.terrain.loads: + self.addTruckToTerrain(data=load) + + for object in self.terrain.objects: + self.addObjectToTerrain(data=object) + + + + def loadOdef(self, odefFilename): + f=open(odefFilename, 'r') content = f.readlines() f.close() - self.processTerrnFile(content) + meshname = content[0].strip() + scalearr = [1,1,1] + if len(content) > 2: + scalearr = content[1].split(",") + + return (meshname, float(scalearr[0]), float(scalearr[1]), float(scalearr[2])) + + + + def addObjectToTerrain(self, data=None, odefFilename=None, coords=None): + if coords is None: + coords = self.selectedCoords + if coords is None and data is None: + return False + + uuid = randomID() + + if data is None: + data = Object() + data.name = os.path.basename(odefFilename).split(".")[0] + data.filename = os.path.basename(odefFilename).split(".")[0] + data.comments = ['// added by terrain editor\n'] + data.setPosition(coords.x, coords.y, coords.z) + data.setRotation(0, 0, 0) + data.additionaloptions =[] + self.terrain.objects.append(data) + else: + odefFilename = data.filename + + if os.path.basename(odefFilename) == odefFilename: + if odefFilename[-5:] != ".odef": + odefFilename += ".odef" + odefFilename = self.rordir + "\\data\\objects\\"+odefFilename + meshname = None + try: + (meshname, sx, sy, sz) = self.loadOdef(odefFilename) + except Exception, err: + data.error=True + log().error("error while processing odef file %s" % odefFilename) + log().error(str(err)) + return + + entry = Entry() + entry.node = self.sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") + entry.entity = self.sceneManager.createEntity(str(uuid)+"entity", meshname) + entry.data = data + + entry.node.attachObject(entry.entity) + entry.node.rotate(ogre.Vector3.UNIT_X, ogre.Degree(-90),relativeTo=ogre.Node.TransformSpace.TS_WORLD) + entry.node.rotate(ogre.Vector3.UNIT_Z, ogre.Degree(data.rotz).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) + entry.node.rotate(ogre.Vector3.UNIT_Y, ogre.Degree(data.roty).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) + entry.node.rotate(ogre.Vector3.UNIT_X, ogre.Degree(data.rotx).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) + entry.node.setPosition(data.x, data.y, data.z) + if not sx is None: + entry.node.setScale(sx, sy, sz) + + self.entries[uuid] = entry + return True + + def addTruckToTerrain(self, data=None, truckFilename=None, coords=None): + if coords is None: + coords = self.selectedCoords + if coords is None and data is None: + return False + + uuid = randomID() + + if data is None: + data = Object() + data.name = truckFilename.split(".")[-1] # truck or load + data.filename = os.path.basename(truckFilename) + data.comments = ['// added by terrain editor\n'] + data.setPosition(coords.x, coords.y, coords.z) + data.setRotation(0, 0, 0) + data.additionaloptions =[data.filename] + if truckFilename.split(".")[-1].lower() == "truck": + self.terrain.trucks.append(data) + elif truckFilename.split(".")[-1].lower() == "load": + self.terrain.loads.append(data) + else: + truckFilename = data.filename + + if os.path.basename(truckFilename) == truckFilename: + truckFilename = self.rordir + "\\data\\trucks\\"+truckFilename + + entry = Entry() + entry.node, entry.entity, entry.manualobject = self.createTruckMesh(truckFilename, uuid) + entry.data = data + + entry.node.rotate(ogre.Vector3.UNIT_Z, ogre.Degree(data.rotz).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) + entry.node.rotate(ogre.Vector3.UNIT_Y, ogre.Degree(data.roty).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) + entry.node.rotate(ogre.Vector3.UNIT_X, ogre.Degree(data.rotx).valueRadians(), relativeTo=ogre.Node.TransformSpace.TS_WORLD) + entry.node.setPosition(data.x, data.y, data.z) + self.entries[uuid] = entry + return True + + def createTruckMesh(self, fn, uuid): + if not os.path.isfile(fn): + #print "truck file not found: " + fn + return + p = rorparser() + p.parse(fn) + if not 'nodes' in p.tree.keys() or not 'beams' in p.tree.keys() : + return False + + try: + myManualObject = self.sceneManager.createManualObject(str(uuid)+"manual") + + #myManualObjectMaterial = ogre.MaterialManager.getSingleton().create("manualmaterial"+truckname+str(self.randomcounter),"debugger"); + #myManualObjectMaterial.setReceiveShadows(False) + #myManualObjectMaterial.getTechnique(0).setLightingEnabled(True) + #myManualObjectMaterial.getTechnique(0).getPass(0).setDiffuse(0,0,1,0) + #myManualObjectMaterial.getTechnique(0).getPass(0).setAmbient(0,0,1) + #myManualObjectMaterial.getTechnique(0).getPass(0).setSelfIllumination(0,0,1) + #myManualObjectMaterial.getTechnique(0).getPass(0).setCullingMode(ogre.CULL_ANTICLOCKWISE) + + matname = "" + if fn[-4:].lower() == "load": + matname = 'mysimple/loadcolor' + elif fn[-5:].lower() == "truck": + matname = 'mysimple/truckcolor' + + myManualObject.useIndexes = True + myManualObject.estimateVertexCount(2000) + myManualObject.estimateIndexCount(2000) + + myManualObject.begin(matname+"grid", ogre.RenderOperation.OT_LINE_LIST) + for nodeobj in p.tree['nodes']: + if nodeobj.has_key('type'): + continue + node = nodeobj['data'] + myManualObject.position(float(node[1]),float(node[2]),float(node[3])) + for beamobj in p.tree['beams']: + if beamobj.has_key('type'): + continue + beam = beamobj['data'] + myManualObject.index(int(beam[0])) + myManualObject.index(int(beam[1])) + myManualObject.end() + myManualObject.begin(matname, ogre.RenderOperation.OT_TRIANGLE_LIST) + for nodeobj in p.tree['nodes']: + if nodeobj.has_key('type'): + continue + node = nodeobj['data'] + myManualObject.position(float(node[1]),float(node[2]),float(node[3])) + + #print len(p.tree['submeshgroups']) + if len(p.tree['submeshgroups']) > 0: + faces = [] + for smobj in p.tree['submeshgroups']: + for cabobj in smobj['cab']: + if cabobj.has_key('type'): + continue + cab = cabobj['data'] + #print "########face" + if cab != []: + try: + myManualObject.triangle(int(cab[0]),int(cab[1]),int(cab[2])) + except: + print "error with cab: " + str(cab) + pass + else: + print "truck has no faces!" + + myManualObject.end() + mesh = myManualObject.convertToMesh(str(uuid)+"manual") + entity = self.sceneManager.createEntity(str(uuid)+"entity", str(uuid)+"manual") + #trucknode = self.sceneManager.getRootSceneNode().createChildSceneNode() + myManualObjectNode = self.sceneManager.getRootSceneNode().createChildSceneNode(str(uuid)+"node") + myManualObjectNode.attachObject(entity) + + myManualObjectNode.attachObject(myManualObject) + + return myManualObjectNode, entity, mesh + except Exception, err: + log().error("error while processing truck file %s" % fn) + log().error(str(err)) + return None, None, None + + def getPointedPosition(self, event): + x, y = event.GetPosition() + width, height, a, b, c = self.renderWindow.getMetrics() + mouseRay = self.camera.getCameraToViewportRay((x / float(width)), (y / float(height))); + myRaySceneQuery = self.sceneManager.createRayQuery(ogre.Ray()); + myRaySceneQuery.setRay(mouseRay) + result = myRaySceneQuery.execute() + if len(result) > 0 and not result[0] is None and not result[0].worldFragment is None: + return result[0].worldFragment.singleIntersection + return None + + def populateScene(self): self.sceneManager.AmbientLight = ogre.ColourValue(0.7, 0.7, 0.7 ) @@ -553,73 +555,16 @@ l = self.sceneManager.createLight("MainLight") l.setPosition(20,80,50) - - - #create the camera Axes object - self.camAxesNode = None - self.camAxesEnt = None #create ray template self.selectionRaySceneQuery = self.sceneManager.createRayQuery(ogre.Ray()); self.terrainRaySceneQuery = self.sceneManager.createRayQuery(ogre.Ray()); + # setup the sky plane plane = ogre.Plane() - # 5000 world units from the camera plane.d = 5000 - # Above the camera, facing down plane.normal = -ogre.Vector3.UNIT_Y - self.SelectedArrow = None - self.StartDragLeftX, self.StartDragLeftY = (0,0) - self.TranslationRotationMode = False - self.TranslateNode = None - self.RotateNode = None - self.stickCurrentObjectToGround = False - self.randomcounter = 0 - - def FixTerrainConfig(self,filename): - print "fixing file %s ..." % filename - f=open(filename, 'r') - content = f.readlines() - f.close() - for i in range(0, len(content)): - if content[i].lower().find("maxpixelerror") >= 0: - content[i] = "MaxPixelError=0\n" - print "FIXED!" - break - f=open(filename, 'w') - f.writelines(content) - f.close() - - - def free(self): - self.sceneManager.clearScene() - # self.sceneManager.destroyAllEntities() - # self.sceneManager.destroyAllManualObjects() - # self.sceneManager.destroyAllAnimations() - # self.sceneManager.destroyAllLights() - - # if self.selectionRaySceneQuery: - # self.sceneManager.destroyQuery(self.selectionRaySceneQuery) - # self.sceneManager.destroyQuery(self.terrainRaySceneQuery) - # if self.renderWindow: - # self.renderWindow.removeAllViewports() - #ogre.ResourceGroupManager.getSingleton().destroyResourceGroup("General") - #ogre.ResourceGroupManager.getSingleton().destroyResourceGroup("Bootstrap") - - #self.SceneInitialisation() - - def LoadTerrain(self, filename): - # create scene - self.free() - dirname = os.path.dirname(filename) - self.LoadTerrnFile(filename) - cfgname = os.path.join(dirname, self.TerrainConfig) - self.FixTerrainConfig(cfgname) - self.sceneManager.setWorldGeometry(cfgname) - self.TerrainLoaded = True - - def toggleTranslationRotationMode(self): self.TranslationRotationMode = not self.TranslationRotationMode @@ -634,13 +579,12 @@ return nPos def ObjectResetRotation(self): - if self.mSelected: - self.mSelected.getParentNode().resetOrientation() - self.mSelected.getParentNode().rotate(ogre.Vector3.UNIT_X, ogre.Degree(-90),relativeTo=ogre.Node.TransformSpace.TS_WORLD) + if self.selectedEntry: + self.selectedEntry.node.resetOrientation() + self.selectedEntry.node.rotate(ogre.Vector3.UNIT_X, ogre.Degree(-90),relativeTo=ogre.Node.TransformSpace.TS_WORLD) self.RotateNode.resetOrientation() self.RotateNode.rotate(ogre.Vector3.UNIT_X, ogre.Degree(-90),relativeTo=ogre.Node.TransformSpace.TS_WORLD) - def selectarrow(self, arrow): if self.SelectedArrow.getSubEntity(0).getMaterialName()[-3:] != "sel": self.SelectedArrow.setMaterialName(self.SelectedArrow.getSubEntity(0).getMaterialName()+"sel") @@ -651,7 +595,7 @@ def selectTerrain(self, event): self.deselectSelection() - self.mSelected = None + self.selectedEntry = None self.selectedCoords = self.getPointedPosition(event) self.selectedCoords += ogre.Vector3(0,1,0) self.TerrainSelectNode.setPosition(self.selectedCoords) @@ -674,12 +618,16 @@ self.selectarrow(self.SelectedArrow) return selectedSomething = False + ignorearray = [] + ignorearray.append("circlepointer") + if not self.terrain.WaterHeight is None: + ignorearray.append(self.waterentity.getName()) for r in result: if not r is None and not r.movable is None and r.movable.getMovableType() == "Entity": - if r.movable.getName() in ["waterent", "circlepointer"]: + if r.movable.getName() in ignorearray: # you cannot select these objects continue - if not self.mSelected is None and self.mSelected.getName() == r.movable.getName(): + if not self.selectedEntry is None and self.selectedEntry.entity.getName() == r.movable.getName(): continue #print r.movable.getMovableType(), r.movable.getName() if not self.SelectedArrow is None: @@ -722,190 +670,37 @@ if self.stickCurrentObjectToGround: self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) - if self.mSelected: - self.mSelected.getParentNode().setPosition(self.TranslateNode.getPosition()) + if self.selectedEntry: + self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'movearrowsY': self.TranslateNode.translate(0,0,forcex,relativeTo=ogre.Node.TransformSpace.TS_LOCAL) if self.stickCurrentObjectToGround: self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) - if self.mSelected: - self.mSelected.getParentNode().setPosition(self.TranslateNode.getPosition()) + if self.selectedEntry: + self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'movearrowsZ': self.TranslateNode.translate(0,forcex,0,relativeTo=ogre.Node.TransformSpace.TS_LOCAL) if self.stickCurrentObjectToGround: self.TranslateNode.setPosition(self.StickVectorToGround(self.TranslateNode.getPosition())) self.RotateNode.setPosition(self.TranslateNode.getPosition()) - if self.mSelected: - self.mSelected.getParentNode().setPosition(self.TranslateNode.getPosition()) + if self.selectedEntry: + self.selectedEntry.node.setPosition(self.TranslateNode.getPosition()) elif self.SelectedArrow.getName() == 'rotatearrowsX': self.RotateNode.yaw(forceDegree) - if self.mSelected: - self.mSelected.getParentNode().yaw(forceDegre... [truncated message content] |