Пример #1
0
    public Vector3 FaceCenterDirection(GeoFace face)
    {
        Vector3 v = FaceCenter(face);

        v = v - center;
        return(v.normalized);
    }
Пример #2
0
    public void ClickSpreadFace(GeoFace face)
    {
        int color = face.color == 0 ? 1 : 0;

        geometry.SetSpreadFaceStyle(face, color);
        geometryBehaviour.GeometryElementColorChange(face, color);
    }
Пример #3
0
    private void RemoveFace(GeoFace geoFace)
    {
        FaceBehaviour faceBehaviour = faceMap[geoFace];

        Destroy(faceBehaviour.gameObject);
        faceMap.Remove(geoFace);
    }
Пример #4
0
    public void SetFace(GeoFace face)
    {
        element = face;

        ButtonBoard buttonBoard = InitRootButtonBoard();


        List <ButtonAtRoot> buttonAtRoot = new List <ButtonAtRoot>();

        buttonAtRoot.Add(ColorButton);
        buttonAtRoot.Add(StyleButton);
        buttonAtRoot.Add(DisplayButton);
        buttonAtRoot.Add(SignButton);

        if (!face.isBased)
        {
            buttonAtRoot.Add(DeleteButton);
        }

        buttonBoard.CountOfButtons = () => buttonAtRoot.Count;
        buttonBoard.ButtonAtIndex  = (button, i) => buttonAtRoot[i](button);
        buttonBoard.InitButtons();

        overlay.SetActive(true);
    }
Пример #5
0
    public void Init(GeoFace geoFace)
    {
        geoController = GameObject.Find("/GeoController").GetComponent <GeoController>();

        this.geoFace = geoFace;

        mesh         = new Mesh();
        colliderMesh = new Mesh();

        MeshFilter meshFilter = gameObject.AddComponent <MeshFilter>();

        meshRenderer            = gameObject.AddComponent <MeshRenderer>();
        meshCollider            = gameObject.AddComponent <MeshCollider>();
        meshFilter.sharedMesh   = mesh;
        meshCollider.sharedMesh = colliderMesh;

        meshRenderer.sharedMaterial = ConfigManager.FaceStyle[0].Material;

        SetColorIndex(0);
        SetStyleIndex(0);

        StyleManager.OnStyleChange += () =>
        {
            SetColorIndex(0);
            SetStyleIndex(0);
        };

        visiable     = true;
        interactable = true;
    }
Пример #6
0
        private Material GetMaterial(GeoFace geoFace, Vtf vtf, int textureGroup)
        {
            if (geoFace.TextureName != null)
            {
                string textureName = Path.GetFileNameWithoutExtension(geoFace.TextureName);
                if (vtf != null && textureName[0] == 'V')
                {
                    if (textureName.EndsWithFast("BO DY"))
                    {
                        textureName = vtf.Maps[12];
                    }
                    else
                    {
                        string key = textureName.Substring(1).Replace(" ", "").Replace("LF", "LT") + ".TMT";

                        if (vtf.Tmts.TryGetValue(key, out Tmt tmt))
                        {
                            textureName = tmt.TextureNames[textureGroup];
                        }
                    }
                }
                return(GetTextureMaterial(textureName, geoFace.SurfaceFlags2 == 5 || geoFace.SurfaceFlags2 == 7));
            }
            return(GetColorMaterial("color" + geoFace.Color, geoFace.Color));
        }
Пример #7
0
    public override void InitWithGeometry(Geometry geometry)
    {
        int count = face.ids.Length;

        VertexUnit[] faceUnits = new VertexUnit[count];
        for (int i = 0; i < count; i++)
        {
            faceUnits[i] = geometry.VertexUnit(face.ids[i]);
        }

        units = new VertexUnit[] { };


        List <GeoElement> elementList = new List <GeoElement>();
        GeoFace           geoFace     = new GeoFace(faceUnits);

        elementList.Add(geoFace);

        for (int i = 0; i < count; i++)
        {
            int id1    = face.ids[i];
            int index2 = (i + 1) % count;
            int id2    = face.ids[index2];
            if (!geometry.IsEdge(id1, id2))
            {
                elementList.Add(new GeoEdge(faceUnits[i], faceUnits[index2]));
            }
        }

        elements = elementList.ToArray();


        dependencies.AddRange(faceUnits);
    }
