오토캐드 Data Exchanging File(DXF)를 화면에 읽어 표현하는 솔루션

 

1. Control class 가능

2. MFC Custome class 가능

3. 확대/축소/회전 가능

 

 

1. Reading DXF file

CDXFReader reader;

CNcDataContainer container;



ReadDxfFile("test.dxf",&container);

2. Draw DXF file
CDXFDrawer drawer;

CNcDataContainer container; // read already



CDC * pDC // from System
drawer.Draw(&container, pDC);

3. 기타 회전/확대/축소 함수 지원

'solution' 카테고리의 다른 글

MS-EXCEL Builder  (0) 2023.03.22
Socket wrapper (C/C++, JAVA)  (2) 2023.03.22

MS-EXCEL은 아주 다양한 분야에서 사용되고 있으나 다른 시스템과의 호환성 구현에 많은 문제가 발생한다. 이 모듈은 EXCEL없는 환경에서도 복잡한 형태의 EXCEL 파일을 생성할수 있는 솔루션이다.

 

1. C/C++, JAVA 어떤 환경에서도 코딩만으로 형식화된 EXCEL파일 생성

2. VBA나 COM의 도움을 받지 않고 직관적으로 EXCEL FORM을 생성하므로 생성속도가 빠름

3. LINUX, UNIX등 MS-EXCEL이 작동하지 않는 환경에서도 완벽한 EXCEL FILE생성

4. EXCEL 고유 포멧으로 생성하므로 EXCEL에서의 로딩속도 빠름

 

아래 화면은 Excel builder로 excel이 설치되지 않은 UNIX 머신에서 생성한 EXCEL File이다.

예제) 첨부된 파일은 Visual C++ 2010에서 컴파일되었으며 Release 모드로 컴파일 하여야합니다. 해당 소스에 대한 설명은 아래와 같습니다. (아래의 예제는 C++로 제작되었으나 JAVA형식의 모듈도 있습니다.)

 

 

1. Simple class

COxpExcel excel;

excel.Create("d:\test.xlsx");
excel.Close();

 

2. Styling

excel.StylesBegin();

       // 표시형식
excel.StylesNumFmtsBegin(2);
excel.StylesNumFmtsAddFmt("##00.0", 0);
excel.StylesNumFmtsAddFmt("\"₩\"#,##0.00", 1);
excel.StylesNumFmtsEnd();
        // 폰트
excel.StylesFontsBegin(1);
excel.StylesFontsAddFont("맑은 고딕", 11, 0xFF0000, true, true, true);
excel.StylesFontsEnd();
       // 채우기
excel.StylesFillsBegin(2);
excel.StylesFillsAddPattenFill(0x808080);
excel.StylesFillsAddPattenFill(0xFFFFFF);
excel.StylesFillsEnd();
// 테두리
excel.StylesBordersBegin(3);
excel.StylesBordersBorderBegin();
excel.StylesBordersBorderAddBorder(OXP_BORDER_POS_ALL, OXP_BORDER_STYLE_HAIR, 0xFF0000);
excel.StylesBordersBorderEnd();
excel.StylesBordersBorderBegin();
excel.StylesBordersBorderAddBorder(OXP_BORDER_POS_LEFT, OXP_BORDER_STYLE_THICK, -1);
excel.StylesBordersBorderAddBorder(OXP_BORDER_POS_RIGHT, OXP_BORDER_STYLE_THICK, -1);
excel.StylesBordersBorderAddBorder(OXP_BORDER_POS_TOP, OXP_BORDER_STYLE_HAIR, -1);
excel.StylesBordersBorderAddBorder(OXP_BORDER_POS_BOTTOM, OXP_BORDER_STYLE_HAIR, -1);
excel.StylesBordersBorderEnd();
excel.StylesBordersBorderBegin();
//excel.StylesBordersBorderAddBorder(OXP_BORDER_POS_ALL, OXP_BORDER_STYLE_THICK, 0x000000);
excel.StylesBordersBorderAddBorder(OXP_BORDER_POS_ALL, OXP_OLD_LINESTYLE_CONTINUOUS, OXP_OLD_WEIGHT_THICK, 0x000000);
excel.StylesBordersBorderEnd();
excel.StylesBordersEnd();
//정렬
excel.StylesCellStylesBegin(1);
excel.StylesCellStylesAddXf(0,-1,0,0,OXP_ALIGN_VERT_NONE,OXP_ALIGN_HOZ_NONE);
excel.StylesCellStylesEnd();
excel.StylesCellXfsBegin(2);
excel.StylesCellXfsAddXf(0,0,0,0,OXP_ALIGN_VERT_NONE,OXP_ALIGN_HOZ_CENTER,0);
excel.StylesCellXfsAddXf(2,1,0,1,OXP_ALIGN_VERT_NONE,OXP_ALIGN_HOZ_CENTER,0);
excel.StylesCellXfsEnd();
excel.StylesEnd();


