using System.Collections.ObjectModel; using System.Data; using System.Globalization; using System.IO; using System.Windows; using Autodesk.Revit.DB; using Autodesk.Revit.UI; namespace ShrlAlgoToolkit.RevitAddins.RvIndependent.MetroGauges; using Curve = LandXMLData.Curve; using LandXMLData_Alignment = LandXMLData.Alignment; using LandXMLData_CircCurve = LandXMLData.CircCurve; using LandXMLData_Spiral = LandXMLData.Spiral; using Line = LandXMLData.Line; using Model = LandXMLData.Model; using TextPoint2D = LandXMLData.TextPoint2D; /// /// Interaction logic for GaugesModelView.xaml /// public partial class GaugesModelView { public GaugesModelView(UIApplication uiapp) { InitializeComponent(); this.uiapp = uiapp; doc = uiapp.ActiveUIDocument.Document; } private readonly CircuitHelper ch = new(); private readonly Document doc; private readonly ProfileHelper ph = new(); private readonly UIApplication uiapp; private LandXMLData_Alignment align; private ObservableCollection allregions; private bool isSolid; private Model result; /// /// 按桩号创建体量 /// /// /// /// /// /// public void CreateFormByStation( LandXMLData_Alignment al, CurveByPoints horizonCurve, double startStation, double endStation, string startProfilePath, string endProfilePath ) { var starpara = (startStation - al.StationStart) / horizonCurve.GeometryCurve.Length; var endpara = (endStation - al.StationStart) / horizonCurve.GeometryCurve.Length; } /// /// 从LandXML中得到平曲线数据转成DataTable /// /// /// private DataTable CoordGeomData(LandXMLData_Alignment al) { DataTable dt = new("CoordGeom"); dt.Columns.Add("曲线类型", typeof(string)); //直缓圆 dt.Columns.Add("起点北距", typeof(double)); //Y dt.Columns.Add("起点东距", typeof(double)); //X dt.Columns.Add("终点北距", typeof(double)); //Y dt.Columns.Add("终点东距", typeof(double)); //X dt.Columns.Add("半径(m)", typeof(string)); //radius dt.Columns.Add("长度(m)", typeof(double)); //length var hc = al.CoordGeom.HorizonCurve; for (var i = 0; i < hc.Count; i++) { var dr = dt.NewRow(); if (hc[i].GetType() == typeof(Curve)) { var c = (Curve)hc[i]; //dr[1] = c.GetType().Name; dr[0] = "圆曲线"; dr[1] = Math.Round(c.Start.First, 3, MidpointRounding.AwayFromZero); dr[2] = Math.Round(c.Start.Second, 3, MidpointRounding.AwayFromZero); dr[3] = Math.Round(c.End.First, 3, MidpointRounding.AwayFromZero); dr[4] = Math.Round(c.End.Second, 3, MidpointRounding.AwayFromZero); dr[5] = Math.Round(c.Radius, 3, MidpointRounding.AwayFromZero).ToString(CultureInfo.InvariantCulture); dr[6] = Math.Round(c.Length, 3, MidpointRounding.AwayFromZero); } else if (hc[i].GetType() == typeof(Line)) { var l = (Line)hc[i]; //dr[1] = l.GetType().Name; dr[0] = "直线"; dr[1] = Math.Round(l.Start.First, 3, MidpointRounding.AwayFromZero); dr[2] = Math.Round(l.Start.Second, 3, MidpointRounding.AwayFromZero); dr[3] = Math.Round(l.End.First, 3, MidpointRounding.AwayFromZero); dr[4] = Math.Round(l.End.Second, 3, MidpointRounding.AwayFromZero); dr[5] = "∞"; dr[6] = Math.Round(l.Length, 3, MidpointRounding.AwayFromZero); } else if (hc[i].GetType() == typeof(Spiral)) { var s = (LandXMLData_Spiral)hc[i]; //dr[1] = s.GetType().Name; dr[0] = "缓和曲线"; dr[1] = Math.Round(s.Start.First, 3, MidpointRounding.AwayFromZero); dr[2] = Math.Round(s.Start.Second, 3, MidpointRounding.AwayFromZero); dr[3] = Math.Round(s.End.First, 3, MidpointRounding.AwayFromZero); dr[4] = Math.Round(s.End.Second, 3, MidpointRounding.AwayFromZero); dr[5] = s.RadiusStart + "-" + s.RadiusEnd; dr[6] = Math.Round(s.Length, 3, MidpointRounding.AwayFromZero); } dt.Rows.Add(dr); } return dt; } /// /// 从LandXML中得到竖曲线数据转成DataTable /// /// /// private DataTable ProfileData(LandXMLData_Alignment al) { DataTable dt = new("Profile"); dt.Columns.Add("类型", typeof(string)); //起终点,变坡点 dt.Columns.Add("桩号(m)", typeof(double)); dt.Columns.Add("高程(m)", typeof(double)); dt.Columns.Add("半径(m)", typeof(string)); dt.Columns.Add("曲线长(m)", typeof(double)); var profCurs = al.Profile.ProfileCurve; for (var i = 0; i < profCurs.Count; i++) { for (var j = 0; j < profCurs[i].PVIs.Count; j++) { var p = profCurs[i].PVIs[j]; var dr = dt.NewRow(); if (p.GetType() == typeof(TextPoint2D) && j == 0) { var t = p; //dr[1] = t.GetType().Name; dr[0] = "起点"; dr[1] = Math.Round(t.First, 3, MidpointRounding.AwayFromZero); dr[2] = Math.Round(t.Second, 3, MidpointRounding.AwayFromZero); dr[3] = 0; dr[4] = t.Length; } else if (p.GetType() == typeof(CircCurve)) { var c = (LandXMLData_CircCurve)p; //dr[1] = c.GetType().Name; dr[0] = "变坡点"; dr[1] = Math.Round(c.First, 3, MidpointRounding.AwayFromZero); dr[2] = Math.Round(c.Second, 3, MidpointRounding.AwayFromZero); dr[3] = c.Radius; dr[4] = Math.Round(c.CurveLength, 3, MidpointRounding.AwayFromZero); } else if (p.GetType() == typeof(TextPoint2D) && j < profCurs[i].PVIs.Count - 1) { var t = p; //dr[1] = t.GetType().Name; dr[0] = "变坡点"; dr[1] = Math.Round(t.First, 3, MidpointRounding.AwayFromZero); dr[2] = Math.Round(t.Second, 3, MidpointRounding.AwayFromZero); dr[3] = 0; dr[4] = t.Length; } else { var t = p; //dr[1] = t.GetType().Name; dr[0] = "终点"; dr[1] = Math.Round(t.First, 3, MidpointRounding.AwayFromZero); dr[2] = Math.Round(t.Second, 3, MidpointRounding.AwayFromZero); dr[3] = 0; dr[4] = t.Length; } dt.Rows.Add(dr); } } return dt; } /// /// 初始化区域 /// /// /// private ObservableCollection Regions(LandXMLData_Alignment al) { allregions = new ObservableCollection(); var endsta = al.StationStart + al.Length; Region re = new(al.StationStart, endsta); allregions.Add(re); DgCross.ItemsSource = allregions; return allregions; } /// /// 设置项目基点 /// /// private void SetProjectPosition(XYZ position) { using Transaction trans = new(doc); trans.Start("设置项目基点"); XYZ p = new(); ProjectPosition pp = new(position.X, position.Y, position.Z, 0); //设置项目基点 doc.ActiveProjectLocation.SetProjectPosition(p, pp); trans.Commit(); } private void BtnAdd_Click(object sender, RoutedEventArgs e) { var endStation = align.StationStart + align.Length; Region region = new(allregions[allregions.Count - 1].EndStation, endStation); allregions.Add(region); } /// /// 删除区间 /// /// /// private void BtnDelete_Click(object sender, RoutedEventArgs e) { //Button aBtn = sender as Button; //string ID = aBtn.ReferenceFamily.ToString(); allregions.RemoveAt(DgCross.SelectedIndex); //DGCross. //((Button)sender) } /// /// 终点断面 /// /// /// private void BtnEndLoad_Click(object sender, RoutedEventArgs e) { const string filter = "断面文件(*.xml;*.rfa)|*.Xml;*.xml;*.rfa|所有文件(*.*)|*.*"; FileOpenDialog dialog = new(filter) { Title = "选择XML文件", }; if (dialog.Show() == ItemSelectionDialogResult.Confirmed) { //Region region = (Region)DGCross.SelectedItem; var region = (Region)DgCross.SelectedValue; region.FilePathEnd = ModelPathUtils.ConvertModelPathToUserVisiblePath(dialog.GetSelectedModelPath()); FileInfo fileInfo = new(region.FilePathEnd); region.FileNameEnd = fileInfo.Name; //BindingExpression b = DGCross.GetBindingExpression(); //b.UpdateTarget(); DgCross.ItemsSource = null; DgCross.ItemsSource = allregions; } } private void BtnSetByCurve_Click(object sender, RoutedEventArgs e) { if (align != null) { var dict = ch.GetIntervalRegion(align); allregions.Clear(); allregions = new ObservableCollection(); foreach (var reg in dict.Values) { allregions.Add(reg); } DgCross.ItemsSource = null; DgCross.ItemsSource = allregions; } else { MessageBox.Show("请加载LandXML文件", "提示"); //System.Windows.MessageBox.ShowAhead("请加载LandXML文档"); } } /// /// 起始断面 /// /// /// private void BtnStartLoad_Click(object sender, RoutedEventArgs e) { const string filter = "断面文件(*.xml;*.rfa)|*.Xml;*.xml;*.rfa|所有文件(*.*)|*.*"; FileOpenDialog dialog = new(filter) { Title = "选择XML文件", }; if (dialog.Show() == ItemSelectionDialogResult.Confirmed) { //Region region = (Region)DGCross.SelectedItem; var region = (Region)DgCross.SelectedValue; region.FilePathStart = ModelPathUtils.ConvertModelPathToUserVisiblePath(dialog.GetSelectedModelPath()); FileInfo fileInfo = new(region.FilePathEnd); region.FileNameStart = fileInfo.Name; //BindingExpression b = DGCross.GetBindingExpression(); //b.UpdateTarget(); DgCross.ItemsSource = null; DgCross.ItemsSource = allregions; } } /// /// 创建体量 /// /// /// private void CreateFrom_Click(object sender, RoutedEventArgs e) { using Transaction trans = new(doc, "ProcessMode"); trans.Start(); if (doc.IsFamilyDocument) { var horiPts = ch.GetHorizonPts(align, doc); XYZ mDir = new((horiPts[0].X / 2) + (horiPts.Last().X / 2), (horiPts[0].Y / 2) + (horiPts.Last().Y / 2), 0); var tf = Transform.CreateTranslation(-mDir); foreach (var reg in allregions) { if (!reg.FileNameStart.EndsWith(".rfa")) { MessageBox.Show("请设置rfa断面文件", "提示"); trans.RollBack(); return; } var pts = ch.Get3DRefPointOfRegion(align, reg, 1); //错误警告处理 var fho1 = trans.GetFailureHandlingOptions(); fho1.SetFailuresPreprocessor(new FailuresPreProcessor()); trans.SetFailureHandlingOptions(fho1); ReferencePointArray translatedRefpts = new(); for (var i = 0; i < pts.Count; i++) { //XYZ p = tf.OfPoint(pts[i]); var p = CircuitHelper.TransformPoint(pts[i], tf); var refp = doc.FamilyCreate.NewReferencePoint(p); //var refp = doc.FamilyCreate.NewReferencePoint(pts[i]); translatedRefpts.Append(refp); } var curve = doc.FamilyCreate.NewCurveByPoints(translatedRefpts); ReferenceArrayArray profiles = new(); var staProfileCurs = ph.ProfileFromRfa(uiapp, curve, reg, 0); var endProfileCurs = ph.ProfileFromRfa(uiapp, curve, reg, 1); profiles.Append(staProfileCurs); profiles.Append(endProfileCurs); ////取得放样融合路径曲线的参照 ReferenceArray path = new(); path.Append(curve.GeometryCurve.Reference); try { isSolid = CbSolid.IsChecked == true; //Getprofiles(curve, reg); //doc.FamilyCreate.NewLoftForm(isSolid, Getprofiles(curve, reg)); doc.FamilyCreate.NewSweptBlendForm(isSolid, path, profiles); //doc.FamilyCreate.NewSweptBlendForm(isSolid, path, Getprofiles(curve, reg)); } catch (Exception ex) { trans.RollBack(); //throw new Exception(e.ViewMessage); MessageBox.Show(ex.Message); return; //throw; } //doc.FamilyCreate.NewSweptBlendForm(true, path, profiles); //Autodesk.Revit.DB.Line l=Autodesk.Revit.DB.Line.CreateBound(stapt, enpt); //CurveArray curarray = new CurveArray(); //curarray.Append(l); //CurveArrArray curarrarray = new CurveArrArray(); //curarrarray.Append(curarray); //SweepProfile sweep = doc.Application.Create.NewCurveLoopsProfile(curarrarray); //doc.FamilyCreate.NewSweep(true, path, sweep, 0, ProfilePlaneLocation.Start); //revitDoc.CloseTrigger(false); //form.Name = align.Name; } } else { //Solid solid = GeometryCreationUtilities.CreateSweptBlendGeometry(path,) var ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_Mass)); ds?.AppendShape(new List()); } trans.Commit(); } private void CreateGaugesModel_Click(object sender, RoutedEventArgs e) { //Document formdoc = uiApplication.Application.NewFamilyDocument(@"C:\ProgramData\Autodesk\RVT 2017\Family Templates\Chinese\概念体量\公制体量.rft"); //this.formdoc = formdoc; Transaction trans = new(doc, "ProcessMode"); trans.Start(); if (doc.IsFamilyDocument) { var horiPts = ch.GetHorizonPts(align, doc); var tf = Transform.CreateTranslation(new XYZ(-horiPts[0].X, -horiPts[0].Y, 0)); foreach (var reg in allregions) { if (!reg.FileNameStart.EndsWith(".xml")) { MessageBox.Show("请设置xml断面文件", "提示"); trans.RollBack(); return; } var pts = ch.Get3DRefPointOfRegion(align, reg, 1); //错误警告处理 var fho1 = trans.GetFailureHandlingOptions(); fho1.SetFailuresPreprocessor(new FailuresPreProcessor()); trans.SetFailureHandlingOptions(fho1); ReferencePointArray refpts = new(); for (var i = 0; i < pts.Count; i++) { //XYZ p = tf.OfPoint(pts[i]); var p = CircuitHelper.TransformPoint(pts[i], tf); var refp = doc.FamilyCreate.NewReferencePoint(p); //var refp = doc.FamilyCreate.NewReferencePoint(pts[i]); refpts.Append(refp); } var curve = doc.FamilyCreate.NewCurveByPoints(refpts); ReferenceArrayArray profiles = new(); var startprof0 = ph.ProfileFromXml(doc, curve, reg, ph.GetXmlOthersPt(reg.FilePathStart), 0); var endprof0 = ph.ProfileFromXml(doc, curve, reg, ph.GetXmlOthersPt(reg.FilePathEnd), 1); profiles.Append(startprof0); profiles.Append(endprof0); ////取得放样融合路径曲线的参照 ReferenceArray path = new(); path.Append(curve.GeometryCurve.Reference); doc.FamilyCreate.NewSweptBlendForm(true, path, profiles); } //if (formdoc.IsFamilyDocument) //{ // FamilyManager fm = formdoc.FamilyManager; // string name = "formname"; // FamilyType cft = fm.NewType(name); // cft = fm.CurrentType; //} //获取到的是英制的单位*304.8/1000转公制 //double l0 = curve.GeometryCurve.Length * 304.8 / 1000; //for (int i = 0; i < allregions.Count; i++) //{ //CreateFormByStation(align, GetHorizonCurve(align), allregions[i].StartStation, allregions[i].EndStation, allregions[i].FilePathStart, allregions[i].FilePathEnd); //} } trans.Commit(); trans.Dispose(); } /// /// 得到起终点线段中心点的向量的偏移变换 /// private void LoadLandXml_Click(object sender, RoutedEventArgs e) { const string filter = "LandXML文件(*.Xml,*.xml)|*.Xml;*.xml"; FileOpenDialog dialog = new(filter) { Title = "选择LandXML文件", }; if (dialog.Show() == ItemSelectionDialogResult.Confirmed) { var file = ModelPathUtils.ConvertModelPathToUserVisiblePath(dialog.GetSelectedModelPath()); Loader load = new(); result = load.Load(file); if (doc != null) { var aligns = result.Alignments.AlignmentList; DgHorizon.ItemsSource = CoordGeomData(aligns[0]).DefaultView; DgVertical.ItemsSource = ProfileData(aligns[0]).DefaultView; DgCross.ItemsSource = Regions(aligns[0]); align = aligns[0]; //DGCross.DataContext = InitCross(al); //DGCross.DataContext = InitCross(al); //pointsdt = SpaceXYs(CoordGeomData(al)); //formName = al.Name; } } if (result != null) { btnSetByCurve.IsEnabled = true; btnCreateGauges.IsEnabled = true; btnCreateForm.IsEnabled = true; } } #region 行编号 private void DGHorizon_LoadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e) { e.Row.Header = e.Row.GetIndex() + 1; } private void DGVertical_LoadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e) { e.Row.Header = e.Row.GetIndex() + 1; } private void DGCross_LoadingRow(object sender, System.Windows.Controls.DataGridRowEventArgs e) { e.Row.Header = e.Row.GetIndex() + 1; } #endregion 行编号 #region // formdoc = UiDocument.Document; // Transaction trans = new Transaction(formdoc, "horizon"); // XYZ xAxis = new XYZ(1, 0, 0); // XYZ yAxis = new XYZ(0, 1, 0); // XYZ zAxis = new XYZ(0, 0, 1); // XYZ origin = new XYZ(); // //生成三维路线的全部点 // trans.Start(); // //ReferencePointArray refpts = new ReferencePointArray(); // ReferencePointArray D3pt = new ReferencePointArray(); // for (int i = 0; i < spts.Count; i++) // { // XYZ p = new XYZ(spts[i].X, spts[i].Y, spts[i].Bottom); // ReferencePoint refpt = formdoc.FamilyCreate.NewReferencePoint(p); // D3pt.Append(refpt); // } // //CurveByPoints curve = formdoc.FamilyCreate.NewCurveByPoints(refpts); // CurveByPoints curve = formdoc.FamilyCreate.NewCurveByPoints(D3pt); // //curve.GeometryCurve.Evaluate(, false); // //curve.GeometryCurve.ComputeDerivatives(); // trans.Commit(); //var dp = DividedPath.Create(formdoc, refs); //dp.FixedNumberOfPoints = 200; //dp.SpacingRuleLayout = SpacingRuleLayout.FixedNumber; //dp.MeasurementType = DividedPathMeasurementType.SegmentLength; ////Options ops = new Options(); ////ops.View = formdoc.ActiveView; ////var points = dp.get_Geometry(ops).GetEnumerator(); ////Autodesk.Revit.DB.Point pt= //ErrorModels pts = new ErrorModels(); //formdoc.Regenerate(); //Options opts = dp.Document.Application.Create.NewGeometryOptions(); //opts.ComputeReferences = true; //opts.View = dp.Document.ActiveView; ////opts.IncludeNonVisibleObjects = true; //GeometryElement geoels = dp.get_Geometry(opts); //var elsenu = geoels.GetEnumerator(); //while (elsenu.MoveNext()) //{ // Autodesk.Revit.DB.Point pt = (Autodesk.Revit.DB.Point)elsenu.Current; // pts.Add(pt); //} //ReferencePointArray refpts = new ReferencePointArray(); //foreach (var pt in pts) //{ // ReferencePoint refpt = formdoc.FamilyCreate.NewReferencePoint(pt.Coord); // refpts.Append(refpt); //} //CurveByPoints HorizonCurve = formdoc.FamilyCreate.NewCurveByPoints(refpts); ////var p = HorizonCurve.GeometryCurve.Evaluate(0.5, true); ////var l = HorizonCurve.GeometryCurve.Tessellate(); ////var r = HorizonCurve.GeometryCurve.ProjectOf(origin); //HorizonCurve.GeometryCurve.GetEndParameter(1); //PointOnCurveMeasurementType.SegmentLength;点沿着曲线放置方式 //private IList SpaceXYs(DataTable dt) //{ // IList pts = new ErrorModels(); // for (int i = 0; i < dt.Rows.Count; i++) // { // if (i < dt.Rows.Count - 1) // { // XYZ pt = new XYZ(Convert.ToDouble(dt.Rows[i][2]), Convert.ToDouble(dt.Rows[i][3]), 0); // pts.Add(pt); // } // else // { // pts.Add(new XYZ(Convert.ToDouble(dt.Rows[i][6]), Convert.ToDouble(dt.Rows[i][7]), 0)); // } // } // return pts; //} ///// //private void CreatForm(string formname, IList pts) //{ // Document formdoc = uiApplication.Application.NewFamilyDocument(@"C:\ProgramData\Autodesk\RVT 2016\Family Templates\Chinese\概念体量\公制体量.rft"); // this.formdoc = formdoc; // #region 注释 // //FilteredElementCollector col = new FilteredElementCollector(formdoc).OfClass(typeof(View3D)); // //foreach (View3D v3d in col) // //{ // // if (v3d.ViewName =="{3D}") // // { // // v = v3d; // // } // //} // //XYZ max = new XYZ(); // //XYZ min = new XYZ(); // //max= curve.get_BoundingBox(v).Max; // //min = curve.get_BoundingBox(v).Min; // //XYZ v = new XYZ(-(refpoints.get_Item(0).Position.X + refpoints.get_Item(refpoints.Size - 1).Position.X) / 2, -(refpoints.get_Item(0).Position.Y + refpoints.get_Item(refpoints.Size - 1).Position.Y) / 2, 0); // #endregion // //得到变换向量坐标 // ReferencePointArray refpoints = new ReferencePointArray(); // XYZ v = new XYZ(-(pts[0].X + pts[pts.Count - 1].X) * 1000 / 304.8 / 2, -(pts[0].Y + pts[pts.Count - 1].Y) * 1000 / 304.8 / 2, 0); // //项目基点坐标 // XYZ projectPt = v.Negate(); // Transform tf = Transform.CreateTranslation(v); // refpoints.Clear(); // Transaction tr = new Transaction(formdoc); // tr.Start("创建实体"); // foreach (var pt in pts) // { // //XYZ point = ImpericalToMetric(pt); // //XYZ xyz = TransformPoint(point, tf); // XYZ xyz = TransformPoint(pt, tf); // ReferencePoint refpt = formdoc.FamilyCreate.NewReferencePoint(xyz); // refpoints.Append(refpt); // } // CurveByPoints curve = formdoc.FamilyCreate.NewCurveByPoints(refpoints); // //BoundingBoxXYZ bd = new BoundingBoxXYZ(); // //Plane staplane = Plane.CreateByNormalAndOrigin((curve.GeometryCurve as HermiteSpline).Tangents[0], curve.GeometryCurve.GetEndPoint(0)); // #region 截面 // Plane staplane = Plane.CreateByNormalAndOrigin(curve.GeometryCurve.GetEndPoint(0), (curve.GeometryCurve as HermiteSpline).Tangents[0]); // Arc arc0 = Arc.Create(staplane, 2000 / 304.8, 0, 2 * Math.PI); // ModelCurve mc = formdoc.FamilyCreate.NewModelCurve(arc0, SketchPlane.Create(formdoc, staplane)); // //Plane endplane = Plane.CreateByNormalAndOrigin((curve.GeometryCurve as HermiteSpline).Tangents[pts.Count - 1], curve.GeometryCurve.GetEndPoint(1)); // Plane endplane = Plane.CreateByNormalAndOrigin(curve.GeometryCurve.GetEndPoint(1), (curve.GeometryCurve as HermiteSpline).Tangents[pts.Count - 1]); // //curve.GeometryCurve.ComputeDerivatives(0, true) // Arc arc1 = Arc.Create(endplane, 3000 / 304.8, 0, 2 * Math.PI); // ModelCurve mc0 = formdoc.FamilyCreate.NewModelCurve(arc1, SketchPlane.Create(formdoc, endplane)); // #endregion // #region 生成参照及模型 // //取得截面模型线的参照 // ReferenceArray profile0 = new ReferenceArray(); // profile0.Append(mc.GeometryCurve.Reference); // ReferenceArray profile1 = new ReferenceArray(); // profile1.Append(mc0.GeometryCurve.Reference); // //作为轮廓 // ReferenceArrayArray profiles = new ReferenceArrayArray(); // profiles.Append(profile0); // profiles.Append(profile1); // //取得路径曲线的参照 // ReferenceArray path = new ReferenceArray(); // path.Append(curve.GeometryCurve.Reference); // //var s = formdoc.FamilyCreate.NewSweptBlendForm(true, path, profiles); // var s = formdoc.FamilyCreate.NewSweptBlendForm(true, path, profiles); // if (formdoc.IsFamilyDocument) // { // FamilyManager fm = formdoc.FamilyManager; // FamilyType cft = fm.NewType(formname); // cft = fm.CurrentType; // } // #endregion // tr.Commit(); // LoadAndCreateInstance(formname); // SetProjectPosition(projectPt); //} ///// //public void LoadAndCreateInstance(string name) //{ // Transaction trans = new Transaction(formdoc, "Excm"); // using (TransactionGroup tg = new TransactionGroup(doc, "创建路面")) // { // if (tg.Start() == TransactionStatus.Started) // { // LoadOpions lo = new LoadOpions(); // Family fa = formdoc.LoadFamily(doc); // formdoc.CloseTrigger(false); // trans = new Transaction(doc, "Change Family Name"); // trans.Start(); // fa.Name = name; // FilteredElementCollector col = new FilteredElementCollector(doc).OfClass(typeof(FamilySymbol)); // FamilySymbol familySymbol = null; // foreach (FamilySymbol fs in col) // { // if (fs.Name == name) // { // familySymbol = fs; // } // } // familySymbol.Activate(); // Autodesk.Revit.DB.View v = doc.ActiveView; // StructuralType stNon = StructuralType.NonStructural; // FamilyInstance instance = doc.Create.NewFamilyInstance(new XYZ(), familySymbol, stNon); // trans.Commit(); // trans.Dispose(); // tg.Assimilate(); // } // else // { // tg.RollBack(); // } // }; //} //private ReferenceArrayArray Getprofiles(CurveByPoints curve, Region reg) //{ // Document revitDoc = uiApplication.Application.OpenDocumentFile(reg.FilePathStart); // FilteredElementCollector modelCurveCollector = new FilteredElementCollector(revitDoc); // ErrorModels modelCurveList = // modelCurveCollector.OfCollector(BuiltInCategory.OST_Lines).OfClass(typeof(CurveElement)).ToList() // .ConvertAll(x => x as ModelCurve); // ReferenceArray profile = new ReferenceArray(); // ReferenceArrayArray profiles = new ReferenceArrayArray(); // IList tangents = (curve.GeometryCurve as HermiteSpline).Tangents; // for (int i = 0; i < tangents.Count; i = i + 4) // { // //为了求出X轴的单位向量 // XYZ horizonNor = new XYZ(tangents[i].X, tangents[i].Y, 0); // XYZ orign = curve.GeometryCurve.Evaluate(i * 1000 / 304.8, false); // //curve在xy平面上的投影,某点的工作平面 // //Plane horiCurPl = Plane.CreateByNormalAndOrigin(horizonNor, orign); // //XYZ xVect = horiCurPl.XVec; // //叉乘求出X轴单位向量 // XYZ xAxis = horizonNor.CrossProduct(new XYZ(0, 0, 1)).Normalize(); // //在curve上的工作平面 // Plane pl = Plane.CreateByNormalAndOrigin(tangents[i], orign); // SketchPlane skp = SketchPlane.Create(doc, pl); // //XYZ xVect = pl.XVec;//z=0 // //求出curve上某点工作平面的y向量 // XYZ yAxis = xAxis.CrossProduct(tangents[i]).Normalize();//z>0 // if (yAxis.Z < 0) // { // //xVect = horiCurPl.XVec.Negate(); // xAxis = xAxis.Negate(); // yAxis = yAxis.Negate(); // } // foreach (ModelCurve c in modelCurveList) // { // if (c.GetType() == typeof(ModelLine)) // { // ModelLine ml = (ModelLine)c; // var startpt = ml.GeometryCurve.GetEndPoint(0); // var endpt = ml.GeometryCurve.GetEndPoint(1); // XYZ stapt = (startpt.X * xAxis) + orign + startpt.Y * yAxis; // XYZ enpt = endpt.X * xAxis + orign + endpt.Y * yAxis; // Autodesk.Revit.DB.Line l = Autodesk.Revit.DB.Line.CreateBound(stapt, enpt); // ModelCurve m_l = doc.FamilyCreate.NewModelCurve(l, skp); // profile.Append(m_l.GeometryCurve.Reference); // } // else if (c.GetType() == typeof(ModelArc)) // { // ModelArc marc = (ModelArc)c; // Arc ar = (Arc)marc.GeometryCurve; // //XYZ startpt = marc.GeometryCurve.GetEndPoint(0); // //XYZ centpt = marc.GeometryCurve.Evaluate(0.5, true); // //XYZ endpt = marc.GeometryCurve.GetEndPoint(1); // Arc arc; // if (marc.GeometryCurve.IsBound) // { // XYZ startpt = ar.GetEndPoint(0); // XYZ centpt = ar.Evaluate(0.5, true); // XYZ endpt = ar.GetEndPoint(1); // XYZ stapt = startpt.X * xAxis + orign + startpt.Y * yAxis; // XYZ cept = centpt.X * xAxis + orign + centpt.Y * yAxis; // XYZ enpt = endpt.X * xAxis + orign + endpt.Y * yAxis; // arc = Arc.Create(stapt, enpt, cept); // } // else // { // XYZ center = ar.HorizontallyCenter.X * xAxis + orign + ar.HorizontallyCenter.Y * yAxis; // arc = Arc.Create(center, ar.Radius, 0, 2 * Math.PI, xAxis, yAxis); // //arc = Arc.Create(pl, ar.Radius, 0, 2 * Math.PI); // } // ModelCurve m_c = doc.FamilyCreate.NewModelCurve(arc, skp); // profile.Append(m_c.GeometryCurve.Reference); // } // } // profiles.Append(profile); // } // return profiles; //} #endregion }