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

📄 coverhide.mc

📁 Bentley Microstation的二次开发工具MDL的学习源代码
💻 MC
字号:
/*================================================================================
						Step by step 之 MDL 快速入门实例十三
================================================================================*/
#include	"stdio.h"
#include	"tagdata.h"
#include	"dbdefs.h"
#include	"dberrs.h"
#include	"mslstyle.h"
#include	"mselems.h"
#include	"tcb.h"
#include    <dlogman.fdf> 
#include	"mselemen.fdf"
#include	"userfnc.h"
#include	"cmdlist.h"
#include	"scanner.h"
#include	"msextern.h"
#include	"mdl.h"
#include	"mstypes.h"
#include	<tagdata.h>
#include	"DLOGIDS.H"
#include	"MDLDIM.H"
#include	"clipdscr.h"

#include	"global.h"

#define		MAX_POINT_NUM	60000
//-----------globe variables---------------
int		g_ClipNum;
int		g_TotalNum;
ULong	g_cover_fPos[MAX_POINT_NUM];
//-----------------Function definitions--------------//
void CoverHide();
void GetRange(Dpoint3d *points,Dpoint3d *MaxPnt,Dpoint3d *MiniPnt);

//=====================================================


Public void main(int argc,char *argv[])
{
	char msg[80];
	
	sprintf(msg,"压盖处理应确保使用临时文件,是否继续!");
	if(mdlDialog_openMessageBox(DIALOGID_MsgBoxYesNo,msg,DIALOGID_LargeAlert) != ACTIONBUTTON_YES)
		return;

	mdlSystem_enterGraphics();

	CoverHide();

	sprintf(msg,"本幅图共有%d个独立符号及各种注记,共剪切%d个元素!",g_TotalNum,g_ClipNum);
	mdlDialog_openInfoBox(msg);
	
	mdlDialog_cmdNumberQueue (FALSE, CMD_MDL_SILENTUNLOAD,mdlSystem_getCurrTaskID(), TRUE);
}


