void DrawObject (int type, void *ptr1, void *ptr2) { switch (type) { case VIA_TYPE: if (PCB->ViaOn) DrawVia ((PinType *) ptr2); break; case LINE_TYPE: if (((LayerType *) ptr1)->On) DrawLine ((LayerType *) ptr1, (LineType *) ptr2); break; case ARC_TYPE: if (((LayerType *) ptr1)->On) DrawArc ((LayerType *) ptr1, (ArcType *) ptr2); break; case TEXT_TYPE: if (((LayerType *) ptr1)->On) DrawText ((LayerType *) ptr1, (TextType *) ptr2); break; case POLYGON_TYPE: if (((LayerType *) ptr1)->On) DrawPolygon ((LayerType *) ptr1, (PolygonType *) ptr2); break; case ELEMENT_TYPE: if (PCB->ElementOn && (FRONT ((ElementType *) ptr2) || PCB->InvisibleObjectsOn)) DrawElement ((ElementType *) ptr2); break; case RATLINE_TYPE: if (PCB->RatOn) DrawRat ((RatType *) ptr2); break; case PIN_TYPE: if (PCB->PinOn) DrawPin ((PinType *) ptr2); break; case PAD_TYPE: if (PCB->PinOn) DrawPad ((PadType *) ptr2); break; case ELEMENTNAME_TYPE: if (PCB->ElementOn && (FRONT ((ElementType *) ptr2) || PCB->InvisibleObjectsOn)) DrawElementName ((ElementType *) ptr1); break; } }
/* --------------------------------------------------------------------------- * draw pins of an element */ void DrawElementPinsAndPads (ElementType *Element) { PAD_LOOP (Element); { if (doing_pinout || doing_assy || FRONT (pad) || PCB->InvisibleObjectsOn) DrawPad (pad); } END_LOOP; PIN_LOOP (Element); { DrawPin (pin); } END_LOOP; }
/* --------------------------------------------------------------------------- * toggle selection of pin * This SelectPin function was moved to here from the original netlist.c * as part of the gui code separation for the Gtk port. SelectPin() is * written by and is Copyright (C) 1998, 1999, 2000, 2001 harry eaton */ void SelectPin (LibraryEntryTypePtr entry, bool toggle) { ConnectionType conn; if (SeekPad (entry, &conn, false)) { switch (conn.type) { case PIN_TYPE: { PinTypePtr pin = (PinTypePtr) conn.ptr2; AddObjectToFlagUndoList (PIN_TYPE, conn.ptr1, conn.ptr2, conn.ptr2); if (toggle) { TOGGLE_FLAG (SELECTEDFLAG, pin); CenterDisplay (pin->X, pin->Y, false); } else SET_FLAG (SELECTEDFLAG, pin); DrawPin (pin, 0); break; } case PAD_TYPE: { PadTypePtr pad = (PadTypePtr) conn.ptr2; AddObjectToFlagUndoList (PAD_TYPE, conn.ptr1, conn.ptr2, conn.ptr2); if (toggle) { TOGGLE_FLAG (SELECTEDFLAG, pad); CenterDisplay (pad->Point1.X, pad->Point1.Y, false); } else SET_FLAG (SELECTEDFLAG, pad); DrawPad (pad, 0); break; } } } }
void *ChangePadClearSize( ElementTypePtr Element, PadTypePtr Pad ) { int eax; int ebx; int esi; BDimension value = Absolute; value = ( Pad->Clearance + Delta < ( PCB->Bloat + 1 ) * 2 ? Pad->Clearance + Delta : ( PCB->Bloat + 1 ) * 2 ) <= 0x989680 ? 0x989680 : Pad->Clearance + Delta < ( PCB->Bloat + 1 ) * 2 ? Pad->Clearance + Delta : ( PCB->Bloat + 1 ) * 2; if ( value + -100 <= 0x98961c && Pad->Clearance != value ) { AddObjectToClearSizeUndoList( 512, (void*)Element, (void*)Pad, (void*)Pad ); RestoreToPolygon( &PCB->Data, 512, (void*)Element, (void*)Pad ); ErasePad( Pad ); r_delete_entry( &PCB->Data->pad_tree, (int)( &Pad->BoundingBox ) ); Pad->Clearance = value; SetElementBoundingBox( &PCB->Data, Element, &PCB->Font ); ClearFromPolygon( &PCB->Data, 512, (void*)Element, (void*)Pad ); DrawPad( Pad, 0 ); return (void*)Pad; } }
void *ChangePadSize( ElementTypePtr Element, PadTypePtr Pad ) { int eax; int ebx; int esi; int edi; BDimension value = Absolute; if ( value + -100 <= 0x98961c && Pad->Thickness != value ) { AddObjectToSizeUndoList( 512, (void*)Element, (void*)Pad, (void*)Pad ); AddObjectToMaskSizeUndoList( 512, (void*)Element, (void*)Pad, (void*)Pad ); RestoreToPolygon( &PCB->Data, 512, (void*)Element, (void*)Pad ); ErasePad( Pad ); r_delete_entry( &PCB->Data->pad_tree, (int)( &Pad->BoundingBox ) ); Pad->Thickness = value; Pad->Mask = ( Pad->Mask + value ) - Pad->Thickness; SetElementBoundingBox( &PCB->Data, Element, &PCB->Font ); ClearFromPolygon( &PCB->Data, 512, (void*)Element, (void*)Pad ); DrawPad( Pad, 0 ); return (void*)Pad; } }
int main(int argc, char **argv) #endif { char fname[256]; char defname[] = "game.dat"; Boolean b_play; int dir; int inch; int num_step; int num; unsigned char steplog[MaxSteps]; #ifdef ENABLE_DL char buf[10]; struct high_record high; while (1) { num = 0; clear(); ansimore2("game/worker/welcome", false, 0, 0); while (num <= 0 || num > MAXDATA) { buf[0]=0; getdata(5, 61, "", buf, 5, 1, NULL, true); if (buf[0] == 0) return 0; num = atoi(buf); } sprintf(fname, "game/worker/%s.%d", defname, num); clear(); #else { if (argc > 2) { sprintf(fname, "%s/%s.%s", argv[1], defname, argv[2]); num=atoi(argv[2]); } else if (2 == argc) { if (strlen(argv[1]) > 255) exit(1); sprintf(fname, "%s.%s", defname, argv[1]); num=atoi(argv[1]); } else { strcpy(fname, defname); num==-1; } #endif num_step=0; load_highrecord(num, &high, -1); if (TRUE == InitData(fname)) { if (TRUE == InitPad()) { b_play = TRUE; DrawPad(); update_endline1(&high,num_step); inch = 0; while (b_play) { if (inch) { showdiff(); cleardiff(); move(scr_lns-1, scr_cols - 1); refresh(); } if (wingame()) { int newrecord; char buf[100]; newrecord=0; if (num_step<high.shortest||high.shortest==0) newrecord=load_highrecord(num, &high, num_step); clear(); move(12,15); prints("祝贺你,你成功的完成了这一关"); move(13,15); if (newrecord==1) { sprintf(buf,"你也创造了本关使用步数的纪录(%d步)!好厉害~",num_step); } else if (newrecord!=0) { sprintf(buf,"你也创造了本关使用步数的纪录(%d步)!",num_step); prints(buf); move(14,15); sprintf(buf,"不过,让点创纪录机会给别人吧~你都有%d个记录了:P\n",newrecord); } else { sprintf(buf,"你用了%d步,纪录是%d步。",num_step,high.shortest); } prints(buf); move(23, 0); clrtoeol(); prints("\x1b[m \x1b[5;1;33m按任何键继续 ..\x1b[m"); igetkey(); break; } if (num_step>MaxSteps) { char askbuf[100]; clear(); sprintf(askbuf,"你已经用了%d步还没有成功,重来么?(Y/N)",num_step); getdata(12,0,askbuf,buf,2,1,NULL,true); if (toupper(buf[0])=='N') break; b_play = InitPad(); DrawPad(); num_step=0; } inch = igetkey(); if ((' ' == inch)||(inch == '\n')||(inch=='\r')) break; dir = NullDir; switch (inch) { case 'i': case 'I': case KEY_UP: dir = North; break; case 'j': case 'J': case KEY_LEFT: dir = West; break; case 'l': case 'L': case KEY_RIGHT: dir = East; break; case 'k': case 'K': case KEY_DOWN: dir = South; break; case 12: // Ctrl-L case 'R': // Ctrl-L clear(); DrawPad(); break; case '\t': b_play = InitPad(); DrawPad(); num_step=0; update_endline1(&high,num_step); break; case Ctrl('H'): case '\177': case KEY_DEL: if (num_step!=0) { num_step--; regretmove(steplog[num_step]); update_endline1(&high,num_step); } break; default: break; } if (NullDir != dir) { int ret; if ((ret=workermove(dir))!=0) { if (ret==2) steplog[num_step]=dir+8; else steplog[num_step]=dir; num_step++; update_endline1(&high,num_step); } } } } DestroyPad(); } DestroyData(); } return 0; }
void BattleMode() { system("cls"); srand(time(NULL)); DrawPad(TRUE); AttackOfPlayer0=0; AttackOfPlayer1=0; TempClub club0(rand()%19+1,0,0); TempClub club1(rand()%19+1,1,1); int a=rand()%19+1; int b=rand()%19+1; int flag0=0,flag1=0; NextClubRefresh(a); NextClubRefresh(b,1); ScoreFresh(1); continue_choosed=3; AttackFresh(0); AttackFresh(1); GamePlay: while(TRUE) { for(int n=1;n<=(fps/100);++n) { Sleep(50); if(KEYDOWN(VK_A)) {club0.MoveLeft();Sleep(50);} if(KEYDOWN(VK_LEFT) ) {club1.MoveLeft();Sleep(50);} if(KEYDOWN(VK_D)) {club0.MoveRight();Sleep(50);} if(KEYDOWN(VK_RIGHT)) {club1.MoveRight();Sleep(50);} if(KEYDOWN(VK_W)) {club0.Rotation();Sleep(50);} if(KEYDOWN(VK_UP)) {club1.Rotation();Sleep(50);} if(KEYDOWN(VK_DOWN) || KEYDOWN(VK_S)) {n+=8;} if(KEYDOWN(VK_SPACE) && AttackOfPlayer0>0 ) {AttackOfPlayer0--;AttackFresh(0);SetCursor(2,15);cout<<"Attack";Sleep(50);goto AAttackB;} if(KEYDOWN(VK_NUMPAD0) && AttackOfPlayer1>0 ) {AttackOfPlayer1--;AttackFresh(1);SetCursor(55,15);cout<<"Attack";Sleep(50);goto BAttackA;} } if(club0.isMoveable()==0) {club0.refresh(a,1);if((continue_choosed==0)||(continue_choosed==1)){break;}a=rand()%19+1;NextClubRefresh(a,0);} if(club1.isMoveable()==0) {club1.refresh(b,1);if((continue_choosed==0)||(continue_choosed==1)){break;}b=rand()%19+1;NextClubRefresh(b,1);} if(isFull(0)==1) {AttackOfPlayer0 +=deleteLine(0);AttackFresh(0);AttackFresh(1);ScoreFresh(0);} if(isFull(1)==1) {AttackOfPlayer1 +=deleteLine(1);AttackFresh(1);AttackFresh(1);ScoreFresh(1);} club0.MoveDown(); club1.MoveDown(); } goto END; AAttackB: flag0=0,flag1=0; while(TRUE) { for(int n=1;n<=(fps/100);++n) { Sleep(50); if(KEYDOWN(VK_A)) {club0.MoveLeft();Sleep(50);} if(KEYDOWN(VK_LEFT) ) {club1.MoveLeft();Sleep(50);} if(KEYDOWN(VK_D)) {club0.MoveRight();Sleep(50);} if(KEYDOWN(VK_RIGHT)) {club1.MoveRight();Sleep(50);} if(KEYDOWN(VK_W)) {club0.Rotation();Sleep(50);} if(KEYDOWN(VK_UP)) {club1.Rotation();Sleep(50);} if(KEYDOWN(VK_DOWN) || KEYDOWN(VK_S)) {n+=8;} if(KEYDOWN(VK_SPACE)) {SetCursor(2,15);cout<<" ";AttackOfPlayer0++;AttackFresh(0);Sleep(50);goto GamePlay;} } if(club0.isMoveable()==0&&flag0==0) {flag0=1;for(int n=0;n<=3;++n)for(int m=0;m<=3;++m)playground[club0.X+n][club0.Y+m]=(club0.ClubType[n][m] || playground[club0.X+n][club0.Y+m]);} if(club1.isMoveable()==0&&flag1==0) {flag1=1;for(int n=0;n<=3;++n)for(int m=0;m<=3;++m)playground[club1.X+n][club1.Y+m]=(club1.ClubType[n][m] || playground[club1.X+n+50][club1.Y+m]);} if(isFull(0)==1) {AttackOfPlayer0+=deleteLine(0);AttackFresh(0);ScoreFresh(1);} if(isFull(1)==1) {AttackOfPlayer1+=deleteLine(1);AttackFresh(1);ScoreFresh(1);} club0.MoveDown(); club1.MoveDown(); if(club0.isMoveable()==0&&club1.isMoveable()==0)break; } club1.fresh(rand()%19+1); while(TRUE) { for(int n=1;n<=(fps/100);++n) { Sleep(50); if(KEYDOWN(VK_A) ) {club1.MoveLeft();Sleep(50);} if(KEYDOWN(VK_D)) {club1.MoveRight();Sleep(50);} if(KEYDOWN(VK_W)) {club1.Rotation();Sleep(50);} if(KEYDOWN(VK_S)) {n+=8;} } club1.MoveDown(); if(club1.isMoveable()==0) {for(int n=0;n<=3;++n)for(int m=0;m<=3;++m)playground[club1.X+n][club1.Y+m]=(club1.ClubType[n][m] || playground[club1.X+n][club1.Y+m]);break;} } if(isFull(1)==1) {deleteLine(1);} club0.fresh(a); a=rand()%19+1; NextClubRefresh(a,0); club1.fresh(b); b=rand()%19+1; NextClubRefresh(b,1); SetCursor(2,15);cout<<" "; goto GamePlay; BAttackA: flag0=0,flag1=0; while(TRUE) { for(int n=1;n<=(fps/100);++n) { Sleep(50); if(KEYDOWN(VK_A)) {club0.MoveLeft();Sleep(50);} if(KEYDOWN(VK_LEFT) ) {club1.MoveLeft();Sleep(50);} if(KEYDOWN(VK_D)) {club0.MoveRight();Sleep(50);} if(KEYDOWN(VK_RIGHT)) {club1.MoveRight();Sleep(50);} if(KEYDOWN(VK_W)) {club0.Rotation();Sleep(50);} if(KEYDOWN(VK_UP)) {club1.Rotation();Sleep(50);} if(KEYDOWN(VK_DOWN) || KEYDOWN(VK_S)) {n+=8;} if(KEYDOWN(VK_NUMPAD0)) {SetCursor(55,15);cout<<" ";AttackOfPlayer1++;AttackFresh(1);Sleep(50);goto GamePlay;} } if(club0.isMoveable()==0&&flag0==0) {flag0=1;for(int n=0;n<=3;++n)for(int m=0;m<=3;++m)playground[club0.X+n][club0.Y+m]=(club0.ClubType[n][m] || playground[club0.X+n][club0.Y+m]);} if(club1.isMoveable()==0&&flag1==0) {flag1=1;for(int n=0;n<=3;++n)for(int m=0;m<=3;++m)playground[club1.X+n][club1.Y+m]=(club1.ClubType[n][m] || playground[club1.X+n+50][club1.Y+m]);} if(isFull(0)==1) {AttackOfPlayer0+=deleteLine(0);AttackFresh(0);ScoreFresh(1);} if(isFull(1)==1) {AttackOfPlayer1+=deleteLine(1);AttackFresh(1);ScoreFresh(1);} club0.MoveDown(); club1.MoveDown(); if(club0.isMoveable()==0&&club1.isMoveable()==0)break; } club0.fresh(rand()%19+1); while(TRUE) { for(int n=1;n<=(fps/100);++n) { Sleep(50); if(KEYDOWN(VK_LEFT) ) {club0.MoveLeft();Sleep(50);} if(KEYDOWN(VK_RIGHT)) {club0.MoveRight();Sleep(50);} if(KEYDOWN(VK_UP)) {club0.Rotation();Sleep(50);} if(KEYDOWN(VK_DOWN)) {n+=8;} } club0.MoveDown(); if(club0.isMoveable()==0) {for(int n=0;n<=3;++n)for(int m=0;m<=3;++m)playground[club0.X+n][club0.Y+m]=(club0.ClubType[n][m] || playground[club0.X+n][club0.Y+m]);break;} } if(isFull(1)==1) {deleteLine(1);} club0.fresh(a); a=rand()%19+1; NextClubRefresh(a,0); club1.fresh(b); b=rand()%19+1; NextClubRefresh(b,1); SetCursor(55,15);cout<<" "; goto GamePlay; END:; }
bool SelectObjectByName (int Type, char *Pattern, bool Flag) { bool changed = false; #if defined(HAVE_REGCOMP) #define REGEXEC(arg) (regexec_match_all(&compiled, (arg))) int result; regex_t compiled; /* compile the regular expression */ result = regcomp (&compiled, Pattern, REG_EXTENDED | REG_ICASE); if (result) { char errorstring[128]; regerror (result, &compiled, errorstring, 128); Message (_("regexp error: %s\n"), errorstring); regfree (&compiled); return (false); } #else #define REGEXEC(arg) (re_exec((arg)) == 1) char *compiled; /* compile the regular expression */ if ((compiled = re_comp (Pattern)) != NULL) { Message (_("re_comp error: %s\n"), compiled); return (false); } #endif /* loop over all visible objects with names */ if (Type & TEXT_TYPE) ALLTEXT_LOOP (PCB->Data); { if (!TEST_FLAG (LOCKFLAG, text) && TEXT_IS_VISIBLE (PCB, layer, text) && text->TextString && REGEXEC (text->TextString) && TEST_FLAG (SELECTEDFLAG, text) != Flag) { AddObjectToFlagUndoList (TEXT_TYPE, layer, text, text); ASSIGN_FLAG (SELECTEDFLAG, Flag, text); DrawText (layer, text, 0); changed = true; } } ENDALL_LOOP; if (PCB->ElementOn && (Type & ELEMENT_TYPE)) ELEMENT_LOOP (PCB->Data); { if (!TEST_FLAG (LOCKFLAG, element) && ((TEST_FLAG (ONSOLDERFLAG, element) != 0) == SWAP_IDENT || PCB->InvisibleObjectsOn) && TEST_FLAG (SELECTEDFLAG, element) != Flag) { String name = ELEMENT_NAME (PCB, element); if (name && REGEXEC (name)) { AddObjectToFlagUndoList (ELEMENT_TYPE, element, element, element); ASSIGN_FLAG (SELECTEDFLAG, Flag, element); PIN_LOOP (element); { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); ASSIGN_FLAG (SELECTEDFLAG, Flag, pin); } END_LOOP; PAD_LOOP (element); { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); ASSIGN_FLAG (SELECTEDFLAG, Flag, pad); } END_LOOP; ELEMENTTEXT_LOOP (element); { AddObjectToFlagUndoList (ELEMENTNAME_TYPE, element, text, text); ASSIGN_FLAG (SELECTEDFLAG, Flag, text); } END_LOOP; DrawElementName (element, 0); DrawElement (element, 0); changed = true; } } } END_LOOP; if (PCB->PinOn && (Type & PIN_TYPE)) ALLPIN_LOOP (PCB->Data); { if (!TEST_FLAG (LOCKFLAG, element) && pin->Name && REGEXEC (pin->Name) && TEST_FLAG (SELECTEDFLAG, pin) != Flag) { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); ASSIGN_FLAG (SELECTEDFLAG, Flag, pin); DrawPin (pin, 0); changed = true; } } ENDALL_LOOP; if (PCB->PinOn && (Type & PAD_TYPE)) ALLPAD_LOOP (PCB->Data); { if (!TEST_FLAG (LOCKFLAG, element) && ((TEST_FLAG (ONSOLDERFLAG, pad) != 0) == SWAP_IDENT || PCB->InvisibleObjectsOn) && TEST_FLAG (SELECTEDFLAG, pad) != Flag) if (pad->Name && REGEXEC (pad->Name)) { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); ASSIGN_FLAG (SELECTEDFLAG, Flag, pad); DrawPad (pad, 0); changed = true; } } ENDALL_LOOP; if (PCB->ViaOn && (Type & VIA_TYPE)) VIA_LOOP (PCB->Data); { if (!TEST_FLAG (LOCKFLAG, via) && via->Name && REGEXEC (via->Name) && TEST_FLAG (SELECTEDFLAG, via) != Flag) { AddObjectToFlagUndoList (VIA_TYPE, via, via, via); ASSIGN_FLAG (SELECTEDFLAG, Flag, via); DrawVia (via, 0); changed = true; } } END_LOOP; #if defined(HAVE_REGCOMP) #if !defined(sgi) regfree (&compiled); #endif #endif if (changed) { IncrementUndoSerialNumber (); Draw (); } return (changed); }
/* ---------------------------------------------------------------------- * selects/unselects all objects which were found during a connection scan * Flag determines if they are to be selected or unselected * returns true if the state of any object has changed * * text objects and elements cannot be selected by this routine */ bool SelectConnection (bool Flag) { bool changed = false; if (PCB->RatOn) RAT_LOOP (PCB->Data); { if (TEST_FLAG (FOUNDFLAG, line)) { AddObjectToFlagUndoList (RATLINE_TYPE, line, line, line); ASSIGN_FLAG (SELECTEDFLAG, Flag, line); DrawRat (line, 0); changed = true; } } END_LOOP; VISIBLELINE_LOOP (PCB->Data); { if (TEST_FLAG (FOUNDFLAG, line) && !TEST_FLAG (LOCKFLAG, line)) { AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); ASSIGN_FLAG (SELECTEDFLAG, Flag, line); DrawLine (layer, line, 0); changed = true; } } ENDALL_LOOP; VISIBLEARC_LOOP (PCB->Data); { if (TEST_FLAG (FOUNDFLAG, arc) && !TEST_FLAG (LOCKFLAG, arc)) { AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); ASSIGN_FLAG (SELECTEDFLAG, Flag, arc); DrawArc (layer, arc, 0); changed = true; } } ENDALL_LOOP; VISIBLEPOLYGON_LOOP (PCB->Data); { if (TEST_FLAG (FOUNDFLAG, polygon) && !TEST_FLAG (LOCKFLAG, polygon)) { AddObjectToFlagUndoList (POLYGON_TYPE, layer, polygon, polygon); ASSIGN_FLAG (SELECTEDFLAG, Flag, polygon); DrawPolygon (layer, polygon, 0); changed = true; } } ENDALL_LOOP; if (PCB->PinOn && PCB->ElementOn) { ALLPIN_LOOP (PCB->Data); { if (!TEST_FLAG (LOCKFLAG, element) && TEST_FLAG (FOUNDFLAG, pin)) { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); ASSIGN_FLAG (SELECTEDFLAG, Flag, pin); DrawPin (pin, 0); changed = true; } } ENDALL_LOOP; ALLPAD_LOOP (PCB->Data); { if (!TEST_FLAG (LOCKFLAG, element) && TEST_FLAG (FOUNDFLAG, pad)) { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); ASSIGN_FLAG (SELECTEDFLAG, Flag, pad); DrawPad (pad, 0); changed = true; } } ENDALL_LOOP; } if (PCB->ViaOn) VIA_LOOP (PCB->Data); { if (TEST_FLAG (FOUNDFLAG, via) && !TEST_FLAG (LOCKFLAG, via)) { AddObjectToFlagUndoList (VIA_TYPE, via, via, via); ASSIGN_FLAG (SELECTEDFLAG, Flag, via); DrawVia (via, 0); changed = true; } } END_LOOP; Draw (); return (changed); }
/* ---------------------------------------------------------------------- * selects/unselects all visible objects within the passed box * Flag determines if the block is to be selected or unselected * returns true if the state of any object has changed */ bool SelectBlock (BoxTypePtr Box, bool Flag) { bool changed = false; if (PCB->RatOn || !Flag) RAT_LOOP (PCB->Data); { if (LINE_IN_BOX ((LineTypePtr) line, Box) && !TEST_FLAG (LOCKFLAG, line) && TEST_FLAG (SELECTEDFLAG, line) != Flag) { AddObjectToFlagUndoList (RATLINE_TYPE, line, line, line); ASSIGN_FLAG (SELECTEDFLAG, Flag, line); if (PCB->RatOn) DrawRat (line, 0); changed = true; } } END_LOOP; /* check layers */ LAYER_LOOP(PCB->Data, max_copper_layer + 2); { if (layer == & PCB->Data->SILKLAYER) { if (! (PCB->ElementOn || !Flag)) continue; } else if (layer == & PCB->Data->BACKSILKLAYER) { if (! (PCB->InvisibleObjectsOn || !Flag)) continue; } else if (! (layer->On || !Flag)) continue; LINE_LOOP (layer); { if (LINE_IN_BOX (line, Box) && !TEST_FLAG (LOCKFLAG, line) && TEST_FLAG (SELECTEDFLAG, line) != Flag) { AddObjectToFlagUndoList (LINE_TYPE, layer, line, line); ASSIGN_FLAG (SELECTEDFLAG, Flag, line); if (layer->On) DrawLine (layer, line, 0); changed = true; } } END_LOOP; ARC_LOOP (layer); { if (ARC_IN_BOX (arc, Box) && !TEST_FLAG (LOCKFLAG, arc) && TEST_FLAG (SELECTEDFLAG, arc) != Flag) { AddObjectToFlagUndoList (ARC_TYPE, layer, arc, arc); ASSIGN_FLAG (SELECTEDFLAG, Flag, arc); if (layer->On) DrawArc (layer, arc, 0); changed = true; } } END_LOOP; TEXT_LOOP (layer); { if (!Flag || TEXT_IS_VISIBLE(PCB, layer, text)) { if (TEXT_IN_BOX (text, Box) && !TEST_FLAG (LOCKFLAG, text) && TEST_FLAG (SELECTEDFLAG, text) != Flag) { AddObjectToFlagUndoList (TEXT_TYPE, layer, text, text); ASSIGN_FLAG (SELECTEDFLAG, Flag, text); if (TEXT_IS_VISIBLE(PCB, layer, text)) DrawText (layer, text, 0); changed = true; } } } END_LOOP; POLYGON_LOOP (layer); { if (POLYGON_IN_BOX (polygon, Box) && !TEST_FLAG (LOCKFLAG, polygon) && TEST_FLAG (SELECTEDFLAG, polygon) != Flag) { AddObjectToFlagUndoList (POLYGON_TYPE, layer, polygon, polygon); ASSIGN_FLAG (SELECTEDFLAG, Flag, polygon); if (layer->On) DrawPolygon (layer, polygon, 0); changed = true; } } END_LOOP; } END_LOOP; /* elements */ ELEMENT_LOOP (PCB->Data); { { bool gotElement = false; if ((PCB->ElementOn || !Flag) && !TEST_FLAG (LOCKFLAG, element) && ((TEST_FLAG (ONSOLDERFLAG, element) != 0) == SWAP_IDENT || PCB->InvisibleObjectsOn)) { if (BOX_IN_BOX (&ELEMENT_TEXT (PCB, element).BoundingBox, Box) && !TEST_FLAG (LOCKFLAG, &ELEMENT_TEXT (PCB, element)) && TEST_FLAG (SELECTEDFLAG, &ELEMENT_TEXT (PCB, element)) != Flag) { /* select all names of element */ ELEMENTTEXT_LOOP (element); { AddObjectToFlagUndoList (ELEMENTNAME_TYPE, element, text, text); ASSIGN_FLAG (SELECTEDFLAG, Flag, text); } END_LOOP; if (PCB->ElementOn) DrawElementName (element, 0); changed = true; } if ((PCB->PinOn || !Flag) && ELEMENT_IN_BOX (element, Box)) if (TEST_FLAG (SELECTEDFLAG, element) != Flag) { AddObjectToFlagUndoList (ELEMENT_TYPE, element, element, element); ASSIGN_FLAG (SELECTEDFLAG, Flag, element); PIN_LOOP (element); { if (TEST_FLAG (SELECTEDFLAG, pin) != Flag) { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); ASSIGN_FLAG (SELECTEDFLAG, Flag, pin); if (PCB->PinOn) DrawPin (pin, 0); changed = true; } } END_LOOP; PAD_LOOP (element); { if (TEST_FLAG (SELECTEDFLAG, pad) != Flag) { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); ASSIGN_FLAG (SELECTEDFLAG, Flag, pad); if (PCB->PinOn) DrawPad (pad, 0); changed = true; } } END_LOOP; if (PCB->PinOn) DrawElement (element, 0); changed = true; gotElement = true; } } if ((PCB->PinOn || !Flag) && !TEST_FLAG (LOCKFLAG, element) && !gotElement) { PIN_LOOP (element); { if ((VIA_OR_PIN_IN_BOX (pin, Box) && TEST_FLAG (SELECTEDFLAG, pin) != Flag)) { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); ASSIGN_FLAG (SELECTEDFLAG, Flag, pin); if (PCB->PinOn) DrawPin (pin, 0); changed = true; } } END_LOOP; PAD_LOOP (element); { if (PAD_IN_BOX (pad, Box) && TEST_FLAG (SELECTEDFLAG, pad) != Flag) { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); ASSIGN_FLAG (SELECTEDFLAG, Flag, pad); if (PCB->PinOn) DrawPad (pad, 0); changed = true; } } END_LOOP; } } } END_LOOP; /* end with vias */ if (PCB->ViaOn || !Flag) VIA_LOOP (PCB->Data); { if (VIA_OR_PIN_IN_BOX (via, Box) && !TEST_FLAG (LOCKFLAG, via) && TEST_FLAG (SELECTEDFLAG, via) != Flag) { AddObjectToFlagUndoList (VIA_TYPE, via, via, via); ASSIGN_FLAG (SELECTEDFLAG, Flag, via); if (PCB->ViaOn) DrawVia (via, 0); changed = true; } } END_LOOP; if (changed) { Draw (); IncrementUndoSerialNumber (); } return (changed); }
/* --------------------------------------------------------------------------- * toggles the selection of any kind of object * the different types are defined by search.h */ bool SelectObject (void) { void *ptr1, *ptr2, *ptr3; LayerTypePtr layer; int type; bool changed = true; type = SearchScreen (Crosshair.X, Crosshair.Y, SELECT_TYPES, &ptr1, &ptr2, &ptr3); if (type == NO_TYPE || TEST_FLAG (LOCKFLAG, (PinTypePtr) ptr2)) return (false); switch (type) { case VIA_TYPE: AddObjectToFlagUndoList (VIA_TYPE, ptr1, ptr1, ptr1); TOGGLE_FLAG (SELECTEDFLAG, (PinTypePtr) ptr1); DrawVia ((PinTypePtr) ptr1, 0); break; case LINE_TYPE: { LineType *line = (LineTypePtr) ptr2; layer = (LayerTypePtr) ptr1; AddObjectToFlagUndoList (LINE_TYPE, ptr1, ptr2, ptr2); TOGGLE_FLAG (SELECTEDFLAG, line); DrawLine (layer, line, 0); break; } case RATLINE_TYPE: { RatTypePtr rat = (RatTypePtr) ptr2; AddObjectToFlagUndoList (RATLINE_TYPE, ptr1, ptr1, ptr1); TOGGLE_FLAG (SELECTEDFLAG, rat); DrawRat (rat, 0); break; } case ARC_TYPE: { ArcType *arc = (ArcTypePtr) ptr2; layer = (LayerTypePtr) ptr1; AddObjectToFlagUndoList (ARC_TYPE, ptr1, ptr2, ptr2); TOGGLE_FLAG (SELECTEDFLAG, arc); DrawArc (layer, arc, 0); break; } case TEXT_TYPE: { TextType *text = (TextTypePtr) ptr2; layer = (LayerTypePtr) ptr1; AddObjectToFlagUndoList (TEXT_TYPE, ptr1, ptr2, ptr2); TOGGLE_FLAG (SELECTEDFLAG, text); DrawText (layer, text, 0); break; } case POLYGON_TYPE: { PolygonType *poly = (PolygonTypePtr) ptr2; layer = (LayerTypePtr) ptr1; AddObjectToFlagUndoList (POLYGON_TYPE, ptr1, ptr2, ptr2); TOGGLE_FLAG (SELECTEDFLAG, poly); DrawPolygon (layer, poly, 0); /* changing memory order no longer effects draw order */ break; } case PIN_TYPE: AddObjectToFlagUndoList (PIN_TYPE, ptr1, ptr2, ptr2); TOGGLE_FLAG (SELECTEDFLAG, (PinTypePtr) ptr2); DrawPin ((PinTypePtr) ptr2, 0); break; case PAD_TYPE: AddObjectToFlagUndoList (PAD_TYPE, ptr1, ptr2, ptr2); TOGGLE_FLAG (SELECTEDFLAG, (PadTypePtr) ptr2); DrawPad ((PadTypePtr) ptr2, 0); break; case ELEMENTNAME_TYPE: { ElementTypePtr element = (ElementTypePtr) ptr1; /* select all names of the element */ ELEMENTTEXT_LOOP (element); { AddObjectToFlagUndoList (ELEMENTNAME_TYPE, element, text, text); TOGGLE_FLAG (SELECTEDFLAG, text); } END_LOOP; DrawElementName (element, 0); break; } case ELEMENT_TYPE: { ElementTypePtr element = (ElementTypePtr) ptr1; /* select all pins and names of the element */ PIN_LOOP (element); { AddObjectToFlagUndoList (PIN_TYPE, element, pin, pin); TOGGLE_FLAG (SELECTEDFLAG, pin); } END_LOOP; PAD_LOOP (element); { AddObjectToFlagUndoList (PAD_TYPE, element, pad, pad); TOGGLE_FLAG (SELECTEDFLAG, pad); } END_LOOP; ELEMENTTEXT_LOOP (element); { AddObjectToFlagUndoList (ELEMENTNAME_TYPE, element, text, text); TOGGLE_FLAG (SELECTEDFLAG, text); } END_LOOP; AddObjectToFlagUndoList (ELEMENT_TYPE, element, element, element); TOGGLE_FLAG (SELECTEDFLAG, element); if (PCB->ElementOn && ((TEST_FLAG (ONSOLDERFLAG, element) != 0) == SWAP_IDENT || PCB->InvisibleObjectsOn)) if (PCB->ElementOn) { DrawElementName (element, 0); DrawElementPackage (element, 0); } if (PCB->PinOn) DrawElementPinsAndPads (element, 0); break; } } Draw (); IncrementUndoSerialNumber (); return (changed); }