english japanese german

UML2Cプラグイン

astah*で描いたクラス図のモデルから、C言語のスケルトンコードを出力するプラグインです。
Google C++ Mocking Framework (Google Mock)のコード出力も可能です。

   概要


   インストール

  1. 上記Downloadボタンからastah-uml2c-plugin-x.x.x.zip ファイルをダウンロードします。
  2. ダウンロードしたファイルを適当なフォルダに解凍します。
  3. 解凍したフォルダが含むuml2c-x.x.x.jarファイルとuml2cフォルダ(拡張子.vmの全ファイルを含む)を、下のディレクトリにコピーします。
    [ホームフォルダ]/.asta/[astahエディション名]/plugins
    astah uml2cプラグイン
  4. 次に表示されるメッセージに従ってastah*を再起動します。
    astahプラグイン
    ※[プラグイン]メニューは、バージョン7.2以降のみに存在します。 7.1以前をご利用の方はこちら。
  5. メインメニュー[ツール]配下に[UML2Cプラグイン]メニューが追加されていれば、インストールは完了です。

★テンプレートファイルについて

  • 拡張子.vmのファイルは、コード出力に必要なテンプレートファイルであり、次のパスへの配置が必要です。
    Windows %USERPROFILE%\.astah\[astahのエディション名]\plugins\uml2c\header.vm
    Mac / Linux $HOME/.astah/[astahのエディション名]/plugins/uml2c/header.vm
  • テンプレートファイルの文字コードは、UTF-8 としてください。

   利用方法

  1. クラス図を開き、出力対象のクラスを選択します。
    サンプルモデルを使ったコード出力例は こちらから。
  2. メインメニュー[ツール] - [UML2C プラグイン] - [Cスケルトンコード生成] (または[GoogleMock コード生成])を選択します。
    UML2cプラグイン
  3. コードの出力先フォルダを選択して[保存]ボタンを押します。
  4. 指定したフォルダ、もしくはプロジェクトファイルが存在するフォルダに出力されます。

   サンプルモデルを使った出力例

~/plugins/astah-uml2c-plugin/sampleフォルダ内にあるサンプルファイル「uml2c-plugin-sample.asta」を使った出力例です。
astah uml2cプラグイン


   シングルインスタンスモジュール

<<SingleInstance>>ステレオタイプをもつクラスを、シングルインスタンスモジュールとしてコード生成します。

★Fooクラスの出力例


astah uml2cプラグイン

★Foo.c

#include "Foo.h"


static EnumSample enumSample[ /* TODO */ ];
static Bar bar;
static Abstract *abstracts[ /* TODO */ ];
static Concrete concretes[ /* TODO */ ];


void Foo_Create(void)
{
	/* TODO */
}

void Foo_Destroy(void)
{
	/* TODO */
}

uint32_t Foo_Operation(const char *arg)
{
	/* TODO */
}

★Foo.h

#ifndef _FOO_H_
#define _FOO_H_
#ifdef __cplusplus
extern "C" {	/* } */
#endif


void Foo_Create(void);
void Foo_Destroy(void);
uint32_t Foo_Operation(const char *arg);


#ifdef __cplusplus
}
#endif
#endif	/* _FOO_H_ */

   マルチインスタンスモジュール

通常のクラスを、マルチインスタンスモジュールとしてコード生成します。

★Barクラスの出力例


astah uml2cプラグイン

★Bar.c

#include "Bar.h"


void Bar_Create(Bar self, uint64_t id, const char *name)
{
	/* TODO */
}

void Bar_Destroy(Bar self)
{
	/* TODO */
}

uint16_t Bar_Operation(Bar self)
{
	/* TODO */
}

★Bar.h

#ifndef _BAR_H_
#define _BAR_H_
#ifdef __cplusplus
extern "C" {	/* } */
#endif

typedef struct BarStruct *Bar;


void Bar_Create(Bar self, uint64_t id, const char *name);
void Bar_Destroy(Bar self);
uint16_t Bar_Operation(Bar self);

#include "BarPrivate.h"

#ifdef __cplusplus
}
#endif
#endif	/* _BAR_H_ */

★BarPrivate.h

#ifndef _BAR_PRIVATE_H_
#define _BAR_PRIVATE_H_
#ifdef __cplusplus
extern "C" {	/* } */
#endif


struct BarStruct {
	uint64_t id;
	char *name;
};


#ifdef __cplusplus
}
#endif
#endif	/* _BAR_PRIVATE_H_ */

   型による動的インターフェイス(スーパークラス)

Abstractなクラスを、型による動的インターフェイスとしてコード生成します。

★Abstractクラスの出力例

astah uml2cプラグイン

★Abstract.c

#include "Abstract.h"

void Abstract_Destroy(Abstract self)
{
	/* TODO */
}

uint8_t Abstract_Operation(Abstract self)
{
	/* TODO */
}

★Abstract.h

#ifndef _ABSTRACT_H_
#define _ABSTRACT_H_
#ifdef __cplusplus
extern "C" {	/* } */
#endif

typedef struct AbstractStruct *Abstract;


void Abstract_Destroy(Abstract self);
uint8_t Abstract_Operation(Abstract self);

#include "AbstractPrivate.h"

#ifdef __cplusplus
}
#endif
#endif	/* _ABSTRACT_H_ */

★AbstractPrivate.h

#ifndef _ABSTRACT_PRIVATE_H_
#define _ABSTRACT_PRIVATE_H_
#ifdef __cplusplus
extern "C" {	/* } */
#endif


typedef struct AbstractInterfaceStruct *AbstractInterface;


struct AbstractStruct {
	AbstractInterface vtable;
	uint64_t id;
	char *type;
};


typedef struct AbstractInterfaceStruct {
	void (*Destroy)(Abstract self);
	uint8_t (*Operation)(Abstract self);
};


#ifdef __cplusplus
}
#endif
#endif	/* _ABSTRACT_PRIVATE_H_ */