Script to change all font sizes

Moderator: Kathy_9

Post Reply
bwernick
Posts: 11
Joined: Wed Feb 22, 2012 10:59 pm
operating_system: Windows XP Pro
System_Drive: C
32bit or 64bit: 32 Bit

Script to change all font sizes

Post by bwernick »

Hi Folks, I'm new to this forum and would appreciate some help.

How do I write a script to change the font sizes of ALL text in a vector layer?
teknisyan
Posts: 2421
Joined: Wed Oct 06, 2010 4:18 pm
operating_system: Windows 7 Home Premium
System_Drive: C
32bit or 64bit: 64 Bit
motherboard: Sony Corporation VAIO
processor: Intel Corel i5
ram: 4 GB
Video Card: ATI Mobility Radeon HD 5650
sound_card: Realtek HD Audio
Hard_Drive_Capacity: 500 GB
Location: Riyadh, KSA
Contact:

Re: Script to change all font sizes

Post by teknisyan »

What version of PSP are you using? Language use for PSP Scripts is Python though PSP API's are not available publicly, if you want to code your own scripts. You can however create a script on PSP by using the RECORDING feature of PSP.

Here's the code of a script that I recorded on PSP where you will change the font size of a text on a vector layer.

Code: Select all

from PSPApp import *

def ScriptProperties():
    return {
        'Author': u'',
        'Copyright': u'',
        'Description': u'',
        'Host': u'PaintShop Photo Pro',
        'Host Version': u'13.00 Alpha 00000000.0000000000.00'
        }

def Do(Environment):
    # EnableOptimizedScriptUndo
    App.Do( Environment, 'EnableOptimizedScriptUndo', {
            'GeneralSettings': {
                'ExecutionMode': App.Constants.ExecutionMode.Default, 
                'AutoActionMode': App.Constants.AutoActionMode.Match, 
                'Version': ((13,0,0),1)
                }
            })

    # Text
    App.Do( Environment, 'TextEx', {
            'Visibility': True, 
            'CreateAs': App.Constants.CreateAs.Vector, 
            'Start': (150,220), 
            'TextFlow': App.Constants.TextFlow.HorizontalDown, 
            'TextType': App.Constants.TextType.TextBase, 
            'Matrix': [
                1,
                0,
                0,
                0,
                1,
                0,
                0,
                0,
                1
            ], 
            'AutoKern': True, 
            'Kerning': 0, 
            'Tracking': 0, 
            'Leading': 0, 
            'Font': u'Waltograph', 
            'PointSize': 19, 
            'Italic': False, 
            'Bold': False, 
            'Underline': False, 
            'Strikethru': False, 
            'AntialiasStyle': App.Constants.AntialiasEx.Sharp, 
            'WarpText': True, 
            'SetText': App.Constants.Justify.Center, 
            'Fill': {
                'Color': (81,132,210), 
                'Pattern': None, 
                'Gradient': None, 
                'Texture': None, 
                'Art': None
                }, 
            'Stroke': {
                'Color': (64,64,64), 
                'Pattern': None, 
                'Gradient': None, 
                'Texture': None, 
                'Art': None
                }, 
            'LineWidth': 2, 
            'LineStyle': {
                'Name': u'', 
                'FirstCap': (u'Butt',0.25,0.25), 
                'LastCap': (u'Butt',0.25,0.25), 
                'FirstSegCap': (u'',0.25,0.25), 
                'LastSegCap': (u'',0.25,0.25), 
                'UseSegmentCaps': False, 
                'Segments': None
                }, 
            'Join': App.Constants.JointStyle.Miter, 
            'MiterLimit': 10, 
            'Characters': u'Test', 
            'Strings': None, 
            'TextTarget': (0,0,[1],True), 
            'PathTarget': None, 
            'GeneralSettings': {
                'ExecutionMode': App.Constants.ExecutionMode.Default, 
                'AutoActionMode': App.Constants.AutoActionMode.Match, 
                'Version': ((13,0,0),1)
                }
            })

To know more about the Script recording on PSP, you can visit http://pnoy.me/mG for more information on recording and saving a script on PSP X3, which is virtually the same process if you are using PSP X4.
Like reading blogs?
About Tech
About Sports
Pnoy.Me - A URL Shortener
Follow me on Facebook & Twitter
bwernick
Posts: 11
Joined: Wed Feb 22, 2012 10:59 pm
operating_system: Windows XP Pro
System_Drive: C
32bit or 64bit: 32 Bit

Re: Script to change all font sizes

Post by bwernick »

Hi

I'm using version X2 but I don't think that the version has any bearing on the question.

I can set record macro, manually select a text item and edit the size. Then view the recorded macro but this doesn't help to solve my problem.


What I want to do in the Python script is to search for all text to change attributes like font-size, color...

So the question is, how to find all text in a pspImage?
LeviFiction
Advisor
Posts: 6831
Joined: Thu Oct 02, 2008 1:07 pm
operating_system: Windows 10
System_Drive: C
32bit or 64bit: 64 Bit
motherboard: Alienware M17xR4
processor: Intel Core i7-3630QM CPU - 2_40GH
ram: 6 GB
Video Card: NVIDIA GeForce GTX 660M
sound_card: Sound Blaster Recon3Di
Hard_Drive_Capacity: 500GB
Corel programs: PSP: 8-2023
Location: USA

