private void RemovePlacement(PaletteHolder holder, int index)
        {
            var element = holder.Elements[index];

            if (element == null)
            {
                return;
            }

            holder.GroupElement.Children.Remove(element);
            element.Dispose();
            holder.Elements[index] = null;
        }
        public override void InitializeElements(ModelFactory factory)
        {
            foreach (var definition in scenario.Palettes.Values)
            {
                //not implemented
                if (definition.Name == PaletteType.LightFixture)
                {
                    continue;
                }

                var holder = new PaletteHolder(definition);
                holder.GroupElement = new Helix.GroupModel3D();
                holder.SetCapacity(holder.Definition.Placements.Count);

                for (int i = 0; i < holder.Definition.Placements.Count; i++)
                {
                    ConfigurePlacement(factory, holder, i);
                }

                PaletteHolders.Add(holder.Name, holder);
            }
        }
        private void ConfigurePlacement(ModelFactory factory, PaletteHolder holder, int index)
        {
            RemovePlacement(holder, index);

            var placement = holder.Definition.Placements[index];
            var tag       = placement.PaletteIndex >= 0 && placement.PaletteIndex < holder.Definition.Palette.Count
                ? holder.Definition.Palette[placement.PaletteIndex].Tag : null;

            if (tag == null)
            {
                holder.Elements[index] = null;
                return;
            }

            Helix.Element3D inst;
            if (holder.Definition.Name == PaletteType.Decal)
            {
                inst = new DecalMarker3D();
            }
            else if (holder.Definition.Name == PaletteType.LightFixture)
            {
                inst = new LightMarker3D();
            }
            else
            {
                inst = factory.CreateObjectModel(tag.Id);
                if (inst == null)
                {
                    holder.Elements[index] = null;
                    return;
                }
            }

            BindPlacement(placement, inst);

            holder.Elements[index] = inst;
            holder.GroupElement.Children.Add(inst);
        }