高压线系统的一个demo

花了很大力气,才把各种单回、双回、四回的整理到一个工程下,现在来整理下做这些工作的一个基本模版:

以电场单回为例:

首先引用上篇文章的东西,将matlab生成的文件放置好,vs配置好

在ESParameterdlg中加入响应button 计算的事件,如下:

void CESParameterdlg::OnBnClickedComputiones()
{
// TODO: 在此添加控件通知处理程序代码
page1.ok();   //更新page1的数据,其实就是调用了一个UpdateData(TRUE)函数
int sel1,sel2;  //定义两个索引 sel1为分裂导线数目的索引,sel2为地线索引   只有E是需要地线的
sel1=page1.m_comboNumble.GetCurSel();  //因为内部数据从0~9,因此获得的索引其实等于相对应的内部数据
sel2=page1.m_comboLineNumble.GetCurSel();
if(-1==sel1)
{
MessageBox("请选择导线分列数!!!");
}
else if(-1==sel2)
{
MessageBox("请选择导线地线根数!!!");
}
else
{
int rett=MessageBox("是否调用matlab单回磁场计算模块!!","到底调不调快说!!",MB_YESNO);
if(rett==IDNO)
{
return ;
}
initEsingle();//初始化matlab,需要在头文件中包含E_single

int len=(page1.m_editLevelEnd-page1.m_editLevelStart)/page1.m_editStepSize+1; //横轴的点数

//事先定义mwArray(matlab中的矩阵)类型数据以供E_single函数使用
mwArray a(1,len,mxDOUBLE_CLASS);
mwArray E3x(1,len,mxDOUBLE_CLASS);
mwArray E3y(1,len,mxDOUBLE_CLASS);
mwArray E3(1,len,mxDOUBLE_CLASS);
mwArray Ep(1,1,mxDOUBLE_CLASS);

mwArray u(1,1,mxDOUBLE_CLASS);
mwArray gn(1,1,mxDOUBLE_CLASS);




mwArray p(5,2,mxDOUBLE_CLASS);
mwArray X1(1,3,mxDOUBLE_CLASS);
mwArray Y1(1,3,mxDOUBLE_CLASS);


mwArray n(1,1,mxDOUBLE_CLASS);
mwArray d(1,1,mxDOUBLE_CLASS);
mwArray r(1,1,mxDOUBLE_CLASS);
mwArray gr(1,1,mxDOUBLE_CLASS);







mwArray s1(1,1,mxDOUBLE_CLASS);
mwArray s2(1,1,mxDOUBLE_CLASS);
mwArray step(1,1,mxDOUBLE_CLASS);
mwArray h(1,1,mxDOUBLE_CLASS);




mwArray px(1,1,mxDOUBLE_CLASS);
mwArray py(1,1,mxDOUBLE_CLASS);




//赋值,需要参照page1进行

u(1,1)=page1.m_editVoltage;
s1(1,1)=page1.m_editLevelStart;
s2(1,1)=page1.m_editLevelEnd;
step(1,1)=page1.m_editStepSize;
h(1,1)=page1.m_editVerticalHeight;
px(1,1)=page1.m_editGaussageX;
py(1,1)=page1.m_editGaussageY;




n(1,1)=sel1;
gn(1,1)=sel2;
d(1,1)=page1.m_editDistance;
r(1,1)=page1.m_editSubRadius;
gr(1,1)=page1.m_editLineRadius;

//先将对象存入数组,向矩阵中填写
double *aD;
double *E3xD;
double *E3yD;
double *E3D;
double *EpD;
double pArray[5][2]=
{
{page1.m_editPlaceAx,page1.m_editPlaceAy},
{page1.m_editPlaceBx,page1.m_editPlaceBy},
{page1.m_editPlaceCx,page1.m_editPlaceCy},
{page1.m_editGroundX1,page1.m_editGroundY1},
{page1.m_editGroundX2,page1.m_editGroundY2}
};
double X1Array[3]={page1.m_editCoordinate1X,page1.m_editCoordinate2X,page1.m_editCoordinate3X};
double Y1Array[3]={page1.m_editCoordinate1Y,page1.m_editCoordinate2Y,page1.m_editCoordinate3Y};
//bool ret=false;

//填入矩阵
for(int i = 0;i < 5; i++)
{
for(int j = 0;j < 2; j++)
{
p(i + 1,j + 1) = pArray[i][j];
}
}


for(int j = 0;j < 3; j++)
{
X1(1,j + 1) = X1Array[j];
Y1(1,j + 1) = Y1Array[j];
}


//下面函数的写法需要参照E_single.m、E_single.h 按照给出参数的顺序写
E_single(5,a,E3x,E3y,E3,Ep,u,gn,p,X1,Y1,n,d,r,gr,s1,s2,step,h,px,py);




//取出数据用于绘制
aD  =new double[len];
E3xD=new double [len];
E3yD= new double[len];
E3D =new double[len];
EpD =new double [len];


/************************************************************************/
/* 从MxArray类型的返回值中得到数据,将矩阵a对应值存入数组aD。                                         */
/************************************************************************/
a.GetData(aD,len);
E3x.GetData(E3xD,len);
E3y.GetData(E3yD,len);
E3.GetData(E3D,len);
Ep.GetData(EpD,1);


for(int i=0;i<len;i++)
{
aD[i]=page1.m_editLevelStart+page1.m_editStepSize*i;
}
/**********************************************************
*                        生成曲线                         *
***********************************************************/
page2.DrawPic(len,aD,E3D,E3xD,E3yD);
}
}

