public void HighLight(BaseModel model)
 {
     List<PipeLine> max_pipes;
     double maxl = GetMaxPipeLengthOfModel(model, out max_pipes);
     foreach (var item in max_pipes)
     {
         item.Highlight();
     }
 }
        //主管道长度
        public double GetMaxPipeLengthOfModel(BaseModel model, out List<PipeLine> lines)
        {
            if (model is SubStation || model is HeatProducer)
            {
                List<PipeLine> connectedpipes = SearchConnected(model);
                List<PipeLine> pipes = new List<PipeLine>();
                foreach (var item in connectedpipes)
                {
                    if(model is HeatProducer)
                    {
                        pipes.Add(item);
                    }
                    else if(model is SubStation)
                    {
                        if(item.Style == PipeLineStyle.AnyConnectedBuilding)
                        {
                            pipes.Add(item);
                        }
                    }
                }

                double maxium = 0;
                List<PipeLine> max_pipes = new List<PipeLine>();
                foreach (var item in pipes)
                {
                    List<PipeLine> item_maxlines;
                    double v = GetMainPipeLineLength(item, out item_maxlines);
                    if (v > maxium)
                    {
                        max_pipes = item_maxlines;
                        maxium = v;
                    }
                }

                lines = max_pipes;
                return maxium;
            }
            lines = new List<PipeLine>();
            return 0;
        }
 //管道总长度
 public double GetTotalPipeLengthOfModel(BaseModel model, out List<PipeLine> lines)
 {
     if (model is SubStation || model is HeatProducer)
     {
         List<PipeLine> connectedpipes = SearchConnected(model);
         List<PipeLine> pipes = new List<PipeLine>();
         foreach (var item in connectedpipes)
         {
             if (model is HeatProducer)
             {
                 pipes.Add(item);
             }
             else if (model is SubStation)
             {
                 if (item.Style == PipeLineStyle.AnyConnectedBuilding)
                 {
                     pipes.Add(item);
                 }
             }
         }
         double total = 0;
         Stack<PipeLine> st = new Stack<PipeLine>();
         foreach (var item in pipes)
         {
             st.Push(item);
         }
         Dictionary<ObjectId, PipeLine> allLines = new Dictionary<ObjectId, PipeLine>();
         while (st.Count != 0)
         {
             PipeLine pl = st.Pop();
             if (!allLines.ContainsKey(pl.BaseObjectId))
             {
                 allLines.Add(pl.BaseObjectId, pl);
                 if (pl.HeadConnectedObject != null)
                 {
                     foreach (var item in pl.HeadConnectedObject.ConnectedPipes)
                     {
                         if (!allLines.ContainsKey(item.BaseObjectId))
                         {
                             st.Push(item);
                         }
                     }
                 }
                 if (pl.TailConnectedObject != null)
                 {
                     foreach (var item in pl.TailConnectedObject.ConnectedPipes)
                     {
                         if (!allLines.ContainsKey(item.BaseObjectId))
                         {
                             st.Push(item);
                         }
                     }
                 }
             }
         }
         List<PipeLine> ConnectedLines = new List<PipeLine>();
         foreach (var item in allLines)
         {
             ConnectedLines.Add(item.Value);
             total += item.Value.CalculateLength();
         }
         lines = ConnectedLines;
         //
         if (model is HeatProducer)
         {
             HeatProducer heatProducer = (HeatProducer)model;
             if (heatProducer.OwnSlaveDistrict != null)
             {
                 foreach (var item in heatProducer.OwnSlaveDistrict.SubStations)
                 {
                     List<PipeLine> ls;
                     total += item.OwnSolution.GetTotalPipeLengthOfModel(item, out ls);
                     lines.AddRange(ls);
                 }
             }
         }
         return total;
     }
     lines = new List<PipeLine>();
     return 0;
 }
        public List<PipeLine> SearchConnected(BaseModel model)
        {
            List<PipeLine> pipes = new List<PipeLine>();
            if (!model.BaseObjectId.IsNull)
            {
                try
                {
                    Database db = HostApplicationServices.WorkingDatabase;
                    using (Transaction tr = db.TransactionManager.StartTransaction())
                    {
                        DBObject obj = tr.GetObject(model.BaseObjectId, OpenMode.ForRead);
                        BlockReference block = (BlockReference)obj;

                        Extents3d bd = block.GeometryExtentsBestFit();
                        foreach (var item in PipeLines)
                        {
                            Point3d p1 = item.Value.Point(0);
                            Point3d p2 = item.Value.Point(1);
                            if (p1.X >= bd.MinPoint.X - 0.001 && p1.Y >= bd.MinPoint.Y - 0.001 && p1.X <= bd.MaxPoint.X + 0.001 && p1.Y <= bd.MaxPoint.Y + 0.001)
                            {
                                pipes.Add(item.Value);
                                continue;
                            }
                            if (p2.X >= bd.MinPoint.X - 0.001 && p2.Y >= bd.MinPoint.Y - 0.001 && p2.X <= bd.MaxPoint.X + 0.001 && p2.Y <= bd.MaxPoint.Y + 0.001)
                            {
                                pipes.Add(item.Value);
                                continue;
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(e.Message);
                }
            }
            return pipes;
        }