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; }