예제 #1
0
파일: Tools.cs 프로젝트: MarkKou/GH2FD
        public static List <Surface> GenerateNormalArrow(List <Mesh> items)
        {
            RhinoDoc doc  = RhinoDoc.ActiveDoc;
            string   unit = doc.GetUnitSystemName(true, true, true, true);

            int mp = 1;

            if (unit == "m")
            {
                mp = 1;
            }
            else if (unit == "mm")
            {
                mp = 1000;
            }
            else if (unit == "cm")
            {
                mp = 100;
            }

            List <Surface> arrow_list = new List <Surface>();

            foreach (Mesh ori_mesh in items)
            {
                foreach (MeshFace m_face in ori_mesh.Faces)
                {
                    List <Point3d> ps = new List <Point3d>();

                    if (m_face.IsTriangle)
                    {
                        ps.Add(ori_mesh.Vertices[m_face.A]);
                        ps.Add(ori_mesh.Vertices[m_face.B]);
                        ps.Add(ori_mesh.Vertices[m_face.C]);
                    }
                    else if (m_face.IsQuad)
                    {
                        ps.Add(ori_mesh.Vertices[m_face.A]);
                        ps.Add(ori_mesh.Vertices[m_face.B]);
                        ps.Add(ori_mesh.Vertices[m_face.C]);
                        ps.Add(ori_mesh.Vertices[m_face.D]);
                    }
                    else
                    {
                    }

                    Vector3d[] tv = GetFaceNormal(ps);

                    Vector3d nv = tv[0];
                    Point3d  cp = new Point3d(tv[1].X, tv[1].Y, tv[1].Z);

                    Plane      bp    = new Plane(cp, nv);
                    Circle     bc    = new Circle(bp, 0.1 * mp);
                    NurbsCurve _bc   = bc.ToNurbsCurve();
                    Surface    arrow = Surface.CreateExtrusionToPoint(_bc, new Point3d(cp.X + nv.X * mp, cp.Y + nv.Y * mp, cp.Z + nv.Z * mp));
                    arrow_list.Add(arrow);
                }
            }

            return(arrow_list);
        }