Re: Script to change all font sizes

Post by LeviFiction »

That's not altogether accurate Abiel. Corel published the APIs up through version X1. You just have to know where to look to download them.

Version number actually has a little to do with it as some commands or methods change between versions every so slightly. Though most of the base is the same so you're good with x2.

To get you started I recommend downloading the "Scripting for Script Authors" PDF guide which gives a good demonstration of moving through the layers of an image. The "Vector Merge Selected" script also gives a good example of how to tell if the currently selected vector is text, preset shape, or path.

And the API download shows you all of the commands and the parameters which really really helps.

I personally cannot tell you how to do this as I've never gone into a vector layer but all of the resources exist to help you figure it out. Or maybe one of our better scripters will be able to give you some information.

You can download them from here:

ftp://ftp.corel.com/pub/documentation/PSP/
https://levifiction.wordpress.com/
bwernick
Posts: 11
Joined: Wed Feb 22, 2012 10:59 pm
operating_system: Windows XP Pro
System_Drive: C
32bit or 64bit: 32 Bit

Re: Script to change all font sizes

Post by bwernick »

Thank you Levi, the downloads are very useful.

Now I am getting somewhere. The following script loops through the selected items and changes the font size.

Code: Select all

from PSPApp import *

def ScriptProperties():
  return {
    'Author': u'Bruce Wernick', 
    'Copyright': u'TechniSolve Software', 
    'Description': u'Change selected font sizes', 
    'Host': u'Paint Shop Pro Photo', 
    'Host Version': u'12.01'}

def Do(Environment):
  # EnableOptimizedScriptUndo
  App.Do( Environment, 'EnableOptimizedScriptUndo', {
    'GeneralSettings': {
    'ExecutionMode': App.Constants.ExecutionMode.Default, 
    'AutoActionMode': App.Constants.AutoActionMode.Match, 
    'Version': ((12,0,1),1) } })

  # Clear script output window
  App.Do( Environment, 'ScriptWndClear')

  # get list of selected vector objects
  SelectedText = App.Do( Environment, 'ReturnVectorObjectProperties' )
  
  if SelectedText['ListOfObjects'] == None:
    print 'No text selected...'
    return

  # Ask user for font size
  UserSize = App.Do( Environment, 'GetNumber', {
    'DefaultValue': 18,
    'MinValue': 6,
    'MaxValue': 90,
    'DialogTitle': 'Font Size',
    'GetInteger': App.Constants.Boolean.true,
    'LogarithmicSlider': App.Constants.Boolean.false,
    'Prompt': 'Enter font point size (6 to 90)',
    'GeneralSettings': {'ExecutionMode': App.Constants.ExecutionMode.Interactive}})
 
  if UserSize['OKButton']:
 
    # loop through selected text list
    for item in SelectedText['ListOfObjects']:
      
      # read the text data
      txt = item['TextExData']
      
      # only text data allowed
      if txt == None:
        continue
        
      # change the font point size
      txt['PointSize'] = UserSize['EnteredNumber']
      txt['Fill']['Color'] = (255, 0, 0) ## for example
      ##...
      txt['TextTarget'] = item['Path']  #Set text path to object we're changing

      # update the text
      App.Do( Environment, 'TextEx', txt )
    
  print 'Done...'
I include my demo to help people who are struggling with a similar problem.

Code: Select all

.
Last edited by bwernick on Tue Apr 17, 2012 7:12 am, edited 1 time in total.
Cassel
Posts: 1587
Joined: Fri Oct 29, 2010 6:49 pm
operating_system: Windows 10
System_Drive: C
32bit or 64bit: 64 Bit
ram: 16Gb
Corel programs: PSP 8 (JASC) to PSP 2023
Location: Canada
Contact:

Re: Script to change all font sizes

Post by Cassel »

ONe thing to remembe when working with text is that as soon as the point got added as a font size unit, this has caused major headaches in scripting. If you want a size 48 pixels, it might think 48 points which is totally different. Unfortunately, whether it decides to use the point or the pixel as a unit is often totally random. It is a real nightmare for scripting with the Text command.

There is no real solution to it (yet). Just wanted to warn you in case you get unexpected results, it is not your fault!
Cassel
https://creationcassel.com/store
Specializing in PSP specific products: scripts and tubes

https://scrapbookcampus.com
for beginner and seasoned scrappers and designers and other PSP users
LeviFiction
Advisor
Posts: 6831
Joined: Thu Oct 02, 2008 1:07 pm
operating_system: Windows 10
System_Drive: C
32bit or 64bit: 64 Bit
motherboard: Alienware M17xR4
processor: Intel Core i7-3630QM CPU - 2_40GH
ram: 6 GB
Video Card: NVIDIA GeForce GTX 660M
sound_card: Sound Blaster Recon3Di
Hard_Drive_Capacity: 500GB
Corel programs: PSP: 8-2023
Location: USA

