Пример #1
0
        private static void child_click(object sender, RoutedEventArgs e)
        {
            TreeMap3D        treeMap3D = (TreeMap3D)sender;
            TreeMap3DElement element   = e.Source as TreeMap3DElement;

            treeMap3D.childClick(element);
        }
Пример #2
0
        private void refresh(IList newValues)
        {
            VerifyAccess();

            if (newValues == null)
            {
                newValues = new object[0];
            }

            // update/add weights
            double totalWeight = 0;

            TreeMap3DElement element;

            for (int i = 0; i < newValues.Count; i++)
            {
                if (i >= m_elements.Count)
                {
                    element      = new TreeMap3DElement(i, newValues.Count);
                    element.Data = newValues[i];
                    element.WeightBindingPath = m_weightBindingPath;

                    AddVisual3DChild(element);
                    m_elements.Add(element);
                }
                else
                {
                    m_elements[i].Data = newValues[i];
                    element            = m_elements[i];
                }

                totalWeight += element.Weight;
            }

            // remove any no-longer needed 3D objects
            for (int i = newValues.Count - 1; i >= m_elements.Count; i--)
            {
                element = m_elements[i];
                RemoveVisual3DChild(element);
                m_elements.RemoveAt(i);
            }

            updateMap(totalWeight);
        }
Пример #3
0
        private void childClick(TreeMap3DElement element)
        {
            if (m_lastClickedElement != null && m_lastClickedElement != element)
            {
                m_lastClickedElement.IsSelected = false;
            }

            m_lastClickedElement = element;

            if (element != null)
            {
                if (m_elements.Contains(element))
                {
                    if (element != m_selectedElement)
                    {
                        if (m_selectedElement == null)
                        {
                            foreach (TreeMap3DElement childElement in m_elements)
                            {
                                childElement.IsSelected = false;
                            }
                        }

                        element.IsSelected = true;
                        onSelectionChanged(
                            (m_selectedElement == null) ? null : m_selectedElement.Data,
                            element.Data);
                        m_selectedElement = element;
                    }
                    else
                    {
                        foreach (TreeMap3DElement childElement in m_elements)
                        {
                            childElement.IsSelected = true;
                        }

                        onSelectionChanged(m_selectedElement.Data, null);
                        m_selectedElement = null;
                    }
                }
            }
        }
Пример #4
0
        private void refresh(IList newValues)
        {
            VerifyAccess();

            if (newValues == null)
            {
                newValues = new object[0];
            }

            // update/add weights
            double totalWeight = 0;

            TreeMap3DElement element;

            for (int i = 0; i < newValues.Count; i++)
            {
                if (i >= m_elements.Count)
                {
                    element = new TreeMap3DElement(i, newValues.Count);
                    element.Data = newValues[i];
                    element.WeightBindingPath = m_weightBindingPath;

                    AddVisual3DChild(element);
                    m_elements.Add(element);
                }
                else
                {
                    m_elements[i].Data = newValues[i];
                    element = m_elements[i];
                }

                totalWeight += element.Weight;
            }

            // remove any no-longer needed 3D objects
            for (int i = newValues.Count - 1; i >= m_elements.Count; i--)
            {
                element = m_elements[i];
                RemoveVisual3DChild(element);
                m_elements.RemoveAt(i);
            }

            updateMap(totalWeight);
        }
Пример #5
0
        private void childClick(TreeMap3DElement element)
        {
            if (m_lastClickedElement != null && m_lastClickedElement != element)
            {
                m_lastClickedElement.IsSelected = false;
            }

            m_lastClickedElement = element;

            if (element != null)
            {
                if (m_elements.Contains(element))
                {
                    if (element != m_selectedElement)
                    {
                        if (m_selectedElement == null)
                        {
                            foreach (TreeMap3DElement childElement in m_elements)
                            {
                                childElement.IsSelected = false;
                            }
                        }

                        element.IsSelected = true;
                        onSelectionChanged(
                            (m_selectedElement == null) ? null : m_selectedElement.Data,
                            element.Data);
                        m_selectedElement = element;
                    }
                    else
                    {
                        foreach (TreeMap3DElement childElement in m_elements)
                        {
                            childElement.IsSelected = true;
                        }

                        onSelectionChanged(m_selectedElement.Data, null);
                        m_selectedElement = null;
                    }
                }
            }
        }
Пример #6
0
        private void updateMap(double totalWeight)
        {
            ComputeWeightMap();
            double maxArea = -1;

            Rect strip = new Rect(new Size(1, 1));

            int arranged = 0;

            while (arranged < m_elements.Count)
            {
                double bestStripWeight = 0;
                double bestRatio       = double.PositiveInfinity;

                int i;

                if (strip.Width > strip.Height)
                {
                    double bestWidth = strip.Width;

                    // Arrange Vertically
                    for (i = arranged; i < m_elements.Count; i++)
                    {
                        double stripWeight = bestStripWeight + GetWeight(i);
                        double ratio       = double.PositiveInfinity;
                        double width       = strip.Width * stripWeight / totalWeight;

                        for (int j = arranged; j <= i; j++)
                        {
                            double height = strip.Height * GetWeight(j) / stripWeight;
                            ratio = Math.Min(ratio, height > width ? height / width : width / height);

                            if (ratio > bestRatio)
                            {
                                goto ArrangeVertical;
                            }
                        }
                        bestRatio       = ratio;
                        bestWidth       = width;
                        bestStripWeight = stripWeight;
                    }

ArrangeVertical:
                    double y = strip.Y;
                    for (; arranged < i; arranged++)
                    {
                        TreeMap3DElement child = getChild(arranged);

                        double height = strip.Height * GetWeight(arranged) / bestStripWeight;
                        child.SetScale(bestWidth, height, bestWidth * height);
                        child.SetLocation(strip.X, y, 0);

                        if (maxArea < bestWidth * height)
                        {
                            maxArea = bestWidth * height;
                        }

                        y += height;
                    }

                    strip.X     = strip.X + bestWidth;
                    strip.Width = Math.Max(0.0, strip.Width - bestWidth);
                }
                else
                {
                    double bestHeight = strip.Height;

                    // Arrange Horizontally
                    for (i = arranged; i < m_elements.Count; i++)
                    {
                        double stripWeight = bestStripWeight + GetWeight(i);
                        double ratio       = double.PositiveInfinity;
                        double height      = strip.Height * stripWeight / totalWeight;

                        for (int j = arranged; j <= i; j++)
                        {
                            double width = strip.Width * GetWeight(j) / stripWeight;
                            ratio = Math.Min(ratio, height > width ? height / width : width / height);

                            if (ratio > bestRatio)
                            {
                                goto ArrangeHorizontal;
                            }
                        }
                        bestRatio       = ratio;
                        bestHeight      = height;
                        bestStripWeight = stripWeight;
                    }

ArrangeHorizontal:
                    double x = strip.X;
                    for (; arranged < i; arranged++)
                    {
                        TreeMap3DElement child = getChild(arranged);

                        double width = strip.Width * GetWeight(arranged) / bestStripWeight;

                        child.SetScale(width, bestHeight, width * bestHeight);
                        child.SetLocation(x, strip.Y, 0);

                        if (maxArea < width * bestHeight)
                        {
                            maxArea = width * bestHeight;
                        }

                        x += width;
                    }

                    strip.Y      = strip.Y + bestHeight;
                    strip.Height = Math.Max(0.0, strip.Height - bestHeight);
                }
                totalWeight -= bestStripWeight;
            }

            foreach (TreeMap3DElement elem in m_elements)
            {
                elem.ScaleZ(2 * maxArea);
            }

            m_weightMap = null;
        }