Forum: Poser Python Scripting


Subject: How to change an Image_Source path

JimX opened this issue on Jun 15, 2023 ยท 9 posts


JimX posted Thu, 15 June 2023 at 11:13 PM

I am working on Materials. I have a particular node, and I have made inp the node's Image_Source input. When I execute:

   print(inp.Value() )

I get the full path to that image source. The value is just what I expected.

Now my question is how do I set that image source to a new, different path?


Y-Phil posted Fri, 16 June 2023 at 6:11 AM Online Now!

Have you tried inp.SetValue(".....")? just be careful with the file path separator

๐’ซ๐’ฝ๐“Ž๐“


(ใฃโ—”โ—กโ—”)ใฃ

๐Ÿ‘ฟ Win11 on i9-13900K@5GHz, 64GB, RoG Strix B760F Gamng, Asus Tuf Gaming RTX 4070 OC Edition, 1 TB SSD, 6+4+8TB HD
๐Ÿ‘ฟ Mac Mini M2, 16GB, 500GB SSD
๐Ÿ‘ฟ Nas 10TB
๐Ÿ‘ฟ Poser 13 and soon 14 โค๏ธ


JimX posted Fri, 16 June 2023 at 10:29 AM

Thanks Y-Phil. Your caution about file path separators is important. I have been using os.path.join() to make sure that the separators are correct.

I had been using inp.SetString(".....") to set the value, as the documentation that I have does not mention any inp.SetValue. I had been looking for something like that. However, when I tried the SetValue() method, I got the error:

Traceback (most recent call last):

  File "/Users/jim/Library/Mobile Documents/com~apple~CloudDocs/Documents/Docs/Tech/Poser/Vic 4/Runtime/python/InTest.py", line 59, in <module>

    inp.SetValue(newFullPath)

AttributeError: 'poser.ShaderNodeInputType' object has no attribute 'SetValue'

So apparently, SetValue() doesn't exist on my version of Poser Python, which is in Poser 12 running on a Mac.

My problem with SetString() is that I get inconsistent results. Sometimes I even reboot and run the script again, and it comes out differently. There are two inconsistencies:

1. Sometimes the new string that is set into the Image_Source is the correct complete string. Sometimes it is just the file name, with all of the leading folders stripped off.

2. Sometimes the Image_Source data is updated. But more frequently the data is not actually updated at all-- so I do not effect any change.

------------

The context may be contributing to the confusion. I created a Python folder in my main runtime (not the one and the same folder as the app). I put this script in that folder. I then call the script from a specially-created shell .mt5 or .mc6 file. When I double-click on that materials file in the Poser library panel, it loads and the script is called.

What I am trying to do is to change the texture map without changing the transparency map. Or, alternatively, to change the transparency map without changing the texture map.

I have actually gotten this to execute correctly with an .mt5 file. So I have my hopes up that I may be getting close. But the script only if I have the Preview material selected (or, if I am in the Pose room, I respond to Poser's dialog box by saying 'Apply to Preview Material'). If I have the actual material to be changed selected, it does not change the Image_Source data. Frustrating, but at least I have detected a pattern there.

I have not yet gotten it to work at all from a similarly constructed shell .mc6 file.

----------

Any more ideas?






Y-Phil posted Fri, 16 June 2023 at 12:03 PM Online Now!

From what I understand: SetString(...) is indeed the path to go.
I would say: if it works some times and fails at other times: is your path an absolute one?
I mean: on windows platforms, an absolute path starts by something like C:\... or a net path, such as \\my_server\my_folder\...
On Mac platforms, if I'm not wrong, an absolute path starts by "/".
If you edit an MT5 file or an MC6 file, using a simple text editor, you should be able to retrieve how Poser stores that absolute path.

๐’ซ๐’ฝ๐“Ž๐“


(ใฃโ—”โ—กโ—”)ใฃ

๐Ÿ‘ฟ Win11 on i9-13900K@5GHz, 64GB, RoG Strix B760F Gamng, Asus Tuf Gaming RTX 4070 OC Edition, 1 TB SSD, 6+4+8TB HD
๐Ÿ‘ฟ Mac Mini M2, 16GB, 500GB SSD
๐Ÿ‘ฟ Nas 10TB
๐Ÿ‘ฟ Poser 13 and soon 14 โค๏ธ


JimX posted Fri, 16 June 2023 at 12:57 PM

Actually, I've got a lot of print statements in the code, for debugging purposes. Here are the results from one run:


Old path: /Users/jim/Library/Mobile Documents/com~apple~CloudDocs/Documents/Docs/Tech/Poser/Vic 4/Runtime/textures/KozHair/PonyTailHair/KptTailTXblack.jpg

New path: /Users/jim/Library/Mobile Documents/com~apple~CloudDocs/Documents/Docs/Tech/Poser/Vic 4/runtime/textures/KozHair/PonyTailHair/KptTailTXblond.jpg

ext name: PoserSurface int name: PoserSurface type: poser

ext name: Color_Texture int name: Image_Map type: image_map

Pre Path: /Users/jim/Library/Mobile Documents/com~apple~CloudDocs/Documents/Docs/Tech/Poser/Vic 4/Runtime/textures/KozHair/PonyTailHair/KptTailTXblack.jpg

Aft path: /KptTailTXblond.jpg

ext name: Transparency_Map int name: Image_Map_3 type: image_map

Pre Path: /Users/jim/Library/Mobile Documents/com~apple~CloudDocs/Documents/Docs/Tech/Poser/Vic 4/Runtime/textures/KozHair/PonyTailHair/KptTailTR.jpg

Aft path: /Users/jim/Library/Mobile Documents/com~apple~CloudDocs/Documents/Docs/Tech/Poser/Vic 4/Runtime/textures/KozHair/PonyTailHair/KptTailTR.jpg


(You may have to go to Full Screen for those long lines to make much sense)

The first line ("Old path:....") is what I am looking to change. It is in a local string property called oldFullPath.

The second line (" New path:....") is the value that I am trying to insert into the Image_Source data. It is in a local string property called newFullPath.

The third and fourth (and seventh) lines are just to make sure I am going where I was intending, as I looped through the Shader Nodes.

The fifth line is just print(inp.Value) ). It shows what was in the Image_Source before I did anything. One important thing is that it matches oldFullPath.

