2

Interacting with PSSE GUI

I'm trying to determine what hooks the PSSE API has into the PSSE GUI. The only API functions I can find are related to the Graphical Analysis Output.

I would like to:

  1. Select a bus on the Diagram canvas
  2. Get the bus number from an API function called from PSSE

Actually, any flow[1] that lets a user choose something in PSSE and use that choice in the API would be appreciated. Is anything like this possible with PSSE?

EDIT: [1] Detecting selected items from the network spreadsheets (bus, branch, machine, etc) would also be helpful, but that ability seems even more unlikely.

chip's avatar
459
chip
asked 2012-03-22 12:08:24 -0500, updated 2012-03-23 08:46:15 -0500
edit flag offensive 0 remove flag close merge delete

Comments

So you are looking for a callback when someone clicks on a Bus. Really great idea, you could do a lot with that.

JervisW's avatar JervisW (2012-03-22 19:55:44 -0500) edit

Has anyone ever tried to use Python to directly wrap the PSSE dll files? We might be able to do this if we can access the guts of PSSE.

JervisW's avatar JervisW (2012-03-23 16:30:54 -0500) edit
add a comment see more comments

2 Answers

3

It can be done using the sliderPy library

import sliderPy

def main():
    mydoc = sliderPy.GetActiveDocument()
    mydiagram = mydoc.GetDiagram()
    mycomponents = mydiagram.GetComponents()
    print str(len(mycomponents)) + " components found"
    i = 0
    for mycomponent in mycomponents:
        if mycomponent.IsSelected() == True:
            print 'Type: ' + str(mycomponent.GetComponentType())
            mylabels = mycomponent.GetOwnedLabels()
            print str(len(mylabels)) + ' labels found'
            j = 1
            for mylabel in mylabels:
                print 'Label ' + str(j) + ': ' + mylabel.GetText()
                print '\n'
                j += 1
        i += 1
        #if i == 10: break

    print str(i) + ' items searched'

if __name__ == '__main__':
    main()
nwilson's avatar
100
nwilson
answered 2014-01-06 11:27:17 -0500
edit flag offensive 0 remove flag delete link

Comments

This answer extracts the label information to identify buses. A better solution using the getmapstring function in sliderpy is shown in the "get id from selected branch" question.

nwilson's avatar nwilson (2017-01-22 23:12:16 -0500) edit
add a comment see more comments
1

I have been racking my brain but I can't think of a way you can get PSSE to pass you user selected data from the diagram. The API for the slider diagrams is not complete in the sense that they miss the ability to control the position of individual nodes and get user clicks.

What I suggest instead is that you could create a little pop up box that asks for the bus number. So instead of clicking on a bus, the user must type (or copy + paste) it in.

from Tkinter import Tk, StringVar, Entry, Button, Label
import Queue

import psspy


def get_user_input(title, data_label, default=None):
    """
    Create a pop up with:
      - a text box;
      - OK button; and
      - text box label

    to ask for user input. Returns the string that they enter.

    If the user closes the pop up then the default value is returned.
    """
    root = Tk()
    root.wm_title(title)
    value = StringVar()
    q = Queue.Queue()

    def set_value():
        q.put(value.get())
        root.destroy()

    def get_value(default=None):
        try:
            return q.get(block=False)
        except Queue.Empty:
            return default

    Label(root, text=data_label).pack()
    Entry(root, textvariable=value).pack()
    Button(root, text="OK", command=set_value).pack()

    root.mainloop()
    return get_value(default)

def report_bus_voltage():
    """
    Asks the user for a bus number and then reports on the bus voltage.
    """
    try:
        selected_bus = int(get_user_input('PSSE', 'Get Voltage for Bus'))
    except (TypeError, ValueError):
        return "User did not select a bus"

    irr, voltage = psspy.busdat(selected_bus, string="PU")
    return voltage

if __name__ == "__main__":
    print report_bus_voltage()

The example script completes a trivial task, but importantly illustrates how you can prompt for user input using the built in Tkinter framework. To set this as a Custom toolbar button follow the instructions "5.2 Configuring Custom Toolbar Buttons" in the GUI Users Guide.

JervisW's avatar
1.3k
JervisW
answered 2012-03-22 20:06:28 -0500, updated 2012-03-23 05:05:44 -0500
edit flag offensive 0 remove flag delete link

Comments

I was afraid of that. I already wrote some [very ugly] Tkinter, but I was getting tired of typing bus numbers and was hoping to improve it. This is a nice example to come back to.

chip's avatar chip (2012-03-23 08:33:33 -0500) edit

I've seen other tools get around similar API limitations by popping a dialog where you can select multiple buses from a listbox populated with all the buses. I guess it just depends on your pain tolerance for writing GUIs.

chip's avatar chip (2012-03-23 08:40:25 -0500) edit

Would it be helpful if I wrote a script so anyone could add a listbox bus selector to their project?

JervisW's avatar JervisW (2012-03-23 16:28:35 -0500) edit

@JervisW I was just going to wait for PSSEv33 so I could use wxPython which I'm a bit more familiar with :) Don't bother with it on my account, I can do Tkinter if I need it.

chip's avatar chip (2012-03-23 17:09:41 -0500) edit

wxPython is a much nicer package to work in. So is wxPython a requirement for PSSEv33? Why do you have to wait, can't you begin using it now?

JervisW's avatar JervisW (2012-03-25 05:19:00 -0500) edit
add a comment see more comments

Your Answer

Login/Signup to Answer