【MICROCADAM Helix ACCESSコアについて】
もうMICROCADAMから遠ざかって10年近くなります。
恐らく今後MICROCADAMを触ることもサポートすることもないでしょう。
Helixのアクセスコアプログラムも営業しながら夜寝る時間を惜しんで作ってました。しかしもうすっかり忘れちゃいました。
概略スキルだけ書き留めて置こうと思います。
今でもMICROCADAMを利用続けているユーザーは多いと思います。
ACCESSコアは難しそうなので手を出してない人もいると思います。
筆者はHelixが稼働する環境もないので概略だけ書きます。
・稼働環境
・VisualStudio(マイクロソフト無料版)をDWONLOAD,インストールします。
・Helixをインストールします。
HelixのバージョンはV5.2だったと思います。
今のバージョンは2018-r2ですね。
- 開発にはCソースPRGとDLLモジュールを作成するためのBATが必要です。
・Dxfconvというプログラムを作成する場合。
Dxfconv.c : ソースプログラム
Dxfconv.bat : コンパイルLINKするバッチ
Dxfconv.def : LINK定義ファイル
この3つのファイルが重要です。
ファイルの内容は以下です。
・DXFCONV.BATの内容
@ECHO OFF
SET ORG_INCLUDE=%INCLUDE%
SET ORG_LIB=%LIB%
SET ACCESS_PATH=C:\MCHelix\HDD\ACCESS
SET LIB=%ACCESS_PATH%;%LIB%;
SET INCLUDE=%ACCESS_PATH%;%INCLUDE%;
cl /c /W3 /J /MD /DWIN32 /D_NTSDK DXFCONV.C >XXX.TXT
notepad XXX.TXT
LIB? /MACHINE:IX86 /OUT:DXFCONV.LIB? /DEF:DXFCONV.DEF? > NUL
LINK @DXFCONV.LNK
MT -MANIFEST DXFCONV.DLL.MANIFEST -OUTPUTRESOURCE:DXFCONV.DLL;2
SET INCLUDE=%ORG_INCLUDE%
SET LIB=%ORG_LIB%
SET ORG_INCLUDE=
SET ORG_LIB=
SET ACCESS_PATH=
・DXFCONV.defの内容
LIBRARY DXFCONV
EXPORTS
ac2userp
・DXFCONV.Cの内容
MICROCADMの画面上から図面をCLOSEすることなく、画面上のMicroCadam図面情報をDXF変換し他のCADに渡して起動するプログラムです。
(シームレスにDXF変換PRGを起動させて他のCADを起動するプログラムです。)
非常に簡単に作成できますが、効果高いプログラムです。
/***********************************************************************
* MC->DXF TEST 処理 program *
* FILE NAME DXFCONV.C *
* function MC->DXF処理 *
***********************************************************************/
#include
#include
#include
#include
#include "accfnc.h"
/* POPUP */
/*
#define INCL_BLK_MSG1_NO1
#include "RYOCAM1_msg.dfn"
#include "RYOCAM1.dfn"
*/
/*============= Union of iarray for buadd,buget =======================*/
union ELM {
long iarray[20];
float rarray[20];
char carray[20][4];
};
static long icolr;
static double ctrx;
static double ctry;
#define PI 3.141593
#define INDXG ELM.iarray[0]
#define INDXS ELM.iarray[1]
#define INDXAS ELM.iarray[3]
#define INDXT ELM.iarray[4]
#define INDXM ELM.iarray[8]
#define COLMDL 2L
#define SELECT 1L
#define IND 2L
#define POPUP 7L
#define ATTRIB 1100L
#define DEFNUM "6"
#define DEFRAD "50"
#define DEFCOL "DEFAULT"
static FILE *fp_o;
static char *g_file_o = "c:\\DATA\\TEST\\OUTPUT.DAT";
static FILE *fp_c;
static char *g_file_c = "c:\\DATA\\TEST\\PROG.LOG";
static FILE *fp_i;
static FILE *fp_i2;
static char *g_file_i = "c:\\DATA\\TEST\\INPUT.DAT";
static FILE *fp_x;
static char *g_file_x = "WORK.DAT";
static FILE *fp_9;
static char *g_file_9 = "c:\\DATA\\TEST\\DEBUG.DAT";
#define MODEL1 1L
static double PAI=3.141593 ;
char *retc;
long ret ;
long mptr ;
static long IDBG ;
static char IDBG_S[]=" " ;
/**************************************************************************************/
/***** 処理開始 ******/
/**************************************************************************************/
void ac2userp( void )
{
long iflgar[3]; /* bubegn */
long ioutar[3]; /* bubegn */
long modear[3]; /* bumode */
long prsbtn; /* msgbox */
long mask[7]; /* event */
long event; /* event */
long nchar; /* poplbl_set */
long popno; /* popevent */
long objno; /* popevent */
long pevent; /* popevent */
long num; /* gatr */
long atrno; /* gatr */
long atrptr; /* gatr */
long itype; /* buget,elmsel */
long topelm; /* elmsel */
long toptyp; /* elmsel */
long subelm; /* elmsel */
long subtyp; /* elmsel */
long ivunum; /* buview */
long ivuid; /* buview */
long iparvu; /* buview */
float vaxar; /* buview */
float vmrxar; /* buview */
double vx; /* position */
double vy; /* position */
char drv;
char drv2;
char drv0;
unsigned char group[4]; /* buopen */
unsigned char user[6]; /* buopen */
/* unsigned char id[20]; /* buopen */
unsigned char text[31]; /* poplbl_set */
unsigned char group0[4]; /* buopen */
unsigned char user0[6]; /* buopen */
char wild;
char wid[20];
char id[2000];
char pnfn[20];
long iopt;
long skip;
long number;
long idata[100][20];
char cdata[100][116];
short ierr;
short iret;
long modno;
long mptr;
long curmdl = 1L;
long msgblk = 0L;
long popopn = 0L;
long msgno;
union ELM ELM;
long ii;
long lwork; /* 99.05.11 */
float fwork;
char cwork[]=" ";
drv = 'C';
memcpy( group, "CAD ", 4 );
memcpy( user, "TRAIN ", 6 );
memcpy( wid, "A???????????????????", 20 );
wild = '?';
skip = 0L;
number = 100L;
iopt = 1L;
#define scanf scanf_s
IDBG=0;
/**************************/
/* FILE READ */
/**************************/
/*
fscanf(fp_i2,"%s",XXXXX ) ;
fclose(fp_i2) ;
*/
/*
fscanf(fp_9,"%s",IDBG_S ) ;
IDBG = atoi(IDBG_S) ;
fclose(fp_9) ;
/****************************************/
iflgar[0] = 52L;
iflgar[1] = 1L;
iflgar[2] = 1L;
ierr = 1L;
iret = MC_bubegn ( 1L, iflgar, ioutar, ierr );
if( iret ) return;
modear[0] = 2L;
modear[1] = 0L;
modear[2] = 11L;
iret = MC_bumode ( 1L, modear, ierr );
if( iret ) goto exit;
iret = MC_budriv( 2L, MODEL1, &drv0, 12L ); /* 区画の問い合わせ */
if( iret ) goto exit;
iret = MC_curgrpusr_get( &drv0, group0, user0 );
iret = MC_curmdl( 1L, &modno ); /* Query */
ret = MC_buget ( 1L,MODEL1,mptr,&itype,GET.iarray,27L );
/* Add a reference parts */
long mptr;
long lenerr;
long ierrar[2];
short ret;
union {
long iarray[70];
float rarray[70];
double darray[35];
} ELM;
#define MODEL1 1L
#define PARTS 1720L
#define INDXG ELM.iarray[0]
#define INDXS ELM.iarray[1]
#define INDXAS ELM.iarray[3]
.
/*----- Global Information -----*/
ELM.iarray[INDXG] = 1L; /* Storage precision flag */
/*----- Specific Information -----*/
ELM.rarray[INDXS-1] = 10.0; /* X coordinate of pivot point */
ELM.rarray[INDXS ] = 10.0; /* Y coordinate of pivot point */
ELM.rarray[INDXS+1] = 0.0; /* Angle of rotation */
ELM.rarray[INDXS+2] = 1.0; /* Scale */
ELM.iarray[INDXS+3] = 0L; /* Mark option */
/*----- Parts Information -----*/
memcpy( ELM.carray[INDXAS-1], "CAD ", 4 );
memcpy( ELM.carray[INDXAS ], "TRAIN ", 6 );
memcpy( ELM.carray[INDXAS+2], "ACCESS PARTS ", 20 );
ret = MC_buadd( 1L, MODEL1, PARTS, ELM.iarray, &mptr, 1700L );
ret = MC_budspe( 2L,MODEL1,1L,&mptr,0L,&lenerr,ierrar,999L );
iret = MC_drwlst( iopt, drv, group, user, wild, wid, skip,
&number, id, idata[0], cdata[0] );
/*
ret = MC_bufile( 4L, MODEL1, group, user, id, 21L );
*/
drv2 = 'C' ;
iret = MC_budriv( 1L, MODEL1, &drv2, 13L );
if( iret ) goto exit;
/************** End of ACCESS ******************************************/
/* ret = MC_bufile( 4L, MODEL1, "cad ", "train ", "12345678901234567890", 21L ); */
ret = MC_bufile( 4L, MODEL1, "CAD ", "TRAIN ", "TEST DXF ", 21L );
drv2 = drv ;
iret = MC_budriv( 1L, MODEL1, &drv2, 13L );
if( iret ) goto exit;
*/
/* Drawing ID */
iret = MC_curgrpusr_set( drv0, group0, user0 ); /* PC */
ret = MC_rendrw( MODEL1,wid );
MC_buend ( 1L, ierr );
ret = system("c:\\mchelix\\hdd\\access\\dxfconv\\DXFM2.BAT") ;
/*ret = system("\mcadam\asa\dxfgm.bat") ;
*/
exit:
return;
}
ちょっとしたプログラムで仕事の効率をあげることができます。 プログラムがわからないから無理と言わないで設計部門に2人くらいプログラムがわかる人を育てると面白いことができると思います。 プログラムの細かい設計など必要ないし、その場で修正できるのがメリットだと思います。 ソフト会社に頼むと高いものになるし、修正追加も簡単ではありません。 是非是非!!
子供たちもプログラムの勉強をするみたいですしね・・・・・?。 お父さん頑張って!!
次回はAUTOCAD LTでのちょっとしたプログラミングを紹介します。