Пример #1
0
        public void EnterFoldingMode(Vertex pickedVertex, Face nearestFace)
        {
            this.cloverController = CloverController.GetInstance();

            // 寻找同group面中拥有pickedVertex的面中最下面的那个面作为baseFace
            this.group = cloverController.FaceGroupLookupTable.GetGroup(nearestFace);
            if (this.group == null)
            {
                System.Windows.MessageBox.Show("找不到Groups");
                return;
            }
            this.pickedVertex = pickedVertex;
            this.baseFace = nearestFace;
            foreach (Face face in group.GetFaceList())
            {
                if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < baseFace.Layer)
                    baseFace = face;
            }

            // 将同Group的面分为在base面之上(含baseFace)和base面之下的两组
            foreach (Face face in group.GetFaceList())
            {
                if (face.Layer >= baseFace.Layer)
                    this.facesAboveBase.Add(face);
                else
                    this.facesBelowBase.Add(face);
            }

            // 保存pickedVertex的原始位置
            originPoint = new Point3D(pickedVertex.X, pickedVertex.Y, pickedVertex.Z);
        }
Пример #2
0
        public List<Face> EnterTuckingMode(Vertex pickedVertex, Face nearestFace)
        {
            this.cloverController = CloverController.GetInstance();
            //cloverController.ShadowSystem.CheckUndoTree();

            // 寻找同group面中拥有pickedVertex的面中最下面的那个面作为floorFace,最上面的那个面作为ceilingFace
            this.group = cloverController.FaceGroupLookupTable.GetGroup(nearestFace);
            this.pickedVertex = pickedVertex;
            this.floorFace = this.ceilingFace = nearestFace;

            // 是正向还是反向
            Vector3D currNormal = group.Normal * cloverController.RenderController.Entity.Transform.Value;
            Double judge = Vector3D.DotProduct(currNormal, new Vector3D(0, 0, 1));
            isPositive = judge < 0 ? false : true;

            if (isPositive)
            {
                foreach (Face face in group.GetFaceList())
                {
                    if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < floorFace.Layer)
                        floorFace = face;
                    if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer > ceilingFace.Layer)
                        ceilingFace = face;
                }
                // 将同Group的面分为在floor和ceiling之间和在floor和ceiling之外两组
                foreach (Face face in group.GetFaceList())
                {
                    if (face.Layer >= floorFace.Layer && face.Layer <= ceilingFace.Layer)
                        this.facesInHouse.Add(face);
                    else
                        this.facesNotInHouse.Add(face);
                }
            }
            else
            {
                foreach (Face face in group.GetFaceList())
                {
                    if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer > floorFace.Layer)
                        floorFace = face;
                    if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < ceilingFace.Layer)
                        ceilingFace = face;
                }
                // 将同Group的面分为在floor和ceiling之间和在floor和ceiling之外两组
                foreach (Face face in group.GetFaceList())
                {
                    if (face.Layer <= floorFace.Layer && face.Layer >= ceilingFace.Layer)
                        this.facesInHouse.Add(face);
                    else
                        this.facesNotInHouse.Add(face);
                }
            }

            // 保存pickedVertex的原始位置
            originPoint = new Point3D(pickedVertex.X, pickedVertex.Y, pickedVertex.Z);

            return facesInHouse;
        }
Пример #3
0
        public List<Face> EnterFoldingMode(Vertex pickedVertex, Face nearestFace)
        {
            this.cloverController = CloverController.GetInstance();
            //cloverController.ShadowSystem.CheckUndoTree();

            // 寻找同group面中拥有pickedVertex的面中最下面的那个面作为baseFace
            this.group = cloverController.FaceGroupLookupTable.GetGroup(nearestFace);
            this.pickedVertex = pickedVertex;
            this.baseFace = nearestFace;

            // 是正向还是反向
            Vector3D currNormal = group.Normal * cloverController.RenderController.Entity.Transform.Value;
            Double judge = Vector3D.DotProduct(currNormal, new Vector3D(0, 0, 1));
            isPositive = judge < 0 ? false : true;
            if (isPositive)
            {
                foreach (Face face in group.GetFaceList())
                {
                    if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer < baseFace.Layer)
                        baseFace = face;
                }
                // 将同Group的面分为在base面之上(含baseFace)和base面之下的两组
                foreach (Face face in group.GetFaceList())
                {
                    if (face.Layer >= baseFace.Layer)
                        this.facesAboveBase.Add(face);
                    else
                        this.facesBelowBase.Add(face);
                }
            }
            else
            {
                foreach (Face face in group.GetFaceList())
                {
                    if (CloverTreeHelper.IsVertexInFace(pickedVertex, face) && face.Layer > baseFace.Layer)
                        baseFace = face;
                }
                // 将同Group的面分为在base面之上(含baseFace)和base面之下的两组
                foreach (Face face in group.GetFaceList())
                {
                    if (face.Layer <= baseFace.Layer)
                        this.facesAboveBase.Add(face);
                    else
                        this.facesBelowBase.Add(face);
                }
            }

            // 保存pickedVertex的原始位置
            originPoint = new Point3D(pickedVertex.X, pickedVertex.Y, pickedVertex.Z);

            return facesAboveBase;
        }
