Exemplo n.º 1
0
        static void Main(string[] args)
        {
            // read all RhinoCommon classes into memory
            const string rhinocommonPath = @"C:\dev\github\mcneel\rhino\src4\DotNetSDK\rhinocommon\dotnet";

            Console.WriteLine("[Parse RhinoCommon source]");
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            RhinoCommonClass.BuildClassDictionary(rhinocommonPath);
            Console.ResetColor();

            Console.WriteLine("[Parse C++ Bindings]");
            Console.ForegroundColor = ConsoleColor.Green;
            const string bindingPath = @"../../../../src/bindings";

            BindingClass.BuildClassDictionary(bindingPath);
            Console.ResetColor();
            Console.WriteLine("[END PARSE]");


            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Writing javascript");
            JavascriptClass.Write("rh3dm_temp.js");
            Console.WriteLine("Writing python");
            PythonClass.Write();
        }
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            // read all RhinoCommon classes into memory
            const string rhinocommonPath = @"../../dotnet";

            Console.WriteLine("[Parse RhinoCommon source]");
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            RhinoCommonClass.BuildClassDictionary(rhinocommonPath);
            Console.ResetColor();

            Console.WriteLine("[Parse C++ Bindings]");
            Console.ForegroundColor = ConsoleColor.Green;
            const string bindingPath = @"../../bindings";

            BindingClass.BuildDictionary(bindingPath);
            Console.ResetColor();
            Console.WriteLine("[END PARSE]");


            var outDir = new DirectoryInfo("../out");

            if (!outDir.Exists)
            {
                outDir.Create();
            }

            Console.ForegroundColor = ConsoleColor.Blue;
            Console.WriteLine("Writing javascript API help");
            JavascriptClass.GenerateApiHelp(Path.Combine(outDir.FullName, "js_apidocs"));
            Console.WriteLine("Writing javascript typescript definition file");
            JavascriptClass.GenerateTypescriptDefinition(Path.Combine(outDir.FullName, "js_tsdef"));

            Console.WriteLine("Writing python");
            PythonClass.Write(Path.Combine(outDir.FullName, "py_apidocs"));
        }
Exemplo n.º 3
0
 static int ClassValue(PythonClass c)
 {
     if (string.IsNullOrWhiteSpace(c.BaseClass))
     {
         return(0);
     }
     if (c.BaseClass.Equals("CommonObject"))
     {
         return(1);
     }
     if (c.BaseClass.Equals("GeometryBase"))
     {
         return(2);
     }
     if (c.BaseClass.Equals("Curve") || c.BaseClass.Equals("Surface"))
     {
         return(3);
     }
     return(4);
 }
Exemplo n.º 4
0
 public override void AddMethod(string name, bool isStatic, string cppFunction, string[] argList)
 {
     if (!string.IsNullOrWhiteSpace(cppFunction))
     {
         if (_sisterPythonClass == null)
         {
             _sisterPythonClass = AllPythonClasses[this.ClassName.ToLowerInvariant()];
         }
         for (int i = 0; i < _sisterPythonClass.Methods.Count; i++)
         {
             var pyMethod = _sisterPythonClass.Methods[i];
             if (pyMethod.CppFunction.Equals(cppFunction, StringComparison.Ordinal))
             {
                 argList = pyMethod.ArgList;
                 break;
             }
         }
     }
     base.AddMethod(name, isStatic, cppFunction, argList);
 }
Exemplo n.º 5
0
        public static void WriteRst(DirectoryInfo rstDirectory, RhinoCommonClass rhinocommonClass, PythonClass pythonClass)
        {
            StringBuilder sb = new StringBuilder();

            sb.AppendLine(pythonClass.ClassName);
            sb.AppendLine("".PadLeft(pythonClass.ClassName.Length, '='));
            sb.AppendLine();
            sb.AppendLine($".. py:module:: rhino3dm");
            sb.AppendLine();
            sb.AppendLine($".. py:class:: {pythonClass.ClassName}");

            foreach (var constructor in pythonClass.Constructors)
            {
                var rhcommonConstructor = rhinocommonClass.GetConstructor(constructor);
                sb.AppendLine();
                sb.Append($"   .. py:method:: {pythonClass.ClassName}(");

                StringBuilder        summary    = null;
                List <ParameterInfo> parameters = new List <ParameterInfo>();
                if (rhcommonConstructor != null)
                {
                    DocCommentToPythonDoc(rhcommonConstructor.Item2, rhcommonConstructor.Item1, 2, out summary, out parameters);
                }

                for (int i = 0; i < parameters.Count; i++)
                {
                    if (i > 0)
                    {
                        sb.Append(", ");
                    }
                    sb.Append(parameters[i].Name);
                }
                sb.AppendLine(")");
                sb.AppendLine();
                if (null == summary)
                {
                    sb.AppendLine(_T(2) + $"{pythonClass.ClassName} constructor");
                }
                else
                {
                    sb.Append(summary.ToString());
                }

                //if (parameters.Count > 0 && parameters.Count == args.Length)
                {
                    sb.AppendLine();
                    foreach (var p in parameters)
                    {
                        if (p.Description.Count == 0)
                        {
                            continue;
                        }
                        string type = ToPythonType(p.Type);
                        if (type.IndexOf(' ') < 0)
                        {
                            sb.Append($"      :param {type} {p.Name}: {p.Description[0]}");
                        }
                        else
                        {
                            sb.Append($"      :param {p.Name}: {p.Description[0]}");
                        }

                        if (p.Description.Count > 1)
                        {
                            sb.AppendLine(" \\");
                        }
                        else
                        {
                            sb.AppendLine();
                        }
                        for (int i = 1; i < p.Description.Count; i++)
                        {
                            if (i == (p.Description.Count - 1))
                            {
                                sb.AppendLine($"         {p.Description[i]}");
                            }
                            else
                            {
                                sb.AppendLine($"         {p.Description[i]} \\");
                            }
                        }
                        if (type.IndexOf(' ') > 0)
                        {
                            sb.AppendLine($"      :type {p.Name}: {type}");
                        }
                    }
                }
            }

            foreach (var property in pythonClass.Properties)
            {
                sb.AppendLine();
                sb.AppendLine($"   .. py:attribute:: {property}");
                sb.AppendLine();
                var rhcommonProperty = rhinocommonClass.GetProperty(property);
                if (null == rhcommonProperty)
                {
                    continue;
                }
                StringBuilder summary = null;
                DocCommentToPythonDoc(rhcommonProperty.Item2, rhcommonProperty.Item1, 2, out summary);
                sb.Append(summary.ToString());
            }

            foreach (var pyMethod in pythonClass.Methods)
            {
                bool     isStatic = pyMethod.IsStatic;
                string   method   = pyMethod.Name;
                string[] args     = pyMethod.ArgList;
                sb.AppendLine();
                if (isStatic)
                {
                    sb.Append($"   .. py:staticmethod:: {method}(");
                }
                else
                {
                    sb.Append($"   .. py:method:: {method}(");
                }
                for (int i = 0; i < args.Length; i++)
                {
                    if (i > 0)
                    {
                        sb.Append(", ");
                    }
                    sb.Append(args[i]);
                }
                sb.AppendLine(")");
                sb.AppendLine();

                var rhcommonMethod = rhinocommonClass.GetMethod(method);
                if (rhcommonMethod == null)
                {
                    sb.AppendLine("      [todo] add documentation");
                    continue;
                }

                StringBuilder        summary;
                List <ParameterInfo> parameters;
                ReturnInfo           returnInfo;
                string s = DocCommentToPythonDoc(rhcommonMethod.Item2, rhcommonMethod.Item1, 2, out summary, out parameters, out returnInfo);
                sb.Append(summary.ToString());
                if (parameters.Count > 0 && parameters.Count == args.Length)
                {
                    sb.AppendLine();
                    foreach (var p in parameters)
                    {
                        if (p.Description.Count == 0)
                        {
                            continue;
                        }
                        string type = ToPythonType(p.Type);
                        if (type.IndexOf(' ') < 0)
                        {
                            sb.Append($"      :param {type} {p.Name}: {p.Description[0]}");
                        }
                        else
                        {
                            sb.Append($"      :param {p.Name}: {p.Description[0]}");
                        }

                        if (p.Description.Count > 1)
                        {
                            sb.AppendLine(" \\");
                        }
                        else
                        {
                            sb.AppendLine();
                        }
                        for (int i = 1; i < p.Description.Count; i++)
                        {
                            if (i == (p.Description.Count - 1))
                            {
                                sb.AppendLine($"         {p.Description[i]}");
                            }
                            else
                            {
                                sb.AppendLine($"         {p.Description[i]} \\");
                            }
                        }
                        if (type.IndexOf(' ') > 0)
                        {
                            sb.AppendLine($"      :type {p.Name}: {type}");
                        }
                    }
                }

                sb.AppendLine();
                if (returnInfo.Description.Count > 0)
                {
                    sb.Append($"      :return: {returnInfo.Description[0]}");
                    if (returnInfo.Description.Count > 1)
                    {
                        sb.AppendLine(" \\");
                    }
                    else
                    {
                        sb.AppendLine();
                    }
                    for (int i = 1; i < returnInfo.Description.Count; i++)
                    {
                        if (i == (returnInfo.Description.Count - 1))
                        {
                            sb.AppendLine($"         {returnInfo.Description[i]}");
                        }
                        else
                        {
                            sb.AppendLine($"         {returnInfo.Description[i]} \\");
                        }
                    }
                }
                sb.AppendLine($"      :rtype: {ToPythonType(returnInfo.Type)}");
            }

            string path = Path.Combine(rstDirectory.FullName, $"{pythonClass.ClassName}.rst");

            File.WriteAllText(path, sb.ToString());
        }
