• Dear visitors,

    The email issue has been finally solved.
    Thank you for your patience and happy browsing.

    Team ACM.

W.I.P. App for quick access to CSP extension ini files.

William Riker

New Member
Hi, a few days ago i made a tool for quick access to Custom Shaders Patch extension ini files for live editing. I managed to code something that fills some of my expectations at least, so i wanted to share the code in case anyone else wants to take it and make something better out of it. .

Here's what it does:
Firstly, the app recognizes if there's *.ini files in existence both in loaded folders (extension/config/cars/loaded and extension/config/tracks/loaded) and particular car and track folders (content/cars/'car name'/extension and content/tracks/'track name'/extension). There's 4 buttons that open these 4 files in notepad in the case the files actually exist. In the case of loaded folder, when the *.ini file does not exist, the button creates a new blank file and immediately after it allows to open it. For some reason, i could not set this same action for the particular folder buttons, so they just open the file in case it exists and don't do anything in case it doesn't.



My initial plan was to make it possible in some way to open and edit the text of these *.ini files in the app itself, but i guess my limited programming skills made it impossible to find a way. At least i am content with the possibility of opening these files in notepad with one click from within the game.

Here's the code, cheers!

Code:
import ac, acsys, platform, os, sys, webbrowser

if platform.architecture()[0] == "64bit":
    sysdir = os.path.dirname(__file__)+'/stdlib64'
else:
    sysdir = os.path.dirname(__file__)+'/stdlib'


import ctypes


appName = "Quick Extension Config"
trackName = ac.getTrackName (0)
carName = ac.getCarName (0)
carCommonExists = False
carPartExists = False
trackCommonExists = False
trackPartExists = False
trackConfigLoadedFilePath = "extension\\config\\tracks\\loaded\\"
tracksMainPath = "content\\tracks\\"
carConfigFilePath= "extension\\config\\cars\\"
carConfigLoadedFilePath = "extension\\config\\cars\\loaded\\"
carsMainPath = "content\\cars\\"
Content = "Track: " + trackName + "\n" + "Car: " + carName


def acMain(ac_version):

 
    global appWindow, btnCarCommon, btnTrackCommon, btnCarPart, btnTrackPart, text, carCommonExists, carPartExists, trackCommonExists, trackPartExists, trackcommonpath, trackpartpath, carpartpath, carcommonpath, Content, carsMainPath, tracksMainPath, carName, trackName

    appWindow = ac.newApp(appName)
    
    ac.setTitle(appWindow, appName)
    ac.setSize(appWindow, 320, 220)

    btnCarCommon = ac.addButton(appWindow, "Open Car Loaded")
    ac.setPosition(btnCarCommon, 5, 30)
    ac.setSize(btnCarCommon, 150, 20)
    ac.addOnClickedListener(btnCarCommon, CarCommonConfig)
    
    btnTrackCommon = ac.addButton(appWindow, "Open Track Loaded")
    ac.setPosition(btnTrackCommon, 165, 30)
    ac.setSize(btnTrackCommon, 150, 20)
    ac.addOnClickedListener(btnTrackCommon, TrackCommonConfig)
    
    btnCarPart = ac.addButton(appWindow, "Open Car Particular")
    ac.setPosition(btnCarPart, 5, 60)
    ac.setSize(btnCarPart, 150, 20)
    ac.addOnClickedListener(btnCarPart, CarPartConfig)

    btnTrackPart = ac.addButton(appWindow, "Open Track Particular")
    ac.setPosition(btnTrackPart, 165, 60)
    ac.setSize(btnTrackPart, 150, 20)
    ac.addOnClickedListener(btnTrackPart, TrackPartConfig)
    
    text = ac.addTextBox(appWindow,"TEXT")
    ac.setPosition(text, 5, 90)
    ac.setSize(text, 310, 120)

    trackcommonpath = str(trackConfigLoadedFilePath + trackName + ".ini")
    trackpartpath = str(tracksMainPath + trackName + "\\extension\\ext_config.ini")
    carcommonpath = str(carConfigLoadedFilePath + carName + ".ini")
    carpartpath = str(carsMainPath + carName + "\\extension\\ext_config.ini")
    trackextpath = str(tracksMainPath + trackName + "\\extension")
    carextpath = str(carsMainPath + carName + "\\extension")


    if os.path.isfile(trackcommonpath):
        
        trackCommonExists = True
        Content = Content + "\nTrack Config in Loaded folder: YES"
        ac.log("Track Config in Loaded folder exists")
        ac.setText(btnTrackCommon, "Open Track Loaded")
    else:
        Content = Content + "\nTrack Config in Loaded folder: NO"
        ac.setText(btnTrackCommon, "Create Track Loaded")
    
        
    if os.path.isfile(trackpartpath):
    
        trackPartExists = True
        Content = Content + "\nTrack Config in particular folder: YES"
        ac.log("Track Config in particular folder exists")
        ac.setText(btnTrackPart, "Open Track Particular")
    else:
        Content = Content + "\nTrack Config in particular folder: NO"
        ac.setText(btnTrackPart, "Open Track Particular")
        
    if os.path.isfile(carcommonpath):
        
        carCommonExists = True
        Content = Content + "\nCar Config in Loaded folder: YES"
        ac.log("Car Config in Loaded folder exists")
        ac.setText(btnCarCommon, "Open Car Loaded")
    else:
        Content = Content + "\nCar Config in Loaded folder: NO"
        ac.setText(btnCarCommon, "Create Car Loaded")
        
    if os.path.isfile(carpartpath):
    
        carPartExists = True
        Content = Content + "\nCar Config in particular folder: YES"
        ac.log("Car Config in particular folder exists")
        ac.setText(btnCarPart, "Open Car Particular")
    else:
        Content = Content + "\nCar Config in particular folder: NO"
        ac.setText(btnCarPart, "Open Car Particular")
        
    ac.setText(text, Content)
    ac.setFontSize(text, 13)
    
    
    return appName



