Object Hierarchy | 関連する C++クラス:Cluster
Cluster
クラスタとは、Geometry上のコンポーネントのセットです。たとえば、人体の左腕のポリゴンは、クラスタを作成することによりグループ化できます。
クラスタには、そのコンポーネントに含まれているコンポーネントに対応するSIObject.Typeが含まれます(例:pnt、knot、poly)。ジオメトリには、異なる種類のクラスタを含む複数のクラスタを含めることができます。複数のクラスタに特定のコンポーネントが含まれる場合があります。ジオメトリ上でサポートされるClusterTypesは、オブジェクトのタイプによって異なります。たとえば、siKnotCluster を使用できるオブジェクトは、NurbsSurfaceまたはNurbsCurveだけです。
クラスタはParticleCloudのジオメトリ上に作成できます。これらのクラスタはタイプ siVertexCluster ですが、Particle が含まれます。
特定タイプのすべてのコンポーネントを含むクラスタは「常に完全」と呼ばれ、Cluster.IsAlwaysComplete メソッドで検証できます。「常に完全」なクラスタは、コンポーネントがモデリングオペレーションによって追加されていてもジオメトリのすべてのコンポーネントをカバーします。ただし、ジオメトリのすべてのコンポーネントをカバーするクラスタは、「常に完全」である必要はないので注意してください。その他のクラスタにはコンポーネントのサブセットが含まれます。どの場合でも、クラスタのコンポーネントインデックスは、ジオメトリのコンポーネントインデックスと直接一致することはありません。クラスタインデックスおよびジオメトリインデックス間のマッピングは、Cluster.ElementsおよびCluster.FindIndicesから使用できます。
クラスタは、ClusterPropertyおよびUserDataMapを使用してコンポーネント別データを保存する場合に役立ちます。クラスタは、そのクラスタ固有のCustomPropertyオブジェクトを持つことができます。これらのプロパティはすべてSceneItem.AddPropertyで作成し、SceneItem.LocalPropertiesで表示します。ClusterPropertyのいくつかのタイプは、常に完全であるクラスタが必要なことに注意してください。
警告:エッジをメッシュに追加するなどの操作でジオメトリを変更すると、クラスタが拡張したり縮小したりすることがあります。
v5.0 のように、Cluster オブジェクトで呼び出されたベースプロパティSIObject.Parent は、X3DObjectの代わりにPrimitiveを戻します。
' ' This example shows how to create many different cluster types. ' It also shows how to find all clusters in a scene ' NewScene ,false set oRoot = Application.ActiveProject.ActiveScene.Root set grid = oRoot.AddGeometry("Grid","MeshSurface") set gridGeometry = grid.ActivePrimitive.Geometry 'Only certain types makes sense on a MeshSurface 'This cluster we will create as a subset of the vertices gridGeometry.AddCluster siVertexCluster,"PntCluster",Array(1,4,7,10,13,16,19,22) 'The rest we will create as complete clusters gridGeometry.AddCluster siPolygonCluster,"PolygonC" gridGeometry.AddCluster siEdgeCluster gridGeometry.AddCluster siSampledPointCluster 'A different set makes sense with Nurbs set torus = oRoot.AddGeometry("Torus","NurbsSurface") set torusGeometry = torus.ActivePrimitive.Geometry torusGeometry.AddCluster siVertexCluster,"PntCluster" torusGeometry.AddCluster siSampledPointCluster torusGeometry.AddCluster siSurfaceCurveCluster torusGeometry.AddCluster siKnotCurveUCluster torusGeometry.AddCluster siKnotCurveVCluster torusGeometry.AddCluster siBoundaryCluster torusGeometry.AddCluster siKnotCluster torusGeometry.AddCluster siTrimCurveCluster torusGeometry.AddCluster siIsoLineUCluster torusGeometry.AddCluster siIsoLineVCluster torusGeometry.AddCluster siSubSurfaceCluster set circle = oRoot.AddGeometry("Circle","NurbsCurve") set circleGeometry = circle.ActivePrimitive.Geometry circleGeometry.AddCluster siIsoPointCluster circleGeometry.AddCluster siVertexCluster,"PntCluster" circleGeometry.AddCluster siKnotCluster set particleCloud = CreateParticleCloud().Item(0) particleCloud.ActivePrimitive.Geometry.AddCluster siVertexCluster, "MyParticles" ' Now traverse the scene finding all the clusters logmessage "Clusters in Scene......................" set oSceneObjs = ActiveSceneRoot.FindChildren() for each oItem in oSceneObjs 'Use error handling to skip over the objects that don't 'support clusters on error resume next set oClusters = oItem.ActivePrimitive.Geometry.Clusters if ( err = 0 ) then logmessage oItem & " has " & oClusters.Count & " Clusters: " for each oCls in oClusters logmessage " " & oCls & " (type: " & oCls.Type & ")" next end if next 'The output of this script is: 'INFO : "Clusters in Scene......................" 'INFO : "grid has 4 Clusters: " 'INFO : " grid.polymsh.cls.PntCluster (type: pnt)" 'INFO : " grid.polymsh.cls.edge.clslist.Edge (type: edge)" 'INFO : " grid.polymsh.cls.PolygonC (type: poly)" 'INFO : " grid.polymsh.cls.sample.clslist.Sample (type: sample)" 'INFO : "torus has 11 Clusters: " 'INFO : " torus.surfmsh.cls.V_Knot_Curve (type: knotcrvv)" 'INFO : " torus.surfmsh.cls.U_Knot_Curve (type: knotcrvu)" 'INFO : " torus.surfmsh.cls.sample.clslist.Sample (type: sample)" 'INFO : " torus.surfmsh.cls.PntCluster (type: pnt)" 'INFO : " torus.surfmsh.cls.Surface_Curve (type: srfcrv)" 'INFO : " torus.surfmsh.cls.V_Isoline (type: isolinev)" 'INFO : " torus.surfmsh.cls.knot.clslist.Knot (type: knot)" 'INFO : " torus.surfmsh.cls.Boundary (type: bndry)" 'INFO : " torus.surfmsh.cls.Subsurface (type: subsrf)" 'INFO : " torus.surfmsh.cls.U_Isoline (type: isolineu)" 'INFO : " torus.surfmsh.cls.Trim_Curve (type: trimcrv)" 'INFO : "circle has 3 Clusters: " 'INFO : " circle.crvlist.cls.Isopoint (type: isopnt)" 'INFO : " circle.crvlist.cls.PntCluster (type: pnt)" 'INFO : " circle.crvlist.cls.knot.clslist.Knot (type: knot)" 'INFO : "cloud has 1 Clusters: " 'INFO : " cloud.cloud.cls.MyParticles (type: pnt)" |
//Step 1: Simulate the user creating a scene and selecting //some points on a grid var oGrid = ActiveSceneRoot.AddGeometry( "Grid", "MeshSurface" ) ; SelectObj( oGrid ) ; ActivateVertexSelTool(); AddToSelection( oGrid.Name + ".pnt[0-8]", null, true); //Step 2: Get the selected components using OM var oSubComponent = Selection(0).SubComponent ; //Expect that 9 components were selected logmessage( oSubComponent.ComponentCollection.Count ) ; //Step 3: it is simple to create a cluster var oCluster = oSubComponent.CreateCluster() ; logmessage( oCluster.FullName ) ; //Output of this example: //INFO : "9" //INFO : "grid.polymsh.cls.Point" |