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

📄 modanlnk.mc

📁 Bentley Microstation的二次开发工具MDL的学习源代码
💻 MC
字号:
/*================================================================================
						Step by step 之 MDL 快速入门实例十六
================================================================================*/
#include <mdl.h>
#include <dlogitem.h>
#include <dlogman.fdf>
#include <cexpr.h>
#include <MSELEMS.H>
#include <scanner.h>

#include "modanlnk.h"

/* define globol varible */
ULong		filePos1, filePos2;
MSElementDescr   *elem1, *elem2;
Dpoint3d 	SP[2];
UShort 		Max_tempID;  //最大的linkage值id
UShort		linkCount;
ULong		fposLink[32];
UShort		linkID[32];
int			color, weight;


void HOOK_PUSHBUTTON1(DialogItemMessage   *dimp);
void HOOK_PUSHBUTTON2(DialogItemMessage   *dimp);
void HOOK_PUSHBUTTON3(DialogItemMessage   *dimp);
void HOOK_DIALOG(DialogMessage *dmp);
void Pick1(void );
void Accept1(Dpoint3d *ptP,int view);
void Pick2(void );
void Accept2(Dpoint3d *ptP,int view);
void Pick21(void );
void Accept21(Dpoint3d *ptP,int view);
void Pick3(void );
void Accept3(Dpoint3d *ptP,int view);
void Pick31(void );
void Accept31(Dpoint3d *ptP,int view);
void InitData(int fileno);
void GetFirstPoint(MSElementDescr *emd, Dpoint3d *dp);

DialogHookInfo uHooks[] =
    {
    {HOOKITEMID_p1,	HOOK_PUSHBUTTON1},
    {HOOKITEMID_p2, HOOK_PUSHBUTTON2},
    {HOOKITEMID_p3, HOOK_PUSHBUTTON3},
	{HOOK_DIALOG1,HOOK_DIALOG},
	};


void main (void )
{
	RscFileHandle   rfhandle1;
	
	/* publish hook function */
	mdlDialog_hookPublish(sizeof(uHooks)/sizeof(DialogHookInfo), uHooks);
	InitData(0);
	elem1=elem2=NULL;
		
	/* Open our file for access to dialog */
	mdlResource_openFile (&rfhandle1, NULL, FALSE);
		
	/*open our dialog*/	
	mdlDialog_open(rfhandle1,DIALOGID_1);
	mdlResource_closeFile (rfhandle1);
}


