Exemplo n.º 1
0
        // key: 頂点番号, value: key頂点を含む面のリスト
        private static V2FDict makeRefDict(IList <IPXFace> faces)
        {
            V2FDict ref_dict = new V2FDict();

            foreach (IPXFace face in faces)
            {
                int[] v_list = new int[3] {
                    v2i(face.Vertex1), v2i(face.Vertex2), v2i(face.Vertex3)
                };
                foreach (int v in v_list)
                {
                    if (!ref_dict.ContainsKey(v))
                    {
                        ref_dict[v] = new List <int[]>();
                    }
                    ref_dict[v].Add(v_list);
                }
            }

#if IGNORE_NEAR
            // 材質が持つ頂点のソート情報グローバル変数を更新
            int[] param = ref_dict.Keys.ToArray();
            Tuple <int[], Dictionary <int, int> > t = sortVertexList(param);
            sorted_v  = t.Item1;
            reverse_v = t.Item2;
#endif
            return(ref_dict);
        }
Exemplo n.º 2
0
        private static void plugin_main(
            IPXPmx pmx, IPEViewConnector view, IPEFormConnector form)
        {
            int selected_m = form.SelectedMaterialIndex;

            //int selected_v = form.SelectedVertexIndex;
            int [] selected_vs = view.PMDView.GetSelectedVertexIndices();
            if (selected_m >= 0)
            {
                IList <IPXFace> faces    = pmx.Material[selected_m].Faces;
                V2FDict         ref_dict = makeRefDict(faces);
                List <int>      filtered = new List <int>();
                foreach (int selected_v in selected_vs)
                {
                    if (selected_v >= 0 && ref_dict.ContainsKey(selected_v))
                    {
                        filtered.Add(selected_v);
                    }
                }
                if (selected_vs.Length > 0 && filtered.Count <= 0)
                {
                    MessageBox.Show(
                        "選択した頂点は選択した材質に含まれていません");
                }
                List <int> vlist;
                if (filtered.Count > 0)
                {
                    vlist = selectConnectedBorderWrapper(filtered, ref_dict);
                }
                else     // all
                {
                    vlist = selectAllBorder(ref_dict);
                }
                var vedit = view.PMDViewHelper.VertexEdit;
#if USE_MEM_SLOT
                vedit.SetVertexMemory(MEMORY_SLOT, vlist.ToArray());
#endif
                view.PMDView.SetSelectedVertexIndices(vlist.ToArray());
            }
            else
            {
                throw new System.Exception("材質を選択してください");
            }
        }