customdll.c

来自「proe5.0野火版下载(中文版免费下载)」· C语言 代码 · 共 321 行

C
321
字号
/******************************************************************************    Title:	CustomDll.c    Notice:     (c) Copyright 2001-2006 Parametric Technology Corporation    Purpose: 	Interface file for MDX custom loads support.    		This file must be included in the build for any		custom loads program.    History:    Date	  Build   Who    Vers  Comment========= ======= =====  ====  ================================================05-Apr-06 L-01-06 rnaik   $$1  Replaced malloc/free by wrapper functions07-Jan-07 L-01-24 zar/TAL $$2  Fixed problems with connection to MDX.******************************************************************************/#include <stdlib.h>#include "CustomDLL.h"#include "ProToolkitDll.h"#include "ProArray.h"#include "ProUtil.h"static ProToolkitDllHandle MDX_handle = NULL;extern int user_initialize( int argc, char *argv[], char *proe_vsn, char *build );extern void user_terminate(void);extern ProError ProMechanismDllHandleGet (ProToolkitDllHandle *);void PmLoadMechanism(void){    if (MDX_handle == NULL)       ProMechanismDllHandleGet (&MDX_handle);}/* ============================================================= *\FUNCTION:	user_initialize()PURPOSE:        User function Initialization\* ============================================================= */int user_initialize( int argc, char *argv[], char *proe_vsn, char *build )  {    static char         arg1[8];    int                 arg2 = 0;    PmLoadMechanism();    return (0);}void user_terminate(void){    /* // printf("user terminate called.\n"); */}int CLevalMeasure(char* measureName, double* MeasureValue){    PmLoadMechanism();    *MeasureValue  = 0.;    if (MDX_handle != NULL) {	ProError	pstatus, function_return;	ProArray	input_args;	ProArray	output_args;	ProArgument arg1, arg2;	char nameStr[64];	pstatus =  ProArrayAlloc(0, sizeof(ProArgument), 2, &input_args);	pstatus =  ProArrayAlloc(1, sizeof(ProArgument), 2, &output_args);	strcpy(nameStr, measureName);	ProStringToWstring(arg1.label, "CustomLoad");	arg1.value.type = PRO_VALUE_TYPE_STRING;	arg1.value.v.s = nameStr;	pstatus =  ProArrayObjectAdd(&input_args, 0, 1, &arg1);	if (pstatus != PRO_TK_NO_ERROR)	    return 1;	pstatus = ProToolkitTaskExecute(MDX_handle, 	    "PMCL_EvalMeasure",	    (ProArgument*)input_args, 	    (ProArgument**)&output_args, 	    &function_return);	if (pstatus != PRO_TK_NO_ERROR)	    return 1;	arg2 = ((ProArgument*)output_args)[0];	*MeasureValue = arg2.value.v.d;	ProArrayFree(&input_args);	ProArrayFree(&output_args);    } else {	return 1;    }    return 0;}int CLevalStateVariables(char* custLName, char* forceName, int numElem, double* stateVarArray){    /* // TODO move proarray stuff to UserEvalCustomLoad, then move this  */    /* // function to UserCustomLoad.c */    double retval;    PmLoadMechanism();    retval  = 0.;    if (MDX_handle != NULL) {	ProError	pstatus, function_return;	ProArray	input_args;	ProArray	output_args;	ProArgument 	arg1, arg2, arg3, arg4;	char 		nameStr[64];	char 		fNameStr[64];	pstatus =  ProArrayAlloc(4, sizeof(ProArgument), 4, &input_args);	pstatus =  ProArrayAlloc(0, sizeof(ProArgument), 2, &output_args);	strcpy(nameStr, custLName);	ProStringToWstring(arg1.label, "CustomLoad");	arg1.value.type = PRO_VALUE_TYPE_STRING;	arg1.value.v.s = nameStr;	pstatus =  ProArrayObjectAdd(&input_args, 0, 1, &arg1);	if (pstatus != PRO_TK_NO_ERROR)	    return 1;	arg2.value.type = PRO_VALUE_TYPE_INT;	arg2.value.v.i = numElem;	pstatus =  ProArrayObjectAdd(&input_args, 1, 1, &arg2);	if (pstatus != PRO_TK_NO_ERROR)	    return 1;	arg3.value.type = PRO_VALUE_TYPE_POINTER;	arg3.value.v.p = (void*)stateVarArray;	pstatus =  ProArrayObjectAdd(&input_args, 2, 1, &arg3);	if (pstatus != PRO_TK_NO_ERROR)	    return 1;	strcpy(fNameStr, forceName);	ProStringToWstring(arg4.label, "CustomLoad");	arg4.value.type = PRO_VALUE_TYPE_STRING;	arg4.value.v.s = fNameStr;	pstatus =  ProArrayObjectAdd(&input_args, 3, 1, &arg4);	if (pstatus != PRO_TK_NO_ERROR)	    return 1;	pstatus = ProToolkitTaskExecute(MDX_handle, 	    "PMCL_EvalStateVariables",	    (ProArgument*)input_args, (ProArgument**)&output_args, &function_return);	if (pstatus != PRO_TK_NO_ERROR)	    return 1;	ProArrayFree(&input_args);	ProArrayFree(&output_args);    } else {	return 1;    }    return 0;}extern ProError PRO_TK_DLL_EXPORT UserEvalCustomLoad(ProArgument* inputs, ProArgument** outputs){    double	CurrentTime, retval;    char*	CustomLoadName;    char*	ForceName;    int		status;    ProArgument arg1;    if (inputs[0].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    CustomLoadName = inputs[0].value.v.s;    if (inputs[1].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    ForceName = inputs[1].value.v.s;    if (inputs[2].value.type != PRO_VALUE_TYPE_DOUBLE)	return PRO_TK_GENERAL_ERROR;       CurrentTime = inputs[2].value.v.d;    status = CLUSEREvalCustomLoad(CustomLoadName, ForceName, CurrentTime, &retval);    if (status) {	return status;    }    arg1.value.type = PRO_VALUE_TYPE_DOUBLE;    arg1.value.v.d = retval;    (*outputs)[0] = arg1;        return PRO_TK_NO_ERROR;}extern ProError PRO_TK_DLL_EXPORT UserGetStateVariablesSize(ProArgument* inputs, ProArgument** outputs){    int		size;    char*	CustomLoadName;    char*	ForceName;    int		status;    if (inputs[0].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    CustomLoadName = inputs[0].value.v.s;    if (inputs[1].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    ForceName = inputs[1].value.v.s;    status = CLUSERGetStateVariablesSize(CustomLoadName, ForceName, &size);    if (status)	return status;    (*outputs)[0].value.v.i = size;    return PRO_TK_NO_ERROR;}extern ProError PRO_TK_DLL_EXPORT UserInitStateVariables (ProArgument* inputs, ProArgument** outputs){    char*	CustomLoadName;    char*	ForceName;    int		status;    double*	StateVar;    if (inputs[0].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    CustomLoadName = inputs[0].value.v.s;    if (inputs[1].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    ForceName = inputs[1].value.v.s;    if ((*outputs)[0].value.type != PRO_VALUE_TYPE_POINTER)	return PRO_TK_GENERAL_ERROR;    StateVar = (*outputs)[0].value.v.p;    status = CLUSERInitStateVariables(CustomLoadName, ForceName, StateVar);    if (status)	return status;   return PRO_TK_NO_ERROR;}extern ProError PRO_TK_DLL_EXPORT UserGetStateVariables (ProArgument* inputs, ProArgument** outputs){    double	CurrentTime;    char*	CustomLoadName;    char*	ForceName;    int		status;    double*	StateVar;    if (inputs[0].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    CustomLoadName = inputs[0].value.v.s;    if (inputs[1].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    ForceName = inputs[1].value.v.s;    if (inputs[2].value.type != PRO_VALUE_TYPE_DOUBLE)	return PRO_TK_GENERAL_ERROR;       CurrentTime = inputs[2].value.v.d;    if ((*outputs)[0].value.type != PRO_VALUE_TYPE_POINTER)	return PRO_TK_GENERAL_ERROR;    StateVar = (*outputs)[0].value.v.p;    status = CLUSERGetStateVariableDerivatives(CustomLoadName, ForceName, CurrentTime, StateVar);    if (status)	return (ProError)status;   return PRO_TK_NO_ERROR;}extern ProError PRO_TK_DLL_EXPORT UserDefineInit(ProArgument* inputs, ProArgument** outputs){    char*	CustomLoadName;    char*	ForceName;    int		status;    if (inputs[0].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    CustomLoadName = inputs[0].value.v.s;    if (inputs[1].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    ForceName = inputs[1].value.v.s;    status = CLUSERDefineInit(CustomLoadName, ForceName);    if (status)	return status;    return PRO_TK_NO_ERROR;}extern ProError PRO_TK_DLL_EXPORT UserRunInit(ProArgument* inputs, ProArgument** outputs){    char*	CustomLoadName;    char*	ForceName;    int		status;    if (inputs[0].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    CustomLoadName = inputs[0].value.v.s;    if (inputs[1].value.type != PRO_VALUE_TYPE_STRING)	return PRO_TK_GENERAL_ERROR;    ForceName = inputs[1].value.v.s;    status = CLUSERRunInit(CustomLoadName, ForceName);    if (status)	return status;    return PRO_TK_NO_ERROR;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?