// 将当前元素包含的某个关联对应的元素找到,并画出连接关系
int DrawLinkToElm(void* LinkageP, void *param)
{
	int i,j, *drawmode;
	UShort * LnkP;
	MSElementUnion out;
	int mScanWords,mStatus,mElmNum;
	Scanlist mScanList;
	ExtendedAttrBuf attbuf;
	ULong mNextFilePos,mRetPos[5],mActualPos;
	unsigned short buff[4];
	MSElementDescr *elmDP;
	int lnco, lnwt;	
	
	drawmode=param;
	LnkP=LinkageP;
	/*++++++++++++++++++++++++++++++++++++++++++++++++
	有错误:
	1.只能查看0x99为elm1
	2.查看是寻找元素所用linkage还是为0x99,应该为0x98
	-------------------------------------------------*/
 	//Set scan params.
	mdlScan_initScanlist(&mScanList);
	mScanList.scantype = ELEMTYPE | ONEELEM;
	mScanList.extendedType= FILEPOS | EXTATTR;
	mdlScan_noRangeCheck(&mScanList);
	mdlScan_setDrawnElements(&mScanList);
	attbuf.numWords=4;
	attbuf.extAttData[0]=0xffff;
	attbuf.extAttData[1]=0xffff;
	attbuf.extAttData[2]=0xffff;
	attbuf.extAttData[3]=0xffff;
	attbuf.extAttData[4]=LnkP[0];
	attbuf.extAttData[5]=LnkP[1];
	attbuf.extAttData[6]=LnkP[2];
	attbuf.extAttData[7]=LnkP[3];
	mScanList.extAttrBuf=&attbuf;	// to find elements with annotation association linkage
	mdlScan_initialize(0, &mScanList);
    
    //Begin scan 
	do{
		mScanWords=sizeof(mRetPos)/sizeof(UShort);
		mStatus=mdlScan_file(mRetPos, &mScanWords, sizeof(mRetPos), &mNextFilePos);
		mElmNum=mScanWords/sizeof(UShort);
		for(i=0; i<mElmNum; i++)
		{
			mdlElmdscr_read(&elmDP, mRetPos[i], 0, 0, &mActualPos);
			GetFirstPoint(elmDP, SP+1);
			mdlParams_getActive(&color, ACTIVEPARAM_COLOR);
			mdlParams_getActive(&weight, ACTIVEPARAM_LINEWEIGHT);
			lnco=0;
			lnwt=3;
			mdlParams_setActive(lnco, ACTIVEPARAM_COLOR);
			mdlParams_setActive(lnwt, ACTIVEPARAM_LINEWEIGHT);
		    mdlLine_create(&out,NULL,SP);
			mdlParams_setActive(color, ACTIVEPARAM_COLOR);
			mdlParams_setActive(weight, ACTIVEPARAM_LINEWEIGHT);
			mdlElement_display(&out, *drawmode);
			if (linkCount<32) 
			{
				linkID[linkCount]=LnkP[2]; 
				fposLink[linkCount++]=mRetPos[i];
			}
		}
	}while(mStatus==BUFF_FULL);
    
	return 0;
}


// 求画关联时需要的点位,在sj chknote中有更完善的程序
void GetFirstPoint(MSElementDescr *emd, Dpoint3d *dp)
{
	switch (emd->el.ehdr.type)
	{
		case 2:
			mdlCell_extract(dp, NULL, NULL, NULL, NULL, &emd->el);
			break;
		case 17:
			mdlText_extract(NULL, dp, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, &emd->el);
			break;
		default:
			if (mdlElmdscr_extractEndPoints(dp, NULL, NULL, NULL, emd, 0)!=SUCCESS)
			{
				dp->x=0, dp->y=0, dp->z=0;
			}
	}
}


// 将当前元素包含的全部关联画出来
void DrawLink(MSElementDescr *emd, int drawmode)
{
	linkCount=0;
	GetFirstPoint(emd, SP+0);
	mdlLinkage_extractFromElement(NULL, &emd->el, 0x99, 0, NULL, DrawLinkToElm, &drawmode);
}


// 查看关联
void HOOK_PUSHBUTTON1(DialogItemMessage   *dimp)
{	
	dimp->msgUnderstood=TRUE;
	switch (dimp->messageType)
	{
	case DITEM_MESSAGE_BUTTON :
	    mdlState_startModifyCommand (Pick1, Accept1, NULL, NULL, NULL, -360, 1,	0, 0); 
		mdlLocate_init();
		mdlOutput_prompt("请指定元素");
		break;
	default :
		dimp->msgUnderstood=FALSE;
		break;
	}
}


void Pick1(void)
{
	if (elem1) 
	{
		DrawLink(elem1, ERASE);
		elem1=NULL;
	}
	
    mdlState_startDefaultCommand ();
}


void Accept1(Dpoint3d *ptP,int view)
{
	int type;
	ULong mActualPos;

	if (elem1) DrawLink(elem1, ERASE);
	filePos1 = mdlElement_getFilePos (FILEPOS_CURRENT, NULL);
	mdlElmdscr_read(&elem1, filePos1, 0, 0, &mActualPos);
	DrawLink(elem1, NORMALDRAW);
    mdlState_startModifyCommand (Pick1, Accept1, NULL, NULL, NULL, -360, 1,	0, 0); 
	mdlLocate_init();
	mdlOutput_prompt("请指定元素");
}


