Jump to content

Python plug-in with widgets (basic example)


Recommended Posts

There is a question on the German VW forum about plug-ins with dividers and buttons. An ever recurring topic.

 I am [ever] switching to Python, and I though it could be a nice exercise for me to try it pythonically.

 

Expand the test file into your User's plug-in folder (there is no installer here)

Test.zip

 

The Test PIO _c_ plug-in:

  • uses an external file source (you don't need to script in the Plug-in Editor)
  • is event enabled
  • has a button triggering a script
  • has dividers
  • turns the dividers into expandable group widgets
  • doesn't resolve text alignments, so that will take the active document's settings

 

I am new to Python and am sure that this can be done more efficiently, I'll throw it thus here in the forum, let's learn.

 

1840184165_Screenshot2021-03-27at15_15_09.thumb.png.9708a3e399a36fb13b34f2cd38ba2c02.png

  • Like 3
Link to comment

About text alignments: you can set a plug-in object to respond to font and text size using 

 vs.SetObjectVariableBoolean(gPio_H, 800, True) 

but all other text properties, such as horizontal and vertical alignment, etc. must be coded and driven by parameters.

Link to comment

Explanation:

 

The plug-in needs to be event enabled: you do this in the Options tab of the Plug-in editor:

 

1341293943_Screenshot2021-03-29at06_18_48.thumb.png.7eb337d472c094f2a63fc1b1b33d2fd1.png

 

 

If you work on Python with external files, the plug-in needs to reload the code, so you must turn off caching during development:

 

1764448575_Screenshot2021-03-29at06_19_17.thumb.png.5854c3df18c44a5b3e414e48752d2bbc.png

 

 

Here I break down the events employed. There are bucketloads of events, you'll find them in the SDK: MiniCadHookIntf.h and it does take a lot of time to be comfortable with their usage. Some of them I have really no idea what they do, and believe me, I did spend an inordinate about of time on them. The two major files you might want to study are these, but there is far more (the SDK version is here just irrelevant):

 

1380862304_Screenshot2021-03-29at06_23_25.thumb.png.b7b4bcaf49fbdd228f3045419954a9b3.png

334621851_Screenshot2021-03-29at06_23_33.thumb.png.0ec18bc252e983e0260ec40a551853a1.png

 

The code for the plug-in runs a number of times (and double as much if the developer mode is on), vs.GetCustomObjectInfo is compulsory for fetching the needed basic variables:

(ok, gPio_N, gPio_H, gPioRec_H, gWall_H) = vs.GetCustomObjectInfo()

 

Every time the code runs, you must fetch the type of event involved and eventually do something during that event. vs.vsoGetEventInfo is compulsory for fetching event info:

(theEvent, theButton) = vs.vsoGetEventInfo()
# whereby theButton is a generic message

(theEvent, aMessage) = vs.vsoGetEventInfo()

 

  • Like 2
Link to comment
Posted (edited)

 

Init properties:

 

During the init event you set up the Object Info Palette behaviour and other things:

if theEvent == kObjOnInitXProperties:

 

If you want to use buttons and/or Custom pull-down menus you need to turn on UIoverride: 

ok = vs.SetObjPropVS( kObjXPropHasUIOverride, True )


IF, and only IF,  you also want to use custom pull-down menus loading custom values, you will also need to enable custom widget visibilities. If you do this, you cannot use vs.SetParameterVisibility or vs.EnableParameter, which use parameter names, you can only use vs.vsoWidgetSetVisible and vs.vsoWidgetSetEnable. These need parameter indexes, so you must keep track of the parameter indexes and store them somehow as file. This does add complexity (I have a sub auto-filling a list as text into the right place):

# not used in the test example:
vs.SetObjPropVS(kObjXHasCustWidgetVisibilities, True); 
# only needed for custom pull-down menus with special lists of values
# after enabling this prop you need to set visibilities during event kObjOnWidgetPrep

 

To have the lovely widget groups, you must

1901509752_Screenshot2021-03-29at06_38_27.thumb.png.47541cf3582137b4c1b9d6585d5db318.png2027296239_Screenshot2021-03-29at06_40_43.thumb.png.ebd0adf739ce95effa13068e1f55143a.png

  • enable them
ok = vs.SetObjPropCharVS( kWidgetGroupMode, vs.Chr(kWidgetGroupAutomatic), True ) # add widget groups
  • Add parameters as static text

1551401459_Screenshot2021-03-29at06_41_30.thumb.png.d6d8ca465962a1e1fa91c2b6b8d9329e.png

 

  • turn the static text into separators. Mind that the routine vs.vsoInsertWidget takes a string and places it in the Object Info Palette. You can use the localised parameter name.  Since the function (boo, locParmName) = vs.GetLocalizedPluginParameter(pioRecName, univParmName) returns two vars, it cannot be used directly, so I created one simple sub named O_GetLocParmName that does that: return only a string.
ok = vs.vsoInsertWidget( cP___div0 -1, kWidgetSeparator, cP___div0, 'parameter name', empty);

# it is advisable to use the localized name
ok = vs.vsoInsertWidget( cP___div0 -1, kWidgetSeparator, cP___div0, O_GetLocParmName(gPio_N, '__div0'), empty);

# O_GetLocParmName is a subroutine that fetches only the string, dropping the boolean, 
# so I can use it directly in vs.vsoInsertWidget 
def O_GetLocParmName(pioRecName, univParmName):
	(boo, locParmName) = vs.GetLocalizedPluginParameter(pioRecName, univParmName)
	return locParmName

 

  • add indenting levels. These turn the widgets into expandable widgets. Don't omit to set the 0-levels, or things are going to mess up:
titles = [cP___div0, cP___div1, cP___div2]
for i in range(vs.NumFields(gPioRec_H) +1):
	if (i in titles): 
		vs.vsoWidgetSetIndLvl(i, 0)
	else:
		vs.vsoWidgetSetIndLvl(i, 1)

 

Warning: you will need to close and re-open your document to see widget groups display properly EVERY time you change something in the parameter index list (add, delete parameters)

Edited by _c_
  • Like 4
Link to comment
  • 1 month later...

I'm really thankfull to this post!

 

I'm doing a lot of try and error, but it works pretty fine! 🙂

 

On 3/29/2021 at 6:56 AM, _c_ said:

Warning: you will need to close and re-open your document to see widget groups display properly EVERY time you change something in the parameter index list (add, delete parameters)

I guess, a simple open and close the Editing-Window in the PlugIn Manager is working as well..

  • Like 2
Link to comment
  • 2 months later...

Nice share @_c_! Finally got my group widgets working after months of trial and error.

 

My widget indent calls were in the kObjOnWidgetPrep function not the kObjOnInitXProperties. (Funny that indentation works in kObjOnWidgetPrep without the Grouping)

 

Again, thank you and thank you.

Edited by twk
  • Like 1
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...