private Solid.Profile CalculateProfile(AcadGeo.Point3d pnt) { Solid.Profile ret_prol = new Solid.Profile(profile); Node sn = FindNode(ret_prol.BasePoint); Node dn = FindNode(pnt); if (sn == dn) { return(ret_prol); } if (null == sn || null == dn) { return(null); } IEnumerable <Connection> routes = null; TryFunc <Node, IEnumerable <Connection> > func = routers.ShortestPathsDijkstra(e => 1, sn); if (func(dn, out routes)) { if (null == routes || 0 == routes.Count()) { return(null); } List <AcadGeo.Point3d> route_pnts = new List <AcadGeo.Point3d>(); route_pnts.Add(sn.Position); for (int i = 0; i < routes.Count(); i++) { if (routes.ElementAt(i).Source.Position.IsEqualTo(route_pnts.Last())) { route_pnts.Add(routes.ElementAt(i).Target.Position); } else { route_pnts.Add(routes.ElementAt(i).Source.Position); } } if (route_pnts.Count > 1) { ret_prol.Rotate(AcadFuncs.GetVec(route_pnts[0], route_pnts[1])); } for (int i = 0; i < route_pnts.Count() - 1; i++) { AcadGeo.Point3d sc = route_pnts.ElementAt(i); AcadGeo.Point3d dc = route_pnts.ElementAt(i + 1); ret_prol.Translate(AcadFuncs.GetVec(dc, sc) * sc.DistanceTo(dc)); if (i > 0) { ret_prol.Rotate(ret_prol.BasePoint.IsEqualTo(dc) ? AcadFuncs.GetVec(dc, sc) : AcadFuncs.GetVec(sc, dc)); } } return(ret_prol); } return(null); }
public void BuildRoutingSolid() { List <Node> nodes = routers.Vertices.ToList(); foreach (var n in nodes.ToList()) { nodes.Remove(n); if (n.Connections.Count > 4) { continue; } foreach (var conn in n.Connections) { Node sn = n.GetConnection(conn); if (null != nodes.Find(x => x == sn)) { Solid.Straight solid = BuildStraight(n, sn); if (null != solid) { Solid.Profile cal_prol = CalculateProfile(n.Position); cal_prol.Rotate(AcadFuncs.GetVec(sn.Position, n.Position)); solid.Profile = cal_prol; solids.Add(solid); } } } if (ELBOW_CONNS == n.Connections.Count) { Solid.Elbow elbow = new Solid.Elbow(); elbow.Position = n.Position; AcadGeo.Point3d[] bps = new AcadGeo.Point3d[2]; bps[0] = n.Connections[0].Source.Position == n.Position ? n.Connections[0].Target.Position : n.Connections[0].Source.Position; bps[1] = n.Connections[1].Source.Position == n.Position ? n.Connections[1].Target.Position : n.Connections[1].Source.Position; elbow.BranchPos = bps; elbow.Profile = CalculateProfile(n.Position); elbow.Radius = width; elbow.CalculateAngle(); solids.Add(elbow); } else if (TEE_CONNS == n.Connections.Count) { Solid.Tee tee = new Solid.Tee(); tee.Position = n.Position; tee.MainBranchPosition = GetMainTeePos(n.Position, n.Connections[0].ConnectedPos(n.Position), n.Connections[1].ConnectedPos(n.Position), n.Connections[2].ConnectedPos(n.Position)); tee.BranchPosition = GetBranchTeePos(n.Position, n.Connections[0].ConnectedPos(n.Position), n.Connections[1].ConnectedPos(n.Position), n.Connections[2].ConnectedPos(n.Position)); tee.Profile = CalculateProfile(n.Position); tee.Radius = width; solids.Add(tee); } else if (CROSSING_CONNS == n.Connections.Count) { Solid.Crossing crossing = new Solid.Crossing(); crossing.Position = n.Position; crossing.MainBranchPosition = GetMainTeePos(n.Position, n.Connections[0].ConnectedPos(n.Position), n.Connections[1].ConnectedPos(n.Position), n.Connections[2].ConnectedPos(n.Position)); crossing.BranchPosition = GetBranchTeePos(n.Position, n.Connections[0].ConnectedPos(n.Position), n.Connections[1].ConnectedPos(n.Position), n.Connections[2].ConnectedPos(n.Position)); crossing.Profile = CalculateProfile(n.Position); crossing.Radius = width; solids.Add(crossing); } } }