예제 #1
0
        //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);
                }
            }
        }
예제 #2
0
        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);
                    }
                }
            }
        }