int DeleteLinkageFunc(void* LinkageP, UShort *param)
{
	UShort * LnkP, id;

	id=*param;
	LnkP=LinkageP;
	if (LnkP[2]==id) return 1;
	else return 0;
}

	
void DeleteAnnoLinkBetween(MSElementDescr *elem1, ULong filePos1, MSElementDescr *elem2, ULong filePos2, UShort id)
{
	MSElementUnion out;
	int lnco, lnwt;
	ULong pp;
	int num;
	
	GetFirstPoint(elem2, SP+1);
	mdlParams_getActive(&color, ACTIVEPARAM_COLOR);
	mdlParams_getActive(&weight, ACTIVEPARAM_LINEWEIGHT);
	lnco=0;
	lnwt=3;
	mdlParams_setActive(lnco, ACTIVEPARAM_COLOR);
	mdlParams_setActive(lnwt, ACTIVEPARAM_LINEWEIGHT);
    mdlLine_create(&out,NULL,SP);
	mdlParams_setActive(color, ACTIVEPARAM_COLOR);
	mdlParams_setActive(weight, ACTIVEPARAM_LINEWEIGHT);
	mdlElement_display(&out, ERASE);
	
	num=mdlLinkage_deleteUsingDescr(&elem1, 0x99, 0, NULL, DeleteLinkageFunc, &id, FALSE);
	num=mdlLinkage_deleteUsingDescr(&elem2, 0x99, 0, NULL, DeleteLinkageFunc, &id, FALSE);
	pp=mdlElmdscr_rewrite(elem1,NULL,filePos1);
	pp=mdlElmdscr_rewrite(elem2,NULL,filePos2);

	mdlElmdscr_display(elem1, 0, NORMALDRAW);
	mdlElmdscr_display(elem2, 0, NORMALDRAW);
}


// First element selected, delete its annotation link
void DeleteAnnoLink(void)
{
	DrawLink(elem1, NORMALDRAW);
	if (linkCount==0) 
	{
		elem1=NULL;
		mdlState_startModifyCommand(Pick2, Accept2, NULL, NULL, NULL, -360, 1, 0, 0); 
		mdlLocate_init();
		mdlOutput_prompt("请先指定第一个元素");
	}
	else
    {	
    	mdlState_startModifyCommand (Pick21, Accept21, NULL, NULL, NULL, -360, 1, 0, 0); 
		mdlLocate_init();
		mdlOutput_prompt("请指定第二个元素");	
		mdlElmdscr_display(elem1, 0, HILITE);
	}
}


// when reset, should re-select elem1. now quit command
void Pick21(void)
{
	if (elem1) 
	{
		mdlElmdscr_display(elem1, 0, NORMALDRAW);
		DrawLink(elem1, ERASE);
		elem1=NULL;
	}
	
    mdlState_startDefaultCommand ();
}


void Accept21(Dpoint3d *ptP,int view)
{
	int i;
	ULong mActualPos;

	filePos2 = mdlElement_getFilePos (FILEPOS_CURRENT, NULL);
	for (i=0; i<linkCount; i++)
	{
		if (filePos2==fposLink[i])	// fposLink prepared in DrawLink from DeleteAnnoLink
		{
			mdlElmdscr_read(&elem2, filePos2, 0, 0, &mActualPos);
			DeleteAnnoLinkBetween(elem1, filePos1, elem2, filePos2, linkID[i]);
			mdlElmdscr_display(elem1, 0, NORMALDRAW);
			elem1=NULL;
			// continue from select elem1
		    mdlState_startModifyCommand (Pick2, Accept2, NULL, NULL, NULL, -360, 1, 0, 0); 
			mdlLocate_init();
			mdlOutput_prompt("请先指定第一个元素");
			return;
		}
	}
	// no link between selected element with elem1, continue to select elem2
    mdlState_startModifyCommand (Pick21, Accept21, NULL, NULL, NULL, -360, 1, 0, 0); 
	mdlLocate_init();
	mdlOutput_prompt("请指定第二个元素");	
}


