void D_PAD::Flip( int aTranslationY ) { int y = GetPosition().y - aTranslationY; y = -y; // invert about x axis. y += aTranslationY; SetY( y ); NEGATE( m_Pos0.y ); NEGATE( m_Offset.y ); NEGATE( m_DeltaSize.y ); SetOrientation( -GetOrientation() ); // flip pads layers SetLayerMask( ChangeSideMaskLayer( m_layerMask ) ); // m_boundingRadius = -1; the shape has not been changed }
void WinEDA_BasePcbFrame::Change_Side_Module(MODULE * Module, wxDC * DC) /**********************************************************************/ /* Change de cote un composant : il y a inversion MIROIR autour de l'axe X Le changement n'est fait que si la couche est - CUIVRE ou CMP Si DC == NULL, il n'y a pas de redessin du composant et du chevelu */ { D_PAD* pt_pad ; TEXTE_MODULE* pt_texte; EDGE_MODULE * pt_edgmod ; EDA_BaseStruct * PtStruct; if ( Module == NULL ) return; if( (Module->m_Layer != CMP_N) && (Module->m_Layer != CUIVRE_N) ) return; m_CurrentScreen->SetModify(); if ( ! (Module->m_Flags & IS_MOVED) ) { m_Pcb->m_Status_Pcb &= ~( LISTE_CHEVELU_OK | CONNEXION_OK); if ( DC ) Module->Draw(DrawPanel, DC, wxPoint(0,0), GR_XOR); /* Effacement chevelu general si necessaire */ if ( DC && g_Show_Ratsnest) DrawGeneralRatsnest(DC); /* Init des variables utilisees dans la routine Dessine_Drag_segment() */ g_Offset_Module.x = 0; g_Offset_Module.y = 0; } else // Module en deplacement { /* efface empreinte ( vue en contours) si elle a ete deja dessinee */ if ( DC ) { DrawModuleOutlines(DrawPanel, DC, Module); Dessine_Segments_Dragges(DrawPanel, DC); } } /* mise a jour du Flag de l'empreinte et des couches des contours et textes */ Module->m_Layer = ChangeSideNumLayer(Module->m_Layer); /* Inversion miroir de l'orientation */ Module->m_Orient = - Module->m_Orient; NORMALIZE_ANGLE_POS(Module->m_Orient); /* Inversion miroir + layers des pastilles */ pt_pad = Module->m_Pads; for ( ; pt_pad != NULL; pt_pad = (D_PAD*) pt_pad->Pnext ) { pt_pad->m_Pos.y -= Module->m_Pos.y ; pt_pad->m_Pos.y = -pt_pad->m_Pos.y; pt_pad->m_Pos.y += Module->m_Pos.y; pt_pad->m_Pos0.y = - pt_pad->m_Pos0.y; pt_pad->m_Offset.y = -pt_pad->m_Offset.y; pt_pad->m_DeltaSize.y = -pt_pad->m_DeltaSize.y; NEGATE_AND_NORMALIZE_ANGLE_POS(pt_pad->m_Orient); /* change cote pour pastilles surfaciques */ pt_pad->m_Masque_Layer = ChangeSideMaskLayer(pt_pad->m_Masque_Layer); } /* Inversion miroir de la Reference et mise en miroir : */ pt_texte = Module->m_Reference; pt_texte->m_Pos.y -= Module->m_Pos.y; pt_texte->m_Pos.y = -pt_texte->m_Pos.y; pt_texte->m_Pos.y += Module->m_Pos.y; pt_texte->m_Pos0.y = pt_texte->m_Pos0.y; pt_texte->m_Miroir = 1 ; NEGATE_AND_NORMALIZE_ANGLE_POS(pt_texte->m_Orient); pt_texte->m_Layer = Module->m_Layer; pt_texte->m_Layer = ChangeSideNumLayer(pt_texte->m_Layer); if( Module->m_Layer == CUIVRE_N) pt_texte->m_Layer = SILKSCREEN_N_CU; if( Module->m_Layer == CMP_N) pt_texte->m_Layer = SILKSCREEN_N_CMP; if( (Module->m_Layer == SILKSCREEN_N_CU) || (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) ) pt_texte->m_Miroir = 0 ; /* Inversion miroir de la Valeur et mise en miroir : */ pt_texte = Module->m_Value; pt_texte->m_Pos.y -= Module->m_Pos.y; pt_texte->m_Pos.y = -pt_texte->m_Pos.y; pt_texte->m_Pos.y += Module->m_Pos.y; pt_texte->m_Pos0.y = pt_texte->m_Pos0.y; pt_texte->m_Miroir = 1 ; NEGATE_AND_NORMALIZE_ANGLE_POS(pt_texte->m_Orient); pt_texte->m_Layer = Module->m_Layer; pt_texte->m_Layer = ChangeSideNumLayer(pt_texte->m_Layer); if( Module->m_Layer == CUIVRE_N) pt_texte->m_Layer = SILKSCREEN_N_CU; if( Module->m_Layer == CMP_N) pt_texte->m_Layer = SILKSCREEN_N_CMP; if( (Module->m_Layer == SILKSCREEN_N_CU) || (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N) ) pt_texte->m_Miroir = 0 ; /* Inversion miroir des dessins de l'empreinte : */ PtStruct = Module->m_Drawings; for( ; PtStruct != NULL; PtStruct = PtStruct->Pnext) { switch( PtStruct->m_StructType) { case TYPEEDGEMODULE: pt_edgmod = (EDGE_MODULE *) PtStruct; pt_edgmod->m_Start.y -= Module->m_Pos.y; pt_edgmod->m_Start.y = -pt_edgmod->m_Start.y ; pt_edgmod->m_Start.y += Module->m_Pos.y; pt_edgmod->m_End.y -= Module->m_Pos.y; pt_edgmod->m_End.y = -pt_edgmod->m_End.y ; pt_edgmod->m_End.y += Module->m_Pos.y; /* inversion des coords locales */ pt_edgmod->m_Start0.y = -pt_edgmod->m_Start0.y; pt_edgmod->m_End0.y = -pt_edgmod->m_End0.y; if ( pt_edgmod->m_Shape == S_ARC ) { pt_edgmod->m_Angle = - pt_edgmod->m_Angle; } pt_edgmod->m_Layer = ChangeSideNumLayer(pt_edgmod->m_Layer); break; case TYPETEXTEMODULE: /* Inversion miroir de la position et mise en miroir : */ pt_texte = (TEXTE_MODULE*)PtStruct; pt_texte->m_Pos.y -= Module->m_Pos.y; pt_texte->m_Pos.y = -pt_texte->m_Pos.y; pt_texte->m_Pos.y += Module->m_Pos.y; pt_texte->m_Pos0.y = pt_texte->m_Pos0.y; pt_texte->m_Miroir = 1 ; NEGATE_AND_NORMALIZE_ANGLE_POS(pt_texte->m_Orient); pt_texte->m_Layer = Module->m_Layer; pt_texte->m_Layer = ChangeSideNumLayer(pt_texte->m_Layer); if( Module->m_Layer == CUIVRE_N) pt_texte->m_Layer = SILKSCREEN_N_CU; if(Module->m_Layer == CMP_N) pt_texte->m_Layer = SILKSCREEN_N_CMP; if((Module->m_Layer == SILKSCREEN_N_CU) || (Module->m_Layer == ADHESIVE_N_CU) || (Module->m_Layer == CUIVRE_N)) pt_texte->m_Miroir = 0 ; break; default: DisplayError(this, wxT("Unknown Draw Type")); break; } } /* calcul du rectangle d'encadrement */ Module->Set_Rectangle_Encadrement(); Module->Display_Infos(this); if( !(Module->m_Flags & IS_MOVED) ) /* Inversion simple */ { if ( DC ) { Module->Draw(DrawPanel, DC, wxPoint(0,0), GR_OR); /* affichage chevelu general si necessaire */ ReCompile_Ratsnest_After_Changes( DC ); } } else { if ( DC ) { DrawModuleOutlines(DrawPanel, DC, Module); Dessine_Segments_Dragges(DrawPanel, DC); } m_Pcb->m_Status_Pcb &= ~CHEVELU_LOCAL_OK; } }