Example #1
0
        public void Parse(object args)
        {
            string path = (string)args;


            //내용 임시저장
            Queue <string> lines = new Queue <string>();

            Stack <CNT> stackCNT = new Stack <CNT>();
            List <CNT>  CntList  = new List <CNT>();

            FileStream   fs     = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
            StreamReader reader = new StreamReader(fs);

            string strLine  = string.Empty;
            string siteName = string.Empty;

            CNT  currentCNT = null;
            bool isEnd      = false;
            int  primCnt    = 0;

            while (reader.EndOfStream == false)
            {
                strLine = ReadLine(reader, lines);

                if (strLine == "CNTB")
                {
                    //시작 체크
                    isEnd = false;

                    strLine = ReadLine(reader, lines, 2);

                    //이름으로 생성
                    CNT newCNT = new CNT(strLine);

                    //root 표시
                    if (this.CheckSiteName(strLine)) // 파일 이름이면.
                    {
                        this.rootList.Add(newCNT);
                        CntList = new List <CNT>();
                        this.allCNTList.Add(CntList);
                    }

                    //xyz좌표가져오기
                    strLine = ReadLine(reader, lines, 1);
                    newCNT.AddXYZ(strLine);

                    //스택에 추가
                    stackCNT.Push(newCNT);
                    CntList.Add(newCNT);

                    //현재 노드 갱신
                    if (currentCNT != null && isEnd == false)
                    {
                        currentCNT.AddCNT(newCNT);
                    }
                    currentCNT = newCNT;
                }
                else if (strLine == "CNTE")
                {
                    //그룹 끝 체크
                    isEnd = true;

                    //부모 노드로 교체
                    try
                    {
                        currentCNT = stackCNT.Pop().Parent;
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.StackTrace);
                    }
                }
                else if (strLine == "PRIM")
                {
                    primCnt++;
                    //타입 읽기
                    strLine = ReadLine(reader, lines, 2);
                    PRIM newPRIM = new PRIM(strLine);

                    //prim 추가
                    currentCNT.AddPRIM(newPRIM);


                    //회전
                    string[] rotationArr = new string[3];
                    for (int i = 0; i < 3; i++)
                    {
                        rotationArr[i] = ReadLine(reader, lines, 1);
                    }
                    newPRIM.SetRotation(rotationArr);

                    //바운드
                    string[] boundArr = new string[2];
                    for (int i = 0; i < 2; i++)
                    {
                        boundArr[i] = ReadLine(reader, lines, 1);
                    }
                    newPRIM.SetBound(boundArr);


                    if (newPRIM.Type == 7 || newPRIM.Type == 1)
                    {
                        //길이 7번( 콘은) 2줄
                        string[] lengthArr = new string[2];
                        for (int i = 0; i < 2; i++)
                        {
                            lengthArr[i] = ReadLine(reader, lines, 1);
                        }
                        newPRIM.SetLength(lengthArr);
                    }
                    else if (newPRIM.Type == 11)
                    {
                        //strLine = ReadLine(reader, lines, 6);

                        strLine = ReadLine(reader, lines, 1);
                        int faceCnt = -1;
                        int.TryParse(strLine, out faceCnt);


                        int subfaceCnt = -1;
                        for (int fi = 0; fi < faceCnt; fi++)
                        {
                            subfaceCnt = -1;
                            strLine    = ReadLine(reader, lines, 1);
                            int.TryParse(strLine, out subfaceCnt); //보통 1

                            for (int sfi = 0; sfi < subfaceCnt; sfi++)
                            {
                                int vertaxCnt = -1;
                                strLine = ReadLine(reader, lines, 1);
                                int.TryParse(strLine, out vertaxCnt);

                                newPRIM.AddVertextCount(vertaxCnt);
                                Vertices newVertices = new Vertices();
                                for (int vi = 0; vi < vertaxCnt; vi++)
                                {
                                    strLine = ReadLine(reader, lines, 1);
                                    string v = strLine;
                                    strLine = ReadLine(reader, lines, 1);
                                    string r = strLine;

                                    newVertices.AddVertex(v, r);
                                }
                                newPRIM.AddVertices(newVertices);
                            }
                        }
                    }
                    else
                    {
                        //길이 1~8, 9번 1줄
                        string[] lengthArr = new string[1];
                        lengthArr[0] = ReadLine(reader, lines, 1);
                        newPRIM.SetLength(lengthArr);
                    }
                }
            }
        }