Пример #8
0
        private Material GetMaterial(GeoFace geoFace, Vtf vtf)
        {
            if (geoFace.TextureName != null)
            {
                var textureName = geoFace.TextureName;
                if (vtf != null && geoFace.TextureName.StartsWith("V"))
                {
                    if (geoFace.TextureName.EndsWith("BO DY"))
                    {
                        textureName = vtf.Maps[12];
                    }
                    else
                    {
                        var key = geoFace.TextureName.Substring(1).Replace(" ", "").Replace("LF", "LT") + ".TMT";

                        if (vtf.Tmts.ContainsKey(key))
                        {
                            //Debug.Log("Vehicle tmt reference: " + geoFace.TextureName + " decoded: " + key);
                            var tmt = vtf.Tmts[key];
                            textureName = tmt.TextureNames[0];
                        }
                    }
                }
                return(GetTextureMaterial(textureName, geoFace.SurfaceFlags2 == 5 || geoFace.SurfaceFlags2 == 7));
                //Debug.Log(geoFace.TextureName + "color=" + geoFace.Color + " flag1=" + geoFace.SurfaceFlags1 + " flag2=" + geoFace.SurfaceFlags2, mat);
            }
            return(GetColorMaterial("color" + geoFace.Color, geoFace.Color));
        }
Пример #9
0
    private void CircleMesh(Circle circle)
    {
        float   Radius   = circle.radius;
        int     segments = Segments;
        Vector3 vertice  = circle.Vertice;

        int vertices_count = Segments + 1;

        Vector3[] vertices = new Vector3[vertices_count];
        vertices[0] = vertice;
        float angledegree = 360.0f;
        float angleRad    = Mathf.Deg2Rad * angledegree;
        float angleCur    = angleRad;
        float angledelta  = angleRad / Segments;

        VertexSpace[] vertexs = new VertexSpace[vertices_count - 1];

        for (int i = 1; i < vertices_count; i++)
        {
            float cosA = Mathf.Cos(angleCur);
            float sinA = Mathf.Sin(angleCur);
            if (circle.direction == CircleDirection.X)
            {
                vertices[i] = new Vector3(vertice.x, vertice.y + Radius * cosA, vertice.z + Radius * sinA);
            }
            else if (circle.direction == CircleDirection.Y)
            {
                vertices[i] = new Vector3(vertice.x + Radius * cosA, vertice.y, vertice.z + Radius * sinA);
            }
            else if (circle.direction == CircleDirection.Z)
            {
                vertices[i] = new Vector3(vertice.x + Radius * cosA, vertice.y + Radius * sinA, vertice.z);
            }
            vertexs[i - 1] = new VertexSpace(vertices[i]);
            angleCur      -= angledelta;
        }

        VertexSpace v1;
        VertexSpace v2;
        GeoEdge     edge;

        for (int i = 1; i < vertices_count - 1; i++)
        {
            v1   = new VertexSpace(vertices[i]);
            v2   = new VertexSpace(vertices[i + 1]);
            edge = new GeoEdge(v1, v2, false);
            geometryBehaviour.AddElement(edge);
        }
        v1   = new VertexSpace(vertices[1]);
        v2   = new VertexSpace(vertices[vertices_count - 1]);
        edge = new GeoEdge(v1, v2, false);
        geometryBehaviour.AddElement(edge);

        if (circle.displayFace)
        {
            GeoFace geoFace = new GeoFace(vertexs, false, circle.faceType);
            geometryBehaviour.AddElement(geoFace);
        }
    }
