viberation.cpp

来自「故障诊断工作涉及的领域相当广泛」· C++ 代码 · 共 314 行

CPP
314
字号
// viberation.cpp: implementation of the viberation class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "richtest.h"
#include "viberation.h"
#include "mymatrix_idl.h"
#include "mymatrix_idl_i.c"
#include "mclcommain.h"
#include "mclcomclass.h"
#include "testcom.h"
#include "testcom_i.c"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
class disp_conetor;
//const IID IID_IMWFlags = {0x0A295776,0x23A1,0x410a,{0x94,0xBD,0x0C,0x6C,0x61,0xB8,0x91,0xB7}};
const CLSID CLSID_MWFlags = {0x02730550,0xC3E2,0x4a60,{0xBA,0x7B,0x9A,0xBC,0xD4,0x81,0x25,0x0D}};
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
HRESULT __stdcall get_MWFlags(IMWFlags** ppFlags)
    {
        HRESULT hr = S_OK;       // Return code
		IMWFlags* m_pFlags;
        if (ppFlags == NULL)
            return E_INVALIDARG;
        *ppFlags = NULL;
        // If there is not one already allocated, creat a new one. Use lock to prevent
        // two threads from creating at same time.
        
            hr = CoCreateInstance(CLSID_MWFlags, NULL, CLSCTX_INPROC_SERVER, 
                                  IID_IMWFlags, (void**)&m_pFlags);
            
       *ppFlags=m_pFlags;
	   return S_OK;
        
    }
void mwArray2VARIANT(VARIANT* var,const mwArray& in)
{_MCLCONVERSION_FLAGS flags;
IMWFlags* pFlags = NULL;
        // Get Conversion flags
        if (FAILED(get_MWFlags(&pFlags)))
        {
            AfxMessageBox("Error getting data conversion flags");
           // return FALSE;
        }
        if (FAILED(GetConversionFlags(pFlags, &flags)))
        {
            AfxMessageBox("Error getting data conversion flags");
            //return FALSE;
        }
        pFlags->Release();
VariantInit(var);
mxArray2Variant(in.GetData(),var,&flags);
//V_VT(var)=VT_R8|VT_BYREF;
//var->pdblVal=in;
};
void VARIANT2mwArray(const VARIANT& var,mwArray* out)
{_MCLCONVERSION_FLAGS flags;
IMWFlags* pFlags = NULL;
        // Get Conversion flags
        if (FAILED(get_MWFlags(&pFlags)))
        {
            AfxMessageBox("Error getting data conversion flags");
           // return FALSE;
        }
        if (FAILED(GetConversionFlags(pFlags, &flags)))
        {
            AfxMessageBox("Error getting data conversion flags");
            //return FALSE;
        }
        pFlags->Release();
		mxArray* temp;
Variant2mxArray(&var,&temp,&flags);
*out=mwArray(temp);
//V_VT(var)=VT_R8|VT_BYREF;
//var->pdblVal=in;
};
viberation::viberation(const mydata* in,mydata* out)
{	M=*(in->pdata.mw);
	C=*(in->pdata.mw+1);
	K=*(in->pdata.mw+2);
	F=*(in->pdata.mw+3);
	this->out=out;
}
viberation::viberation(mydata* in_M, mydata* in_C, mydata* in_K, mydata* in_F,int in_n)
{int M_rank,K_rank,C_rank,F_rank;
	M_rank=sqrt(in_M->get_length());
	C_rank=sqrt(in_C->get_length());
	K_rank=sqrt(in_K->get_length());
	F_rank=in_F->get_length();
	input_correct=(M_rank==C_rank&&C_rank==K_rank&&K_rank==F_rank);
	input_correct&=M_rank*M_rank==in_M->get_length();
	if(input_correct)
	{
		n=M_rank;
		mwArray M1(n,n,in_M->pdata.dou),C1(n,n,in_C->pdata.dou),K1(n,n,in_K->pdata.dou),F1(n,n,in_F->pdata.dou);
		M.CopyInputArg(M1);
		C.CopyInputArg(C1);
		K.CopyInputArg(K1);
		F.CopyInputArg(F1);
		mwArray2VARIANT(&vM,M);
		mwArray2VARIANT(&vC,C);
		mwArray2VARIANT(&vK,K);
		mwArray2VARIANT(&vF,F);

	};
VariantInit(&vn);
V_VT(&vn)=VT_R8;
vn.dblVal=n;
}
viberation::~viberation()
{
	

}
 	 
