Esempio n. 1
0
 public OverlapBranch(SkewPipe skewPipe)
 {
     InitProperties();
     ReferenceCurve = (skewPipe.pipe.Location as LocationCurve).Curve;
     ReferenceCurve.MakeUnbound();
     Push(skewPipe);
 }
Esempio n. 2
0
                public OverlapChecker(SkewPipe skewPipe, double lengthBetweenPipe)
                {
                    LengthBetweenPipe = lengthBetweenPipe;
                    Branches          = new List <OverlapBranch>();
                    Push(skewPipe);

                    //Branches.Add(new OverlapBranch(skewPipe));
                    //LatestSkewPipe = skewPipe;
                }
Esempio n. 3
0
                /// <summary>
                /// 加入队列
                /// </summary>
                /// <param name="skewPipe"></param>
                public void Push(SkewPipe skewPipe)
                {
                    //这里以X小的为左点,X大的为右点
                    SkewPipes.Add(skewPipe);
                    var curve = (skewPipe.pipe.Location as LocationCurve).Curve;

                    if (curve.GetEndPoint(0).X < curve.GetEndPoint(1).X)
                    {
                        Lefts.Add(ReferenceCurve.Project(curve.GetEndPoint(0)).XYZPoint);
                        Rights.Add(ReferenceCurve.Project(curve.GetEndPoint(1)).XYZPoint);
                    }
                    else
                    {
                        Lefts.Add(ReferenceCurve.Project(curve.GetEndPoint(1)).XYZPoint);
                        Rights.Add(ReferenceCurve.Project(curve.GetEndPoint(0)).XYZPoint);
                    }
                }
Esempio n. 4
0
 /// <summary>
 /// 是否间距有效
 /// </summary>
 /// <param name="previousPipe"></param>
 /// <param name="currentPipe"></param>
 /// <returns></returns>
 private bool IsValidInterval(SkewPipe previousPipe, SkewPipe currentPipe)
 {
     return(Math.Abs(previousPipe.Skew - currentPipe.Skew) <= LengthBetweenPipe);
 }
Esempio n. 5
0
                /// <summary>
                /// 加入队列
                /// </summary>
                /// <param name="skewPipe"></param>
                public PipeGroupCollection Push(SkewPipe skewPipe)
                {
                    var skewPipeId = skewPipe.pipe.Id.IntegerValue;

                    if (LatestSkewPipe == null)
                    {
                        LatestSkewPipe = skewPipe;
                        Branches.Add(new OverlapBranch(skewPipe));
                        return(null);
                    }
                    //如果和最近一次添加项的间距超出限制,则所有的都超出限制,直接做全部结算
                    if (!IsValidInterval(LatestSkewPipe, skewPipe))
                    {
                        var result = Clear();
                        Push(skewPipe);
                        return(result);
                    }

                    PipeGroupCollection collection = new PipeGroupCollection();

                    LatestSkewPipe = skewPipe;
                    //对于每一个分支,最近添加项都有可能是不同的,需重新计算间距
                    bool isExist = false;

                    if (Branches.Count > 100000)
                    {
                        throw new NotImplementedException("超出了十万的分支限制");
                    }
                    for (int i = Branches.Count() - 1; i >= 0; i--)
                    {
                        var branch = Branches[i];
                        if (branch.SkewPipes.Count == AnnotationConstaints.PipeCountMax - 1)//如果分组个数超出了规定 则不予生成
                        {
                            throw new NotImplementedException("管道超出了并排6个的上限");
                            branch.Push(skewPipe);
                            collection.Add(branch.ToPipeGroup());
                            Branches.Remove(branch);
                        }
                        else if (!IsValidInterval(branch.LatestSkewPipe, skewPipe))//如果间距超出了限制,则做一波结算
                        {
                            collection.Add(branch.ToPipeGroup());
                            Branches.Remove(branch);
                        }
                        else
                        {
                            branch.Push(skewPipe);
                            if (branch.IsOverlapped)
                            {
                                Branches.Add(branch.Clone());
                            }
                            else
                            {
                                //TODO 如果已有该项的单项
                                if (!isExist)
                                {
                                    foreach (var b in Branches)
                                    {
                                        if (b.SkewPipes.Count() == 1 && b.SkewPipes[0] == skewPipe)
                                        {
                                            isExist = true;
                                            break;
                                        }
                                    }
                                    if (!isExist)
                                    {
                                        Branches.Add(new OverlapBranch(skewPipe));
                                    }
                                }
                            }
                            branch.PopLast();
                        }
                    }
                    //本来想要在这里做消重处理 比如 A-B A-B-D但是后续可能出现A-B-E
                    //目前没有很好的办法检测后续是否会出现E
                    return(collection);
                }