Пример #1
0
        public Model()
        {
            routers = new UndirectedGraph <Node, Connection>();
            solids  = new List <Solid.SolidEntity>();
            profile = new Solid.Profile();

            width  = 0.0;
            height = 0.0;
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
                }
            }
        }