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

📄 drawing.c

📁 电路仿真程序 Classic Ladder is coded 100% in C.It can be used for educational purposes or anything you wan
💻 C
📖 第 1 页 / 共 2 页
字号:
                                x+WidDiv3*2,y+HeiDiv2, x+Width,y+HeiDiv2);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+Width-WidDiv4,y+HeiDiv2-1,"D",1);            /* output : running */            gdk_draw_line(DrawPixmap, (Timer->OutputRunning)?DynaGcOn:DynaGcOff,                                x+WidDiv3*2,y+HeiDiv2+Height, x+Width,y+HeiDiv2+Height);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+Width-WidDiv4,y+HeiDiv2-1+Height,"R",1);            /* Timer Number */            sprintf(BufTxt,"T%d",Element.VarNum);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+WidDiv2-Width,y+HeiDiv4-2,BufTxt,strlen(BufTxt));            /* Current Value */            if (!EditDatas.ModeEdit)            {                sprintf(BufTxt,Timer->DisplayFormat,(float)Timer->Value/(float)Timer->Base);                gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                            x+WidDiv2-2-Width,y+Height,BufTxt,strlen(BufTxt));            }            break;        case ELE_MONOSTABLE:            if (DrawForToolBar)                break;            Monostable = &MonostableArray[Element.VarNum];            /* the box */            gdk_draw_rectangle(DrawPixmap, drawing_area->style->white_gc, TRUE,                                x+WidDiv3-Width, y+HeiDiv3,                                Width+1*WidDiv3, Height+1*HeiDiv3);            gdk_draw_rectangle(DrawPixmap, DynaGcOff, FALSE,                                x+WidDiv3-Width, y+HeiDiv3,                                Width+1*WidDiv3, Height+1*HeiDiv3);            /* input */            gdk_draw_line(DrawPixmap, (Monostable->Input)?DynaGcOn:DynaGcOff,                                x-Width,y+HeiDiv2, x-Width+WidDiv3,y+HeiDiv2);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x-Width,y+HeiDiv2-1,"I^",2);            /* output : running */            gdk_draw_line(DrawPixmap, (Monostable->OutputRunning)?DynaGcOn:DynaGcOff,                                x+WidDiv3*2,y+HeiDiv2, x+Width,y+HeiDiv2);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+Width-WidDiv4,y+HeiDiv2-1,"R",1);            /* Monostable Number */            sprintf(BufTxt,"M%d",Element.VarNum);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+WidDiv2-Width,y+HeiDiv4-2,BufTxt,strlen(BufTxt));            /* Current Value */            if (!EditDatas.ModeEdit)            {                sprintf(BufTxt,Monostable->DisplayFormat,(float)Monostable->Value/(float)Monostable->Base);                gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                            x+WidDiv2-2-Width,y+Height,BufTxt,strlen(BufTxt));            }            break;        case ELE_COMPAR:            if (DrawForToolBar)                break;            /* the box */            gdk_draw_rectangle(DrawPixmap, drawing_area->style->white_gc, TRUE,                                x+WidDiv3-(Width*2), y+HeiDiv4,                                Width*2+1*WidDiv3, 2*HeiDiv4);            gdk_draw_rectangle(DrawPixmap, DynaGcOff, FALSE,                                x+WidDiv3-(Width*2), y+HeiDiv4,                                Width*2+1*WidDiv3, 2*HeiDiv4);            /* input */            gdk_draw_line(DrawPixmap, TheGc,                                x-Width*2,y+HeiDiv2, x-Width*2+WidDiv3,y+HeiDiv2);            /* output */            gdk_draw_line(DrawPixmap, TheGc,                                x+WidDiv3*2,y+HeiDiv2, x+Width,y+HeiDiv2);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+WidDiv4-(Width*2)+3,y+HeiDiv4-1,"COMPARE",strlen("COMPARE"));            /* arithmetic expression */            if (!EditDatas.ModeEdit)                strcpy(BufTxt,DisplayArithmExpr(ArithmExpr[Element.VarNum].Expr,(Width*2+1*WidDiv3)/8));            else                strcpy(BufTxt,DisplayArithmExpr(EditArithmExpr[Element.VarNum],(Width*2+1*WidDiv3)/8));            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+WidDiv3-(Width*2)+2,y+HeiDiv2+4,BufTxt,strlen(BufTxt));            break;        case ELE_OUTPUT_OPERATE:            if (DrawForToolBar)                break;            /* the box */            gdk_draw_rectangle(DrawPixmap, drawing_area->style->white_gc, TRUE,                                x+WidDiv3-(Width*2), y+HeiDiv4,                                Width*2+1*WidDiv3, 2*HeiDiv4);            gdk_draw_rectangle(DrawPixmap, DynaGcOff, FALSE,                                x+WidDiv3-(Width*2), y+HeiDiv4,                                Width*2+1*WidDiv3, 2*HeiDiv4);            /* input */            gdk_draw_line(DrawPixmap, TheGc,                                x-Width*2,y+HeiDiv2, x-Width*2+WidDiv3,y+HeiDiv2);            /* output */            gdk_draw_line(DrawPixmap, TheGc,                                x+WidDiv3*2,y+HeiDiv2, x+Width,y+HeiDiv2);            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+WidDiv4-(Width*2)+3,y+HeiDiv4-1,"OPERATE",strlen("OPERATE"));            /* arithmetic expression */            if (!EditDatas.ModeEdit)                strcpy(BufTxt,DisplayArithmExpr(ArithmExpr[Element.VarNum].Expr,(Width*2+1*WidDiv3)/8));            else                strcpy(BufTxt,DisplayArithmExpr(EditArithmExpr[Element.VarNum],(Width*2+1*WidDiv3)/8));            gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                        x+WidDiv3-(Width*2)+2,y+HeiDiv2+4,BufTxt,strlen(BufTxt));            break;    }    /* Drawing Var */    if (!DrawForToolBar)    {        switch(Element.Type)        {            case ELE_INPUT:            case ELE_INPUT_NOT:            case ELE_RISING_INPUT:            case ELE_FALLING_INPUT:            case ELE_OUTPUT:            case ELE_OUTPUT_NOT:            case ELE_OUTPUT_SET:            case ELE_OUTPUT_RESET:                strcpy(BufTxt,DisplayInfo(Element.VarType,Element.VarNum));                gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                                x+WidDiv4,y+HeiDiv4-2,BufTxt,strlen(BufTxt));                break;            case ELE_OUTPUT_JUMP:                gdk_draw_text(DrawPixmap, drawing_area->style->font, drawing_area->style->black_gc,                                x+1,y+HeiDiv4-2,RungArray[Element.VarNum].Label,                                strlen(RungArray[Element.VarNum].Label));                break;        }    }    /* Drawing cnx with top */    if (Element.ConnectedWithTop)    {        if (Element.DynamicInput)            gdk_draw_line(DrawPixmap, DynaGcOn,                x,y+HeiDiv2, x,y-HeiDiv2);        else            gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,                x,y+HeiDiv2, x,y-HeiDiv2);    }    /* specials used for Editor */    if (DrawForToolBar)    {        switch(Element.Type)        {            case EDIT_POINTER:                gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,                    x+WidDiv4,y+HeiDiv4, x+Width-WidDiv4,y+Height-HeiDiv4); /* \ */                gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,                    x+WidDiv4,y+HeiDiv4, x+WidDiv3,y+HeiDiv2);  /* | */                gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,                    x+WidDiv4,y+HeiDiv4, x+WidDiv2,y+HeiDiv3);  /* _ */                gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,                    x+WidDiv3,y+HeiDiv2, x+WidDiv2,y+HeiDiv3);                break;            case EDIT_CNX_WITH_TOP:                gdk_draw_line(DrawPixmap, drawing_area->style->black_gc,                    x+WidDiv2,y+HeiDiv4, x+WidDiv2,y+Height-HeiDiv4);                break;            case EDIT_LONG_CONNECTION:                gdk_draw_line(DrawPixmap, TheGc,                                x,y+HeiDiv2, x+Width-1,y+HeiDiv2);                gdk_draw_line(DrawPixmap, TheGc,                                x+3*WidDiv4-1,y+HeiDiv4, x+Width-1,y+HeiDiv2);                gdk_draw_line(DrawPixmap, TheGc,                                x+3*WidDiv4-1,y+3*HeiDiv4, x+Width-1,y+HeiDiv2);                gdk_draw_line(DrawPixmap, TheGc,                                x+3*WidDiv4-1,y+HeiDiv4, x+3*WidDiv4 +3,y+HeiDiv2);                gdk_draw_line(DrawPixmap, TheGc,                                x+3*WidDiv4 +3,y+HeiDiv2, x+3*WidDiv4-1,y+3*HeiDiv4);                break;            /* little display used for the toolbar */            case ELE_TIMER:                gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc, FALSE,                                    x+WidDiv4, y+HeiDiv4,                                    Width-2*WidDiv4, Height-2*HeiDiv4);                gdk_draw_text(DrawPixmap, drawing_area->style->font, TheGc,                            x+WidDiv3+2,y+HeiDiv3*2,"T",1);                break;            case ELE_MONOSTABLE:                gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc, FALSE,                                    x+WidDiv4, y+HeiDiv4,                                    Width-2*WidDiv4, Height-2*HeiDiv4);                gdk_draw_text(DrawPixmap, drawing_area->style->font, TheGc,                            x+WidDiv3+2,y+HeiDiv3*2,"M",1);                break;            case ELE_COMPAR:                gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc, FALSE,                                    x+WidDiv4, y+HeiDiv4,                                    Width-2*WidDiv4, Height-2*HeiDiv4);                gdk_draw_text(DrawPixmap, drawing_area->style->font, TheGc,                            x+WidDiv3+2,y+HeiDiv3*2,">",1);                break;            case ELE_OUTPUT_OPERATE:                gdk_draw_rectangle(DrawPixmap, drawing_area->style->black_gc, FALSE,                                    x+WidDiv4, y+HeiDiv4,                                    Width-2*WidDiv4, Height-2*HeiDiv4);                gdk_draw_text(DrawPixmap, drawing_area->style->font, TheGc,                            x+WidDiv3+2,y+HeiDiv3*2,"=",1);                break;        }    }    if (!EditDatas.ModeEdit)        gdk_gc_unref(DynaGcOn);}void DrawBars(){    gdk_draw_rectangle(pixmap, drawing_area->style->black_gc, TRUE,                                1, 1,                                3, BlockHeight*RUNG_HEIGHT);    gdk_draw_rectangle(pixmap, drawing_area->style->black_gc, TRUE,                                BlockWidth*RUNG_WIDTH+OFFSET_X, 1,                                3, BlockHeight*RUNG_HEIGHT);}void DrawGrid(){    int x,y;    GdkColor DynaGdkColor;    GdkGC * DynaGcOn;    DynaGdkColor.pixel = 0xF4F4F4;    DynaGdkColor.red = 0xF4;    DynaGdkColor.green = 0xF4;    DynaGdkColor.blue = 0xF4;    DynaGcOn = gdk_gc_new(pixmap);    gdk_gc_set_foreground(DynaGcOn,&DynaGdkColor);    for(x=BlockWidth; x<RUNG_WIDTH*BlockWidth; x=x+BlockWidth)    {        gdk_draw_line(pixmap, DynaGcOn,                x+OFFSET_X, OFFSET_Y, x+OFFSET_X, RUNG_HEIGHT*BlockHeight+OFFSET_Y);    }    for(y=BlockHeight; y<RUNG_HEIGHT*BlockHeight; y=y+BlockHeight)    {        gdk_draw_line(pixmap, DynaGcOn,                OFFSET_X, y+OFFSET_Y, RUNG_WIDTH*BlockWidth+OFFSET_X, y+OFFSET_Y);    }    gdk_gc_unref(DynaGcOn);}void DrawRung(StrRung * Rung,char CleanBefore){    int x,y;    GdkRectangle update_rect;    BlockWidth = BlockHeight = (GTK_WIDGET(drawing_area)->allocation.width - OFFSET_X -5) / RUNG_WIDTH;    #ifndef THICK_LINE_ELE_ACTIVATED    if (CleanBefore)    #endif    {            gdk_draw_rectangle(pixmap, drawing_area->style->white_gc, TRUE,                                0, 0, BlockWidth*RUNG_WIDTH+50, BlockHeight*RUNG_HEIGHT+50);    }    /* grid for edit mode */    if (EditDatas.ModeEdit)        DrawGrid();    DrawBars();    for (y=0;y<RUNG_HEIGHT;y++)    {        for(x=0;x<RUNG_WIDTH;x++)        {            DrawElement(pixmap,x*BlockWidth+OFFSET_X,y*BlockHeight+OFFSET_Y,BlockWidth,BlockHeight,Rung->Element[x][y],FALSE);        }    }    update_rect.x = 0;    update_rect.y = 0;    update_rect.width = GTK_WIDGET(drawing_area)->allocation.width;    update_rect.height = GTK_WIDGET(drawing_area)->allocation.height;    gtk_widget_draw (drawing_area, &update_rect);}

⌨️ 快捷键说明

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