/// <summary>
        /// 将要删除简单管道结头
        /// </summary>
        /// <param name="id"></param>
        /// <returns>同上</returns>
        public bool WillDeleteSimpleJoints(ObjectId id)
        {
            //先进行深拷贝
            Dictionary <ObjectId, SimplePipeJoint> copyJoints = new Dictionary <ObjectId, SimplePipeJoint>();

            foreach (var item in this.SimplePipeJoints)
            {
                copyJoints.Add(item.Key, item.Value);
            }
            foreach (var item in copyJoints)
            {
                SimplePipeJoint jo = item.Value;
                if (jo.IsSimpleJointPart(id))
                {
                    foreach (var pipeline in jo.ConnectedPipes)
                    {
                        if (pipeline.HeadConnectedObject == jo)
                        {
                            pipeline.HeadConnectedObject = null;
                        }
                        if (pipeline.TailConnectedObject == jo)
                        {
                            pipeline.TailConnectedObject = null;
                        }
                    }
                    this.SimplePipeJoints.Remove(item.Key);
                    return(true);
                }
            }
            return(false);
        }
Ejemplo n.º 2
0
        public PipeLine GenerateFromSimpleJoint(SimplePipeJoint pipeJoint, Point3d ePoint, double width)
        {
            //

            this.CenterPoint = pipeJoint.CenterPoint;
            PipeLine pipeline1 = pipeJoint.GetConnectedPipeLine(0);
            PipeLine pipeline2 = pipeJoint.GetConnectedPipeLine(1);
            Point3d  p1        = CenterPoint + (pipeline1.Point(0) - CenterPoint).GetNormal() * Length;
            Point3d  p2        = CenterPoint + (pipeline2.Point(0) - CenterPoint).GetNormal() * Length;
            Point3d  p3        = CenterPoint + (ePoint - CenterPoint).GetNormal() * Length;

            if (pipeline1.HeadConnectedObject == pipeJoint)
            {
                pipeline1.HeadConnectedObject = this;
                pipeline1.UpdateStartPoint(p1);
            }
            if (pipeline1.TailConnectedObject == pipeJoint)
            {
                pipeline1.TailConnectedObject = this;
                pipeline1.UpdateEndPoint(p1);
            }
            if (pipeline2.HeadConnectedObject == pipeJoint)
            {
                pipeline2.HeadConnectedObject = this;
                pipeline2.UpdateStartPoint(p2);
            }
            if (pipeline2.TailConnectedObject == pipeJoint)
            {
                pipeline2.TailConnectedObject = this;
                pipeline2.UpdateEndPoint(p2);
            }
            PipeLine        pipeline3 = new PipeLine(p3, ePoint, false, OwnSolution, true);
            List <PipeLine> lists     = new List <PipeLine>();

            lists.Add(pipeline1);
            lists.Add(pipeline2);
            lists.Add(pipeline3);
            this.SetPipeLines(lists);
            this.GenerateFromConnectedPipes();
            pipeJoint.RemoveEntity();
            return(pipeline3);
        }
        /// <summary>
        /// 将要删除管道
        /// 删除管道的时候要对其相邻的结头进行处理
        /// </summary>
        /// <param name="id"></param>
        /// <returns>同上</returns>
        public bool WillDeletePipeLine(ObjectId id)
        {
            if (this.PipeLines.ContainsKey(id))
            {
                //

                PipeLine pLine = this.PipeLines[id];
                this.CurrentLineStyle = pLine.Style;
                this.PipeLines.Remove(id);
                if (pLine.HeadConnectedObject is SimplePipeJoint)
                {
                    SimplePipeJoint jo = (SimplePipeJoint)pLine.HeadConnectedObject;
                    foreach (var item in jo.ConnectedPipes)
                    {
                        item.RemoveJoint(jo);
                    }
                    jo.RemoveEntity();
                }
                else if (pLine.HeadConnectedObject is MultiPipeJoint)
                {
                    MultiPipeJoint jo = (MultiPipeJoint)pLine.HeadConnectedObject;
                    jo.DownGrade(pLine);
                }
                if (pLine.TailConnectedObject is SimplePipeJoint)
                {
                    SimplePipeJoint jo = (SimplePipeJoint)pLine.TailConnectedObject;
                    foreach (var item in jo.ConnectedPipes)
                    {
                        item.RemoveJoint(jo);
                    }
                    jo.RemoveEntity();
                }
                else if (pLine.TailConnectedObject is MultiPipeJoint)
                {
                    MultiPipeJoint jo = (MultiPipeJoint)pLine.TailConnectedObject;
                    jo.DownGrade(pLine);
                }
                return(true);
            }
            return(false);
        }
