/// <summary> /// Creates a new MLine that is a copy of the current instance. /// </summary> /// <returns>A new MLine that is a copy of this instance.</returns> public override object Clone() { MLine entity = new MLine { //EntityObject properties Layer = (Layer)this.Layer.Clone(), Linetype = (Linetype)this.Linetype.Clone(), Color = (AciColor)this.Color.Clone(), Lineweight = this.Lineweight, Transparency = (Transparency)this.Transparency.Clone(), LinetypeScale = this.LinetypeScale, Normal = this.Normal, IsVisible = this.IsVisible, //MLine properties Elevation = this.elevation, Scale = this.scale, Justification = this.justification, Style = (MLineStyle)this.style.Clone(), Flags = this.flags }; foreach (MLineVertex vertex in this.vertexes) { entity.vertexes.Add((MLineVertex)vertex.Clone()); } foreach (XData data in this.XData.Values) { entity.XData.Add((XData)data.Clone()); } return(entity); }
/// <summary> /// Creates a new MLine that is a copy of the current instance. /// </summary> /// <returns>A new MLine that is a copy of this instance.</returns> public override object Clone() { List <MLineVertex> copyVertexes = new List <MLineVertex>(); foreach (MLineVertex vertex in this.vertexes) { copyVertexes.Add((MLineVertex)vertex.Clone()); } MLine entity = new MLine { //EntityObject properties Layer = (Layer)this.layer.Clone(), LineType = (LineType)this.lineType.Clone(), Color = (AciColor)this.color.Clone(), Lineweight = (Lineweight)this.lineweight.Clone(), Transparency = (Transparency)this.transparency.Clone(), LineTypeScale = this.lineTypeScale, Normal = this.normal, //MLine properties Vertexes = copyVertexes, Elevation = this.elevation, Scale = this.scale, IsClosed = this.isClosed, NoStartCaps = this.noStartCaps, NoEndCaps = this.noEndCaps, Justification = this.justification, Style = this.style }; foreach (XData data in this.XData.Values) { entity.XData.Add((XData)data.Clone()); } return(entity); }
/// <summary> /// Creates a new MLine that is a copy of the current instance. /// </summary> /// <returns>A new MLine that is a copy of this instance.</returns> public override object Clone() { MLine entity = new MLine { //EntityObject properties Layer = (Layer)this.layer.Clone(), LineType = (LineType)this.lineType.Clone(), Color = (AciColor)this.color.Clone(), Lineweight = (Lineweight)this.lineweight.Clone(), Transparency = (Transparency)this.transparency.Clone(), LineTypeScale = this.lineTypeScale, Normal = this.normal, //MLine properties Elevation = this.elevation, Scale = this.scale, Justification = this.justification, Style = this.style, Flags = this.Flags }; foreach (MLineVertex vertex in this.vertexes) entity.vertexes.Add((MLineVertex)vertex.Clone()); foreach (XData data in this.XData.Values) entity.XData.Add((XData)data.Clone()); return entity; }
private void WriteMLine(MLine mLine) { this.chunk.Write(100, SubclassMarker.MLine); this.chunk.Write(2, this.EncodeNonAsciiCharacters(mLine.Style.Name)); this.chunk.Write(340, mLine.Style.Handle); this.chunk.Write(40, mLine.Scale); this.chunk.Write(70, (short) mLine.Justification); this.chunk.Write(71, (short) mLine.Flags); this.chunk.Write(72, (short) mLine.Vertexes.Count); this.chunk.Write(73, (short) mLine.Style.Elements.Count); // the MLine information is in OCS we need to save it in WCS // this behavior is similar to the LWPolyline, the info is in OCS because these entities are strictly 2d. Normally they are used in the XY plane whose // normal is (0, 0, 1) so no transformation is needed, OCS are equal to WCS List<Vector3> ocsVertexes = new List<Vector3>(); foreach (MLineVertex segment in mLine.Vertexes) { ocsVertexes.Add(new Vector3(segment.Location.X, segment.Location.Y, mLine.Elevation)); } IList<Vector3> vertexes = MathHelper.Transform(ocsVertexes, mLine.Normal, CoordinateSystem.Object, CoordinateSystem.World); Vector3[] wcsVertexes = new Vector3[vertexes.Count]; vertexes.CopyTo(wcsVertexes, 0); // Although it is not recommended the vertex list might have 0 entries if (wcsVertexes.Length == 0) { this.chunk.Write(10, 0.0); this.chunk.Write(20, 0.0); this.chunk.Write(30, 0.0); } else { this.chunk.Write(10, wcsVertexes[0].X); this.chunk.Write(20, wcsVertexes[0].Y); this.chunk.Write(30, wcsVertexes[0].Z); } this.chunk.Write(210, mLine.Normal.X); this.chunk.Write(220, mLine.Normal.Y); this.chunk.Write(230, mLine.Normal.Z); for (int i = 0; i < wcsVertexes.Length; i++) { this.chunk.Write(11, wcsVertexes[i].X); this.chunk.Write(21, wcsVertexes[i].Y); this.chunk.Write(31, wcsVertexes[i].Z); // the directions are written in world coordinates Vector2 dir = mLine.Vertexes[i].Direction; Vector3 wcsDir = MathHelper.Transform(new Vector3(dir.X, dir.Y, mLine.Elevation), mLine.Normal, CoordinateSystem.Object, CoordinateSystem.World); this.chunk.Write(12, wcsDir.X); this.chunk.Write(22, wcsDir.Y); this.chunk.Write(32, wcsDir.Z); Vector2 mitter = mLine.Vertexes[i].Miter; Vector3 wcsMitter = MathHelper.Transform(new Vector3(mitter.X, mitter.Y, mLine.Elevation), mLine.Normal, CoordinateSystem.Object, CoordinateSystem.World); this.chunk.Write(13, wcsMitter.X); this.chunk.Write(23, wcsMitter.Y); this.chunk.Write(33, wcsMitter.Z); foreach (List<double> distances in mLine.Vertexes[i].Distances) { this.chunk.Write(74, (short) distances.Count); foreach (double distance in distances) { this.chunk.Write(41, distance); } this.chunk.Write(75, (short) 0); } } this.WriteXData(mLine.XData); }
private void MLine_MLineStyleChanged(MLine sender, TableObjectChangedEventArgs<MLineStyle> e) { this.mlineStyles.References[e.OldValue.Name].Remove(sender); e.NewValue = this.mlineStyles.Add(e.NewValue); this.mlineStyles.References[e.NewValue.Name].Add(sender); }
private MLine ReadMLine() { string styleName = null; double scale = 1.0; MLineJustification justification = MLineJustification.Zero; MLineFlags flags = MLineFlags.Has; int numVertexes = 0; int numStyleElements = 0; double elevation = 0.0; Vector3 normal = Vector3.UnitZ; List<MLineVertex> segments = new List<MLineVertex>(); List<XData> xData = new List<XData>(); this.chunk.Next(); while (this.chunk.Code != 0) { switch (this.chunk.Code) { case 2: // the MLineStyle is defined in the objects sections after the definition of the entity, something similar happens with the image entity // the MLineStyle will be applied to the MLine after parsing the whole file styleName = this.DecodeEncodedNonAsciiCharacters(this.chunk.ReadString()); if (string.IsNullOrEmpty(styleName)) styleName = this.doc.DrawingVariables.CMLStyle; this.chunk.Next(); break; case 40: scale = this.chunk.ReadDouble(); this.chunk.Next(); break; case 70: justification = (MLineJustification) this.chunk.ReadShort(); this.chunk.Next(); break; case 71: flags = (MLineFlags) this.chunk.ReadShort(); this.chunk.Next(); break; case 72: numVertexes = this.chunk.ReadShort(); this.chunk.Next(); break; case 73: numStyleElements = this.chunk.ReadShort(); this.chunk.Next(); break; case 10: // this info is not needed it is repeated in the vertexes list this.chunk.Next(); break; case 20: // this info is not needed it is repeated in the vertexes list this.chunk.Next(); break; case 30: // this info is not needed it is repeated in the vertexes list 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 11: // the info that follows contains the information on the vertexes of the MLine segments = this.ReadMLineSegments(numVertexes, numStyleElements, normal, out elevation); 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; } } MLine mline = new MLine { Elevation = elevation, Scale = scale, Justification = justification, Normal = normal, Flags = flags }; mline.Vertexes.AddRange(segments); mline.XData.AddRange(xData); // save the referenced style name for post processing this.mLineToStyleNames.Add(mline, styleName); return mline; }
public static void ModifyingMLineStyles() { DxfDocument doc = new DxfDocument(DxfVersion.AutoCad2010); doc.DrawingVariables.LtScale = 10; List<Vector2> vertexes = new List<Vector2> { new Vector2(0, 0), new Vector2(0, 150), new Vector2(150, 150), new Vector2(150, 0) }; MLine mline = new MLine(vertexes); mline.Scale = 20; mline.Justification = MLineJustification.Zero; MLineStyle style = new MLineStyle("MyStyle", "Personalized style."); style.Elements.Add(new MLineStyleElement(0.25)); style.Elements.Add(new MLineStyleElement(-0.25)); // if we add new elements directly to the list we need to sort the list, style.Elements.Sort(); style.Flags = MLineStyleFlags.EndInnerArcsCap | MLineStyleFlags.EndRoundCap | MLineStyleFlags.StartInnerArcsCap | MLineStyleFlags.StartRoundCap; // AutoCad2000 dxf version does not support true colors for MLineStyle elements style.Elements[0].Color = new AciColor(180, 230, 147); doc.AddEntity(mline); // change the multi line style after it has been added to the document mline.Style = style; Debug.Assert(ReferenceEquals(mline.Style, doc.MlineStyles[mline.Style.Name]), "Reference not equals."); // VERY IMPORTANT: We have modified the MLine after setting its vertexes so we need to manually call this method. // It is also necessary when manually editing the vertex distances. mline.Update(); // the line type will be automatically added to the document foreach (MLineStyleElement e in style.Elements) { // making changes after the MLineStyle has been added to the document e.LineType = LineType.Dashed; Debug.Assert(ReferenceEquals(e.LineType, doc.LineTypes[e.LineType.Name]), "Reference not equals."); } MLine copy = (MLine) mline.Clone(); copy.Scale = 100; doc.AddEntity(copy); // once the entity has been added to the document, changing its style requires that the new style is also present in the document. copy.Style = doc.MlineStyles["standard"]; // VERY IMPORTANT: We have modified the MLine after setting its vertexes so we need to manually call this method. // It is also necessary when manually editing the vertex distances. copy.Update(); doc.Save("ModifyingMLineStyle.dxf"); Test("ModifyingMLineStyle.dxf"); }
private static void WriteMLine() { DxfDocument dxf = new DxfDocument(); //MLineStyle style = MLineStyle.Default; //dxf.AddMLineStyle(style); List<Vector2> vertexes = new List<Vector2> { new Vector2(0, 0), new Vector2(0, 150), new Vector2(150, 150), new Vector2(150, 0) }; MLine mline = new MLine(vertexes); mline.Scale = 20; mline.Justification = MLineJustification.Zero; //mline.IsClosed = true; MLineStyle style = new MLineStyle("MyStyle", "Personalized style."); style.Elements.Add(new MLineStyleElement(0.25)); style.Elements.Add(new MLineStyleElement(-0.25)); // if we add new elements directly to the list we need to sort the list, style.Elements.Sort(); style.Flags = MLineStyleFlags.EndInnerArcsCap | MLineStyleFlags.EndRoundCap | MLineStyleFlags.StartInnerArcsCap | MLineStyleFlags.StartRoundCap; //style.StartAngle = 25.0; //style.EndAngle = 160.0; // AutoCad2000 dxf version does not support true colors for MLineStyle elements style.Elements[0].Color = new AciColor(180, 230, 147); mline.Style = style; // we have modified the multiline after setting its vertexes so we need to manually call this method. // also when manually editing the vertex distances mline.Update(); // we can manually create cuts or gaps in the individual elements that made the multiline. // the cuts are defined as distances from the start point of the element along its direction. mline.Vertexes[0].Distances[0].Add(50); mline.Vertexes[0].Distances[0].Add(100); mline.Vertexes[0].Distances[mline.Style.Elements.Count-1].Add(50); mline.Vertexes[0].Distances[mline.Style.Elements.Count-1].Add(100); dxf.AddEntity(mline); dxf.DrawingVariables.AcadVer = DxfVersion.AutoCad2004; dxf.Save("MLine.dxf"); //dxf = DxfDocument.Load("Drawing1.dxf"); //dxf.Save("Drawing1 copy.dxf"); //dxf = DxfDocument.Load("Drawing3.dxf"); //dxf.Save("Drawing3 copy.dxf"); //dxf = DxfDocument.Load("Drawing2.dxf"); //dxf.Save("Drawing2 copy.dxf"); // empty mline //List<Vector2> vertexes2 = new List<Vector2> // { // new Vector2(0, 0), // new Vector2(100, 100), // new Vector2(100, 100), // new Vector2(200, 0) // }; //MLine mline2 = new MLine(vertexes2){Scale = 20}; //mline2.CalculateVertexesInfo(); //DxfDocument dxf2 = new DxfDocument(); //dxf2.AddEntity(mline2); ////dxf2.Save("void mline.dxf"); //MLine mline3 = new MLine(); //dxf2.AddEntity(mline3); ////dxf2.Save("void mline.dxf"); //Polyline pol = new Polyline(); //LwPolyline lwPol = new LwPolyline(); //dxf2.AddEntity(pol); //dxf2.AddEntity(lwPol); //dxf2.Save("void mline.dxf"); //dxf2 = DxfDocument.Load("void mline.dxf"); }
private static void MLineStyleUsesAndRemove() { DxfDocument dxf = new DxfDocument(); //MLineStyle style = MLineStyle.Default; //dxf.AddMLineStyle(style); List<Vector2> vertexes = new List<Vector2> { new Vector2(0, 0), new Vector2(0, 150), new Vector2(150, 150), new Vector2(150, 0) }; MLine mline = new MLine(vertexes); mline.Scale = 20; mline.Justification = MLineJustification.Zero; //mline.IsClosed = true; MLineStyle style = new MLineStyle("MyStyle", "Personalized style."); style.Elements.Add(new MLineStyleElement(0.25)); style.Elements.Add(new MLineStyleElement(-0.25)); // if we add new elements directly to the list we need to sort the list, style.Elements.Sort(); style.Flags = MLineStyleFlags.EndInnerArcsCap | MLineStyleFlags.EndRoundCap | MLineStyleFlags.StartInnerArcsCap | MLineStyleFlags.StartRoundCap; //style.StartAngle = 25.0; //style.EndAngle = 160.0; // AutoCad2000 dxf version does not support true colors for MLineStyle elements style.Elements[0].Color = new AciColor(180, 230, 147); mline.Style = style; // we have modified the mline after setting its vertexes so we need to manually call this method. // also when manually editting the vertex distances mline.Update(); // we can manually create cuts or gaps in the individual elements that made the multiline. // the cuts are defined as distances from the start point of the element along its direction. mline.Vertexes[0].Distances[0].Add(50); mline.Vertexes[0].Distances[0].Add(100); mline.Vertexes[0].Distances[mline.Style.Elements.Count - 1].Add(50); mline.Vertexes[0].Distances[mline.Style.Elements.Count - 1].Add(100); dxf.AddEntity(mline); dxf.DrawingVariables.AcadVer = DxfVersion.AutoCad2004; dxf.Save("MLine.dxf"); DxfDocument dxf2 = DxfDocument.Load("MLine.dxf"); // "MyStyle" is used only once List<DxfObject> uses; uses = dxf.MlineStyles.GetReferences(mline.Style.Name); // if we try to get the LineTypeUses, we will find out that "MyStyle" appears several times, // this is due to that each MLineStyleElement of a MLineStyle has an associated LineType uses = dxf.LineTypes.GetReferences(LineType.ByLayerName); bool ok; ok = dxf.RemoveEntity(mline); // "MyStyle" is not used its reference has been deleted uses = dxf.MlineStyles.GetReferences(mline.Style.Name); // we can safely remove it dxf.MlineStyles.Remove(mline.Style.Name); dxf.Save("MLine2.dxf"); dxf.Layers.Clear(); dxf.Save("MLine2.dxf"); }