/*-------------------------------------------------------------------------
* 功能描述:CurveExtension
* 作者:xulisong
* 创建时间: 2019/6/26 14:14:27
* 版本号:v1.0
* -------------------------------------------------------------------------*/
using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SAGA.RevitUtils.Extends;
namespace RevitToJBim.Extension
{
public static class CurveExtension
{
///
/// 获取curve偏移后的Polygon信息
///
///
///
///
///
public static List GetCurvePolygon(this Curve curve, XYZ normal, double offset)
{
List xyzs = new List();
XYZ referenceDirection = normal;
if (curve.IsLine())
{
referenceDirection = normal.CrossProduct((curve as Line).Direction);
}
#region 构建围护线
//从curve1.StartPoint()开始的可以顺序连接的线结构
var curve1 = curve.CreateOffset(offset, referenceDirection);
var curve2 = curve.CreateOffset(-offset, referenceDirection);
var line1 = Line.CreateBound(curve1.EndPoint(), curve2.EndPoint());
var line2 = Line.CreateBound(curve2.StartPoint(), curve1.StartPoint());
//curve2调转方向
curve2 = curve2.CreateReversed();
List curves = new List();
curves.Add(curve1);
curves.Add(line1);
curves.Add(curve2);
curves.Add(line2);
foreach (Curve useCurve in curves)
{
var points = useCurve.Tessellate();
points.RemoveAt(points.Count - 1);
xyzs.AddRange(points);
}
#endregion
#region 逆时针顺序转化
/*
* //将线结构整理成逆时针形式;
* 如果curve是弧线则使用开始,中间,结束三个点判断
* 如果curve是直线,则使用开始,结束,curve2的开始三个点判断;
*
* 也可以直接使用上面的的点集合取出三个点进行判断
*/
List decisionXyzs = new List();
if (curve1.IsLine())
{
decisionXyzs.Add(curve1.StartPoint());
decisionXyzs.Add(curve1.EndPoint());
decisionXyzs.Add(curve2.StartPoint());
}
else if(curve1.IsArc())
{
//找半径大的弧
var useCurve = (curve1 as Arc).Radius > (curve2 as Arc).Radius ? curve1 : curve2;
decisionXyzs.Add(useCurve.StartPoint());
decisionXyzs.Add(useCurve.MiddlePoint());
decisionXyzs.Add(useCurve.EndPoint());
}
if (decisionXyzs.Any())
{
var useDirection = (decisionXyzs[1] - decisionXyzs[0]).CrossProduct(decisionXyzs[2] - decisionXyzs[0]);
var isAnticlockwise = useDirection.IsSameDirection(normal);
if (!isAnticlockwise)
{
xyzs.Reverse();
}
}
#endregion
return xyzs;
}
}
}