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.Int32, 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, CoordinateSystem.World, 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.Add(xdata); circle.XData.Add(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 LwPolylineVertex polyVertex; List<LwPolylineVertex> polyVertexes = new List<LwPolylineVertex>(); polyVertex = new LwPolylineVertex(new Vector2(-50, -50)); polyVertex.StartWidth = 2; polyVertexes.Add(polyVertex); polyVertex = new LwPolylineVertex(new Vector2(50, -50)); polyVertex.StartWidth = 1; polyVertexes.Add(polyVertex); polyVertex = new LwPolylineVertex(new Vector2(50, 50)); polyVertex.Bulge = 1; polyVertexes.Add(polyVertex); polyVertex = new LwPolylineVertex(new Vector2(-50, 50)); polyVertexes.Add(polyVertex); LwPolyline polyline2d = new LwPolyline(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 LwPolylineVertex lwVertex; List<LwPolylineVertex> lwVertexes = new List<LwPolylineVertex>(); lwVertex = new LwPolylineVertex(new Vector2(-25, -25)); lwVertex.StartWidth = 2; lwVertexes.Add(lwVertex); lwVertex = new LwPolylineVertex(new Vector2(25, -25)); lwVertex.StartWidth = 1; lwVertexes.Add(lwVertex); lwVertex = new LwPolylineVertex(new Vector2(25, 25)); lwVertex.Bulge = 1; lwVertexes.Add(lwVertex); lwVertex = new LwPolylineVertex(new Vector2(-25, 25)); lwVertexes.Add(lwVertex); LwPolyline lwPolyline = new LwPolyline(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); // polyfaceMesh List<PolyfaceMeshVertex> meshVertexes = new List<PolyfaceMeshVertex> { new PolyfaceMeshVertex(0, 0, 0), new PolyfaceMeshVertex(10, 0, 0), new PolyfaceMeshVertex(10, 10, 0), new PolyfaceMeshVertex(5, 15, 0), new PolyfaceMeshVertex(0, 10, 0) }; List<PolyfaceMeshFace> faces = new List<PolyfaceMeshFace> { new PolyfaceMeshFace(new short[] {1, 2, -3}), new PolyfaceMeshFace(new short[] {-1, 3, -4}), new PolyfaceMeshFace(new short[] {-1, 4, 5}) }; PolyfaceMesh mesh = new PolyfaceMesh(meshVertexes, faces); mesh.Layer = new Layer("polyfacemesh"); mesh.Layer.Color.Index = 104; dxf.AddEntity(mesh); //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 PolylineVertex vertex; List<PolylineVertex> vertexes = new List<PolylineVertex>(); vertex = new PolylineVertex(new Vector3(-50, -50, 0)); vertexes.Add(vertex); vertex = new PolylineVertex(new Vector3(50, -50, 10)); vertexes.Add(vertex); vertex = new PolylineVertex(new Vector3(50, 50, 25)); vertexes.Add(vertex); vertex = new PolylineVertex(new Vector3(-50, 50, 50)); vertexes.Add(vertex); Polyline polyline = new Polyline(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.DrawingVariables.AcadVer = DxfVersion.AutoCad2010; dxf.Save("AutoCad2010.dxf"); dxf.DrawingVariables.AcadVer = DxfVersion.AutoCad2007; dxf.Save("AutoCad2007.dxf"); dxf.DrawingVariables.AcadVer = DxfVersion.AutoCad2004; dxf.Save("AutoCad2004.dxf"); dxf.DrawingVariables.AcadVer = DxfVersion.AutoCad2000; dxf.Save("AutoCad2000.dxf"); dxf = DxfDocument.Load("AutoCad2000.dxf"); dxf.Save("AutoCad2000 result.dxf"); }
private EntityObject ReadPolyline() { // the entity Polyline in dxf can actually hold three kinds of entities // 3d polyline is the generic polyline // polyface mesh // polylines 2d is the old way of writing polylines the AutoCAD2000 and newer always use LwPolylines to define a 2d polyline // this way of reading 2d polylines is here for compatibility reasons with older dxf versions. PolylinetypeFlags flags = PolylinetypeFlags.OpenPolyline; PolylineSmoothType smoothType = PolylineSmoothType.NoSmooth; double elevation = 0.0; double thickness = 0.0; Vector3 normal = Vector3.UnitZ; List<Vertex> vertexes = new List<Vertex>(); List<XData> xData = new List<XData>(); this.chunk.Next(); while (this.chunk.Code != 0) { switch (this.chunk.Code) { case 30: elevation = this.chunk.ReadDouble(); this.chunk.Next(); break; case 39: thickness = this.chunk.ReadDouble(); this.chunk.Next(); break; case 70: flags = (PolylinetypeFlags) this.chunk.ReadShort(); this.chunk.Next(); break; case 75: smoothType = (PolylineSmoothType) this.chunk.ReadShort(); this.chunk.Next(); break; case 71: //this field might not exist for polyface meshes, we cannot depend on it //numVertexes = int.Parse(code.Value); code = this.ReadCodePair(); this.chunk.Next(); break; case 72: //this field might not exist for polyface meshes, we cannot depend on it this.chunk.Next(); break; case 210: normal.X = this.chunk.ReadDouble(); this.chunk.Next(); break; case 220: normal.Y = this.chunk.ReadDouble(); this.chunk.Next(); break; case 230: normal.Z = this.chunk.ReadDouble(); this.chunk.Next(); break; case 1001: string appId = this.DecodeEncodedNonAsciiCharacters(this.chunk.ReadString()); XData data = this.ReadXDataRecord(this.GetApplicationRegistry(appId)); xData.Add(data); break; default: if (this.chunk.Code >= 1000 && this.chunk.Code <= 1071) throw new Exception("The extended data of an entity must start with the application registry code."); this.chunk.Next(); break; } } //begin to read the vertex list (although it is not recommended the vertex list might have 0 entries) while (this.chunk.ReadString() != DxfObjectCode.EndSequence) { if (this.chunk.ReadString() == DxfObjectCode.Vertex) { Vertex vertex = this.ReadVertex(); vertexes.Add(vertex); } } // read the end sequence object until a new element is found this.chunk.Next(); string endSequenceHandle = null; while (this.chunk.Code != 0) { switch (this.chunk.Code) { case 5: endSequenceHandle = this.chunk.ReadHex(); this.chunk.Next(); break; case 8: // the polyline EndSequence layer should be the same as the polyline layer this.chunk.Next(); break; default: this.chunk.Next(); break; } } EntityObject pol; bool isClosed = flags.HasFlag(PolylinetypeFlags.ClosedPolylineOrClosedPolygonMeshInM); //to avoid possible error between the vertex type and the polyline type //the polyline type will decide which information to use from the read vertex if (flags.HasFlag(PolylinetypeFlags.Polyline3D)) { List<PolylineVertex> polyline3dVertexes = new List<PolylineVertex>(); foreach (Vertex v in vertexes) { PolylineVertex vertex = new PolylineVertex { Flags = v.Flags, Position = v.Position, Handle = v.Handle, }; polyline3dVertexes.Add(vertex); } pol = new Polyline(polyline3dVertexes, isClosed) { Flags = flags, SmoothType = smoothType, Normal = normal }; ((Polyline) pol).EndSequence.Handle = endSequenceHandle; } else if (flags.HasFlag(PolylinetypeFlags.PolyfaceMesh)) { //the vertex list created contains vertex and face information List<PolyfaceMeshVertex> polyfaceVertexes = new List<PolyfaceMeshVertex>(); List<PolyfaceMeshFace> polyfaceFaces = new List<PolyfaceMeshFace>(); foreach (Vertex v in vertexes) { if (v.Flags.HasFlag(VertexTypeFlags.PolyfaceMeshVertex | VertexTypeFlags.Polygon3dMesh)) { PolyfaceMeshVertex vertex = new PolyfaceMeshVertex { Location = v.Position, Handle = v.Handle, }; polyfaceVertexes.Add(vertex); } else if (v.Flags.HasFlag(VertexTypeFlags.PolyfaceMeshVertex)) { PolyfaceMeshFace vertex = new PolyfaceMeshFace(v.VertexIndexes) { Handle = v.Handle }; polyfaceFaces.Add(vertex); } } pol = new PolyfaceMesh(polyfaceVertexes, polyfaceFaces) { Normal = normal }; ((PolyfaceMesh) pol).EndSequence.Handle = endSequenceHandle; } else { List<LwPolylineVertex> polylineVertexes = new List<LwPolylineVertex>(); foreach (Vertex v in vertexes) { LwPolylineVertex vertex = new LwPolylineVertex { Position = new Vector2(v.Position.X, v.Position.Y), StartWidth = v.StartWidth, Bulge = v.Bulge, EndWidth = v.EndWidth, }; polylineVertexes.Add(vertex); } pol = new LwPolyline(polylineVertexes, isClosed) { Flags = flags, Thickness = thickness, Elevation = elevation, Normal = normal, }; } pol.XData.AddRange(xData); return pol; }
private LwPolyline ReadLwPolyline() { double elevation = 0.0; double thickness = 0.0; PolylinetypeFlags flags = PolylinetypeFlags.OpenPolyline; double constantWidth = -1.0; List<LwPolylineVertex> polVertexes = new List<LwPolylineVertex>(); LwPolylineVertex v = null; double vX = 0.0; Vector3 normal = Vector3.UnitZ; List<XData> xData = new List<XData>(); this.chunk.Next(); while (this.chunk.Code != 0) { switch (this.chunk.Code) { case 38: elevation = this.chunk.ReadDouble(); this.chunk.Next(); break; case 39: thickness = this.chunk.ReadDouble(); this.chunk.Next(); break; case 43: // constant width (optional; default = 0). If present it will override any vertex width (codes 40 and/or 41) constantWidth = this.chunk.ReadDouble(); this.chunk.Next(); break; case 70: flags = (PolylinetypeFlags) this.chunk.ReadShort(); this.chunk.Next(); break; case 90: //numVertexes = int.Parse(code.Value); this.chunk.Next(); break; case 10: vX = this.chunk.ReadDouble(); this.chunk.Next(); break; case 20: double vY = this.chunk.ReadDouble(); v = new LwPolylineVertex(vX, vY); polVertexes.Add(v); this.chunk.Next(); break; case 40: double startWidth = this.chunk.ReadDouble(); if (v != null) if (startWidth >= 0.0) v.StartWidth = startWidth; this.chunk.Next(); break; case 41: double endWidth = this.chunk.ReadDouble(); if (v != null) if (endWidth >= 0.0) v.EndWidth = endWidth; this.chunk.Next(); break; case 42: if (v != null) v.Bulge = this.chunk.ReadDouble(); this.chunk.Next(); break; case 210: normal.X = this.chunk.ReadDouble(); this.chunk.Next(); break; case 220: normal.Y = this.chunk.ReadDouble(); this.chunk.Next(); break; case 230: normal.Z = this.chunk.ReadDouble(); this.chunk.Next(); break; case 1001: string appId = this.DecodeEncodedNonAsciiCharacters(this.chunk.ReadString()); XData data = this.ReadXDataRecord(this.GetApplicationRegistry(appId)); xData.Add(data); break; default: if (this.chunk.Code >= 1000 && this.chunk.Code <= 1071) throw new Exception("The extended data of an entity must start with the application registry code."); this.chunk.Next(); break; } } LwPolyline entity = new LwPolyline { Elevation = elevation, Thickness = thickness, Flags = flags, Normal = normal }; entity.Vertexes.AddRange(polVertexes); if (constantWidth >= 0.0) entity.SetConstantWidth(constantWidth); entity.XData.AddRange(xData); return entity; }
private static void ExplodeTest() { DxfDocument dxf = new DxfDocument(); //polyline LwPolylineVertex polyVertex; List<LwPolylineVertex> polyVertexes = new List<LwPolylineVertex>(); polyVertex = new LwPolylineVertex(new Vector2(-50, -23.5)); polyVertex.Bulge = 1.33; polyVertexes.Add(polyVertex); polyVertex = new LwPolylineVertex(new Vector2(34.8, -42.7)); polyVertexes.Add(polyVertex); polyVertex = new LwPolylineVertex(new Vector2(65.3, 54.7)); polyVertex.Bulge = -0.47; polyVertexes.Add(polyVertex); polyVertex = new LwPolylineVertex(new Vector2(-48.2, 42.5)); polyVertexes.Add(polyVertex); LwPolyline polyline2d = new LwPolyline(polyVertexes); polyline2d.Layer = new Layer("polyline2d"); polyline2d.Layer.Color.Index = 5; polyline2d.Normal = new Vector3(1, 1, 1); polyline2d.Elevation = 100.0f; dxf.AddEntity(polyline2d); dxf.AddEntity(polyline2d.Explode()); dxf.Save("explode.dxf"); }
private static void LineWidth() { // the line thickness works as expected, according to the AutoCAD way of doing things Line thickLine = new Line(new Vector3(0,10,0), new Vector3(10,20,0)); // when you assign a thickness to a line, the result is like a wall, it is like a 3d face whose vertexes are defined by the // start and end points of the line and the thickness along the normal of the line. thickLine.Thickness = 5; // maybe what you are trying to do is create a line with a width (something that we can read it as a line with thickness), the only way to do this is to create a polyline // the kind of result you will get if you give a width to a 2d polyline // you can only give a width to a vertex of a Polyline or a LightweigthPolyline // I am planning to drop support to AutoCAD 12 dxf files, so to define a bidimensional polyline the only way will be to use lightweight polyline // (the Polyline class and the LightWeightPolyline are basically the same). LwPolyline widthLine = new LwPolyline(); LwPolylineVertex startVertex = new LwPolylineVertex(new Vector2(0, 0)); LwPolylineVertex endVertex = new LwPolylineVertex(new Vector2(10, 10)); widthLine.Vertexes.AddRange(new[] { startVertex, endVertex }); // the easy way to give a constant width to a polyline, but you can also give a polyline width by vertex // there is a mistake on my part, following the AutoCAD documentation I should have called the PolylineVertex.StartThickness and PolylineVertex.EndThickness as // PolylineVertex.StartWidth and PolylineVertex.EndWidth // SetConstantWidth is a sort cut that will assign the given value to every start width and end width of every vertex of the polyline widthLine.SetConstantWidth(0.5); DxfDocument dxf = new DxfDocument(); // add the entities to the document (both of them to see the difference) dxf.AddEntity(thickLine); dxf.AddEntity(widthLine); dxf.Save("line width.dxf"); }
private static void TestOCStoWCS() { // vertexes of the light weight polyline, they are defined in OCS (Object Coordinate System) LwPolylineVertex v1 = new LwPolylineVertex(1, -5); LwPolylineVertex v2 = new LwPolylineVertex(-3, 2); LwPolylineVertex v3 = new LwPolylineVertex(8, 15); LwPolyline lwp = new LwPolyline(new List<LwPolylineVertex> {v1, v2, v3}); // the normal will define the plane where the lwpolyline is defined lwp.Normal = new Vector3(1, 1, 0); // the entity elevation defines the z vector of the vertexes along the entity normal lwp.Elevation = 2.5; DxfDocument dxf = new DxfDocument(); dxf.AddEntity(lwp); dxf.Save("OCStoWCS.dxf"); // if you want to convert the vertexes of the polyline to WCS (World Coordinate System), you can Vector3 v1OCS = new Vector3(v1.Position.X, v1.Position.Y, lwp.Elevation); Vector3 v2OCS = new Vector3(v2.Position.X, v2.Position.Y, lwp.Elevation); Vector3 v3OCS = new Vector3(v3.Position.X, v3.Position.Y, lwp.Elevation); IList<Vector3> vertexesWCS = MathHelper.Transform(new List<Vector3> { v1OCS, v2OCS, v3OCS }, lwp.Normal, CoordinateSystem.Object, CoordinateSystem.World); }