以上用到page2.DrawPic(len,aD,E3D,E3xD,E3yD);

这个需要在page2中写函数,首先在面版加一static text控件,设定visiable为false,在page2中,加入如下函数

CRect CESDlg2::GetRect()
{
CRect rect;
GetDlgItem(IDC_STATIC_DRAWES)->GetWindowRect((&rect));
return rect;
}


BOOL CESDlg2::OnInitDialog()
{
CDialog::OnInitDialog();
CRect rect;
GetDlgItem(IDC_STATIC_DRAWES)->GetWindowRect((&rect));
ScreenToClient(rect); 
rect.top+=25;
rect.bottom-=45;
rect.right-=4;
viewLine=new CViewLine;
viewLine->setText("电场");
viewLine->viewSignal=MAGNETISM_COORDINATE_DRAW;
viewLine->Create(NULL,NULL,0,rect,this,0,NULL);
viewLine->SetParent(this);
viewLine->ShowWindow(TRUE);
return TRUE;
}


BEGIN_MESSAGE_MAP(CESDlg2, CDialog)
END_MESSAGE_MAP()




void CESDlg2::DrawPic(int countTemp,double * pXx,double * pB,double * pBx,double * pBy)
{



viewLine->setCount( countTemp );
viewLine->setXx( pXx );
viewLine->setB( pB );
viewLine->setBx( pBx );
viewLine->setBy( pBy );

if( NULL == viewLine->pXxDraw )
{
MessageBox( _T( "观测点坐标为空!" ) );
return;
}
else if( NULL == viewLine->pBDraw )
{
MessageBox( _T( "观测点综合磁场强度为空!" ) );
return;
}
else if ( NULL == viewLine->pBxDraw )
{
MessageBox( _T( "观测点水平磁场强度为空!" ) );
return;
}
else if ( NULL == viewLine->pByDraw )
{
MessageBox( _T( "观测点垂直磁场强度为空!" ) );
return;
}
else
{
viewLine->viewSignal = MAGNETISM_CURVE_DRAW;//设置绘制曲线标志
viewLine->Invalidate();
viewLine->UpdateWindow();
}
}

当中需要包含 viewLine.h文件,控件的ID需要做出相应的修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值