3. Worksheet 정의

excel.WorkSheetBegin("Test1", 1, 1, 1, 1);

excel.WorkSheetColumnsBegin();
excel.WorkSheetColumnsAddColumn(4,20, false, true);
excel.WorkSheetColumnsEnd();
excel.WorkSheetDataBegin();
excel.WorkSheetDataRowBegin(1);
excel.WorkSheetDataRowAddColumnLng (2, 1000, 1,NULL, 0, 1);
excel.WorkSheetDataRowEnd();
excel.WorkSheetDataRowBegin(2);
excel.WorkSheetDataRowAddColumnBool (1, true, 1, NULL);
//excel.WorkSheetDataRowAddColumnBool (2, false);
excel.WorkSheetDataRowAddColumnInt (3, 100, 0);
excel.WorkSheetDataRowAddColumnDbl (4, 100.101);
excel.WorkSheetDataRowAddColumnLng (5, 1000);
excel.WorkSheetDataRowAddColumnDate (6, 37572);
excel.WorkSheetDataRowAddColumnStr (7, "TEST");
excel.WorkSheetDataRowAddColumnStr (8, "TEST");
excel.WorkSheetDataRowAddColumnStr (9, "TEST");
excel.WorkSheetDataRowAddColumnStr (10,"TEST2");
excel.WorkSheetDataRowEnd();
excel.WorkSheetDataRowBegin(3);
excel.WorkSheetDataRowAddColumnDbl (3, 0, -1, "D2+D3");
excel.WorkSheetDataRowAddColumnDbl (4, 200.101);
excel.WorkSheetDataRowEnd();
excel.WorkSheetDataEnd();
excel.WorkSheetEnd(false);

4. 도형, 컨트롤 삽입
excel.DrawingsBegin();

