Hey Alan, Piotrek,

Thanks very much, although I should say that's Piotrek's code, not mine, so
no credit to me :).

Script is awesome fast now, good thinking guys.

Jules

On Wed, Sep 12, 2012 at 10:54 PM, Alan Fregtman <[email protected]>wrote:

> Hi Jules,
>
>
> Fear not, for when you're reading built-in attributes (like NodeToVertex)
> it's very reliable to go this way. :)
>
> Also, your duplicate-free version can be made even simpler, shorter and
> maybe a teensy bit faster:
>
> sel = app.Selection(0)
> oGeo = sel.SubComponent.Parent3DObject.ActivePrimitive.Geometry
> da = oGeo.GetICEAttributeFromName("NodeToVertex").DataArray
> outIndexArray = set([ da[i] for i in sel.SubComponent.ElementArray ])
>
> It will return a Python "set", which is an iterable object, list-like, but
> enforces uniqueness automatically. If you truly need an actual list back,
> you can wrap the result in a list() function to convert it, but I don't see
> why you'd need it for this case.
>
>
> Cheers,
>
>    -- Alan
>
>
> On Wed, Sep 12, 2012 at 5:16 PM, piotrek marczak <
> [email protected]> wrote:
>
>>   this is 100000x times faster but Im not sure its safe getting the data
>> from ice attributes?
>>
>> from win32com.client import constants as c
>> app = Application
>> # select samples
>> sel = app.Selection(0)
>> oGeo =
>> sel.SubComponent.Parent3DObject.ActivePrimitive.GetGeometry3(0,c.siConstructionModeSecondaryShape)
>> # arguments needed otherwise crash
>> vton = oGeo.GetICEAttributeFromName("NodeToVertex");
>> outArray = []
>> da = vton.DataArray
>> for sampleInd in sel.SubComponent.ElementArray:
>>     outArray.append( da[ sampleInd ]  )
>>
>> without duplicates:
>> from win32com.client import constants as c
>> app = Application
>> sel = app.Selection(0)
>> oGeo =
>> sel.SubComponent.Parent3DObject.ActivePrimitive.GetGeometry3(0,c.siConstructionModeSecondaryShape)
>> # arguments needed otherwise crash
>> vton = oGeo.GetICEAttributeFromName("NodeToVertex");
>> da = vton.DataArray
>>
>> cmparray = [0] * oGeo.Points.Count
>> outIndexArray = []
>> for sampleInd in sel.SubComponent.ElementArray:
>>     i = da[ sampleInd ]
>>     if not cmparray[ i ]:
>>         outIndexArray.append( i  )
>>         cmparray[ i ] = 1
>>
>>  *From:* Jules Stevenson <[email protected]>
>> *Sent:* Wednesday, September 12, 2012 10:51 PM
>> *To:* [email protected]
>> *Subject:* Re: Python, Returning the vertex index from a sample cluster
>>
>> Hey Piotrek,
>>
>> Played around with your code and it is a lot faster than the script that
>> I was digging about with. FWIW you can use a set to speed up the lookup
>> stage:
>>
>>  def vertices_from_samples(samples):
>> '''Selects the vertices marked by the current selection of UV samples.'''
>> geo = samples.SubComponent.Parent3DObject.ActivePrimitive.Geometry
>> index_array = [0] * geo.Samples.Count
>>
>> for point in geo.Points:
>> for ptsample in point.Samples:
>> index_array[ptsample.Index] = point.Index
>>
>> outIndexSet = Set()
>> for sample in samples.SubComponent.ElementArray:
>> outIndexSet.add(index_array[sample])
>>
>> You could probably also pickle the index_array so it only needs
>> calculating once (since it takes a long time on a big mesh), but that opens
>> a whole can of worms in terms of storage and keeping it updated when the
>> mesh changes.
>>
>> Thanks for re-engaging my brain!
>>
>> Jules
>>
>> On Wed, Sep 12, 2012 at 9:35 PM, Jules Stevenson <
>> [email protected]> wrote:
>>
>>> Hi Piotrek,
>>>
>>> Thanks a lot for your reply, but this is exactly what I'm trying to
>>> avoid - I'm actually re-writing a script that does something very similar,
>>> as it is damn slow. Matt Lind mentioned in a previous thread that it is
>>> possible to go from sample > vert (are you around Matt ;)), but I'm really
>>> struggling to ifnd the 'magic' to make this happen.
>>>
>>> Cheers,
>>>
>>> Jules
>>>
>>>  On Wed, Sep 12, 2012 at 9:28 PM, piotrek marczak <
>>> [email protected]> wrote:
>>>
>>>>   i think you need to go bruteforce...
>>>> pretty slow code but i dont know python
>>>>
>>>> from win32com.client import constants as c
>>>> app = Application
>>>> oGeo =
>>>> app.Selection(0).SubComponent.Parent3DObject.ActivePrimitive.GetGeometry3(0,c.siConstructionModeSecondaryShape)
>>>> # arguments needed otherwise crash
>>>> indarray = [0] * oGeo.Samples.Count
>>>> for point in oGeo.Points:
>>>>     for ptsample in point.Samples:
>>>>         indarray[ ptsample.Index ] = point.Index
>>>> cmparray = [0] * oGeo.Points.Count
>>>> outIndexArray = []
>>>> for sample in app.Selection(0).SubComponent.ElementArray:
>>>>     if not cmparray[ indarray[ sample ] ]:
>>>>         outIndexArray.append( indarray[ sample ] )
>>>>         cmparray[ indarray[ sample ] ] = 1
>>>>
>>>> for i in outIndexArray:
>>>>     Application.LogMessage ( i )
>>>>
>>>>  *From:* Jules Stevenson <[email protected]>
>>>> *Sent:* Wednesday, September 12, 2012 7:58 PM
>>>> *To:* [email protected]
>>>> *Subject:* Re: Python, Returning the vertex index from a sample cluster
>>>>
>>>>  Apologies, hit send a little early there....
>>>>
>>>>  for sample in samples.SubComponent.ComponentCollection:
>>>> log(uvs.FindIndices([sample.Index]))
>>>>                 log (sample.Index)
>>>>                 log(elements.FindIndex(sample.Index)
>>>>
>>>> The 'elements' clusterElementCollection seems to contain the indices to
>>>> the samples, not the mapping to the geometry, which goes against what is
>>>> syas in the docs:
>>>>
>>>> "The ClusterElementCollection returned by 
>>>> Cluster.Elements<http://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/si_om/Cluster.Elements.html>(and
>>>> Envelope.Elements<http://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/si_om/Envelope.Elements.html>)
>>>> provides the mapping between an index of a component in a cluster with the
>>>> index of the component on the 
>>>> Geometry<http://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/si_om/Geometry.html>.
>>>> For example index 10 on a polygon Cluster might refer to Polygon 45 on the
>>>> geometry, in which case ClusterElementCollection.Item(10) has the value 45.
>>>> This data is read-only."
>>>>
>>>> This is not what I get at all, for a start the cluster.Elements.Count
>>>> returns approximatly 80k, which makes no sense as a geometry index since
>>>> there are only about 20k points. Clearly this is an array of the sample
>>>> indices (4 per vert). Soooooooo, how do I get the point / facet / polygon
>>>> ID from a sample?
>>>>
>>>> Any help much appreciated, this is driving me nuts.
>>>>
>>>> Cheers,
>>>>
>>>> Jules
>>>>
>>>
>>>
>>
>>
>
>

Reply via email to