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

📄 edit_sequential.c

📁 Source code for an Numeric Cmputer
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Classic Ladder Project *//* Copyright (C) 2001-2004 Marc Le Douarain *//* mavati@club-internet.fr *//* http://www.multimania.com/mavati/classicladder *//* December 2003 *//* --------------------------- *//* Editor for Sequential Pages *//* --------------------------- *//* This part of the editor is the one who will not change even if if we use *//* another gui instead of gtk... who know? *//* ------------------------------------------------------------- *//* This library is free software; you can redistribute it and/or *//* modify it under the terms of the GNU Lesser General Public *//* License as published by the Free Software Foundation; either *//* version 2.1 of the License, or (at your option) any later version. *//* This library is distributed in the hope that it will be useful, *//* but WITHOUT ANY WARRANTY; without even the implied warranty of *//* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *//* Lesser General Public License for more details. *//* You should have received a copy of the GNU Lesser General Public *//* License along with this library; if not, write to the Free Software *//* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <gtk/gtk.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "classicladder.h"#include "global.h"#include "drawing.h"#include "edit.h"#include "editproperties_gtk.h"#include "classicladder_gtk.h"#include "calc_sequential.h"#include "edit_sequential.h"/* We modify the datas in this variable. It is only   after clicking on apply that they are used */StrSequential EditSeqDatas;int TypeSeqEleEdited = -1;int OffsetSeqEleEdited = 0;char TopSeqEleEdited = FALSE;/* for elements requiring many clicks to be done (link, multi-steps, 'Or' in transitions) */int CptNbrClicksDone = 0;int NumElementSelectedInToolBarBak = -1;void LoadSeqElementProperties(void){    char TextToWrite[100];    int NumParam;    for (NumParam = 0; NumParam < NBR_PARAMS_PER_OBJ; NumParam++)	SetProperty(NumParam, "---", "");    if (TypeSeqEleEdited != -1) {	switch (TypeSeqEleEdited) {	case ELE_SEQ_STEP:	    sprintf(TextToWrite, "%d",		EditSeqDatas.Step[OffsetSeqEleEdited].StepNumber);	    SetProperty(0, "Step Nbr", TextToWrite);	    break;	case ELE_SEQ_TRANSITION:	    strcpy(TextToWrite,		DisplayInfo(EditSeqDatas.Transition[OffsetSeqEleEdited].		    VarTypeCondi,		    EditSeqDatas.Transition[OffsetSeqEleEdited].VarNumCondi));	    SetProperty(0, "Variable", TextToWrite);	    break;	}    }}void SaveSeqElementProperties(void){    int StepNbr;    if (TypeSeqEleEdited != -1) {	switch (TypeSeqEleEdited) {	case ELE_SEQ_STEP:	    if (TextToNumber(GetProperty(0), 0, 9999, &StepNbr))		EditSeqDatas.Step[OffsetSeqEleEdited].StepNumber = StepNbr;	    break;	case ELE_SEQ_TRANSITION:	    TextParserForAVar(GetProperty(0),		&EditSeqDatas.Transition[OffsetSeqEleEdited].VarTypeCondi,		&EditSeqDatas.Transition[OffsetSeqEleEdited].VarNumCondi);	    break;	}	/* display back to show what we have really understand... */	LoadSeqElementProperties();    }}void ModifyCurrentSeqPage(){    memcpy(&EditSeqDatas, Sequential, sizeof(StrSequential));    EditDatas.ModeEdit = TRUE;//      autorize_prevnext_buttons(FALSE);}void CancelSeqPageEdited(){    EditDatas.ModeEdit = FALSE;    EditDatas.NumElementSelectedInToolBar = -1;    TypeSeqEleEdited = -1;    LoadSeqElementProperties();//      autorize_prevnext_buttons(TRUE);}void ApplySeqPageEdited(){    // TODO: passing in STOP and waiting not under calc...    memcpy(Sequential, &EditSeqDatas, sizeof(StrSequential));    // TODO: passing in RUN now...    EditDatas.ModeEdit = FALSE;    EditDatas.NumElementSelectedInToolBar = -1;    TypeSeqEleEdited = -1;    LoadSeqElementProperties();//      autorize_prevnext_buttons(TRUE);    PrepareSequential();}int SearchStepElement(int PageNumber, int PositionX, int PositionY){    int ScanStep;    StrStep *pStep;    int Result = -1;    printf("step search posiX=%d, posiY=%d ; ", PositionX, PositionY);    for (ScanStep = 0; ScanStep < NBR_STEPS; ScanStep++) {	pStep = &EditSeqDatas.Step[ScanStep];	if (pStep->NumPage == PageNumber) {	    if (pStep->PosiX == PositionX && pStep->PosiY == PositionY)		Result = ScanStep;	}    }    printf("found=%d!!!\n", Result);    return Result;}int SearchTransiElement(int PageNumber, int PositionX, int PositionY){    int ScanTransi;    StrTransition *pTransi;    int Result = -1;    printf("transi search posiX=%d, posiY=%d ; ", PositionX, PositionY);    for (ScanTransi = 0; ScanTransi < NBR_TRANSITIONS; ScanTransi++) {	pTransi = &EditSeqDatas.Transition[ScanTransi];	if (pTransi->NumPage == PageNumber) {	    if (pTransi->PosiX == PositionX && pTransi->PosiY == PositionY)		Result = ScanTransi;	}    }    printf("found=%d!!!\n", Result);    return Result;}/* -1 if not found */int FindFreeStep(void){    int ScanStep = 0;    StrStep *pStep;    int Result = -1;    do {	pStep = &EditSeqDatas.Step[ScanStep];	if (pStep->NumPage == -1)	    Result = ScanStep;	else	    ScanStep++;    }    while (Result == -1 && ScanStep < NBR_STEPS);    printf("found free step=%d!!!\n", Result);    return Result;}/* -1 if not found */int FindFreeTransi(void){    int ScanTransi = 0;    StrTransition *pTransi;    int Result = -1;    do {	pTransi = &EditSeqDatas.Transition[ScanTransi];	if (pTransi->NumPage == -1)	    Result = ScanTransi;	else	    ScanTransi++;    }    while (Result == -1 && ScanTransi < NBR_TRANSITIONS);    printf("found free transi=%d!!!\n", Result);    return Result;}void DestroyStep(int Offset){    StrStep *pStep = &EditSeqDatas.Step[Offset];    pStep->NumPage = -1;}/* -1 if not created */int CreateStep(int page, int x, int y, char init){    int TransiAssoc;    int OffsetStepCreated = FindFreeStep();    int TopStepForAutoNumber = -1;    int NumStepForAutoNumber = 0;    if (OffsetStepCreated != -1) {	StrStep *pStep = &EditSeqDatas.Step[OffsetStepCreated];	pStep->NumPage = page;	pStep->PosiX = x;	pStep->PosiY = y;	pStep->InitStep = init;	// look if there is a step on the top, to directly give next step	// number	TopStepForAutoNumber = SearchStepElement(page, x, y - 2);	if (TopStepForAutoNumber == -1) {	    // search next step number available...	    int ScanStep = 0;	    for (ScanStep = 0; ScanStep < NBR_STEPS; ScanStep++) {		StrStep *pScanStep = &EditSeqDatas.Step[ScanStep];		if (pScanStep->NumPage != -1) {		    // already used ?		    if (NumStepForAutoNumber == pScanStep->StepNumber)			NumStepForAutoNumber = pScanStep->StepNumber + 1;		}	    }	} else {	    NumStepForAutoNumber =		EditSeqDatas.Step[TopStepForAutoNumber].StepNumber + 1;	}	pStep->StepNumber = NumStepForAutoNumber;	// search top transi to connect with	TransiAssoc = SearchTransiElement(page, x, y - 1);	if (TransiAssoc != -1)	    EditSeqDatas.Transition[TransiAssoc].NumStepToActiv[0] =		OffsetStepCreated;	// search bottom transi to connect with	TransiAssoc = SearchTransiElement(page, x, y + 1);	if (TransiAssoc != -1)	    EditSeqDatas.Transition[TransiAssoc].NumStepToDesactiv[0] =		OffsetStepCreated;    }    return OffsetStepCreated;}void DestroyTransi(int Offset){    StrTransition *pTransi = &EditSeqDatas.Transition[Offset];    pTransi->NumPage = -1;}/* -1 if not created */int CreateTransi(int page, int x, int y){    int StepAssoc;    int NumSwitch;    int OffsetCreated = FindFreeTransi();    int TopTransiForAutoVar = -1;    if (OffsetCreated != -1) {	StrTransition *pTransi = &EditSeqDatas.Transition[OffsetCreated];	pTransi->NumPage = page;	pTransi->PosiX = x;	pTransi->PosiY = y;	pTransi->VarTypeCondi = VAR_MEM_BIT;	pTransi->VarNumCondi = 0;	// look if there is a transition on the top, to directly give next	// variable number	TopTransiForAutoVar = SearchTransiElement(page, x, y - 2);	if (TopTransiForAutoVar != -1) {	    pTransi->VarTypeCondi =		EditSeqDatas.Transition[TopTransiForAutoVar].VarTypeCondi;	    pTransi->VarNumCondi =		EditSeqDatas.Transition[TopTransiForAutoVar].VarNumCondi + 1;	}	for (NumSwitch = 0; NumSwitch < NBR_SWITCHS_MAX; NumSwitch++) {	    pTransi->NumStepToActiv[NumSwitch] = -1;	    pTransi->NumStepToDesactiv[NumSwitch] = -1;	    pTransi->NumTransLinkedForStart[NumSwitch] = -1;	    pTransi->NumTransLinkedForEnd[NumSwitch] = -1;	}	// search top step to connect with	if (y > 0) {	    StepAssoc = SearchStepElement(page, x, y - 1);	    if (StepAssoc != -1)		pTransi->NumStepToDesactiv[0] = StepAssoc;	}	// search bottom step to connect with	if (y < SEQ_PAGE_HEIGHT - 1) {	    StepAssoc = SearchStepElement(page, x, y + 1);	    if (StepAssoc != -1)		pTransi->NumStepToActiv[0] = StepAssoc;	}    }    return OffsetCreated;}void DoLinkTransitionAndStep(int OffsetTransi, char TopOfTransi,    int OffsetStep){    StrTransition *pTransi = &EditSeqDatas.Transition[OffsetTransi];    printf("Do link : transi=%d (top=%d), step=%d\n", OffsetTransi,	TopOfTransi, OffsetStep);    if (TopOfTransi)	pTransi->NumStepToDesactiv[0] = OffsetStep;    else	pTransi->NumStepToActiv[0] = OffsetStep;}/* return TRUE is okay */char CommonSearchForManyStepsOrTransi(char ForManySteps, int TypeEle1,    int OffEle1, int TypeEle2, int OffEle2, int *pOffsetTransiFound,    int *pStepsBaseY, int *pTransitionsBaseY, int *pLeftX, int *pRightX){    int OffsetTransiFound = -1;    int StepsBaseY = -1;    int TransitionsBaseY = -1;    int Ele1X, Ele2X;    int LeftX, RightX;    if (!ForManySteps && (TypeEle1 == ELE_SEQ_STEP	    || TypeEle2 == ELE_SEQ_STEP)) {	ShowMessageBox("Error",	    "Not selected first and last transitions to be joined !!??",	    "Ok");	return FALSE;    }    if (TypeEle1 == ELE_SEQ_STEP) {	Ele1X = EditSeqDatas.Step[OffEle1].PosiX;	StepsBaseY = EditSeqDatas.Step[OffEle1].PosiY;    }    if (TypeEle2 == ELE_SEQ_STEP) {	Ele2X = EditSeqDatas.Step[OffEle2].PosiX;	if (StepsBaseY == -1) {	    StepsBaseY = EditSeqDatas.Step[OffEle1].PosiY;	} else {	    if (StepsBaseY != EditSeqDatas.Step[OffEle1].PosiY) {		ShowMessageBox("Error",		    "First and last steps selected are not on the same line !!??",		    "Ok");		return FALSE;	    }	}    }    // search transition corresponding...    // directly clicked on it ?    if (TypeEle1 == ELE_SEQ_TRANSITION) {	OffsetTransiFound = OffEle1;	Ele1X = EditSeqDatas.Transition[OffEle1].PosiX;	TransitionsBaseY = EditSeqDatas.Transition[OffEle1].PosiY;    }    if (TypeEle2 == ELE_SEQ_TRANSITION) {	OffsetTransiFound = OffEle2;	Ele2X = EditSeqDatas.Transition[OffEle2].PosiX;	if (TransitionsBaseY == -1) {	    TransitionsBaseY = EditSeqDatas.Transition[OffEle1].PosiY;	} else {	    if (TransitionsBaseY != EditSeqDatas.Transition[OffEle1].PosiY) {		ShowMessageBox("Error",		    "First and last transitions selected are not on the same line !!??",		    "Ok");		return FALSE;	    }

⌨️ 快捷键说明

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