LineUtil.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:LineUtil
  3. * 作者:xulisong
  4. * 创建时间: 2019/4/29 8:49:52
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using Autodesk.Revit.DB;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using SAGA.RevitUtils.Extends;
  14. namespace SAGA.RevitUtils.Utils
  15. {
  16. public static class LineUtil
  17. {
  18. /// <summary>
  19. /// 获取点在当前线的位置
  20. /// </summary>
  21. /// <param name="line"></param>
  22. /// <param name="point"></param>
  23. /// <returns>-1不在线上,0在开始点,1在结束点</returns>
  24. public static int GetPosition(Line line, XYZ point)
  25. {
  26. if (line.StartPoint().IsEqual(point))
  27. {
  28. return 0;
  29. }
  30. else if (line.EndPoint().IsEqual(point))
  31. {
  32. return 1;
  33. }
  34. else
  35. {
  36. return -1;
  37. }
  38. }
  39. /// <summary>
  40. /// 获取第一个满足条件的点,如果没有找到返回本身
  41. /// </summary>
  42. /// <param name="lines"></param>
  43. /// <param name="start"></param>
  44. /// <param name="breakCondition"></param>
  45. /// <returns></returns>
  46. public static XYZ GetFirstPoint(List<Line> lines, XYZ start, Func<XYZ, bool> breakCondition)
  47. {
  48. List<Line> useLines = new List<Line>();
  49. var usePoint = start;
  50. bool isFind = false;
  51. do
  52. {
  53. isFind = false;
  54. for (int i = 0; i < lines.Count; i++)
  55. {
  56. var tempLine = lines[i];
  57. if (useLines.Any(e => e == tempLine))
  58. {
  59. continue;
  60. }
  61. var flag = LineUtil.GetPosition(tempLine, usePoint);
  62. if (flag == -1)
  63. {
  64. continue;
  65. }
  66. isFind = true;
  67. if (flag == 0)
  68. {
  69. usePoint = tempLine.EndPoint();
  70. }
  71. else if (flag == 1)
  72. {
  73. usePoint = tempLine.StartPoint();
  74. }
  75. useLines.Add(tempLine);
  76. break;
  77. }
  78. } while (isFind && !breakCondition(usePoint));
  79. return usePoint;
  80. }
  81. }
  82. }