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

📄 chkanlnk.mc

📁 Bentley Microstation的二次开发工具MDL的学习源代码
💻 MC
📖 第 1 页 / 共 2 页
字号:
void HookDispNAsc(DialogItemMessage *dimP)
{
	int i;
	int mTLineColor,mLevel;
	short ViewList[MAX_VIEWS];

	dimP->msgUnderstood=TRUE;
	switch(dimP->messageType)
	{
		case DITEM_MESSAGE_BUTTON:
			mTLineColor=0;
			mLevel=59;
			mdlParams_getActive(&g_CurColor,ACTIVEPARAM_COLOR);
			mdlParams_getActive(&g_CurLevel,ACTIVEPARAM_LEVEL);
			mdlParams_setActive(mLevel,ACTIVEPARAM_LEVEL);
			mdlParams_setActive(mTLineColor,ACTIVEPARAM_COLOR);	///////
			g_ViewMask=0;
			for(i=0;i<MAX_VIEWS;i++)
			{
				if(g_NoteViewToggle.status[i])
					g_ViewMask +=pow(2,i);
			}
			if(tEdP)
			{
				mdlTransient_free(&tEdP,TRUE);
				tEdP=NULL;
			}
			
			
			if(g_Symbology.dispall==-1)	//所有图形
			{
				for(i=0;i<MAX_VIEWS;i++)
					ViewList[i]=1;
				TurnOnAllLevels(ViewList,FALSE,FALSE);
				TurnOnAllLevels(ViewList,TRUE,TRUE);
				g_CurDispType=g_NoteType;
			}

			else
			{
				if(g_Symbology.dispheight==-1)	//全部高程点和高程注记
				{
					DisplayHeightText();
					g_CurDispType=g_NoteType;
				}
				
				else if(g_Symbology.dispnonlink==-1)	//无关联的高程点和高程注记
				{
					DisplayNonHeightPTag();
					g_CurDispType=g_NoteType;
				}
			}
			
			if(g_Symbology.displink==-1)	//注记关联关系
				DisplayHeightPTag();  
			else 
			{
				g_bExecUserUpdate=FALSE;
				UpdateView();
				g_bExecUserUpdate=TRUE;
			}
			
			mdlView_setFunction(UPDATE_PRE, UserUpdate);
			g_CurDispType=g_NoteType;
			break;
		default:
			dimP->msgUnderstood=FALSE;
	}
}



void HookExitChkNA(DialogItemMessage *dimP)
{
	dimP->msgUnderstood = TRUE;
	switch (dimP->messageType){
		case DITEM_MESSAGE_BUTTON:
			RestoreNormal();
			mdlDialog_cmdNumberQueue (FALSE, CMD_MDL_UNLOAD,mdlSystem_getCurrTaskID(), TRUE);
			break;
		default:
		    dimP->msgUnderstood = FALSE;
			break;
    }
}


void RestoreNormal(void)
{
	int i;
	if(tEdP){
		mdlTransient_free(&tEdP,TRUE);
		tEdP=NULL;
	}
	for(i=0;i<MAX_VIEWS;i++)
		g_NoteViewToggle.status[i]=FALSE;
	g_bExecUserUpdate=FALSE;
	UpdateView();
	g_MaxNote=0;
	mdlView_setFunction(UPDATE_PRE,NULL);
	mdlParams_setActive(g_CurLevel,ACTIVEPARAM_LEVEL);
	mdlParams_setActive(g_CurColor,ACTIVEPARAM_COLOR);
}


/*------------------------------------------------------------
该函数根据上次视图是否用来显示FEATURE,以及当前选定的视图来决定
当前需要将哪些视图清除或全显,或根本不处理
-------------------------------------------------------------*/
Private void UpdateView(void)
{
	int i;
	short ViewList[MAX_VIEWS];

	/*若选择了不同的关联方式,则选定的视图应该完全清除*/
	if(g_CurDispType!=g_NoteType){
		for(i=0;i<MAX_VIEWS;i++){
			if(g_NoteViewToggle.status[i])
				ViewList[i]=1;
			else
				ViewList[i]=0;
		}
		TurnOnAllLevels(ViewList,FALSE,TRUE);
		TurnOnAllLevels(ViewList,TRUE,FALSE);
	}

	/*原来未用到而现在要打开的视图,清除该视图所有的内容*/
	for(i=0;i<MAX_VIEWS;i++){
		if(!g_CurViewList[i] && g_NoteViewToggle.status[i])
			ViewList[i]=1;
		else
			ViewList[i]=0;
	}
	TurnOnAllLevels(ViewList,FALSE,TRUE);
	TurnOnAllLevels(ViewList,TRUE,FALSE);

	/*原来用到而现在要关掉的视图,显示该视图所有的内容*/
	for(i=0;i<MAX_VIEWS;i++){
		if(g_CurViewList[i] && !g_NoteViewToggle.status[i])
			ViewList[i]=1;
		else
			ViewList[i]=0;
		/*记下当前用到的视图状态*/
		g_CurViewList[i]=g_NoteViewToggle.status[i];
	}
	TurnOnAllLevels(ViewList,FALSE,FALSE);
	TurnOnAllLevels(ViewList,TRUE,TRUE);
}


