[MFC :: OpenGL] DXF :: Part 2 (옮김)

심플디 2014.04.25 12:45 조회 수 : 1503





DXF.exe




Part 1에서 소개한 바와 같이,




MFC에서 파일 입출력을 하는데에 있어서, 




프로젝트에 맞는 기능을 구현하기 위한, 




클래스 조직을 세울 것이다.



































일전에 Dxf 파일 포맷과 IGES 파일 포맷의 구성에 대해 소개한 바가 있었다. (프로젝트 초기에 소개함.)

하지만 이것을 긁어오는 알고리즘에 대해서는 전혀 설명한 바가 없었는데, 


이것은 MFC의 Docu' 클래스를 활용하기 위해 어떤 구조의 방식을 써야 하는지 필자가 잘 몰라서 그랬다.




바로 이전 게시물에서 그 방법을 알 수 있으므로 바로 Dxf 파일 포맷을 긁어오는 방식을 취해보자.


(IGES는 일단 슈퍼패스!!)




일단 간단한 긁어오기 구조를 소개한다.




만능일것 같은 CFile에도 부족한 부분이 있는데, 이것을 확인 하기 위해서, 일단 새로운 프로젝트를 만들자. 


프로젝트 명은 DXF이며 단일문서구조이다.




<그림 1 :: DXF 프로젝트의 Docu' 클래스의 구현부 (Serialize)모습>


<그림 1>을 통해, 우리는 새로운 프로젝트에서 CFile의 한계를 시험하는 코드를 작성한 모습을 볼 수 있다.

CFile은 불러오는 것에만 급급하여 "확장자 필터링"등의 기능이 전혀 없는 모습을 볼 수 있다.

즉, 입맛에 맞는 클래스를 새로 구성해야 한다는 것이다.



<그림 2>


 

<그림 3>


<그림 2~3>과 같이 클래스를 하나 더 추가하는 과정을 보여주고 있다.

이를 통해 clFileInfo 클래스와 clFileInsp 클래스와 clUserFunction 클래스를 생성해주고 

clFileInfo 클래스와 clFileInsp 클래스는 상속관계에 놓이게 코딩한다. 


그리고 clUserFunction은 대략 잉여인데, 혹시 몰라서 만들어두었다. 

(다른 프로젝트에서는 굉장히 용이하게 사용된 클래스다...)


 <그림 4 : 새로운 클래스 등장>



 

<그림 5 :: dxf 파일의 선택 (파일 열기) >

 


 <그림 6 :: dxf 파일의 성공적인 인식 상태>


<그림 5> 와 <그림 6>은 프로그램이 dxf 및 iges 및 기타 확장자를 필터링 할 수 있음을 보여주고 있다.

(그로부터 약 10시간이 지난 후)

그럼 이제 제대로 된, 파일 입력 클래스 구성도를 소개한다.


 

 <그림 7 :: 파일 입력 클래스 구성도>


<그림 7>은 파일 입력(불러오기)에만 관련된 클래스 구성도를 보여주고 있다.

<그림 4>로 간과 할 수 있는 거의 모든 부분을 수정하였다.

필자는 Entity(흑) , Control(청) 클래스 외에 Manager(녹) 클래스의 개념도 섞어서 쓰길 좋아한다.

혹시 Entity 및 Control 클래스만 사용해왔던 C++유저라면 Manager 클래스또한 Control 클래스라고 생각해도 괜찮다.


청색 화살표는 Is-A 관계이며 흑색 화살표는 Has-A 관계를 나타낸다.

으래 clManagerInput 클래스를 만들어서 clFileInput과 clPointInput 클래스를 포함시키려고 했지만 귀찮아서 수퍼패스 했다.

클래스의 기능이 뚜렷한 것은 분명 기뻐해야 할 일이겠지만, 사실 복잡해진다는 면에서는 마냥 기뻐해야하 할 노릇이 아니기 때문이다.

(2011.10.28 0::53 클래스 메서드 기능이 꼬여서 갈아 엎을 판이다... 누가 나 좀 도와줘...ㅠㅠ)


 <그림 8 :: 수정된 Input Procedure>


<그림 8>은 <그림 7>의 클래스 구성도를 갈아엎고 새로 만든 클래스 구성도를 보여주고 있다.

개인적으로 <그림 7>의 클래스 구성도가 마음에 들었지만, '기능'이 시원찮아서 갈아 엎어야만 했다. (때문에 어제 맥주를 마시고 날밤새서 놀았다.)

