Ejemplo n.º 1
0
        // Fields for handling and storing parts of the image messages
        // sent from the executive.
        protected override void handleImageMessage(int id, string line)
        {
            Scanner scanner = new Scanner();
            String r = @"\d+:\s+IMAGE:\s+##\d+ (\d+)x(\d+) (.*)={Double} aspect={Double} " +
                @"from=\({Double},{Double},{Double}\) to=\({Double},{Double},{Double}\) " +
                @"up=\({Double},{Double},{Double}\) " +
                @"box=\({Double},{Double},{Double}\)\({Double},{Double},{Double}\)\({Double},{Double},{Double}\)\({Double},{Double},{Double}\) " +
                @"aamat=\({Double},{Double},{Double}\)\({Double},{Double},{Double}\)\({Double},{Double},{Double}\)\({Double},{Double},{Double}\)\s+" +
                @"ddcamera=(\d+) button=(\d+)";
            r = scanner.CreateRegexPattern(r);

            Regex regex = new Regex(r);
            Match m = regex.Match(line);
            if (m.Success)
            {
                int x = int.Parse(m.Groups[1].Value);
                int y = int.Parse(m.Groups[2].Value);
                String s = m.Groups[3].Value;
                double w = double.Parse(m.Groups[4].Value);
                double a = double.Parse(m.Groups[5].Value);
                double[] from = { double.Parse(m.Groups[6].Value), double.Parse(m.Groups[7].Value), double.Parse(m.Groups[8].Value) };
                double[] to = { double.Parse(m.Groups[9].Value), double.Parse(m.Groups[10].Value), double.Parse(m.Groups[11].Value) };
                double[] up = { double.Parse(m.Groups[12].Value), double.Parse(m.Groups[13].Value), double.Parse(m.Groups[14].Value) };
                double[,] box = {
                { double.Parse(m.Groups[15].Value), double.Parse(m.Groups[16].Value), double.Parse(m.Groups[17].Value) },
                { double.Parse(m.Groups[18].Value), double.Parse(m.Groups[19].Value), double.Parse(m.Groups[20].Value) },
                { double.Parse(m.Groups[21].Value), double.Parse(m.Groups[22].Value), double.Parse(m.Groups[23].Value) },
                { double.Parse(m.Groups[24].Value), double.Parse(m.Groups[25].Value), double.Parse(m.Groups[26].Value) } };
                double[,] aamat = {
                { double.Parse(m.Groups[27].Value), double.Parse(m.Groups[28].Value), double.Parse(m.Groups[29].Value) },
                { double.Parse(m.Groups[30].Value), double.Parse(m.Groups[31].Value), double.Parse(m.Groups[32].Value) },
                { double.Parse(m.Groups[33].Value), double.Parse(m.Groups[34].Value), double.Parse(m.Groups[35].Value) },
                { double.Parse(m.Groups[36].Value), double.Parse(m.Groups[37].Value), double.Parse(m.Groups[38].Value) } };
                int ddcamera = int.Parse(m.Groups[39].Value);
                int button = int.Parse(m.Groups[40].Value);

                bool persp;
                double viewAngle;

                if (s == "width")
                    persp = false;
                else
                    persp = true;

                double xdiff = from[0] - to[0];
                double ydiff = from[1] - to[1];
                double zdiff = from[2] - to[2];
                double dist = Math.Sqrt(xdiff * xdiff + ydiff * ydiff + zdiff * zdiff);

                if (persp)
                {
                    viewAngle = Math.Atan(w / 2) * 360 / Math.PI;
                    w = dist * w;
                }
                else
                {
                    viewAngle = Math.Atan((w / 2) / dist) * 360 / Math.PI;
                }

                DirectInteractionMode imode = image.getInteractionMode();

                if (ddcamera == 1 || button == 1)
                {
                    // If in navigate mode, then to, from and up are
                    // set elsewhere.
                    if (imode != DirectInteractionMode.NAVIGATE || ddcamera == 1)
                    {
                        this.setTo(to, false);
                        this.setFrom(from, false);
                        this.setUp(up, false);
                    }

                    setResolution(x, y, false);
                    setWidth(w, false);
                    setAspect(a, false);
                    setBox(box, false);
                    setProjection(persp, false);
                    setViewAngle(viewAngle, false);
                    enableVector(true, false);
                    sendValuesQuietly();
                    image.newCamera(box, aamat, from, to, up, x, y, w, persp, viewAngle);
                }
                else if (!image.IsCameraInitialized || imode == DirectInteractionMode.NAVIGATE)
                    image.newCamera(box, aamat, from, to, up, x, y, w, persp, viewAngle);

                image.allowDirectInteraction(true);

                if (this.saveInteractionMode != DirectInteractionMode.NONE)
                {
                    image.setInteractionMode(saveInteractionMode);
                    saveInteractionMode = DirectInteractionMode.NONE;
                }
            }
            else
            {
                regex = new Regex(@"\d+:  IMAGE:  ##\d+ (\d+)x(\d+)");
                m = regex.Match(line);

                if (m.Success)
                {
                    int x = int.Parse(m.Groups[1].Value);
                    int y = int.Parse(m.Groups[2].Value);

                    setResolution(x, y, false);
                    image.allowDirectInteraction(false);
                    image.clearFrameBufferOverlay();
                }
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        ///     ParseGeometryComment actually performs the Window placement and
        ///     Window sizing for shell windows such as the ImageWindow and
        ///     Control Panels. The network saves the placement as a normalized
        ///     vector of where and what size it was on the authors screen
        ///     and then tries to replicate that to fit the screen of others. 
        /// </summary>
        /// <param name="line"></param>
        /// <param name="file"></param>
        /// <param name="lineno"></param>
        /// <param name="xpos"></param>
        /// <param name="ypos"></param>
        /// <param name="xsize"></param>
        /// <param name="ysize"></param>
        /// <param name="tag"></param>
        /// <returns></returns>
        public static bool ParseGeometryComment(String line, String file, int lineno, ref int xpos,
            ref int ypos, ref int xsize, ref int ysize, String tag)
        {
            Scanner scanner = new Scanner();
            Match match = null;
            float norm_xsize, norm_ysize, norm_xpos, norm_ypos;
            Screen[] screens = Screen.AllScreens;
            int screen = -1;
            int width = 0, height = 0, x = 0, y = 0;

            if (tag == null)
                tag = "window";

            if (!line.StartsWith(" " + tag + ": position = ("))
                return false;

            String scanline;
            scanline = tag +
                @":\s*position\s*=\s*\(\s*{Single}\s*\,\s*{Single}\s*\)\s*\,\s*size\s*=\s*{Single}\s*x\s*{Single}\s*,\s*screen\s*=\s*{Int32}";

            scanline = scanner.CreateRegexPattern(scanline);
            //scanner.Scan(line, scanline, targets);
            Regex reggie = new Regex(scanline);

            match = reggie.Match(line);
            if (!match.Success)
            {
                scanline = tag +
                @":\s*position\s*=\s*\(\s*{Single}\s*\,\s*{Single}\s*\)\s*\,\s*size\s*=\s*{Single}\s*x\s*{Single}";
                scanline = scanner.CreateRegexPattern(scanline);
                reggie = new Regex(scanline);
                match = reggie.Match(line);
            }

            if (!match.Success)
            {
                WarningDialog wd = new WarningDialog();
                wd.post("Bad comment found in file {0} line {1}", file, lineno);
                return false;
            }

            string sVal = match.Groups[1].Captures[0].Value;
            norm_xpos = float.Parse(sVal);
            sVal = match.Groups[2].Captures[0].Value;
            norm_ypos = float.Parse(sVal);
            sVal = match.Groups[3].Captures[0].Value;
            norm_xsize = float.Parse(sVal);
            sVal = match.Groups[4].Captures[0].Value;
            norm_ysize = float.Parse(sVal);
            if (match.Captures.Count == 6)
            {
                sVal = match.Groups[5].Captures[0].Value;
                screen = Int32.Parse(sVal);
            }

            if (norm_xsize >= 3 || norm_ysize >= 3)
            {
                xpos = UnspecifiedPosition;
                ypos = UnspecifiedPosition;
                xsize = UnspecifiedDimension;
                ysize = UnspecifiedDimension;
                return true;
            }

            if (screen != -1 && screen < screens.Length)
            {
                width = screens[screen].Bounds.Width;
                height = screens[screen].Bounds.Height;
                x = screens[screen].Bounds.X;
                y = screens[screen].Bounds.Y;
            }
            else
            {
                Screen ps = Screen.PrimaryScreen;
                width = ps.Bounds.Width;
                height = ps.Bounds.Height;
                x = ps.Bounds.X;
                y = ps.Bounds.Y;
            }

            xpos = (Int32)Math.Round(width * norm_xpos + x);
            ypos = (Int32)Math.Round(height * norm_ypos + y);
            xsize = (Int32)Math.Round(width * norm_xsize);
            ysize = (Int32)Math.Round(height * norm_ysize);

            return true;
        }