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); }
/// <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); }