Пример #10
0
    public override void Init()
    {
        base.Init();

        Name = "Triangular Pyramid";
        Type = GeometryType.TriPyd;

        float   sqrt3      = Mathf.Sqrt(3);
        Vector3 faceNormal = Vector3.up;

        VertexFace  u0 = new VertexFace(-1, 0, -sqrt3 / 3, faceNormal);
        VertexFace  u1 = new VertexFace(1, 0, -sqrt3 / 3, faceNormal);
        VertexFace  u2 = new VertexFace(0, 0, sqrt3 * 2 / 3, faceNormal);
        VertexSpace u3 = new VertexSpace(0, sqrt3, 0);

        AddBaseVertex(u0);
        AddBaseVertex(u1);
        AddBaseVertex(u2);
        AddBaseVertex(u3);

        GeoVertex v0 = new GeoVertex(u0, true);
        GeoVertex v1 = new GeoVertex(u1, true);
        GeoVertex v2 = new GeoVertex(u2, true);
        GeoVertex v3 = new GeoVertex(u3, true);

        AddGeoVertex(v0);
        AddGeoVertex(v1);
        AddGeoVertex(v2);
        AddGeoVertex(v3);

        GeoEdge e0 = new GeoEdge(u0, u1, true);
        GeoEdge e1 = new GeoEdge(u0, u2, true);
        GeoEdge e2 = new GeoEdge(u1, u2, true);
        GeoEdge e3 = new GeoEdge(u0, u3, true);
        GeoEdge e4 = new GeoEdge(u1, u3, true);
        GeoEdge e5 = new GeoEdge(u2, u3, true);

        AddGeoEdge(e0);
        AddGeoEdge(e1);
        AddGeoEdge(e2);
        AddGeoEdge(e3);
        AddGeoEdge(e4);
        AddGeoEdge(e5);


        GeoFace f0 = new GeoFace(new VertexUnit[] { u0, u1, u2 }, true);
        GeoFace f1 = new GeoFace(new VertexUnit[] { u1, u0, u3 }, true);
        GeoFace f2 = new GeoFace(new VertexUnit[] { u0, u2, u3 }, true);
        GeoFace f3 = new GeoFace(new VertexUnit[] { u2, u1, u3 }, true);

        AddGeoFace(f0);
        AddGeoFace(f1);
        AddGeoFace(f2);
        AddGeoFace(f3);

        InitDatas();
    }
Пример #11
0
    public DeleteFaceOperation(GeoController geoController, Geometry geometry, GeoFace geoFace)
    {
        CanRotateCamera  = true;
        CanActiveElement = false;

        this.geoController = geoController;
        this.geometry      = geometry;
        this.geoFace       = geoFace;
    }
Пример #12
0
    public void SetRectangle(Vector3[] positions)
    {
        if (positions.Length != 4)
        {
            return;
        }
        Vector3 faceNormal = Vector3.right;

        VertexResolvedBody u0 = new VertexResolvedBody(positions[0].x, positions[0].y, positions[0].z, faceNormal);
        // u0.isFixed = true;
        VertexResolvedBody u1 = new VertexResolvedBody(positions[1].x, positions[1].y, positions[1].z, faceNormal);
        // u1.isFixed = true;
        VertexResolvedBody u2 = new VertexResolvedBody(positions[2].x, positions[2].y, positions[2].z, faceNormal);
        // u2.isFixed = true;
        VertexResolvedBody u3 = new VertexResolvedBody(positions[3].x, positions[3].y, positions[3].z, faceNormal);

        // u3.isFixed = true;
        AddBaseVertex(u0);
        AddBaseVertex(u1);
        AddBaseVertex(u2);
        AddBaseVertex(u3);
        vertexResolvedBodies = new VertexResolvedBody[] { u0, u1, u2, u3 };

        GeoVertex v0 = new GeoVertex(u0, true);
        GeoVertex v1 = new GeoVertex(u1, true);
        GeoVertex v2 = new GeoVertex(u2, true);
        GeoVertex v3 = new GeoVertex(u3, true);

        AddGeoVertex(v0);
        AddGeoVertex(v1);
        AddGeoVertex(v2);
        AddGeoVertex(v3);

        GeoEdge e0 = new GeoEdge(u0, u1, true);
        GeoEdge e1 = new GeoEdge(u1, u2, true);
        GeoEdge e2 = new GeoEdge(u2, u3, true);
        GeoEdge e3 = new GeoEdge(u0, u3, true);

        AddGeoEdge(e0);
        AddGeoEdge(e1);
        AddGeoEdge(e2);
        AddGeoEdge(e3);

        GeoFace f0 = new GeoFace(new VertexUnit[] { u0, u1, u2, u3 }, true);

        AddGeoFace(f0);

        InitDatas();

        NavAxisBehaviour axis = GameObject.Find("X").GetComponent <NavAxisBehaviour>();
        PointerEventData data = new PointerEventData(EventSystem.current);

        axis.OnPointerClick(data);

        shapeSetted = true;
    }
Пример #13
0
 public void ClickFace(GeoFace face)
 {
     if (currentOperation == null)
     {
         EditFaceOperation(face);
     }
     else
     {
         currentOperation.OnClickElement(face);
     }
 }
