private static void LwPolyline() { DxfDocument dxf = new DxfDocument(); LwPolyline poly = new LwPolyline(); poly.Vertexes.Add(new LwPolylineVertex(0, 0)); poly.Vertexes.Add(new LwPolylineVertex(10, 10)); poly.Vertexes.Add(new LwPolylineVertex(20, 0)); poly.Vertexes.Add(new LwPolylineVertex(30, 10)); poly.SetConstantWidth(2); //poly.IsClosed = true; dxf.AddEntity(poly); dxf.Save("lwpolyline.dxf"); dxf = DxfDocument.Load("lwpolyline.dxf"); }
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 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"); }