/* ******************************************************************************** ** ** GetStructAssembly.c ** ** Copyright (c)2007 ITOCHU Techno-Solutions Corporation ** ******************************************************************************** */ /* ====================================================================== 注)パートファイル(アセンブリ)がオープンされて、表示パートとなって いることを前提とします。 ====================================================================== */ /* ============================================================ */ /* インクルード・ファイル */ #include #include #include #include #include /* ============================================================ */ /* 関数宣言 */ /* ---------------+-----------------------+------------------------ */ /* 型 | 関数名 | 引数 */ /* ---------------+-----------------------+------------------------ */ /* アセンブリ構成取得関数 */ static void fctTest (); /* 子コンポーネント検索関数 */ static int fctGetCommpornent (tag_t atagOcc, int aintHierarchy, int * aintPartCnt); /* ============================================================ */ /* ユーザイグジット */ /* NX のメニュー「ファイル」→「UG/openの実行」→「ユーザファンクション」で */ /* 呼び出される。 */ extern DllExport void ufusr( char *parm, int *returnCode, int rlen ) { /* ---------------------------------------- */ /* Open/APIイニシャライズ */ int errorCode = UF_initialize(); if ( 0 == errorCode ) { /* TODO: Add your application code here */ /* ---------------------------------------- */ /* アセンブリ構成取得関数 */ fctTest(); /* ---------------------------------------- */ /* Open/API終了 */ errorCode = UF_terminate(); } } /* ============================================================ */ /* アセンブリ構成取得関数 */ static void fctTest() { tag_t tagDispPart = NULL_TAG; /* 表示パート */ tag_t tagRootOcc = NULL_TAG; /* 表示パートのルートオカレンス */ int intI = 0; int intHierarchy = 0; /* 階層 */ int intPartCnt = 0; /* 子の総数 */ /* ---------------------------------------- */ /* 表示パートを取得します。 */ tagDispPart = UF_PART_ask_display_part(); /* ------------------------------ */ /* 表示パートのルートパートオカレンスを取得します */ tagRootOcc = UF_ASSEM_ask_root_part_occ(tagDispPart); /* ------------------------------ */ /* ルートパートオカレンスが取得できたらアセンブリとします */ intPartCnt = 0; if (NULL_TAG != tagRootOcc) { /* ----- アセンブリです */ /* ------------------------------ */ /* 階層を初期化します */ intHierarchy = 0; /* ------------------------------ */ /* パート数を初期化します */ intPartCnt = 0; /* ------------------------------ */ /* コンポーネントを検索します */ if (0 != fctGetCommpornent(tagRootOcc, intHierarchy, &intPartCnt)) { /* NG */ return; } } else { /* ----- アセンブリではない */ } return; } /* ============================================================ */ /* 子コンポーネント検索関数 */ static int fctGetCommpornent(tag_t atagOcc, int aintHierarchy, int * aintPartCnt) { tag_t tagProtPart = NULL_TAG; char chrPartName[256] = ""; /* パートファイル名 */ FILE * filStream = NULL; /* ファイル構造体 */ int intChildNum = 0; /* 子の数 */ tag_t * tagChild = NULL; /* 子のタグ */ int intI = 0; char chrMsg[256] = ""; /* ------------------------------ */ /* パートオカレンスのプロトタイプを取得します */ tagProtPart = UF_ASSEM_ask_prototype_of_occ(atagOcc); /* ------------------------------ */ /* プロトタイプからパート名を取得します */ if (0 != UF_PART_ask_part_name(tagProtPart, chrPartName)) { /* NG */ MessageBox(NULL, "UF_PART_ask_part_name() NG!", "", MB_OK); return -1; } /* ------------------------------ */ /* ファイルを追加モードでオープンします */ filStream = fopen("c:\\temp\\Sample02.txt", "a"); /* ------------------------------ */ /* インデントをします */ for (intI = 0; intI < aintHierarchy; intI++) { /* ------------------------------ */ fprintf(filStream, "\t"); } /* ------------------------------ */ /* ファイルにパートファイル名を書き込みます */ fprintf(filStream, "%s\n", chrPartName); /* ------------------------------ */ /* ファイルを閉じます */ fclose(filStream); /* ------------------------------ */ /* 階層をカウントします */ aintHierarchy++; /* ------------------------------ */ /* パートを数カウントします */ (* aintPartCnt)++; /* ------------------------------ */ /* 子パートオカレンスタグを取得します */ intChildNum = UF_ASSEM_ask_part_occ_children( atagOcc, &tagChild); /* ------------------------------ */ /* 子を検索します */ for (intI = 0; intI < intChildNum; intI++) { /* ------------------------------ */ /* 子コンポーネントを検索します */ if (0 != fctGetCommpornent(tagChild[intI], aintHierarchy, aintPartCnt)) { /* NG */ /* ------------------------------ */ /* メモリを開放します */ UF_free(tagChild); return -1; } } /* ------------------------------ */ /* メモリを開放します */ UF_free(tagChild); return 0; }