public static List <DuctModel> GetDuctModels(ExternalCommandData commandData) { var ductsModel = new List <DuctModel>(); var ducts = GenericSelectionUtils <Duct> .GetObjectsByType(commandData); foreach (var oDuct in ducts) { var pipeStartEndPoints = oDuct.GetStartAndEndPoint(); var pipeConnectors = oDuct.GetConnectors(); if (pipeStartEndPoints.Count < 2 || pipeConnectors.Count < 2) { continue; } var pipeModel = new DuctModel { Model = oDuct, Curve = oDuct.GetCurve(), StarPoint = pipeStartEndPoints[0], EndPoint = pipeStartEndPoints[1], ConnectorFirst = pipeConnectors[0], ConnectorSecond = pipeConnectors[1] }; ductsModel.Add(pipeModel); } return(ductsModel); }
private static DuctAndMassIntersectionModel GetIntersection( DuctModel DuctModel, MassFormModel massFormModel, List <XYZ> fittingPointList) { var intersectionsInstance = new DuctAndMassIntersectionModel { Duct = DuctModel, MassForm = massFormModel }; var ductCurveStartPoint = DuctModel.StarPoint; var ductCurveEndPoint = DuctModel.EndPoint; foreach (var massFace in massFormModel.Faces) { IntersectionResultArray intersectionResultArray = null; massFace.Intersect(DuctModel.Curve, out intersectionResultArray); if (intersectionResultArray == null) { continue; } foreach (IntersectionResult intResult in intersectionResultArray) { if (intResult.XYZPoint == null) { continue; } var intersectPoint = intResult.XYZPoint; //Проверяем совпадает ли точка пересечения с точкой коннектора фитинга bool isFittingPointMatch = false; foreach (var fittingPoint in fittingPointList) { if (intersectPoint.IsEqualByXYZ(fittingPoint, 5)) { isFittingPointMatch = true; break; } } if (isFittingPointMatch) { continue; } //Если точка коннектора трубы совпадает с точкой пересечения, то улетаем if (intersectPoint.IsEqualByXYZ(ductCurveStartPoint, 5) || intersectPoint.IsEqualByXYZ(ductCurveEndPoint, 5)) { continue; } bool isIntersectPointInRange = NumberUtils.IsInRange( intersectPoint.Z, Math.Min(ductCurveStartPoint.Z, ductCurveStartPoint.Z), Math.Max(ductCurveEndPoint.Z, ductCurveEndPoint.Z)); //проверяем находится ли точка на линии if (GeomShark.PointUtils.IsPointBetweenOtherTwoPoints( ductCurveStartPoint.X, ductCurveStartPoint.Y, ductCurveEndPoint.X, ductCurveEndPoint.Y, intersectPoint.X, intersectPoint.Y, 4) && isIntersectPointInRange) { intersectionsInstance.IntersectionPoints.Add(intersectPoint); } } } return((intersectionsInstance.IntersectionPoints.Count > 0) ? intersectionsInstance : null); }
public void CreateDuctsFromIntersectionPoints( List <DuctAndMassIntersectionModel> ductAndMassFormIntersectionList, List <List <XYZ> > ductPointsToCheckList, ExternalCommandData commandData) { foreach (var ductAndMassInt in ductAndMassFormIntersectionList) { //Выбираем точки, по которым будем создавать трубы var pointsToCreatePipes = new List <XYZ>(); pointsToCreatePipes.Add(ductAndMassInt.Duct.StarPoint); pointsToCreatePipes.AddRange(ductAndMassInt.IntersectionPoints .OrderBy(p => p.DistanceTo(ductAndMassInt.Duct.StarPoint)).ToList()); pointsToCreatePipes.Add(ductAndMassInt.Duct.EndPoint); bool isNewPipeCreated = false; for (int i = 0; i < pointsToCreatePipes.Count; i++) { if (i == 0) { continue; } var currentPoint = pointsToCreatePipes[i]; var prevPoint = pointsToCreatePipes[i - 1]; //Проверяем, совпадают ли точки новой трубы с точками труб из модели bool areNewAndOldPipePointsMatch = false; foreach (var pointsCheck in ductPointsToCheckList) { if (pointsCheck.Count < 2) { continue; } if (pointsCheck[0].IsEqualByXYZ(currentPoint, 5) && pointsCheck[1].IsEqualByXYZ(prevPoint, 5)) { areNewAndOldPipePointsMatch = true; } else if (pointsCheck[0].IsEqualByXYZ(prevPoint, 5) && pointsCheck[1].IsEqualByXYZ(currentPoint, 5)) { areNewAndOldPipePointsMatch = true; } } if (areNewAndOldPipePointsMatch) { continue; } if (currentPoint.IsEqualByXYZ(prevPoint, 5)) { continue; } //Создаём новую трубу по новым точкам, но присваивая свойства прошлой трубы var newDuct = DuctsUtils.CreateNewDuctByTypeOfExisted( ductAndMassInt.Duct.Model, currentPoint, prevPoint, commandData); if (newDuct == null) { continue; } var newDuctModel = DuctModel.Create(newDuct); if (newDuctModel != null) { isNewPipeCreated = true; Ducts.Add(newDuctModel); } } foreach (var oDuctFirst in Ducts) { foreach (var oDuctSecond in Ducts) { oDuctFirst.Model.ConnectToWithUnionFitting(oDuctSecond.Model, commandData); } } if (isNewPipeCreated) { DeleteUtils.DeleteElements(commandData, new List <Element> { ductAndMassInt.Duct.Model }); } } }