[MFC :: OpenGL] File output (옮김)

심플디 2014.04.25 13:21 조회 수 : 1500

 # 01. 기획
이 기능은 이미 존재한다. 
실제로 우리는 Input의 과정에서 Temp 파일을 입맛대로 만들어 봄으로써, dxf 파일과 유사한 파일을 만든 경험이 있다.

 <그림 1 :: 주석 처리 되어 있는 temp 파일 만들기 기능.>


또한 dxf 파일 포맷방식도 알고 있고, 데이터도 갖고 있기 때문에, 파일을 만들 때, 경로만 지정해 주면 된다.



# 02. 문제점

하지만 역시...

내가 이 프로젝트에서 하는 일이 다 그렇듯,

이 기능 역시 한큐에 해결 될 기미가 보이지 않았다.


<그림 2 :: 저장을 위한 다이얼로그 박스>


문제점 01.

필자는 dxf 파일을 출력하기를 원한다.

그러나, 파일 형식(T)를 어떻게 컨트롤 하는지 저언혀 아는 바가 없다.

물론 필자가 찾지 못하고 있는 것이겠지만, 책에도 나와 있는 것이 없다...


문제점 02.

필자가 ctrl+f, a 를 통해 Data save 기능을 도모한다면 <그림 2>와 같은 화면을 보게 될 것이다.

여기서 만약 파일명을 200502219라고 저장을 하게 된다면,

CArchive 클래스에 의해 200502219 파일이 한번 생성되고, 필자가 만든 클래스기능에 의해 200502219 파일이 또 한번 생성 될 것이다.

즉, CArchive 클래스에 의해 만들어진 파일을 정확하게 지목하여 'Delete' 시키는 기능이 필요하다.

그것이 아니라면 CArchive 클래스를 필자가 직접 조작해서, 애초부터 dxf 파일 포맷을 지원하게 해야 한다. 하지만 이것은 말이 안되지...ㄱ-^


문제점 03.

파일명을 제대로 인식하지 못하는 버그를 발견했다.

보아하니 또 그 빌어처먹을 UNICODE가 말썽인것 같았다.

요컨데 한글파일명은 제대로 인식되지 않았다.


문제점 04.

확장자 .dxf가 붙지 않았다.







하아...발표가 내일 모래인데, 현 시점에서 이런 문제를 맞닥뜨린 것 자체가 정말 미치고 팔짝 뛸 노릇이네... 

역시 이번에도 내게 조언해줄 만한 능력자는 없었다.

내가 조언을 하면 했지, 조언을 받지 못한다는 것이... 정말 상당히 스트래스 받는 시련의 연속인 것 같다.

늘 느끼지만, 다음부터는 깝치지 말고 우리 기계과 수업이나 열심히 들어야겠다....(2011.12.11)







필자는 이렇게 해결을 볼 수 있었다.


 <그림 3 :: dxf 확장자>


<그림 3>과 같이 dxf 확장자를 강제로 붙여주어서 파일명을 모두 강제로 dxf 화 시킬 수 있다는 이야기다.

그런데, 이렇게 되면 문제점이 하나 발생한다.


<그림 4 :: replace 파일>


그것은 바로, <그림 4>와 같이 파일이 2개 생성된다는 것이다.

일단 dxf 파일은 우리가 코드상으로 지목하여 만든 것이다. 내용에 관해서 우리가 얼마든지 수정 할 수 있는, 조작 가능한 파일이다.

그에 반면 void CProjectOpenGLDoc::Serialize(CArchive& ar) 함수에 의해 생성된 replace란 empty 파일은 어떻게 해볼 도리가 없다.

열어서 데이터 조작을 하자니 dxf 파일도 아닌데 굳이 그럴 필요가 있나 싶고, 가만히 냅두자니 지워야 하기 때문이다.



# 03. 임시 대책

그렇다면. 이 상황을 극복하기 위한 수단은 하나로 좁혀진다.

사용자가 파일의 확장자를 붙이도록 하고, EDIT에는 이름만 적고, 프로그램상에서는 강제적으로 확장자를 붙이는 일이 없어야 하는 것이다.

AfxMessageBox를 절차에 따라 하나씩 넣어서 알아 낸 사실을 말하자면, 파일의 생성순서는 replace -> replace.dxf 다.

