기본 콘텐츠로 건너뛰기

5월, 2010의 게시물 표시

SHX FILE FORMAT

다들 아시다시피 SHX 파일은 AutoCAD에서 사용하는 폰트 파일입니다. 요즘에는 트루타입 폰트도 많이 사용하고 있지만(물론 지금도 사용하고 있지만), 예전엔 간단한 포맷의 폰트를 CAD 시스템에서 많이 사용했습니다. 2004년도에 작성한 글이지만 올립니다. SHX File Format Layout header는 아래와 같이 구성된다. '\r''\n'으로 끝나는 desc는 아래와 같은 값을 가진다. AutoCAD-86 SHAPES 1.0 AutoCAD-86 SHAPES 1.1 AutoCAD-86 UNIFONT 1.0 AutoCAD-86 SHAPES 1.0 혹은 AutoCAD-86 SHAPES 1.1일 경우 두 바이트     : 두 바이트     : 두 바이트     : table의 크기 char element desc은 4 바이트의 크기를 가진다. 상위 두 바이트 : char code number 하위 두 바이트 : 해당 char element data size total size(bytes) : table의 크기 x  4 char element data table이 나타난다 AutoCAD-86 UNIFONT 1.0일 경우 두 바이트     : table의 크기 AutoCAD-86 SHAPES 1.0 , AutoCAD-86 SHAPES 1.1에서는 element desc table이 나타나고 data table이 나타났었는데, AutoCAD-86 UNIFONT 1.0에서는 element desc + data가 함께 나타나는 방식이다. Char Element Data 제일 먼저 나타나는 커맨드는 폰트에 대한 정보(이름,높이.,,,)를 가지고 있다. 첫번째 바이트 : 폰트의 높이 두번째 바이트 : 세번째 바이트 : 1 - Vertical type 0x01 pen down 0x02 pen up 0x03 다음에 오는 바이트로 기존의 scale을 나눈다. 0x04

FrameWork Data 분석

아래는 FrameWork으로 생성한 칼럼의 user linkage의 data 부분을 덤프한 내용입니다. F10-3d 부분이 칼럼의 이름이 됩니다. 따라서 user data linkage의 data 부분에서 12 바이트 떨어진 곳에서 16 바이트를 읽어내면 칼럼의 이름을 구할 수 있습니다.

PDS NOZZLE DATA 분석 V7 / MSTN/MDL/VBA

PDS에서 Nozzle은 Cell형식으로 만들어져 있습니다. Nozzle을 찾기 위해서 이 Cell들 중에서 drms linkage의 user id가 22인 Cell을 찾습니다. 일단 이 Cell을 Nozzle로 간주할 수 있습니다. 다음 attribute linkage는 Nozzle이 속한 Equipment의 관한 dmrs linkage입니다. 또 다음의 attribute linkage는 그냥 무시합니다. 그 다음에 나타나는 attribute는 user data linkage로써 nozzle의 이름을 가지고 있습니다. 이 user data linkage의 data 부분에서 첫 10 바이트를 nozzle 이름으로 구하면 됩니다. 또한 Nozzle의 여러 정보들은 Database의 22 , 23번 테이블에 담겨져 있습니다. partition no와 nozzle의 occurrence number로 nozzle의 정보를 구할 수 있습니다.

다이얼로그 초기 로딩시 컨트롤에 포커스 주기

제목 그대로 다이얼로그 초기 로딩시에 컨트롤에 포커스를 주는 방법입니다. MFC Wizard에서 생성한 코드를 사용하면 항상 다이얼로그 자체가 포커스를 가지게 됩니다. 아래 그림에서 처럼 트리 컨트롤에 포커스를 주어 선택한 트리 아이템을 표시하려고 했습니다. 그런데 나의 의도대로 잘 되지 않았습니다. 계속 시도를 했습니다.~~ OnInitDialog() 함수의 마지막 리턴하는 부분의 주석(Wizard가 생성한)을 읽어 보니 '컨트롤에 포커스를 주지 않을려고 하면 TRUE를 리턴하라' 고 적혀 있었습니다. 그래서 FALSE를 리턴하니 내가 의도한 대로 트리 컨트롤에 포커스를 줄 수 있었습니다. m_pActivePage->ShowWindow(SW_SHOWNORMAL); pTreeCtrl->SetFocus(); } return FALSE;///TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE

62 Element 분석

62 Element는 일반적인 MSTN Element가 아닌 PDS용 특수 Element라 할수 있습니다. 특히 Equipment의 이름을 저장하는 Element이다. 이 Element에 대한 포맷은 문서화 되지 않았는데, 여기서 바이러니 분석을 통해 알아본 포맷을 적어보고자 합니다. 62 Element 역시 MSTN의 모든 Element가 가지는 헤더부분을 가지고 있습니다. 가장 중요한 Equipment Name을 저장하는 위치는 Element 시작 위치에서 18Words 떨어진 부분에서 30 Bytes 의 공간을 차지하고 그 다음으로 descr1 , descr2가 각각 40 , 48Bytes 차지합니다. 마지막으로 98 Words 떨어진 곳에 Equipment의 occurno가 위치합니다. 아래는 62 Element를 삽입하는 예제 코드입니다. LinkageHeader tLinkHdr; int nStatus; MSElement object; //---------------------------------------------------------------------------------------------------------------------- // put equipment name element memset(object , '\0' , sizeof(MSElement)); object.hdr.ehdr.type = 62; //! 0x3E object.hdr.ehdr.words = 98; //! 0x62 object.hdr.ehdr.xhigh = 0xffffffff; object.hdr.ehdr.yhigh = 0xffffffff; object.hdr.ehdr.zhigh = 0xffffffff; object.hdr.dhdr.attindx= 0x0050; object.hdr.dhdr.props.b.a = 1; //! always new bit is setted. memset((object.buf[18])