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 + -
显示快捷键?