⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dgd.mc

📁 Bentley Microstation的二次开发工具MDL的学习源代码
💻 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 + -