empty파일인 replace는 우리가 dxf 파일을 생성하기 전에 미리 생성이 되어있다는 것이다.


즉, 애초부터 empty파일이 dxf 확장자를 갖고 있고, 코드상에서는 그것을 열어서 수정만 하는 역할을 하게 한다는 것이다.


하지만 이상은 이상일 뿐.


<그림 2>에서 replace.dxf 란 이름으로 저장을 시도하면 파일 생성이 되지 않는 것을 볼 수 있었다.

요컨데 ofstream클래스의 open메서드에서 char 형을 읽지 못하는것을 보니, 콤마(.)가 특수기호라서 unUnicode화 되지 못하는 것 같았다.

결국. 빈 파일의 생성을 한번 이상은 허용 해야 한다는 이야기다.



# 04. DXF 파일 생성


그럼 일단 파일의 삭제에 대한것은 뒤로 미루고, 일단 제대로된 dxf 파일이나 하나 만들어 보도록 하자.

아래의 코드는 Polyline 하나를 생성하는 코드이다.


chPNE는 경로(Path), 이름(Name), 확장자(Extention)의 문자열이며

chNE는 이름(Name), 확장자(Extention)의 문자열이고,

chE는 확장자(Extention)의 문자열이다.


고로, CArchive 클래스에서 경로에 대한 문자열 처리를 적절하게 하는 전처리과정이 있어야 겠다.


bool clFileTemp::clFileTemp_Create_DXF(char *chPNE, char *chNE, char *chE, clPoint2 &vlPoint2)

{       

        // 서론입니다.

               ofstream output;

               output.open(chPNE);

               if(!output)

                       AfxMessageBox(_T("파일명은및특수기호및한글을지원하지않습니다"));

               output  << 0                    <<endl;

               output  << "SECTION"            <<endl;

               output  << 2                    <<endl;

               output  << "ENTITIES"           <<endl;

               output  << 0                    <<endl;

 

        // 본문입니다.

               output << "POLYLINE"          <<endl;

                       output << 8           <<endl;

                       output << 0           <<endl;

                       output << 66          <<endl;

                       output << 1           <<endl;

                       output << 10          <<endl;

                       output << "0."        <<endl;

                       output << 20          <<endl;

                       output << "0."        <<endl;

                       output << 30          <<endl;

                       output << "0."        <<endl;

                       output << 70          <<endl;

                       output << 8           <<endl;

                       output << 0           <<endl;

              

               output <<"VERTEX"             <<endl;

                       output << 8           <<endl;

                       output << 0           <<endl;

                       output << 10          <<endl;

                       output << "0."        <<endl;

                       output << 20          <<endl;

                       output << "10."       <<endl;

                       output << 30          <<endl;

                       output << "0."        <<endl;

                       output << 70          <<endl;

                       output << 32          <<endl;

                       output << 0           <<endl;

 

               output <<"VERTEX"             <<endl;

                       output << 8           <<endl;

                       output << 0           <<endl;

                       output << 10          <<endl;

                       output << "0."        <<endl;

                       output << 20          <<endl;

                       output << "20."       <<endl;

                       output << 30          <<endl;

                       output << "0."        <<endl;

                       output << 70          <<endl;

                       output << 32          <<endl;

                       output << 0           <<endl;

 

        // POLYLINE에대한마무리입니다.

               output << "SEQEND"            <<endl;

               output << 8                   <<endl;

               output << 0                   <<endl;

               output << 0                   <<endl;

 

        // 파일의끝입니다.

               output << "ENDSEC"            <<endl;

               output << 0                   <<endl;

               output << "EOF"               <<endl;

               output.close();

              

        return true;

}

 

DXF 파일 포맷에 대해서는 이미 설명한 적이 있으므로 구체적인 설명은 생략하겠다.

아무튼 이것을 파일화 하여 AutoCAD 2010으로 표현하면 아래와 같은 그림을 볼 수 있다.


<그림 5 :: 선 하나가 그려져있다.>


<그림 6 >

<그림 7 :: 꺾어진 직선>


<그림 8 :: 결과> 

 

요컨데 <그림 7>이 되어야, 스캐닝 타입 dxf를 고대로 재현할 것 아니겠는가?ㅎ

하지만 <그림 8>과 같이 직선 1개만 표현이 되었다.ㅠㅠㅠ