Re: Script to change all font sizes

Post by LeviFiction »

Well, no good solution anyway. Cassel and I once worked out some code that would create a new text object, determine its size, and perform the necessary calculations to determine if PSP is currently in Point or Pixel mode. I don't remember where that one is anymore though. I would have to do some digging, but until then let me try to answer your question.

Question: What does "txt['TextTarget'] = (0,0, , True)" mean/do?

Well it's a navigation path to the object you're trying to reach with the TextEx command.

(0,0,,True)

The first option in the tuple moves up or down the level hierarchy (so if you wanted out of a group you'd move out using this one), the second moves up or down the current hierarchy, the third is a list that tells you where to move within the children of the currently selected layer group, and True means it has to match exactly. And so what your code is doing is it's selecting the first child in the current group and then moving up 1 child for each currently selected object.

No trouble if you have only text in the current vector layer and have them all selected but it messes up when you have three objects selected but the third child is not a text object or if you selected from the top down instead of from the bottom up. Or if you have children from multiple groups selected.

So, this requires that you know exactly where the text should be. If the text object already exists it'll change the values for that object. If it does not exist in that location it will create a new text object at that point.

Since this is relative to the first selected object. So what you need to do is grab the navigation path for each selected object. This is provided in the dictionary under the key 'Path.' So instead of iterating "i" and selecting the child from there just use the path that PSP has already figured out for you.

Code: Select all

txt['TextTarget'] = item['Path']
https://levifiction.wordpress.com/
bwernick
Posts: 11
Joined: Wed Feb 22, 2012 10:59 pm
operating_system: Windows XP Pro
System_Drive: C
32bit or 64bit: 32 Bit

Re: Script to change all font sizes

Post by bwernick »

OK, I see what you mean.

I removed the index and it does loop through the selected text.
But, it creates a copy.!!

Code: Select all

    # loop through selected text list
    for item in SelectedText['ListOfObjects']:

      txt = item['TextExData']
   
      # only text data allowed
      if txt == None:
        continue
        
      # change the font point size
      txt['PointSize'] = UserSize['EnteredNumber']
      txt['Fill']['Color'] = (255, 0, 0)
      #... and whatever else you want to change

      # update the text
      App.Do( Environment, 'TextEx', txt )
How do you replace the existing text?
bwernick
Posts: 11
Joined: Wed Feb 22, 2012 10:59 pm
operating_system: Windows XP Pro
System_Drive: C
32bit or 64bit: 32 Bit

Re: Script to change all font sizes

Post by bwernick »

Cassel wrote:If you want a size 48 pixels, it might think 48 points which is totally different...
There is no real solution to it (yet). Just wanted to warn you in case you get unexpected results
Thanks for pointing this out. :) I did notice in the editor that you could set points or pixels and figured out.
LeviFiction
Advisor
Posts: 6831
Joined: Thu Oct 02, 2008 1:07 pm
operating_system: Windows 10
System_Drive: C
32bit or 64bit: 64 Bit
motherboard: Alienware M17xR4
processor: Intel Core i7-3630QM CPU - 2_40GH
ram: 6 GB
Video Card: NVIDIA GeForce GTX 660M
sound_card: Sound Blaster Recon3Di
Hard_Drive_Capacity: 500GB
Corel programs: PSP: 8-2023
Location: USA

Re: Script to change all font sizes

Post by LeviFiction »

Haha, guess you miss understood but I already told you how.

The txt['TextTarget'] holds a path to the current object. By default this is set to None. If you don't set this value it just makes a new text object. If you want it to change a current object you need to set this value like you were.

But you have to make sure it's pointing to the right object.

Each vector object returned by "ReturnVectorObjectProperties" includes a path variable already. So what you need to do is set the txt['TextTarget'] value equal to this returned path. It's saved in the 'Path' key of the item object. So if you do say

print item['Path']

it'll print something like (0,1,[1],False).

Now I already gave you this code.

Code: Select all

txt['TargetText'] = item['Path']
Here you can see how it's used

Code: Select all

    # loop through selected text list
    for item in SelectedText['ListOfObjects']:

      txt = item['TextExData']
   
      # only text data allowed
      if txt == None:
        continue
        
      # change the font point size
      txt['PointSize'] = UserSize['EnteredNumber']
      txt['Fill']['Color'] = (255, 0, 0)
      txt['TextTarget'] = item['Path']  #Set text path to object we're changing
      #... and whatever else you want to change

      # update the text
      App.Do( Environment, 'TextEx', txt )
https://levifiction.wordpress.com/
bwernick
Posts: 11
Joined: Wed Feb 22, 2012 10:59 pm
operating_system: Windows XP Pro
System_Drive: C
32bit or 64bit: 32 Bit

Re: Script to change all font sizes

Post by bwernick »

Wow, it took me a long time to get my head around that one.

Thank you very much for your help, I doubt that I would have worked this out from the script writers guide alone. If you ask me, the script writers guide could do with a few more samples in vector processing.

I will correct my earlier listing...
Post Reply