📄 edit_sequential.c
字号:
/* 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 + -