thanks guys. In the end I went for loops, and even created a handy function that builds a dictionary with component ID -> cluster mappings. It is not super fast, and it only supports 1 to 1 relationships, but served well for its purpose. I just need one call, so I stored everything into an ice operator that ultimately gets freezed.
here's the code snippet if anybody needs it: function buildComponentClusterDictionary(inMesh, clsType){ //clsTypes: pnt | poly | edge ... var clusters = inMesh.ActivePrimitive.Geometry.clusters dClusters = new ActiveXObject("Scripting.Dictionary"); for (i=0;i<clusters.count;i++){ var cluster = clusters(i); if (cluster.type == clsType){ var clsElements = cluster.Elements; var aItems = clsElements.Array.toArray(); for (j=0;j<aItems.length;j++){ dClusters.add(aItems[j], cluster); } } } return dClusters; } //------------// //example// //------------// //setup scene with sphere and a point cluster... var sphere = CreatePrim("Sphere", "MeshSurface", null, null);; SelectGeometryComponents(sphere+".pnt[1,5-8,12-15,19-22,26-29,33-36,40-43,47-50,54-LAST]"); CreateCluster(null); ActivateObjectSelTool(null); DeselectAll(); //call function and retrieve cluster of point #7 var clusterDictionary = buildComponentClusterDictionary(sphere, "pnt"); logmessage("Cluster for Point 7 is: " + clusterDictionary(7)); 2016-12-14 2:52 GMT-02:00 Martin Yara <furik...@gmail.com>: > If you are using python, you can get all clusters elements with > Cluster.Elements and then search in that list with 'if .. in", that would > save you from looping through all the elements. > > But, since you can have one poly index in multiple clusters you'll still > need to loop through all the PolyClusters. > > # PolyIndex = The Index of your Polygon in integer. > cls = obj.ActivePrimitive.Geometry.Clusters.Filter('poly') > for cl in cls: > elms = cl.Elements > if PolyIndex in elms: > print "[%s] in [%s]" % (PolyIndex,cl.Name) > > Martin > > On Wed, Dec 14, 2016 at 12:59 PM, Matt Lind <speye...@hotmail.com> wrote: > >> Depends how the polygon is referenced in your code. >> >> A Polygon is a geometry component and part of the object's primitive. A >> Cluster is a type of metadata and lives outside the geometry, but makes >> references to parts of the geometry. Most methods provided in the SDK >> work >> in a top-down fashion. That is, they start with a major object or >> primitive, then the methods dig down to find subcomponents or elements of >> smaller stature. What you're requesting is the ability to go the other >> direction (bottom-up). While some examples of that do exist in the SDK, >> they're pretty scarce and I don't think any exist for your particular >> request. >> >> If you have a reference to a polygon as a ClusterElement you may be able >> to >> call the .Parent property to crawl up the graph to get the Cluster that >> owns >> it. >> >> If you have a reference to a polygon as a PolygonFace as obtained through >> most of the geometry methods, then no. You must traverse the clusters and >> query if the polygon is contained within. >> >> If you want to bypass the object model and go completely old school >> command >> based manipulating of strings, you may (in some cases) dump the full path >> of >> the polygon, then tokenize it by '.' characters and crawl up the path >> until >> you find the cluster. There are limitations with this method as the >> number >> of path components is not consistent and will change depending on various >> factors such as whether the object is part of a model or not, the type of >> cluster applied (polygon, point, sample, ...), the context in which the >> polygon reference was obtained, etc... Any solution using this tactic can >> work for specific situations, but will be error prone for the general >> case. >> >> In some back door esoteric secret handshake situations, you might be able >> to >> use a SubComponent Object to find the cluster, but if you do that you >> already know the cluster, so creating the SubComponent is irrelevant. >> >> Long story short, if you only need to find the owning cluster once or >> twice, >> then just traverse the clusters and query if the polygon is in the >> cluster. >> If you have to do this en masse, then it might pay off to create reverse >> lookups maps using a simple associative array to store references to the >> cluster in the indices (eg; Array[PolygonIndex] = Cluster). Creating the >> maps will take some time, but once they're established your lookups will >> be >> very fast. >> >> >> Matt >> >> >> >> >> Date: Tue, 13 Dec 2016 18:45:36 -0200 >> From: Fabricio Chamon <xsiml...@gmail.com> >> Subject: Find cluster from polygon - script >> To: "softimage@listproc.autodesk.com" >> >> Hey guys, >> >> is there a quick way to find which cluster(s) a polygon belongs to without >> looping over all cluster elements? >> >> thanks. >> >> >> ------ >> Softimage Mailing List. >> To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com >> with "unsubscribe" in the subject, and reply to confirm. >> > > > ------ > Softimage Mailing List. > To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com > with "unsubscribe" in the subject, and reply to confirm. >
------ Softimage Mailing List. To unsubscribe, send a mail to softimage-requ...@listproc.autodesk.com with "unsubscribe" in the subject, and reply to confirm.