def CarCommonConfig(dummy, variable):
    global CarCommon, trackcommonpath, trackpartpath, carpartpath, carcommonpath, Content, carCommonExists
    
    if os.path.isfile(carcommonpath):
        
        webbrowser.open(carcommonpath)
        ac.log("Car Common Config opened")
        
    else:
        carCommonExists = True
        CarCommon = open((carcommonpath), 'w')
        CarCommon.close()
        
        ac.log("Car Common Config created")
        
        Content = "Track: " + trackName + "\n" + "Car: " + carName
        
        if os.path.isfile(trackcommonpath):
        
            trackCommonExists = True
            Content = Content + "\nTrack Config in Loaded folder: YES"
            ac.log("Track Config in Loaded folder exists")
            ac.setText(btnTrackCommon, "Open Track Loaded")
        else:
            Content = Content + "\nTrack Config in Loaded folder: NO"
            ac.setText(btnTrackCommon, "Create Track Loaded")
    
        
        if os.path.isfile(trackpartpath):
    
            trackPartExists = True
            Content = Content + "\nTrack Config in particular folder: YES"
            ac.log("Track Config in particular folder exists")
            ac.setText(btnTrackPart, "Open Track Particular")
        else:
            Content = Content + "\nTrack Config in particular folder: NO"
            ac.setText(btnTrackPart, "Open Track Particular")
        
        if os.path.isfile(carcommonpath):
        
            carCommonExists = True
            Content = Content + "\nCar Config in Loaded folder: YES"
            ac.log("Car Config in Loaded folder exists")
            ac.setText(btnCarCommon, "Open Car Loaded")
        else:
            Content = Content + "\nCar Config in Loaded folder: NO"
            ac.setText(btnCarCommon, "Create Car Loaded")
        
        if os.path.isfile(carpartpath):
    
            carPartExists = True
            Content = Content + "\nCar Config in particular folder: YES"
            ac.log("Car Config in particular folder exists")
            ac.setText(btnCarPart, "Open Car Particular")
        else:
            Content = Content + "\nCar Config in particular folder: NO"
            ac.setText(btnCarPart, "Open Car Particular")
        
        ac.setText(text, Content)
        ac.setFontSize(text, 13)
        
    