Ejemplo n.º 4
0
 public BaseModel DownGrade(PipeLine line)
 {
     //
     if (this.ConnectedPipes.Contains(line))
     {
         this.RemovePipeLine(line);
         if (this.ConnectedPipes.Count == 2)
         {
             //退化成SimpleJoint 或者 PipeLine
             PipeLine line1 = this.ConnectedPipes[0];
             PipeLine line2 = this.ConnectedPipes[1];
             //退化成新的PipeLine
             if (line1.PipeLineCrossTest(line2) == PipeLine.CrossType.ParallelNoConnect)
             {
                 Point3d   p1, p2;
                 PipeJoint co1, co2;
                 if ((line1.Point(0) - this.CenterPoint).Length > (line1.Point(1) - this.CenterPoint).Length)
                 {
                     p1  = line1.Point(0);
                     co1 = line1.HeadConnectedObject;
                 }
                 else
                 {
                     p1  = line1.Point(1);
                     co1 = line1.TailConnectedObject;
                 }
                 if ((line2.Point(0) - this.CenterPoint).Length > (line2.Point(1) - this.CenterPoint).Length)
                 {
                     p2  = line2.Point(0);
                     co2 = line2.HeadConnectedObject;
                 }
                 else
                 {
                     p2  = line2.Point(1);
                     co2 = line2.TailConnectedObject;
                 }
                 PipeLine pLine = new PipeLine(p1, p2, OwnSolution, true);
                 line1.Delete();
                 line2.Delete();
                 pLine.HeadConnectedObject = co1;
                 if (co1 != null)
                 {
                     co1.RemovePipeLine(line1);
                     co1.AddPipeLine(pLine);
                 }
                 pLine.TailConnectedObject = co2;
                 if (co2 != null)
                 {
                     co2.RemovePipeLine(line2);
                     co2.AddPipeLine(pLine);
                 }
                 this.RemoveEntity();
             }
             else
             {
                 Point3d p1, p2, p3, p4;
                 bool    ht1, ht2; // head or tail, true for head, false for tail
                 if ((line1.Point(0) - this.CenterPoint).Length > (line1.Point(1) - this.CenterPoint).Length)
                 {
                     p1  = line1.Point(0);
                     p3  = line1.Point(1);
                     ht1 = false;
                 }
                 else
                 {
                     p1  = line1.Point(1);
                     p3  = line1.Point(0);
                     ht1 = true;
                 }
                 if ((line2.Point(0) - this.CenterPoint).Length > (line2.Point(1) - this.CenterPoint).Length)
                 {
                     p2  = line2.Point(0);
                     p4  = line2.Point(1);
                     ht2 = false;
                 }
                 else
                 {
                     p2  = line2.Point(1);
                     p4  = line2.Point(0);
                     ht2 = true;
                 }
                 Point3d         intersect       = Utility.Intersect(p1, p3 - p1, p2, p4 - p2);
                 SimplePipeJoint simplePipeJoint = new SimplePipeJoint(p1, intersect, p2, PipeLine.GetScale() / 2, OwnSolution, true);
                 Point3d         p5 = simplePipeJoint.CalculateLastMlineEndPoint();
                 Point3d         p6 = simplePipeJoint.CalculateMlineStartPoint();
                 if (ht1)
                 {
                     line1.UpdateStartPoint(p5);
                     line1.HeadConnectedObject = simplePipeJoint;
                 }
                 else
                 {
                     line1.UpdateEndPoint(p5);
                     line1.TailConnectedObject = simplePipeJoint;
                 }
                 if (ht2)
                 {
                     line2.UpdateStartPoint(p6);
                     line2.HeadConnectedObject = simplePipeJoint;
                 }
                 else
                 {
                     line2.UpdateEndPoint(p6);
                     line2.TailConnectedObject = simplePipeJoint;
                 }
                 simplePipeJoint.AddPipeLine(line1);
                 simplePipeJoint.AddPipeLine(line2);
                 this.RemoveEntity();
             }
         }
         else
         {
             this.GenerateFromConnectedPipes();
         }
     }
     return(null);
 }
        /// <summary>
        /// 管道相交测试
        /// </summary>
        /// <param name="pipeLine">测试管道</param>
        /// <param name="isFirst">相交测试是一个递归的过程,在一层递归里面PipeLine并没有被实际创建,而是在测试结束后才创建,下面的递归
        /// 层,测试的管道都是已经被创建了的</param>
        /// <returns></returns>
        public Point3d?PipeLineCrossTest(PipeLine pipeLine)
        {
            Point3d?res;
            Dictionary <ObjectId, PipeLine> copyPipelines = new Dictionary <ObjectId, PipeLine>();

            foreach (var item in PipeLines)
            {
                copyPipelines.Add(item.Key, item.Value);
            }

            //和管道测试相交
            foreach (var item in copyPipelines)
            {
                PipeLine cItem = (PipeLine)item.Value;
                if (cItem == pipeLine)
                {
                    continue;
                }
                PipeLine.CrossType type = cItem.PipeLineCrossTest(pipeLine);
                if (type == PipeLine.CrossType.CrossNone)
                {
                    continue;
                }
                else if (type == PipeLine.CrossType.ParallelHead)
                {
                    Point3d p1 = pipeLine.Point(0);
                    Point3d p2 = pipeLine.Point(1);
                    Point3d p3;
                    bool    result = false;
                    if ((p1 - cItem.Point(0)).Length < (p2 - cItem.Point(0)).Length)
                    {
                        result = false;
                        p3     = p2;
                    }
                    else
                    {
                        result = true;
                        p3     = p1;
                    }
                    Vector3d v  = cItem.Point(0) - cItem.Point(1);
                    Vector3d v1 = p3 - cItem.Point(0);
                    Point3d  p  = cItem.Point(0) + v1.DotProduct(v.GetNormal()) * v.GetNormal();
                    //
                    pipeLine = new PipeLine(p, cItem.Point(1), false, this);
                    pipeLine.TailConnectedObject = cItem.TailConnectedObject;
                    if (pipeLine.TailConnectedObject != null)
                    {
                        pipeLine.TailConnectedObject.RemovePipeLine(cItem);
                        pipeLine.TailConnectedObject.AddPipeLine(pipeLine);
                    }
                    cItem.Delete();
                    //递归调用

                    res = PipeLineCrossTest(pipeLine);
                    if (result)
                    {
                        return(null);
                    }
                    else
                    {
                        return(res);
                    }
                }
                else if (type == PipeLine.CrossType.ParallelTail)
                {
                    Point3d p1 = pipeLine.Point(0);
                    Point3d p2 = pipeLine.Point(1);
                    Point3d p3;
                    bool    result;
                    if ((p1 - cItem.Point(1)).Length < (p2 - cItem.Point(1)).Length)
                    {
                        result = false;
                        p3     = p2;
                    }
                    else
                    {
                        result = true;
                        p3     = p1;
                    }
                    Vector3d v  = cItem.Point(1) - cItem.Point(0);
                    Vector3d v1 = p3 - cItem.Point(1);
                    Point3d  p  = cItem.Point(1) + v1.DotProduct(v.GetNormal()) * v.GetNormal();
                    //
                    pipeLine = new PipeLine(cItem.Point(0), p, false, this);
                    pipeLine.HeadConnectedObject = cItem.HeadConnectedObject;
                    if (pipeLine.HeadConnectedObject != null)
                    {
                        pipeLine.HeadConnectedObject.RemovePipeLine(cItem);
                        pipeLine.HeadConnectedObject.AddPipeLine(pipeLine);
                    }
                    cItem.Delete();
                    //递归调用
                    res = PipeLineCrossTest(pipeLine);
                    if (result)
                    {
                        return(null);
                    }
                    else
                    {
                        return(res);
                    }
                }
                else if (type == PipeLine.CrossType.NonParallelHead)
                {
                    Point3d p1 = pipeLine.Point(0);
                    Point3d p2 = pipeLine.Point(1);
                    Point3d p3;
                    bool    result;
                    if ((p1 - cItem.Point(0)).Length < (p2 - cItem.Point(0)).Length)
                    {
                        result = false;
                        p3     = p2;
                    }
                    else
                    {
                        result = true;
                        p3     = p1;
                    }
                    SimplePipeJoint simplePipeJoint = new SimplePipeJoint(cItem.Point(1), cItem.Point(0), p3, PipeLine.GetScale() / 2, this, true);
                    cItem.UpdateStartPoint(simplePipeJoint.CalculateLastMlineEndPoint());
                    Point3d startPoint = simplePipeJoint.CalculateMlineStartPoint();
                    simplePipeJoint.AddPipeLine(cItem);
                    PipeLine newLine = new PipeLine(p3, startPoint, false, this);
                    simplePipeJoint.AddPipeLine(newLine);
                    cItem.HeadConnectedObject   = simplePipeJoint;
                    newLine.TailConnectedObject = simplePipeJoint;
                    if (pipeLine.HeadConnectedObject != null)
                    {
                        pipeLine.HeadConnectedObject.RemovePipeLine(pipeLine);
                        pipeLine.HeadConnectedObject.AddPipeLine(newLine);
                        newLine.HeadConnectedObject = pipeLine.HeadConnectedObject;
                    }
                    //递归调用
                    res = PipeLineCrossTest(newLine);
                    if (result)
                    {
                        return(null);
                    }
                    else
                    {
                        return(res);
                    }
                }
                else if (type == PipeLine.CrossType.NonParallelTail)
                {
                    Point3d p1 = pipeLine.Point(0);
                    Point3d p2 = pipeLine.Point(1);
                    Point3d p3;
                    bool    result;
                    if ((p1 - cItem.Point(1)).Length < (p2 - cItem.Point(1)).Length)
                    {
                        result = false;
                        p3     = p2;
                    }
                    else
                    {
                        result = true;
                        p3     = p1;
                    }
                    SimplePipeJoint simplePipeJoint = new SimplePipeJoint(cItem.Point(0), cItem.Point(1), p3, PipeLine.GetScale() / 2, this, true);
                    cItem.UpdateEndPoint(simplePipeJoint.CalculateLastMlineEndPoint());
                    cItem.TailConnectedObject = simplePipeJoint;
                    Point3d startPoint = simplePipeJoint.CalculateMlineStartPoint();
                    simplePipeJoint.AddPipeLine(cItem);
                    PipeLine newLine = new PipeLine(startPoint, p3, false, this);
                    simplePipeJoint.AddPipeLine(newLine);
                    newLine.HeadConnectedObject = simplePipeJoint;
                    if (pipeLine.TailConnectedObject != null)
                    {
                        pipeLine.TailConnectedObject.RemovePipeLine(pipeLine);
                        pipeLine.TailConnectedObject.AddPipeLine(newLine);
                        newLine.TailConnectedObject = pipeLine.TailConnectedObject;
                    }
                    res = PipeLineCrossTest(newLine);
                    if (result)
                    {
                        return(null);
                    }
                    else
                    {
                        return(res);
                    }
                }
                else if (type == PipeLine.CrossType.CrossHead)
                {
                    MultiPipeJoint mj = new MultiPipeJoint(this, true);
                    List <Point3d> ps = mj.GenerateFromCrossPipe(cItem, pipeLine.Point(0), pipeLine.Point(1), PipeLine.GetScale() / 2);
                    PipeLine       p1 = new PipeLine(cItem.Point(0), ps[0], this, true);
                    PipeLine       p2 = new PipeLine(ps[1], cItem.Point(1), this, true);
                    //
                    if (cItem.HeadConnectedObject != null)
                    {
                        cItem.HeadConnectedObject.RemovePipeLine(cItem);
                        cItem.HeadConnectedObject.AddPipeLine(p1);
                    }
                    if (cItem.TailConnectedObject != null)
                    {
                        cItem.TailConnectedObject.RemovePipeLine(cItem);
                        cItem.TailConnectedObject.AddPipeLine(p2);
                    }
                    p1.HeadConnectedObject = cItem.HeadConnectedObject;
                    p1.TailConnectedObject = mj;
                    p2.HeadConnectedObject = mj;
                    p2.TailConnectedObject = cItem.TailConnectedObject;

                    Point3d startPoint = ps[2];
                    cItem.Delete();

                    PipeLine pLine = new PipeLine(startPoint, pipeLine.Point(1), false, this);
                    pLine.HeadConnectedObject = mj;
                    if (pipeLine.TailConnectedObject != null)
                    {
                        pipeLine.TailConnectedObject.RemovePipeLine(pipeLine);
                        pipeLine.TailConnectedObject.AddPipeLine(pLine);
                        pLine.TailConnectedObject = pipeLine.TailConnectedObject;
                    }
                    mj.AddPipeLine(p1);
                    mj.AddPipeLine(p2);
                    mj.AddPipeLine(pLine);

                    res = PipeLineCrossTest(pLine);
                    return(res);
                }
                else if (type == PipeLine.CrossType.CrossTail)
                {
                    //
                    MultiPipeJoint mj = new MultiPipeJoint(this, true);
                    List <Point3d> ps = mj.GenerateFromCrossPipe(cItem, pipeLine.Point(1), pipeLine.Point(0), PipeLine.GetScale() / 2);
                    PipeLine       p1 = new PipeLine(cItem.Point(0), ps[0], this, true);
                    PipeLine       p2 = new PipeLine(ps[1], cItem.Point(1), this, true);
                    //
                    if (cItem.HeadConnectedObject != null)
                    {
                        cItem.HeadConnectedObject.RemovePipeLine(cItem);
                        cItem.HeadConnectedObject.AddPipeLine(p1);
                    }
                    if (cItem.TailConnectedObject != null)
                    {
                        cItem.TailConnectedObject.RemovePipeLine(cItem);
                        cItem.TailConnectedObject.AddPipeLine(p2);
                    }
                    p1.HeadConnectedObject = cItem.HeadConnectedObject;
                    p1.TailConnectedObject = mj;
                    p2.HeadConnectedObject = mj;
                    p2.TailConnectedObject = cItem.TailConnectedObject;
                    Point3d startPoint = ps[2];
                    cItem.Delete();
                    PipeLine pLine = new PipeLine(pipeLine.Point(0), startPoint, false, this);
                    pLine.TailConnectedObject = mj;
                    if (pipeLine.HeadConnectedObject != null)
                    {
                        pipeLine.HeadConnectedObject.RemovePipeLine(pipeLine);
                        pipeLine.HeadConnectedObject.AddPipeLine(pLine);
                        pLine.HeadConnectedObject = pipeLine.HeadConnectedObject;
                    }
                    mj.AddPipeLine(p1);
                    mj.AddPipeLine(p2);
                    mj.AddPipeLine(pLine);
                    PipeLineCrossTest(pLine);
                    return(mj.CenterPoint);
                }
                else if (type == PipeLine.CrossType.CrossOver)
                {
                    MultiPipeJoint mj = new MultiPipeJoint(this, true);
                    List <Point3d> ps = mj.GenerateFromCrossPipe(cItem, pipeLine.Point(1), pipeLine.Point(0), PipeLine.GetScale() / 2);
                    PipeLine       p1 = new PipeLine(cItem.Point(0), ps[0], this, true);
                    PipeLine       p2 = new PipeLine(ps[1], cItem.Point(1), this, true);
                    if (cItem.HeadConnectedObject != null)
                    {
                        cItem.HeadConnectedObject.RemovePipeLine(cItem);
                        cItem.HeadConnectedObject.AddPipeLine(p1);
                    }
                    if (cItem.TailConnectedObject != null)
                    {
                        cItem.TailConnectedObject.RemovePipeLine(cItem);
                        cItem.TailConnectedObject.AddPipeLine(p2);
                    }

                    p1.HeadConnectedObject = cItem.HeadConnectedObject;
                    p1.TailConnectedObject = mj;
                    p2.HeadConnectedObject = mj;
                    p2.TailConnectedObject = cItem.TailConnectedObject;

                    Point3d startPoint = ps[2];
                    cItem.Delete();

                    PipeLine pLine = new PipeLine(pipeLine.Point(0), startPoint, false, this);
                    pLine.TailConnectedObject = mj;
                    if (pipeLine.HeadConnectedObject != null)
                    {
                        pipeLine.HeadConnectedObject.RemovePipeLine(pipeLine);
                        pipeLine.HeadConnectedObject.AddPipeLine(pLine);
                        pLine.HeadConnectedObject = pipeLine.HeadConnectedObject;
                    }
                    mj.AddPipeLine(p1);
                    mj.AddPipeLine(p2);
                    mj.AddPipeLine(pLine);
                    PipeLineCrossTest(pLine);
                    //插入新的点
                    PipeLine se = mj.UpdateMultiJoint(pipeLine.Point(1));
                    se.HeadConnectedObject = mj;
                    if (pipeLine.TailConnectedObject != null)
                    {
                        pipeLine.TailConnectedObject.RemovePipeLine(pipeLine);
                        pipeLine.TailConnectedObject.AddPipeLine(se);
                        se.TailConnectedObject = pipeLine.TailConnectedObject;
                    }
                    res = PipeLineCrossTest(se);
                    return(res);
                }
            }
            foreach (var item in SimplePipeJoints)
            {
                SimplePipeJoint pItem = (SimplePipeJoint)item.Value;
                if (pItem.PointInJoint(pipeLine.Point(0)) && !pItem.ConnectedPipes.Contains(pipeLine))
                {
                    MultiPipeJoint mpj = new MultiPipeJoint(this, true);
                    PipeLine       ps  = mpj.GenerateFromSimpleJoint(pItem, pipeLine.Point(1), PipeLine.GetScale() / 2);
                    ps.HeadConnectedObject = mpj;
                    res = PipeLineCrossTest(ps);
                    return(res);
                }
                if (pItem.PointInJoint(pipeLine.Point(1)) && !pItem.ConnectedPipes.Contains(pipeLine))
                {
                    MultiPipeJoint mpj = new MultiPipeJoint(this, true);
                    PipeLine       ps  = mpj.GenerateFromSimpleJoint(pItem, pipeLine.Point(0), PipeLine.GetScale() / 2);
                    ps.TailConnectedObject = mpj;
                    res = PipeLineCrossTest(ps);
                    return(null);
                }
            }
            foreach (var item in MultiPipeJoints)
            {
                MultiPipeJoint pItem = (MultiPipeJoint)item.Value;
                if (pItem.PointInJoint(pipeLine.Point(0)) && !pItem.ConnectedPipes.Contains(pipeLine))
                {
                    PipeLine se = pItem.UpdateMultiJoint(pipeLine.Point(1));
                    se.HeadConnectedObject = pItem;
                    res = PipeLineCrossTest(se);
                    return(res);
                }
                if (pItem.PointInJoint(pipeLine.Point(1)) && !pItem.ConnectedPipes.Contains(pipeLine))
                {
                    PipeLine se = pItem.UpdateMultiJoint(pipeLine.Point(0));
                    se.HeadConnectedObject = pItem;
                    res = PipeLineCrossTest(se);
                    return(null);
                }
            }
            pipeLine.SaveEntity();
            return(pipeLine.Point(1));
        }