} //button public void GenerateDataXmlFile( string fileName, Func <Vector3d> getFactPositionNoizeAddition = null) { bool factPossEnabled = true; if (getFactPositionNoizeAddition == null) { getFactPositionNoizeAddition = () => new Vector3d(); factPossEnabled = false; } var pluginSettings = PluginSettings.GetInstance(); var sectionMaxSize = pluginSettings.SectionMaxSize; var sectionsData = RoadSectionParametersExtractor .ExtractSectionsData(sectionMaxSize); Func <double, double, string> CoordsToString = (x, y) => String.Format("{0} {1}", AcadTools.DoubleToFormattedString(x), AcadTools.DoubleToFormattedString(y)); Func <Point3d, Point3d, int, XElement> GetPointElement = (projPos, factPos, number) => new XElement( "point", new XElement( "proj_position", CoordsToString(projPos.X, projPos.Y)), new XElement( "fact_position", CoordsToString(factPos.X, factPos.Y)), new XElement("number", number)); var extractedSectionDataDoc = new XDocument( new XElement( "road_sections", new XAttribute("fact_enabled", factPossEnabled), sectionsData .Select(sd => new XElement( "road_section", new XElement( "staEq", AcadTools.DoubleToFormattedString( RoadSectionParametersExtractor.GetStationFromPointBlock(sd.AxisPoint))), new XElement( "origin", CoordsToString( AcadTools.GetBlockPosition(sd.AxisPoint).X, AcadTools.GetBlockPosition(sd.HeightPoint).Y)), new XElement("origin_height", AcadTools.DoubleToFormattedString( RoadSectionParametersExtractor.GetHeightFromPointBlock(sd.HeightPoint))), new XElement( "red_points", sd.RedPoints .Select(redPoint => GetPointElement( AcadTools.GetBlockPosition(redPoint), AcadTools.GetBlockPosition(redPoint) + getFactPositionNoizeAddition(), RoadSectionParametersExtractor.GetPointNumberFromPointBlock(redPoint)))), new XElement( "black_points", sd.BlackPoints .Select(blackPoint => GetPointElement( AcadTools.GetBlockPosition(blackPoint), AcadTools.GetBlockPosition(blackPoint) + getFactPositionNoizeAddition(), RoadSectionParametersExtractor.GetPointNumberFromPointBlock(blackPoint)))) )))); extractedSectionDataDoc.Save(fileName); }