블로그 이미지
진연
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

 2. 라인그려보기

안녕하세요..^^
오늘 진도를 좀더 나가 볼까요?

보통 프로그램 책들을 보면 처음에 "Hello XXX"라는 프로그램을 예제로 많이 사용하는데 우리는 "Hello XXX" 대신 라인을 하번 그려보겠습니다.

먼저 원하는 이름으로 프로젝트를 만드세요. 잘 모르시면 [UG Open.API 프로그램 시작하기 1] 를 다시 한번 보시기 바랍니다. 저는 "basic_line"이라는 이름으로 프로젝트를 만들었습니다.

프로젝트를 만드셨으면 라인을 그리기 위해 몇줄의 코드를 추가 해주어야 합니다.

아래 프로그램은 100mm의 길이를 가지는 라인을 생성하는 예제 입니다. 빨강색 글자로 표현된것은 새로 추가한 코드 입니다.

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

#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>

/*
*****************************************************************************
Line을 생성하는 함수가 들어있는 Header File 추가
*****************************************************************************
*/

#include <UF_CURVE.H>

/*
*****************************************************************************
약속대로 Error Message를 보여주는 함수를 제사 사용하는것으로 변경해봤습니다.
원하시면 사용해 보세요.
*****************************************************************************
*/
#define UF_CALL(X) (report_error( __FILE__, __LINE__, #X, (X)))

static int report_error( char *file, int line, char *call, int irc)
{
   if (irc)
   {
      char err[133], msg[133];

      UF_get_fail_message(irc, err);
      sprintf(msg, "error %d at line %d in %s", irc, line, file);

      if (!UF_UI_open_listing_window())
      {
          UF_UI_write_listing_window(err);
          UF_UI_write_listing_window("\n");
          UF_UI_write_listing_window(msg);
          UF_UI_write_listing_window("\n");
          UF_UI_write_listing_window(call);
          UF_UI_write_listing_window(";\n\n");
      }
      else {}
   }

   return(irc);
}

/*
*****************************************************************************
이곳에 대한 설명을 아래에...
*****************************************************************************
*/

extern DllExport void ufsta( char *param, int *returnCode, int rlen )
{
   int rtn;
   
UF_CURVE_line_t line_coords;
   tag_t line_tag;


   if( UF_CALL(UF_initialize()) ) { return; }

   line_coords.start_point[0] = 0.;
   line_coords.start_point[1] = 0.;
   line_coords.start_point[2] = 0.;

   line_coords.end_point[0] = 100.;
   line_coords.end_point[1] = 0.;
   line_coords.end_point[2] = 0.;

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

 
 UF_CALL(UF_terminate());
}

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

라인을 그리기 위해서 11줄이 추가 되었습니다. 한번 볼까요?

- curve에 관련된 함수가 들어있는 Header File입니다. UG Opne/API에서 가장 어려운점은 자신이 필요한 함수를 찾는 일입니다. 다시한번 말씀드리지만 UG NX3 Document -> NX Open -> Open C Reference Guide를 보시면 각종 Header File이 나와있고, 링크를 들어가 보면 Type, Function에 대한 설명이 나와 있습니다.
#include

- return value를 받기 위한 변수입니다.
int rtn;

- 라인을 그리기 위해 사용할 구조체 입니다.
UF_CURVE_line_t line_coords;

- 생성된 라인의 테그를 받기 위한 변수입니다. 여기서 테그라는 말이 나오는데 이는 UG에서 Object를 식별하기 위한 고유 번호 입니다. UG에서 다루는 모든것을은 이 테그를 하나씩 가지고 있습니다.
tag_t line_tag; 

- 구조체 변수에 라인을 그리기 위한 좌표를 입력합니다. 라인을 그리기 위해 사용하는 좌표는 절대좌표(ABS)입니다.
line_coords.start_point[0] = 0.;
line_coords.start_point[1] = 0.;
line_coords.start_point[2] = 0.;

line_coords.end_point[0] = 100.;
line_coords.end_point[1] = 0.;
line_coords.end_point[2] = 0.;

- 라인을 생성하는 API함수에 "line_coords"를 입력하고, line tag를 받아옵니다. 이 과정이 일어나는 순간에 UG화면에는 라인이 하나 그려져 있을겁니다.
rtn = UF_CALL(UF_CURVE_create_line (&line_coords, &line_tag));

아래 내용은 UG NX3 Document -> NX Open -> Open C Reference Guide에 있는 원문을 그대로 옮긴 것입니다.

//------------------------------------------------------------------------------------
Creates a line. You input the start and end points of the line by filling
out the line_coords data structure pointed to by UF_CURVE_line_p_t.

See Also
UF_CURVE_line_p_t

extern int UF_CURVE_create_line (UF_CURVE_line_p_t line_coords, tag_t * line );

UF_CURVE_line_p_t    
line_coords    Input   Coordinates of line in  absolute space

tag_t *                       line              Output  Object identifier Of new line

struct UF_CURVE_line_s

Data Members

start_point
double start_point[ 3 ] - line start point
end_point
double end_point[ 3 ] - line end point
//------------------------------------------------------------------------------------

프로그램 코딩이 끝났으면 빌드->basic_line 빌드를 실행합니다. 특별히 변경한 내용이 없으시다면 프로젝트가 저장되어 있는 폴더안에 Debug라는 폴더가 있습니다. 이 폴더 안으로 들어가 보시면 basic_line.dll 이 만들어져 있습니다.

다시 Visual Studio로 돌아와서 디버그->시작(F5)를 누르시면 실행파일 이름을 물어봅니다. 이곳에"{UG_BASE_DIR}\UGII\ugraf.exe"를 입력하고, 확인 버튼을 누르면 UG가 실행됩니다.



UG가 실행되면 새로운 파트 파일을 엽니다, 그리고, File->Execute->NX Open(Ctrl+U)를 선택하면 DLL파일을 선택할 수 있는 Dialog가 실행됩니다. 여기서 여러분이 만드(basic_line.dll)를 선택하고 확인을 누르면 확면에 라인이 그려진것을 확인 할 수 있습니다.

오늘 여러분은 UG에 무엇인가를 그려보셨습니다. uf_curve.h 파일 안에는 여러가지 커브를 생성하는 함수가 들어 있습니다. 연습삼아 이것저것 만들어 보시기 바랍니다. 백문이불여일행 입니다. 안해보시면 절대 이해 못하십니다. 꼭 직접해보세요..^^

여기까지 입니다. 다음에는 line그리는것 가지고 응용을 해보겠습니다...
그럼...


 

posted by 진연