Ejemplo n.º 1
0
        /// <summary>
        /// The base curaddto only adds a \draw ;
        /// We also need to add a plot coordinates {   }
        /// </summary>
        /// <param name="created"></param>
        /// <returns></returns>
        protected override bool EnsureCurAddToExists(out bool created)
        {
            bool ret = base.EnsureCurAddToExists(out created);

            if (!ret)
            {
                return(ret);
            }

            if (created)
            {
                curAddTo.AddChild(new Tikz_Something(" plot"));

                Tikz_Options topts = new Tikz_Options();
                topts.starttag = "[";
                topts.endtag   = "]";
                smoothOption   = topts.AddOption("smooth");
                topts.AddOption("tension", ".7");

                curAddTo.options = topts;
                curAddTo.AddChild(topts);
                curAddTo.AddChild(new Tikz_Something(" coordinates "));

                Tikz_Path tp = new Tikz_Path();
                tp.starttag = "{";
                tp.endtag   = "}";
                curAddTo.AddChild(tp);

                curAddTo = tp;
            }

            return(ret);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Determines whether the object represented by the OverlayShape item can be
        /// given a reference to. This is the case, e.g., for standard coordinates. It is
        /// however not the case for the coordinates in a smooth curve.
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        protected bool IsReferenceable(OverlayShape item)
        {
            if (!(item is OverlayNode))
            {
                return(false);
            }

            Tikz_XYItem it = (item as OverlayNode).tikzitem;

            // check whether item occurs in smooth curve
            // we check whether the parent's parent has the word "coordinates" preceding the parent (this is a bit of a hack)
            if (it is Tikz_Coord && (it.parent.parent is Tikz_Path))
            {
                Tikz_Path grandpa = it.parent.parent as Tikz_Path;
                for (int i = grandpa.Children.IndexOf(it.parent) - 1; i > 0; i--)
                {
                    if (!(grandpa.Children[i] is Tikz_Something))
                    {
                        break;
                    }
                    if (grandpa.Children[i].text.ToLower().Contains("coordinates"))
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 3
0
        public void ParseTest2()
        {
            string code =
                @"\begin{tikzpicture}
\draw (1,2) -- (3,3);
\end{tikzpicture}
";
            Tikz_ParseTree actual = TikzParser.Parse(code);

            Tikz_Picture tp = actual.GetTikzPicture();

            Assert.AreEqual(0, tp.StartPosition());
            Tikz_Path tpa = tp.Children.Find(tpi => tpi is Tikz_Path) as Tikz_Path;

            Assert.AreEqual(21, tpa.StartPosition());
            Tikz_Coord tc = tpa.Children.Find(tpi => tpi is Tikz_Coord) as Tikz_Coord;

            Assert.AreEqual(1, tc.uX.number);
            Assert.AreEqual(2, tc.uY.number);

            Assert.AreEqual(27, tc.StartPosition());
        }
Ejemplo n.º 4
0
        public void SetCorrectRaster(TikzParseItem tpi, bool IsParent = false)
        {
            if (ParseTree == null)
            {
                return;
            }
            if (tpi == null)
            {
                Tikz_Picture tp = ParseTree.GetTikzPicture();
                if (tp != null)
                {
                    TikzMatrix M;
                    if (!tp.GetCurrentTransformAt(null, out M))
                    {
                        Rasterizer.View.CoordinateTransform = new TikzMatrix();   // if the program gets here, the global coord. transformation could not be understood->ovelay should display nothing
                    }
                    else
                    {
                        Rasterizer.View.CoordinateTransform = M;
                    }
                    //rasterizer.RasterOrigin = M.Transform(new Point(0, 0));
                    //rasterizer.RasterScale = M.m[1, 1];
                    Rasterizer.View.IsCartesian = !UsePolarCoordinates;
                }
            }
            else if (tpi is Tikz_Scope)
            {
                Tikz_Scope ts = tpi as Tikz_Scope;
                TikzMatrix M;
                if (IsParent)
                {
                    if (!ts.GetCurrentTransformAt(null, out M)) // todo
                    {
                        M = new TikzMatrix();                   // broken coords-> take unity as backup
                    }
                }
                else
                {
                    //if (!ts.parent.GetCurrentTransformAt(ts, out M))
                    //    M = new TikzMatrix();
                    if (!ts.GetRasterTransform(out M))
                    {
                        M = new TikzMatrix();
                    }
                }
                Rasterizer.View.CoordinateTransform = M;
                //rasterizer.RasterOrigin = M.Transform(new Point(0, 0));
                //rasterizer.RasterScale = M.m[1, 1];
                Rasterizer.View.IsCartesian = !IsParent || !UsePolarCoordinates;
            }
            else if (tpi is Tikz_XYItem)
            {
                Tikz_XYItem t = tpi as Tikz_XYItem;
                Point       offset;
                if (t.GetAbsPos(out offset, true))
                {
                    TikzMatrix M;
                    if (!t.parent.GetCurrentTransformAt(t, out M)) //.CloneIt();
                    {
                        M = new TikzMatrix();
                    }

                    M.m[0, 2] = offset.X;
                    M.m[1, 2] = offset.Y;
                    //rasterizer.RasterScale = M.m[1, 1];
                    Rasterizer.View.CoordinateTransform = M;
                    Rasterizer.View.IsCartesian         = !(t.IsPolar());
                }
                else
                {
                    throw new Exception("In PdfOverlay: Encountered drawn item without valid coordinates");
                }
            }
            else if (tpi is Tikz_Path)
            {
                Tikz_Path  ts = tpi as Tikz_Path;
                TikzMatrix M;
                if (IsParent)
                {
                    Point curPointAtEnd;
                    if (!ts.GetCurrentTransformAt(null, out M)) // todo
                    {
                        M = new TikzMatrix();                   // broken coords-> take unity as backup
                    }
                    if (ts.GetAbsOffset(out curPointAtEnd, null))
                    {
                        M.m[0, 2] = curPointAtEnd.X;
                        M.m[1, 2] = curPointAtEnd.Y;
                    }
                }
                else
                {
                    if (!ts.parent.GetCurrentTransformAt(ts, out M))
                    {
                        M = new TikzMatrix();
                    }
                    //if (!ts.GetRasterTransform(out M))
                    //    M = new TikzMatrix();
                }
                Rasterizer.View.CoordinateTransform = M;
                //rasterizer.RasterOrigin = M.Transform(new Point(0, 0));
                //rasterizer.RasterScale = M.m[1, 1];
                Rasterizer.View.IsCartesian = !IsParent || !UsePolarCoordinates;
            }
            else
            {
                Debug.WriteLine("Error in SetCorrectRaster: unsupported type");//Rasterizer.IsCartesian = true;  // should not get here
            }
        }
Ejemplo n.º 5
0
        static bool FillItem(TikzContainerParseItem item, CommonTree t, CommonTokenStream tokens)
        {
            int curToken = t.TokenStartIndex;

            if (item is Tikz_ParseTree)
            {
                curToken = 0;   // for root, start at the beginning
            }
            if (t.Children == null)
            {
                return(false);
            }

            foreach (CommonTree childt in t.Children)
            {
                addSomething(item, tokens, curToken, childt.TokenStartIndex - 1);

                switch (childt.Type)
                {
                case simpletikzParser.IM_PICTURE:
                    Tikz_Picture tp = new Tikz_Picture();
                    FillItem(tp, childt, tokens);
                    item.AddChild(tp);
                    break;

                case simpletikzParser.IM_STARTTAG:
                    item.starttag = getTokensString(tokens, childt.TokenStartIndex, childt.TokenStopIndex);
                    break;

                case simpletikzParser.IM_ENDTAG:
                    item.endtag = getTokensString(tokens, childt.TokenStartIndex, childt.TokenStopIndex);
                    break;

                case simpletikzParser.IM_PATH:
                    Tikz_Path tpath = new Tikz_Path();
                    FillItem(tpath, childt, tokens);
                    item.AddChild(tpath);
                    break;

                case simpletikzParser.IM_SCOPE:
                    Tikz_Scope tscope = new Tikz_Scope();
                    FillItem(tscope, childt, tokens);
                    item.AddChild(tscope);
                    break;

                case simpletikzParser.IM_COORD:
                    Tikz_Coord tc = Tikz_Coord.FromCommonTree(childt, tokens);
                    tc.text = getTokensString(tokens, childt);
                    item.AddChild(tc);
                    break;

                case simpletikzParser.IM_ARC:
                    Tikz_Arc ta = Tikz_Arc.FromCommonTree(childt, tokens);
                    ta.text = getTokensString(tokens, childt);
                    item.AddChild(ta);
                    break;

                case simpletikzParser.IM_NODE:
                    Tikz_Node tn = Tikz_Node.FromCommonTree(childt, tokens);
                    tn.text = getTokensString(tokens, childt);
                    item.AddChild(tn);
                    break;

                case simpletikzParser.IM_OPTION_KV:
                case simpletikzParser.IM_OPTION_STYLE:
                    Tikz_Option topt = Tikz_Option.FromCommonTree(childt, tokens);
                    if (topt == null)
                    {
                        break;
                    }
                    //topt.text = getTokensString(tokens, childt);
                    String s = getTokensString(tokens, childt);
                    topt.text = s;
                    item.AddChild(topt);
                    break;

                case simpletikzParser.IM_OPTIONS:
                    //Tikz_Options to = Tikz_Options.FromCommonTree(childt);
                    Tikz_Options to = new Tikz_Options();
                    FillItem(to, childt, tokens);
                    item.AddChild(to);
                    //to.text = getTokensString(tokens, childt);
                    //item.AddChild(tn);
                    if (item.options == null)
                    {
                        // determine whether option belongs to the item (e.g. \draw [this belongs to draw] blabla [thisnot])
                        // i.e., the scope of the options is the whole item's body
                        // this is hacky
                        if (item.Children.Count == 1 ||
                            (item.Children.Count == 2 && (item.Children[0] is Tikz_Something) &&
                             item.Children[0].ToString().Trim() == ""))
                        {
                            item.options = to;
                        }
                    }
                    break;

                case simpletikzParser.IM_TIKZSET:
                    Tikz_Options to2 = new Tikz_Options();
                    FillItem(to2, childt, tokens);
                    item.AddChild(to2);
                    break;

                case simpletikzParser.IM_STYLE:
                    Tikz_Option topt2 = Tikz_Option.FromCommonTree(childt, tokens);
                    //FillItem(to2, childt, tokens);
                    topt2.text = getTokensString(tokens, childt);
                    item.AddChild(topt2);
                    break;

                case simpletikzParser.IM_CONTROLS:
                    Tikz_Controls tcontrols = new Tikz_Controls();
                    FillItem(tcontrols, childt, tokens);
                    item.AddChild(tcontrols);
                    break;

                case simpletikzParser.IM_SIZE:
                    Tikz_Size tsize = Tikz_Size.FromCommonTree(childt, tokens);
                    tsize.text = getTokensString(tokens, childt);
                    item.AddChild(tsize);
                    //Tikz_Size tsize = new Tikz_Size();
                    //item.AddChild(tsize);
                    break;

                //case simpletikzParser.ID:
                //case simpletikzParser.IM_STRING:
                //case simpletikzParser.COMMAND:
                //case simpletikzParser.T__57:
                //    break;
                case simpletikzParser.IM_TIKZEDT_CMD:
                    Tikz_EdtCommand cmd = new Tikz_EdtCommand(getTokensString(tokens, childt));
                    item.AddChild(cmd);
                    break;

                case simpletikzParser.IM_DONTCARE:
                    Tikz_Something st = new Tikz_Something(getTokensString(tokens, childt));
                    item.AddChild(st);
                    break;

                default:
                    // getting here is an error
                    throw new Exception(" childt.Type not handled! " + childt.Type.ToString() + " (\"" + getTokensString(tokens, childt) + "\")");
                    //break;
                }

                curToken = childt.TokenStopIndex + 1;
            }

            if (t.TokenStartIndex >= 0)   // rule out empty code
            {
                addSomething(item, tokens, curToken, t.TokenStopIndex);
            }

            return(true);
        }