def TrackCommonConfig(dummy, variable):

    global TrackCommon, trackcommonpath, trackpartpath, carpartpath, carcommonpath, Content, TrackCommonExists
    
    if os.path.isfile(trackcommonpath):
        
        webbrowser.open(trackcommonpath)
        ac.log("Track Common Config opened")
        
    else:
        trackCommonExists = True
        TrackCommon = open((trackcommonpath), 'w')
        TrackCommon.close()
        
        ac.log("Track Common Config created")
        
        Content = "Track: " + trackName + "\n" + "Car: " + carName
        
        if os.path.isfile(trackcommonpath):
        
            trackCommonExists = True
            Content = Content + "\nTrack Config in Loaded folder: YES"
            ac.log("Track Config in Loaded folder exists")
            ac.setText(btnTrackCommon, "Open Track Loaded")
        else:
            Content = Content + "\nTrack Config in Loaded folder: NO"
            ac.setText(btnTrackCommon, "Create Track Loaded")
    
        
        if os.path.isfile(trackpartpath):
    
            trackPartExists = True
            Content = Content + "\nTrack Config in particular folder: YES"
            ac.log("Track Config in particular folder exists")
            ac.setText(btnTrackPart, "Open Track Particular")
        else:
            Content = Content + "\nTrack Config in particular folder: NO"
            ac.setText(btnTrackPart, "Create Track Particular")
        
        if os.path.isfile(carcommonpath):
        
            carCommonExists = True
            Content = Content + "\nCar Config in Loaded folder: YES"
            ac.log("Car Config in Loaded folder exists")
            ac.setText(btnCarCommon, "Car Loaded")
        else:
            Content = Content + "\nCar Config in Loaded folder: NO"
            ac.setText(btnCarCommon, "Create Car Loaded")
        
        if os.path.isfile(carpartpath):
    
            carPartExists = True
            Content = Content + "\nCar Config in particular folder: YES"
            ac.log("Car Config in particular folder exists")
            ac.setText(btnCarPart, "Car Particular")
        else:
            Content = Content + "\nCar Config in particular folder: NO"
            ac.setText(btnCarPart, "Create Car Particular")
        
        ac.setText(text, Content)
        ac.setFontSize(text, 13)
    

    
def CarPartConfig(dummy, variable):

    global CarPart, trackcommonpath, trackpartpath, carpartpath, carcommonpath, Content, TrackCommonExists, carextpath
    
    if os.path.isfile(carpartpath):
        
        webbrowser.open(carpartpath)
        ac.log("Car Particular Config opened")
        
    else:
        carPartExists = True
        os.makedirs(carextpath)
        CarPart = open((carpartpath), 'w')
        CarPart.close()
        
        ac.log("Car Particular Config created")
        
        Content = "Track: " + trackName + "\n" + "Car: " + carName
        
        if os.path.isfile(trackcommonpath):
        
            trackCommonExists = True
            Content = Content + "\nTrack Config in Loaded folder: YES"
            ac.log("Track Config in Loaded folder exists")
            ac.setText(btnTrackCommon, "Open Track Loaded")
        else:
            Content = Content + "\nTrack Config in Loaded folder: NO"
            ac.setText(btnTrackCommon, "Create Track Loaded")
    
        
        if os.path.isfile(trackpartpath):
    
            trackPartExists = True
            Content = Content + "\nTrack Config in particular folder: YES"
            ac.log("Track Config in particular folder exists")
            ac.setText(btnTrackPart, "Open Track Particular")
        else:
            Content = Content + "\nTrack Config in particular folder: NO"
            ac.setText(btnTrackPart, "Create Track Particular")
        
        if os.path.isfile(carcommonpath):
        
            carCommonExists = True
            Content = Content + "\nCar Config in Loaded folder: YES"
            ac.log("Car Config in Loaded folder exists")
            ac.setText(btnCarCommon, "Car Loaded")
        else:
            Content = Content + "\nCar Config in Loaded folder: NO"
            ac.setText(btnCarCommon, "Create Car Loaded")
        
        if os.path.isfile(carpartpath):
    
            carPartExists = True
            Content = Content + "\nCar Config in particular folder: YES"
            ac.log("Car Config in particular folder exists")
            ac.setText(btnCarPart, "Car Particular")
        else:
            Content = Content + "\nCar Config in particular folder: NO"
            ac.setText(btnCarPart, "Create Car Particular")
        
        ac.setText(text, Content)
        ac.setFontSize(text, 13)
    

    