excel.DrawingsShapeBegin(L"CHECK1");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_CHECKBOX, 1, 1);
excel.DrawingsShapeObjectAddTextVAlign(OXP_ALIGN_VERT_CENTER);
excel.DrawingsShapeObjectAddFormulaLink(1,1);
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeAddText(L"CHECK1");
excel.DrawingsShapeEnd();
excel.DrawingsShapeBegin(L"DROPDOWN1");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_DROPDOWN, 1, 2);
excel.DrawingsShapeObjectAddFormulaRange(L"Test2!A1:A10");
excel.DrawingsShapeObjectAddFormulaLink(1,2);
excel.DrawingsShapeObjectAddDropLines(8);
excel.DrawingsShapeObjectAddSelection(2);
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeEnd();
excel.DrawingsShapeBegin(L"DROPDOWN2");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_DROPDOWN, 1, 3);
excel.DrawingsShapeObjectAddAttribute(0,1,7,1,5,16);
excel.DrawingsShapeObjectAddFormulaLink(1,3);
excel.DrawingsShapeObjectAddDropLines(4);
excel.DrawingsShapeObjectAddSelection(2);
excel.DrawingsShapeObjectAddListItem(L"삽입1");
excel.DrawingsShapeObjectAddListItem(L"삽입2");
excel.DrawingsShapeObjectAddListItem(L"삽입3");
excel.DrawingsShapeObjectAddListItem(L"삽입4");
excel.DrawingsShapeObjectAddListItem(L"삽입5");
excel.DrawingsShapeObjectAddListItem(L"삽입6");
excel.DrawingsShapeObjectAddListItem(L"삽입7");
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeEnd();
excel.DrawingsShapeBegin(L"SPINNER1");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_SPINNER, 1, 4);
excel.DrawingsShapeObjectAddAttribute(10,10,100,10,10,16);
excel.DrawingsShapeObjectAddFormulaLink(2,4);
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeEnd();
excel.DrawingsShapeBegin(L"LISTBOX1");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_LISTBOX, 1, 5,true, 2, 0);
excel.DrawingsShapeObjectAddAttribute(0,0,6,1,4,16);
excel.DrawingsShapeObjectAddFormulaRange(L"Test2!A1:A10");
excel.DrawingsShapeObjectAddFormulaLink(1,5);
excel.DrawingsShapeObjectAddSelType(OXP_CONTROL_SELTYPE_SINGLE);
excel.DrawingsShapeObjectAddLCT(OXP_CONTROL_LCT_NORMAL);
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeEnd();
excel.DrawingsShapeBegin(L"GROUPBOX1");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_GROUPBOX, 1, 6,true, 0, 1);
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeEnd();
excel.DrawingsShapeBegin(L"RADIO1");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_RADIO, 1, 6);
excel.DrawingsShapeObjectAddTextVAlign(OXP_ALIGN_VERT_CENTER);
excel.DrawingsShapeObjectAddFormulaLink(1,6);
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeAddText(L"OPTION1");
excel.DrawingsShapeEnd();
excel.DrawingsShapeBegin(L"RADIO2");
excel.DrawingsShapeObjectBegin(OXP_CONTROL_TYPE_RADIO, 1, 7);
excel.DrawingsShapeObjectAddTextVAlign(OXP_ALIGN_VERT_CENTER);
excel.DrawingsShapeObjectAddFormulaLink(1,6);
excel.DrawingsShapeObjectEnd();
excel.DrawingsShapeAddText(L"OPTION2");
excel.DrawingsShapeEnd();

excel.DrawingsEnd();
 

* 이걸 제작할 당시에는 오픈소스가 없었는데 지금은 널렸네요. 풀소스를 공유하고 싶은데 너무 오래된거라 찾을수가 없네요.

'solution' 카테고리의 다른 글

오토캐드(DXF) 뷰어  (0) 2023.03.22
Socket wrapper (C/C++, JAVA)  (2) 2023.03.22

Socket을 이용한 통신시 type과 buffering, String의 인코딩등등 신경쓸것이 한두가지가 아니다. 이런 작업들을 모두 모아서 관련 Wrapping class를 구성하였다.

 

1. 사용자가 단편 데이타를 읽고 써도 내부적으로 자동 버퍼링 ( 속도향상 )

2. 기본 데이타 타입 지원 ( boolean , integer, string, double, long 등)

3. 기본 바이너리 송수신으로 string변환에 따른 오버헤드감소 ( 속도향상 )

4. Unicode 지원및 자동 변환으로 이종간 스트링 변환에서 해방

5. JAVA 지원으로 이종간 통신편리

6. Transportable Class 지원으로 사용자 정의 Object 송수신

 

