Beispiel #1
0
        /// <summary>
        /// Tree->Screen Selection. If the viewport entities are selected, they get marked as selected straight away.
        /// To check we are considering the correct entities we use the Entity stored in the Tag property of the TreeView
        /// </summary>
        /// <returns>The selected item.</returns>
        /// <param name="tv">The TreeView control</param>
        /// <param name="vl">The ViewportLayout control</param>
        public static ViewportLayout.SelectedItem SynchTreeSelection(TreeView tv, ViewportLayout vl)
        {
            // Fill a stack of entities and blockreferences starting from the node tags.
            Stack <BlockReference> parents = new Stack <BlockReference>();

            TreeNode node   = tv.SelectedNode;
            Entity   entity = node.Tag as Entity;

            node = node.Parent;

            while (node != null)
            {
                var ent = node.Tag as Entity;
                if (ent != null)
                {
                    parents.Push((BlockReference)ent);
                }

                node = node.Parent;
            }

            tv.HideSelection = false;

            // The top most parent is the root Blockreference: must reverse the order, creating a new Stack
            var selItem = new ViewportLayout.SelectedItem(new Stack <BlockReference>(parents), entity);

            // Selects the item
            selItem.Select(vl, true);

            return(selItem);
        }
Beispiel #2
0
        /// <summary>
        /// Deletes the selected tree node and all the others nodes that are linked to the same entity instance.
        /// </summary>
        /// <param name="tv">The TreeView control</param>
        /// <param name="vl">The ViewportLayout control</param>
        public static void DeleteSelectedNode(TreeView tv, ViewportLayout vl)
        {
            Entity deletedEntity = tv.SelectedNode.Tag as Entity;

            DeleteNodes(deletedEntity, tv.Nodes);
            CleanCurrent(vl);
            tv.SelectedNode = null;
        }
Beispiel #3
0
        /// <summary>
        /// Clear selection for entities to avoid problems with the Tree->Screen selection
        /// </summary>
        /// <param name="vl">The ViewportLayout control</param>
        /// <param name="rootLevel">When true the CurrentBlockReference is set to null (Go back to the root level of the assembly)</param>
        public static void CleanCurrent(ViewportLayout vl, bool rootLevel = true)
        {
            vl.Entities.ClearSelection();

            if (rootLevel && vl.Entities.CurrentBlockReference != null)
            {
                vl.Entities.SetCurrent(null);
            }
        }
            public void Show(ViewportLayout eyeshot, int layer)
            {
                Joint j  = new Joint(o, 0.5, 1);
                Mesh  xx = Mesh.CreateArrow(o, x, 0.2, 5, 0.35, 1, 16, Mesh.natureType.Smooth, Mesh.edgeStyleType.Free);
                Mesh  yy = Mesh.CreateArrow(o, y, 0.2, 5, 0.35, 1, 16, Mesh.natureType.Smooth, Mesh.edgeStyleType.Free);
                Mesh  zz = Mesh.CreateArrow(o, z, 0.2, 5, 0.35, 1, 16, Mesh.natureType.Smooth, Mesh.edgeStyleType.Free);

                eyeshot.Entities.Add(j, layer, Color.Black);
                eyeshot.Entities.Add(xx, layer, Color.Red);
                eyeshot.Entities.Add(yy, layer, Color.Green);
                eyeshot.Entities.Add(zz, layer, Color.Blue);
                //eyeshot.Invalidate();
            }
Beispiel #5
0
        public static Entity getEntityFromIfcRepresentation(IfcRepresentation rep, ViewportLayout viewportLayout1, Transformation entityTrs = null)
        {
            List <Entity> entityList = new List <Entity>();

            if (viewportLayout1.Blocks.ContainsKey("Representation " + rep.Index.ToString()))
            {
                return(new IfcBlockReference("Representation " + rep.Index.ToString()));
            }

            foreach (IfcRepresentationItem item in rep.Items)
            {
                Entity entity = getEntityFromIfcRepresentationItem(item, viewportLayout1, entityTrs);

                if (entity != null)
                {
                    entityList.Add(entity);
                }
            }
            if (entityList.Count > 1)
            {
                Block b = new Block();

                foreach (Entity e in entityList)
                {
                    b.Entities.Add(e);
                }

                viewportLayout1.Blocks.Add("Representation " + rep.Index.ToString(), b);

                BlockReference br = new IfcBlockReference("Representation " + rep.Index.ToString());

                br.ColorMethod = colorMethodType.byParent;

                return(br);
                //return new IfcBlockReference("Representation " + rep.Index.ToString());
            }
            else if (entityList.Count == 0)
            {
                return(null);
            }

            return(entityList[0]);
        }
Beispiel #6
0
        public GameplayScreen(PlayRequest request)
        {
            mRequest           = request;
            TransitionOnTime   = TimeSpan.FromSeconds(1.5);
            TransitionOffTime  = TimeSpan.FromSeconds(0.5);
            mScene             = null;
            mViews             = new ObservableCollection <PlayerView>();
            mActorMan          = null;
            mScreenLayout      = ViewportLayout.Invalid;
            mDrawSegments      = new List <DrawSegment>();
            mViewContentLoader = null;
            mPauseAlpha        = 0.5f;
            mFrameCounter      = 0;
            mFrameRate         = 0;
            mFrameRateTimer    = new TimeSpan();

            mFrameTimes = new Queue <double>();
            for (int f = 0; f < 30; ++f)
            {
                mFrameTimes.Enqueue(160.0d);
            }

            mPrevFrameTime = -1.0d;
        }
Beispiel #7
0
        public GameplayScreen(PlayRequest request)
        {
            mRequest = request;
            TransitionOnTime = TimeSpan.FromSeconds(1.5);
            TransitionOffTime = TimeSpan.FromSeconds(0.5);
            mScene = null;
            mViews = new ObservableCollection<PlayerView>();
            mActorMan = null;
            mScreenLayout = ViewportLayout.Invalid;
            mDrawSegments = new List<DrawSegment>();
            mViewContentLoader = null;
            mPauseAlpha = 0.5f;
            mFrameCounter = 0;
            mFrameRate = 0;
            mFrameRateTimer = new TimeSpan();

            mFrameTimes = new Queue<double>();
            for (int f = 0; f < 30; ++f)
            {
                mFrameTimes.Enqueue(160.0d);
            }

            mPrevFrameTime = -1.0d;
        }