BOOL viberation::go(mydata* bag)
{mwArray mi,mj,mk,ml;
	double i,j,k,l;
if(FAILED(CoInitialize(NULL)))
  AfxMessageBox("组件库初试化错误"); 
IUnknown* up;
Imymatrix* p;
IDispatch* dp;
HRESULT hr=CoCreateInstance(CLSID_mymatrix,NULL,CLSCTX_INPROC,IID_IUnknown,(void**)&up);
 hr=up->QueryInterface(IID_Imymatrix,(void**)&p);
 hr=up->QueryInterface(IID_IDispatch,(void**)&dp);
if(FAILED(hr))
	AfxMessageBox("没有找到矩阵组件"); 
	if(!input_correct)
		{AfxMessageBox("输入数据数量错误");
			return FALSE;
		};
	VARIANT var;
	double ddd[10],ttt[10];
//	mwArray mw(&vM);
	
	C.ExtractData(ddd);
	_MCLCONVERSION_FLAGS flags;
        IMWFlags* pFlags = NULL;
        // Get Conversion flags
        if (FAILED(get_MWFlags(&pFlags)))
        {
            AfxMessageBox("Error getting data conversion flags");
            return FALSE;
        }
        if (FAILED(GetConversionFlags(pFlags, &flags)))
        {
            AfxMessageBox("Error getting data conversion flags");
            return FALSE;
        }
        pFlags->Release();
		mxArray* here=NULL;
	VariantInit(&var);
	p->invmatrix(1,&var,vM,vC,vK);
	IMWComplex* pTemp = (IMWComplex*)var.pdispVal;//复数类型的接口 
	pTemp->get_MWFlags(&pFlags);
	Variant2mxArray(&var,&here,&flags);
	static mwArray hh1(here);
	double r[4],ii[4];
	hh1.ExtractData(r,ii);
	hh1.ExtractData(r,ii);
	VariantInit(&var);
	disp_conector it;
	disp_conector* pit=⁢
DWORD* dwp=(DWORD*)dp;
DWORD* vtable=(DWORD*)(*dwp);
DWORD* dw=(DWORD*)&(pit->p3i1o);
			*dw=*(vtable+9);
	//		pit->p3i1o=(p3i1ov)(*(vtable+9));
			it.p3i1o(dp,1,&var,vM,vC,vK);

Variant2mxArray(&var,&here,&flags);
	static mwArray hhh1(here);
	hhh1.ExtractData(r,ii);
	hhh1.ExtractData(r,ii);
	VariantInit(&var);
//hr=
//	Variant2mxArray(&var,&here,&flags);
//	static mwArray mm0(here);
	//	mm0.ExtractData(ddd,ttt);
	char chname[]="Imymatrix";
	CRuntimeClass eee;
	eee.m_lpszClassName=chname;
//	eee.CreateObject();


	VARIANT re[5];

	DISPID dspid;
	LPOLESTR name=L"invmatrix";
	char* ssss=(char*)name;
	hr=dp->GetIDsOfNames(IID_NULL,&name,1,LOCALE_SYSTEM_DEFAULT,&dspid);
	
	if(!FAILED(hr))	
	{DISPPARAMS disparams;
	memset(&disparams,0,sizeof(DISPPARAMS));
	disparams.cArgs=4;
	VARIANTARG* pArg=new VARIANTARG[disparams.cArgs];
	disparams.rgvarg=pArg;
	memset(pArg,0,sizeof(VARIANT)*disparams.cArgs);
	//disparams.rgvarg[0].vt=VT_I4;
	//disparams.rgvarg[0].lVal=1;
	disparams.rgvarg[0].vt=VT_VARIANT|VT_BYREF;
	disparams.rgvarg[0].pvarVal=&var;
	mwArray2VARIANT(disparams.rgvarg+0,M);
	mwArray2VARIANT(disparams.rgvarg+1,M);
	mwArray2VARIANT(disparams.rgvarg+2,C);
	mwArray2VARIANT(disparams.rgvarg+3,K);
//	disparams.rgvarg[4].pvarVal=&vK;
	hr=dp->Invoke(dspid,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&disparams,&var,0,NULL);
if(!FAILED(hr))
{IMWComplex* pTemp = (IMWComplex*)disparams.rgvarg->pdispVal;//复数类型的接口 
	pTemp->get_MWFlags(&pFlags);
	Variant2mxArray(disparams.rgvarg,&here,&flags);
	static mwArray hh1(here);
	double r[4],ii[4];
	hh1.ExtractData(r,ii);
	hh1.ExtractData(r,ii);
}

	
	}

//HMODULE hdll=::LoadLibrary("e:\\lzk\\mymatrixc_1_0.dll");		
//	it=(pdvovi)::GetProcAddress(hdll,"invmatrix");
		
	
static	mwArray mm1(here);
	
  mm1.ExtractData(ddd,ttt);
//myeig(1,M,C,K,bag);
	CoUninitialize();
	bag->mset_data(NULL,0,type_mw,NULL,0,1,&mm1);
return TRUE;

}
 int _stdcall viberation::myeig(mwArray *out,unsigned int* o_cnt, const mwArray* in,unsigned int i_cnt) 
{
    mwArray k = mwArray::UNDEFINED;
    mwArray m = mwArray::UNDEFINED;
    mwArray m1 = mwArray::UNDEFINED;
    m1 = *in*0;
  //  m
  //    = vertcat(
  //        mwVarargin(
  //          horzcat(mwVarargin(mwVv(m1, "m1"), mwVa(in, "in"))),
   //         horzcat(mwVarargin(mwVa(in, "in"), mwVa(in1, "in1")))));
	m = vertcat(horzcat(m1, *in),horzcat(*in,*(in+1)));
  //  k
   //   = vertcat(
    //      mwVarargin(
     //       horzcat(mwVarargin(mwVa(in, "in"), mwVv(m1, "m1"))),
      //      horzcat(mwVarargin(mwVv(m1, "m1"), - mwVa(in2, "in2"))))); 
	k = vertcat(horzcat(*in,m1),horzcat(m1,-*(in+2)));
    k = k*inv(m);
	double r[4],i[4];
	*out=eig(k);
	*o_cnt=1;
    //mwValidateOutput(*out, 1, nargout_, "out", "invmatrix");  
return S_OK; 
}
void viberation::attach()
{
};
BOOL viberation::check()
{return TRUE;
}
BOOL viberation::go()
{	
	mwArray2VARIANT(&vM,M);
	mwArray2VARIANT(&vC,C);
	mwArray2VARIANT(&vK,K);
	mwArray2VARIANT(&vF,F);
	//mwArray bag;
	if(check())
		go(out);
	else return FALSE;

	return TRUE;
}
void viberation::out_create()
{
}
extern "C" _declspec(dllexport) int _stdcall myeig(mwArray *out,unsigned int* o_cnt, const mwArray* in,unsigned int i_cnt) 
{
    mwArray k = mwArray::UNDEFINED;
    mwArray m = mwArray::UNDEFINED;
    mwArray m1 = mwArray::UNDEFINED;
    m1 = *in*0;
  //  m
  //    = vertcat(
  //        mwVarargin(
  //          horzcat(mwVarargin(mwVv(m1, "m1"), mwVa(in, "in"))),
   //         horzcat(mwVarargin(mwVa(in, "in"), mwVa(in1, "in1")))));
	m = vertcat(horzcat(m1, *in),horzcat(*in,*(in+1)));
  //  k
   //   = vertcat(
    //      mwVarargin(
     //       horzcat(mwVarargin(mwVa(in, "in"), mwVv(m1, "m1"))),
      //      horzcat(mwVarargin(mwVv(m1, "m1"), - mwVa(in2, "in2"))))); 
	k = vertcat(horzcat(*in,m1),horzcat(m1,-*(in+2)));
    k = k*inv(m);
	double r[4],i[4];
	*out=eig(k);
	*o_cnt=1;
    //mwValidateOutput(*out, 1, nargout_, "out", "invmatrix");  
return S_OK; 
}

⌨️ 快捷键说明

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