블로그 이미지
진연
3차원 CAD프로그램인 UGS에서 지원하는 API를 이용하여 프로그램하는 방법등을 소개하는 블로그입니다. 혹시 연락이 필요하신분은 youni7311@hanmail.net로 메일 보내주세요..

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

'NX Open for C/C++/초급 강좌'에 해당되는 글 8

  1. 2007.03.08 7. UG Interface Styler(2)2

7. UG Interface Styler(2)

안녕하세요... 이번주에는 일이 조금 바쁜 관계로 오래간만에 올립니다..

오늘은 UG Interface Styler 2탄 입니다. 저번시간에 약속했듯이 UG Interface Styler를 이용해서 라인그리는 기능을 완성해 보겠습니다.. 아래 순서대로 한번 따라 해보시기 바랍니다...^^

1. Visual Studio .NET을 실행하고, NX3 Open Wizard를 이용해서 새 프로젝트를 만드세요.. 저는 basic_line2라는 이름으로 프로젝트를 만들었습니다.


2. basic_line2.h 파일을 하나 생성해서 추가합니다. 그리고, basic_line2.cpp파일 상단에 #include "basic_line2.h"를 추가합니다.


3. 지난번에 Dialog를 만들고, 저장하면 자동으로 생성되는 파일 (basic_line_template.c, basic_line.h)를 메모장으로 오픈합니다. 혹시 모르시면 [UG Open/API 프로그램 시작하기 6]을 다시 한번 읽어보세요...


4. basic_line.h 파일 안에 내용을 모두 복사해서 basic_line2.h파일에 옮기고, 아래과 같이 일부를 수정합니다.

#ifndef BASIC_LINE_H_INCLUDED -> #ifndef BASIC_LINE2_H_INCLUDED
#define BASIC_LINE_H_INCLUDED -> #define BASIC_LINE2_H_INCLUDED

5. basic_line_template.c 파일에서는 아래 코드에서 발간색으로 표시한 부분만 복사헤서 basic_line2.cpp파일로 가져옵니다. 참고로 아래 코드는 주석이나 설명에 필요없는 코드는 삭제 했습니다.

/*****************************************************************************
**
** basic_line2.cpp
**
** Description:
** Contains Unigraphics entry points for the application.
**
*****************************************************************************/

/* Include files */
#if ! defined ( __hp9000s800 ) && ! defined ( __sgi ) && ! defined ( __sun )
# include <strstream>
# include <iostream>
using std::ostrstream;
using std::endl;
using std::ends;
using std::cerr;
#else
# include <strstream.h>
# include <iostream.h>
#endif

#include <uf.h>
#include <uf_ui.h>
#include <uf_exit.h>

#include <stdio.h>
#include <uf_defs.h>
#include <uf_styler.h>
#include <uf_mb.h>
#include <uf_curve.h>

#define BASIC_LINE_DLG_CB_COUNT ( 4 + 1 ) /* Add 1 for the terminator */

static UF_STYLER_callback_info_t BASIC_LINE_DLG_cbs[BASIC_LINE_DLG_CB_COUNT] =
{
   {UF_STYLER_DIALOG_INDEX, UF_STYLER_CONSTRUCTOR_CB , 0,    BASIC_LINE_DLG_constructor_cb},
   {UF_STYLER_DIALOG_INDEX, UF_STYLER_OK_CB , 0, BASIC_LINE_DLG_ok_cb},
   {UF_STYLER_DIALOG_INDEX, UF_STYLER_APPLY_CB , 0, BASIC_LINE_DLG_apply_cb},
   {UF_STYLER_DIALOG_INDEX, UF_STYLER_CANCEL_CB , 0,     
   BASIC_LINE_DLG_cancel_cb},
   {UF_STYLER_NULL_OBJECT, UF_STYLER_NO_CB, 0, 0 }
};