Then I executed:

if inp.Value() == oldFullPath:
inp.SetString(newFullPath)

The sixth line is the result of:

print('Aft path:', inp.Value() )

after having executed the inp.SetString(newFullPath) statement. This is one of those cases where Poser (or Python) also stripped off all of the leading folders.

The eighth and ninth lines are the Before & After for the next node I found. Since the Before path was not the same as the path I was looking for (oldFullPath), the Image_Source data was not changed. This is exactly what I intended.


By the way, I checked in Poser's Material Room after having run the script. The Image_Source data in the Shader Node that referenced the texture map that I was trying to change was still what it had been before executing the script. So even thought the inp.Value() seemed to have changed while running the script, the change did not stick.


If you have any ideas for where to go next, they would be most appreciated.

  - JimX


JimX posted Fri, 16 June 2023 at 3:40 PM

Progress!

I got to wondering whether we were looking in the right place for the problem. The observation that the .mt5 hack only worked when the Preview material was selected gave me a clue. I had put the Python calls in the .mc6 files within each material section. I changed the .mt6 files so that all the Python calls for all the materials were in the Preview material section, and I eliminated all the other material sections.

It worked!

Problem solved. And (at least in the end), it wasn't a Python problem.


Y-Phil posted Tue, 20 June 2023 at 2:58 AM Online Now!

Great 

๐’ซ๐’ฝ๐“Ž๐“


(ใฃโ—”โ—กโ—”)ใฃ

๐Ÿ‘ฟ Win11 on i9-13900K@5GHz, 64GB, RoG Strix B760F Gamng, Asus Tuf Gaming RTX 4070 OC Edition, 1 TB SSD, 6+4+8TB HD
๐Ÿ‘ฟ Mac Mini M2, 16GB, 500GB SSD
๐Ÿ‘ฟ Nas 10TB
๐Ÿ‘ฟ Poser 13 and soon 14 โค๏ธ


JimX posted Fri, 23 June 2023 at 6:38 PM

With some wonderful help from Y-Phil, the solution is now tested and working on Mac and Windows, with Poser 11, 12 and 13, and so with both Python 2 and 3.

If anyone is interested in checking it out in earlier version of Poser, I have uploaded the scripts to Free Stuff, and called it "Load Specific Map." If you do, it would be nice if you would leave a comment about your results.


Y-Phil posted Sat, 24 June 2023 at 7:22 AM Online Now!

JimX posted at 6:38 PM Fri, 23 June 2023 - #4468527

With some wonderful help from Y-Phil, the solution is now tested and working on Mac and Windows, with Poser 11, 12 and 13, and so with both Python 2 and 3.

If anyone is interested in checking it out in earlier version of Poser, I have uploaded the scripts to Free Stuff, and called it "Load Specific Map." If you do, it would be nice if you would leave a comment about your results.

Read your mail: I've found a solution for the space in file names 

๐’ซ๐’ฝ๐“Ž๐“


(ใฃโ—”โ—กโ—”)ใฃ

๐Ÿ‘ฟ Win11 on i9-13900K@5GHz, 64GB, RoG Strix B760F Gamng, Asus Tuf Gaming RTX 4070 OC Edition, 1 TB SSD, 6+4+8TB HD
๐Ÿ‘ฟ Mac Mini M2, 16GB, 500GB SSD
๐Ÿ‘ฟ Nas 10TB
๐Ÿ‘ฟ Poser 13 and soon 14 โค๏ธ