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