Пример #4
0
        public void Initliaze( Face root )
        {
            this.root = root;
            root.UpdateVertices();

            facecellTree = new FacecellTree( root );
            this.controller = CloverController.GetInstance();
        }
Пример #5
0
        public static CloverController GetInstance()
        {
            if (instance == null)
            {
                Debug.Assert(window != null);
                instance = new CloverController(window);
            }

            return instance;
        }
Пример #6
0
 /// <summary>
 /// 初始化纸张
 /// </summary>
 /// <param name="width">纸张的宽</param>
 /// <param name="height">纸张的高</param>
 private void InitializePaper(Single width, Single height)
 {
     CloverController.InitializeInstance(this);
     cloverController = CloverController.GetInstance();
     cloverController.Initialize(width, height);
     if (foldingPaperViewport.Children.Contains(cloverController.Model))
         foldingPaperViewport.Children.Remove(cloverController.Model);
     foldingPaperViewport.Children.Add(cloverController.Model);
     cloverInterpreter.InitialzeInterpreter();
 }
Пример #7
0
        /// <summary>
        /// 两边对称的进行tuck in层的调整 
        /// </summary>
        public bool UpdateLayerInfoAfterTuckIn(Face _ceilingFace, Face _floorFace, Edge _currTuckLine, bool _isPositive)
        {
            cloverController = CloverController.GetInstance();
            Face cf = _ceilingFace.LeftChild;
            FaceGroup currGroup = cloverController.FaceGroupLookupTable.GetGroup(_ceilingFace.LeftChild);
            List<Face> facesContainsCeiling = currGroup.GetFaceList();
            List<Face> facesAboveCeiling = new List<Face>();

            // 找到当前正确的_ceilingFace和_floorFace.
            foreach (Face face in facesContainsCeiling)
            {
                if (face.Layer == _ceilingFace.Layer && CloverTreeHelper.IsEdgeCrossedFace(face, _currTuckLine))
                    _ceilingFace = face;
                if (face.Layer == _floorFace.Layer && CloverTreeHelper.IsEdgeCrossedFace(face, _currTuckLine))
                    _floorFace = face;
            }

            if (_isPositive)
            {
                foreach (Face face in facesContainsCeiling)
                {
                    if (face.Layer > _ceilingFace.Layer)
                        facesAboveCeiling.Add(face);
                }
            }
            else
            {
                foreach (Face face in facesContainsCeiling)
                {
                    if (face.Layer < _ceilingFace.Layer)
                        facesAboveCeiling.Add(face);
                }
            }

            // 修订_ceilingFace的层数到最高层, 且_ceilingFace的层数一定为奇数
            // 若_ceilingFace和_floorFace的层数相差超过一层,则不修改
            if (Math.Abs((_ceilingFace.Layer - _floorFace.Layer)) <= 1)
            {
                if (_isPositive)
                {
                    _ceilingFace.Layer += facesAboveCeiling.Count();
                    if (_ceilingFace.Layer % 2 == 0)
                        return false;
                }
                else
                {
                    _ceilingFace.Layer -= facesAboveCeiling.Count();
                    if (_ceilingFace.Layer % 2 != 0)
                        return false;
                }
            }

            // 先将所有高于_ceilingFace的面按照层进行排序
            facesAboveCeiling.Sort(new layerComparer());

            // 将TuckingIn的面进行层排列
            if (_isPositive)
            {
                for (int i = (facesAboveCeiling.Count() - 1), j = 1; i >= 0; i--, j++)
                    facesAboveCeiling[i].Layer = _floorFace.Layer + j;
            }
            else
            {
                for (int i = 0, j = 1; i < facesAboveCeiling.Count(); i++, j++)
                    facesAboveCeiling[i].Layer = _floorFace.Layer - j;
            }

            currGroup.SortFace();

            return true;
        }