int BASIC_LINE_DLG_constructor_cb ( int dialog_id, void * client_data,
                                    UF_STYLER_item_value_type_p_t callback_data)
{
   if ( UF_initialize() != 0)
      return ( UF_UI_CB_CONTINUE_DIALOG );

   UF_terminate ();

   return (UF_UI_CB_CONTINUE_DIALOG);
}

int BASIC_LINE_DLG_ok_cb ( int dialog_id, void * client_data,
                            UF_STYLER_item_value_type_p_t callback_data)
{
   if ( UF_initialize() != 0)
      return ( UF_UI_CB_CONTINUE_DIALOG );

   UF_terminate ();

   return (UF_UI_CB_EXIT_DIALOG);

}

int BASIC_LINE_DLG_apply_cb ( int dialog_id, void * client_data,
                               UF_STYLER_item_value_type_p_t callback_data)
{
   if ( UF_initialize() != 0)
      return ( UF_UI_CB_CONTINUE_DIALOG );

   UF_terminate ();

   return (UF_UI_CB_CONTINUE_DIALOG);
}

int BASIC_LINE_DLG_cancel_cb ( int dialog_id, void * client_data,
                                UF_STYLER_item_value_type_p_t callback_data)
{
   if ( UF_initialize() != 0)
      return ( UF_UI_CB_CONTINUE_DIALOG );

   UF_terminate ();

   return ( UF_UI_CB_EXIT_DIALOG );
}

extern DllExport void ufusr( char *param, int *returnCode, int rlen )
{

   if( UF_CALL(UF_initialize()) ) return;

   UF_CALL(UF_terminate());
}

extern int ufusr_ask_unload( void )
{
   return( UF_UNLOAD_UG_TERMINATE );
}


6. 이번에는 Dialog를 오픈하는 함수를 추가해 보겠습니다. basic_line_template.c파일을 열면 아래과 같은 함수를 찾을 수 있습니다. 살짝 복사해서 ufusr함수 안에 붙혀 넣습니다.

UF_STYLER_create_dialog("basic_line.dlg", BASIC_LINE_DLG_cbs,  
                                       BASIC_LINE_DLG_CB_COUNT, NULL, &response)


7. 그리고 나서 ufusr함수를 애래와 같이 수정해 주세요...^^ UF_UI_OK, UF_UI_BACK, UF_UI_CANCEL은 여기서 사용하지 않지만 리턴을 받아올 수 잇는 값들 입니다.

extern DllExport void ufusr( char *param, int *returnCode, int rlen )
{
   
int rtn;

   if( UF_CALL(UF_initialize()) ) return;

   UF_STYLER_create_dialog("basic_line.dlg", BASIC_LINE_DLG_cbs,
                             BASIC_LINE_DLG_CB_COUNT, NULL, &rtn);


   //if(rtn == UF_UI_CANCEL)
   //if(rtn == UF_UI_OK)
   //if(rtn == UF_UI_BACK)

   UF_CALL(UF_terminate());
}

8. 이제는 라인을 그려야 겠죠..^^ 좌표를 입력하고 OK 혹은 Apply버튼을 누르면 라인이 하나 생성하도록 만들겠습니다. 그러기 위핸서 아래과 같이 2개의 함수를 추가 합니다. 아래 함수는 Dialog에 Real 아이템에서 값을 받아오거나 설정할 때 사용합니다. Dilog(Styler)에서 값을 가져오거나 설정하는 방법은 다음에 설명하겠습니다.

double get_real_from_styler(int dialog_id, char *item_id)
{
   int rtn;
   double real;

   UF_STYLER_item_value_type_t item_value;

   item_value.item_id = item_id;
   item_value.item_attr = UF_STYLER_VALUE;

   rtn = UF_CALL(UF_STYLER_ask_value(dialog_id, &item_value));
   if(rtn != 0)
      return -1;

   real = item_value.value.real;

   UF_STYLER_free_value(&item_value);

   return real;
}

void set_real_to_styler(int dialog_id, char *item_id, double real)
{
   UF_STYLER_item_value_type_t item_value;

   item_value.item_id = item_id;
   item_value.item_attr = UF_STYLER_VALUE;
   item_value.value.real = real;
   item_value.count = 1;

   UF_CALL(UF_STYLER_set_value(dialog_id, &item_value));

   return;
}