혹시나 해서 <그림 6>과 같은 타입도 그려보았는데, 역시... 0,0에서 0,10으로 가는 첫번째 라인은 과감하게 제외되어 있었다. -.-...


<그림 9 :: 점 추가>


<그림 10 :: 결과>


사실 내게는 <그림 10> 정도의 결과도 감지덕지하다.

아무튼 "변화가 일어나는 직선"을 표현하고 있으니 말이다. ㅎㅎ

 

(한숨 자고 왔음)


다음은 Autodesk 사에서 제공하는 POLYLINE 포맷의 정체이다.

( 출처 : http://www.autodesk.com/techpubs/autocad/acad2000/dxf/polyline_dxf_06.htm )


Group codes Description

100

Subclass marker (AcDb2dPolyline or AcDb3dPolyline)

10

DXF: always 0
APP: a "dummy" point; the X and Y values are always 0, and the Z value is the polyline's elevation (in OCS when 2D, WCS when 3D)

20

DXF: always 0

30

DXF: polyline's elevation (in OCS when 2D, WCS when 3D)

39

Thickness (optional; default = 0)

70

Polyline flag (bit-coded); default is 0:
1 = This is a closed polyline (or a polygon mesh closed in the 
M direction).
2 = Curve-fit vertices have been added.
4 = Spline-fit vertices have been added.
8 = This is a 3D polyline.
16 = This is a 3D polygon mesh.
32 = The polygon mesh is closed in the N direction.
64 = The polyline is a polyface mesh.
128 = The linetype pattern is generated continuously around the vertices of this polyline.

40

Default start width (optional; default = 0)

41

Default end width (optional; default = 0)

71

Polygon mesh M vertex count (optional; default = 0)

72

Polygon mesh N vertex count (optional; default = 0)

73

Smooth surface M density (optional; default = 0)

74

Smooth surface N density (optional; default = 0)

75

Curves and smooth surface type (optional; default = 0); integer codes, not bit-coded:
0 = No smooth surface fitted
5 = Quadratic B-spline surface
6 = Cubic B-spline surface
8 = Bezier surface

210

Extrusion direction (optional; default = 0, 0, 1) 
DXF: X value; APP: 3D vector

220, 230

DXF: Y and Z values of extrusion direction (optional)


여기서 필자가 참고할만한것은 별로 없다.

제 70번째 Entity 속성을 바꿔줘 봤지만 별로 달라진 점을 볼 수 없었다.


그렇다면 혹시, 돼지저금통의 format도, 첫번째 점이 없는 것이 아닐까?


<그림 11 :: POLYLINE과 VERTEX가 같은 모습>

 

그렇지 않았다. 첫번째 점을 무시하고 그리는것이 아니라, 오히려 첫번째 점을 한번 더 선언해주는 방식을 갖고 있었다.

<그림 11>을 보면 첫번째 점이 있음에도 무시되기 때문에, Vertex를 통해 점을 한번 더 그려주는 모습을 볼 수 있다.

예전에 그렇게 봐 놓고 왜 이제야 이 사실을 떠올린 것일까 ㅎㅎ;;;


즉, 첫번째 점이 POLYLINE 및 VERTEX로 2번 선언된다는 것이다.

비밀이 풀렸으니 클래스 내부의 모습을 조금 변화시킬 필요가 있다.


<그림 12 :: 순차적으로 선언됨요>


<그림 12>의 로직을 보면 현재 dxf 파일이 어떻게 만들어지고 있는지 한눈에 보일 것이라 생각된다.

간만에 내 나름의 배려를 한 것이니, 이해가 잘 되었으면 좋겠다.


 <그림 13 :: 점들의 선언>


 <그림 14 :: 점들의 선언 결과>


여지껏 긁어모은 정보를 모두 동원하여 <그림 9>의 cad 파일을 생성해냈다.

대충 이런 방식으로 돌아간다.

하나의 polyline은 POLYLINE, VERTEX, SEQEND를 갖는 방식으로 각각의 선들이 모두 표현되는 것이다.


 <그림 15 :: 코딩>


 <그림 16 :: 결과>


음? 그런데 이상한 점을 발견.

그냥 점 데이터를 옮겼을 뿐인데, 선이 튀는 현상이 일어났다.


 <그림 17 :: 돼지저금통 원본을 위에서 봤을 때의 모습>


<그림 17>을 볼 때, 어디를 보더라도 세로줄이 없고, 면도 안튀어야 되는데;;;; 

뭐가 잘못 된 것일까?


필자는 이때, 애초부터 dxf를 읽어오기 전에 u -> v 순으로 초기화 한것이 아니라 v -> u 순으로 초기화 했음을 기억해 냈다.


for(int i=0; i<iu; i++) for(int j=0; j<iv; j++) vlPoint[i][j]... 가 아니라

for(int j=0; j<iv; j++) for(int i=0; i<iu; i++) vlPoint[i][j]... 라는 것이다.


아무튼 이런 원리를 이용하여 선을 그으니 아래와 같은 결과를 얻을 수 있었다.


 <그림 18 :: 결과>


여기서 잠깐. <그림 16>의 그림이, 면이 튀는 현상을 볼 때와 비슷하다고 생각하지 않는가? ㅋㅋㅋ

그렇다. 선을 i -> j 순서로 읽었기 때문에 발생한 오류였던 것이다!ㅋㅋㅋ


하지만 안다고 달라지는 건 없었다. ㄱ- (프로그램 수정 결과 똑같은 버그 발견함.)

역시 면이 튀는 문제는 오래 생각해봐야 할 것 같다.



# 05. 잔여 파일 삭제

이제 확장자도 붙지 않은 더미 파일을 삭제할 차례이다.

아. 그런데 꼭 지워야 할까? 귀찮은데... 난 지우지 않을 것이다.

왜냐하면 언젠간 사용자가 .dxf를 입력하여 저장하기를 바랄 것이기 때문이다.

또한 일반적인 ctrl+s 로 저장을 도모한다면 ~.dxf 파일이 ~.dxf.dxf 로 되는 현상이 일어나는데,

이 버그를 잡기 위해서라도 empty 파일을 삭제하는 기능이 있어서는 안된다.


그래서 이 기능은 일단 보류를 시키도록 하겠다.

번호 제목 글쓴이 날짜 조회 수
공지 본 게시글의 첨부파일 권한 심플디 2014.08.22 2376
47 [MFC :: OpenGL] 컴공 수업 발표 자료 (옮김) [2] 심플디 2014.04.25 2878
46 [MFC :: OpenGL] Project 시즌 2 후기 (옮김) 심플디 2014.04.25 1568
» [MFC :: OpenGL] File output (옮김) 심플디 2014.04.25 1500
44 [MFC :: OpenGL] Tool bar(툴바) 편집방법 (옮김) 심플디 2014.04.25 1821
43 [MFC :: OpenGL] IntroPage (옮김) file 심플디 2014.04.25 1500
42 [MFC :: OpenGL] IPC 적용 (옮김) file 심플디 2014.04.25 1560
41 MFC :: OpenGL] ProjectMFCReport 와꾸짜기 (옮김) 심플디 2014.04.25 1681
40 [MFC :: OpenGL] Data Dialog 와꾸짜기 (옮김) 심플디 2014.04.25 1710
39 [MFC :: OpenGL] 시즌 2 개요 (옮김) file 심플디 2014.04.25 1499
38 [MFC :: OpenGL] Project 시즌 2 시작 (옮김) [1] 심플디 2014.04.25 1504
37 [MFC :: OpenGL] Project 시즌 1 후기 (옮김) file 심플디 2014.04.25 1566
36 [MFC :: OpenGL] Mesh :: Part 2 (옮김) [1] file 심플디 2014.04.25 1533
35 [MFC :: OpenGL] Mesh :: Part 1 (옮김) file 심플디 2014.04.25 1584
34 [MFC :: OpenGL] DXF :: Part 5 (옮김) file 심플디 2014.04.25 1574
33 [MFC :: OpenGL] DXF :: Part 4 (옮김) file 심플디 2014.04.25 1469
32 [MFC :: OpenGL] DXF :: Part 3 (옮김) file 심플디 2014.04.25 1453
31 [MFC :: OpenGL] DXF :: Part 2 (옮김) file 심플디 2014.04.25 1503
30 [MFC :: OpenGL] DXF :: Part 1 (옮김) file 심플디 2014.04.25 1545
29 [MFC :: OpenGL] Proposal 및 앞으로의 계획 (옮김) 심플디 2014.04.25 1539