Beispiel #8
0
        public override void LoadContent()
        {
            mScene = new Scene();
            mActorMan = new ActorManager(mViews);
            GameResources.ActorManager = mActorMan;

            LevelManifest manifest;
            using (ContentManager manifestLoader = new ContentManager(SharedResources.Game.Services, "Content"))
            {
                manifest = manifestLoader.Load<LevelManifest>(mRequest.LevelName);
                manifestLoader.Unload();    // a LevelManifest does not use any Disposable resources, so this is ok.
            }

            // The IScreenHoncho tells this gameplay screen how to set up the PlayerViews and DrawSegments required to play this level
            IScreenHoncho screenHoncho = Activator.CreateInstance(Type.GetType(manifest.ScreenHonchoTypeName)) as IScreenHoncho;

            mViewContentLoader = new ContentManager(SharedResources.Game.Services, "Content");

            foreach (PlayerInfo player in GameResources.PlaySession.Players)
            {
                mViews.Add(PlayerViewFactory.Create(player,
                                                    mRequest.CharacterSelections[player.PlayerId],
                                                    screenHoncho,
                                                    mViewContentLoader));
            }

            // Determine screen layout and create DrawSegments
            if (screenHoncho.PlayersUseSeparateViewports)
            {
                switch (GameResources.PlaySession.LocalPlayers.Count)
                {
                    case 1:
                        mScreenLayout = ViewportLayout.FullScreen;
                        break;
                    case 2:
                        mScreenLayout = GameOptions.PreferHorizontalSplit ? ViewportLayout.HorizontalSplit : ViewportLayout.VerticalSplit;
                        break;
                    case 3:
                    case 4:
                        mScreenLayout = ViewportLayout.FourWaySplit;
                        break;
                    default:
                        throw new InvalidOperationException("Unsupported number of local players.");
                }

                foreach (int playerId in GameResources.PlaySession.LocalPlayers.Keys)
                {
                    HumanView playerView = mViews.Single(v => v.PlayerId == playerId) as HumanView;
                    ICameraProvider cameraPlayerView = playerView as ICameraProvider;
                    if (cameraPlayerView == null)
                        throw new LevelManifestException("When IScreenHoncho.PlayersUseSeparateViewports is true, HumanViews must implement the ICameraProvider interface.");
                    DrawSegment ds = new DrawSegment(mScene, cameraPlayerView.Camera);
                    mDrawSegments.Add(ds);
                    playerView.DrawSegment = ds;
                }
            }
            else
            {
                mScreenLayout = ViewportLayout.FullScreen;
                DrawSegment ds = new DrawSegment(mScene);
                mDrawSegments.Add(ds);
                foreach (int playerId in GameResources.PlaySession.LocalPlayers.Keys)
                {
                    HumanView playerView = mViews.Single(v => v.PlayerId == playerId) as HumanView;
                    playerView.DrawSegment = ds;
                }

            }

            // TODO: P3: Make sure all non-local players are connected
            mScene.Load();

            mActorMan.LoadContent(manifest);

            // TODO: P3: Make sure all remote clients have loaded their game.

            foreach (PlayerView view in mViews)
            {
                view.Load();
            }

            GameResources.LoadNewLevelDelegate = LoadNewLevel;

            SharedResources.Game.GraphicsDevice.DeviceLost += DeviceLostHandler;
            SharedResources.Game.GraphicsDevice.DeviceResetting += DeviceResettingHandler;
            SharedResources.Game.GraphicsDevice.DeviceReset += DeviceResetHandler;
        }
Beispiel #9
0
        public static Entity getEntityFromIfcProductRepresentation(IfcProductRepresentation prodRep, ViewportLayout viewportLayout1, Transformation entityTrs = null)
        {
            List <Entity> entityList = new List <Entity>();       //se uso solo body non mi serve lista ??

            foreach (IfcRepresentation iRep in prodRep.Representations)
            {
                if (iRep.RepresentationIdentifier.Equals("Body"))
                {
                    Entity entity = getEntityFromIfcRepresentation(iRep, viewportLayout1, entityTrs);

                    if (entity != null)
                    {
                        entityList.Add(entity);
                    }
                }
                else
                {
                    if (!debug.Contains("IfcRepresentation.RepresentationIdentifier not supported: " + iRep.RepresentationIdentifier))
                    {
                        debug += "IfcRepresentation.RepresentationIdentifier not supported: " + iRep.RepresentationIdentifier + "\n";
                    }
                }
            }

            if (entityList.Count > 1)
            {
                Block b = new Block();

                foreach (Entity e in entityList)
                {
                    b.Entities.Add(e);
                }

                viewportLayout1.Blocks.Add("ProductRepresentatio " + prodRep.Index.ToString(), b);

                return(new IfcBlockReference("ProductRepresentatio " + prodRep.Index.ToString()));
            }
            else if (entityList.Count == 0)
            {
                return(null);
            }

            return(entityList[0]);
        }