9. BASIC_LINE_DLG_constructor_cb 함수 부터 코딩 해보겠습니다. 이 콜백은 Dialog가 처은 실행 될 때 한번 호출하는 함수 있니다. 그레서 보통 이곳에는 초기화 하는 코드를 많이 사용합니다. 그래서 우리도 Real 아이템을 초기화하겠습니다.

int BASIC_LINE_DLG_constructor_cb ( int dialog_id, void * client_data,
                                    UF_STYLER_item_value_type_p_t callback_data)
{
   if ( UF_initialize() != 0)
      return ( UF_UI_CB_CONTINUE_DIALOG );

   set_real_to_styler(dialog_id, BASIC_LINE_DLG_REAL_START_XC, 0.0);
   set_real_to_styler(dialog_id, BASIC_LINE_DLG_REAL_START_YC, 0.0);
   set_real_to_styler(dialog_id, BASIC_LINE_DLG_REAL_START_ZC, 0.0);

   set_real_to_styler(dialog_id, BASIC_LINE_DLG_REAL_END_XC, 10.0);
   set_real_to_styler(dialog_id, BASIC_LINE_DLG_REAL_END_YC, 10.0);
   set_real_to_styler(dialog_id, BASIC_LINE_DLG_REAL_END_ZC, 10.0);

UF_terminate ();

return (UF_UI_CB_CONTINUE_DIALOG);
}

10. 초기화를 했으면 라인을 그리는 코드를 만들어 보죠.. 라인은 OK버튼이 클릭되었을 때 생성되야 함으로 BASIC_LINE_DLG_ok_cb에 코딩을 하시면 됩니다.

int BASIC_LINE_DLG_ok_cb ( int dialog_id, void * client_data,
                            UF_STYLER_item_value_type_p_t callback_data)
{
 
 tag_t line_tag;
   UF_CURVE_line_t line_coords;

  if ( UF_initialize() != 0)
      return ( UF_UI_CB_CONTINUE_DIALOG );

  line_coords.start_point[0] = get_real_from_styler(dialog_id,     
                                                                       BASIC_LINE_DLG_REAL_START_XC);
   line_coords.start_point[1] = get_real_from_styler(dialog_id,

                                                                        BASIC_LINE_DLG_REAL_START_YC);
   line_coords.start_point[2] = get_real_from_styler(dialog_id,
                                                                       BASIC_LINE_DLG_REAL_START_ZC);


   line_coords.end_point[0] = get_real_from_styler(dialog_id,
                                                                       BASIC_LINE_DLG_REAL_END_XC);
   line_coords.end_point[1] = get_real_from_styler(dialog_id,
                                                                       BASIC_LINE_DLG_REAL_END_YC);
   line_coords.end_point[2] = get_real_from_styler(dialog_id,
                                                                       BASIC_LINE_DLG_REAL_END_ZC);

   UF_CALL(UF_CURVE_create_line (&line_coords, &line_tag));

   UF_terminate ();

   return (UF_UI_CB_EXIT_DIALOG);
}

11. Apply버튼을 클릭했을 때도 라인을 생성하고 싶으면 위와 동일한 코드를 BASIC_LINE_DLG_apply_cb에 작성하면 됩니다.

여기까지 입니다... basic_line.dlg파일은 Application폴더에 저장하고, 컴파일 한 DLL 파일은 Startup 폴더에 저장하시고 테스틑를 해보시기 바랍니다. 라인이 생성 되셨습니까..? 안되시는분들은 천천히 다시 한번 해보세요...^^ 아니면 첨부한 소스파일을 참고 하시면 됩니다...

다음에는 UG Interface Styler에 대해 몇가지 추가로 설명하겠습니다.. 기대해 주시구요... 저도 퇴근해야 겠네요..

그럼 다음에 뵙겠습니다...^^

posted by 진연
prev 1 2 3 4 5 ··· 8 next