Svenska 3D-Tåg - Forum  
 

Om det här är ditt första besök, se till att gå till vår FAQ (finns även länk till FAQ i navigeringsmenyn ovan). Du kan behöva att registrera dig innan du kan posta (finns även en länk till registrering i navigeringsmenyn ovan). För att titta på inlägg, välj det forum som du vill besöka från de som är listade nedan.

Gå tillbaka   Svenska 3D-Tåg - Forum > N3V Trainz > 3D-design - Trainz

Svara
 
Ämnesverktyg Visningsalternativ
Gammal 2015-01-22, 18:46   #1
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard Lite hjälp av Python

När man bygger så mycket personvagnar som jag har gjort under åren så börjar man faktiskt att tröttna lite på vissa delar av workflowet som är tråkigt, tidskrävande och enformigt, men som måste göras för varje vagn.

Ett sådan är alla dessa attachmentpoints för passagerare. Att skapa dem, ingen problem. Att sätta ut dem, går lätt och enkelt. Men sedan så skall man döpa alla till a.sit0, a.sit1, a.sit2, a.sit3, a.sit4, a.si.... Evighetsgöra!

Sedan skall de ju in i configfilen med.
0 "a.sit0"
1 "a.sit1"
2 "a.sit2"
...
Men där är det ju enklare för det är bara att kopiera från en annan vagn och lägga till och ta bort några rader på slutet, eller? Nej. För och man listar dessa i ordning så kommer Trainz att fylla på med passagerare från ena änden till den andra, säte för säte. Jag vill att de mer realistiskt ska sätta sig i blandad ordning, så att vagnen fylls på med passagerare på ett slumpvist sätt. Då blir det väldigt jobbigt att hålla koll på att man fått med alla attachments, att man inte har dubbelnamngivit och så vidare.

Som tur är så detta som gjort för att lösas av dator! Configen kan man lätt generera med ett litet program. Men namngivningen i 3D-programmet är klurigare. Men lyckloghtvis är så har Blender (som jag 3D-modellerar i) ett programmerings API som gör att man i princip skulle kunna köra Blender genom att bara skriva programkod, rad efter rad för alla grejer du vill göra. Dock väldigt mycket jobb om man bara vill flytta något 10 dm åt höger, men för detta ändamål är det ett fenomenalt vektyg!
Programmeringsspråket som låter dig göra det heter Python och är ett helt vanligt programmeringsspråk som är ett av de mest använda idag. Såhär gör man:

Dela av 3D-fönstret så att du får ett nytt fönster och byt fönstertyp till Python Console. Kopiera följande kodsnutt och klistra in i konsolen:

Kod:
def rename_seats():
  obj_list = [obj for obj in C.selected_objects if obj.type == 'EMPTY']
  for (counter, epy) in enumerate(obj_list):
    epy.name = "a.sit" + str(counter)
Sedan trycker du enter två gånger så att början på randen där markören är får en ny prompt (början på raden skall se ut som >>>) När du gjort det så definieras en funktion i Blender med namnet rename_seats, men den kommer inte att köras.
Innan du kör den ska du först markera alla emptys/attachments i 3D-viewporten och sedan skriva följande i Python konsolen för att anropa funktionen:
Kod:
rename_seats()
och tryck enter. Tada! Alla markerade emptys kommer då att namnges a.sit0, a.sit1, a.sit2, osv. Ordningen är en aning slumpartad, men det gör ju inte så mycket.



Detta kan man ju bara göra om man faktiskt använder just Blender som 3D-program, men att generera configen kan alla göra. Jag har skrivit ett sådant program med, även det i Python, så det går att köra i Blenders Python konsol om man inte har någon Python-tolk på sin dator. Men om man varken har Blender eller orkar ladda ned Python så finns det hemsidor som låter en köra Pythonprogram rak i webbläsaren.

Till exempel kan man använda denna: http://repl.it/languages/Python

Kopiera denna textsnutt och klistra in i det vita fältet på vänsta sidan på hemsidan, precis bredvid 1:an:
Kod:
from random import shuffle

def randomize_seats(seats):
    l = range(seats)
    shuffle(l)
    for (index, seatnr) in enumerate(l):
        print('      ' + str(index) + '                                 "a.sit' + str(seatnr) + '"')
  
randomize_seats(50)
Tryck sedan på play-knappen i mitten för att köra och vänta ett par sekunder. Sedan är det bara att kopiera resultatet som dyker upp på höger sida och klistra in i configen! Vill man slumpa igen är det bara trycka på play igen. Genom att ändra 50 på sista raden kan man välja hur många säten man vill slumpa för.

Och så kan man spara många minuter med tråkigt arbete!
__________________
-k-
korvtiger besöker inte forumet just nu  
Svara med citat
Gammal 2015-01-23, 00:09   #2
Nils Blid
Medlem
 
Reg.datum: Dec 2009
Ort: Malmö
Inlägg: 2 055
Standard

Låter lite otroligt - kanske t o m jag skulle kunna göra det. Bra förklarat Korvtiger.

Nisse
Nils Blid besöker inte forumet just nu   Svara med citat
Gammal 2015-01-23, 20:22   #3
spyfrog
Medlem
 
Reg.datum: Feb 2008
Ort: Gävle
Inlägg: 1 535
Standard

denna post förtjänar ett litet häftstift tycker jag.
verkligen praktiskt.
spyfrog besöker inte forumet just nu   Svara med citat
Gammal 2015-11-11, 00:14   #4
korvtiger
Medlem
 
