for completeness... -- Jo
def get_bbox_pos(obj): pos = [0, 0, 0] res = Application.GetBBox(obj) xmin, ymin, zmin, xmax, ymax, zmax = res x = (xmin + xmax) * 0.5 y = (ymin + ymax) * 0.5 z = (zmin + zmax) * 0.5 return (x, y, z) def marker_at_center(comp): pos = get_bbox_pos(comp) parent = comp.SubComponent.Parent3DObject basename = parent.Name if len(basename) > 3 and basename[3] == "_": basename = basename[4:] nil =parent.Model.AddNull("MARKER_" + basename) kine = nil.Kinematics.Global kine.posx = pos[0] kine.posy = pos[1] kine.posz = pos[2] nil.shadow_icon = 4 nil.shadow_scaleX = 0.5 nil.shadow_scaleY = 0.5 nil.shadow_scaleZ = 0.5 return None def do_it(): selection = Application.Selection if selection.Count > 0: comp = selection(0) marker_at_center(comp) return None do_it() 2012/7/9 Vincent Ullmann <vincent.ullm...@googlemail.com> > For the Center i did a little Script some time ago.... > Sadly it only works when the Object got no Transformations on it. > Also these RotationStuff may be incorrect > > To get a BoundingBox, you could try to modify this, so that it keeps the > lowest/highest X/Y/Z-Component and Outputs them > (See the CustomICE-Node-Example "Get BoundingBox", thats exactly the thing > i would do in jScript to get a BoundingBox) > > > > // Get Selection > > var oSel = selection(0); > > var oSelCtr = Sel_Center(oSel); > var vVecX = oSelCtr[0]; > var vVecY = oSelCtr[1]; > var vVecZ = oSelCtr[2]; > var vRotX = oSelCtr[3]; > var vRotY = oSelCtr[4]; > var vRotZ = oSelCtr[5]; > > > // ------------------------------------------------------------------------ > // Get Selection Center > > function Sel_Center(oSel) > { > var vAllVerts = 0; > var vPosX = 0; var vPosY = 0; var vPosZ = 0; > var vNrmX = 0; var vNrmY = 0; var vNrmZ = 0; > > var oSelType = oSel.Type; > switch (oSelType) > { > // If Poly or Edge > case "polySubComponent": > case "edgeSubComponent": > var vSubCompCount = oSel.SubComponent.ComponentCollection.Count; > for (i=0; i<vSubCompCount; i++) > { > var vVertCount = > oSel.SubComponent.ComponentCollection.Item(i).Vertices.Count; > for (j=0; j<vVertCount; j++) > { > var vAllVerts = vAllVerts + 1; > var vPosX = vPosX + > oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Position.x; > var vPosY = vPosY + > oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Position.y; > var vPosZ = vPosZ + > oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Position.z; > var vNrmX = vNrmX + > oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Normal.x; > var vNrmY = vNrmY + > oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Normal.y; > var vNrmZ = vNrmZ + > oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Normal.z; > } // for j End > } // for i End > break; // Case End > > // If Vertex > case "pntSubComponent": > var vAllVerts = oSel.SubComponent.ComponentCollection.Count; > for (i=0; i<vAllVerts; i++) > { > var vPosX = vPosX + > oSel.SubComponent.ComponentCollection.Item(i).Position.x; > var vPosY = vPosY + > oSel.SubComponent.ComponentCollection.Item(i).Position.y; > var vPosZ = vPosZ + > oSel.SubComponent.ComponentCollection.Item(i).Position.z; > var vNrmX = vNrmX + > oSel.SubComponent.ComponentCollection.Item(i).Normal.x; > var vNrmY = vNrmY + > oSel.SubComponent.ComponentCollection.Item(i).Normal.y; > var vNrmZ = vNrmZ + > oSel.SubComponent.ComponentCollection.Item(i).Normal.z; > } // for i End > break; > //If Selection =/= Poly/Vertex/Edge > default: > var vAllVerts = 1; > } //Switch End > > //Convert Normal-Direction to Rotation > var vecWorldX = XSIMath.CreateVector3(); vecWorldX.Set (1,0,0); > var vecWorldY = XSIMath.CreateVector3(); vecWorldY.Set (0,1,0); > var vecWorldZ = XSIMath.CreateVector3(); vecWorldZ.Set (0,0,1); > > var vecNrmX = XSIMath.CreateVector3(); vecNrmX.Set ( vNrmX/vAllVerts, > vNrmY/vAllVerts, vNrmZ/vAllVerts); > var vecNrmY = XSIMath.CreateVector3(); vecNrmY.Set ( 0, vNrmY/vAllVerts, > vNrmZ/vAllVerts); > var vecNrmZ = XSIMath.CreateVector3(); vecNrmZ.Set ( 0, 0, > vNrmZ/vAllVerts); > var vRotX = vecNrmX.Dot (vecWorldX); > var vRotY = vecNrmY.Dot (vecWorldY); > var vRotZ = vecNrmZ.Dot (vecWorldZ); > > LogMessage ("Position: X: " + vPosX/vAllVerts + " / Y: " + vPosY/vAllVerts > + " / Z: " + vPosZ/vAllVerts); > LogMessage ("Rotation: X: " + vRotX + " / Y: " + vRotY + " / Z: " + > vRotZ); > return [vPosX/vAllVerts, vPosY/vAllVerts, vPosZ/vAllVerts, vRotX, vRotY, > vRotZ] > } > // ------------------------------------------------------------------------ >