void CoverHide()
{
	int mScanWords,mStatus,mElmNum,i,j;
	Scanlist mScanList;
	MSElementDescr *elmDP = NULL;
	MSElement	element;
	ULong mNextFilePos,mEofPos,mRetPos[50],mElefpos,eofPos;
	int cover_num = 0,type,level,color;
	Dpoint3d	points[8],MaxPnt,MiniPnt;
	
	ClipDescr           *clipP = NULL;
	MSElementUnion		elmUnion;
	MSElementDescr     *insideEdPP = NULL,*outsideEdPP = NULL;
	int isOverlap;
	
	g_ClipNum=0;

	mdlScan_initScanlist(&mScanList);
	mdlScan_noRangeCheck(&mScanList);
	mScanList.scantype = ELEMTYPE|NESTCELL;
	mScanList.extendedType=FILEPOS;

    mScanList.typmask[1] |= TMSK1_TEXT;
	eofPos  = mdlElement_getFilePos (FILEPOS_EOF, NULL);

	mdlScan_initialize(0,&mScanList);
	cover_num=0;
	do			//get all covered element fpos
	{
		mScanWords=sizeof(mRetPos)/sizeof(UShort);
		mStatus=mdlScan_file(mRetPos,&mScanWords,sizeof(mRetPos),&mNextFilePos);
		mElmNum=mScanWords/sizeof(UShort);
		for(i=0;i<mElmNum;i++){
			if(cover_num >= MAX_POINT_NUM - 1)
			{
				mdlDialog_openInfoBox("本幅图独立符号及注记太多,请与程序作者联系!");
				return;
			}
			if(mRetPos[i] >= eofPos)
				break;
			g_cover_fPos[cover_num] = mRetPos[i];
			cover_num++;
		}

	}while(mStatus==BUFF_FULL);


	//------------------get scan range-----------//
	g_TotalNum=cover_num;

	mdlScan_initScanlist(&mScanList);
	mdlScan_noRangeCheck(&mScanList);
	mScanList.scantype = ELEMTYPE|NESTCELL;
	mScanList.extendedType=FILEPOS;
	for(j=0;j<8;j++)
		mScanList.typmask[j]=0x0000;

	mScanList.typmask[0] |= ( TMSK0_LINE | TMSK0_LINE_STRING | TMSK0_CURVE | TMSK0_CMPLX_STRING | TMSK0_ELLIPSE | TMSK0_ARC | TMSK0_SHAPE | TMSK0_CMPLX_SHAPE );
	mScanList.typmask[2] |= ( TMSK2_MULTILINE);

	for(i=0;i<cover_num;i++)
	{        
		mdlElement_read(&element,0,g_cover_fPos[i]);
		type=mdlElement_getType(&element);
		if(type == TEXT_ELM)
			mdlText_extractShape(points,NULL,&element,FALSE,0);
		else
				continue;
		
		GetRange(points,&MaxPnt,&MiniPnt);			//由于主机旋转、故需求出Range
		mScanList.xlowlim=mdlCnv_toScanFormat(MiniPnt.x);
		mScanList.ylowlim=mdlCnv_toScanFormat(MiniPnt.y);
		mScanList.xhighlim=mdlCnv_toScanFormat(MaxPnt.x);
		mScanList.yhighlim=mdlCnv_toScanFormat(MaxPnt.y);
	
		if(mdlShape_create(&elmUnion,NULL,points,5,0)!=SUCCESS)
		{
			mdlDialog_openInfoBox("can't creat view_shape");
			continue;
		}
		mdlFence_clear(TRUE);  
		mdlFence_fromShape(&elmUnion);

		mdlClip_getFence(&clipP);
		
		mdlScan_initialize(0,&mScanList);
		do
		{
			mScanWords=sizeof(mRetPos)/sizeof(UShort);
			mStatus=mdlScan_file(mRetPos,&mScanWords,sizeof(mRetPos),&mNextFilePos);
			mElmNum=mScanWords/sizeof(UShort);
			for(j=0;j<mElmNum;j++){
				if(mdlElmdscr_read(&elmDP,mRetPos[j],0,0,NULL)==0)
					continue;
				if(mdlClip_isElemInside(&isOverlap,elmDP,clipP,0,TRUE));	            				    
				{		         
				  mdlClip_element(&insideEdPP,&outsideEdPP,elmDP,0,clipP,0);
	     		  if(outsideEdPP)
				  {
					  mdlElmdscr_rewrite(outsideEdPP,elmDP,mRetPos[j]);				 					  
					  g_ClipNum++;
				  }
				}
				/*delete elements inside the fence totally*/
				if(mdlClip_isElemInside(&isOverlap,elmDP,clipP,0,FALSE))
				{
					mdlElmdscr_undoableDelete(elmDP,mRetPos[j],TRUE);
					g_ClipNum++;
				}
				mdlElmdscr_freeAll(&elmDP);
			}
		}while(mStatus==BUFF_FULL);
		mdlClip_free((void *)clipP);
		mdlFence_clear(TRUE);
	}
	mdlElmdscr_freeAll(&elmDP);
	mdlElmdscr_freeAll(&insideEdPP);
	mdlElmdscr_freeAll(&outsideEdPP);
}

void GetRange(Dpoint3d *points,Dpoint3d *MaxPnt,Dpoint3d *MiniPnt)
//由于主机旋转、故需求出Range
{
	int i;

	MaxPnt->z = MiniPnt->z =  0.0;
	MaxPnt->x = MiniPnt->x = points[0].x;
	MaxPnt->y = MiniPnt->y = points[0].y;

	for( i = 0; i < 4;i++)
	{
		if(points[i].x < MiniPnt->x)
			MiniPnt->x = points[i].x;
		if(points[i].y < MiniPnt->y)
			MiniPnt->y = points[i].y;
		if(points[i].x > MaxPnt->x)
			MaxPnt->x = points[i].x;
		if(points[i].y > MaxPnt->y)
			MaxPnt->y = points[i].y;
	}
}

⌨️ 快捷键说明

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