Пример #14
0
    public void DeleteFaceOperation(GeoFace geoFace)
    {
        if (state != GeoState.Normal)
        {
            return;
        }
        SetState(GeoState.EditFace);

        currentOperation = new DeleteFaceOperation(this, geometry, geoFace);
        currentOperation.Start();
    }
Пример #15
0
    public void EditFaceOperation(GeoFace geoFace)
    {
        if (state != GeoState.Normal)
        {
            return;
        }
        SetState(GeoState.EditFace);

        currentOperation = new EditFaceOperation(this, geoCamera, geometry, geometryBehaviour, geoUI, geoFace);
        currentOperation.Start();
    }
Пример #16
0
    private void SpreadCone()
    {
        float Radius    = circular.radius1;
        float height    = circular.Vertices[0].y - circular.Vertices[1].y;
        float width     = circular.Vertices[2].z - circular.Vertices[1].z;
        float fanRadius = Mathf.Sqrt(height * height + width * width);

        positionZ = fanRadius / 2;
        geoCamera.TriggerMoveZAnimation(270, 0, positionZ);

        VertexSpace u0             = new VertexSpace(circular.Vertices[0]);
        VertexSpace u1             = new VertexSpace(circular.Vertices[2]);
        VertexSpace u2             = new VertexSpace(circular.Vertices[1]);
        int         segments       = 60;
        float       angleRad       = Mathf.Deg2Rad * (360 * Radius / fanRadius);
        float       angleCur       = Mathf.Deg2Rad * (180 - Mathf.Acos(height / fanRadius) * 180 / Mathf.PI - 360 * Radius / fanRadius);
        float       angledelta     = angleRad / segments;
        int         vertices_count = segments + 1;
        VertexSpace v1;
        VertexSpace v2;
        GeoFace     f;

        Vector3[] vertices = new Vector3[vertices_count];
        for (int i = 0; i < vertices_count; i++)
        {
            float cosA = Mathf.Cos(angleCur);
            float sinA = Mathf.Sin(angleCur);
            vertices[i] = new Vector3(u0.Position().x + 0, u0.Position().y + fanRadius * cosA, u0.Position().x + fanRadius * sinA);
            angleCur   += angledelta;
        }
        VertexSpace[] vertexs = new VertexSpace[vertices_count + 1];
        vertexs[0] = u0;
        for (int i = 0; i < vertices_count - 1; i++)
        {
            v1             = new VertexSpace(vertices[i]);
            v2             = new VertexSpace(vertices[i + 1]);
            vertexs[i + 1] = v1;
            vertexs[i + 2] = v2;
            geometryBehaviour.AddElement(new GeoEdge(v1, v2, false));
        }
        f = new GeoFace(vertexs, false, FaceType.SpreadFan);
        geometryBehaviour.AddElement(f);
        GeoEdge e1 = new GeoEdge(u0, new VertexSpace(vertices[0]), false);
        GeoEdge e2 = new GeoEdge(u0, new VertexSpace(vertices[vertices_count - 1]), false);

        geometryBehaviour.AddElement(e1);
        geometryBehaviour.AddElement(e2);


        VertexSpace u3 = new VertexSpace(0, circular.Vertices[0].y, fanRadius + Radius);
        GeoCircle   c2 = new GeoCircle(u3, Radius, CircleDirection.X, true, FaceType.SpreadConeCircle);

        geometryBehaviour.AddElement(c2);
    }
Пример #17
0
    private Vector3 FaceNormal(GeoFace geoFace)
    {
        int     id1  = geoFace.Ids[0];
        int     id2  = geoFace.Ids[1];
        int     id3  = geoFace.Ids[2];
        Vector3 dir1 = UnitVector(id1) - UnitVector(id2);
        Vector3 dir2 = UnitVector(id1) - UnitVector(id3);

        Vector3 normal = Vector3.Cross(dir1, dir2).normalized;

        return(normal);
    }
Пример #18
0
    public Vector3 FaceCenter(GeoFace face)
    {
        Vector3 total = Vector3.zero;

        int[] ids = face.Ids;

        foreach (int id in ids)
        {
            total += UnitVector(id);
        }

        return(total / ids.Length);
    }
Пример #19
0
    public EditFaceOperation(GeoController geoController, GeoCamera geoCamera, Geometry geometry, GeometryBehaviour geometryBehaviour, GeoUI geoUI, GeoFace geoFace)
    {
        CanRotateCamera  = false;
        CanActiveElement = false;

        this.geoController     = geoController;
        this.geoCamera         = geoCamera;
        this.geometry          = geometry;
        this.geometryBehaviour = geometryBehaviour;
        this.activePanel       = geoUI.activePanel;
        this.elementPanel      = geoUI.elementPanel;
        this.geoFace           = geoFace;
    }
Пример #20
0
    private void AddFace(GeoFace geoFace)
    {
        GameObject planeObject = new GameObject(geoFace.ToString());

        planeObject.transform.SetParent(faceWrapper.transform);

        FaceBehaviour faceBehaviour = planeObject.AddComponent <FaceBehaviour>();

        faceBehaviour.Init(geoFace);

        faceBehaviour.SetData(geometry.Face(geoFace));

        faceMap.Add(geoFace, faceBehaviour);
        elementMap.Add(geoFace, faceBehaviour);
    }
Пример #21
0
    public FormElement FaceForm(GeoFace face)
    {
        int count = face.Ids.Length;

        string[] signs = new string[count];

        for (int i = 0; i < count; i++)
        {
            signs[i] = geometry.VertexSign(face.Ids[i]);
        }

        FormElement formElement = new FormElement(count, signs);

        return(formElement);
    }
Пример #22
0
    public void HoverFace(GeoFace face, bool isHover)
    {
        if (isCameraRotate)
        {
            return;
        }
        if (currentOperation != null && !currentOperation.CanActiveElement)
        {
            return;
        }
        if (isHover && face.faceType == FaceType.Normal)
        {
            FormElement formElement = FaceForm(face);
            geoUI.activePanel.SetFace(formElement);
        }
        else
        {
            geoUI.activePanel.Clear();
        }

        geometryBehaviour.HighlightFace(face, isHover);
    }
Пример #23
0
    private void SpreadCylinder()
    {
        float Radius = circular.radius1;
        float height = circular.Vertices[0].y - circular.Vertices[1].y;
        float width  = 2 * Mathf.PI * Radius;

        positionZ = width / 2;
        geoCamera.TriggerMoveZAnimation(270, 0, positionZ);

        VertexSpace u0 = new VertexSpace(0, height / 2, Radius);
        VertexSpace u1 = new VertexSpace(0, -height / 2, Radius);
        VertexSpace u2 = new VertexSpace(0, -height / 2, Radius + width);
        VertexSpace u3 = new VertexSpace(0, height / 2, Radius + width);

        GeoEdge e0 = new GeoEdge(u0, u1, false);
        GeoEdge e1 = new GeoEdge(u1, u2, false);
        GeoEdge e2 = new GeoEdge(u2, u3, false);
        GeoEdge e3 = new GeoEdge(u0, u3, false);

        geometryBehaviour.AddElement(e0);
        geometryBehaviour.AddElement(e1);
        geometryBehaviour.AddElement(e2);
        geometryBehaviour.AddElement(e3);

        GeoFace f = new GeoFace(new VertexSpace[] { u0, u1, u2, u3 }, false, FaceType.SpreadRectangle);

        geometryBehaviour.AddElement(f);

        VertexSpace u4 = new VertexSpace(0, height / 2 + Radius, width / 2 + Radius);
        GeoCircle   c1 = new GeoCircle(u4, Radius, CircleDirection.X, true, FaceType.SpreadCylinderCircle);

        geometryBehaviour.AddElement(c1);
        VertexSpace u5 = new VertexSpace(0, -height / 2 - Radius, width / 2 + Radius);
        GeoCircle   c2 = new GeoCircle(u5, Radius, CircleDirection.X, true, FaceType.SpreadCylinderCircle);

        geometryBehaviour.AddElement(c2);
    }
Пример #24
0
 public void ChangeFaceColorIndex(GeoFace geoface, int colorindex)
 {
     geometry.SetElementColor(geoface, colorindex);
     geometryBehaviour.GeometryElementColorChange(geoface, colorindex);
 }
Пример #25
0
 public void AddGeoFace(GeoFace face)
 {
     geoFaces.Add(face);
     face.AddObserveElements();
 }
Пример #26
0
 public void RemoveGeoFace(GeoFace face)
 {
     geoFaces.Remove(face);
     face.RemoveObserveElements();
 }
Пример #27
0
 public void HighlightFace(GeoFace geoFace, bool highlight)
 {
     faceMap[geoFace].SetHighlight(highlight);
 }
Пример #28
0
 public Face Face(GeoFace face)
 {
     return(face.Face());
 }
Пример #29
0
    private void UpdateFace(GeoFace geoFace)
    {
        FaceBehaviour faceBehaviour = faceMap[geoFace];

        faceBehaviour.SetData(geometry.Face(geoFace));
    }
Пример #30
0
    private void AddState(Auxiliary auxiliary, FormInput form)
    {
        Type type = Type.GetType(tool.Name + "AuxiliaryState");

        if (type != null)
        {
            AuxiliaryState auxiliaryState = (AuxiliaryState)Activator.CreateInstance(type, tool, auxiliary, geometry);
            auxiliaryState.OnClickDelete = () => geoController.RemoveAuxiliaryOperation(auxiliary);

            //state单击
            auxiliaryState.DoubleClick = () => this.TurnToFront(auxiliary, form);

            //Action OnElementHighLight  0925 Requirement_1
            auxiliaryState.OnElementHighlight = () =>
            {
                //Hightlight face
                ChangeFaceColorIndex((GeoFace)auxiliary.elements[0], 1);

                //Hide coordinate
                geoUI.navPanel.OnCoordinateButtonClick(1);
                geoUI.navPanel.SetCoordinateButtonStatus(1); //Change Button status

                //Hide grid
                geoUI.navPanel.OnGridButtonClick(1);
                geoUI.navPanel.SetGridButtonStatus(1);


                //Measure Line length
                if (auxiliary.elements[0] is GeoFace)
                {
                    GeoFace geoFace = (GeoFace)auxiliary.elements[0];
                    for (int i = 0; i < geoFace.Ids.Length; i++)
                    {
                        int vertex1 = i;
                        int vertex2 = (i + 1) % geoFace.Ids.Length;

                        Measure measure = new LineLengthMeasure(geoFace.Ids[vertex1], geoFace.Ids[vertex2]);

                        measure_list.Add((Measure)measure);

                        measure.InitWithGeometry(geometry);
                        bool result = geometry.Implement.AddMeasure(measure);
                        if (result)
                        {
                            List <ToolGroup> toolGroups            = geoUI.toolPanel.ToolGroups();
                            Tool             lineLengthMeasureTool = toolGroups[3].Tools[0];
                            AddState_Measure(measure, lineLengthMeasureTool);

                            Gizmo[] gizmos = measure.gizmos;
                            if (gizmos != null)
                            {
                                foreach (Gizmo gizmo in gizmos)
                                {
                                    geometry.AddGizmo(gizmo);
                                    geometryBehaviour.AddGizmo(gizmo);
                                }
                            }
                        }
                        else
                        {
                            // TODO
                        }
                    }
                }
                //Measure CornerAngle
                if (auxiliary.elements[0] is GeoFace)
                {
                    GeoFace geoFace = (GeoFace)auxiliary.elements[0];
                    for (int i = 0; i < geoFace.Ids.Length; i++)
                    {
                        int vertex1 = i;
                        int vertex2 = (i + 1) % geoFace.Ids.Length;
                        int vertex3 = (i + 2) % geoFace.Ids.Length;

                        Measure measure = new CornerAngleMeasure(geoFace.Ids[vertex1], geoFace.Ids[vertex2], geoFace.Ids[vertex3]);

                        measure_list.Add((Measure)measure);

                        measure.InitWithGeometry(geometry);


                        bool result = geometry.Implement.AddMeasure(measure);

                        if (result)
                        {
                            List <ToolGroup> toolGroups             = geoUI.toolPanel.ToolGroups();
                            Tool             cornerAngleMeasureTool = toolGroups[3].Tools[1];
                            AddState_Measure(measure, cornerAngleMeasureTool);

                            Gizmo[] gizmos = measure.gizmos;
                            if (gizmos != null)
                            {
                                foreach (Gizmo gizmo in gizmos)
                                {
                                    geometry.AddGizmo(gizmo);
                                    geometryBehaviour.AddGizmo(gizmo);
                                }
                            }
                        }
                        else
                        {
                            // TODO
                        }
                    }
                }
                //Measure Plane Area
                if (auxiliary.elements[0] is GeoFace)
                {
                    GeoFace geoFace = (GeoFace)auxiliary.elements[0];
                    //Debug.Log(geoFace.Ids);
                    Measure measure = new PlaneAreaMeasure(geoFace.Ids);

                    measure_list.Add(measure);

                    measure.InitWithGeometry(geometry);


                    bool result = geometry.Implement.AddMeasure(measure);

                    if (result)
                    {
                        List <ToolGroup> toolGroups           = geoUI.toolPanel.ToolGroups();
                        Tool             planeAreaMeasureTool = toolGroups[3].Tools[2];
                        AddState_Measure(measure, planeAreaMeasureTool);

                        Gizmo[] gizmos = measure.gizmos;
                        if (gizmos != null)
                        {
                            foreach (Gizmo gizmo in gizmos)
                            {
                                geometry.AddGizmo(gizmo);
                                geometryBehaviour.AddGizmo(gizmo);
                            }
                        }
                    }
                    else
                    {
                        // TODO
                    }
                }

                // Hide elements beyond the Highlighted face
                GeoVertex[] geoVertices = geometry.GeoVertices();
                if (auxiliary.elements[0] is GeoFace)
                {
                    GeoFace      geoFace      = (GeoFace)auxiliary.elements[0];
                    VertexUnit[] faceVertices = geoFace.get_vertices();
                    Vector3      side1        = faceVertices[0].Position() - faceVertices[1].Position();
                    Vector3      side2        = faceVertices[2].Position() - faceVertices[1].Position();
                    Vector3      normalVector = Vector3.Cross(side1, side2);

                    if (normalVector.x < 0)
                    {
                        normalVector.x = -normalVector.x;
                        normalVector.y = -normalVector.y;
                        normalVector.z = -normalVector.z;
                    }
                    if (normalVector.x == 0)
                    {
                        if (normalVector.z < 0)
                        {
                            normalVector.y = -normalVector.y;
                            normalVector.z = -normalVector.z;
                        }
                    }

                    Vector3 anchor = faceVertices[1].Position() + normalVector * 2;

                    float     min   = 1000;
                    GeoEdge[] edges = geometry.GeoEdges();
                    foreach (VertexUnit vertexUnit in geoFace.get_vertices())
                    {
                        float face_vertex_distance = Vector3.Distance(vertexUnit.Position(), anchor);
                        if (face_vertex_distance < min)
                        {
                            min = face_vertex_distance;
                        }
                    }
                    foreach (GeoVertex geoVertex in geoVertices)
                    {
                        float distance = Vector3.Distance(geoVertex.VertexUnit().Position(), anchor);
                        if (distance < min)
                        {
                            //隐藏该顶点
                            ElementBehaviour vertexElementBehaviour = geometryBehaviour.elementMap[geoVertex];
                            vertexElementBehaviour.SetVisible(false);
                            elementBehaviour_list.Add(vertexElementBehaviour);
                            //隐藏该顶点起始的所有边
                            foreach (GeoEdge geoEdge in edges)
                            {
                                if (geoVertex.Id == geoEdge.Id1 || geoVertex.Id == geoEdge.Id2)
                                {
                                    ElementBehaviour edgeElementBehaviour = geometryBehaviour.elementMap[geoEdge];
                                    edgeElementBehaviour.SetVisible(false);
                                    elementBehaviour_list.Add(edgeElementBehaviour);
                                }
                            }
                        }
                    }
                }
            };

            auxiliaryState.UndoFaceHighlight = () =>
            {
                //Undo Hightlight face
                ChangeFaceColorIndex((GeoFace)auxiliary.elements[0], 0);


                //Undo Hide coordinate
                geoUI.navPanel.OnCoordinateButtonClick(0);
                geoUI.navPanel.SetCoordinateButtonStatus(0); //Change Button status

                //Hide grid
                geoUI.navPanel.OnGridButtonClick(0);
                geoUI.navPanel.SetGridButtonStatus(0);

                //Claer All Face_MeasureStates
                foreach (Measure measure in measure_list)
                {
                    geoController.RemoveMeasure(measure);
                }
                foreach (ElementBehaviour elementBehaviour in elementBehaviour_list)
                {
                    elementBehaviour.SetVisible(true);
                }
            };



            stateController.AddAuxiliaryState(auxiliaryState);
        }
    }