User:Orso.b.schmid: Difference between revisions
(expand string implicit conversion) |
m (modify challenging chars in title) |
||
(6 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
<div class="rightmenu"> | |||
__TOC__ | |||
</div> | |||
Ciao, | Ciao, | ||
I am Orso, an Italian Vectorscripter since many years. Some of you might know me from Vectorlab or the comments on the present Developer wiki. I feel very comfortable with Vectorscript | I am Orso, an Italian Vectorscripter since many years. Some of you might know me from Vectorlab or the comments on the present Developer wiki. I feel very comfortable with Vectorscript but will now switch over to Python for even more power. I will try to share here comments, problems -and solutions- from the point of view of a non-programmer. --[[User:Orso.b.schmid|Orso.b.schmid]] ([[User talk:Orso.b.schmid|talk]]) 08:13, 17 May 2015 (EDT) | ||
If you add comments, please use the full wiki formatting, easily available clicking on ''Advanced'' while on edit mode and don't forget to sign up your comment using <nowiki>--~~~~</nowiki>! | If you add comments, please use the full wiki formatting, easily available clicking on ''Advanced'' while on edit mode and don't forget to sign up your comment using <nowiki>--~~~~</nowiki>! | ||
== VS | == Vectorlab Archives == | ||
Here is the List Browsers article from the now dead Vectorlab site: | |||
* List Browsers ([[:Media:Vectorlab_ListBrowsers_WebArchives.zip| Vectorlab ListBrowsers Web Archives.zip]]) | |||
I stored some of the Vectorlab sites: | |||
== VS - Py Rosetta Stone == | |||
{| class="wikitable" | {| class="wikitable" | ||
Line 11: | Line 21: | ||
! style="width:40%"| Vectorscript | ! style="width:40%"| Vectorscript | ||
! style="width:40%"| Python | ! style="width:40%"| Python | ||
|- style="vertical-align: top;" | |||
| '''Statement ending:''' | |||
| '''Semicolon always needed''' | |||
* <code>AlrtDialog('test 1') </br> AlrtDialog('test 2') { error }</code> | |||
* <code>AlrtDialog('test 1'); AlrtDialog('test 2'); { OK }</code> | |||
* <code>AlrtDialog('test 1') AlrtDialog('test 2') { error }</code> | |||
| '''Semicolon needed only for multiple statements on one line:''' | |||
* <code>vs.AlrtDialog('test 1') </br>vs.AlrtDialog('test 2') # OK</code> | |||
* <code>vs.AlrtDialog('test 1'); vs.AlrtDialog('test 2') # OK</code> | |||
* <code>vs.AlrtDialog('test 1') vs.AlrtDialog('test 2') # error</code> | |||
Error Message: SyntaxError: invalid syntax | |||
|- style="vertical-align: top;" | |- style="vertical-align: top;" | ||
Line 30: | Line 53: | ||
| '''Empty brakes for functions''' | | '''Empty brakes for functions''' | ||
: don't forget in python the empty brakets for routines without parameters, this rises errors that are so tricky to find. | : don't forget in python the empty brakets for routines without parameters, this rises errors that are so tricky to find. | ||
| | | '''Can be without brakets''' | ||
* <code>FSActLayer;</code> | * <code>FSActLayer; { no paramters: brakets not needed }</code> | ||
* <code>MySubroutine;</code> | * <code>MySubroutine;</code> | ||
| | | '''Can't be without brakets''' | ||
* <code>vs.FSActLayer()</code> | * <code>vs.FSActLayer()</code> | ||
* <code>MySubroutine()</code> | * <code>MySubroutine()</code> | ||
Error Message: - none! be careful! - | |||
|- style="vertical-align: top;" | |- style="vertical-align: top;" | ||
Line 65: | Line 90: | ||
BEGIN | BEGIN | ||
{ gNum is not defined in this subroutine | { gNum is not defined in this subroutine | ||
the parser | the parser climbs up parent containers | ||
until it finds a declaration for the var gNum. | until it finds a declaration for the var gNum. | ||
In this case in Main } | In this case it can be found in Main } | ||
gNum := gNum +1; | gNum := gNum +1; | ||
SysBeep; | SysBeep; | ||
Line 107: | Line 132: | ||
<code lang="py"> | <code lang="py"> | ||
# GLOBAL ACCESS | # GLOBAL ACCESS: CORRECT | ||
# subroutine | # subroutine | ||
def Increment(): | def Increment(): | ||
Line 126: | Line 151: | ||
# returns 20 | # returns 20 | ||
</code> | </code> | ||
<code lang="py"> | |||
# GLOBAL ACCESS: WRONG | |||
# subroutine | |||
def Increment(): | |||
# gNum is not defined in this subroutine | |||
# tell the parser that you want to edit gNum global! | |||
global gNum | |||
gNum +=1 | |||
vs.SysBeep() | |||
# no init! | |||
for gIndex in range(0, 10): | |||
Increment() | |||
# increments the variable gNum | |||
# but only inside Increment! | |||
vs.AlrtDialog(str(gNum)) | |||
# rises error | |||
</code> | |||
Error Message: NameError: global name 'gNum' is not defined | |||
|- style="vertical-align: top;" | |- style="vertical-align: top;" | ||
Line 167: | Line 214: | ||
| '''Supports implicit conversion:''' | | '''Supports implicit conversion:''' | ||
: Both [[VS:Concat| Concat]] and [[VS:Message| Message]] support multiple variable types and convert them into string. | : Both [[VS:Concat| Concat]] and [[VS:Message| Message]] support multiple variable types and convert them into string. | ||
* <code>Concat(10, ' fingers'); { OK }</code> | * <code>t := Concat(10, ' fingers'); { OK }</code> | ||
* <code>Message(10, ' fingers'); { OK }</code> | * <code>Message(10, ' fingers'); { OK }</code> | ||
* <code>AlrtDialog(Concat(10, ' fingers')); { OK }</code> | * <code>AlrtDialog(Concat(10, ' fingers')); { OK }</code> | ||
| '''Doesn't support implicit conversion:''' | | '''Doesn't support implicit conversion:''' | ||
: For example an integer won't automatically be converted into string. Wrap it in [[VS:Concat| vs.Concat]] or [[VS:Message| vs.Message]], alternatively perform the needed conversion. | : For example an integer won't automatically be converted into string. Wrap it in [[VS:Concat| vs.Concat]] or [[VS:Message| vs.Message]], alternatively perform the needed conversion. | ||
* <code>10 + ' fingers' # error</code> | * <code>t = 10 + ' fingers' # error</code> | ||
* <code>vs. | * <code>t = vs.Concat(10, ' fingers') # OK</code> | ||
* <code>vs.Message(10, ' fingers') # OK</code> | |||
* <code>vs.AlrtDialog(str(10) + ' fingers') # OK</code> | * <code>vs.AlrtDialog(str(10) + ' fingers') # OK</code> | ||
* <code>vs.AlrtDialog(10 + ' fingers') # error </code> | * <code>vs.AlrtDialog(10 + ' fingers') # error </code> | ||
Line 222: | Line 270: | ||
months = {1: 'Jan', 2: 'Feb', 3: 'Mar'} # --> {1: 'Jan', 2: 'Feb', 3: 'Mar'} | months = {1: 'Jan', 2: 'Feb', 3: 'Mar'} # --> {1: 'Jan', 2: 'Feb', 3: 'Mar'} | ||
</code> | </code> | ||
== Errors == | |||
Python Error Messages: https://docs.python.org/3/library/exceptions.html | |||
BaseExceptions: | |||
+-- SystemExit | |||
+-- KeyboardInterrupt | |||
+-- GeneratorExit | |||
+-- Exception | |||
+-- StopIteration | |||
+-- ArithmeticError | |||
| +-- FloatingPointError | |||
| +-- OverflowError | |||
| +-- ZeroDivisionError | |||
+-- AssertionError | |||
+-- AttributeError | |||
+-- BufferError | |||
+-- EOFError | |||
+-- ImportError | |||
+-- LookupError | |||
| +-- IndexError | |||
| +-- KeyError | |||
+-- MemoryError | |||
+-- NameError | |||
| +-- UnboundLocalError | |||
+-- OSError | |||
| +-- BlockingIOError | |||
| +-- ChildProcessError | |||
| +-- ConnectionError | |||
| | +-- BrokenPipeError | |||
| | +-- ConnectionAbortedError | |||
| | +-- ConnectionRefusedError | |||
| | +-- ConnectionResetError | |||
| +-- FileExistsError | |||
| +-- FileNotFoundError | |||
| +-- InterruptedError | |||
| +-- IsADirectoryError | |||
| +-- NotADirectoryError | |||
| +-- PermissionError | |||
| +-- ProcessLookupError | |||
| +-- TimeoutError | |||
+-- ReferenceError | |||
+-- RuntimeError | |||
| +-- NotImplementedError | |||
+-- SyntaxError | |||
| +-- IndentationError | |||
| +-- TabError | |||
+-- SystemError | |||
+-- TypeError | |||
+-- ValueError | |||
| +-- UnicodeError | |||
| +-- UnicodeDecodeError | |||
| +-- UnicodeEncodeError | |||
| +-- UnicodeTranslateError | |||
+-- Warning | |||
+-- DeprecationWarning | |||
+-- PendingDeprecationWarning | |||
+-- RuntimeWarning | |||
+-- SyntaxWarning | |||
+-- UserWarning | |||
+-- FutureWarning | |||
+-- ImportWarning | |||
+-- UnicodeWarning | |||
+-- BytesWarning | |||
+-- ResourceWarning |
Latest revision as of 08:39, 30 December 2020
Ciao,
I am Orso, an Italian Vectorscripter since many years. Some of you might know me from Vectorlab or the comments on the present Developer wiki. I feel very comfortable with Vectorscript but will now switch over to Python for even more power. I will try to share here comments, problems -and solutions- from the point of view of a non-programmer. --Orso.b.schmid (talk) 08:13, 17 May 2015 (EDT)
If you add comments, please use the full wiki formatting, easily available clicking on Advanced while on edit mode and don't forget to sign up your comment using --~~~~!
Vectorlab Archives
Here is the List Browsers article from the now dead Vectorlab site:
- List Browsers ( Vectorlab ListBrowsers Web Archives.zip)
I stored some of the Vectorlab sites:
VS - Py Rosetta Stone
Description | Vectorscript | Python |
---|---|---|
Statement ending: | Semicolon always needed
|
Semicolon needed only for multiple statements on one line:
Error Message: SyntaxError: invalid syntax |
Case sensitivity | Not case sensitive:
|
Case sensitive:
Error Message: AttributeError: 'module' object has no attribute 'vs.ALRTDIALOG' |
Empty brakes for functions
|
Can be without brakets
|
Can't be without brakets
Error Message: - none! be careful! - |
Empty handles
|
|
|
Variable scope
|
Global wins over local:
{ GLOBAL ACCESS } { parent of subroutine "Increment" } PROCEDURE Main; VAR { good praxis: label globals with "g" } gIndex, gNum : INTEGER; { subroutine } PROCEDURE Increment; BEGIN { gNum is not defined in this subroutine the parser climbs up parent containers until it finds a declaration for the var gNum. In this case it can be found in Main } gNum := gNum +1; SysBeep; END; BEGIN gNum := 10; { init } FOR gIndex := 1 TO 10 DO Increment; { increments the variable gNum } AlrtDialog(Concat(gNum)); { returns 20 } END; Run(Main); |
Local wins over global:
# LOCAL ACCESS # subroutine def Increment(): # gNum is not defined in this subroutine # the parser creates a local instance of the var gNum! gNum +=1 vs.SysBeep gNum = 10 # init for gIndex in range(1, 10): Increment # increments the variable gNum # but only inside Increment! vs.AlrtDialog(str(gNum)) # returns 10! The global var didn't set # GLOBAL ACCESS: CORRECT # subroutine def Increment(): # gNum is not defined in this subroutine # tell the parser that you want to edit gNum global! global gNum gNum +=1 vs.SysBeep() gNum = 10 # init # please observe that the range is NOT 1, 10! for gIndex in range(0, 10): Increment() # increments the variable gNum # but only inside Increment! vs.AlrtDialog(str(gNum)) # returns 20 # GLOBAL ACCESS: WRONG # subroutine def Increment(): # gNum is not defined in this subroutine # tell the parser that you want to edit gNum global! global gNum gNum +=1 vs.SysBeep() # no init! for gIndex in range(0, 10): Increment() # increments the variable gNum # but only inside Increment! vs.AlrtDialog(str(gNum)) # rises error Error Message: NameError: global name 'gNum' is not defined |
FOR statements | Runs including last value:
{ runs 3 times! 1, 2 and 3 } FOR i := 1 TO 3 DO AlrtDialog(Concat(i)); |
Runs excluding last value:
# runs 2 times! 1 and 2 for i in range(1, 3): vs.AlrtDialog(str(i)) |
Colors |
|
Warning: don't forget the brakets:
Error Message: - none! be careful! - |
Concatenate text | Supports implicit conversion:
|
Doesn't support implicit conversion:
Error Message: TypeError: unsupported operand type(s) for +: 'int' and 'str' |
Encryption | Whatever .vs or .px file is linked through your includes, will be encrypted upon running the encrypt command. More infos here. | Create list of your included files in an xml file. Please read Vlado on Techboard |
Python version | import sys
| |
"import vs" | import vs # do I need this?
| |
Caching
|
varPersistentPythonEngine = 412 { Boolean }
In the SDK starting from VW 2014 we can read: When True the Python engine is the same for the execution of all scripts, this solves some issues with Py_Initialize and Py_Finalize. For example, when debugging externally python leaves threas that cause crash if Py_Initialize and Py_Finalize is used for each script call. So, this allows the engine to be preserved between calls, however Vectorworks will delete all custom modules and objects defined in the engine prior each execution. |
Lists
Lists are powerful in Python, below some fascinating lists manipulations. They remind me of Applescript:
months = "Jan Feb Mar Apr May Jun Jul" months = months.split() # no splitter defined and it will use the empty space --> ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'] months[2] # --> 'Mar' note that the index is 0-based months2 = "Jan, Feb, Mar, Apr, May, Jun, Jul" months2.split(', ') # --> ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'] use comma and empty space as splitter months.append('Jul') # --> ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul'] append adds an item to a list months.pop() #- -> 'Jul' pop fetches the last item of a list ', sunny '.join(months) # --> ', sunny Jan, sunny Feb, sunny Mar, sunny Apr, sunny May, sunny Jun, sunny Sep' '-'.join(months[1:3]) # --> 'Feb-Mar' del months[2] # --> ['Jan', 'Feb', 'Apr', 'May', 'Jun', 'Jul'] months = {1: 'Jan', 2: 'Feb', 3: 'Mar'} # --> {1: 'Jan', 2: 'Feb', 3: 'Mar'}
Errors
Python Error Messages: https://docs.python.org/3/library/exceptions.html
BaseExceptions:
+-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- ArithmeticError | +-- FloatingPointError | +-- OverflowError | +-- ZeroDivisionError +-- AssertionError +-- AttributeError +-- BufferError +-- EOFError +-- ImportError +-- LookupError | +-- IndexError | +-- KeyError +-- MemoryError +-- NameError | +-- UnboundLocalError +-- OSError | +-- BlockingIOError | +-- ChildProcessError | +-- ConnectionError | | +-- BrokenPipeError | | +-- ConnectionAbortedError | | +-- ConnectionRefusedError | | +-- ConnectionResetError | +-- FileExistsError | +-- FileNotFoundError | +-- InterruptedError | +-- IsADirectoryError | +-- NotADirectoryError | +-- PermissionError | +-- ProcessLookupError | +-- TimeoutError +-- ReferenceError +-- RuntimeError | +-- NotImplementedError +-- SyntaxError | +-- IndentationError | +-- TabError +-- SystemError +-- TypeError +-- ValueError | +-- UnicodeError | +-- UnicodeDecodeError | +-- UnicodeEncodeError | +-- UnicodeTranslateError +-- Warning +-- DeprecationWarning +-- PendingDeprecationWarning +-- RuntimeWarning +-- SyntaxWarning +-- UserWarning +-- FutureWarning +-- ImportWarning +-- UnicodeWarning +-- BytesWarning +-- ResourceWarning