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.com>wrote:

> 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.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.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****
>>>
>>>
>>>
>>> ****
>>>
>>
>>
>

Reply via email to