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
}