Re: fastest way through script to get all parameters in a scene of certain value?
sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.comwrote: The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: ** ** // Jscript main(); ** ** function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } ** ** ** ** If the parameters you are attempting to modify have a large degree of consistency in name and location, you can use some of Softimage’s wildcards to find them faster: ** ** var oParameters = XSIFactory.CreateActiveXObject( “XSI.Collection” ); oParameters.Unique = true; ** ** // Get viewvis and rendvis parameters of the visibility property on each X3DObject oParameters.items = “*.visibility.{viewvis,rendvis}”; ** ** LogMessage( oParameters.Count ); ** ** If there is a large degree of consistency in the parameter fullname, you can apply values to the parameters en masse very efficiently: ** ** SetValue( “*.visibility.{viewvis,rendvis}, false ); ** ** ** ** Matt ** ** ** ** ** ** ** ** *From:* softimage-boun...@listproc.autodesk.com [mailto: softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde *Sent:* Wednesday, February 27, 2013 9:55 PM *To:* softimage *Subject:* Re: fastest way through script to get all parameters in a scene of certain value? ** ** better stated: certain parameter name, not value, apologies, running behind on sleep, words are challenging. On Feb 27, 2013 7:54 PM, Enoch Ihde emi...@gmail.com wrote: these are the three methods i've tried. using tags is the fastest, but a little prohibitive, as you have to have anticipated needing to get a param quickly, so it must be tagged in advance. also, even with getting by tags, performance imo is pretty poor. results on my machine from the code below: # INFO : object count is 3618 # INFO : 0.788785183814 # INFO : tagged param count is 3618 # INFO : 2.12563553863 # INFO : 7.84713397563 is there a better way? snip import time import win32com.client xsi= win32com.client.Dispatch( XSI.Application ).Application xsiPrint = xsi.LogMessage from win32com.client import constants as c items = xsi.ActiveSceneRoot.FindChildren2() # this bit is really slow for item in items: xsi.Tag(item.fullname + '.visibility.viewvis', c.siTag1) xsiPrint('object count is ' + str(items.count)) and only needs to be run once t = time.clock() val = xsi.ActiveSceneRoot.TaggedParameters(c.siTag1, False) for v in val: someStuff = v.value xsiPrint(time.clock() - t) xsiPrint('tagged param count is ' + str(val.count)) t = time.clock() for obj in items: vis = obj.GetPropertyFromName2(Visibility) v = vis.viewvis.value xsiPrint(time.clock() - t) t = time.clock() for obj in items: vis = obj.Properties('visibility').Parameters('viewvis').value xsiPrint(time.clock() - t) /snip tia, enoch
Re: fastest way through script to get all parameters in a scene of certain value?
What if you use list comprehensions? coll = XSIFactory.CreateObject('XSI.Collection') coll.SetAsText('*.visibility.*') valueDict = dict([(x.FullName,x.Value) for x in coll])print valueDict On Thu, Feb 28, 2013 at 12:59 PM, Enoch Ihde emi...@gmail.com wrote: sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.comwrote: The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: ** ** // Jscript main(); ** ** function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } ** ** ** ** If the parameters you are attempting to modify have a large degree of consistency in name and location, you can use some of Softimage’s wildcards to find them faster: ** ** var oParameters = XSIFactory.CreateActiveXObject( “XSI.Collection” ); oParameters.Unique = true; ** ** // Get viewvis and rendvis parameters of the visibility property on each X3DObject oParameters.items = “*.visibility.{viewvis,rendvis}”; ** ** LogMessage( oParameters.Count ); ** ** If there is a large degree of consistency in the parameter fullname, you can apply values to the parameters en masse very efficiently: ** ** SetValue( “*.visibility.{viewvis,rendvis}, false ); ** ** ** ** Matt ** ** ** ** ** ** ** ** *From:* softimage-boun...@listproc.autodesk.com [mailto: softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde *Sent:* Wednesday, February 27, 2013 9:55 PM *To:* softimage *Subject:* Re: fastest way through script to get all parameters in a scene of certain value? ** ** better stated: certain parameter name, not value, apologies, running behind on sleep, words are challenging. On Feb 27, 2013 7:54 PM, Enoch Ihde emi...@gmail.com wrote: these are the three methods i've tried. using tags is the fastest, but a little prohibitive, as you have to have anticipated needing to get a param quickly, so it must be tagged in advance. also, even with getting by tags, performance imo is pretty poor. results on my machine from the code below: # INFO : object count is 3618 # INFO : 0.788785183814 # INFO : tagged param count is 3618 # INFO : 2.12563553863 # INFO : 7.84713397563 is there a better way? snip import time import win32com.client xsi= win32com.client.Dispatch( XSI.Application ).Application xsiPrint = xsi.LogMessage from win32com.client import constants as c items = xsi.ActiveSceneRoot.FindChildren2() # this bit is really slow for item in items: xsi.Tag(item.fullname + '.visibility.viewvis', c.siTag1) xsiPrint('object count is ' + str(items.count)) and only needs to be run once t = time.clock() val = xsi.ActiveSceneRoot.TaggedParameters(c.siTag1, False) for v in val: someStuff = v.value xsiPrint(time.clock() - t) xsiPrint('tagged param count is ' + str(val.count)) t = time.clock() for obj in items: vis = obj.GetPropertyFromName2(Visibility) v = vis.viewvis.value xsiPrint(time.clock() - t) t = time.clock() for obj in items: vis = obj.Properties('visibility').Parameters('viewvis').value*** * xsiPrint(time.clock() - t) /snip tia, enoch
Re: fastest way through script to get all parameters in a scene of certain value?
Actually, it'll be faster if we change the [] to a () so it's a generator instead of a full loop. My bad. I need coffee. coll = XSIFactory.CreateObject('XSI.Collection') coll.SetAsText('*.visibility.*') valueDict = dict(((x.FullName,x.Value) for x in coll))print valueDict On Thu, Feb 28, 2013 at 1:20 PM, Alan Fregtman alan.fregt...@gmail.comwrote: What if you use list comprehensions? coll = XSIFactory.CreateObject('XSI.Collection') coll.SetAsText('*.visibility.*') valueDict = dict([(x.FullName,x.Value) for x in coll])print valueDict On Thu, Feb 28, 2013 at 12:59 PM, Enoch Ihde emi...@gmail.com wrote: sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.comwrote: The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: ** ** // Jscript main(); ** ** function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } ** ** ** ** If the parameters you are attempting to modify have a large degree of consistency in name and location, you can use some of Softimage’s wildcards to find them faster: ** ** var oParameters = XSIFactory.CreateActiveXObject( “XSI.Collection” );*** * oParameters.Unique = true; ** ** // Get viewvis and rendvis parameters of the visibility property on each X3DObject oParameters.items = “*.visibility.{viewvis,rendvis}”; ** ** LogMessage( oParameters.Count ); ** ** If there is a large degree of consistency in the parameter fullname, you can apply values to the parameters en masse very efficiently: ** ** SetValue( “*.visibility.{viewvis,rendvis}, false ); ** ** ** ** Matt ** ** ** ** ** ** ** ** *From:* softimage-boun...@listproc.autodesk.com [mailto: softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde *Sent:* Wednesday, February 27, 2013 9:55 PM *To:* softimage *Subject:* Re: fastest way through script to get all parameters in a scene of certain value? ** ** better stated: certain parameter name, not value, apologies, running behind on sleep, words are challenging. On Feb 27, 2013 7:54 PM, Enoch Ihde emi...@gmail.com wrote: these are the three methods i've tried. using tags is the fastest, but a little prohibitive, as you have to have anticipated needing to get a param quickly, so it must be tagged in advance. also, even with getting by tags, performance imo is pretty poor. results on my machine from the code below: # INFO : object count is 3618 # INFO : 0.788785183814 # INFO : tagged param count is 3618 # INFO : 2.12563553863 # INFO : 7.84713397563 is there a better way? snip import time import win32com.client xsi= win32com.client.Dispatch( XSI.Application ).Application xsiPrint = xsi.LogMessage from win32com.client import constants as c items = xsi.ActiveSceneRoot.FindChildren2() # this bit is really slow for item in items: xsi.Tag(item.fullname + '.visibility.viewvis', c.siTag1) xsiPrint('object count is ' + str(items.count)) and only needs to be run once t = time.clock() val = xsi.ActiveSceneRoot.TaggedParameters(c.siTag1, False) for v in val: someStuff = v.value xsiPrint(time.clock() - t) xsiPrint('tagged param count is ' + str(val.count)) t = time.clock() for obj in items: vis = obj.GetPropertyFromName2(Visibility) v = vis.viewvis.value xsiPrint(time.clock() - t) t = time.clock() for obj in items: vis = obj.Properties('visibility').Parameters('viewvis').value** ** xsiPrint(time.clock() - t) /snip tia, enoch
Re: fastest way through script to get all parameters in a scene of certain value?
ya, geeze alan... what were you thinking! On Thu, Feb 28, 2013 at 1:43 PM, Alan Fregtman alan.fregt...@gmail.comwrote: Actually, it'll be faster if we change the [] to a () so it's a generator instead of a full loop. My bad. I need coffee. coll = XSIFactory.CreateObject('XSI.Collection') coll.SetAsText('*.visibility.*') valueDict = dict(((x.FullName,x.Value) for x in coll))print valueDict On Thu, Feb 28, 2013 at 1:20 PM, Alan Fregtman alan.fregt...@gmail.comwrote: What if you use list comprehensions? coll = XSIFactory.CreateObject('XSI.Collection') coll.SetAsText('*.visibility.*') valueDict = dict([(x.FullName,x.Value) for x in coll])print valueDict On Thu, Feb 28, 2013 at 12:59 PM, Enoch Ihde emi...@gmail.com wrote: sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.comwrote: The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: ** ** // Jscript main(); ** ** function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } ** ** ** ** If the parameters you are attempting to modify have a large degree of consistency in name and location, you can use some of Softimage’s wildcards to find them faster: ** ** var oParameters = XSIFactory.CreateActiveXObject( “XSI.Collection” );** ** oParameters.Unique = true; ** ** // Get viewvis and rendvis parameters of the visibility property on each X3DObject oParameters.items = “*.visibility.{viewvis,rendvis}”; ** ** LogMessage( oParameters.Count ); ** ** If there is a large degree of consistency in the parameter fullname, you can apply values to the parameters en masse very efficiently: ** ** SetValue( “*.visibility.{viewvis,rendvis}, false );*** * ** ** ** ** Matt ** ** ** ** ** ** ** ** *From:* softimage-boun...@listproc.autodesk.com [mailto: softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde *Sent:* Wednesday, February 27, 2013 9:55 PM *To:* softimage *Subject:* Re: fastest way through script to get all parameters in a scene of certain value? ** ** better stated: certain parameter name, not value, apologies, running behind on sleep, words are challenging. On Feb 27, 2013 7:54 PM, Enoch Ihde emi...@gmail.com wrote: these are the three methods i've tried. using tags is the fastest, but a little prohibitive, as you have to have anticipated needing to get a param quickly, so it must be tagged in advance. also, even with getting by tags, performance imo is pretty poor. results on my machine from the code below: # INFO : object count is 3618 # INFO : 0.788785183814 # INFO : tagged param count is 3618 # INFO : 2.12563553863 # INFO : 7.84713397563 is there a better way? snip import time import win32com.client xsi= win32com.client.Dispatch( XSI.Application ).Application xsiPrint = xsi.LogMessage from win32com.client import constants as c items = xsi.ActiveSceneRoot.FindChildren2() # this bit is really slow for item in items: xsi.Tag(item.fullname + '.visibility.viewvis', c.siTag1) xsiPrint('object count is ' + str(items.count)) and only needs to be run once t = time.clock() val = xsi.ActiveSceneRoot.TaggedParameters(c.siTag1, False) for v in val: someStuff = v.value xsiPrint(time.clock() - t) xsiPrint('tagged param count is ' + str(val.count)) t = time.clock() for obj in items: vis = obj.GetPropertyFromName2(Visibility) v = vis.viewvis.value xsiPrint(time.clock() - t) t = time.clock() for obj in items: vis =
RE: fastest way through script to get all parameters in a scene of certain value?
Retrieving the value is the same. If you use the object model you'll have direct access to the parameter whether it's the tag or the value. Just switch oParameter.Tags with oParameter.value in my example and you have your answer. If you're looking to retrieve a specific value, or parameters with a common value, then you have no choice but to loop through all of them and do comparisons to find what you're looking for. In your case using the other notation with wildcards is only useful if you're setting a set of parameters to a common value. Matt From: softimage-boun...@listproc.autodesk.com [mailto:softimage-boun...@listproc.autodesk.com] On Behalf Of Enoch Ihde Sent: Thursday, February 28, 2013 10:00 AM To: softimage Subject: Re: fastest way through script to get all parameters in a scene of certain value? sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.commailto:ml...@carbinestudios.com wrote: The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: // Jscript main(); function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } If the parameters you are attempting to modify have a large degree of consistency in name and location, you can use some of Softimage's wildcards to find them faster: var oParameters = XSIFactory.CreateActiveXObject( XSI.Collection ); oParameters.Unique = true; // Get viewvis and rendvis parameters of the visibility property on each X3DObject oParameters.items = *.visibility.{viewvis,rendvis}; LogMessage( oParameters.Count ); If there is a large degree of consistency in the parameter fullname, you can apply values to the parameters en masse very efficiently: SetValue( *.visibility.{viewvis,rendvis}, false ); Matt From: softimage-boun...@listproc.autodesk.commailto:softimage-boun...@listproc.autodesk.com [mailto:softimage-boun...@listproc.autodesk.commailto:softimage-boun...@listproc.autodesk.com] On Behalf Of Enoch Ihde Sent: Wednesday, February 27, 2013 9:55 PM To: softimage Subject: Re: fastest way through script to get all parameters in a scene of certain value? better stated: certain parameter name, not value, apologies, running behind on sleep, words are challenging. On Feb 27, 2013 7:54 PM, Enoch Ihde emi...@gmail.commailto:emi...@gmail.com wrote: these are the three methods i've tried. using tags is the fastest, but a little prohibitive, as you have to have anticipated needing to get a param quickly, so it must be tagged in advance. also, even with getting by tags, performance imo is pretty poor. results on my machine from the code below: # INFO : object count is 3618 # INFO : 0.788785183814 # INFO : tagged param count is 3618 # INFO : 2.12563553863 # INFO : 7.84713397563 is there a better way? snip import time import win32com.client xsi= win32com.client.Dispatch( XSI.Application ).Application xsiPrint = xsi.LogMessage from win32com.client import constants as c items = xsi.ActiveSceneRoot.FindChildren2() # this bit is really slow for item in items: xsi.Tag(item.fullname + '.visibility.viewvis', c.siTag1) xsiPrint('object count is ' + str(items.count)) and only needs to be run once t = time.clock() val = xsi.ActiveSceneRoot.TaggedParameters(c.siTag1, False) for v in val: someStuff = v.value xsiPrint(time.clock() - t) xsiPrint('tagged param count is ' + str(val.count)) t = time.clock() for obj in items: vis = obj.GetPropertyFromName2(Visibility) v = vis.viewvis.value xsiPrint(time.clock() - t) t = time.clock() for obj in items: vis = obj.Properties('visibility').Parameters('viewvis').value xsiPrint(time.clock() - t) /snip tia, enoch
Re: fastest way through script to get all parameters in a scene of certain value?
Hey Enoch, unless I missed something, the way you're doing is already the fastest on my machine... for reference: # INFO : tag operation1 (tag): 2.13486326588 # INFO : tag operation2 (tag+): 18.2174550721 # INFO : tag operation3 (OM): 18.2086833524 # INFO : get operation1 (tagparams): 0.452397979784 4204 # INFO : get operation2 (xsicoll): 7.46562998296 4204 import time from win32com.client import constants class Softimage: __getattr__ = lambda x, a: getattr(Application, a, False) or getattr(constants, a) softimage = Softimage() softimage.factory = XSIFactory softimage.message = lambda x, *args: softimage.LogMessage(str(x).format(*args)) softimage.SetUserPref(SCR_CMDLOG_ENABLED, False) items = softimage.ActiveSceneRoot.FindChildren2() t = time.clock() parameters = [{0}.visibility.viewvis.format(x) for x in items] softimage.Tag(parameters, softimage.siTag1) softimage.message(tag operation1 (tag): {0}, time.clock() - t) t = time.clock() for item in items: softimage.Tag(item.FullName + '.visibility.viewvis', softimage.siTag1) softimage.message(tag operation2 (tag+): {0}, time.clock() - t) t = time.clock() tag1 = softimage.siTag1 parameters = (x.Properties(visibility).Parameters(viewvis) for x in items) for parameter in parameters: parameter.Tags |= tag1 softimage.message(tag operation3 (OM): {0}, time.clock() - t) t = time.clock() params = softimage.ActiveSceneRoot.TaggedParameters(softimage.siTag1) softimage.message(get operation1 (tagparams): {0} {1}, time.clock() - t, params.Count) t = time.clock() parameters = softimage.factory.CreateObject(XSI.Collection) parameters.SetAsText(*.visibility.viewvis) parameters = [x for x in parameters if x.Tags softimage.siTag1] softimage.message(get operation2 (xsicoll): {0} {1}, time.clock() - t, len(parameters)) parameters = (x.Properties(visibility).Parameters(viewvis) for x in items) for param in parameters: param.Tags = ~softimage.siTag1 2013/2/28 Matt Lind ml...@carbinestudios.com Retrieving the value is the same. If you use the object model you’ll have direct access to the parameter whether it’s the tag or the value. Just switch “oParameter.Tags” with “oParameter.value” in my example and you have your answer. ** ** If you’re looking to retrieve a specific value, or parameters with a common value, then you have no choice but to loop through all of them and do comparisons to find what you’re looking for. In your case using the other notation with wildcards is only useful if you’re setting a set of parameters to a common value. ** ** ** ** Matt ** ** ** ** *From:* softimage-boun...@listproc.autodesk.com [mailto: softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde *Sent:* Thursday, February 28, 2013 10:00 AM *To:* softimage *Subject:* Re: fastest way through script to get all parameters in a scene of certain value? ** ** sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. ** ** ** ** On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.com wrote: The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: // Jscript main(); function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } If the parameters you are attempting to modify have a large degree of consistency in name and location, you can use some of Softimage’s wildcards to find them faster: var oParameters = XSIFactory.CreateActiveXObject( “XSI.Collection” ); oParameters.Unique = true; // Get viewvis and rendvis parameters of the visibility property on each X3DObject oParameters.items =
RE: fastest way through script to get all parameters in a scene of certain value?
Interesting how much choice of language affects performance. In your tests the Object model has the same runtime as calling commands. On my computer using Jscript, the object model is at least 4x faster than calling Tag() command. Matt From: softimage-boun...@listproc.autodesk.com [mailto:softimage-boun...@listproc.autodesk.com] On Behalf Of jo benayoun Sent: Thursday, February 28, 2013 2:49 PM To: softimage@listproc.autodesk.com Subject: Re: fastest way through script to get all parameters in a scene of certain value? Hey Enoch, unless I missed something, the way you're doing is already the fastest on my machine... for reference: # INFO : tag operation1 (tag): 2.13486326588 # INFO : tag operation2 (tag+): 18.2174550721 # INFO : tag operation3 (OM): 18.2086833524 # INFO : get operation1 (tagparams): 0.452397979784 4204 # INFO : get operation2 (xsicoll): 7.46562998296 4204 import time from win32com.client import constants class Softimage: __getattr__ = lambda x, a: getattr(Application, a, False) or getattr(constants, a) softimage = Softimage() softimage.factory = XSIFactory softimage.message = lambda x, *args: softimage.LogMessage(str(x).format(*args)) softimage.SetUserPref(SCR_CMDLOG_ENABLED, False) items = softimage.ActiveSceneRoot.FindChildren2() t = time.clock() parameters = [{0}.visibility.viewvis.format(x) for x in items] softimage.Tag(parameters, softimage.siTag1) softimage.message(tag operation1 (tag): {0}, time.clock() - t) t = time.clock() for item in items: softimage.Tag(item.FullName + '.visibility.viewvis', softimage.siTag1) softimage.message(tag operation2 (tag+): {0}, time.clock() - t) t = time.clock() tag1 = softimage.siTag1 parameters = (x.Properties(visibility).Parameters(viewvis) for x in items) for parameter in parameters: parameter.Tags |= tag1 softimage.message(tag operation3 (OM): {0}, time.clock() - t) t = time.clock() params = softimage.ActiveSceneRoot.TaggedParameters(softimage.siTag1) softimage.message(get operation1 (tagparams): {0} {1}, time.clock() - t, params.Count) t = time.clock() parameters = softimage.factory.CreateObject(XSI.Collection) parameters.SetAsText(*.visibility.viewvis) parameters = [x for x in parameters if x.Tags softimage.siTag1] softimage.message(get operation2 (xsicoll): {0} {1}, time.clock() - t, len(parameters)) parameters = (x.Properties(visibility).Parameters(viewvis) for x in items) for param in parameters: param.Tags = ~softimage.siTag1 2013/2/28 Matt Lind ml...@carbinestudios.commailto:ml...@carbinestudios.com Retrieving the value is the same. If you use the object model you'll have direct access to the parameter whether it's the tag or the value. Just switch oParameter.Tags with oParameter.value in my example and you have your answer. If you're looking to retrieve a specific value, or parameters with a common value, then you have no choice but to loop through all of them and do comparisons to find what you're looking for. In your case using the other notation with wildcards is only useful if you're setting a set of parameters to a common value. Matt From: softimage-boun...@listproc.autodesk.commailto:softimage-boun...@listproc.autodesk.com [mailto:softimage-boun...@listproc.autodesk.commailto:softimage-boun...@listproc.autodesk.com] On Behalf Of Enoch Ihde Sent: Thursday, February 28, 2013 10:00 AM To: softimage Subject: Re: fastest way through script to get all parameters in a scene of certain value? sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.commailto:ml...@carbinestudios.com wrote: The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: // Jscript main(); function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } If the parameters you are attempting to modify have a large degree of consistency in name and
Re: fastest way through script to get all parameters in a scene of certain value?
I suspect it to be the runtime dispatching and attribute access (dictionary lookups) cost... Tho the Tag command allow us to pass a collection instead of giving sequentially items, this resulting in a great improvement. -- jon 2013/2/28 Matt Lind ml...@carbinestudios.com Interesting how much choice of language affects performance. ** ** In your tests the Object model has the same runtime as calling commands. On my computer using Jscript, the object model is at least 4x faster than calling Tag() command. ** ** ** ** Matt ** ** ** ** ** ** ** ** *From:* softimage-boun...@listproc.autodesk.com [mailto: softimage-boun...@listproc.autodesk.com] *On Behalf Of *jo benayoun *Sent:* Thursday, February 28, 2013 2:49 PM *To:* softimage@listproc.autodesk.com *Subject:* Re: fastest way through script to get all parameters in a scene of certain value? ** ** Hey Enoch, unless I missed something, the way you're doing is already the fastest on my machine... ** ** ** ** for reference: ** ** # INFO : tag operation1 (tag): 2.13486326588 # INFO : tag operation2 (tag+): 18.2174550721 # INFO : tag operation3 (OM): 18.2086833524 # INFO : get operation1 (tagparams): 0.452397979784 4204 # INFO : get operation2 (xsicoll): 7.46562998296 4204 ** ** ** ** import time from win32com.client import constants class Softimage: __getattr__ = lambda x, a: getattr(Application, a, False) or getattr(constants, a) softimage = Softimage() softimage.factory = XSIFactory softimage.message = lambda x, *args: softimage.LogMessage(str(x).format(*args)) softimage.SetUserPref(SCR_CMDLOG_ENABLED, False) items = softimage.ActiveSceneRoot.FindChildren2() ** ** ** ** t = time.clock() parameters = [{0}.visibility.viewvis.format(x) for x in items] softimage.Tag(parameters, softimage.siTag1) softimage.message(tag operation1 (tag): {0}, time.clock() - t) ** ** t = time.clock() for item in items: softimage.Tag(item.FullName + '.visibility.viewvis', softimage.siTag1) softimage.message(tag operation2 (tag+): {0}, time.clock() - t) ** ** t = time.clock() tag1 = softimage.siTag1 parameters = (x.Properties(visibility).Parameters(viewvis) for x in items) for parameter in parameters: parameter.Tags |= tag1 softimage.message(tag operation3 (OM): {0}, time.clock() - t) ** ** t = time.clock() params = softimage.ActiveSceneRoot.TaggedParameters(softimage.siTag1) softimage.message(get operation1 (tagparams): {0} {1}, time.clock() - t, params.Count) ** ** t = time.clock() parameters = softimage.factory.CreateObject(XSI.Collection) parameters.SetAsText(*.visibility.viewvis) parameters = [x for x in parameters if x.Tags softimage.siTag1] softimage.message(get operation2 (xsicoll): {0} {1}, time.clock() - t, len(parameters)) ** ** parameters = (x.Properties(visibility).Parameters(viewvis) for x in items) for param in parameters: param.Tags = ~softimage.siTag1 ** ** ** ** ** ** ** ** ** ** ** ** 2013/2/28 Matt Lind ml...@carbinestudios.com Retrieving the value is the same. If you use the object model you’ll have direct access to the parameter whether it’s the tag or the value. Just switch “oParameter.Tags” with “oParameter.value” in my example and you have your answer. If you’re looking to retrieve a specific value, or parameters with a common value, then you have no choice but to loop through all of them and do comparisons to find what you’re looking for. In your case using the other notation with wildcards is only useful if you’re setting a set of parameters to a common value. Matt *From:* softimage-boun...@listproc.autodesk.com [mailto: softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde *Sent:* Thursday, February 28, 2013 10:00 AM *To:* softimage *Subject:* Re: fastest way through script to get all parameters in a scene of certain value? sorry, i wasn't really clear. i'm aware the tagging bit was slow, i couldn't be bothered to tag it object modelwise. i'm referring only to the value retrieval of the parameter. not the setup time. again: # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by tag # INFO : 2.12563553863 seconds --- accesssing 3618 parameters's values by GetPropertyFromName2(propertyname).Parameters(paramname) # INFO : 7.84713397563 accessing 3618 parameter's values by Property(propertyname).Parameters(paramname) tagging is by far the fastest, but in imo, is unacceptably slow. compare that to a method such as IsSelected(), getting a report on a large number of objects is negligible. On Wed, Feb 27, 2013 at 10:29
Re: fastest way through script to get all parameters in a scene of certain value?
better stated: certain parameter name, not value, apologies, running behind on sleep, words are challenging. On Feb 27, 2013 7:54 PM, Enoch Ihde emi...@gmail.com wrote: these are the three methods i've tried. using tags is the fastest, but a little prohibitive, as you have to have anticipated needing to get a param quickly, so it must be tagged in advance. also, even with getting by tags, performance imo is pretty poor. results on my machine from the code below: # INFO : object count is 3618 # INFO : 0.788785183814 # INFO : tagged param count is 3618 # INFO : 2.12563553863 # INFO : 7.84713397563 is there a better way? snip import time import win32com.client xsi= win32com.client.Dispatch( XSI.Application ).Application xsiPrint = xsi.LogMessage from win32com.client import constants as c items = xsi.ActiveSceneRoot.FindChildren2() # this bit is really slow for item in items: xsi.Tag(item.fullname + '.visibility.viewvis', c.siTag1) xsiPrint('object count is ' + str(items.count)) and only needs to be run once t = time.clock() val = xsi.ActiveSceneRoot.TaggedParameters(c.siTag1, False) for v in val: someStuff = v.value xsiPrint(time.clock() - t) xsiPrint('tagged param count is ' + str(val.count)) t = time.clock() for obj in items: vis = obj.GetPropertyFromName2(Visibility) v = vis.viewvis.value xsiPrint(time.clock() - t) t = time.clock() for obj in items: vis = obj.Properties('visibility').Parameters('viewvis').value xsiPrint(time.clock() - t) /snip tia, enoch
RE: fastest way through script to get all parameters in a scene of certain value?
The slowness is coming from using the Tag() command. Try using the object model to cut out the middle man: // Jscript main(); function main() { var oItems = ActiveSceneRoot.FindChildren2(); LogMessage( oItems.Count ); for ( var i = oItems.Count - 1; i = 0; i--) { var oItem = oItems(i); var oParameter = oItem.Properties( Visibility ).Parameters( viewvis ); oParameter.Tags = siTagNone; } return; } If the parameters you are attempting to modify have a large degree of consistency in name and location, you can use some of Softimage's wildcards to find them faster: var oParameters = XSIFactory.CreateActiveXObject( XSI.Collection ); oParameters.Unique = true; // Get viewvis and rendvis parameters of the visibility property on each X3DObject oParameters.items = *.visibility.{viewvis,rendvis}; LogMessage( oParameters.Count ); If there is a large degree of consistency in the parameter fullname, you can apply values to the parameters en masse very efficiently: SetValue( *.visibility.{viewvis,rendvis}, false ); Matt From: softimage-boun...@listproc.autodesk.com [mailto:softimage-boun...@listproc.autodesk.com] On Behalf Of Enoch Ihde Sent: Wednesday, February 27, 2013 9:55 PM To: softimage Subject: Re: fastest way through script to get all parameters in a scene of certain value? better stated: certain parameter name, not value, apologies, running behind on sleep, words are challenging. On Feb 27, 2013 7:54 PM, Enoch Ihde emi...@gmail.commailto:emi...@gmail.com wrote: these are the three methods i've tried. using tags is the fastest, but a little prohibitive, as you have to have anticipated needing to get a param quickly, so it must be tagged in advance. also, even with getting by tags, performance imo is pretty poor. results on my machine from the code below: # INFO : object count is 3618 # INFO : 0.788785183814 # INFO : tagged param count is 3618 # INFO : 2.12563553863 # INFO : 7.84713397563 is there a better way? snip import time import win32com.client xsi= win32com.client.Dispatch( XSI.Application ).Application xsiPrint = xsi.LogMessage from win32com.client import constants as c items = xsi.ActiveSceneRoot.FindChildren2() # this bit is really slow for item in items: xsi.Tag(item.fullname + '.visibility.viewvis', c.siTag1) xsiPrint('object count is ' + str(items.count)) and only needs to be run once t = time.clock() val = xsi.ActiveSceneRoot.TaggedParameters(c.siTag1, False) for v in val: someStuff = v.value xsiPrint(time.clock() - t) xsiPrint('tagged param count is ' + str(val.count)) t = time.clock() for obj in items: vis = obj.GetPropertyFromName2(Visibility) v = vis.viewvis.value xsiPrint(time.clock() - t) t = time.clock() for obj in items: vis = obj.Properties('visibility').Parameters('viewvis').value xsiPrint(time.clock() - t) /snip tia, enoch