class CXSocket : public CXObject
{
public:
    class CTransable{
        friend CXSocket;
    protected:
        virtual unsigned int TR_Length (CXSocket * pSock) = 0;
        virtual unsigned int TR_Read (CXSocket * pSock) = 0;
        virtual unsigned int TR_Write (CXSocket * pSock) = 0;
    };
public:
    enum TYPE{
        TYPE_BOOLEAN = 0,
        TYPE_INTEGER,
        TYPE_STRING,
        TYPE_DOUBLE,
        TYPE_LONG,
        TYPE_OBJECT
    };
public:
    struct BUFFERS{
        int m_remain;
        int m_pos;
        char m_buffer[1024 * 8];
        BUFFERS() : m_remain(0), m_pos(0){}
    } m_buffers[2];
private:
	char m_utf8buf[1024];
public:
	BOOL m_oConnected;
	SOCKET m_sock;
public:
	CXSocket(SOCKET sock = INVALID_SOCKET);
	virtual ~CXSocket(void);
public:
    virtual int AsyncSelect(long timeVal = 500);
    virtual void Close(void);
    virtual bool Connect(LPCTSTR lpszHostAddress, UINT nHostPort);
    virtual bool Connect(const sockaddr* pSockAddr, int sockAddrLen);
public:
	void Attach(SOCKET sock);
protected:
    unsigned int ReadBuffer(void * data, unsigned int len, const bool full = false);
    unsigned int Read(void * data, unsigned int len);
public:
    inline unsigned int Length(bool data) { return 1; };
    inline unsigned int Length(short data) { return sizeof(short); };
    inline unsigned int Length(int data) { return sizeof(int); };
    inline unsigned int Length(double data) { return sizeof(double); };
    inline unsigned int Length(long long data) { return sizeof(long long); };
    inline  unsigned int Length(unsigned int data) { return sizeof(unsigned int); };
    inline unsigned int Length(char * data, unsigned int len) { return len; };
    inline unsigned int Length(char * data) { return strlen(data); };
    unsigned int Length(wchar_t * data, unsigned int len);
    inline unsigned int Length(wchar_t * data) { return Length(data, wcslen(data)); };
    inline unsigned int Length(CString & str) { return Length(str.GetBuffer(0), str.GetLength()); };
    inline unsigned int Length(struct tm & tm) { return sizeof(tm); };
public:
    unsigned int Read(bool * data);
    unsigned int Read(short * data);
    unsigned int Read(int * data);
    unsigned int Read(unsigned int * data);
    unsigned int Read(double * data);
    unsigned int Read(long long * data);
    unsigned int Read(struct tm * data);
    unsigned int Read(char * data, unsigned int * len = NULL);
    unsigned int Read(wchar_t * data, unsigned int * len = NULL);
    unsigned int Read(CString & str);
    unsigned int Read(CTransable & obj);
public:
	TYPE ReadType(void);
protected:
    unsigned int WriteBuffer(const void * data, unsigned int len);
    unsigned int Write(void * data, unsigned int len);
public:
    void WriteBufferFlush(void);
    unsigned int Write(bool data);
    unsigned int Write(short data);
    unsigned int Write(int data);
    unsigned int Write(double data);
    unsigned int Write(long long data);
    unsigned int Write(unsigned int data);
    unsigned int Write(struct tm data);
    unsigned int Write(char * data, unsigned int len);
    unsigned int Write(char * data);
    unsigned int Write(wchar_t * data, unsigned int len);
    unsigned int Write(wchar_t * data);
    unsigned int Write(CString & str);
    unsigned int Write(CTransable & obj);
public:
    unsigned int WriteType(TYPE type);
    void Discard(unsigned int size);
};

 


Custom class 정의밑 사용

class CXMMLogin : CXSocket::CTransable
{
public:
    CString m_loginid;
    CString m_password;
public:
    CXMMLogin() : CXMMPacket(CXMM_CMD_LOGIN){};
    CXMMLogin(HWND sender, LPCTSTR id, LPCTSTR pw)
    : CXMMPacket((LONGLONG)sender, CXMM_CMD_LOGIN), m_loginid(id), m_password(pw) 
    {}
public:
    virtual unsigned int TR_Length(CXSocket * pSock)
    {
        unsigned int len = 0;
        len += pSock->Length(m_loginid);
        len += pSock->Length(m_password);
        return len;
    }

    virtual unsigned int TR_Read(CXSocket * pSock)
    {
        unsigned int len = 0;
        len += pSock->Read(m_loginid);
        len += pSock->Read(m_password);
        return len;
    }

    virtual unsigned int TR_Write(CXSocket * pSock)
    {
        unsigned int len = 0;
        len += pSock->Write(m_loginid);
        len += pSock->Write(m_password);

        return len;
    }
};

 

데이타 타입 그대로 3개의 virtual function 지정후

CXMMLogin login;

socket.Read(login);
socket.Write(login);

으로 데이타 송수신


소켓 통신의 개발속도와 안정성 강화됨

 

* 별도 추가모듈로 HTTP통신 가능 ( 웹어플리케이션과 C/C++ Application간 통신지원)

 

* Full Source를 공개해 볼까 했는데 너무 오래된 놈이라 소스가 없네요. 요즘은 별로 사용할 일이 없는 소스기도 하고~~~

'solution' 카테고리의 다른 글

오토캐드(DXF) 뷰어  (0) 2023.03.22
MS-EXCEL Builder  (0) 2023.03.22

+ Recent posts