Exemple #1
0
        void OnSetDistance(DoubleProperty sender, double l)
        {   // benutzereingabe für eine bestimmte Länge
            // der Index geht über Userdate
            int    index  = (int)sender.UserData.GetData("Index");
            double factor = 1.0;

            switch (mode)
            {
            case 0:     // prozent, 0.x*100
                factor = 100;
                break;

            case 1:
                factor = theCurve.Length;
                break;
            }
            sections[index] = Math.Min(1.0, l / factor); // höchstens 1.0
            // im Folgenden werden alle anderen Werte so geändert, dass die Summe 1.0 ergibt.
            // Es werden erst die folgenden Werte verändert, wenn das nicht reicht die vorhergehenden
            double sum = 0.0;

            for (int i = 0; i < number; ++i)
            {
                sum += sections[i];
            }
            if (sum > 1.0)
            {   // zu groß, die folgenden kleiner machen
                double toreduce = sum - 1.0;
                for (int i = index + 1; i < number; ++i)
                {
                    if (sections[i] > toreduce)
                    {
                        sections[i] -= toreduce;
                        toreduce     = 0.0;
                        break;
                    }
                    else
                    {
                        toreduce   -= sections[i];
                        sections[i] = 0.0;
                    }
                }
                if (toreduce > 0.0)
                {   // immer noch zu groß, vorne anfangen
                    for (int i = 0; i < index; ++i)
                    {
                        if (sections[i] > toreduce)
                        {
                            sections[i] -= toreduce;
                            toreduce     = 0.0;
                            break;
                        }
                        else
                        {
                            toreduce   -= sections[i];
                            sections[i] = 0.0;
                        }
                    }
                }
            }
            else if (sum < 1.0)
            {   // zu klein, einfach den folgenden Wert entsprechend vergrößern
                double toadd     = 1.0 - sum;
                int    nextindex = index + 1;
                if (nextindex >= number)
                {
                    nextindex = 0;
                }
                sections[nextindex] += toadd;
            }
            // alle Werte bis auf diesen updaten.
            IPropertyEntry[] sub = distances.GetShowProperties();
            for (int i = 0; i < sub.Length; ++i)
            {
                if (i != index)
                {
                    (sub[i] as DoubleProperty).Refresh();
                }
            }
            Recalc();
        }