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