Beispiel #10
0
        private static Entity createOpenings(Entity eyeElement, IfcElement ifcElement, ViewportLayout viewportLayout1)
        {
            if (eyeElement is BlockReference)
            {
                BlockReference brElement = (BlockReference)eyeElement;

                Block blockElement;

                viewportLayout1.Blocks.TryGetValue(brElement.BlockName, out blockElement);

                for (int i = 0; i < blockElement.Entities.Count; i++)
                {
                    blockElement.Entities[i] = createOpenings(blockElement.Entities[i], ifcElement, viewportLayout1);
                }
                return(eyeElement);
            }
            else if (eyeElement is Mesh)
            {
                Mesh m = (Mesh)eyeElement;

                Mesh[] splittedMesh;

                splittedMesh = m.SplitDisjoint();

                if (splittedMesh.Length > 1)
                {
                    debug += "splittedMesh.length > 1\n";
                }

                foreach (IfcRelVoidsElement relVE in ifcElement.HasOpenings)
                {
                    Entity openingEntity = Conversion.getEntityFromIfcProductRepresentation(relVE.RelatedOpeningElement.Representation, viewportLayout1);

                    //viewportLayout1.Entities.Add((Entity)openingEntity.Clone(), 2);

                    if (openingEntity != null && (openingEntity is Mesh || openingEntity is Solid))  //gestire se openingEntity is BlockReference
                    {
                        Transformation opTrs = Conversion.getPlacementTransformtion(relVE.RelatedOpeningElement.Placement);

                        openingEntity.TransformBy(opTrs);

                        Solid openingSolid;

                        if (openingEntity is Mesh)
                        {
                            openingSolid = ((Mesh)openingEntity).ConvertToSolid();
                        }
                        else
                        {
                            openingSolid = (Solid)openingEntity;
                        }

                        for (int i = 0; i < splittedMesh.Length; i++)
                        {
                            //verificare collision? bound box?
                            Solid[] result;

                            Solid entitySolid = splittedMesh[i].ConvertToSolid();

                            //viewportLayout1.Entities.Add((Entity)openingSolid.Clone(), 1, Color.Green);

                            if (Utility.DoOverlap(entitySolid.BoxMin, entitySolid.BoxMax, openingSolid.BoxMin, openingSolid.BoxMax))
                            {
                                result = Solid.Difference(entitySolid, openingSolid, 0.001);

                                if (result != null)
                                {
                                    splittedMesh[i] = result[0].ConvertToMesh();

                                    break;
                                }
                                else
                                {
                                    WriteSTL ws = new WriteSTL(new Entity[] { entitySolid, openingSolid }, new Layer[] { new Layer("Default") }, new Dictionary <string, Block>(), @"c:\devdept\booleanError\" + count + " " + ifcElement.GlobalId + ".stl", 0.01, true);
                                    count++;
                                    ws.DoWork();
                                    debug += "Error in opening boolean operation\n";
                                }
                            }
                        }
                    }
                }
                if (splittedMesh.Length > 1)
                {
                    Block b = new Block();

                    foreach (Mesh mesh in splittedMesh)
                    {
                        b.Entities.Add(mesh);
                    }
                    viewportLayout1.Blocks.Add(ifcElement.GlobalId, b);

                    eyeElement = new IfcBlockReference(ifcElement.GlobalId);
                }
                else
                {
                    eyeElement = splittedMesh[0];
                }
            }
            else
            {
                Solid entitySolid = (Solid)eyeElement;

                foreach (IfcRelVoidsElement relVE in ifcElement.HasOpenings)
                {
                    Entity openingEntity = Conversion.getEntityFromIfcProductRepresentation(relVE.RelatedOpeningElement.Representation, viewportLayout1);

                    if (openingEntity != null && (openingEntity is Mesh || openingEntity is Solid))
                    {
                        Transformation opTrs = Conversion.getPlacementTransformtion(relVE.RelatedOpeningElement.Placement);

                        openingEntity.TransformBy(opTrs);

                        Solid openingSolid;

                        if (openingEntity is Mesh)
                        {
                            openingSolid = ((Mesh)openingEntity).ConvertToSolid();
                        }
                        else
                        {
                            openingSolid = (Solid)openingEntity;
                        }


                        Solid[] result;

                        //viewportLayout1.Entities.Add((Entity)openingSolid.Clone(), 1, Color.Green);

                        result = Solid.Difference(entitySolid, openingSolid, 0.001);

                        if (result != null)
                        {
                            entitySolid = result[0];
                        }
                        else
                        {
                            WriteSTL ws = new WriteSTL(new Entity[] { entitySolid, openingSolid }, new Layer[] { new Layer("Default") }, new Dictionary <string, Block>(), @"c:\devdept\booleanError\" + count + " " + ifcElement.GlobalId + ".stl", 0.01, true);
                            count++;
                            ws.DoWork();
                            debug += "Error in opening boolean operation\n";
                        }
                    }
                }
                eyeElement = entitySolid;
            }
            return(eyeElement);
        }
Beispiel #11
0
        private static ICurve getICurveFromIfcCurve(IfcCurve ifcCurve, ViewportLayout viewportLayout1 = null, Transformation entityTrs = null)
        {
            ICurve result = null;

            if (ifcCurve is IfcConic)
            {
                IfcConic ifcConic = (IfcConic)ifcCurve;

                Plane pln = getPlaneFromPosition((IfcPlacement)ifcConic.Position);

                if (ifcConic is IfcCircle)
                {
                    IfcCircle ifcCircle = (IfcCircle)ifcCurve;

                    Circle circle = new Circle(pln, ifcCircle.Radius);

                    result = circle;
                }
                else
                {
                    IfcEllipse ifcEllipse = (IfcEllipse)ifcConic;

                    Ellipse ellipse = new Ellipse(pln, pln.Origin, ifcEllipse.SemiAxis1, ifcEllipse.SemiAxis2);

                    result = ellipse;
                }
            }
            else if (ifcCurve is IfcPolyline)
            {
                IfcPolyline p = (IfcPolyline)ifcCurve;

                Point3D[] points = new Point3D[p.Points.Count];

                for (int i = 0; i < p.Points.Count; i++)
                {
                    points[i] = getPoint3DFromIfcCartesianPoint(p.Points[i]);
                }
                LinearPath lp = new LinearPath(points);

                result = lp;
            }
            else if (ifcCurve is IfcCompositeCurve)             // verificare sense e transition
            {
                IfcCompositeCurve cc = (IfcCompositeCurve)ifcCurve;

                result = new CompositeCurve();

                foreach (IfcCompositeCurveSegment ccSegment in cc.Segments)
                {
                    ICurve segment = getICurveFromIfcCurve(ccSegment.ParentCurve, viewportLayout1, entityTrs);

                    if (segment != null)
                    {
                        ((CompositeCurve)result).CurveList.Add(segment);
                    }
                    else
                    {
                        result = null;
                        break;
                    }
                }
            }
            else if (ifcCurve is IfcTrimmedCurve)
            {
                IfcTrimmedCurve tc = (IfcTrimmedCurve)ifcCurve;

                ICurve basisCurve = getICurveFromIfcCurve(tc.BasisCurve, viewportLayout1, entityTrs);

                if (basisCurve != null)
                {
                    ICurve trimCurve = null;

                    if (tc.MasterRepresentation == IfcTrimmingPreference.PARAMETER)
                    {
                        double startParam = tc.Trim1.IfcParameterValue * Math.PI / 180;
                        double endParam   = tc.Trim2.IfcParameterValue * Math.PI / 180;

                        if (tc.SenseAgreement)
                        {
                            if (startParam > endParam)
                            {
                                startParam = startParam - Math.PI * 2;
                            }

                            basisCurve.SubCurve(startParam, endParam, out trimCurve);
                        }
                        else
                        {
                            if (endParam > startParam)
                            {
                                endParam = endParam - Math.PI * 2;
                            }

                            basisCurve.SubCurve(endParam, startParam, out trimCurve);

                            trimCurve.Reverse();
                        }
                        result = trimCurve; //new CompositeCurve(trimCurve);
                    }
                    else if (tc.MasterRepresentation == IfcTrimmingPreference.CARTESIAN)
                    {
                        debug += "IfcTrimmed cartesianPoint not supported: \n";
                    }
                    else
                    {
                        debug += "IfcTrimmed not supported: \n";
                    }
                }
            }
            else
            {
                if (!debug.Contains("IfcCurve not supported: " + ifcCurve.KeyWord))
                {
                    debug += "IfcCurve not supported: " + ifcCurve.KeyWord + "\n";
                }
            }
            return(result);
        }
Beispiel #12
0
        public static Entity getEntityFromIfcRepresentationItem(IfcRepresentationItem reprItem, ViewportLayout viewportLayout1 = null, Transformation entityTrs = null)
        {
            Entity result = null;

            if (reprItem is IfcBooleanClippingResult)
            {
                IfcBooleanClippingResult bcr = (IfcBooleanClippingResult)reprItem;

                result = getSolidFromIfcBooleanClippingResult(bcr);
            }
            else if (reprItem is IfcCurve)
            {
                result = (Entity)getICurveFromIfcCurve((IfcCurve)reprItem, viewportLayout1, entityTrs);
            }
            else if (reprItem is IfcExtrudedAreaSolid)
            {
                IfcExtrudedAreaSolid extrAreaSolid = (IfcExtrudedAreaSolid)reprItem;

                // if (!viewportLayout1.Blocks.ContainsKey(extrAreaSolid.Index.ToString()))
                {
                    Plane pln = Conversion.getPlaneFromPosition(extrAreaSolid.Position);

                    Align3D align = new Align3D(Plane.XY, pln);

                    IfcDirection dir = extrAreaSolid.ExtrudedDirection;

                    Vector3D extDir = new Vector3D(dir.DirectionRatioX, dir.DirectionRatioY, dir.DirectionRatioZ);

                    //extDir.TransformBy(trs * align2);
                    extDir.TransformBy(align);

                    devDept.Eyeshot.Entities.Region region = getRegionFromIfcProfileDef(extrAreaSolid.SweptArea, viewportLayout1);

                    if (region != null)
                    {
                        //region.TransformBy(trs * align2);
                        region.TransformBy(align);

                        result = region.ExtrudeAsMesh(extDir * extrAreaSolid.Depth, 0.1, Mesh.natureType.Plain); // 0.1 tolerance must be computed according to object size

                        //viewportLayout1.Entities.Add(result, 1);
                        //Block b = new Block();
                        //b.Entities.Add(m);
                        //viewportLayout1.Blocks.Add(extrAreaSolid.Index.ToString(), b);
                    }
                }
                // BlockReference br = new IfcBlockReference(trs, extrAreaSolid.Index.ToString());
                // viewportLayout1.Entities.Add(br, 0, Color.Gray);
            }
            else if (reprItem is IfcFaceBasedSurfaceModel)
            {
                IfcFaceBasedSurfaceModel fbs = (IfcFaceBasedSurfaceModel)reprItem;

                result = new Mesh(0, 0, Mesh.natureType.Plain);

                foreach (IfcConnectedFaceSet cfs in fbs.FbsmFaces)
                {
                    Mesh global = new Mesh(0, 0, Mesh.natureType.Plain);

                    foreach (IfcFace face in cfs.CfsFaces)
                    {
                        Point3D[] outerPoints = null;

                        List <Point3D[]> innerPointsList = new List <Point3D[]>();

                        foreach (IfcFaceBound fb in face.Bounds)        // al massimo 2 ? profilo esterno e interno
                        {
                            // bool sense = ifb.mOrientation;

                            if (fb is IfcFaceOuterBound)
                            {
                                IfcFaceOuterBound ifob = (IfcFaceOuterBound)fb;

                                IfcPolyloop pl = (IfcPolyloop)fb.Bound;

                                List <Point3D> pLIst = new List <Point3D>();

                                for (int i = 0; i < pl.Polygon.Count; i++)
                                {
                                    Point3D p = getPoint3DFromIfcCartesianPoint(pl.Polygon[i]);

                                    if (!pLIst.Contains(p))                     // non copio punti uguali !!
                                    {
                                        pLIst.Add(p);
                                    }
                                }

                                outerPoints = pLIst.ToArray();

                                if (!outerPoints[0].Equals(outerPoints[outerPoints.Length - 1]))
                                {
                                    Array.Resize(ref outerPoints, outerPoints.Length + 1);

                                    outerPoints[outerPoints.Length - 1] = (Point3D)outerPoints[0].Clone();
                                }
                                Array.Reverse(outerPoints);
                            }
                            else
                            {
                                IfcFaceBound ifb = (IfcFaceBound)fb;

                                IfcPolyloop inPl = (IfcPolyloop)ifb.Bound;

                                List <Point3D> pLIst = new List <Point3D>();

                                for (int i = 0; i < inPl.Polygon.Count; i++)
                                {
                                    Point3D p = getPoint3DFromIfcCartesianPoint(inPl.Polygon[i]);

                                    if (!pLIst.Contains(p))                     // non copio punti uguali !!
                                    {
                                        pLIst.Add(p);
                                    }
                                }

                                Point3D[] innerPoints = pLIst.ToArray();

                                if (!innerPoints[0].Equals(innerPoints[innerPoints.Length - 1]))
                                {
                                    Array.Resize(ref innerPoints, innerPoints.Length + 1);

                                    innerPoints[innerPoints.Length - 1] = (Point3D)innerPoints[0].Clone();
                                }
                                Array.Reverse(innerPoints);

                                innerPointsList.Add(innerPoints);
                            }
                        }
                        if (outerPoints.Length > 3)
                        {
                            Mesh local;

                            List <LinearPath> boundLp = new List <LinearPath>();

                            boundLp.Add(new LinearPath(outerPoints));

                            foreach (Point3D[] innerPoints in innerPointsList)
                            {
                                boundLp.Add(new LinearPath(innerPoints));
                            }

                            local = new devDept.Eyeshot.Entities.Region(boundLp.ToArray()).ConvertToMesh(0, Mesh.natureType.Plain);

                            global.MergeWith(local, true); // fonde i vertici, sarebbe meglio farla una volta sola alla fine
                        }
                    }
                    ((Mesh)result).MergeWith(global, true);
                }
            }
            else if (reprItem is IfcFacetedBrep)  //controllare
            {
                IfcFacetedBrep facBrep = (IfcFacetedBrep)reprItem;

                IfcClosedShell cs = facBrep.Outer;

                Mesh global = new Mesh(0, 0, Mesh.natureType.Plain);

                foreach (IfcFace face in cs.CfsFaces)
                {
                    Point3D[] outerPoints = null;

                    List <Point3D[]> innerPointsList = new List <Point3D[]>();

                    foreach (IfcFaceBound fb in face.Bounds)
                    {
                        // bool sense = ifb.mOrientation;

                        if (fb is IfcFaceOuterBound)
                        {
                            IfcFaceOuterBound ifob = (IfcFaceOuterBound)fb;

                            IfcPolyloop pl = (IfcPolyloop)fb.Bound;

                            List <Point3D> pLIst = new List <Point3D>();

                            for (int i = 0; i < pl.Polygon.Count; i++)
                            {
                                Point3D p = getPoint3DFromIfcCartesianPoint(pl.Polygon[i]);

                                if (!pLIst.Contains(p))                     // non copio punti uguali !!
                                {
                                    pLIst.Add(p);
                                }
                            }

                            outerPoints = pLIst.ToArray();

                            if (!outerPoints[0].Equals(outerPoints[outerPoints.Length - 1]))
                            {
                                Array.Resize(ref outerPoints, outerPoints.Length + 1);

                                outerPoints[outerPoints.Length - 1] = (Point3D)outerPoints[0].Clone();
                            }
                            Array.Reverse(outerPoints);
                        }
                        else
                        {
                            IfcFaceBound ifb = (IfcFaceBound)fb;

                            IfcPolyloop inPl = (IfcPolyloop)ifb.Bound;

                            List <Point3D> pLIst = new List <Point3D>();

                            for (int i = 0; i < inPl.Polygon.Count; i++)
                            {
                                Point3D p = getPoint3DFromIfcCartesianPoint(inPl.Polygon[i]);

                                if (!pLIst.Contains(p))                     // non copio punti uguali !!
                                {
                                    pLIst.Add(p);
                                }
                            }

                            Point3D[] innerPoints = pLIst.ToArray();

                            if (!innerPoints[0].Equals(innerPoints[innerPoints.Length - 1]))
                            {
                                Array.Resize(ref innerPoints, innerPoints.Length + 1);

                                innerPoints[innerPoints.Length - 1] = (Point3D)innerPoints[0].Clone();
                            }
                            Array.Reverse(innerPoints);

                            innerPointsList.Add(innerPoints);
                        }
                    }
                    if (outerPoints.Length > 3)
                    {
                        Mesh local;

                        List <LinearPath> boundLp = new List <LinearPath>();

                        boundLp.Add(new LinearPath(outerPoints));

                        foreach (Point3D[] innerPoints in innerPointsList)
                        {
                            boundLp.Add(new LinearPath(innerPoints));
                        }
                        local = new devDept.Eyeshot.Entities.Region(boundLp.ToArray()).ConvertToMesh(0, Mesh.natureType.Plain);

                        global.MergeWith(local, true); // fonde i vertici, sarebbe meglio farla una volta sola alla fine
                    }
                }

                result = global;
            }
            //else if (repItem is IfcBoundingBox)
            //{
            //    IfcBoundingBox bBox = (IfcBoundingBox)iRep.Items[0];
            //    m = Mesh.CreateBox(bBox.XDim, bBox.YDim, bBox.ZDim);
            //    m.Translate(bBox.Corner.Coordinates.Item1, bBox.Corner.Coordinates.Item1, bBox.Corner.Coordinates.Item1);
            //}
            else if (reprItem is IfcMappedItem)
            {
                IfcMappedItem mapItem = (IfcMappedItem)reprItem;

                if (!viewportLayout1.Blocks.ContainsKey("MappingSource " + mapItem.MappingSource.Index.ToString()))
                {
                    IfcRepresentationMap reprMapSource = mapItem.MappingSource;

                    Entity mapSource = getEntityFromIfcRepresentation(reprMapSource.MappedRepresentation, viewportLayout1, entityTrs);

                    Block b = new Block();

                    if (mapSource != null)
                    {
                        Plane pln = getPlaneFromPosition((IfcPlacement)reprMapSource.MappingOrigin);

                        Align3D algn = new Align3D(Plane.XY, pln);

                        mapSource.TransformBy(algn);

                        b.Entities.Add(mapSource);
                    }

                    viewportLayout1.Blocks.Add("MappingSource " + mapItem.MappingSource.Index.ToString(), b);
                }

                IfcCartesianTransformationOperator3D iTrs = (IfcCartesianTransformationOperator3D)mapItem.MappingTarget;

                Point3D org = new Point3D(iTrs.LocalOrigin.Coordinates.Item1, iTrs.LocalOrigin.Coordinates.Item2, iTrs.LocalOrigin.Coordinates.Item3);

                Vector3D vectorX;

                if (iTrs.Axis1 != null)
                {
                    vectorX = new Vector3D(iTrs.Axis1.DirectionRatioX, iTrs.Axis1.DirectionRatioY, iTrs.Axis1.DirectionRatioZ);
                }
                else
                {
                    vectorX = new Vector3D(1, 0, 0);
                }
                vectorX = vectorX * iTrs.Scale;

                Vector3D vectorY;

                if (iTrs.Axis2 != null)
                {
                    vectorY = new Vector3D(iTrs.Axis2.DirectionRatioX, iTrs.Axis2.DirectionRatioY, iTrs.Axis2.DirectionRatioZ);
                }
                else
                {
                    vectorY = new Vector3D(0, 1, 0);
                }

                Vector3D vectorZ;

                if (iTrs.Axis1 != null)
                {
                    vectorZ = new Vector3D(iTrs.Axis3.DirectionRatioX, iTrs.Axis3.DirectionRatioY, iTrs.Axis3.DirectionRatioZ);
                }
                else
                {
                    vectorZ = new Vector3D(0, 0, 1);
                }

                if (iTrs is IfcCartesianTransformationOperator3DnonUniform)
                {
                    IfcCartesianTransformationOperator3DnonUniform nut = (IfcCartesianTransformationOperator3DnonUniform)iTrs;

                    vectorY = vectorY * nut.Scale2;

                    vectorZ = vectorZ * nut.Scale3;
                }


                Transformation targetTrs = new Transformation(org, vectorX, vectorY, vectorZ);

                result = new IfcBlockReference(targetTrs, "MappingSource " + mapItem.MappingSource.Index.ToString());
            }
            else if (reprItem is IfcShellBasedSurfaceModel)
            {
                IfcShellBasedSurfaceModel sbs = (IfcShellBasedSurfaceModel)reprItem;

                result = new Mesh(0, 0, Mesh.natureType.Plain);

                foreach (IfcShell cfs in sbs.SbsmBoundary)
                {
                    Mesh global = new Mesh(0, 0, Mesh.natureType.Plain);

                    foreach (IfcFace face in cfs.CfsFaces)
                    {
                        Point3D[] outerPoints = null;

                        List <Point3D[]> innerPointsList = new List <Point3D[]>();

                        foreach (IfcFaceBound fb in face.Bounds)        // al massimo 2 ? profilo esterno e interno
                        {
                            // bool sense = ifb.mOrientation;

                            if (fb is IfcFaceOuterBound)
                            {
                                IfcFaceOuterBound ifob = (IfcFaceOuterBound)fb;

                                IfcPolyloop pl = (IfcPolyloop)fb.Bound;

                                List <Point3D> pLIst = new List <Point3D>();

                                for (int i = 0; i < pl.Polygon.Count; i++)
                                {
                                    Point3D p = getPoint3DFromIfcCartesianPoint(pl.Polygon[i]);

                                    if (!pLIst.Contains(p))                     // non copio punti uguali !!
                                    {
                                        pLIst.Add(p);
                                    }
                                }

                                outerPoints = pLIst.ToArray();

                                if (!outerPoints[0].Equals(outerPoints[outerPoints.Length - 1]))
                                {
                                    Array.Resize(ref outerPoints, outerPoints.Length + 1);

                                    outerPoints[outerPoints.Length - 1] = (Point3D)outerPoints[0].Clone();
                                }
                                Array.Reverse(outerPoints);
                            }
                            else
                            {
                                IfcFaceBound ifb = (IfcFaceBound)fb;

                                IfcPolyloop inPl = (IfcPolyloop)ifb.Bound;

                                List <Point3D> pLIst = new List <Point3D>();

                                for (int i = 0; i < inPl.Polygon.Count; i++)
                                {
                                    Point3D p = getPoint3DFromIfcCartesianPoint(inPl.Polygon[i]);

                                    if (!pLIst.Contains(p))                     // non copio punti uguali !!
                                    {
                                        pLIst.Add(p);
                                    }
                                }

                                Point3D[] innerPoints = pLIst.ToArray();

                                if (!innerPoints[0].Equals(innerPoints[innerPoints.Length - 1]))
                                {
                                    Array.Resize(ref innerPoints, innerPoints.Length + 1);

                                    innerPoints[innerPoints.Length - 1] = (Point3D)innerPoints[0].Clone();
                                }
                                Array.Reverse(innerPoints);

                                innerPointsList.Add(innerPoints);
                            }
                        }
                        if (outerPoints.Length > 3)
                        {
                            Mesh local;

                            List <LinearPath> boundLp = new List <LinearPath>();

                            boundLp.Add(new LinearPath(outerPoints));

                            foreach (Point3D[] innerPoints in innerPointsList)
                            {
                                boundLp.Add(new LinearPath(innerPoints));
                            }

                            //devDept.Eyeshot.Entities.Region localRegion = new devDept.Eyeshot.Entities.Region(boundLp.ToArray());

                            //localRegion.TransformBy(entityTrs);

                            //viewportLayout1.Entities.Add(localRegion, 1);



                            local = new devDept.Eyeshot.Entities.Region(boundLp.ToArray()).ConvertToMesh(0, Mesh.natureType.Plain);



                            global.MergeWith(local, true); // fonde i vertici, sarebbe meglio farla una volta sola alla fine
                        }
                    }
                    ((Mesh)result).MergeWith(global, true);
                }
            }
            else
            {
                if (!debug.Contains("IfcRepresentationItem not supported: " + reprItem.KeyWord))
                {
                    debug += "IfcRepresentationItem not supported: " + reprItem.KeyWord + "\n";
                }
            }

            if (result != null)
            {
                Color color;
                if (tryGetColorFromIfcRepresentationItem(reprItem, out color))
                {
                    result.ColorMethod = colorMethodType.byEntity;

                    result.Color = color;
                }
                else
                {
                    result.ColorMethod = colorMethodType.byParent;
                }
            }

            return(result);
        }
Beispiel #13
0
        public ViewportLayout InitViewport()
        {
            var displayModeSettingsRendered1 = new DisplayModeSettingsRendered(true, edgeColorMethodType.EntityColor, Color.Black, 1F, 2F, silhouettesDrawingType.LastFrame, false, shadowType.Realistic, null, false, true, 0.3F, realisticShadowQualityType.High);
            var backgroundSettings1 = new BackgroundSettings(backgroundStyleType.LinearGradient, Color.WhiteSmoke, Color.White, Color.FromArgb(102, 163, 210), 0.75D, null);
            var camera1 = new Camera(new Point3D(0D, 0D, 0D), 100D, new Quaternion(0.12940952255126034D, 0.22414386804201339D, 0.4829629131445341D, 0.83651630373780794D), projectionType.Perspective, 50D, 8D);
            var toolBarButton1 = new ToolBarButton(null, "Zoom Window", "Zoom Window", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton2 = new ToolBarButton(null, "Zoom", "Zoom", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton3 = new ToolBarButton(null, "Pan", "Pan", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton4 = new ToolBarButton(null, "Rotate", "Rotate", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton5 = new ToolBarButton(null, "Zoom Fit", "Zoom Fit", ToolBarButtonStyle.PushButton, true);
            var toolBar1 = new devDept.Eyeshot.ToolBar(toolBarPositionType.HorizontalTopRight, 32, 3, 4, Color.FromArgb(255, 146, 0), true, new[] {
                toolBarButton1,
                toolBarButton2,
                toolBarButton3,
                toolBarButton4,
                toolBarButton5
            });
            var legend1 = new Legend(0D, 100D, "Title", "Subtitle", new Point(24, 24), new Size(10, 30), true, false, false, "{0:0.##}", System.Drawing.Color.Transparent, System.Drawing.Color.Black, System.Drawing.Color.Black, new System.Drawing.Font("Tahoma", 10F, FontStyle.Bold), new Font("Tahoma", 8.25F), new[] {
                Color.FromArgb(0, 0, 255),
                Color.FromArgb(0, 63,  255),
                Color.FromArgb(0, 127, 255),
                Color.FromArgb(0, 191, 255),
                Color.FromArgb(0, 255, 255),
                Color.FromArgb(0, 255, 191),
                Color.FromArgb(0, 255, 127),
                Color.FromArgb(0, 255, 63),
                Color.FromArgb(0, 255, 0),
                Color.FromArgb(63,  255, 0),
                Color.FromArgb(127, 255, 0),
                Color.FromArgb(191, 255, 0),
                Color.FromArgb(255, 255, 0),
                Color.FromArgb(255, 191, 0),
                Color.FromArgb(255, 127, 0),
                Color.FromArgb(255, 63,  0),
                Color.FromArgb(255, 0,   0)
            });

            var originSymbol1 = new OriginSymbol(2, originSymbolStyleType.CoordinateSystem, new Font("Tahoma", 8.25F), Color.Black, Color.Red, Color.Green, Color.Blue, "Origin", "X", "Y", "Z", true);
            var rotateSettings1 = new RotateSettings(new MouseButton(MouseButtons.Middle, ModifierKeys.None), 10D, true, 1D, rotationStyleType.Trackball, rotationCenterType.CursorLocation, new devDept.Geometry.Point3D(0D, 0D, 0D));
            var zoomSettings1 = new ZoomSettings(new MouseButton(MouseButtons.Middle, ModifierKeys.Shift), 25, true, zoomStyleType.AtCursorLocation, false, 1D, Color.DeepSkyBlue, perspectiveFitType.Accurate);
            var viewport1 = new Viewport(new Point(0, 0),
                new Size(100, 10000),
                backgroundSettings1,
                camera1,
                toolBar1,
                new[] {
                    legend1
                },
                displayType.Rendered, true, false, false, CreateGrid(10),
                originSymbol1, false, rotateSettings1, zoomSettings1,
                new PanSettings(new MouseButton(MouseButtons.Middle, ModifierKeys.Ctrl), 25, true));

            _viewportLayout = new SingleViewportLayout();
            _viewportLayout.Dock = DockStyle.Fill;
            _viewportLayout.Cursor = Cursors.Arrow;
            _viewportLayout.Name = "SingleViewPort";
            _viewportLayout.Rendered = displayModeSettingsRendered1;
            _viewportLayout.Size = new Size(431, 405);
            _viewportLayout.TabIndex = 0;
            _viewportLayout.Viewports.Add(viewport1);

            return _viewportLayout;
        }
Beispiel #14
0
        public ViewportLayout InitViewport()
        {
            var displayModeSettingsRendered1 = new DisplayModeSettingsRendered(true, edgeColorMethodType.EntityColor, Color.Black, 1F, 2F, silhouettesDrawingType.LastFrame, false, shadowType.Realistic, null, false, true, 0.3F, realisticShadowQualityType.High);
            var backgroundSettings1          = new BackgroundSettings(backgroundStyleType.LinearGradient, Color.WhiteSmoke, Color.White, Color.FromArgb(102, 163, 210), 0.75D, null);
            var camera1        = new Camera(new Point3D(0D, 0D, 0D), 100D, new Quaternion(0.12940952255126034D, 0.22414386804201339D, 0.4829629131445341D, 0.83651630373780794D), projectionType.Perspective, 50D, 8D);
            var toolBarButton1 = new ToolBarButton(null, "Zoom Window", "Zoom Window", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton2 = new ToolBarButton(null, "Zoom", "Zoom", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton3 = new ToolBarButton(null, "Pan", "Pan", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton4 = new ToolBarButton(null, "Rotate", "Rotate", ToolBarButtonStyle.ToggleButton, true);
            var toolBarButton5 = new ToolBarButton(null, "Zoom Fit", "Zoom Fit", ToolBarButtonStyle.PushButton, true);
            var toolBar1       = new devDept.Eyeshot.ToolBar(toolBarPositionType.HorizontalTopRight, 32, 3, 4, Color.FromArgb(255, 146, 0), true, new[] {
                toolBarButton1,
                toolBarButton2,
                toolBarButton3,
                toolBarButton4,
                toolBarButton5
            });
            var legend1 = new Legend(0D, 100D, "Title", "Subtitle", new Point(24, 24), new Size(10, 30), true, false, false, "{0:0.##}", System.Drawing.Color.Transparent, System.Drawing.Color.Black, System.Drawing.Color.Black, new System.Drawing.Font("Tahoma", 10F, FontStyle.Bold), new Font("Tahoma", 8.25F), new[] {
                Color.FromArgb(0, 0, 255),
                Color.FromArgb(0, 63, 255),
                Color.FromArgb(0, 127, 255),
                Color.FromArgb(0, 191, 255),
                Color.FromArgb(0, 255, 255),
                Color.FromArgb(0, 255, 191),
                Color.FromArgb(0, 255, 127),
                Color.FromArgb(0, 255, 63),
                Color.FromArgb(0, 255, 0),
                Color.FromArgb(63, 255, 0),
                Color.FromArgb(127, 255, 0),
                Color.FromArgb(191, 255, 0),
                Color.FromArgb(255, 255, 0),
                Color.FromArgb(255, 191, 0),
                Color.FromArgb(255, 127, 0),
                Color.FromArgb(255, 63, 0),
                Color.FromArgb(255, 0, 0)
            });

            var originSymbol1   = new OriginSymbol(2, originSymbolStyleType.CoordinateSystem, new Font("Tahoma", 8.25F), Color.Black, Color.Red, Color.Green, Color.Blue, "Origin", "X", "Y", "Z", true);
            var rotateSettings1 = new RotateSettings(new MouseButton(MouseButtons.Middle, ModifierKeys.None), 10D, true, 1D, rotationStyleType.Trackball, rotationCenterType.CursorLocation, new devDept.Geometry.Point3D(0D, 0D, 0D));
            var zoomSettings1   = new ZoomSettings(new MouseButton(MouseButtons.Middle, ModifierKeys.Shift), 25, true, zoomStyleType.AtCursorLocation, false, 1D, Color.DeepSkyBlue, perspectiveFitType.Accurate);
            var viewport1       = new Viewport(new Point(0, 0),
                                               new Size(100, 10000),
                                               backgroundSettings1,
                                               camera1,
                                               toolBar1,
                                               new[] {
                legend1
            },
                                               displayType.Rendered, true, false, false, CreateGrid(10),
                                               originSymbol1, false, rotateSettings1, zoomSettings1,
                                               new PanSettings(new MouseButton(MouseButtons.Middle, ModifierKeys.Ctrl), 25, true));

            _viewportLayout          = new SingleViewportLayout();
            _viewportLayout.Dock     = DockStyle.Fill;
            _viewportLayout.Cursor   = Cursors.Arrow;
            _viewportLayout.Name     = "SingleViewPort";
            _viewportLayout.Rendered = displayModeSettingsRendered1;
            _viewportLayout.Size     = new Size(431, 405);
            _viewportLayout.TabIndex = 0;
            _viewportLayout.Viewports.Add(viewport1);

            return(_viewportLayout);
        }
Beispiel #15
0
        public static Entity getEntityFromIfcElement(IfcElement ifcElement, ViewportLayout viewportLayout1)
        {
            Entity eyeElement = null;

            Transformation elementTrs = new Transformation(1);

            if (ifcElement.Placement != null)
            {
                elementTrs = Conversion.getPlacementTransformtion(ifcElement.Placement);
            }
            if (ifcElement.Representation != null)
            {
                eyeElement = Conversion.getEntityFromIfcProductRepresentation(ifcElement.Representation, viewportLayout1, elementTrs);
            }
            if (eyeElement != null)
            {
                eyeElement.TransformBy(elementTrs);
            }
            if (ifcElement.IsDecomposedBy.Count > 0)
            {
                Block b = new Block();

                foreach (IfcRelAggregates relAg in ifcElement.IsDecomposedBy)
                {
                    foreach (IfcElement el in relAg.RelatedObjects)
                    {
                        Entity entity = getEntityFromIfcElement(el, viewportLayout1);

                        if (entity != null)
                        {
                            b.Entities.Add(entity);
                        }
                    }
                }
                if (eyeElement != null)
                {
                    b.Entities.Add(eyeElement);
                }

                viewportLayout1.Blocks.Add(ifcElement.GlobalId, b);

                eyeElement = new IfcBlockReference(ifcElement.GlobalId);
            }
            if (eyeElement != null)
            {
                if (ifcElement.HasOpenings.Count > 0)
                {
                    eyeElement = createOpenings(eyeElement, ifcElement, viewportLayout1);
                }
                if (eyeElement is BlockReference)
                {
                    UtilityIfc.loadProperties((IfcBlockReference)eyeElement, ifcElement);
                }
                else
                {
                    IfcMesh ifcMesh;

                    Mesh eyeElementMesh;

                    if (eyeElement is Solid)
                    {
                        Solid eyeElementSolid = (Solid)eyeElement;

                        eyeElementMesh = eyeElementSolid.ConvertToMesh();
                    }
                    else
                    {
                        eyeElementMesh = (Mesh)eyeElement;
                    }
                    Color           color = eyeElementMesh.Color;
                    colorMethodType cmt   = eyeElementMesh.ColorMethod;

                    ifcMesh = new IfcMesh(eyeElementMesh.Vertices, eyeElementMesh.Triangles);

                    ifcMesh.Color       = color;
                    ifcMesh.ColorMethod = cmt;

                    UtilityIfc.loadProperties(ifcMesh, ifcElement);

                    eyeElement = ifcMesh;
                }
            }
            return(eyeElement);
        }
Beispiel #16
0
        private Viewport GetViewport(int viewportIndex, ViewportLayout mScreenLayout, Viewport baseViewport)
        {
            // viewportIndex:
            // +-----------+      +-----------+      +-----+-----+      +-----+-----+
            // |           |      |     0     |      |     |     |      |  0  |  1  |
            // |     0     |      +-----------+      |  0  |  1  |      +-----+-----+
            // |           |      |     1     |      |     |     |      |  2  |  3  |
            // +-----------+      +-----------+      +-----+-----+      +-----+-----+
            // FullScreen         HorizontalSplit    VerticalSplit      FourWaySplit

            if (mScreenLayout == ViewportLayout.FullScreen)
                return baseViewport;

            Viewport splitViewport = new Viewport(baseViewport.Bounds);
            switch (mScreenLayout)
            {
                case ViewportLayout.HorizontalSplit:
                    if (viewportIndex == 0)
                    {
                        splitViewport.Height /= 2;
                    }
                    else
                    {
                        splitViewport.Y = splitViewport.Height / 2;
                        splitViewport.Height = splitViewport.Height - splitViewport.Y;
                    }

                    break;
                case ViewportLayout.VerticalSplit:
                    if (viewportIndex == 0)
                    {
                        splitViewport.Width /= 2;
                    }
                    else
                    {
                        splitViewport.X = splitViewport.Width / 2;
                        splitViewport.Width = splitViewport.Width - splitViewport.X;
                    }

                    break;
                case ViewportLayout.FourWaySplit:
                    if (viewportIndex == 0 || viewportIndex == 1)
                    {
                        splitViewport.Height /= 2;
                    }
                    else
                    {
                        splitViewport.Y = splitViewport.Height / 2;
                        splitViewport.Height = splitViewport.Height - splitViewport.Y;
                    }

                    if (viewportIndex == 0 || viewportIndex == 2)
                    {
                        splitViewport.Width /= 2;
                    }
                    else
                    {
                        splitViewport.X = splitViewport.Width / 2;
                        splitViewport.Width = splitViewport.Width - splitViewport.X;
                    }

                    break;
                default:
                    throw new InvalidOperationException("Screen layout not defined.");
            }

            return splitViewport;
        }
Beispiel #17
0
        private Viewport GetViewport(int viewportIndex, ViewportLayout mScreenLayout, Viewport baseViewport)
        {
            // viewportIndex:
            // +-----------+      +-----------+      +-----+-----+      +-----+-----+
            // |           |      |     0     |      |     |     |      |  0  |  1  |
            // |     0     |      +-----------+      |  0  |  1  |      +-----+-----+
            // |           |      |     1     |      |     |     |      |  2  |  3  |
            // +-----------+      +-----------+      +-----+-----+      +-----+-----+
            // FullScreen         HorizontalSplit    VerticalSplit      FourWaySplit

            if (mScreenLayout == ViewportLayout.FullScreen)
            {
                return(baseViewport);
            }

            Viewport splitViewport = new Viewport(baseViewport.Bounds);

            switch (mScreenLayout)
            {
            case ViewportLayout.HorizontalSplit:
                if (viewportIndex == 0)
                {
                    splitViewport.Height /= 2;
                }
                else
                {
                    splitViewport.Y      = splitViewport.Height / 2;
                    splitViewport.Height = splitViewport.Height - splitViewport.Y;
                }

                break;

            case ViewportLayout.VerticalSplit:
                if (viewportIndex == 0)
                {
                    splitViewport.Width /= 2;
                }
                else
                {
                    splitViewport.X     = splitViewport.Width / 2;
                    splitViewport.Width = splitViewport.Width - splitViewport.X;
                }

                break;

            case ViewportLayout.FourWaySplit:
                if (viewportIndex == 0 || viewportIndex == 1)
                {
                    splitViewport.Height /= 2;
                }
                else
                {
                    splitViewport.Y      = splitViewport.Height / 2;
                    splitViewport.Height = splitViewport.Height - splitViewport.Y;
                }

                if (viewportIndex == 0 || viewportIndex == 2)
                {
                    splitViewport.Width /= 2;
                }
                else
                {
                    splitViewport.X     = splitViewport.Width / 2;
                    splitViewport.Width = splitViewport.Width - splitViewport.X;
                }

                break;

            default:
                throw new InvalidOperationException("Screen layout not defined.");
            }

            return(splitViewport);
        }
Beispiel #18
0
        public override void LoadContent()
        {
            mScene    = new Scene();
            mActorMan = new ActorManager(mViews);
            GameResources.ActorManager = mActorMan;

            LevelManifest manifest;

            using (ContentManager manifestLoader = new ContentManager(SharedResources.Game.Services, "Content"))
            {
                manifest = manifestLoader.Load <LevelManifest>(mRequest.LevelName);
                manifestLoader.Unload();    // a LevelManifest does not use any Disposable resources, so this is ok.
            }

            // The IScreenHoncho tells this gameplay screen how to set up the PlayerViews and DrawSegments required to play this level
            IScreenHoncho screenHoncho = Activator.CreateInstance(Type.GetType(manifest.ScreenHonchoTypeName)) as IScreenHoncho;

            mViewContentLoader = new ContentManager(SharedResources.Game.Services, "Content");

            foreach (PlayerInfo player in GameResources.PlaySession.Players)
            {
                mViews.Add(PlayerViewFactory.Create(player,
                                                    mRequest.CharacterSelections[player.PlayerId],
                                                    screenHoncho,
                                                    mViewContentLoader));
            }

            // Determine screen layout and create DrawSegments
            if (screenHoncho.PlayersUseSeparateViewports)
            {
                switch (GameResources.PlaySession.LocalPlayers.Count)
                {
                case 1:
                    mScreenLayout = ViewportLayout.FullScreen;
                    break;

                case 2:
                    mScreenLayout = GameOptions.PreferHorizontalSplit ? ViewportLayout.HorizontalSplit : ViewportLayout.VerticalSplit;
                    break;

                case 3:
                case 4:
                    mScreenLayout = ViewportLayout.FourWaySplit;
                    break;

                default:
                    throw new InvalidOperationException("Unsupported number of local players.");
                }

                foreach (int playerId in GameResources.PlaySession.LocalPlayers.Keys)
                {
                    HumanView       playerView       = mViews.Single(v => v.PlayerId == playerId) as HumanView;
                    ICameraProvider cameraPlayerView = playerView as ICameraProvider;
                    if (cameraPlayerView == null)
                    {
                        throw new LevelManifestException("When IScreenHoncho.PlayersUseSeparateViewports is true, HumanViews must implement the ICameraProvider interface.");
                    }
                    DrawSegment ds = new DrawSegment(mScene, cameraPlayerView.Camera);
                    mDrawSegments.Add(ds);
                    playerView.DrawSegment = ds;
                }
            }
            else
            {
                mScreenLayout = ViewportLayout.FullScreen;
                DrawSegment ds = new DrawSegment(mScene);
                mDrawSegments.Add(ds);
                foreach (int playerId in GameResources.PlaySession.LocalPlayers.Keys)
                {
                    HumanView playerView = mViews.Single(v => v.PlayerId == playerId) as HumanView;
                    playerView.DrawSegment = ds;
                }
            }

            // TODO: P3: Make sure all non-local players are connected
            mScene.Load();

            mActorMan.LoadContent(manifest);

            // TODO: P3: Make sure all remote clients have loaded their game.

            foreach (PlayerView view in mViews)
            {
                view.Load();
            }

            GameResources.LoadNewLevelDelegate = LoadNewLevel;

            SharedResources.Game.GraphicsDevice.DeviceLost      += DeviceLostHandler;
            SharedResources.Game.GraphicsDevice.DeviceResetting += DeviceResettingHandler;
            SharedResources.Game.GraphicsDevice.DeviceReset     += DeviceResetHandler;
        }
Beispiel #19
0
        public static devDept.Eyeshot.Entities.Region getRegionFromIfcProfileDef(IfcProfileDef ipd, ViewportLayout viewportLayout1)
        {
            devDept.Eyeshot.Entities.Region region = null;

            if (ipd is IfcCircleProfileDef)
            {
                IfcCircleProfileDef crProfDef = (IfcCircleProfileDef)ipd;

                region = new CircularRegion(crProfDef.Radius);
            }
            else if (ipd is IfcIShapeProfileDef) // IfcIShapeProfileDef and all derived from
            {
                IfcIShapeProfileDef shProfDef = (IfcIShapeProfileDef)ipd;
                double     halfWidth          = shProfDef.OverallWidth / 2;
                double     halfDepth          = shProfDef.OverallDepth / 2;
                LinearPath lp = new LinearPath(Plane.XY,
                                               new Point2D(-halfWidth, -halfDepth),
                                               new Point2D(halfWidth, -halfDepth),
                                               new Point2D(halfWidth, -halfDepth + shProfDef.FlangeThickness),
                                               new Point2D(shProfDef.WebThickness / 2, -halfDepth + shProfDef.FlangeThickness),
                                               new Point2D(shProfDef.WebThickness / 2, +halfDepth - shProfDef.FlangeThickness),
                                               new Point2D(halfWidth, +halfDepth - shProfDef.FlangeThickness),
                                               new Point2D(halfWidth, halfDepth),
                                               new Point2D(-halfWidth, halfDepth),
                                               new Point2D(-halfWidth, halfDepth - shProfDef.FlangeThickness),
                                               new Point2D(-shProfDef.WebThickness / 2, halfDepth - shProfDef.FlangeThickness),
                                               new Point2D(-shProfDef.WebThickness / 2, -halfDepth + shProfDef.FlangeThickness),
                                               new Point2D(-halfWidth, -halfDepth + shProfDef.FlangeThickness),
                                               new Point2D(-halfWidth, -halfDepth)
                                               );

                region = new devDept.Eyeshot.Entities.Region(lp);
            }
            else if (ipd is IfcRectangleProfileDef)
            {
                IfcRectangleProfileDef recProfDef = (IfcRectangleProfileDef)ipd;

                region = new RectangularRegion(recProfDef.XDim, recProfDef.YDim, true);
            }
            else if (ipd is IfcArbitraryClosedProfileDef)
            {
                IfcArbitraryClosedProfileDef arProfDef = (IfcArbitraryClosedProfileDef)ipd;

                ICurve cc = getICurveFromIfcCurve(arProfDef.OuterCurve);

                if (cc != null)
                {
                    //foreach(Entity xx in cc.CurveList)
                    //    viewportLayout1.Entities.Add((Entity)xx.Clone(), 1);

                    //viewportLayout1.Entities.Add((Entity)cc.Clone(), 2);

                    region = new devDept.Eyeshot.Entities.Region(cc);
                }
            }
            else
            {
                if (!debug.Contains("IfcProfileDef not supported: " + ipd.KeyWord))
                {
                    debug += "IfcProfileDef not supported: " + ipd.KeyWord + "\n";
                }
            }
            if (ipd is IfcParameterizedProfileDef)
            {
                IfcParameterizedProfileDef parProfDef = (IfcParameterizedProfileDef)ipd;

                if (parProfDef.Position != null && region != null)
                {
                    Plane plane = getPlaneFromPosition(parProfDef.Position);

                    Align3D algn = new Align3D(Plane.XY, plane);

                    region.TransformBy(algn);

                    //region.Translate(parProfDef.Position.Location.Coordinates.Item1, parProfDef.Position.Location.Coordinates.Item2, parProfDef.Position.Location.Coordinates.Item3);
                }
            }
            return(region);
        }