{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-guides/sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":[]},"type":"markdown"},"seo":{"title":"Composite Node and Group","description":"Accelerate E&P application development and protect your innovation by consuming our Data and Domain APIs / Platform APIs.","lang":"en-US","meta":[{"name":"robots","content":"noindex"}],"llmstxt":{"hide":true,"excludeFiles":[]}},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"composite-node-and-group","__idx":0},"children":["Composite Node and Group"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"introduction","__idx":1},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/pages/carnac/overview/compositeNode#intro"},"children":["#"]}," Introduction"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A composite node has a collection of children nodes. All children use inner coordinates of a composite node as the parent coordinates. A child node has a reference to its parent. The picture below shows its schematic class diagram."]},{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/compositenode.4f4b198698227e91b6f5fc2d623cc84d84e75c621124c2da1b2a991c4217e62c.e2926594.png"},"children":[]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"architecture","__idx":2},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/pages/carnac/overview/compositeNode#architecture"},"children":["#"]}," Architecture"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/doc/classes/geotoolkit.scene.compositenode.compositenode.html"},"children":["CompositeNode"]}," has methods to add and delete children nodes:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["addChild"]}," method adds a child node."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["clearChildren"]}," method clears a collection of children."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getChild"]}," method returns a child from the given index."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getChildrenCount"]}," method returns a count of children."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["indexOfChild"]}," method returns a child index."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["removeChild"]}," method removes a child from a collection."]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#/doc/classes/geotoolkit.scene.group.group.html"},"children":["Group"]}," extends CompositeNode and it has the following methods:"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getCache"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["setCache"]}," methods get and set a cache strategy. A cache is a strategy how a group and its children can be rendered into raster cache. It is a different between cache and state. A cache is a raster and state is vector cache."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The overridden ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getBounds"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["setBounds"]}," methods get /set bounds of the group in the parent coordinates."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getContentsTransform"]}," method returns the affine transformation from inner model coordinates to the node bounds. If the node does not have its own model limits (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getModelLimits()"]}," returns null) then ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getContentsTransform"]}," returns the identity transformation."]}]},{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/contexttransform.3cca9a81a7fb239e1d84ef1f96a246832fca528a6c5e9b33fe16bfc02c10ee81.e2926594.png"},"children":[]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["The nodes bounds can be additionally transformed in the parent’s coordinate system, i.e. scaled, translated or rotated. Instead of changing bounds directly, an additional transformation is used, which defines how the nodes bounds can be transformed into the parent. The ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["getLocalTransform"]}," method returns this transformation. The figure below shows a process of local transformation."]}]},{"$$mdtype":"Tag","name":"img","attributes":{"src":"/assets/localtransform.bda0e0f0d0d2d48627329ea174954ec10b392b3647de963f04d5a69cf9dd4839.e2926594.png"},"children":[]}]},"headings":[{"value":"Composite Node and Group","id":"composite-node-and-group","depth":1},{"value":"Introduction","id":"introduction","depth":3},{"value":"Architecture","id":"architecture","depth":3}],"frontmatter":{"title":"Composite Node and Group","seo":{"title":"Composite Node and Group"}},"lastModified":"2026-02-11T19:54:32.000Z","pagePropGetterError":{"message":"","name":""}},"slug":"/solutions/geotoolkit/programmers-guide/architecture-overview/carnac/composite-node","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}