예제 #1
0
        /// <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);
        }
예제 #2
0
        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);
             * }*/
        }