Ejemplo n.º 1
0
        /// <summary>
        /// 加载多线段
        /// </summary>
        /// <param name="line"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        private Element LoadWpLine(LightWeightPolyline line, int type)
        {
            var lle = new LightWeightPolylineElement();
            var tag = line.Layer.Name;

            lle.EPoints = new List <EPoint>();
            foreach (var point in line.Vertexes)
            {
                lle.EPoints.Add(new EPoint(point.Location.X - MinX, MaxY - point.Location.Y));
            }

            var color = GetBrush(line.Color, line.Layer, type);

            //lle.Color = color;

            if (line.Flags == RTSafe.DxfCore.Entities.PolylineTypeFlags.ClosedPolylineOrClosedPolygonMeshInM)
            {
                lle.EPoints = lle.EPoints;
                //lle.Color = color;
                //p.StrokeThickness = GetThickness(line.Thickness);
                lle.Tag = tag;
                return(lle);
            }
            lle.EPoint = lle.EPoint;
            //lle.Color = color;
            //p.StrokeThickness = GetThickness(line.Thickness);
            lle.Tag = tag;
            return(lle);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Saves the database of the actual DxfDocument to a dxf ASCII file.
        /// </summary>
        /// <param name="file">File name.</param>
        /// <param name="dxfVersion">Dxf file <see cref="DxfVersion">version</see>.</param>
        public void Save(string file, DxfVersion dxfVersion)
        {
            ReAsignHandlersAndDefaultObjects();
            this.fileName = Path.GetFileNameWithoutExtension(file);
            this.version  = dxfVersion;

            List <Polyline>  ellipsePolys = null;
            List <IPolyline> lwPolys;
            Dictionary <string, List <IEntityObject> > blockEntities;

            if (this.version == DxfVersion.AutoCad12)
            {
                // since AutoCad dxf Version 12 doesn't support ellipses, we will transform them in polylines
                ellipsePolys = new List <Polyline>();
                foreach (Ellipse ellipse in this.ellipses)
                {
                    Polyline poly = ellipse.ToPolyline(ellipse.CurvePoints);
                    this.handleCount = poly.AsignHandle(this.handleCount);
                    ellipsePolys.Add(poly);
                }

                // since AutoCad dxf Version 12 doesn't support lwpolylines, we will transform them in polylines
                lwPolys = new List <IPolyline>();
                foreach (IPolyline lwPoly in this.polylines)
                {
                    if (lwPoly is LightWeightPolyline)
                    {
                        Polyline poly = ((LightWeightPolyline)lwPoly).ToPolyline();
                        this.handleCount = poly.AsignHandle(this.handleCount);
                        lwPolys.Add(poly);
                    }
                    else
                    {
                        lwPolys.Add(lwPoly);
                    }
                }

                // since AutoCad dxf Version 12 doesn't support lwpolylines in blocks, we will transform them in polylines
                blockEntities = new Dictionary <string, List <IEntityObject> >();
                foreach (Block block in this.blocks.Values)
                {
                    blockEntities.Add(block.Name, new List <IEntityObject>());
                    foreach (IEntityObject entity in block.Entities)
                    {
                        if (entity is LightWeightPolyline)
                        {
                            Polyline poly = ((LightWeightPolyline)entity).ToPolyline();
                            this.handleCount = poly.AsignHandle(this.handleCount);
                            blockEntities[block.Name].Add(poly);
                        }
                        else
                        {
                            blockEntities[block.Name].Add(entity);
                        }
                    }
                }
            }
            else
            {
                // since AutoCad dxf Version 12 doesn't support lwpolylines, we will transform them in polylines
                lwPolys = new List <IPolyline>();
                foreach (IPolyline lwPoly in this.polylines)
                {
                    if ((lwPoly is Polyline))
                    {
                        LightWeightPolyline poly = ((Polyline)lwPoly).ToLightWeightPolyline();
                        this.handleCount = poly.AsignHandle(this.handleCount);
                        lwPolys.Add(poly);
                    }
                    else
                    {
                        lwPolys.Add(lwPoly);
                    }
                }

                // since latter AutoCad dxf Version doesn't support polylines in blocks, we will transform them in lightweightpolylines
                blockEntities = new Dictionary <string, List <IEntityObject> >();
                foreach (Block block in this.blocks.Values)
                {
                    blockEntities.Add(block.Name, new List <IEntityObject>());
                    foreach (IEntityObject entity in block.Entities)
                    {
                        if (entity is Polyline)
                        {
                            LightWeightPolyline poly = ((Polyline)entity).ToLightWeightPolyline();
                            this.handleCount = poly.AsignHandle(this.handleCount);
                            blockEntities[block.Name].Add(poly);
                        }
                        else
                        {
                            blockEntities[block.Name].Add(entity);
                        }
                    }
                }
            }

            CultureInfo cultureInfo = CultureInfo.CurrentCulture;

            Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;

            DxfWriter dxfWriter = new DxfWriter(file, dxfVersion);

            dxfWriter.Open();
            dxfWriter.WriteComment("Dxf file generated by SharpDxf, Copyright(C) 2009 Lomatus, Licensed under LGPL");

            //HEADER SECTION
            dxfWriter.BeginSection(StringCode.HeaderSection);
            dxfWriter.WriteSystemVariable(new HeaderVariable(SystemVariable.DabaseVersion, StringEnum.GetStringValue(this.version)));
            dxfWriter.WriteSystemVariable(new HeaderVariable(SystemVariable.HandSeed, Convert.ToString(this.handleCount, 16)));
            dxfWriter.EndSection();

            ////CLASSES SECTION
            //dxfWriter.BeginSection(StringCode.ClassesSection);
            //dxfWriter.EndSection();

            //TABLES SECTION
            dxfWriter.BeginSection(StringCode.TablesSection);

            //viewport tables
            if (this.version != DxfVersion.AutoCad12)
            {
                dxfWriter.BeginTable(StringCode.ViewPortTable);
                foreach (ViewPort vport in this.viewports.Values)
                {
                    dxfWriter.WriteViewPort(vport);
                }
                dxfWriter.EndTable();
            }

            //line type tables
            dxfWriter.BeginTable(StringCode.LineTypeTable);
            foreach (LineType lineType in this.lineTypes.Values)
            {
                dxfWriter.WriteLineType(lineType);
            }
            dxfWriter.EndTable();

            //layer tables
            dxfWriter.BeginTable(StringCode.LayerTable);
            foreach (Layer layer in this.layers.Values)
            {
                dxfWriter.WriteLayer(layer);
            }
            dxfWriter.EndTable();

            //text style tables
            dxfWriter.BeginTable(StringCode.TextStyleTable);
            foreach (TextStyle style in this.textStyles.Values)
            {
                dxfWriter.WriteTextStyle(style);
            }
            dxfWriter.EndTable();

            //view
            dxfWriter.BeginTable(StringCode.ViewTable);
            dxfWriter.EndTable();

            //ucs
            dxfWriter.BeginTable(StringCode.UcsTable);
            dxfWriter.EndTable();

            //registered application tables
            dxfWriter.BeginTable(StringCode.ApplicationIDTable);
            foreach (ApplicationRegistry id in this.appRegisterNames.Values)
            {
                dxfWriter.RegisterApplication(id);
            }
            dxfWriter.EndTable();

            //dimension style tables
            if (this.version != DxfVersion.AutoCad12)
            {
                dxfWriter.BeginTable(StringCode.DimensionStyleTable);
                foreach (DimensionStyle style in this.dimStyles.Values)
                {
                    dxfWriter.WriteDimensionStyle(style);
                }
                dxfWriter.EndTable();
            }

            //block record tables, this table isnot recognized by AutoCad12
            if (this.version != DxfVersion.AutoCad12)
            {
                dxfWriter.BeginTable(StringCode.BlockRecordTable);
                foreach (Block block in this.blocks.Values)
                {
                    dxfWriter.WriteBlockRecord(block.Record);
                }
                dxfWriter.EndTable();
            }

            dxfWriter.EndSection(); //End section tables

            dxfWriter.BeginSection(StringCode.BlocksSection);
            foreach (Block block in this.blocks.Values)
            {
                dxfWriter.WriteBlock(block, blockEntities[block.Name]);
            }

            dxfWriter.EndSection(); //End section blocks

            //ENTITIES SECTION
            dxfWriter.BeginSection(StringCode.EntitiesSection);

            #region writting entities

            foreach (Arc arc in this.arcs)
            {
                dxfWriter.WriteEntity(arc);
            }
            foreach (Circle circle in this.circles)
            {
                dxfWriter.WriteEntity(circle);
            }

            // only for version 12 draw polylines instead of ellipses
            if (this.version == DxfVersion.AutoCad12)
            {
                if (ellipsePolys != null)
                {
                    foreach (Polyline ellipse in ellipsePolys)
                    {
                        dxfWriter.WriteEntity(ellipse);
                    }
                }
            }
            else
            {
                foreach (Ellipse ellipse  in this.ellipses)
                {
                    dxfWriter.WriteEntity(ellipse);
                }
            }
            foreach (NurbsCurve nurbsCurve  in this.nurbsCurves)
            {
                dxfWriter.WriteEntity(nurbsCurve);
            }
            foreach (Point point in this.points)
            {
                dxfWriter.WriteEntity(point);
            }
            foreach (Face3d face in this.faces3d)
            {
                dxfWriter.WriteEntity(face);
            }
            foreach (Solid solid in this.solids)
            {
                dxfWriter.WriteEntity(solid);
            }
            foreach (Insert insert in this.inserts)
            {
                dxfWriter.WriteEntity(insert);
            }
            foreach (Line line in this.lines)
            {
                dxfWriter.WriteEntity(line);
            }

            // lwpolyline in Acad12 are written as polylines

            foreach (IPolyline pol in lwPolys)
            {
                dxfWriter.WriteEntity(pol);
            }

            //foreach (IPolyline polyline in this.polylines)
            //{
            //    // avoid write lwpolylines in Acad12
            //    if (this.version != DxfVersion.AutoCad12 || !(polyline is LightWeightPolyline))
            //    {
            //        dxfWriter.WriteEntity(polyline);
            //    }
            //}

            foreach (Text text in this.texts)
            {
                dxfWriter.WriteEntity(text);
            }
            #endregion

            dxfWriter.EndSection(); //End section entities

            //OBJECTS SECTION
            dxfWriter.BeginSection(StringCode.ObjectsSection);
            dxfWriter.WriteDictionary(Dictionary.Default);
            dxfWriter.EndSection();

            dxfWriter.Close();

            Thread.CurrentThread.CurrentCulture = cultureInfo;
        }
Ejemplo n.º 3
0
        private static void WriteDxfFile()
        {
            DxfDocument dxf = new DxfDocument();

            //arc
            Arc arc = new Arc(new Vector3(10, 10, 0), 10, 45, 135);

            arc.Layer             = new Layer("arc");
            arc.Layer.Color.Index = 1;
            dxf.AddEntity(arc);

            //xData sample
            XData xdata = new XData(new ApplicationRegistry("netDxf"));

            xdata.XDataRecord.Add(new XDataRecord(XDataCode.String, "extended data with netDxf"));
            xdata.XDataRecord.Add(XDataRecord.OpenControlString);
            xdata.XDataRecord.Add(new XDataRecord(XDataCode.WorldSpacePositionX, 0));
            xdata.XDataRecord.Add(new XDataRecord(XDataCode.WorldSpacePositionY, 0));
            xdata.XDataRecord.Add(new XDataRecord(XDataCode.WorldSpacePositionZ, 0));
            xdata.XDataRecord.Add(XDataRecord.CloseControlString);

            XData xdata2 = new XData(new ApplicationRegistry("other application"));

            xdata2.XDataRecord.Add(new XDataRecord(XDataCode.String, "extended data with netDxf"));
            xdata2.XDataRecord.Add(XDataRecord.OpenControlString);
            xdata2.XDataRecord.Add(new XDataRecord(XDataCode.String, "string record"));
            xdata2.XDataRecord.Add(new XDataRecord(XDataCode.Real, 15.5));
            xdata2.XDataRecord.Add(new XDataRecord(XDataCode.Long, 350));
            xdata2.XDataRecord.Add(XDataRecord.CloseControlString);

            //circle
            Vector3 extrusion = new Vector3(1, 1, 1);
            Vector3 centerWCS = new Vector3(1, 1, 1);
            Vector3 centerOCS = MathHelper.Transform(centerWCS,
                                                     extrusion,
                                                     MathHelper.CoordinateSystem.World,
                                                     MathHelper.CoordinateSystem.Object);

            Circle circle = new Circle(centerOCS, 5);

            circle.Layer       = new Layer("circle with spaces");
            circle.Layer.Color = AciColor.Yellow;
            circle.LineType    = LineType.Dashed;
            circle.Normal      = extrusion;
            circle.XData       = new Dictionary <ApplicationRegistry, XData>
            {
                { xdata.ApplicationRegistry, xdata },
                { xdata2.ApplicationRegistry, xdata2 }
            };

            dxf.AddEntity(circle);

            //points
            Point point1 = new Point(new Vector3(-3, -3, 0));

            point1.Layer = new Layer("point");
            point1.Color = new AciColor(30);
            Point point2 = new Point(new Vector3(1, 1, 1));

            point2.Layer             = point1.Layer;
            point2.Layer.Color.Index = 9;
            point2.Normal            = new Vector3(1, 1, 1);
            dxf.AddEntity(point1);
            dxf.AddEntity(point2);

            //3dface
            Face3d face3D = new Face3d(new Vector3(-5, -5, 5),
                                       new Vector3(5, -5, 5),
                                       new Vector3(5, 5, 5),
                                       new Vector3(-5, 5, 5));

            face3D.Layer             = new Layer("3dface");
            face3D.Layer.Color.Index = 3;
            dxf.AddEntity(face3D);

            //polyline
            PolylineVertex        polyVertex;
            List <PolylineVertex> polyVertexes = new List <PolylineVertex>();

            polyVertex            = new PolylineVertex(new Vector2(-50, -50));
            polyVertex.BeginWidth = 2;
            polyVertexes.Add(polyVertex);
            polyVertex            = new PolylineVertex(new Vector2(50, -50));
            polyVertex.BeginWidth = 1;
            polyVertexes.Add(polyVertex);
            polyVertex       = new PolylineVertex(new Vector2(50, 50));
            polyVertex.Bulge = 1;
            polyVertexes.Add(polyVertex);
            polyVertex = new PolylineVertex(new Vector2(-50, 50));
            polyVertexes.Add(polyVertex);
            Polyline polyline2d = new Polyline(polyVertexes, true);

            polyline2d.Layer             = new Layer("polyline2d");
            polyline2d.Layer.Color.Index = 5;
            polyline2d.Normal            = new Vector3(1, 1, 1);
            polyline2d.Elevation         = 100.0f;
            dxf.AddEntity(polyline2d);

            //lightweight polyline
            LightWeightPolylineVertex        lwVertex;
            List <LightWeightPolylineVertex> lwVertexes = new List <LightWeightPolylineVertex>();

            lwVertex            = new LightWeightPolylineVertex(new Vector2(-25, -25));
            lwVertex.BeginWidth = 2;
            lwVertexes.Add(lwVertex);
            lwVertex            = new LightWeightPolylineVertex(new Vector2(25, -25));
            lwVertex.BeginWidth = 1;
            lwVertexes.Add(lwVertex);
            lwVertex       = new LightWeightPolylineVertex(new Vector2(25, 25));
            lwVertex.Bulge = 1;
            lwVertexes.Add(lwVertex);
            lwVertex = new LightWeightPolylineVertex(new Vector2(-25, 25));
            lwVertexes.Add(lwVertex);
            LightWeightPolyline lwPolyline = new LightWeightPolyline(lwVertexes, true);

            lwPolyline.Layer             = new Layer("lwpolyline");
            lwPolyline.Layer.Color.Index = 5;
            lwPolyline.Normal            = new Vector3(1, 1, 1);
            lwPolyline.Elevation         = 100.0f;
            dxf.AddEntity(lwPolyline);

            //line
            Line line = new Line(new Vector3(0, 0, 0), new Vector3(10, 10, 10));

            line.Layer             = new Layer("line");
            line.Layer.Color.Index = 6;
            dxf.AddEntity(line);

            //3d polyline
            Polyline3dVertex        vertex;
            List <Polyline3dVertex> vertexes = new List <Polyline3dVertex>();

            vertex = new Polyline3dVertex(new Vector3(-50, -50, 0));
            vertexes.Add(vertex);
            vertex = new Polyline3dVertex(new Vector3(50, -50, 10));
            vertexes.Add(vertex);
            vertex = new Polyline3dVertex(new Vector3(50, 50, 25));
            vertexes.Add(vertex);
            vertex = new Polyline3dVertex(new Vector3(-50, 50, 50));
            vertexes.Add(vertex);
            Polyline3d polyline = new Polyline3d(vertexes, true);

            polyline.Layer             = new Layer("polyline3d");
            polyline.Layer.Color.Index = 24;
            dxf.AddEntity(polyline);

            //block definition
            Block block = new Block("TestBlock");

            block.Entities.Add(new Line(new Vector3(-5, -5, 5), new Vector3(5, 5, 5)));
            block.Entities.Add(new Line(new Vector3(5, -5, 5), new Vector3(-5, 5, 5)));

            //insert
            Insert insert = new Insert(block, new Vector3(5, 5, 5));

            insert.Layer             = new Layer("insert");
            insert.Layer.Color.Index = 4;
            dxf.AddEntity(insert);

            //text
            TextStyle style = new TextStyle("True type font", "Arial.ttf");
            Text      text  = new Text("Hello world!", Vector3.Zero, 10.0f, style);

            text.Layer             = new Layer("text");
            text.Layer.Color.Index = 8;
            text.Alignment         = TextAlignment.TopRight;
            dxf.AddEntity(text);

            dxf.Save("AutoCad2010.dxf", DxfVersion.AutoCad2010);
            dxf.Save("AutoCad2007.dxf", DxfVersion.AutoCad2007);
            dxf.Save("AutoCad2004.dxf", DxfVersion.AutoCad2004);
            dxf.Save("AutoCad2000.dxf", DxfVersion.AutoCad2000);
        }