123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- using Autodesk.Revit.DB;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace FWindSoft.Revit.Mep
- {
- /// <summary>
- /// 连接件包装
- /// </summary>
- public class FittingWrapper
- {
- public FittingWrapper(FamilyInstance fi)
- {
- Fitting = fi;
- /*
- * 当基础的旋转完成。如果Second向量,与Z平行,且需要横放。则将构件进行头部旋转。
- * 如果Second向量与Z垂直,且需要竖放时,旋转构件到指定角度
- */
- }
- public FamilyInstance Fitting { get; private set; }
- /// <summary>
- /// 是否能控制摆放
- /// </summary>
- public bool CanCtrlPlacement { get; set; }
- /// <summary>
- /// 摆放样式
- /// </summary>
- public int PlacementStyle { get; set; }
- /// <summary>
- /// 计算Fi的坐标信息,必须是单位向量
- /// </summary>
- /// <param name="fi"></param>
- /// <returns></returns>
- public Tuple<XYZ, XYZ> GetCoordinate(FamilyInstance fi)
- {
- var result = FittingCoordinateFactory.GetCoordinate(fi);
- if (result != null)
- {
- return result;
- }
- return new Tuple<XYZ, XYZ>(XYZ.BasisX, XYZ.BasisY);
- }
- public void Rotate(XYZ location, XYZ mathFirst, XYZ matchSecond)
- {
- bool isRegenerate = false;
- #region 获取初始坐标
- var originCoordinate = GetCoordinate(Fitting);
- var firstDirection = originCoordinate.Item1;
- var secondDirection = originCoordinate.Item2;
- #endregion
- var doc = Fitting.Document;
- #region 匹配第一个给定向量
- XYZ axisFirst = null;
- double angleFirst = 0;
- if (firstDirection.IsParallel(mathFirst))
- {
- if (firstDirection.IsOppositeDirection(mathFirst))
- {
- //反向绕secondDirection,旋转π
- axisFirst = secondDirection;
- angleFirst = Math.PI;
- }
- }
- else
- {
- axisFirst = firstDirection.CrossProduct(mathFirst).Normalize();
- angleFirst = firstDirection.AngleOnPlaneTo(mathFirst, axisFirst);
- }
- if (axisFirst != null)
- {
- var line = Line.CreateUnbound(location, axisFirst);
- ElementTransformUtils.RotateElement(doc, Fitting.Id, line, angleFirst);
- firstDirection = firstDirection.RotateVector(axisFirst, angleFirst);
- secondDirection = secondDirection.RotateVector(axisFirst, angleFirst);
- isRegenerate = true;
- }
- #endregion
- #region 匹配第二个给定向量
- var baseDirection = firstDirection.Normalize();
- var useSecond = matchSecond - matchSecond.DotProduct(baseDirection) * baseDirection;
- if (!secondDirection.IsSameDirection(useSecond))
- {
- //useSecond与firstDirection垂直,firstDirection 与secondDirection垂直。所以
- //useSecond与secondDirection 都与firstDirection。这样他们可以通过旋转得到
- var line2 = Line.CreateUnbound(location, baseDirection);
- var angleSecond = secondDirection.AngleOnPlaneTo(useSecond, baseDirection);
- ElementTransformUtils.RotateElement(doc, Fitting.Id, line2, angleSecond);
- isRegenerate = true;
- }
- #endregion
- if (isRegenerate)
- {
- Fitting.Document.Regenerate();
- }
- }
- }
- }
|