// 删除关联
void HOOK_PUSHBUTTON2(DialogItemMessage   *dimp)
{
	dimp->msgUnderstood=TRUE;
	switch (dimp->messageType)
	{
	case DITEM_MESSAGE_BUTTON :
		if (elem1) 
			DeleteAnnoLink();
		else
		{
		    mdlState_startModifyCommand (Pick2, Accept2, NULL, NULL, NULL, -360, 1, 0, 0); 
			mdlLocate_init();
			mdlOutput_prompt("请先指定第一个元素");
		}
		break;
	default :
		dimp->msgUnderstood=FALSE;
		break;
	}
}


void Pick2(void)
{
	if (elem1) mdlElmdscr_display(elem1, 0, NORMALDRAW);
	elem1=NULL;
    mdlState_startDefaultCommand ();
}


void Accept2(Dpoint3d *ptP, int view)
{	
	ULong mActualPos;

	filePos1 = mdlElement_getFilePos (FILEPOS_CURRENT, NULL);
	mdlElmdscr_read(&elem1, filePos1, 0, 0, &mActualPos);
	DeleteAnnoLink();
}


void AddAnnoLinkBetween(MSElementDescr *elem1, ULong filePos1, MSElementDescr *elem2, ULong filePos2, UShort id)
{
	UShort attributes[4];
	int length;
	MSElementUnion out;
	int lnco, lnwt;
	
	GetFirstPoint(elem2, SP+1);
	mdlParams_getActive(&color, ACTIVEPARAM_COLOR);
	mdlParams_getActive(&weight, ACTIVEPARAM_LINEWEIGHT);
	lnco=0;
	lnwt=3;
	mdlParams_setActive(lnco, ACTIVEPARAM_COLOR);
	mdlParams_setActive(lnwt, ACTIVEPARAM_LINEWEIGHT);
    mdlLine_create(&out,NULL,SP);
	mdlParams_setActive(color, ACTIVEPARAM_COLOR);
	mdlParams_setActive(weight, ACTIVEPARAM_LINEWEIGHT);
	mdlElement_display(&out, NORMALDRAW);
	
	attributes[0]=0x1003;
	attributes[1]=0x0099;
	attributes[2]=id;
	attributes[3]=0x0;
	
	mdlElmdscr_appendAttributes(&elem1, 4, attributes);			        	
	mdlElmdscr_appendAttributes(&elem2, 4, attributes);
	mdlElmdscr_rewrite(elem1, NULL, filePos1);
	mdlElmdscr_rewrite(elem2, NULL, filePos2);

	mdlElmdscr_display(elem1, 0, NORMALDRAW);
	mdlElmdscr_display(elem2, 0, NORMALDRAW);
}


// First element selected, add an annotation link to another element which is to be selected
void AddAnnoLink(void)
{
	DrawLink(elem1, NORMALDRAW);	// should be always true
    mdlState_startModifyCommand (Pick31, Accept31, NULL, NULL, NULL, -360, 1, 0, 0); 
	mdlLocate_init();
	mdlElmdscr_display(elem1, 0, HILITE);
	mdlOutput_prompt("请指定第二个元素");	
}


void Pick31(void)
{
	if (elem1) 
	{
		mdlElmdscr_display(elem1, 0, NORMALDRAW);
		DrawLink(elem1, ERASE);
		elem1=NULL;
	}
	
    mdlState_startDefaultCommand ();
}


void Accept31(Dpoint3d *ptP,int view)
{
	int i;
	ULong mActualPos;

	filePos2 = mdlElement_getFilePos (FILEPOS_CURRENT, NULL);
	for (i=0; i<linkCount; i++)
	{
		if (filePos2==fposLink[i])
		{
		    mdlState_startModifyCommand (Pick31, Accept31, NULL, NULL, NULL, -360, 1, 0, 0); 
			mdlLocate_init();
			mdlOutput_prompt("请指定第二个元素");
			return;
		}
	}

	mdlElmdscr_read(&elem2, filePos2, 0, 0, &mActualPos);
	AddAnnoLinkBetween(elem1, filePos1, elem2, filePos2, ++Max_tempID);
	mdlElmdscr_display(elem1, 0, NORMALDRAW);
	elem1=NULL;
    mdlState_startModifyCommand (Pick3, Accept3, NULL, NULL, NULL, 0, 0,	0, 0); 
	mdlLocate_init();
	mdlOutput_prompt("请先指定第一个元素");
}