Exemplo n.º 6
0
        public static void BuildDictionary(string sourcePath)
        {
            BindingClass activeClass = null;

            foreach (var file in AllSourceFiles(sourcePath))
            {
                string[] lines = System.IO.File.ReadAllLines(file);
                for (int i = 0; i < lines.Length; i++)
                {
                    string line = lines[i].Trim();
                    if (line.StartsWith("class_"))
                    {
                        string name = (line.Split(new char[] { '"' }))[1];
                        if (name.StartsWith("__"))
                        {
                            continue;
                        }
                        var activeJavascriptClass = new JavascriptClass(name);
                        int baseIndex             = line.IndexOf("base<BND_");
                        if (baseIndex > 0)
                        {
                            int baseEnd = line.IndexOf(">", baseIndex);
                            baseIndex += "base<BND_".Length;
                            string baseClass = line.Substring(baseIndex, baseEnd - baseIndex);
                            activeJavascriptClass.BaseClass = baseClass;
                        }
                        AllJavascriptClasses.Add(name.ToLowerInvariant(), activeJavascriptClass);
                        activeClass = activeJavascriptClass;
                        continue;
                    }

                    if (line.StartsWith("py::class_"))
                    {
                        string name = (line.Split(new char[] { '"' }))[1];
                        if (name.StartsWith("__"))
                        {
                            continue;
                        }
                        var activePythonClass = new PythonClass(name);
                        int baseIndex         = line.IndexOf(",");
                        if (baseIndex > 0)
                        {
                            baseIndex = line.IndexOf("BND_", baseIndex);
                        }
                        if (baseIndex > 0)
                        {
                            int baseEnd = line.IndexOf(">", baseIndex);
                            baseIndex += "BND_".Length;
                            if (baseEnd > baseIndex)
                            {
                                string baseClass = line.Substring(baseIndex, baseEnd - baseIndex);
                                activePythonClass.BaseClass = baseClass;
                            }
                        }
                        AllPythonClasses.Add(name.ToLowerInvariant(), activePythonClass);
                        activeClass = activePythonClass;
                        continue;
                    }

                    if (line.StartsWith("enum_"))
                    {
                        string name = (line.Split(new char[] { '"' }))[1];
                        if (name.StartsWith("__"))
                        {
                            continue;
                        }
                        var jsenum = new JavascriptEnum(name);
                        AllJavascriptEnums.Add(name.ToLowerInvariant(), jsenum);
                        activeClass = jsenum;
                        continue;
                    }

                    if (activeClass != null)
                    {
                        if (line.StartsWith(".constructor"))
                        {
                            int    startIndex = line.IndexOf("<");
                            int    endIndex   = line.IndexOf(">", startIndex);
                            string types      = line.Substring(startIndex + 1, endIndex - startIndex - 1);
                            activeClass.AddConstructor(types);
                            continue;
                        }
                        if (line.IndexOf("py::init<") > 0)
                        {
                            int    startIndex = line.IndexOf("py::init<") + "py::init<".Length;
                            int    endIndex   = line.IndexOf(">", startIndex);
                            string types      = line.Substring(startIndex, endIndex - startIndex);
                            activeClass.AddConstructor(types);
                            continue;
                        }

                        if (line.StartsWith(".property") ||
                            line.StartsWith(".def_property"))
                        {
                            string propName = (line.Split(new char[] { '"' }))[1];
                            activeClass.AddProperty(propName);
                            continue;
                        }

                        if (line.Contains("py::self"))
                        {
                            continue;
                        }

                        if (line.StartsWith(".function") || line.StartsWith(".def("))
                        {
                            string funcName = (line.Split(new char[] { '"' }))[1];
                            activeClass.AddMethod(funcName, false, GetArgList(line));
                        }

                        if (line.StartsWith(".class_function") ||
                            line.StartsWith(".def_static"))
                        {
                            string funcName = (line.Split(new char[] { '"' }))[1];
                            activeClass.AddMethod(funcName, true, GetArgList(line));
                        }
                        if (line.StartsWith(";"))
                        {
                            activeClass = null;
                        }
                        if (activeClass is JavascriptEnum && line.StartsWith(".value"))
                        {
                            string enumValue = (line.Split(new char[] { '"' }))[1];
                            (activeClass as JavascriptEnum).Elements.Add(enumValue);
                        }
                    }
                }
                Console.WriteLine($"parse: {file}");
            }
        }