edit_sequential.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 886 行 · 第 1/2 页
C
886 行
ShowMessageBox("Error","First and last transitions selected are not on the same line !!??","Ok"); return FALSE; } } } else { ShowMessageBox("Error","Unknown element type for Ele2","Ok"); return FALSE; } LeftX = Ele1X; RightX = Ele1X; if ( LeftX>Ele2X ) LeftX = Ele2X; if ( RightX<Ele2X ) RightX = Ele2X; if ( pOffsetTransiFound!=NULL ) *pOffsetTransiFound = OffsetTransiFound; if ( pStepsBaseY!=NULL ) *pStepsBaseY = StepsBaseY; if ( pTransitionsBaseY!=NULL ) *pTransitionsBaseY = TransitionsBaseY; *pLeftX = LeftX; *pRightX = RightX;printf("commonsearch: leftX=%d, rightX=%d, OffTransi=%d, StepsY=%d, TransiY=%d\n", LeftX, RightX, OffsetTransiFound, StepsBaseY, TransitionsBaseY ); return TRUE;}void DoManyStepsActOrDesact( int ForPage, int FlagStart, int TypeEle1, int OffEle1, int TypeEle2, int OffEle2 ){ int OffsetTransiFound = -1; int StepsBaseY = -1; int LeftX,RightX; if ( !CommonSearchForManyStepsOrTransi( TRUE, TypeEle1, OffEle1, TypeEle2, OffEle2 , &OffsetTransiFound, &StepsBaseY, NULL, &LeftX, &RightX ) ) return; /* search failed ! */ // try to find the transition associated to the steps... if ( OffsetTransiFound==-1 && StepsBaseY!=-1 ) { int ScanX; // searching in line behind or above... int TransiPosiY = StepsBaseY+(FlagStart?-1:1); int TransiSearch; for( ScanX=LeftX; ScanX<=RightX; ScanX++ ) { TransiSearch = SearchTransiElement( ForPage, ScanX, TransiPosiY ); if ( TransiSearch!=-1 ) OffsetTransiFound = TransiSearch; } } if ( OffsetTransiFound==-1 || StepsBaseY==-1 ) { ShowMessageBox("Error","Error in selection or not possible...","Ok"); } else { int ScanX; int CptStep = 0; int StepSearch; int ScanStep;printf("DO ACT/DESACT STEPS x1=%d, x2=%d, y=%d\n", LeftX, RightX, StepsBaseY ); // init all for( ScanStep=0; ScanStep<NBR_SWITCHS_MAX; ScanStep++ ) { if ( FlagStart ) EditSeqDatas.Transition[ OffsetTransiFound ].NumStepToActiv[ ScanStep ] = -1; else EditSeqDatas.Transition[ OffsetTransiFound ].NumStepToDesactiv[ ScanStep ] = -1; } // find all the steps to set for the transition for( ScanX=LeftX; ScanX<=RightX; ScanX++ ) { StepSearch = SearchStepElement( ForPage, ScanX, StepsBaseY ); if ( StepSearch!=-1 && CptStep<NBR_SWITCHS_MAX ) { if ( FlagStart ) EditSeqDatas.Transition[ OffsetTransiFound ].NumStepToActiv[ CptStep ] = StepSearch; else EditSeqDatas.Transition[ OffsetTransiFound ].NumStepToDesactiv[ CptStep ] = StepSearch; CptStep++;printf("StepActDesact++=%d\n", StepSearch ); } } }}void DoManyTransitionsLinked( int ForPage, int FlagStart, int TypeEle1, int OffEle1, int TypeEle2, int OffEle2 ){ int LeftX,RightX; int TransisBaseY; CommonSearchForManyStepsOrTransi( TRUE, TypeEle1, OffEle1, TypeEle2, OffEle2 , NULL, NULL, &TransisBaseY, &LeftX, &RightX ); if ( TransisBaseY==-1 ) { ShowMessageBox("Error","Error in selection or not possible...","Ok"); } else { int NbrTransisLinked = 0; int ArrayNumTransiLinked[ NBR_SWITCHS_MAX ]; int ScanX; int CptTransi = 0; int TransiSearch; int ScanTransi; int ScanTransiArray, ScanTransiArray2; // find all the transitions which are linked together for( ScanX=LeftX; ScanX<=RightX; ScanX++ ) { TransiSearch = SearchTransiElement( ForPage, ScanX, TransisBaseY ); if ( TransiSearch!=-1 && CptTransi<NBR_SWITCHS_MAX ) ArrayNumTransiLinked[ NbrTransisLinked++ ] = TransiSearch; } if ( NbrTransisLinked>=2 ) { for( ScanTransiArray=0; ScanTransiArray<NbrTransisLinked; ScanTransiArray++ ) { int TheTransi = ArrayNumTransiLinked[ ScanTransiArray ]; int StepToAct = -1; int StepToDesact = -1; StrTransition * pTheTransi = &EditSeqDatas.Transition[ TheTransi ]; // init all for( ScanTransi=0; ScanTransi<NBR_SWITCHS_MAX; ScanTransi++ ) { if ( FlagStart ) pTheTransi->NumTransLinkedForStart[ ScanTransi ] = -1; else pTheTransi->NumTransLinkedForEnd[ ScanTransi ] = -1; } // put the others transitions than itself ScanTransi = 0; for( ScanTransiArray2=0; ScanTransiArray2<NbrTransisLinked; ScanTransiArray2++ ) { int NumTransi = ArrayNumTransiLinked[ ScanTransiArray2 ];printf("having num transi linked=%d for transi=%d\n", NumTransi, TheTransi ); if ( NumTransi!=TheTransi ) {printf("->storing num transi linked=%d for transi=%d\n", NumTransi, TheTransi ); if ( FlagStart ) { pTheTransi->NumTransLinkedForStart[ ScanTransi++ ] = NumTransi; if ( EditSeqDatas.Transition[ NumTransi ].NumStepToDesactiv[ 0 ]!=-1 ) StepToDesact = EditSeqDatas.Transition[ NumTransi ].NumStepToDesactiv[ 0 ]; } else { pTheTransi->NumTransLinkedForEnd[ ScanTransi++ ] = NumTransi; if ( EditSeqDatas.Transition[ NumTransi ].NumStepToActiv[ 0 ]!=-1 ) StepToAct = EditSeqDatas.Transition[ NumTransi ].NumStepToActiv[ 0 ]; } } } // step to activate / descativateprintf("=>step to activ=%d, step to desactiv=%d\n", StepToAct, StepToDesact ); if ( StepToAct!=-1 ) pTheTransi->NumStepToActiv[ 0 ] = StepToAct; if ( StepToDesact!=-1 ) pTheTransi->NumStepToDesactiv[ 0 ] = StepToDesact; } } else { ShowMessageBox("Error","Not found at least 2 transitions linked...","Ok"); } }}void DestroyIt( int Type, int Offset ){ switch( Type ) { case ELE_SEQ_STEP: DestroyStep( Offset ); break; case ELE_SEQ_TRANSITION: DestroyTransi( Offset ); break; case ELE_SEQ_COMMENT: DestroyComment( Offset ); break; }}void SearchIt( int PageNbr, int PosX, int PosY, int * Type, int * Offset ){ int TypeFound = -1; int OffsetFound = -1; /* steps are on odd lines, transitions on even ones */ if ( PosY & 1 ) { OffsetFound = SearchStepElement( PageNbr, PosX, PosY ); if ( OffsetFound!=-1 ) { TypeFound = ELE_SEQ_STEP; TopSeqEleEdited = TypeFound; } } else { OffsetFound = SearchTransiElement( PageNbr, PosX, PosY ); if ( OffsetFound!=-1 ) { TypeFound = ELE_SEQ_TRANSITION; TopSeqEleEdited = TypeFound; } } /* comments can be on any lines */ if ( OffsetFound==-1 ) { OffsetFound = SearchCommentElement( PageNbr, PosX, PosY ); if ( OffsetFound!=-1 ) { TypeFound = ELE_SEQ_COMMENT; TopSeqEleEdited = TypeFound; } } *Type = TypeFound; *Offset = OffsetFound;}/* click with the mouse in x and y pixels of the sequential page */void EditElementInSeqPage(double x,double y){ int PosX,PosY; /* correspond to which block ? */ PosX = x/SEQ_SIZE_DEF; PosY = y/SEQ_SIZE_DEF; if ( (PosX<SEQ_PAGE_WIDTH) && (PosY<SEQ_PAGE_HEIGHT) && (EditDatas.NumElementSelectedInToolBar!=-1) ) { int TypeFound = -1; int OffsetFound = -1; char TopFound = y>PosY*SEQ_SIZE_DEF && y<PosY*SEQ_SIZE_DEF+SEQ_SIZE_DEF/2; /* save what was selected just before */ int TypeSeqEleEditedBak = TypeSeqEleEdited; int OffsetSeqEleEditedBak = OffsetSeqEleEdited; char TopSeqEleEditedBak = TopSeqEleEdited; int CurrentSeqPage = SectionArray[ InfosGene->CurrentSection ].SequentialPage; // for comments, verify 4 horizontal blocks if ( EditDatas.NumElementSelectedInToolBar!=NumElementSelectedInToolBarBak ) CptNbrClicksDone = 0; NumElementSelectedInToolBarBak = EditDatas.NumElementSelectedInToolBar;//printf("top clicked= %d\n", TopFound ); TypeSeqEleEdited = -1; /* search element selected */ SearchIt( CurrentSeqPage, PosX, PosY, &TypeFound, &OffsetFound ); switch( EditDatas.NumElementSelectedInToolBar ) { case EDIT_POINTER: TypeSeqEleEdited = TypeFound; OffsetSeqEleEdited = OffsetFound; break; case ELE_SEQ_STEP: case EDIT_SEQ_INIT_STEP: case ELE_SEQ_TRANSITION: case EDIT_SEQ_STEP_AND_TRANS: if ( EditDatas.NumElementSelectedInToolBar==ELE_SEQ_STEP || EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_INIT_STEP || EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_STEP_AND_TRANS ) { if ( PosY & 1 ) { if ( TypeFound==ELE_SEQ_STEP ) { DestroyStep( OffsetFound ); } else { if ( TypeFound==-1 ) { OffsetFound = CreateStep( CurrentSeqPage, PosX, PosY, (EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_INIT_STEP)?TRUE:FALSE ); if ( OffsetFound!=-1 ) { TypeSeqEleEdited = ELE_SEQ_STEP; OffsetSeqEleEdited = OffsetFound; } else { ShowMessageBox("Error","Sequential memory full for steps","Ok"); } } else { ShowMessageBox("Error","There is already an element!","Ok"); } } } else { ShowMessageBox("Error","A step can't be placed on even lines","Ok"); } } if ( EditDatas.NumElementSelectedInToolBar==ELE_SEQ_TRANSITION || EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_STEP_AND_TRANS ) { if ( EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_STEP_AND_TRANS ) PosY++; if ( (PosY & 1)==0 ) { if ( TypeFound==ELE_SEQ_TRANSITION ) { DestroyTransi( OffsetFound ); } else { if ( TypeFound==-1 ) { OffsetFound = CreateTransi( CurrentSeqPage, PosX, PosY ); if ( OffsetFound!=-1 ) { TypeSeqEleEdited = ELE_SEQ_TRANSITION; OffsetSeqEleEdited = OffsetFound; } else { ShowMessageBox("Error","Sequential memory full for transition","Ok"); } } else { ShowMessageBox("Error","There is already an element!","Ok"); } } } else { ShowMessageBox("Error","A transition can't be placed on odd lines","Ok"); } } break; case EDIT_SEQ_LINK: if ( TypeFound!=-1 ) CptNbrClicksDone++; if ( CptNbrClicksDone==1 ) {printf("nbr clicks=1!!! (posi=%s), wait next point to link...\n", (TopFound==1)?"top":"bottom" ); TypeSeqEleEdited = TypeFound; OffsetSeqEleEdited = OffsetFound; TopSeqEleEdited = TopFound; //TODO: modify cursor so that it is a little more explicit...? } if ( CptNbrClicksDone==2 ) {printf("nbr clicks=2!!! (posi=%s), TypeBak=%d, TypeNow=%d\n", (TopFound==1)?"top":"bottom", TypeSeqEleEditedBak, TypeFound ); if ( TypeSeqEleEditedBak==ELE_SEQ_TRANSITION && TypeFound==ELE_SEQ_STEP ) DoLinkTransitionAndStep( OffsetSeqEleEditedBak, TopSeqEleEditedBak, OffsetFound ); if ( TypeSeqEleEditedBak==ELE_SEQ_STEP && TypeFound==ELE_SEQ_TRANSITION ) DoLinkTransitionAndStep( OffsetFound, TopFound, OffsetSeqEleEditedBak ); CptNbrClicksDone = 0; } break; case EDIT_ERASER: if ( TypeFound!=-1 ) DestroyIt( TypeFound, OffsetFound ); break; case ELE_SEQ_COMMENT: // a comment takes 4 horizontal blocks if ( PosX<=SEQ_PAGE_WIDTH-4 ) { // verify if elements that would be under it... int ScanHoriX; char SomethingHere = FALSE; for ( ScanHoriX=PosX; ScanHoriX<PosX+4; ScanHoriX++ ) { SearchIt( CurrentSeqPage, ScanHoriX, PosY, &TypeFound, &OffsetFound ); if ( TypeFound!=-1 ) SomethingHere = TRUE;// DestroyIt( TypeFound, OffsetFound ); } if ( SomethingHere==FALSE ) { OffsetFound = CreateComment( CurrentSeqPage, PosX, PosY ); if ( OffsetFound!=-1 ) { TypeSeqEleEdited = ELE_SEQ_COMMENT; OffsetSeqEleEdited = OffsetFound; } else { ShowMessageBox("Error","Sequential memory full for comments","Ok"); } } else { ShowMessageBox("Error","There is already an element on 4 horizontal blocks required!","Ok"); } } else { ShowMessageBox("Error","Not enough room on the right here...","Ok"); } break; case EDIT_SEQ_START_MANY_STEPS: case EDIT_SEQ_END_MANY_STEPS: case EDIT_SEQ_START_MANY_TRANS: case EDIT_SEQ_END_MANY_TRANS: if ( TypeFound!=-1 ) CptNbrClicksDone++; if ( CptNbrClicksDone==1 ) { TypeSeqEleEdited = TypeFound; OffsetSeqEleEdited = OffsetFound; TopSeqEleEdited = TopFound; //TODO: modify cursor so that it is a little more explicit...? } if ( CptNbrClicksDone==2 ) { if ( EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_START_MANY_STEPS || EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_END_MANY_STEPS ) {printf("DO_MANY_STEPS:nbr clicks=2!!!, TypeBak=%d, TypeNow=%d\n", TypeSeqEleEditedBak, TypeFound ); DoManyStepsActOrDesact( CurrentSeqPage, EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_START_MANY_STEPS, TypeSeqEleEditedBak, OffsetSeqEleEditedBak, TypeFound, OffsetFound ); } else {printf("DO_MANY_TRANSITIONS:nbr clicks=2!!!, TypeBak=%d, TypeNow=%d\n", TypeSeqEleEditedBak, TypeFound ); DoManyTransitionsLinked( CurrentSeqPage, EditDatas.NumElementSelectedInToolBar==EDIT_SEQ_START_MANY_TRANS, TypeSeqEleEditedBak, OffsetSeqEleEditedBak, TypeFound, OffsetFound ); } CptNbrClicksDone = 0; } break; } LoadSeqElementProperties( ); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?