void HOOK_PUSHBUTTON3(DialogItemMessage   *dimp)
{
	dimp->msgUnderstood=TRUE;
	switch (dimp->messageType)
	{
	case DITEM_MESSAGE_BUTTON :
		if (elem1) 
			AddAnnoLink();
		else
		{
		    mdlState_startModifyCommand (Pick3, Accept3, NULL, NULL, NULL, -360, 1, 0, 0); 
			mdlLocate_init();
			mdlOutput_prompt("请先指定第一个元素");
		}
		break;
	default :
		dimp->msgUnderstood=FALSE;
		break;
	}
}


void Pick3(void)
{
	if (elem1) mdlElmdscr_display(elem1, 0, NORMALDRAW);
	elem1=NULL;
    mdlState_startDefaultCommand ();
}


void Accept3(Dpoint3d *ptP, int view)
{	
	ULong mActualPos;

	filePos1 = mdlElement_getFilePos (FILEPOS_CURRENT, NULL);
	mdlElmdscr_read(&elem1, filePos1, 0, 0, &mActualPos);
	AddAnnoLink();
}


void HOOK_DIALOG(DialogMessage *dmp )
{
	dmp->msgUnderstood=TRUE;
	switch (dmp->messageType)
	{
	case DIALOG_MESSAGE_DESTROY :
		 mdlSystem_unloadMdlProgram("modanlnk");
		 mdlOutput_status("欢迎下次使用!");
		 break;
	default :
		 dmp->msgUnderstood=FALSE;
		 break;
	}
}


// 检查每个注记关联的ID,求最大值
int checkAnnoLinkID(void* LinkageP)
{
	int i,j;
	UShort id;
	AnnoLnk_Struc* LnkP;
	
	LnkP=LinkageP;
	id=LnkP->id;
	if (id<=0) return -1;
	if (Max_tempID<id) Max_tempID=id;
	return 0;
}


// 统计图中最大的注记关联ID
void InitData(int fileno)
{
	int i,mScanWords,mStatus,mElmNum;
	Scanlist mScanList;
	ExtendedAttrBuf attbuf;
	ULong mNextFilePos,mRetPos[50],mActualPos;
	unsigned short buff[4];
	MSElementUnion elm;
	void *pp;
	
 	//Set scan params.
	mdlScan_initScanlist(&mScanList);
	mScanList.scantype = ELEMTYPE;
	mScanList.extendedType= FILEPOS | EXTATTR;
	mdlScan_noRangeCheck(&mScanList);
	mdlScan_setDrawnElements(&mScanList);
	attbuf.numWords=2;
	attbuf.extAttData[0]=0xffff;
	attbuf.extAttData[1]=0xffff;
	attbuf.extAttData[2]=0x1003;
	attbuf.extAttData[3]=0x0099;
	mScanList.extAttrBuf=&attbuf;	// to find elements with annotation association linkage
	mdlScan_initialize(fileno,&mScanList);
    
    //Begin scan 
	Max_tempID=0;
	do{
		mScanWords=sizeof(mRetPos)/sizeof(UShort);
		mStatus=mdlScan_file(mRetPos,&mScanWords,sizeof(mRetPos),&mNextFilePos);
		mElmNum=mScanWords/sizeof(UShort);
		for(i=0;i<mElmNum;i++)
		{
			mdlElement_read(&elm, 0, mRetPos[i]);
			mdlLinkage_extractFromElement(buff, &elm, 0x99, 0, NULL, checkAnnoLinkID, NULL);
		}
	}while(mStatus==BUFF_FULL);
}

⌨️ 快捷键说明

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