예제 #2
0
        /// <summary>
        /// read meta data from one doc object
        /// </summary>
        /// <param name="oref">object reference</param>
        /// <param name="propkeys">query keys</param>
        /// <returns>array of properties</returns>
        private string[] GetProp(ObjRef oref, string[] propkeys)
        {
            string[]    line = new string[propkeys.Length];
            RhinoObject obj  = oref.Object();

            for (int i = 0; i < propkeys.Length; i++)
            {
                string k = propkeys[i];
                if (popup.cun != "" && popup.cun != null)
                {
                    docunit = popup.cun;
                }
                else
                {
                    docunit = parent.GetUnitSystemName(true, false, true, true);
                }
                switch (k)
                {
                case "GUID":
                    line.SetValue(oref.ObjectId.ToString(), i);
                    break;

                case "Type":
                    line.SetValue(obj.ObjectType.ToString(), i);
                    break;

                case "Name":
                    line.SetValue(obj.Name, i);
                    break;

                case "Layer":
                    var li    = obj.Attributes.LayerIndex;
                    var layer = parent.Layers.FindIndex(li);
                    line.SetValue(layer.Name, i);
                    break;

                case "Color":
                    var c = obj.Attributes.DrawColor(parent);
                    if (popup.cf == 0)
                    {
                        line.SetValue(c.ToString(), i);
                    }
                    else if (popup.cf == 1)
                    {
                        line.SetValue(string.Format("{0}-{1}-{2}", c.R, c.G, c.B), i);
                    }
                    else
                    {
                        line.SetValue(string.Format("{0} {1} {2}", c.R, c.G, c.B), i);
                    }
                    break;

                case "LineType":
                    var lti = parent.Linetypes.LinetypeIndexForObject(obj);
                    var lt  = parent.Linetypes[lti].Name;
                    line.SetValue(lt, i);
                    break;

                case "PrintColor":
                    Color pc;
                    var   pcs = obj.Attributes.PlotColorSource;
                    if (pcs == ObjectPlotColorSource.PlotColorFromLayer)
                    {
                        li    = obj.Attributes.LayerIndex;
                        layer = parent.Layers.FindIndex(li);
                        pc    = layer.PlotColor;
                    }
                    else
                    {
                        pc = obj.Attributes.PlotColor;
                    }
                    if (popup.cf == 0)
                    {
                        line.SetValue(pc.ToString(), i);
                    }
                    else if (popup.cf == 1)
                    {
                        line.SetValue(string.Format("{0}-{1}-{2}", pc.R, pc.G, pc.B), i);
                    }
                    else
                    {
                        line.SetValue(string.Format("{0} {1} {2}", pc.R, pc.G, pc.B), i);
                    }
                    break;

                case "PrintWidth":
                    double pw;
                    var    pws = obj.Attributes.PlotWeightSource;
                    if (pws == ObjectPlotWeightSource.PlotWeightFromLayer)
                    {
                        li    = obj.Attributes.LayerIndex;
                        layer = parent.Layers.FindIndex(li);
                        pw    = layer.PlotWeight;
                    }
                    else
                    {
                        pw = obj.Attributes.PlotWeight;
                    }
                    if (options[0])
                    {
                        line.SetValue(pw.ToString() + "pt", i);                 // with unit
                    }
                    else
                    {
                        line.SetValue(pw.ToString(), i);
                    }
                    break;

                case "Material":
                    var mti = obj.Attributes.MaterialIndex;
                    var mt  = parent.Materials.FindIndex(mti);
                    if (mt == null)
                    {
                        line.SetValue(null, i);
                    }
                    else
                    {
                        line.SetValue(mt.Name, i);
                    }
                    break;

                case "Length":
                    string len = null;
                    if (obj.ObjectType == ObjectType.Curve)
                    {
                        var len_num = Math.Round(oref.Curve().GetLength(), popup.dp); //decimal
                        len_num *= popup.su;                                          //custom scale
                        if (popup.ts == ",")
                        {
                            len = len_num.ToString("#,##0.00");
                        }
                        else if (popup.ts == ".")
                        {
                            len = len_num.ToString("#.##0.00");
                        }
                        else if (popup.ts == " ")
                        {
                            len = len_num.ToString("# ##0.00");
                        }
                        else
                        {
                            len = len_num.ToString();
                        }
                    }
                    if (options[0] && len != null)
                    {
                        len += docunit;                              // with unit
                    }
                    line.SetValue(len, i);
                    break;

                case "Area":
                    AreaMassProperties amp = null;
                    if (obj.ObjectType == ObjectType.Brep)
                    {
                        amp = AreaMassProperties.Compute(oref.Brep());
                    }
                    else if (obj.ObjectType == ObjectType.Curve)
                    {
                        if (oref.Curve().IsClosed)
                        {
                            amp = AreaMassProperties.Compute(oref.Curve());
                        }
                        else
                        {
                            amp = null;
                        }
                    }
                    else if (obj.ObjectType == ObjectType.Extrusion)
                    {
                        if (obj.Geometry.HasBrepForm)
                        {
                            amp = AreaMassProperties.Compute(Brep.TryConvertBrep(obj.Geometry));
                        }
                        else
                        {
                            amp = null;
                        }
                    }

                    if (amp != null)
                    {
                        double area_num = Math.Round(amp.Area, popup.dp);
                        area_num *= popup.su;
                        string area;
                        if (popup.ts == ",")
                        {
                            area = area_num.ToString("#,##0.00");
                        }
                        else if (popup.ts == ".")
                        {
                            area = area_num.ToString("#.##0.00");
                        }
                        else if (popup.ts == " ")
                        {
                            area = area_num.ToString("# ##0.00");
                        }
                        else
                        {
                            area = area_num.ToString();
                        }

                        if (options[0])
                        {
                            if (popup.cun != "" && popup.cun != null)
                            {
                                line.SetValue(area + popup.cun + "sq", i);
                            }
                            else
                            {
                                line.SetValue(area + docunit + "sq", i);
                            }
                        }
                        else
                        {
                            line.SetValue(area, i);
                        }
                    }
                    else
                    {
                        line.SetValue(null, i);
                    }
                    break;

                case "Volume":
                    string vol = null;
                    if (obj.ObjectType == ObjectType.Brep)
                    {
                        if (oref.Brep().IsSolid)
                        {
                            double vol_num = oref.Brep().GetVolume(rtol, tol);
                            vol_num  = Math.Round(vol_num, popup.dp);
                            vol_num *= popup.su;
                            if (popup.ts == ",")
                            {
                                vol = vol_num.ToString("#,##0.00");
                            }
                            else if (popup.ts == ".")
                            {
                                vol = vol_num.ToString("#.##0.00");
                            }
                            else if (popup.ts == " ")
                            {
                                vol = vol_num.ToString("# ##0.00");
                            }
                            else
                            {
                                vol = vol_num.ToString();
                            }
                        }
                        else
                        {
                            vol = "open brep";
                        }
                    }
                    else if (obj.ObjectType == ObjectType.Extrusion)
                    {
                        Brep b = Brep.TryConvertBrep(obj.Geometry);
                        if (b == null)
                        {
                            vol = "invalid extrusion";
                        }
                        else
                        {
                            if (b.IsSolid)
                            {
                                double vol_num = b.GetVolume(rtol, tol);
                                vol_num  = Math.Round(vol_num, popup.dp);
                                vol_num *= popup.su;
                                if (popup.ts == ",")
                                {
                                    vol = vol_num.ToString("#,##0.00");
                                }
                                else if (popup.ts == ".")
                                {
                                    vol = vol_num.ToString("#.##0.00");
                                }
                                else if (popup.ts == " ")
                                {
                                    vol = vol_num.ToString("# ##0.00");
                                }
                                else
                                {
                                    vol = vol_num.ToString();
                                }
                            }
                            else
                            {
                                vol = "open brep";
                            }
                        }
                    }

                    if (!options[0] || vol == null)
                    {
                        line.SetValue(vol, i);
                    }
                    else if (vol != "open brep" && vol != "invalid extrusion")
                    {
                        if (popup.cun != "" && popup.cun != null)
                        {
                            line.SetValue(vol + popup.cun + "cu", i);
                        }
                        else
                        {
                            line.SetValue(vol + docunit + "cu", i);
                        }
                    }
                    break;

                case "NumPts":
                    if (obj.ObjectType == ObjectType.Curve)
                    {
                        line.SetValue(oref.Curve().ToNurbsCurve().Points.Count.ToString(), i);
                    }
                    else
                    {
                        line.SetValue(null, i);
                    }
                    break;

                case "NumEdges":
                    if (obj.ObjectType == ObjectType.Brep)
                    {
                        line.SetValue(oref.Brep().Edges.Count.ToString(), i);
                    }
                    else if (obj.ObjectType == ObjectType.Extrusion)
                    {
                        if (obj.Geometry.HasBrepForm)
                        {
                            line.SetValue(Brep.TryConvertBrep(obj.Geometry).Edges.Count.ToString(), i);
                        }
                        else
                        {
                            line.SetValue("invalid extrusion", i);
                        }
                    }
                    else
                    {
                        line.SetValue(null, i);
                    }
                    break;

                case "NumFaces":
                    if (obj.ObjectType == ObjectType.Brep)
                    {
                        line.SetValue(oref.Brep().Faces.Count.ToString(), i);
                    }
                    else if (obj.ObjectType == ObjectType.Extrusion)
                    {
                        if (obj.Geometry.HasBrepForm)
                        {
                            line.SetValue(Brep.TryConvertBrep(obj.Geometry).Faces.Count.ToString(), i);
                        }
                        else
                        {
                            line.SetValue("invalid extrusion", i);
                        }
                    }
                    else
                    {
                        line.SetValue(null, i);
                    }
                    break;

                case "Degree":
                    if (obj.ObjectType == ObjectType.Curve)
                    {
                        line.SetValue(oref.Curve().Degree.ToString(), i);
                    }
                    else
                    {
                        line.SetValue(null, i);
                    }
                    break;

                case "CenterX":
                    var num = obj.Geometry.GetBoundingBox(false).Center.X;
                    num  = Math.Round(num, popup.dp);
                    num *= popup.su;
                    line.SetValue(num.ToString(), i);
                    break;

                case "CenterY":
                    num  = obj.Geometry.GetBoundingBox(false).Center.Y;
                    num  = Math.Round(num, popup.dp);
                    num *= popup.su;
                    line.SetValue(num.ToString(), i);
                    break;

                case "CenterZ":
                    num  = obj.Geometry.GetBoundingBox(false).Center.Z;
                    num  = Math.Round(num, popup.dp);
                    num *= popup.su;
                    line.SetValue(num.ToString(), i);
                    break;

                case "IsPlanar":
                    if (obj.ObjectType == ObjectType.Brep)
                    {
                        Brep brep = oref.Brep();
                        if (brep.IsSurface)
                        {
                            if (brep.Faces[0].IsPlanar())
                            {
                                line.SetValue("yes", i);
                            }
                            else
                            {
                                line.SetValue("no", i);
                            }
                        }
                        else
                        {
                            line.SetValue("polysrf", i);
                        }
                    }
                    else if (obj.ObjectType == ObjectType.Curve)
                    {
                        if (oref.Curve().IsPlanar())
                        {
                            line.SetValue("yes", i);
                        }
                        else
                        {
                            line.SetValue("no", i);
                        }
                    }
                    else if (obj.ObjectType == ObjectType.Extrusion)
                    {
                        if (obj.Geometry.HasBrepForm)
                        {
                            Brep brep = Brep.TryConvertBrep(obj.Geometry);
                            if (brep.IsSurface)
                            {
                                if (brep.Faces[0].IsPlanar())
                                {
                                    line.SetValue("yes", i);
                                }
                                else
                                {
                                    line.SetValue("no", i);
                                }
                            }
                            else
                            {
                                line.SetValue("polysrf", i);
                            }
                        }
                        else
                        {
                            line.SetValue("invalid extrusion", i);
                        }
                    }
                    else
                    {
                        line.SetValue("irrelevant", i);
                    }
                    break;

                case "IsClosed":
                    if (obj.ObjectType == ObjectType.Brep)
                    {
                        Brep brep = oref.Brep();
                        if (brep.IsSolid)
                        {
                            line.SetValue("yes", i);
                        }
                        else
                        {
                            line.SetValue("no", i);
                        }
                    }
                    else if (obj.ObjectType == ObjectType.Curve)
                    {
                        if (oref.Curve().IsClosed)
                        {
                            line.SetValue("yes", i);
                        }
                        else
                        {
                            line.SetValue("no", i);
                        }
                    }
                    else if (obj.ObjectType == ObjectType.Extrusion)
                    {
                        if (obj.Geometry.HasBrepForm)
                        {
                            Brep brep = Brep.TryConvertBrep(obj.Geometry);
                            if (brep.IsSolid)
                            {
                                line.SetValue("yes", i);
                            }
                            else
                            {
                                line.SetValue("no", i);
                            }
                        }
                        else
                        {
                            line.SetValue("invalid extrusion", i);
                        }
                    }
                    else
                    {
                        line.SetValue("irrelevant", i);
                    }
                    break;

                case "Comments":
                    var    usertxts = obj.Attributes.GetUserStrings();
                    string txt      = null;
                    if (usertxts.Count == 1)
                    {
                        txt = usertxts[0];
                    }
                    else
                    {
                        txt = string.Join(";", usertxts.AllKeys);
                    }
                    line.SetValue("keys_" + txt, i);
                    break;

                default:
                    break;
                }
            }
            return(line);
        }