📄 coverhide.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 + -