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(); }