📄 dgd.mc
字号:
#include <tcb.h>
#include <mselems.h>
#include <global.h>
#include <mstypes.h>
#include <userfnc.h>
#include <mdl.h>
#include <rtypes.h>
#include <msfile.fdf>
#include <mdlerrs.h>
#include <cmdclass.h>
Dpoint3d ptStack[2]; //存放龙门吊的四个角点
void calculate_point(Dpoint3d *origin, Dpoint3d *last, double distance, double angle, Dpoint3d *outpoint);
Private void Accept_DGD(Dpoint3d* ptP,int view);
Private void Onpoint1_DGD(Dpoint3d* ptP,int view);
Private void Reset2_DGD(void);
Private void show1_DGD(Dpoint3d *pPoint, int view, int drawMode, int add);
Private void Onpoint2_DGD(Dpoint3d* ptP,int view);
Private void show2_DGD(Dpoint3d *pPoint, int view, int drawMode, int add);
Private void Start_DGD(int argc,char *argv[]);
Private void main(void)
{
RscFileHandle rscFileH;
char mesg[10];
ULong ret;
if (mdlSystem_setFunction(SYSTEM_RELOAD_PROGRAM, Start_DGD) ==-1)
{
mdlOutput_printf(MSG_PROMPT,"程序调用出错,请先卸载前面的进程");
return;
}
Start_DGD(0,NULL);
return;
}
/*-------------------------------------------------------------+
作者:赵北战
功能:入口函数
日期:11/20000
+--------------------------------------------------------------*/
Private void Start_DGD(int argc,char *argv[])
{
mdlState_startPrimitive(Accept_DGD, Start_DGD, 0, 0);
mdlOutput_printf(MSG_PROMPT,"请输入传送带第1个点");
return;
}
/*------------------------------------------------------------+
作者:赵北战
功能:确认函数,接收第一个点
日期:11/2000
+------------------------------------------------------------*/
Private void Accept_DGD(Dpoint3d* ptP,int view)
{
ptStack[0] = *ptP;
mdlState_setFunction(STATE_DATAPOINT,Onpoint1_DGD);
mdlState_setFunction(STATE_COMPLEX_DYNAMICS, show1_DGD);
mdlOutput_printf(MSG_PROMPT,"请输入第二个点");
}
///////////////出口函数////////////////////////
Private void Reset2_DGD(void)
{
mdlState_startDefaultCommand();
}
/*-------------------------------------------------------------+
作者:赵北战
功能:接受第二个输入点,生成一条线
日期:11/2000
+--------------------------------------------------------------*/
Private void Onpoint1_DGD(Dpoint3d* ptP,int view)
{
ptStack[1] = *ptP;
show1_DGD(ptP,tcb->lstvw, NORMALDRAW,0);
mdlState_setFunction(STATE_DATAPOINT,Onpoint2_DGD);
mdlState_setFunction(STATE_COMPLEX_DYNAMICS, show2_DGD);
mdlState_setFunction(STATE_RESET, Reset2_DGD);
}
/*-------------------------------------------------------------+
作者:赵北战
功能:动态显示第一条线
日期:11/2000
+--------------------------------------------------------------*/
Private void show1_DGD(Dpoint3d *pPoint, int view, int drawMode, int add)
{
MSElement elem;
Dpoint3d tempPoints[2];
tempPoints[0] = ptStack[0];
tempPoints[1] = *pPoint;
mdlLine_create (&elem, NULL, tempPoints);
mdlElement_display (&elem, drawMode);
}
/*--------------------------------------------------------------+
作者:赵北战
功能:
日期:11/2000
+---------------------------------------------------------------*/
Private void Onpoint2_DGD(Dpoint3d* ptP,int view)
{
show2_DGD(ptP,tcb->lstvw, NORMALDRAW,1);
Start_DGD(0,NULL);
return;
}
/*--------------------------------------------------------------+
作者:
功能:
日期:
+--------------------------------------------------------------*/
Private void show2_DGD(Dpoint3d *pPoint, int view, int drawMode, int add)
{
Dpoint3d TmpPoint[4],startpoint[100],Line2point[2],point[7];
double distance1,distance2,distance3,vdistance,x1,y1,x2,y2,TempAngle;
int i,num;
UShort temp;
char cActivelstyle[20];
unsigned flag;
MSElement elem1,elem2,elem3,elem4,elem5,elem6;
int LstyleZero = 0;
TmpPoint[0] = ptStack[0];
TmpPoint[1] = ptStack[1];
TmpPoint[3] = *pPoint;
mdlLine_create (&elem1, NULL, ptStack);
if (add)
mdlElement_add(&elem1);
mdlElement_display (&elem1, drawMode);
distance1=mdlVec_distance(&TmpPoint[0],&TmpPoint[1]);
distance2=mdlVec_distance(&TmpPoint[1],&TmpPoint[3]);
distance3=mdlVec_distance(&TmpPoint[0],&TmpPoint[3]);
if (distance1 < 0.000001||distance2 <0.000001 ||distance3 <0.000001) return;
TempAngle =acos((distance1*distance1+distance3*distance3-distance2*distance2)/(2*distance1*distance3));
vdistance =sin(TempAngle)*distance3;
if (vdistance < 0.000001) return;
calculate_point(&TmpPoint[0],&TmpPoint[1],vdistance,270,&TmpPoint[2]);
calculate_point(&TmpPoint[1],&TmpPoint[0],vdistance,90,&TmpPoint[3]);
Line2point[0] = TmpPoint[3];
Line2point[1] = TmpPoint[2];
mdlLine_create (&elem2, NULL, Line2point);
if (add)
mdlElement_add(&elem2);
mdlElement_display (&elem2, drawMode);
calculate_point(&TmpPoint[0],&TmpPoint[1],distance1/2,0,&point[0]);
calculate_point(&point[0],&TmpPoint[0],vdistance/2,90,&point[1]);
calculate_point(&point[1],&point[0],vdistance/sqrt(3),30,&TmpPoint[0]);
calculate_point(&point[1],&point[0],vdistance/sqrt(3),150,&TmpPoint[1]);
calculate_point(&point[1],&point[0],vdistance/sqrt(3),210,&TmpPoint[2]);
calculate_point(&point[1],&point[0],vdistance/sqrt(3),330,&TmpPoint[3]);
LstyleZero =0;
point[0]=TmpPoint[0]; point[1]=TmpPoint[2];
mdlLine_create(&elem3,NULL,point);
mdlElement_setSymbology(&elem3,NULL,NULL,&LstyleZero);
if (add)
mdlElement_add(&elem3);
mdlElement_display(&elem3,drawMode);
point[0]=TmpPoint[1]; point[1]=TmpPoint[3];
mdlLine_create(&elem4,NULL,point);
mdlElement_setSymbology(&elem4,NULL,NULL,&LstyleZero);
if (add)
mdlElement_add(&elem4);
mdlElement_display(&elem4,drawMode);
LstyleZero =3;
point[0]=TmpPoint[0]; point[1]=TmpPoint[1];
mdlLine_create(&elem5,NULL,point);
mdlElement_setSymbology(&elem5,NULL,NULL,&LstyleZero);
if (add)
mdlElement_add(&elem5);
mdlElement_display(&elem5,drawMode);
point[0]=TmpPoint[2]; point[1]=TmpPoint[3];
mdlLine_create(&elem6,NULL,point);
mdlElement_setSymbology(&elem6,NULL,NULL,&LstyleZero);
if (add)
mdlElement_add(&elem6);
mdlElement_display(&elem6,drawMode);
}
/*-----------------------------------------------------------+
作者:
功能:
日期:
+-------------------------------------------------------------*/
void calculate_point(Dpoint3d *origin, Dpoint3d *last, double distance,
double angle, Dpoint3d *outpoint)
{
double disbet;
double anbet;
outpoint->x=0;
outpoint->y=0;
angle=angle/180*fc_pi;
disbet=sqrt((origin->x-last->x)*(origin->x-last->x)+(origin->y-last->y)*(origin->y-last->y));
if (disbet!=0)
{
if(last->x-origin->x>0)
{
outpoint->x=origin->x+distance*cos(angle+asin((last->y-origin->y)/disbet));
outpoint->y=origin->y+distance*sin(angle+asin((last->y-origin->y)/disbet));
}
if(last->x-origin->x<0)
{
outpoint->x=origin->x+distance*cos(angle+fc_pi-asin((last->y-origin->y)/disbet));
outpoint->y=origin->y+distance*sin(angle+fc_pi-asin((last->y-origin->y)/disbet));
}
if(last->x-origin->x==0)
{
if (last->y-origin->y>0)
{
outpoint->x=origin->x+distance*cos((angle+fc_pi/2));
outpoint->y=origin->y+distance*sin((angle+fc_pi/2));
}
else
{
outpoint->x=origin->x+distance*cos((angle-fc_pi/2));
outpoint->y=origin->y+distance*sin((angle-fc_pi/2));
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -