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