/// <summary> /// Read a DXF and convert it into native Nucleus geometry types. /// </summary> /// <param name="doc">The document to read from</param> /// <returns></returns> private VertexGeometryCollection ReadDXF(DxfDocument doc) { VertexGeometryCollection result = new VertexGeometryCollection(); double scale = 1.0; if (doc.DrawingVariables.InsUnits == netDxf.Units.DrawingUnits.Millimeters) { scale = 0.001; } else if (doc.DrawingVariables.InsUnits == netDxf.Units.DrawingUnits.Centimeters) { scale = 0.01; } FromDXF.ConversionScaling = scale; // Hatches foreach (netDxf.Entities.Hatch hatch in doc.Hatches) { result.AddRange(FromDXF.Convert(hatch)); } // Lines foreach (netDxf.Entities.Line line in doc.Lines) { result.Add(FromDXF.Convert(line)); } // Polylines foreach (netDxf.Entities.LwPolyline pLine in doc.LwPolylines) { result.Add(FromDXF.Convert(pLine)); } foreach (netDxf.Entities.Polyline pLine in doc.Polylines) { result.Add(FromDXF.Convert(pLine)); } // Arcs foreach (netDxf.Entities.Arc arc in doc.Arcs) { result.Add(FromDXF.Convert(arc)); } foreach (netDxf.Entities.Circle circle in doc.Circles) { result.Add(FromDXF.Convert(circle)); } // Splines foreach (netDxf.Entities.Spline spline in doc.Splines) { result.Add(FromDXF.Convert(spline)); } // Points foreach (netDxf.Entities.Point point in doc.Points) { result.Add(FromDXF.Convert(point)); } //TODO: Meshes foreach (netDxf.Entities.Mesh mesh in doc.Meshes) { result.Add(FromDXF.Convert(mesh)); } // Text foreach (netDxf.Entities.Text text in doc.Texts) { result.Add(FromDXF.Convert(text)); } foreach (netDxf.Entities.MText text in doc.MTexts) { result.Add(FromDXF.Convert(text)); } // Block inserts foreach (netDxf.Entities.Insert insert in doc.Inserts) { // Explode: // Note: There is some commented-out code in the library to do this: // see: https://netdxf.codeplex.com/SourceControl/latest#netDxf/Entities/Insert.cs // TODO: Review and improve? Vector translation = FromDXF.Convert(insert.Position); Transform transform = FromDXF.Convert(insert.GetTransformation(netDxf.Units.DrawingUnits.Meters)); foreach (netDxf.Entities.EntityObject entity in insert.Block.Entities) { VertexGeometry shape = FromDXF.Convert(entity); if (shape != null) { shape.Transform(transform); shape.Move(translation); result.Add(shape); } } } return(result); }
public GeometryVisualiserDialog(object visualise) : this() { VertexGeometryCollection geometry = new VertexGeometryCollection(); if (_StorePath.Exists) { try { Stream stream = new FileStream(_StorePath, FileMode.Open, FileAccess.Read, FileShare.Read); stream.Seek(0, SeekOrigin.Begin); IFormatter formatter = new BinaryFormatter(); formatter.Binder = new CustomSerializationBinder(); var storedGeo = formatter.Deserialize(stream) as VertexGeometryCollection; stream.Close(); if (storedGeo != null) { geometry.AddRange(storedGeo); } } catch { } } if (visualise is MeshFace) { visualise = new MeshFaceCollection((MeshFace)visualise); } //else if (visualise is Mesh) visualise = ((Mesh)visualise).Faces; if (visualise is IList <VertexGeometry> ) { geometry.TryAddRange((IList <VertexGeometry>)visualise); } else if (visualise is IList <Curve> ) { geometry.TryAddRange((IList <Curve>)visualise); } else if (visualise is IList <PlanarRegion> ) { geometry.TryAddRange((IList <PlanarRegion>)visualise); } else if (visualise is VertexGeometry) { geometry.TryAdd((VertexGeometry)visualise); } else if (visualise is MeshFaceCollection) { var faces = (MeshFaceCollection)visualise; CurveCollection edges = faces.ExtractFaceBoundaries(); foreach (var edge in edges) { var region = new PlanarRegion(edge); geometry.Add(region); region.Attributes = new GeometryAttributes(new Colour(128, 0, 255, 128)); geometry.Add(edge); edge.Attributes = new GeometryAttributes(new Colour(64, 0, 0, 0)); } } else if (visualise is IList <Vertex> ) { var verts = (IList <Vertex>)visualise; var cloud = new Cloud(verts.GetPositions()); geometry.Add(cloud); } else if (visualise is IList <Geometry.Vector> ) { var v = (IList <Geometry.Vector>)visualise; var cloud = new Cloud(v); geometry.Add(cloud); } else if (visualise is MeshDivisionEdge) { var mDE = (MeshDivisionEdge)visualise; var line = new Geometry.Line(mDE.Start, mDE.End); geometry.Add(line); if (mDE.Vertices != null && mDE.Vertices.Count > 0) { var cloud = new Cloud(mDE.Vertices.GetPositions()); geometry.Add(cloud); } } else if (visualise is IList <MeshDivisionEdge> ) { foreach (var mDC in (IList <MeshDivisionEdge>)visualise) { var mDE = (MeshDivisionEdge)visualise; var line = new Geometry.Line(mDE.Start, mDE.End); geometry.Add(line); if (mDE.Vertices != null && mDE.Vertices.Count > 0) { var cloud = new Cloud(mDE.Vertices.GetPositions()); geometry.Add(cloud); } } } else if (visualise is IWidePath) { IWidePath path = (IWidePath)visualise; AddWidePath(geometry, path); } else if (visualise is IList <IWidePath> ) { foreach (var path in (IList <IWidePath>)visualise) { AddWidePath(geometry, path); } } // TODO: Convert other types to vertexgeometry BoundingBox bBox = geometry.BoundingBox; /*MinX.Text = bBox.MinX.ToString(); * MaxX.Text = bBox.MaxX.ToString(); * MinY.Text = bBox.MinY.ToString(); * MaxY.Text = bBox.MaxY.ToString();*/ Canvas.CurveThickness = 0.005 * bBox.SizeVector.Magnitude(); Canvas.PointDiameter = 0.01 * bBox.SizeVector.Magnitude(); Canvas.DefaultBrush = new SolidColorBrush(Color.FromArgb(128, 0, 0, 0)); //Canvas.FillBrush = new SolidColorBrush(Color.FromArgb(64, 0, 0, 0)); Canvas.Geometry = geometry; /*var xDivs = bBox.X.ReasonableDivisions(10); * var yDivs = bBox.Y.ReasonableDivisions(10); * * foreach (double x in xDivs) * { * var line = new Geometry.Line(x, bBox.MinY - 10, x, bBox.MaxY + 10); * line.Attributes = new GeometryAttributes(Rendering.Colour.Green, 0.1); * Canvas.AddContents(line); * }*/ }