コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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
                    });
                }
            }
        }