//public static void MergedZoomInto(IEnumerable<RenderSlice> rslist) //{ // foreach (RenderSlice rs in rslist) // { // MergedZoomInto(rs); // } //} public static void MergedZoomInto(IEnumerable <RenderSlice> rslist) { ZoomInfo zi = new ZoomInfo(float.MaxValue, float.MinValue); foreach (RenderSlice rs in rslist) { if (rs.Zoominfo.PhysicalMax > zi.PhysicalMax) { zi.PhysicalMax = rs.Zoominfo.PhysicalMax; } if (rs.Zoominfo.PhysicalMin < zi.PhysicalMin) { zi.PhysicalMin = rs.Zoominfo.PhysicalMin; } } foreach (RenderSlice rs in rslist) { if (rs.Zoominfo.PhysicalMin != float.MaxValue) { // zoominfo nicht initialisiert / keine daten? rs.ZoomInto(zi.PhysicalMin, zi.PhysicalMax); } else { rs.ZoomInto(0.0f, 0.0f); } } }
private static void ScaledZoomInto(IEnumerable <RenderSlice> rslist, object[] scale) { List <AutoZoomGroup> zoomgroups = new List <AutoZoomGroup>(); double f = 0.0; // größte benutzte unit (d.h. erste im scale-array) ist referenz, alles andere wird dazu skaliert. // renderslices nach si-prefixen sortieren, dabei umrechnungsfaktoren merken. for (int a = 0; a < scale.Length; ++a) { if (scale[a] is string) { // fix: synonyme einheiten string[] u = ((string)scale[a]).Split((char[])null, StringSplitOptions.RemoveEmptyEntries); IEnumerable <RenderSlice> rsx = from rs in rslist where u.Contains(rs.Unit) select rs; if (rsx.Count() != 0) { if (f == 0.0) { f = 1.0; } zoomgroups.Add(new AutoZoomGroup(rsx, f)); } } else { f *= (double)scale[a]; } } // liste von zoomgroups beginnt mit der höchsten si-prefix-einheit (erste gruppe hat scalefactor = 1.0). // jetzt ein zoominfo mergen, mit entsprechenden skalierungen ZoomInfo zi = new ZoomInfo(float.MaxValue, float.MinValue); foreach (AutoZoomGroup zg in zoomgroups) { foreach (RenderSlice rs in zg.RsList) { float scaledmax = (float)(rs.Zoominfo.PhysicalMax / zg.ScaleFactor); float scaledmin = (float)(rs.Zoominfo.PhysicalMin / zg.ScaleFactor); if (scaledmax > zi.PhysicalMax) { zi.PhysicalMax = scaledmax; } if (scaledmin < zi.PhysicalMin) { zi.PhysicalMin = scaledmin; } } } // jetzt skaliert reinzoomen foreach (AutoZoomGroup zg in zoomgroups) { foreach (RenderSlice rs in zg.RsList) { if (rs.Zoominfo.PhysicalMin != float.MaxValue) { // zoominfo nicht initialisiert / keine daten? rs.ZoomInto((float)(zi.PhysicalMin * zg.ScaleFactor), (float)(zi.PhysicalMax * zg.ScaleFactor)); } else { rs.ZoomInto(0.0f, 0.0f); } } } }