보기엔 사각형 내용만 살짝 변경된것으로 보이겠지만 실상은 그렇지 않다.

내부 구조가 거의 완전히 뜯기고 붙여지고 하는 대공사가 펼쳐졌기 때문이다.


clPoint와 clSFunction 클래스는 stdafx.h 헤더파일에 포함되며 상속관계가 아닌 전역변수 개념으로 프로그램에 포함시켰다.


<그림 9 :: clInputManager 클래스 선언부>

<그림 10>

 

 <그림 11>



<그림 9~11>은 clInputManager클래스의 코딩 스타일을 보여주고 있다.

clInputManager클래스의 clInputManager_Input_Procedure 메서드는

clFileMana, clPointMana, clFormatMana의 상속(has-a)된 메서드를 깜냥껏 선언함으로서 Dxf 파일의 내용을 긁어오는 일을 순서에 맞게 진행한다.


<그림 12 :: clInputManager 클래스의 활용>



clInputManager 클래스를 사용하려면 선언부(.cpp)파일의 맨 위에 #include "clInputManager.h"의 선언을 해주어야 한다^^; 

(귀찮아서 스샷은 생략한다 ㄱ-)

 

clInputManager 클래스 내부에 들어있는 'dxf파일을 긁어오는 코드' 는 2~300줄이 넘는 코드다.

<그림 12>는 그 많은 코드들을 3줄로 요약하는 장면이다.


 <그림 13 :: 클래스 컨셉>


 <그림 14 :: 클래스 컨셉 >


<그림 13>과 <그림 14>는 <그림 8>의 컨셉을 보여주고 있다.

이것을 통해 클래스의 구구절절한 설명을 생략한다.


자, 그럼 Data를 긁어오는 것은 성공했으니 다음의 문제로 넘어가보자.

어떻게 활용하지? 요컨데 긁어온 데이타가 존재하긴 하는데, 그것을 어떤 방식으로 표현해 내는것이 좋을까?

잠깐 삼천포로 빠져서, MFC는 총 4개의 와꾸로 구성되어 있는데, 그것은 프레임(Frame), 어플리케이션(App'), 뷰(View), 문서(Doc')이다.

이 4개의 객체는 서로의 Data를 주고 받을 수 있는 방법이 존재한다. (이것 자체는 별 문제가 되지 않는다.)


그렇기 때문에, OpenGL에 관련된 코드는 View에 집중시키고, 파일 입출력에 관련된 코드는 Doc'에 집중시킨것이다.

여태껏 우리는 점(Point) 자료를 View 클래스의 선언부(.h)에 집중시켰지만, 이제는 상황이 달라진다.

즉, 점(Point) 자료를 Doc에 집중시켜야 하는 것이다.


일전에 우리가 선언했던 점(Point) data는 배열형이였으며
그에 따른 제어점의 영향도 배열로 선언해 주었었다.


무슨 말이냐면, 우리는 하나의 변수를 u, v, (x,y,z)에 대한 배열로 꾸며야 한다는 것이다.

3D scanning Data 중, DXF data는 하나의 Polyline 안에 Vertex들이 포함되는 형식을 띄고 있다.

즉, Polyline은 v가 된다.

그리고 하나의 Polyline은 여러개의 Vertex들을 포함하고 있다.

여기에서의 Vertex들은 u가 된다.


이것을, 파일을 긁어오는 과정에서 count하여 각각의 최대값을 얻고, 

변수[u][v][3]을 변수[Vertex_max][Polyline_max][x_y_z]의 개념으로 할당해 주면 되는 것이다.

제어점 배열도 u, v 배열의 영향을 받으므로 Count하는 과정은 꼭 필요하다고 할 수 있다.


(원래 이 일을 Point_Sort 클래스에서 시행하려 했으나, 귀찮았다.)

(첨부파일은 디버그모드의 exe이기 때문에 vc++2008이 설치되어 있어야 보기 수월하다...)


번호 제목 글쓴이 날짜 조회 수
공지 본 게시글의 첨부파일 권한 심플디 2014.08.22 2376
47 [MFC :: OpenGL] 컴공 수업 발표 자료 (옮김) [2] 심플디 2014.04.25 2878
46 [MFC :: OpenGL] Project 시즌 2 후기 (옮김) 심플디 2014.04.25 1568
45 [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
» [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