Example #1
0
int VariantToDoubleArray(double **data, VARIANT *var)
{
	long uBnd,lBnd;
	int dim, dimlen[MAXDIM];
	int err=0;
	
	// Check for ARRAY of the right type
    logToFile((f, "VaraintToDoubleArray: var = 0x%p\n", var));
	if( var==NULL )						return COMUTIL_ERR_NULL;
    logToFile((f, "VaraintToDoubleArray: var.type = %d\n", var->vt));
	if (var->vt == VT_ERROR){
		*data = NULL;
		return 0;
	}
	if( !( (var->vt) & VT_ARRAY ) )		err += COMUTIL_ERR_ARRAY;
	if( !( (var->vt) & VT_R8 ) )		err += COMUTIL_ERR_TYPE;
	if(err) return err;
	
	// Get Overall Length (number of elements, ignore shape of Safearray)
	dim = SafeArrayGetDim(var->parray);
	for(int d=1; d<=dim; d++){
		SafeArrayGetLBound(var->parray, d, &lBnd);
		SafeArrayGetUBound(var->parray, d, &uBnd);
		dimlen[d-1] = uBnd-lBnd+1;
	}
	
    logToFile((f, "VaraintToDoubleArray: %d, (%d, %d)\n", dim, dimlen[0], dimlen[1]));

	*data = CreateDoubleArray(dim, dimlen);
	if (*data != NULL)
	{
		// Get reference pointer for accessing the SafeArray
		void *sap;
		if( FAILED( SafeArrayAccessData(var->parray, (void**)&sap) )) return COMUTIL_ERR_SAFEARRAY;
		memcpy(*data, sap, sizeof(double) * GetLength(*data));
		
		// Release reference pointer
		SafeArrayUnaccessData (var->parray);
	}
	// Return Success
	return 0;
}
Example #2
0
void CMatlabDlg3::Update()
{
    if (!m_IsShowing)
    {
        return;
    }

    if (m_PlaneTrueInput == NULL)
    {
        m_PlaneTrueInput = CreateDoubleArray(m_PlaneTrueDatas.size(), m_Size * MATLAB_DRAW_TRUE_DATA_SIZE, (const unsigned char *)NULL, 0, 0);
    // }
    // {
        double *data = mxGetPr(m_PlaneTrueInput);
        for (int plane = 0; plane < m_PlaneTrueDatas.size(); ++plane)
        {
            for (int pos = 0; pos < m_PlaneTrueDatas[plane].size(); ++pos)
            {
                data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 0) * m_PlaneTrueDatas.size() + plane] = m_PlaneTrueDatas[plane][pos].X;
                data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 1) * m_PlaneTrueDatas.size() + plane] = m_PlaneTrueDatas[plane][pos].Y;
                data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 2) * m_PlaneTrueDatas.size() + plane] = m_PlaneTrueDatas[plane][pos].Z;
            }
        }
    }
    if (m_TargetTrueInput == NULL)
    {
        m_TargetTrueInput = CreateDoubleArray(m_TargetTrueDatas.size(), m_Size * MATLAB_DRAW_TRUE_DATA_SIZE, (const unsigned char *)NULL, 0, 0);
    // }
    // {
        double *data = mxGetPr(m_TargetTrueInput);
        for (int target = 0; target < m_TargetTrueDatas.size(); ++target)
        {
            for (int pos = 0; pos < m_TargetTrueDatas[target].size(); ++pos)
            {
                data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 0) * m_TargetTrueDatas.size() + target] = m_TargetTrueDatas[target][pos].X;
                data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 1) * m_TargetTrueDatas.size() + target] = m_TargetTrueDatas[target][pos].Y;
                data[(pos * MATLAB_DRAW_TRUE_DATA_SIZE + 2) * m_TargetTrueDatas.size() + target] = m_TargetTrueDatas[target][pos].Z;
            }
        }
    }
    if (m_TargetFusionInput == NULL)
    {
        m_TargetFusionInput = CreateDoubleArray(m_TargetFusionDatas.size(), m_Size * MATLAB_DRAW_FUSION_DATA_SIZE, (const unsigned char *)NULL, 0, 0);
    // }
    // {
        double *data = mxGetPr(m_TargetFusionInput);
        for (int target = 0; target < m_TargetFusionDatas.size(); ++target)
        {
            for (int pos = 0; pos < m_TargetFusionDatas[target].size(); ++pos)
            {
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 0) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Pos.X;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 1) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Pos.Y;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 2) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Pos.Z;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 3) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Vel.X;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 4) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Vel.Y;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 5) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Vel.Z;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 6) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Acc.X;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 7) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Acc.Y;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 8) * m_TargetFusionDatas.size() + target] = m_TargetFusionDatas[target][pos].m_Acc.Z;
            }
        }
    }
    if (m_TargetFilterInput == NULL)
    {
        m_TargetFilterInput = CreateDoubleArray(m_TargetFilterDatas.size(), m_Size * MATLAB_DRAW_FUSION_DATA_SIZE, (const unsigned char *)NULL, 0, 0);
    // }
    // {
        double *data = mxGetPr(m_TargetFilterInput);
        for (int target = 0; target < m_TargetFilterDatas.size(); ++target)
        {
            for (int pos = 0; pos < m_TargetFilterDatas[target].size(); ++pos)
            {
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 0) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Pos.X;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 1) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Pos.Y;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 2) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Pos.Z;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 3) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Vel.X;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 4) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Vel.Y;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 5) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Vel.Z;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 6) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Acc.X;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 7) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Acc.Y;
                data[(pos * MATLAB_DRAW_FUSION_DATA_SIZE + 8) * m_TargetFilterDatas.size() + target] = m_TargetFilterDatas[target][pos].m_Acc.Z;
            }
        }
    }
    if (m_GlobalVarInput == NULL)
    {
        m_GlobalVarInput = CreateDoubleArray(PLANE_COUNT + TARGET_COUNT_MAX, GLOBAL_VAR_FRAME_SIZE, (const unsigned char *)NULL, 0, 0);
    // }
    // {
        double *data = mxGetPr(m_GlobalVarInput);
        for (int i = 0; i < PLANE_COUNT + TARGET_COUNT_MAX; ++i)
        {
            for (int j = 0; j < GLOBAL_VAR_FRAME_SIZE; ++j)
            {
                data[j * (PLANE_COUNT + TARGET_COUNT_MAX) + i] = g_GlobalVar[i].m_G[j];
            }
        }
    }
    vector<Array *> inputList;
    inputList.push_back(m_PlaneTrueInput);
    inputList.push_back(m_TargetTrueInput);
    inputList.push_back(m_TargetFusionInput);
    inputList.push_back(m_TargetFilterInput);
    inputList.push_back(m_GlobalVarInput);

    vector<Array *> outputList(1);

    bool result = m_MatlabFunc(0, &outputList[0], inputList.size(), &inputList[0]);
    if (!result)
    {
        CString msg;
        msg.AppendFormat(TEXT("函数%s调用失败."), m_FuncName);
        AfxMessageBox(msg);
    }
}