Reg.datum: Jan 2008
Ort: Uppland, Sverige
Inlägg: 2 716
Standard Att uppdatera assets för TANE

Detta är väl framförallt riktat till Lan, men det kan ju vara fler som är intresserade.

Jag pratade i en annan tråd om hur man kan förenkla det tråkiga arbetet att uppdatera assets till att fungera med TANE, ett första steg skulle vara att automatiskt öka kuid-nummer, eller byta trainz-build-nummer. Detta kan man naturligtvis göra med Python, så det tänkte jag dela med mig av!

Detta script körs på en bunt med assetmappar och gör följande med deras configar:
  • Uppdaterar Kuid-nummer
    • <kuid:xxxx:yyyy> blir <kuid2:xxxx:yyyy:2>
    • <kuid2:xxxx:yyyy:z> blir <kuid2:xxxx:yyyy:z+1> (ett snäpp högre versionsnummer)
  • Uppdaterar trainz-build-numret till 3.9

Först och främst så måste man ladda ned Python, för man måste ha en interpretator(ett program som kör Python-kod) lokalt på datorn om man vill köra detta script, inte som förra exemplet där vi använde Blenders inbyggda Python interpretator eller en webbaserad.
Denna laddas ned härifrån:
https://www.python.org/downloads/release/python-350/
Välj Windows x86-64 executable installer för er som har 64bitars Windows (eller den utan som heter Windows x86 executable installer om ni har 32-bitar, vilket är mindre troligt)
Sedan är det bara att installera som ett vanligt program.

Skapa en uppdateringsmapp någonstans på datorn där alla assets skall ligga medans de uppdateras, döp den till valfritt namn.

Nästa steg är att öppna de assets från TS2009/10/12 som ni vill uppdatera. Markera ett par stycken assets i CM som ni vill uppdatera (börja med ett fåtal för att kunna se att det fungerar) och kopiera assetsmapparna ifrån UserData/editing till den tomma uppdateringsmappen som du skapade nyss. Reverta de öppnade assetsen i CM.

I uppdateringsmappen som assetmapparna ligger i nu, skapa en ny fil, kalla den tane_update.py, högerklicka på den och välj Edit with IDLE>Edit with IDLE 3.5 (64-bit) för att använda Pythons egna texteditor.
Kopiera in följande kod:
Kod:
import os
import traceback

REPLACE_BUILD_NO = "3.9"

"""
Updates an kuid line to next version. A kuid will be turned int a kuid2 and
a kuid2 will be bumped one version
"""
def update_kuid_line(line):
    before, kuid = line.split('<')
    kuid, after = kuid.split('>')
    
    if(kuid.startswith("kuid2")):
        s = kuid.split(':')
        kuid = s[0] + ':' + s[1] + ':' + s[2] + ':' + str(int(s[3])+1)
    else:
        s = kuid.split(':')
        kuid = "kuid2:" + s[1] + ':' + s[2] + ":2"
        
    return before + '<' + kuid + '>' + after


"""
Updates an kuid line to next version. A kuid will be turned int a kuid2 and
a kuid2 will be bumped one version
"""
def update_trainz_build_line(line):
    #splits like: ("trainz-build    2", "9   \n")
    parts = line.split('.')
    return parts[0][:-1] + REPLACE_BUILD_NO + parts[1][1:]
    
    

"""
Iterates the file line by line to update it.
"""
def update_config_lines(config_lines):
    for i in range(len(config_lines)):
        line = config_lines[i]
        if line.startswith(("kuid ", "kuid\t")):
            config_lines[i] = update_kuid_line(line)
        elif line.startswith("trainz-build"):
            config_lines[i] = update_trainz_build_line(line)


"""
Updates the config.txt that is located in the directory asset_dir
"""
def update_config(asset_dir):
    config_fname = asset_dir + "\\config.txt"

    #Read the file
    f = open(config_fname, 'r')
    lines = f.readlines()
    f.close()

    #Update the content of the file
    update_config_lines(lines)

    #Write back to the file
    f = open(config_fname, 'w')
    f.writelines(lines)
    f.close()
    


"""
Returns a list of all subdirectories in the CWD
"""
def list_asset_dirs():
    return [x[0] for x in os.walk(".") if x[0] != '.']

if __name__ == "__main__":
    dirs = list_asset_dirs()
    #print(dirs)
    for asset in dirs:
        try:
            update_config(asset)
            print("[ OK ] Successfully updated " + asset)
        except Exception as e:
            print("[FAIL] Something went wrong when trying to update " + asset + ":")
            traceback.print_exc()
I menyn högst upp i IDLE:n, välj Run>Run Module (eller tryck F5), så kommer Python interpretatorn att öppnas och scriptet kommer att köras i den mappen som scriptfilen ligger i på alla assets där.



Kontrollera att configfilerna ser okey ut och sedan är det bara att dra in alla assetmappar i TANEs CM, commita dem och fortsätta att fixa lite roligare fel och varningar som uppstått.

(Glöm inte att radera alla assetmappar i uppdateringsmappen när de är inne i TANE, sedan är det bara att kopiera över nya från TS20xx och upprepa proceduren!)
Högst upp i scriptet kan man enkelt ställa in vilken trainz-build den skall byta till, standard är 3.9 som är första betan av TANE.
__________________
-k-
korvtiger besöker inte forumet just nu   Svara med citat
Svara

Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av
Forumhopp



Alla tider är GMT +2. Klockan är nu 09:53.


Powered by vBulletin® Version 3.7.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
© Svenska 3D-Tåg 2001-2009