int recordLink(void* LinkageP, void *elP)
{
	int i,j, type;
	int id;
	char nm[32];
	ATTRLnk_Struc* LnkP;
	MSElementDescr *elD;
	
	LnkP=LinkageP;
	elD=elP;
	id=LnkP->id;
	type=elD->el.ehdr.type;
	number++;
	/*if (type==17)	// text
	{
		GetFirstPoint(elD, SP1+id);
		annolink[id].fpos1=g_FilePos;
		return 1;
	}
	else if (type==2)
	{
		mdlCell_extract(NULL, NULL, NULL, NULL, nm, &elD->el);
		if (nm[0]==0)	// group
		{
			if (elD->h.firstElem!=NULL)
				if (elD->h.firstElem->el.ehdr.type==17)
				{
					GetFirstPoint(elD, SP1+id);
					annolink[id].fpos1=g_FilePos;
					return 1;
				}
		}
	}
	GetFirstPoint(elD, SP2+id);
	annolink[id].fpos2=g_FilePos;*/
	if (annolink[id].fpos1==0) 
	{
		GetFirstPoint(elD, SP1+id);
		annolink[id].fpos1=g_FilePos;
	}
	else 
	{
		GetFirstPoint(elD, SP2+id);
		annolink[id].fpos2=g_FilePos;
	}		
	return 1;
}


// prepare all link data
void GetNotePos(int fileno)
{
	int i,mScanWords,mStatus,mElmNum,type;
	Scanlist mScanList;
	ULong mNextFilePos,mRetPos[50],mActualPos;
	MSElementUnion elm;
	unsigned short buff[4];       //add
	MSElementDescr  *elmDP;
	ExtendedAttrBuf attbuf;
	int color,level;
	
	number=0;
	for (i=0; i<MAX_NOTE_NUM; i++)	annolink[i].fpos1=annolink[i].fpos2=0;
		/*Init tEdP for adding new transient element*/

    	if(tEdP!=NULL)
    	{
		mdlTransient_free(&tEdP,TRUE);
		tEdP=NULL;
	}
	tEdP = mdlTransient_addElemDescr (
		NULL,		/* => NULL for create a new Transient ElmDscr*/
		NULL, 		/* => element to put in transient element*/
		TRUE,		/* => snappable (not used) */
		g_ViewMask,	/* => view mask (all views) */
		NORMALDRAW,	/* => draw mode	             */
		FALSE,		/* => display first */
		TRUE,		/* => at head of list */
		TRUE);		/* => display initially */
	
		 /*Set scan params.*/
	mdlScan_initScanlist(&mScanList);
	mScanList.scantype = ELEMTYPE | NESTCELL;
	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 
	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);
	                g_FilePos=mActualPos;
			mdlLinkage_extractFromElement(buff, &elmDP->el, 0x99, 3, NULL, recordLink, elmDP);
			mdlElmdscr_freeAll(&elmDP);
		}
	}while(mStatus==BUFF_FULL);
}


void TurnOnAllLevels(short ViewList[], boolean bTurnOn, boolean bUpdate)
{
	int i;
	short mLevelMask[4];
	
	for(i=0;i<4;i++)
		mLevelMask[i]=0xffff;
	mdlView_setLevels(bTurnOn, mLevelMask, ViewList, bUpdate);
}


void SymbolizeElmdscr(MSElementDescr* elmDP,int type)
{
	int weight,color;
	MSElementDescr *tmpDP;
	
	weight=atoi(g_Symbology.lineweight);
	color=g_Symbology.linecolor;
	if(weight<0) weight=0;
	if(elmDP->h.isHeader)
	{
		tmpDP=elmDP->h.firstElem;
		while(tmpDP!=NULL)
		{
			mdlElement_setSymbology(&(tmpDP->el),&color,&weight,NULL);
			tmpDP=tmpDP->h.next;
		}
	}
	else
		mdlElement_setSymbology(&(elmDP->el),&color,&weight,NULL);
	return;
}


// draw link line for id
void FindElement(double Height_Pointx, double Height_Pointy, ULong id)
{
	MSElement out;
        int i;
        Dpoint3d SP[2];  
	MSElementDescr  *tmpDP;           
		

        mdlElmdscr_read(&tmpDP, annolink[id].fpos1, 0, 0, NULL);
	mdlElmdscr_display(tmpDP, 0, NORMALDRAW);
	mdlElmdscr_freeAll(&tmpDP);
        mdlElmdscr_read(&tmpDP, annolink[id].fpos2, 0, 0, NULL);
	mdlElmdscr_display(tmpDP, 0, NORMALDRAW);
	mdlElmdscr_freeAll(&tmpDP);

        SP[0]=SP1[id];
        SP[1]=SP2[id];
	SP[0].z=0;
	SP[1].z=0;
        mdlLine_create(&out,NULL,SP);
        mdlElmdscr_new(&tmpDP, NULL, &out);
        SymbolizeElmdscr(tmpDP,1);
        mdlTransient_addElemDescr(
		tEdP,		/* => TED to attach to or NULL for new*/
		tmpDP, 		/* => element to put in transient element*/
		FALSE,		/* => snappable (not used) */
		g_ViewMask,		/* => view mask (all views) */
		NORMALDRAW,	/* => draw mode	*/
		FALSE,		/* => display first */
		TRUE,		/* => at head of list */
		TRUE);		/* => display initially */
	mdlElmdscr_freeAll(&tmpDP);
       
}

⌨️ 快捷键说明

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