drawing_sequential.c
来自「CNC 的开放码,EMC2 V2.2.8版」· C语言 代码 · 共 280 行
C
280 行
/* Classic Ladder Project *//* Copyright (C) 2001-2006 Marc Le Douarain *//* http://www.multimania.com/mavati/classicladder *//* http://www.sourceforge.net/projects/classicladder *//* October 2002 *//* --------------------- *//* Draw sequential pages *//* --------------------- *//* 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 <string.h>#include "classicladder.h"#include "global.h"#include "drawing.h"#include "drawing_sequential.h"#ifdef GTK2#include <pango/pango.h>#endifvoid DrawSeqStep(GdkPixmap * DrawPixmap,int x,int y,int Size,StrStep * pStep,char DrawingOption){ char BufTxt[50]; GdkGC * DynaGcOff; GdkGC * TheGc; GdkColor DynaGdkColor; GdkGC * DynaGcOn; DynaGdkColor.pixel = 0xFF22FF; DynaGdkColor.red = 0xFF; DynaGdkColor.green = 0x22; DynaGdkColor.blue = 0xFF; DynaGcOn = gdk_gc_new(DrawPixmap); gdk_gc_set_foreground(DynaGcOn,&DynaGdkColor); #ifdef THICK_LINE_ELE_ACTIVATED gdk_gc_set_line_attributes(DynaGcOn, THICK_LINE_ELE_ACTIVATED, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); #endif DynaGcOff = drawing_area->style->black_gc; /* State with color */ TheGc = drawing_area->style->black_gc; if ( (DrawingOption==DRAW_NORMAL) && (!EditDatas.ModeEdit) && (pStep->Activated) ) TheGc = DynaGcOn; gdk_draw_rectangle(DrawPixmap, TheGc, FALSE /*filled*/, x+2, y+2, Size-4, Size-4); // init step ? if ( pStep->InitStep ) { gdk_draw_rectangle(DrawPixmap, /*TheGc*/drawing_area->style->black_gc, FALSE /*filled*/, x+5, y+5, Size-10, Size-10); } // step number sprintf(BufTxt,"%d",pStep->StepNumber);#ifndef GTK2 gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc, x+SizeDiv3,y+SizeDiv2+4,BufTxt,strlen(BufTxt));#else DrawTextGTK2( DrawPixmap, drawing_area->style->black_gc, x, y, Size, Size, BufTxt );#endif gdk_gc_unref(DynaGcOn);}void DrawSeqTransition(GdkPixmap * DrawPixmap,int x,int y,int Size,StrTransition * pTransi,char DrawingOption){ int SizeDiv2 = Size/2; int SizeDiv3 = Size/3; int SizeDiv4 = Size/4; char BufTxt[50]; GdkGC * DynaGcOff; GdkGC * TheGc; GdkColor DynaGdkColor; GdkGC * DynaGcOn; int ScanSwitch; int StepX,StepY; StrStep * pStep, * pStep2; int TransiX; char cNoDirectStepOnTop = FALSE; char cNoDirectStepOnBottom = FALSE; StrSequential * Seq = Sequential; // lifts positions (not used if for print!) int ShiftX = InfosGene->HScrollValue; int ShiftY = InfosGene->VScrollValue; if ( DrawingOption==DRAW_FOR_PRINT ) { ShiftX = 0; ShiftY = 0; } // if in edit, use datas in edit... if ( EditDatas.ModeEdit ) Seq = &EditSeqDatas; DynaGdkColor.pixel = 0xFF22FF; DynaGdkColor.red = 0xFF; DynaGdkColor.green = 0x22; DynaGdkColor.blue = 0xFF; DynaGcOn = gdk_gc_new(DrawPixmap); gdk_gc_set_foreground(DynaGcOn,&DynaGdkColor); #ifdef THICK_LINE_ELE_ACTIVATED gdk_gc_set_line_attributes(DynaGcOn, THICK_LINE_ELE_ACTIVATED, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER); #endif DynaGcOff = drawing_area->style->black_gc; /* State with color */ TheGc = drawing_area->style->black_gc; if ( (DrawingOption==DRAW_NORMAL) && (!EditDatas.ModeEdit) && (pTransi->Activated) ) TheGc = DynaGcOn; // direct step on top ? pStep = &Seq->Step[ pTransi->NumStepToDesactiv[ 0 ] ]; StepX = pStep->PosiX; StepY = pStep->PosiY; if ( pTransi->PosiX!=StepX || pTransi->PosiY-1!=StepY ) cNoDirectStepOnTop = TRUE; // direct step on bottom ? pStep = &Seq->Step[ pTransi->NumStepToActiv[ 0 ] ]; StepX = pStep->PosiX; StepY = pStep->PosiY; if ( pTransi->PosiX!=StepX || pTransi->PosiY+1!=StepY ) cNoDirectStepOnBottom = TRUE; // | gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv2, cNoDirectStepOnTop?y+SizeDiv3:y, x+SizeDiv2, cNoDirectStepOnBottom?y+Size-SizeDiv3:y+Size+1); // - gdk_draw_line(DrawPixmap, TheGc, x+SizeDiv3, y+SizeDiv2, x+Size-SizeDiv3, y+SizeDiv2); // variable for transition strcpy(BufTxt, DisplayInfo( pTransi->VarTypeCondi, pTransi->VarNumCondi ) );#ifndef GTK2 gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc, x+3*SizeDiv4,y+SizeDiv2+5,BufTxt,strlen(BufTxt));#else DrawTextGTK2( DrawPixmap, drawing_area->style->black_gc, x+3*SizeDiv4, y+1, -1, Size, BufTxt );#endif // multiple steps activation ? for ( ScanSwitch=1; ScanSwitch<NBR_SWITCHS_MAX; ScanSwitch++ ) { int NumStep; NumStep = pTransi->NumStepToActiv[ ScanSwitch ]; if ( NumStep!=-1 ) { StepX = Seq->Step[ NumStep ].PosiX * Size - ShiftX; // === gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv3, y+Size-SizeDiv4+2, StepX+Size-SizeDiv3, y+Size-SizeDiv4+2); gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv3, y+Size-SizeDiv4+4, StepX+Size-SizeDiv3, y+Size-SizeDiv4+4); gdk_draw_line(DrawPixmap, drawing_area->style->white_gc, x+SizeDiv3, y+Size-SizeDiv4+3, StepX+Size-SizeDiv3, y+Size-SizeDiv4+3); // | with the step gdk_draw_line(DrawPixmap, DynaGcOff, StepX+SizeDiv2, y+Size-SizeDiv4+4, StepX+SizeDiv2, y+Size+1); } } // multiple steps desactivation ? for ( ScanSwitch=1; ScanSwitch<NBR_SWITCHS_MAX; ScanSwitch++ ) { int NumStep; NumStep = pTransi->NumStepToDesactiv[ ScanSwitch ]; if ( NumStep!=-1 ) { StepX = Seq->Step[ NumStep ].PosiX * Size - ShiftX; // === gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv3, y+SizeDiv4-2, StepX+Size-SizeDiv3, y+SizeDiv4-2); gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv3, y+SizeDiv4-4, StepX+Size-SizeDiv3, y+SizeDiv4-4); gdk_draw_line(DrawPixmap, drawing_area->style->white_gc, x+SizeDiv3, y+SizeDiv4-3, StepX+Size-SizeDiv3, y+SizeDiv4-3); // | with the step gdk_draw_line(DrawPixmap, DynaGcOff, StepX+SizeDiv2, y, StepX+SizeDiv2, y+SizeDiv4-4); } } // transitions linked (start of OR) if ( pTransi->NumTransLinkedForStart[ 0 ]!=-1 ) { for ( ScanSwitch=0; ScanSwitch<NBR_SWITCHS_MAX; ScanSwitch++ ) { int NumTransi; NumTransi = pTransi->NumTransLinkedForStart[ ScanSwitch ]; if ( NumTransi!=-1 ) { TransiX = Seq->Transition[ NumTransi ].PosiX * Size - ShiftX; gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv2, y+SizeDiv3, TransiX+SizeDiv2, y+SizeDiv3); } } } // transitions linked (end of OR) if ( pTransi->NumTransLinkedForEnd[ 0 ]!=-1 ) { for ( ScanSwitch=0; ScanSwitch<NBR_SWITCHS_MAX; ScanSwitch++ ) { int NumTransi; NumTransi = pTransi->NumTransLinkedForEnd[ ScanSwitch ]; if ( NumTransi!=-1 ) { TransiX = Seq->Transition[ NumTransi ].PosiX * Size - ShiftX; gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv2, y+Size-SizeDiv3, TransiX+SizeDiv2, y+Size-SizeDiv3); } } } // cross step ? if ( pTransi->NumStepToActiv[ 0 ]!=-1 && pTransi->NumStepToDesactiv[ 0 ]!=-1 ) { pStep = &Seq->Step[ pTransi->NumStepToActiv[ 0 ] ]; pStep2 = &Seq->Step[ pTransi->NumStepToDesactiv[ 0 ] ]; StepX = pStep->PosiX; StepY = pStep->PosiY; if ( pTransi->PosiX!=StepX || pTransi->PosiY+1!=StepY ) { if ( pTransi->NumTransLinkedForEnd[ 0 ]==-1 ) { // draw v with step number (below transition) gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv3, y+Size-SizeDiv3, x+SizeDiv2, y+Size-SizeDiv3+SizeDiv4); gdk_draw_line(DrawPixmap, DynaGcOff, x+Size-SizeDiv3, y+Size-SizeDiv3, x+SizeDiv2, y+Size-SizeDiv3+SizeDiv4); gdk_draw_line(DrawPixmap, DynaGcOff, x+SizeDiv2, y+Size-SizeDiv3, x+SizeDiv2, y+Size-SizeDiv3+SizeDiv4); sprintf( BufTxt, "%d", pStep->StepNumber );#ifndef GTK2 gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc, x+SizeDiv3,y+Size-SizeDiv3+SizeDiv4+11,BufTxt,strlen(BufTxt));#else DrawTextGTK2( DrawPixmap, drawing_area->style->black_gc, x+SizeDiv3,y+Size-SizeDiv3+SizeDiv4+13, -1, -1, BufTxt );#endif // draw step number with v (above the cross step) StepX = StepX*Size - ShiftX; StepY = StepY*Size - ShiftY; gdk_draw_line(DrawPixmap, DynaGcOff, StepX+SizeDiv3, StepY-SizeDiv2, StepX+SizeDiv2, StepY-SizeDiv4); gdk_draw_line(DrawPixmap, DynaGcOff, StepX+Size-SizeDiv3, StepY-SizeDiv2, StepX+SizeDiv2, StepY-SizeDiv4); gdk_draw_line(DrawPixmap, DynaGcOff, StepX+SizeDiv2, StepY-SizeDiv4, StepX+SizeDiv2, StepY+1); if ( pStep->OffDrawCrossStep==0 ) sprintf( BufTxt, "%d", pStep2->StepNumber ); else sprintf( BufTxt, ";%d", pStep2->StepNumber );#ifndef GTK2 gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc, StepX+SizeDiv3+pStep->OffDrawCrossStep,StepY-SizeDiv4-9,BufTxt,strlen(BufTxt));#else DrawTextGTK2( DrawPixmap, drawing_area->style->black_gc, StepX+SizeDiv3+pStep->OffDrawCrossStep,StepY-SizeDiv4-7, -1, -1, BufTxt );#endif//printf("CrossStep n
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?