def TrackPartConfig(dummy, variable):

    global TrackPart, trackcommonpath, trackpartpath, carpartpath, carcommonpath, Content, TrackCommonExists
    
    if os.path.isfile(trackpartpath):
        
        webbrowser.open(trackpartpath)
        ac.log("Track Particular Config opened")
        
    else:
        trackPartExists = True
        TrackPart = open((trackpartpath), 'w')
        TrackPart.close()
        
        ac.log("Track Particular Config created")
        
        Content = "Track: " + trackName + "\n" + "Car: " + carName
        
        if os.path.isfile(trackcommonpath):
        
            trackCommonExists = True
            Content = Content + "\nTrack Config in Loaded folder: YES"
            ac.log("Track Config in Loaded folder exists")
            ac.setText(btnTrackCommon, "Open Track Loaded")
        else:
            Content = Content + "\nTrack Config in Loaded folder: NO"
            ac.setText(btnTrackCommon, "Create Track Loaded")
    
        
        if os.path.isfile(trackpartpath):
    
            trackPartExists = True
            Content = Content + "\nTrack Config in particular folder: YES"
            ac.log("Track Config in particular folder exists")
            ac.setText(btnTrackPart, "Open Track Particular")
        else:
            Content = Content + "\nTrack Config in particular folder: NO"
            ac.setText(btnTrackPart, "Create Track Particular")
        
        if os.path.isfile(carcommonpath):
        
            carCommonExists = True
            Content = Content + "\nCar Config in Loaded folder: YES"
            ac.log("Car Config in Loaded folder exists")
            ac.setText(btnCarCommon, "Car Loaded")
        else:
            Content = Content + "\nCar Config in Loaded folder: NO"
            ac.setText(btnCarCommon, "Create Car Loaded")
        
        if os.path.isfile(carpartpath):
    
            carPartExists = True
            Content = Content + "\nCar Config in particular folder: YES"
            ac.log("Car Config in particular folder exists")
            ac.setText(btnCarPart, "Car Particular")
        else:
            Content = Content + "\nCar Config in particular folder: NO"
            ac.setText(btnCarPart, "Create Car Particular")
        
        ac.setText(text, Content)
        ac.setFontSize(text, 13)
 

fughettaboutit

aka leBluem
Oh by "edit" you just mean have a button for the configs? Well i put that in sol weather app, on the "old" (sol<2.1) weather plan selector you have buttons for the configs, for track and car:
(Edit: afair it searches 8 places for configs)
upload_2022-3-6_13-28-21.png

With hotkeys enabled you also can set a shortcut for that planner window too:
upload_2022-3-6_13-30-26.png
 

William Riker

New Member
Oh, i'm using the last version of Sol so i guess that's why i didn't found that window. What i wanted initially was some kind of ingame text editor so one could write inside the text file live without having to open other programs like notepad or similar text editors. Having found no way to do this with the basic python tools in AC documentation, it was enough for me having some buttons to quickly open these files in notepad with just one click.
 

fughettaboutit

aka leBluem
Oh, i'm using the last version of Sol so i guess that's why i didn't found that window. What i wanted initially was some kind of ingame text editor so one could write inside the text file live without having to open other programs like notepad or similar text editors. Having found no way to do this with the basic python tools in AC documentation, it was enough for me having some buttons to quickly open these files in notepad with just one click.
oh btw, that app i mentioned with the buttons is still included in latest sol, that plan window is still there, like above, without weather-stuff...
 
Top