diff --git a/eeschema/block.cpp b/eeschema/block.cpp index 76b6f7957c..ae6e1045cf 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -21,6 +21,10 @@ // Imported functions: void MoveItemsInList( PICKED_ITEMS_LIST& aItemsList, const wxPoint aMoveVector ); +void RotateListOfItems( PICKED_ITEMS_LIST& aItemsList, + wxPoint& Center ); +void Mirror_X_ListOfItems( PICKED_ITEMS_LIST& aItemsList, + wxPoint& aMirrorPoint ); void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& Center ); void DeleteItemsInList( WinEDA_DrawPanel* panel, @@ -111,7 +115,7 @@ void WinEDA_SchematicFrame::HandleBlockPlace( wxDC* DC ) wxString msg; err = TRUE; msg.Printf( wxT( "HandleBlockPLace() error : no items to place (cmd \ -%d, state %d)" ), +%d, state %d)" ), block->m_Command, block->m_State ); DisplayError( this, msg ); } @@ -124,6 +128,9 @@ void WinEDA_SchematicFrame::HandleBlockPlace( wxDC* DC ) err = TRUE; break; + case BLOCK_ROTATE: + case BLOCK_MIRROR_X: + case BLOCK_MIRROR_Y: case BLOCK_DRAG: /* Drag */ case BLOCK_MOVE: /* Move */ if( DrawPanel->ManageCurseur ) @@ -163,16 +170,13 @@ void WinEDA_SchematicFrame::HandleBlockPlace( wxDC* DC ) case BLOCK_ZOOM: // Handled by HandleBlockEnd() case BLOCK_DELETE: case BLOCK_SAVE: - case BLOCK_ROTATE: - case BLOCK_MIRROR_X: - case BLOCK_MIRROR_Y: case BLOCK_FLIP: case BLOCK_ABORT: case BLOCK_SELECT_ITEMS_ONLY: break; } - OnModify( ); + OnModify(); /* clear struct.m_Flags */ SCH_ITEM* Struct; @@ -193,7 +197,7 @@ void WinEDA_SchematicFrame::HandleBlockPlace( wxDC* DC ) if( block->GetCount() ) { DisplayError( this, - wxT( "HandleBlockPLace() error: some items left in buffer" ) ); + wxT( "HandleBlockPLace() error: some items left in buffer" ) ); block->ClearItemsList(); } @@ -240,6 +244,9 @@ int WinEDA_SchematicFrame::HandleBlockEnd( wxDC* DC ) case BLOCK_DRAG: /* Drag */ BreakSegmentOnJunction( (SCH_SCREEN*) GetScreen() ); + case BLOCK_ROTATE: + case BLOCK_MIRROR_X: + case BLOCK_MIRROR_Y: case BLOCK_MOVE: /* Move */ case BLOCK_COPY: /* Copy */ PickItemsInBlock( GetScreen()->m_BlockLocate, GetScreen() ); @@ -269,7 +276,7 @@ int WinEDA_SchematicFrame::HandleBlockEnd( wxDC* DC ) { ii = -1; DeleteItemsInList( DrawPanel, block->m_ItemsSelection ); - OnModify( ); + OnModify(); } block->ClearItemsList(); TestDanglingEnds( GetScreen()->EEDrawList, DC ); @@ -298,10 +305,6 @@ int WinEDA_SchematicFrame::HandleBlockEnd( wxDC* DC ) case BLOCK_FLIP: /* pcbnew only! */ break; - case BLOCK_ROTATE: - case BLOCK_MIRROR_X: - case BLOCK_MIRROR_Y: - break; case BLOCK_ZOOM: /* Window Zoom */ zoom_command = TRUE; @@ -396,7 +399,7 @@ void WinEDA_SchematicFrame::HandleBlockEndByPopUp( int Command, wxDC* DC ) { ii = -1; DeleteItemsInList( DrawPanel, block->m_ItemsSelection ); - OnModify( ); + OnModify(); } TestDanglingEnds( GetScreen()->EEDrawList, DC ); DrawPanel->Refresh(); @@ -425,15 +428,53 @@ void WinEDA_SchematicFrame::HandleBlockEndByPopUp( int Command, wxDC* DC ) case BLOCK_ROTATE: + if( DrawPanel->ManageCurseur ) + DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); + if( block->GetCount() ) + { + ii = 1; + /* Compute the rotation center and put it on grid */ + wxPoint rotationPoint = block->Centre(); + PutOnGrid( &rotationPoint ); + SaveCopyInUndoList( block->m_ItemsSelection, + UR_ROTATED, + rotationPoint ); + RotateListOfItems( block->m_ItemsSelection, rotationPoint ); + OnModify(); + } + TestDanglingEnds( GetScreen()->EEDrawList, DC ); + DrawPanel->Refresh(); + block->m_State = STATE_BLOCK_MOVE; + block->m_Command = BLOCK_MOVE; //allows multiple rotate break; case BLOCK_MIRROR_X: + if( DrawPanel->ManageCurseur ) + DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); + if( block->GetCount() ) + { + ii = 1; + /* Compute the mirror center and put it on grid */ + wxPoint mirrorPoint = block->Centre(); + PutOnGrid( &mirrorPoint ); + SaveCopyInUndoList( block->m_ItemsSelection, + UR_MIRRORED_X, + mirrorPoint ); + Mirror_X_ListOfItems( block->m_ItemsSelection, mirrorPoint ); + OnModify(); + block->m_State = STATE_BLOCK_MOVE; + block->m_Command = BLOCK_MOVE; //allows multiple mirrors + } + TestDanglingEnds( GetScreen()->EEDrawList, DC ); + DrawPanel->Refresh(); + break; + case BLOCK_MIRROR_Y: if( DrawPanel->ManageCurseur ) DrawPanel->ManageCurseur( DrawPanel, DC, FALSE ); if( block->GetCount() ) { - ii = -1; + ii = 1; /* Compute the mirror center and put it on grid */ wxPoint mirrorPoint = block->Centre(); PutOnGrid( &mirrorPoint ); @@ -441,7 +482,9 @@ void WinEDA_SchematicFrame::HandleBlockEndByPopUp( int Command, wxDC* DC ) UR_MIRRORED_Y, mirrorPoint ); MirrorListOfItems( block->m_ItemsSelection, mirrorPoint ); - OnModify( ); + OnModify(); + block->m_State = STATE_BLOCK_MOVE; + block->m_Command = BLOCK_MOVE; //allows multiple mirrors } TestDanglingEnds( GetScreen()->EEDrawList, DC ); DrawPanel->Refresh(); @@ -515,6 +558,7 @@ void SaveStructListForPaste( PICKED_ITEMS_LIST& aItemsList ) /* save the new list: */ ITEM_PICKER item; + // In list the wrapper is owner of the shematic item, we can use the UR_DELETED // status for the picker because pickers with this status are owner of the picked item // (or TODO ?: create a new status like UR_DUPLICATE) @@ -523,7 +567,7 @@ void SaveStructListForPaste( PICKED_ITEMS_LIST& aItemsList ) { /* Make a copy of the original picked item. */ SCH_ITEM* DrawStructCopy = DuplicateStruct( - (SCH_ITEM*) aItemsList.GetPickedItem( ii ) ); + (SCH_ITEM*) aItemsList.GetPickedItem( ii ) ); DrawStructCopy->SetParent( NULL ); item.m_PickedItem = DrawStructCopy; g_BlockSaveDataList.PushItem( item ); @@ -552,7 +596,7 @@ void WinEDA_SchematicFrame::PasteListOfItems( wxDC* DC ) for( unsigned ii = 0; ii < g_BlockSaveDataList.GetCount(); ii++ ) { Struct = DuplicateStruct( - (SCH_ITEM*) g_BlockSaveDataList.m_ItemsSelection.GetPickedItem( + (SCH_ITEM*) g_BlockSaveDataList.m_ItemsSelection.GetPickedItem( ii ) ); picker.m_PickedItem = Struct; picklist.PushItem( picker ); @@ -579,7 +623,7 @@ void WinEDA_SchematicFrame::PasteListOfItems( wxDC* DC ) Struct = Struct->Next() ) Struct->m_Flags = 0; - OnModify( ); + OnModify(); return; } @@ -591,10 +635,10 @@ void WinEDA_SchematicFrame::PasteListOfItems( wxDC* DC ) */ static void CollectStructsToDrag( SCH_SCREEN* screen ) { - SCH_ITEM* Struct; - SCH_LINE* SegmStruct; + SCH_ITEM* Struct; + SCH_LINE* SegmStruct; - PICKED_ITEMS_LIST* pickedlist = &screen->m_BlockLocate.m_ItemsSelection; + PICKED_ITEMS_LIST* pickedlist = &screen->m_BlockLocate.m_ItemsSelection; if( pickedlist->GetCount() == 0 ) return; @@ -618,7 +662,7 @@ static void CollectStructsToDrag( SCH_SCREEN* screen ) /* Remove the displacement of segment and undo the selection. */ for( unsigned ii = 0; ii < pickedlist->GetCount(); ii++ ) { - Struct = (SCH_ITEM*) (SCH_ITEM*) pickedlist->GetPickedItem( ii ); + Struct = (SCH_ITEM*)(SCH_ITEM*) pickedlist->GetPickedItem( ii ); if( Struct->Type() == DRAW_SEGMENT_STRUCT_TYPE ) { SegmStruct = (SCH_LINE*) Struct; @@ -639,18 +683,18 @@ static void CollectStructsToDrag( SCH_SCREEN* screen ) for( unsigned ii = 0; ii < pickedlist->GetCount(); ii++ ) { - Struct = (SCH_ITEM*) (SCH_ITEM*) pickedlist->GetPickedItem( ii ); - if( ( Struct->Type() == TYPE_SCH_LABEL ) - || ( Struct->Type() == TYPE_SCH_GLOBALLABEL ) - || ( Struct->Type() == TYPE_SCH_HIERLABEL ) ) - { + Struct = (SCH_ITEM*)(SCH_ITEM*) pickedlist->GetPickedItem( ii ); + if( ( Struct->Type() == TYPE_SCH_LABEL ) + || ( Struct->Type() == TYPE_SCH_GLOBALLABEL ) + || ( Struct->Type() == TYPE_SCH_HIERLABEL ) ) + { #undef STRUCT #define STRUCT ( (SCH_TEXT*) Struct ) - if( !screen->m_BlockLocate.Inside( STRUCT->m_Pos ) ) - { - AddPickedItem( screen, STRUCT->m_Pos ); + if( !screen->m_BlockLocate.Inside( STRUCT->m_Pos ) ) + { + AddPickedItem( screen, STRUCT->m_Pos ); + } } - } if( Struct->Type() == TYPE_SCH_COMPONENT ) { @@ -677,8 +721,7 @@ static void CollectStructsToDrag( SCH_SCREEN* screen ) SCH_SHEET* sheet = (SCH_SHEET*) Struct; // Add all pins sheets of a selected hierarchical sheet to the list - BOOST_FOREACH( SCH_SHEET_PIN label, sheet->GetSheetPins() ) - { + BOOST_FOREACH( SCH_SHEET_PIN label, sheet->GetSheetPins() ) { AddPickedItem( screen, label.m_Pos ); } } @@ -701,7 +744,7 @@ static void CollectStructsToDrag( SCH_SCREEN* screen ) */ static void AddPickedItem( SCH_SCREEN* screen, wxPoint position ) { - SCH_ITEM* Struct; + SCH_ITEM* Struct; /* Review the list of already selected elements. */ PICKED_ITEMS_LIST* pickedlist = &screen->m_BlockLocate.m_ItemsSelection; @@ -871,8 +914,8 @@ static LIB_PIN* GetNextPinPosition( SCH_COMPONENT* aDrawLibItem, if( Entry == NULL ) return NULL; - Pin = Entry->GetNextPin(); - Multi = aDrawLibItem->m_Multi; + Pin = Entry->GetNextPin(); + Multi = aDrawLibItem->m_Multi; convert = aDrawLibItem->m_Convert; CmpPosition = aDrawLibItem->m_Pos; memcpy( TransMat, aDrawLibItem->m_Transform, sizeof(TransMat) ); diff --git a/eeschema/class_drawsheet.cpp b/eeschema/class_drawsheet.cpp index 7810baf21d..b5a5e9072c 100644 --- a/eeschema/class_drawsheet.cpp +++ b/eeschema/class_drawsheet.cpp @@ -16,6 +16,7 @@ #include "class_drawpanel.h" #include "drawtxt.h" #include "confirm.h" +#include "trigo.h" #include "program.h" #include "general.h" @@ -204,6 +205,16 @@ bool SCH_SHEET::HasLabel( const wxString& aName ) return false; } +bool SCH_SHEET::IsVerticalOrientation() +{ + BOOST_FOREACH( SCH_SHEET_PIN label, m_labels ) + { + if( label.GetEdge()>1 ) + return true; + } + return false; +} + bool SCH_SHEET::HasUndefinedLabels() { @@ -316,18 +327,7 @@ SCH_SHEET_PIN* SCH_SHEET::GetLabel( const wxPoint& aPosition ) BOOST_FOREACH( SCH_SHEET_PIN& label, m_labels ) { - size = ( label.GetLength() + 1 ) * label.m_Size.x; - if( label.m_Edge ) - size = -size; - minx = label.m_Pos.x; - maxx = label.m_Pos.x + size; - if( maxx < minx ) - EXCHG( maxx, minx ); - dy = label.m_Size.x / 2; - - if( ( ABS( aPosition.y - label.m_Pos.y ) <= dy ) - && ( aPosition.x <= maxx ) && ( aPosition.x >= minx ) ) - return &label; + if (label.HitTest(aPosition)) return &label; } return NULL; @@ -358,6 +358,8 @@ void SCH_SHEET::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, int txtcolor; wxString Text; int color; + int name_orientation; + wxPoint pos_sheetname,pos_filename; wxPoint pos = m_Pos + aOffset; int LineWidth = g_DrawDefaultLineThickness; @@ -369,7 +371,18 @@ void SCH_SHEET::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, GRRect( &aPanel->m_ClipBox, aDC, pos.x, pos.y, pos.x + m_Size.x, pos.y + m_Size.y, LineWidth, color ); - + if (IsVerticalOrientation()) + { + pos_sheetname=wxPoint( pos.x-8, pos.y+m_Size.y ); + pos_filename=wxPoint( pos.x+m_Size.x+4, pos.y+m_Size.y ); + name_orientation=TEXT_ORIENT_VERT; + } + else + { + pos_sheetname=wxPoint( pos.x, pos.y - 8 ); + pos_filename=wxPoint( pos.x, pos.y + m_Size.y + 4 ); + name_orientation=TEXT_ORIENT_HORIZ; + } /* Draw text : SheetName */ if( aColor > 0 ) txtcolor = aColor; @@ -377,8 +390,8 @@ void SCH_SHEET::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, txtcolor = ReturnLayerColor( LAYER_SHEETNAME ); Text = wxT( "Sheet: " ) + m_SheetName; - DrawGraphicText( aPanel, aDC, wxPoint( pos.x, pos.y - 8 ), - (EDA_Colors) txtcolor, Text, TEXT_ORIENT_HORIZ, + DrawGraphicText( aPanel, aDC, pos_sheetname, + (EDA_Colors) txtcolor, Text, name_orientation, wxSize( m_SheetNameSize, m_SheetNameSize ), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, LineWidth, false, false, false ); @@ -389,8 +402,8 @@ void SCH_SHEET::Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, else txtcolor = ReturnLayerColor( LAYER_SHEETFILENAME ); Text = wxT( "File: " ) + m_FileName; - DrawGraphicText( aPanel, aDC, wxPoint( pos.x, pos.y + m_Size.y + 4 ), - (EDA_Colors) txtcolor, Text, TEXT_ORIENT_HORIZ, + DrawGraphicText( aPanel, aDC, pos_filename, + (EDA_Colors) txtcolor, Text, name_orientation, wxSize( m_FileNameSize, m_FileNameSize ), GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_TOP, LineWidth, false, false, false ); @@ -741,6 +754,34 @@ void SCH_SHEET::DisplayInfo( WinEDA_DrawFrame* frame ) } +void SCH_SHEET::Rotate(wxPoint rotationPoint) +{ + RotatePoint(&m_Pos,rotationPoint,900); + RotatePoint(&m_Size.x,&m_Size.y,900); + if (m_Size.x<0) { + m_Pos.x+=m_Size.x; + NEGATE(m_Size.x); + } + if (m_Size.y<0) { + m_Pos.y+=m_Size.y; + NEGATE(m_Size.y); + } + BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, m_labels ) + { + sheetPin.Rotate( rotationPoint ); + } +} +void SCH_SHEET::Mirror_X( int aXaxis_position ) +{ + m_Pos.y -= aXaxis_position; + NEGATE( m_Pos.y ); + m_Pos.y += aXaxis_position; + m_Pos.y -= m_Size.y; + BOOST_FOREACH( SCH_SHEET_PIN& sheetPin, m_labels ) + { + sheetPin.Mirror_X( aXaxis_position ); + } +} /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position @@ -770,8 +811,7 @@ void SCH_SHEET::Resize( const wxSize& aSize ) /* Move the sheet labels according to the new sheet size. */ BOOST_FOREACH( SCH_SHEET_PIN& label, m_labels ) { - if( label.m_Edge ) - label.m_Pos.x = m_Pos.x + m_Size.x; + label.ConstraintOnEdge(label.m_Pos); } } @@ -817,3 +857,4 @@ void SCH_SHEET::Show( int nestLevel, std::ostream& os ) } #endif + diff --git a/eeschema/class_drawsheet.h b/eeschema/class_drawsheet.h index efc557093a..2adf8e4d75 100644 --- a/eeschema/class_drawsheet.h +++ b/eeschema/class_drawsheet.h @@ -8,7 +8,7 @@ #include "base_struct.h" #include #include - +#include "class_text-label.h" extern SCH_SHEET* g_RootSheet; @@ -22,17 +22,29 @@ extern SCH_SHEET* g_RootSheet; * connected to a wire, bus, or label. In the schematic page represented by * the sheet, it corresponds to a hierarchical label. */ -class SCH_SHEET_PIN : public SCH_ITEM, public EDA_TextStruct + +//class SCH_SHEET_PIN : public SCH_ITEM, public EDA_TextStruct +class SCH_SHEET_PIN : public SCH_HIERLABEL { private: - int m_Number; ///< Label number use for saving sheet label to file. + int m_Number; ///< Label number use for saving sheet label to file. ///< Sheet label numbering begins at 2. ///< 0 is reserved for the sheet name. ///< 1 is reserve for the sheet file name. + int m_Edge; /* For pin labels only: sheet edge (0 to 3) of the pin + * m_Edge define on which edge the pin is positionned: + * 0: pin on left side + * 1: pin on right side + * 2: pin on top side + * 3: pin on bottom side + * for compatibility reasons, this does not follow same values as text + * orientation. + */ public: - int m_Edge, m_Shape; - bool m_IsDangling; // TRUE non connected + + //int m_Shape; + //bool m_IsDangling; // TRUE non connected public: SCH_SHEET_PIN( SCH_SHEET* parent, @@ -46,15 +58,18 @@ public: return wxT( "SCH_SHEET_PIN" ); } - bool operator==( const SCH_SHEET_PIN* aPin ) const; + + bool operator ==( const SCH_SHEET_PIN* aPin ) const; SCH_SHEET_PIN* GenCopy(); SCH_SHEET_PIN* Next() { - return ( SCH_SHEET_PIN*) Pnext; + return (SCH_SHEET_PIN*) Pnext; } + void SwapData( SCH_SHEET_PIN* copyitem ); + /** * Get the sheet label number. * @@ -67,7 +82,10 @@ public: * * @param aNumber - New sheet number label. */ - void SetNumber( int aNumber ); + void SetNumber( int aNumber ); + void SetEdge( int aEdge ); + int GetEdge(); + void ConstraintOnEdge( wxPoint Pos ); /** * Get the parent sheet object of this sheet pin. @@ -77,20 +95,11 @@ public: */ SCH_SHEET* GetParent() const { return (SCH_SHEET*) m_Parent; } - void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); + void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); - void Draw( WinEDA_DrawPanel* panel, - wxDC* DC, - const wxPoint& offset, - int draw_mode, - int Color = -1 ); - - /** - * Plot this sheet pin object to aPlotter. - * - * @param aPlotter - The plotter object to plot to. - */ - void Plot( PLOTTER* aPlotter ); +/*the functions Draw, CreateGraphicShape and Plot are no removed as + * as this shape is already handled as HIERLABEL ... + */ /** * Function Save @@ -118,8 +127,6 @@ public: * @param aCorner_list = list to fill with polygon corners coordinates * @param Pos = Position of the shape */ - void CreateGraphicShape( std::vector & aCorner_list, - const wxPoint& Pos ); // Geometric transforms (used in block operations): @@ -137,13 +144,11 @@ public: * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y( int aYaxis_position ) - { - m_Edge = m_Edge ? 0 : 1; - m_Pos.x -= aYaxis_position; - NEGATE( m_Pos.x ); - m_Pos.x += aYaxis_position; - } + + virtual void Mirror_Y( int aYaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); + virtual void Mirror_X( int aXaxis_position ); + /** * Compare schematic sheet entry (pin?) name against search string. @@ -155,7 +160,7 @@ public: }; -typedef boost::ptr_vector< SCH_SHEET_PIN > SCH_SHEET_PIN_LIST; +typedef boost::ptr_vector SCH_SHEET_PIN_LIST; /* class SCH_SHEET @@ -209,11 +214,16 @@ public: * @param aFile The FILE to write to. * @return bool - true if success writing else false. */ - bool Save( FILE* aFile ) const; + bool Save( FILE* aFile ) const; - void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); - SCH_SHEET* GenCopy(); - void DisplayInfo( WinEDA_DrawFrame* frame ); + void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); + SCH_SHEET* GenCopy(); + void DisplayInfo( WinEDA_DrawFrame* frame ); + + /* there is no member for orientation in sch_sheet, to preserve file + * format, we detect orientation based on pin edges + */ + bool IsVerticalOrientation(); /** * Add aLabel to this sheet. @@ -224,7 +234,7 @@ public: * * @param aLabel - The label to add to the sheet. */ - void AddLabel( SCH_SHEET_PIN* aLabel ); + void AddLabel( SCH_SHEET_PIN* aLabel ); SCH_SHEET_PIN_LIST& GetSheetPins() { return m_labels; } @@ -233,7 +243,7 @@ public: * * @param aSheetLabel - The sheet label to remove from the list. */ - void RemoveLabel( SCH_SHEET_PIN* aSheetLabel ); + void RemoveLabel( SCH_SHEET_PIN* aSheetLabel ); /** * Delete sheet label which do not have a corresponding hierarchical label. @@ -241,7 +251,7 @@ public: * Note: Make sure you save a copy of the sheet in the undo list before calling * CleanupSheet() otherwise any unrefernced sheet labels will be lost. */ - void CleanupSheet(); + void CleanupSheet(); /** * Return the label found at aPosition in this sheet. @@ -259,7 +269,7 @@ public: * * @return - True if label found, otherwise false. */ - bool HasLabel( const wxString& aName ); + bool HasLabel( const wxString& aName ); bool HasLabels() { return !m_labels.empty(); } @@ -268,12 +278,12 @@ public: * * @return True if there are any undefined labels. */ - bool HasUndefinedLabels(); + bool HasUndefinedLabels(); /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item */ - virtual int GetPenSize(); + virtual int GetPenSize(); /** Function Draw * Draw the hierarchical sheet shape @@ -284,11 +294,11 @@ public: * @param aColor = color used to draw sheet. Usually -1 to use the normal * color for sheet items */ - void Draw( WinEDA_DrawPanel* aPanel, - wxDC* aDC, - const wxPoint& aOffset, - int aDrawMode, - int aColor = -1 ); + void Draw( WinEDA_DrawPanel* aPanel, + wxDC* aDC, + const wxPoint& aOffset, + int aDrawMode, + int aColor = -1 ); /** Function HitTest * @return true if the point aPosRef is within item area @@ -389,8 +399,7 @@ public: virtual void Move( const wxPoint& aMoveVector ) { m_Pos += aMoveVector; - BOOST_FOREACH( SCH_SHEET_PIN& label, m_labels ) - { + BOOST_FOREACH( SCH_SHEET_PIN & label, m_labels ) { label.Move( aMoveVector ); } } @@ -401,6 +410,8 @@ public: * @param aYaxis_position = the y axis position */ virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); /** * Compare schematic sheet file and sheet name against search string. @@ -416,7 +427,7 @@ public: * * @param aSize - The new size for this sheet. */ - void Resize( const wxSize& aSize ); + void Resize( const wxSize& aSize ); #if defined(DEBUG) diff --git a/eeschema/class_hierarchical_PIN_sheet.cpp b/eeschema/class_hierarchical_PIN_sheet.cpp index ddfa9f06d7..22e952dc36 100644 --- a/eeschema/class_hierarchical_PIN_sheet.cpp +++ b/eeschema/class_hierarchical_PIN_sheet.cpp @@ -17,20 +17,33 @@ #include "class_drawpanel.h" #include "drawtxt.h" #include "plot_common.h" +#include "trigo.h" #include "program.h" #include "general.h" #include "protos.h" +/* m_Edge define on which edge the pin is positionned: + * + * 0: pin on left side + * 1: pin on right side + * 2: pin on top side + * 3: pin on bottom side + * for compatibility reasons, this does not follow same values as text + * ortientation. + */ SCH_SHEET_PIN::SCH_SHEET_PIN( SCH_SHEET* parent, const wxPoint& pos, const wxString& text ) : - SCH_ITEM( parent, DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ), EDA_TextStruct( text ) + SCH_HIERLABEL( pos, text, DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) { + SetParent( parent ); wxASSERT( parent ); - wxASSERT( Pnext == NULL ); m_Layer = LAYER_SHEETLABEL; m_Pos = pos; - m_Edge = 0; + if( parent->IsVerticalOrientation() ) + SetEdge( 2 ); + else + SetEdge( 0 ); m_Shape = NET_INPUT; m_IsDangling = TRUE; m_Number = 2; @@ -41,15 +54,27 @@ SCH_SHEET_PIN* SCH_SHEET_PIN::GenCopy() { SCH_SHEET_PIN* newitem = new SCH_SHEET_PIN( (SCH_SHEET*) m_Parent, m_Pos, m_Text ); - newitem->m_Edge = m_Edge; - newitem->m_Shape = m_Shape; - newitem->m_Number = m_Number; - + newitem->SetEdge( GetEdge() ); + newitem->m_Shape = m_Shape; + newitem->SetNumber( GetNumber() ); return newitem; } -bool SCH_SHEET_PIN::operator==(const SCH_SHEET_PIN* aPin ) const +void SCH_SHEET_PIN::SwapData( SCH_SHEET_PIN* copyitem ) +{ + SCH_TEXT::SwapData( (SCH_TEXT*) copyitem ); + int tmp; + tmp = copyitem->GetNumber(); + copyitem->SetNumber( GetNumber() ); + SetNumber( tmp ); + tmp = copyitem->GetEdge(); + copyitem->SetEdge( GetEdge() ); + SetEdge( tmp ); +} + + +bool SCH_SHEET_PIN::operator==( const SCH_SHEET_PIN* aPin ) const { return aPin == this; } @@ -72,153 +97,88 @@ void SCH_SHEET_PIN::SetNumber( int aNumber ) } -/*****************************************************************************/ -/* Routine to create hierarchical labels */ -/*****************************************************************************/ -void SCH_SHEET_PIN::Draw( WinEDA_DrawPanel* panel, - wxDC* DC, - const wxPoint& offset, - int DrawMode, - int Color ) +void SCH_SHEET_PIN::SetEdge( int aEdge ) { - GRTextHorizJustifyType side; - EDA_Colors txtcolor; - int posx, tposx, posy; + SCH_SHEET* Sheet = (SCH_SHEET*) GetParent(); - static std::vector Poly; - - int LineWidth = GetPenSize(); - - if( Color >= 0 ) - txtcolor = (EDA_Colors) Color; - else - txtcolor = ReturnLayerColor( m_Layer ); - GRSetDrawMode( DC, DrawMode ); - - posx = m_Pos.x + offset.x; - posy = m_Pos.y + offset.y; - wxSize size = m_Size; - - if( !m_Text.IsEmpty() ) + /* use -1 to adjust text orientation without changing edge*/ + if( aEdge > -1 ) + m_Edge = aEdge; + switch( m_Edge ) { - if( m_Edge ) + case 0: /* pin on left side*/ + m_Pos.x = Sheet->m_Pos.x; + SetSchematicTextOrientation( 2 ); /* Orientation horiz inverse */ + break; + + case 1: /* pin on right side*/ + m_Pos.x = Sheet->m_Pos.x + Sheet->m_Size.x; + SetSchematicTextOrientation( 0 ); /* Orientation horiz normal */ + break; + + case 2: /* pin on top side*/ + m_Pos.y = Sheet->m_Pos.y; + SetSchematicTextOrientation( 3 ); /* Orientation vert BOTTOM */ + break; + + case 3: /* pin on bottom side*/ + m_Pos.y = Sheet->m_Pos.y + Sheet->m_Size.y; + SetSchematicTextOrientation( 1 ); /* Orientation vert UP */ + break; + } +} + + +int SCH_SHEET_PIN::GetEdge() +{ + return m_Edge; +} + + +/* ConstraintOnEdge is used to ajust label position to egde based + * on proximity to vertical / horizontal edge. + * used by sheetlab and resize + */ +void SCH_SHEET_PIN::ConstraintOnEdge( wxPoint Pos ) +{ + SCH_SHEET* Sheet = (SCH_SHEET*) GetParent(); + + if( Sheet == NULL ) + return; + + if( m_Edge<2 ) /*horizontal sheetpin*/ + { + if( Pos.x > ( Sheet->m_Pos.x + ( Sheet->m_Size.x / 2 ) ) ) { - tposx = posx - size.x; - side = GR_TEXT_HJUSTIFY_RIGHT; + SetEdge( 1 ); } else { - tposx = posx + size.x + (size.x / 8); - side = GR_TEXT_HJUSTIFY_LEFT; + SetEdge( 0 ); } - DrawGraphicText( panel, DC, wxPoint( tposx, posy ), txtcolor, - m_Text, TEXT_ORIENT_HORIZ, size, side, - GR_TEXT_VJUSTIFY_CENTER, LineWidth, false, false ); + + m_Pos.y = Pos.y; + if( m_Pos.y < Sheet->m_Pos.y ) + m_Pos.y = Sheet->m_Pos.y; + if( m_Pos.y > (Sheet->m_Pos.y + Sheet->m_Size.y) ) + m_Pos.y = Sheet->m_Pos.y + Sheet->m_Size.y; } - - /* Draw the graphic symbol */ - CreateGraphicShape( Poly, m_Pos + offset ); - int FillShape = false; - GRPoly( &panel->m_ClipBox, DC, Poly.size(), &Poly[0], - FillShape, LineWidth, txtcolor, txtcolor ); -} - - -void SCH_SHEET_PIN::Plot( PLOTTER* aPlotter ) -{ - wxASSERT( aPlotter != NULL ); - - EDA_Colors txtcolor = UNSPECIFIED_COLOR; - int posx, tposx, posy, size; - - static std::vector Poly; - - txtcolor = ReturnLayerColor( GetLayer() ); - - posx = m_Pos.x; - posy = m_Pos.y; - size = m_Size.x; - GRTextHorizJustifyType side; - - if( m_Edge ) + else /* vertical sheetpin*/ { - tposx = posx - size; - side = GR_TEXT_HJUSTIFY_RIGHT; - } - else - { - tposx = posx + size + (size / 8); - side = GR_TEXT_HJUSTIFY_LEFT; - } + if( Pos.y > ( Sheet->m_Pos.y + ( Sheet->m_Size.y / 2 ) ) ) + { + SetEdge( 3 ); //bottom + } + else + { + SetEdge( 2 ); //top + } - int thickness = GetPenSize(); - aPlotter->set_current_line_width( thickness ); - - aPlotter->text( wxPoint( tposx, posy ), txtcolor, m_Text, TEXT_ORIENT_HORIZ, - wxSize( size, size ), side, GR_TEXT_VJUSTIFY_CENTER, thickness, - m_Italic, m_Bold ); - - /* Draw the associated graphic symbol */ - CreateGraphicShape( Poly, m_Pos ); - - aPlotter->poly( Poly.size(), &Poly[0].x, NO_FILL ); -} - - -/** function CreateGraphicShape - * Calculates the graphic shape (a polygon) associated to the text - * @param aCorner_list = list to fill with polygon corners coordinates - * @param Pos = Position of the shape - */ -void SCH_SHEET_PIN::CreateGraphicShape( std::vector & aCorner_list, - const wxPoint& Pos ) -{ - wxSize size = m_Size; - - aCorner_list.clear(); - if( m_Edge ) - { - size.x = -size.x; - size.y = -size.y; - } - - int size2 = size.x / 2; - - aCorner_list.push_back( Pos ); - switch( m_Shape ) - { - case 0: /* input |> */ - aCorner_list.push_back( wxPoint( Pos.x, Pos.y - size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size2, Pos.y - size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size.x, Pos.y ) ); - aCorner_list.push_back( wxPoint( Pos.x + size2, Pos.y + size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x, Pos.y + size2 ) ); - aCorner_list.push_back( Pos ); - break; - - case 1: /* output <| */ - aCorner_list.push_back( wxPoint( Pos.x + size2, Pos.y - size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size.x, Pos.y - size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size.x, Pos.y + size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size2, Pos.y + size2 ) ); - aCorner_list.push_back( Pos ); - break; - - case 2: /* bidi <> */ - case 3: /* TriSt <> */ - aCorner_list.push_back( wxPoint( Pos.x + size2, Pos.y - size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size.x, Pos.y ) ); - aCorner_list.push_back( wxPoint( Pos.x + size2, Pos.y + size2 ) ); - aCorner_list.push_back( Pos ); - break; - - default: /* unsp []*/ - aCorner_list.push_back( wxPoint( Pos.x, Pos.y - size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size.x, Pos.y - size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x + size.x, Pos.y + size2 ) ); - aCorner_list.push_back( wxPoint( Pos.x, Pos.y + size2 ) ); - aCorner_list.push_back( Pos ); - break; + m_Pos.x = Pos.x; + if( m_Pos.x < Sheet->m_Pos.x ) + m_Pos.x = Sheet->m_Pos.x; + if( m_Pos.x > (Sheet->m_Pos.x + Sheet->m_Size.x) ) + m_Pos.x = Sheet->m_Pos.x + Sheet->m_Size.x; } } @@ -235,8 +195,24 @@ bool SCH_SHEET_PIN::Save( FILE* aFile ) const if( m_Text.IsEmpty() ) return true; - if( m_Edge ) + switch( m_Edge ) + { + case 0: //pin on left side + side = 'L'; + break; + + case 1: //pin on right side side = 'R'; + break; + + case 2: //pin on top side + side = 'T'; + break; + + case 3: //pin on bottom side + side = 'B'; + break; + } switch( m_Shape ) { @@ -273,6 +249,66 @@ bool SCH_SHEET_PIN::Matches( wxFindReplaceData& aSearchData ) } +void SCH_SHEET_PIN::Mirror_X( int aXaxis_position ) +{ + int p = m_Pos.y - aXaxis_position; + + m_Pos.y = aXaxis_position - p; + switch( m_Edge ) + { + case 2: + SetEdge( 3 ); + break; + + case 3: + SetEdge( 2 ); + break; + } +} + + +void SCH_SHEET_PIN::Mirror_Y( int aYaxis_position ) +{ + int p = m_Pos.x - aYaxis_position; + + m_Pos.x = aYaxis_position - p; + switch( m_Edge ) + { + case 0: + SetEdge( 1 ); + break; + + case 1: + SetEdge( 0 ); + break; + } +} + + +void SCH_SHEET_PIN::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); + switch( m_Edge ) + { + case 0: //pin on left side + SetEdge( 3 ); + break; + + case 1: //pin on right side + SetEdge( 2 ); + break; + + case 2: //pin on top side + SetEdge( 0 ); + break; + + case 3: //pin on bottom side + SetEdge( 1 ); + break; + } +} + + #if defined(DEBUG) void SCH_SHEET_PIN::Show( int nestLevel, std::ostream& os ) { diff --git a/eeschema/class_marker_sch.cpp b/eeschema/class_marker_sch.cpp index 857a1f9a54..f36752feba 100644 --- a/eeschema/class_marker_sch.cpp +++ b/eeschema/class_marker_sch.cpp @@ -8,6 +8,7 @@ #include "common.h" #include "program.h" #include "general.h" +#include "trigo.h" #include "class_marker_sch.h" #include "erc.h" @@ -51,7 +52,7 @@ SCH_MARKER::~SCH_MARKER() SCH_MARKER* SCH_MARKER::GenCopy() { SCH_MARKER* newitem = new SCH_MARKER( GetPos(), - GetReporter().GetMainText() ); + GetReporter().GetMainText() ); newitem->SetMarkerType( GetMarkerType() ); newitem->SetErrorLevel( GetErrorLevel() ); @@ -147,3 +148,25 @@ void SCH_MARKER::DisplayInfo( WinEDA_DrawFrame* aFrame ) aFrame->AppendMsgPanel( _( "Electronics rule check error" ), GetReporter().GetErrorText(), DARKRED ); } + + +void SCH_MARKER::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); +} + + +void SCH_MARKER::Mirror_X( int aXaxis_position ) +{ + m_Pos.y -= aXaxis_position; + m_Pos.y = -m_Pos.y; + m_Pos.y += aXaxis_position; +} + + +void SCH_MARKER::Mirror_Y( int aYaxis_position ) +{ + m_Pos.x -= aYaxis_position; + m_Pos.x = -m_Pos.x; + m_Pos.x += aYaxis_position; +} diff --git a/eeschema/class_marker_sch.h b/eeschema/class_marker_sch.h index 7783b46ae9..a91bb1e5a9 100644 --- a/eeschema/class_marker_sch.h +++ b/eeschema/class_marker_sch.h @@ -9,9 +9,10 @@ #include "class_marker_base.h" /* Marker are mainly used to show an ERC error -*/ + */ -enum TypeMarker { /* Markers type */ +enum TypeMarker { + /* Markers type */ MARK_UNSPEC, MARK_ERC, MARK_PCB, @@ -24,10 +25,10 @@ enum TypeMarker { /* Markers type */ extern const wxChar* NameMarqueurType[]; -class SCH_MARKER : public SCH_ITEM , public MARKER_BASE +class SCH_MARKER : public SCH_ITEM, public MARKER_BASE { public: - SCH_MARKER( ); + SCH_MARKER(); SCH_MARKER( const wxPoint& aPos, const wxString& aText ); ~SCH_MARKER(); virtual wxString GetClass() const @@ -36,11 +37,11 @@ public: } - SCH_MARKER* GenCopy(); + SCH_MARKER* GenCopy(); - virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, - const wxPoint& aOffset, int aDraw_mode, - int aColor = -1 ); + virtual void Draw( WinEDA_DrawPanel* aPanel, wxDC* aDC, + const wxPoint& aOffset, int aDraw_mode, + int aColor = -1 ); /** @@ -50,14 +51,14 @@ public: * @param aFile The FILE to write to. * @return bool - true if success writing else false. */ - bool Save( FILE* aFile ) const; + bool Save( FILE* aFile ) const; /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item * for a marker, has no meaning, but it is necessary to satisfy the * SCH_ITEM class requirements */ - virtual int GetPenSize( ) { return 0; }; + virtual int GetPenSize() { return 0; }; /** Function HitTest * @return true if the point aPosRef is within item area @@ -68,6 +69,7 @@ public: return HitTestMarker( aPosRef ); } + /** * Function GetBoundingBox * returns the orthogonal, bounding box of this object for display purposes. @@ -79,25 +81,24 @@ public: // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector */ - virtual void Move(const wxPoint& aMoveVector) + virtual void Move( const wxPoint& aMoveVector ) { m_Pos += aMoveVector; } + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y(int aYaxis_position) - { - m_Pos.x -= aYaxis_position; - m_Pos.x = - m_Pos.x; - m_Pos.x += aYaxis_position; - } + virtual void Mirror_Y( int aYaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); + virtual void Mirror_X( int aXaxis_position ); /** * Compare DRC marker main and auxiliary text against search string. @@ -112,10 +113,11 @@ public: * * @param aFrame - Top window that owns the message panel. */ - void DisplayInfo( WinEDA_DrawFrame* aFrame ); + void DisplayInfo( WinEDA_DrawFrame* aFrame ); #if defined(DEBUG) - void Show( int nestLevel, std::ostream& os ); + void Show( int nestLevel, std::ostream& os ); + #endif }; diff --git a/eeschema/class_sch_cmp_field.cpp b/eeschema/class_sch_cmp_field.cpp index 89883be890..122f9a5b1a 100644 --- a/eeschema/class_sch_cmp_field.cpp +++ b/eeschema/class_sch_cmp_field.cpp @@ -17,6 +17,7 @@ #include "gr_basic.h" #include "drawtxt.h" #include "macros.h" +#include "trigo.h" #include "program.h" #include "general.h" @@ -115,10 +116,10 @@ void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, * justifications are complicated to calculate * so the more easily way is to use no justifications ( Centered text ) * and use GetBoundaryBox to know the text coordinate considered as centered - */ + */ EDA_Rect BoundaryBox = GetBoundaryBox(); GRTextHorizJustifyType hjustify = GR_TEXT_HJUSTIFY_CENTER; - GRTextVertJustifyType vjustify = GR_TEXT_VJUSTIFY_CENTER; + GRTextVertJustifyType vjustify = GR_TEXT_VJUSTIFY_CENTER; textpos = BoundaryBox.Centre(); if( m_FieldId == REFERENCE ) @@ -151,15 +152,18 @@ void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, /* Enable this to draw the bounding box around the text field to validate * the bounding box calculations. - */ + */ #if 0 + // Draw boundary box: int x1 = BoundaryBox.GetX(); int y1 = BoundaryBox.GetY(); int x2 = BoundaryBox.GetRight(); int y2 = BoundaryBox.GetBottom(); GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN ); + // Draw the text anchor point + /* Calculate the text position, according to the component * orientation/mirror */ textpos = m_Pos - parentComponent->m_Pos; @@ -169,7 +173,7 @@ void SCH_FIELD::Draw( WinEDA_DrawPanel* panel, wxDC* DC, y1 = textpos.y; int len = 10; GRLine( &panel->m_ClipBox, DC, x1 - len, y1, x1 + len, y1, 0, BLUE ); - GRLine( &panel->m_ClipBox, DC, x1, y1 - len, x1, y1 +len, 0, BLUE ); + GRLine( &panel->m_ClipBox, DC, x1, y1 - len, x1, y1 + len, 0, BLUE ); #endif } @@ -224,20 +228,20 @@ void SCH_FIELD::SwapData( SCH_FIELD* copyitem ) */ EDA_Rect SCH_FIELD::GetBoundaryBox() const { - EDA_Rect BoundaryBox; - int hjustify, vjustify; - int orient; - wxSize size; - wxPoint pos1, pos2; + EDA_Rect BoundaryBox; + int hjustify, vjustify; + int orient; + wxSize size; + wxPoint pos1, pos2; SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent; orient = m_Orient; - wxPoint pos = parentComponent->m_Pos; + wxPoint pos = parentComponent->m_Pos; pos1 = m_Pos - pos; - size.x = LenSize( m_Text ); - size.y = m_Size.y; + size.x = LenSize( m_Text ); + size.y = m_Size.y; hjustify = m_HJustify; vjustify = m_VJustify; @@ -396,18 +400,18 @@ void SCH_FIELD::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) Draw( frame->DrawPanel, DC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); m_Flags = 0; frame->GetScreen()->SetCurItem( NULL ); - frame->OnModify( ); + frame->OnModify(); frame->SetCurrentField( NULL ); } -bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void * aAuxData ) +bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void* aAuxData ) { if( aAuxData && m_FieldId == REFERENCE ) { - SCH_COMPONENT* pSch = (SCH_COMPONENT*) m_Parent; - SCH_SHEET_PATH* sheet = (SCH_SHEET_PATH*) aAuxData; - wxString fulltext = pSch->GetRef( sheet ); + SCH_COMPONENT* pSch = (SCH_COMPONENT*) m_Parent; + SCH_SHEET_PATH* sheet = (SCH_SHEET_PATH*) aAuxData; + wxString fulltext = pSch->GetRef( sheet ); if( m_AddExtraText ) { /* For more than one part per package, we must add the part selection @@ -420,3 +424,9 @@ bool SCH_FIELD::Matches( wxFindReplaceData& aSearchData, void * aAuxData ) return SCH_ITEM::Matches( m_Text, aSearchData ); } + + +void SCH_FIELD::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); +} diff --git a/eeschema/class_sch_cmp_field.h b/eeschema/class_sch_cmp_field.h index 870ae61b6a..7cb835c506 100644 --- a/eeschema/class_sch_cmp_field.h +++ b/eeschema/class_sch_cmp_field.h @@ -37,7 +37,7 @@ public: * (for REFERENCE: add part selection text */ public: - SCH_FIELD( const wxPoint& aPos, int aFieldId, SCH_COMPONENT* aParent, + SCH_FIELD( const wxPoint& aPos, int aFieldId, SCH_COMPONENT* aParent, wxString aName = wxEmptyString ); ~SCH_FIELD(); @@ -47,6 +47,7 @@ public: return wxT( "SCH_FIELD" ); } + void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); EDA_Rect GetBoundaryBox() const; @@ -58,22 +59,24 @@ public: bool IsVoid() { size_t len = m_Text.Len(); + return len == 0 || ( len == 1 && m_Text[0] == wxChar( '~' ) ); } - void SwapData( SCH_FIELD* copyitem ); + + void SwapData( SCH_FIELD* copyitem ); /** Function ImportValues * copy parameters from a source. * Pointers and specific values (position) are not copied * @param aSource = the LIB_FIELD to read */ - void ImportValues( const LIB_FIELD& aSource ); + void ImportValues( const LIB_FIELD& aSource ); /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item */ - int GetPenSize( ); + int GetPenSize(); /** Function IsVisible * @return true is this field is visible, false if flagged invisible @@ -83,14 +86,15 @@ public: return (m_Attributs & TEXT_NO_VISIBLE) == 0 ? true : false; } + /** * Function Draw */ - void Draw( WinEDA_DrawPanel* panel, - wxDC* DC, - const wxPoint& offset, - int draw_mode, - int Color = -1 ); + void Draw( WinEDA_DrawPanel* panel, + wxDC* DC, + const wxPoint& offset, + int draw_mode, + int Color = -1 ); /** * Function Save @@ -102,20 +106,20 @@ public: bool Save( FILE* aFile ) const; // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector */ - virtual void Move(const wxPoint& aMoveVector) + virtual void Move( const wxPoint& aMoveVector ) { m_Pos += aMoveVector; } - /** virtual function Mirror_Y - * mirror item relative to an Y axis - * @param aYaxis_position = the y axis position - */ - virtual void Mirror_Y(int aYaxis_position) + + virtual void Rotate( wxPoint rotationPoint ); + + virtual void Mirror_X( int aXaxis_position ) { /* Do Nothing: fields are never mirrored alone. * they are moved when the parent component is mirrored @@ -123,6 +127,20 @@ public: * master class */ } + + /** virtual function Mirror_Y + * mirror item relative to an Y axis + * @param aYaxis_position = the y axis position + */ + virtual void Mirror_Y( int aYaxis_position ) + { + /* Do Nothing: fields are never mirrored alone. + * they are moved when the parent component is mirrored + * this function is only needed by the virtual pure function of the + * master class */ + } + + /** * Compare schematic field text against search string. * @@ -133,7 +151,7 @@ public: * this is only one of all references (one per sheet path) * @return True if this field text matches the search criteria. */ - virtual bool Matches( wxFindReplaceData& aSearchData, void * aAuxData ); + virtual bool Matches( wxFindReplaceData& aSearchData, void* aAuxData ); }; diff --git a/eeschema/class_sch_component.cpp b/eeschema/class_sch_component.cpp index c7aa40a25a..0a9573b1ef 100644 --- a/eeschema/class_sch_component.cpp +++ b/eeschema/class_sch_component.cpp @@ -7,6 +7,7 @@ #include "class_drawpanel.h" #include "gr_basic.h" #include "common.h" +#include "trigo.h" #include "program.h" #include "general.h" @@ -37,12 +38,12 @@ void CreateDummyCmp() { DummyCmp = new LIB_COMPONENT( wxEmptyString ); - LIB_RECTANGLE* Square = new LIB_RECTANGLE(DummyCmp); + LIB_RECTANGLE* Square = new LIB_RECTANGLE( DummyCmp ); - Square->m_Pos = wxPoint( -200, 200 ); - Square->m_End = wxPoint( 200, -200 ); + Square->m_Pos = wxPoint( -200, 200 ); + Square->m_End = wxPoint( 200, -200 ); - LIB_TEXT* Text = new LIB_TEXT(DummyCmp); + LIB_TEXT* Text = new LIB_TEXT( DummyCmp ); Text->m_Size.x = Text->m_Size.y = 150; Text->m_Text = wxT( "??" ); @@ -134,7 +135,7 @@ SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aTemplate ) : m_Son = NULL; // Re-parent the fields, which before this had aTemplate as parent - for( int i=0; iSetParent( this ); } @@ -143,8 +144,8 @@ SCH_COMPONENT::SCH_COMPONENT( const SCH_COMPONENT& aTemplate ) : void SCH_COMPONENT::Init( const wxPoint& pos ) { - m_Pos = pos; - m_Multi = 0; // In multi unit chip - which unit to draw. + m_Pos = pos; + m_Multi = 0; // In multi unit chip - which unit to draw. m_Convert = 0; // De Morgan Handling // The rotation/mirror transformation matrix. pos normal @@ -182,8 +183,8 @@ void SCH_COMPONENT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, bool DrawPinText ) { LIB_COMPONENT* Entry; - int ii; - bool dummy = FALSE; + int ii; + bool dummy = FALSE; Entry = CMP_LIBRARY::FindLibraryComponent( m_ChipName ); @@ -329,7 +330,7 @@ const wxString SCH_COMPONENT::GetRef( SCH_SHEET_PATH* sheet ) h_ref = tokenizer.GetNextToken(); /* printf( "GetRef hpath: %s\n", - CONV_TO_UTF8( m_PathsAndReferences[ii] ) ); */ + * CONV_TO_UTF8( m_PathsAndReferences[ii] ) ); */ return h_ref; } } @@ -382,8 +383,8 @@ void SCH_COMPONENT::SetRef( SCH_SHEET_PATH* sheet, const wxString& ref ) SCH_FIELD* rf = GetField( REFERENCE ); if( rf->m_Text.IsEmpty() - || ( abs( rf->m_Pos.x - m_Pos.x ) + - abs( rf->m_Pos.y - m_Pos.y ) > 10000 ) ) + || ( abs( rf->m_Pos.x - m_Pos.x ) + + abs( rf->m_Pos.y - m_Pos.y ) > 10000 ) ) { // move it to a reasonable position rf->m_Pos = m_Pos; @@ -395,32 +396,36 @@ void SCH_COMPONENT::SetRef( SCH_SHEET_PATH* sheet, const wxString& ref ) // Reinit the m_PrefixString member if needed wxString prefix = ref; - while( prefix.Last() == '?' or isdigit(prefix.Last()) ) + while( prefix.Last() == '?' or isdigit( prefix.Last() ) ) prefix.RemoveLast(); + if( m_PrefixString != prefix ) m_PrefixString = prefix; } + /** function SetTimeStamp * Change the old time stamp to the new time stamp. * the time stamp is also modified in paths * @param aNewTimeStamp = new time stamp */ -void SCH_COMPONENT::SetTimeStamp( long aNewTimeStamp) +void SCH_COMPONENT::SetTimeStamp( long aNewTimeStamp ) { wxString string_timestamp, string_oldtimestamp; - string_timestamp.Printf(wxT("%8.8X"), aNewTimeStamp); - string_oldtimestamp.Printf(wxT("%8.8X"), m_TimeStamp); + + string_timestamp.Printf( wxT( "%8.8X" ), aNewTimeStamp ); + string_oldtimestamp.Printf( wxT( "%8.8X" ), m_TimeStamp ); m_TimeStamp = aNewTimeStamp; for( unsigned ii = 0; ii < m_PathsAndReferences.GetCount(); ii++ ) { m_PathsAndReferences[ii].Replace( string_oldtimestamp.GetData(), - string_timestamp.GetData() ); - } + string_timestamp.GetData() ); + } } /***********************************************************/ + //returns the unit selection, for the given sheet path. /***********************************************************/ int SCH_COMPONENT::GetUnitSelection( SCH_SHEET_PATH* aSheet ) @@ -452,6 +457,7 @@ int SCH_COMPONENT::GetUnitSelection( SCH_SHEET_PATH* aSheet ) /****************************************************************************/ + //Set the unit selection, for the given sheet path. /****************************************************************************/ void SCH_COMPONENT::SetUnitSelection( SCH_SHEET_PATH* aSheet, @@ -508,6 +514,7 @@ SCH_FIELD* SCH_COMPONENT::GetField( int aFieldNdx ) const SCH_FIELD* SCH_COMPONENT::AddField( const SCH_FIELD& aField ) { int newNdx = m_Fields.size(); + m_Fields.push_back( aField ); return &m_Fields[newNdx]; } @@ -515,11 +522,12 @@ SCH_FIELD* SCH_COMPONENT::AddField( const SCH_FIELD& aField ) SCH_FIELD* SCH_COMPONENT::FindField( const wxString& aFieldName ) { - for( unsigned i=0; iGetPin( number, m_Multi, m_Convert ); } + /** * Function GetBoundaryBox * returns the orthogonal, bounding box of this object for display purposes. @@ -546,8 +555,8 @@ LIB_PIN* SCH_COMPONENT::GetPin( const wxString& number ) EDA_Rect SCH_COMPONENT::GetBoundaryBox() const { LIB_COMPONENT* Entry = CMP_LIBRARY::FindLibraryComponent( m_ChipName ); - EDA_Rect BoundaryBox; - int x0, xm, y0, ym; + EDA_Rect BoundaryBox; + int x0, xm, y0, ym; /* Get the basic Boundary box */ if( Entry ) @@ -569,10 +578,10 @@ EDA_Rect SCH_COMPONENT::GetBoundaryBox() const } /* Compute the real Boundary box (rotated, mirrored ...)*/ - int x1 = m_Transform[0][0] * x0 + m_Transform[0][1] * y0; - int y1 = m_Transform[1][0] * x0 + m_Transform[1][1] * y0; - int x2 = m_Transform[0][0] * xm + m_Transform[0][1] * ym; - int y2 = m_Transform[1][0] * xm + m_Transform[1][1] * ym; + int x1 = m_Transform[0][0] *x0 + m_Transform[0][1] *y0; + int y1 = m_Transform[1][0] *x0 + m_Transform[1][1] *y0; + int x2 = m_Transform[0][0] *xm + m_Transform[0][1] *ym; + int y2 = m_Transform[1][0] *xm + m_Transform[1][1] *ym; // H and W must be > 0: if( x2 < x1 ) @@ -610,14 +619,15 @@ void SCH_COMPONENT::SwapData( SCH_COMPONENT* copyitem ) // (after swap(), m_Parent member does not point to the right parent): for( int ii = 0; ii < copyitem->GetFieldCount(); ++ii ) { - copyitem->GetField(ii)->SetParent( copyitem ); - } - for( int ii = 0; ii < GetFieldCount(); ++ii ) - { - GetField(ii)->SetParent( this ); + copyitem->GetField( ii )->SetParent( copyitem ); } - EXCHG( m_PathsAndReferences, copyitem->m_PathsAndReferences); + for( int ii = 0; ii < GetFieldCount(); ++ii ) + { + GetField( ii )->SetParent( this ); + } + + EXCHG( m_PathsAndReferences, copyitem->m_PathsAndReferences ); } @@ -625,8 +635,8 @@ void SCH_COMPONENT::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) { /* save old text in undo list */ if( g_ItemToUndoCopy - && ( g_ItemToUndoCopy->Type() == Type() ) - && ( ( m_Flags & IS_NEW ) == 0 ) ) + && ( g_ItemToUndoCopy->Type() == Type() ) + && ( ( m_Flags & IS_NEW ) == 0 ) ) { /* restore old values and save new ones */ SwapData( (SCH_COMPONENT*) g_ItemToUndoCopy ); @@ -709,6 +719,7 @@ void SCH_COMPONENT::ClearAnnotation( SCH_SHEET_PATH* aSheet ) /******************************************************************/ + /* Compute the new matrix transform for a schematic component * in order to have the requested transform (type_rotate = rot, mirror..) * which is applied to the initial transform. @@ -732,28 +743,28 @@ void SCH_COMPONENT::SetOrientation( int aOrientation ) TempMat[0][0] = TempMat[1][1] = 0; TempMat[0][1] = 1; TempMat[1][0] = -1; - Transform = TRUE; + Transform = TRUE; break; case CMP_ROTATE_COUNTERCLOCKWISE: /* Rotate - */ TempMat[0][0] = TempMat[1][1] = 0; TempMat[0][1] = -1; TempMat[1][0] = 1; - Transform = TRUE; + Transform = TRUE; break; case CMP_MIRROR_Y: /* MirrorY */ TempMat[0][0] = -1; TempMat[1][1] = 1; TempMat[0][1] = TempMat[1][0] = 0; - Transform = TRUE; + Transform = TRUE; break; case CMP_MIRROR_X: /* MirrorX */ TempMat[0][0] = 1; TempMat[1][1] = -1; TempMat[0][1] = TempMat[1][0] = 0; - Transform = TRUE; + Transform = TRUE; break; case CMP_ORIENT_90: @@ -832,17 +843,17 @@ void SCH_COMPONENT::SetOrientation( int aOrientation ) */ int NewMatrix[2][2]; - NewMatrix[0][0] = m_Transform[0][0] * TempMat[0][0] + - m_Transform[1][0] * TempMat[0][1]; + NewMatrix[0][0] = m_Transform[0][0] *TempMat[0][0] + + m_Transform[1][0] *TempMat[0][1]; - NewMatrix[0][1] = m_Transform[0][1] * TempMat[0][0] + - m_Transform[1][1] * TempMat[0][1]; + NewMatrix[0][1] = m_Transform[0][1] *TempMat[0][0] + + m_Transform[1][1] *TempMat[0][1]; - NewMatrix[1][0] = m_Transform[0][0] * TempMat[1][0] + - m_Transform[1][0] * TempMat[1][1]; + NewMatrix[1][0] = m_Transform[0][0] *TempMat[1][0] + + m_Transform[1][0] *TempMat[1][1]; - NewMatrix[1][1] = m_Transform[0][1] * TempMat[1][0] + - m_Transform[1][1] * TempMat[1][1]; + NewMatrix[1][1] = m_Transform[0][1] *TempMat[1][0] + + m_Transform[1][1] *TempMat[1][1]; m_Transform[0][0] = NewMatrix[0][0]; m_Transform[0][1] = NewMatrix[0][1]; @@ -867,19 +878,20 @@ void SCH_COMPONENT::SetOrientation( int aOrientation ) */ int SCH_COMPONENT::GetOrientation() { - int type_rotate = CMP_ORIENT_0; - int ComponentMatOrient[2][2]; - int ii; + int type_rotate = CMP_ORIENT_0; + int ComponentMatOrient[2][2]; + int ii; #define ROTATE_VALUES_COUNT 12 // list of all possibilities, but only the first 8 are actually used int rotate_value[ROTATE_VALUES_COUNT] = { - CMP_ORIENT_0, CMP_ORIENT_90, CMP_ORIENT_180, CMP_ORIENT_270, - CMP_MIRROR_X + CMP_ORIENT_0, CMP_MIRROR_X + CMP_ORIENT_90, + CMP_ORIENT_0, CMP_ORIENT_90, CMP_ORIENT_180, + CMP_ORIENT_270, + CMP_MIRROR_X + CMP_ORIENT_0, CMP_MIRROR_X + CMP_ORIENT_90, CMP_MIRROR_X + CMP_ORIENT_180, CMP_MIRROR_X + CMP_ORIENT_270, - CMP_MIRROR_Y + CMP_ORIENT_0, CMP_MIRROR_Y + CMP_ORIENT_90, + CMP_MIRROR_Y + CMP_ORIENT_0, CMP_MIRROR_Y + CMP_ORIENT_90, CMP_MIRROR_Y + CMP_ORIENT_180, CMP_MIRROR_Y + CMP_ORIENT_270 }; @@ -891,12 +903,12 @@ int SCH_COMPONENT::GetOrientation() type_rotate = rotate_value[ii]; SetOrientation( type_rotate ); if( memcmp( ComponentMatOrient, m_Transform, - sizeof(ComponentMatOrient) ) == 0 ) + sizeof(ComponentMatOrient) ) == 0 ) return type_rotate; } // Error: orientation not found in list (should not happen) - wxMessageBox(wxT("Component orientation matrix internal error") ); + wxMessageBox( wxT( "Component orientation matrix internal error" ) ); memcpy( m_Transform, ComponentMatOrient, sizeof( ComponentMatOrient ) ); return CMP_NORMAL; } @@ -911,13 +923,13 @@ wxPoint SCH_COMPONENT::GetScreenCoord( const wxPoint& coord ) { wxPoint screenpos; - screenpos.x = m_Transform[0][0] * coord.x + m_Transform[0][1] * coord.y; - screenpos.y = m_Transform[1][0] * coord.x + m_Transform[1][1] * coord.y; + screenpos.x = m_Transform[0][0] *coord.x + m_Transform[0][1] *coord.y; + screenpos.y = m_Transform[1][0] *coord.x + m_Transform[1][1] *coord.y; return screenpos; } -#if defined (DEBUG) +#if defined(DEBUG) /** * Function Show @@ -932,7 +944,7 @@ void SCH_COMPONENT::Show( int nestLevel, std::ostream& os ) NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << " ref=\"" << CONV_TO_UTF8( ReturnFieldName( 0 ) ) << '"' << " chipName=\"" - << CONV_TO_UTF8( m_ChipName ) << '"' << m_Pos + << CONV_TO_UTF8( m_ChipName ) << '"' << m_Pos << " layer=\"" << m_Layer << '"' << ">\n"; @@ -945,7 +957,7 @@ void SCH_COMPONENT::Show( int nestLevel, std::ostream& os ) { NestedSpace( nestLevel + 1, os ) << "\n"; } } @@ -954,6 +966,7 @@ void SCH_COMPONENT::Show( int nestLevel, std::ostream& os ) << ">\n"; } + #endif @@ -979,15 +992,16 @@ bool SCH_COMPONENT::Save( FILE* f ) const strncpy( Name1, CONV_TO_UTF8( m_PrefixString ), sizeof( Name1 ) ); else strncpy( Name1, CONV_TO_UTF8( GetField( REFERENCE )->m_Text ), - sizeof( Name1 ) ); + sizeof( Name1 ) ); } for( ii = 0; ii < (int) strlen( Name1 ); ii++ ) { #if defined(KICAD_GOST) - if( Name1[ii] == ' ' ) + if( Name1[ii] == ' ' ) #else - if( Name1[ii] <= ' ' ) + if( Name1[ii] <= ' ' ) #endif + Name1[ii] = '~'; } @@ -996,16 +1010,19 @@ bool SCH_COMPONENT::Save( FILE* f ) const strncpy( Name2, CONV_TO_UTF8( m_ChipName ), sizeof( Name2 ) ); for( ii = 0; ii < (int) strlen( Name2 ); ii++ ) #if defined(KICAD_GOST) + if( Name2[ii] == ' ' ) #else + if( Name2[ii] <= ' ' ) #endif + Name2[ii] = '~'; } else strncpy( Name2, NULL_STRING, sizeof( Name2 ) ); - if ( fprintf( f, "$Comp\n" ) == EOF ) + if( fprintf( f, "$Comp\n" ) == EOF ) return false; if( fprintf( f, "L %s %s\n", Name2, Name1 ) == EOF ) @@ -1040,15 +1057,15 @@ bool SCH_COMPONENT::Save( FILE* f ) const reference_fields = wxStringTokenize( m_PathsAndReferences[ii], delimiters ); if( fprintf( f, "AR Path=\"%s\" Ref=\"%s\" Part=\"%s\" \n", - CONV_TO_UTF8( reference_fields[0] ), - CONV_TO_UTF8( reference_fields[1] ), - CONV_TO_UTF8( reference_fields[2] ) ) == EOF ) + CONV_TO_UTF8( reference_fields[0] ), + CONV_TO_UTF8( reference_fields[1] ), + CONV_TO_UTF8( reference_fields[2] ) ) == EOF ) return false; } } // update the ugly field index, which I would like to see go away someday soon. - for( unsigned i=0; im_FieldId = i; // we don't need field Ids, please be gone. @@ -1056,7 +1073,7 @@ bool SCH_COMPONENT::Save( FILE* f ) const // Fixed fields: // Save fixed fields which are non blank. - for( unsigned i=0; im_Text.IsEmpty() ) @@ -1071,7 +1088,7 @@ bool SCH_COMPONENT::Save( FILE* f ) const // only in the dialog editors. No policy should be enforced here, simply // save all the user defined fields, they are present because a dialog editor // thought they should be. If you disagree, go fix the dialog editors. - for( unsigned i=MANDATORY_FIELDS; iSave( f ) ) @@ -1111,7 +1128,7 @@ EDA_Rect SCH_COMPONENT::GetBoundingBox() // Include BoundingBoxes of fields for( int ii = 0; ii < GetFieldCount(); ii++ ) { - if( ! GetField( ii )->IsVisible() ) + if( !GetField( ii )->IsVisible() ) continue; bbox.Merge( GetField( ii )->GetBoundaryBox() ); } @@ -1138,7 +1155,7 @@ void SCH_COMPONENT::DisplayInfo( WinEDA_DrawFrame* frame ) frame->ClearMsgPanel(); frame->AppendMsgPanel( _( "Reference" ), - GetRef(((WinEDA_SchematicFrame*)frame)->GetSheet()), + GetRef( ( (WinEDA_SchematicFrame*) frame )->GetSheet() ), DARKCYAN ); if( root_component->isPower() ) @@ -1149,7 +1166,7 @@ void SCH_COMPONENT::DisplayInfo( WinEDA_DrawFrame* frame ) // Display component reference in library and library frame->AppendMsgPanel( _( "Component" ), m_ChipName, BROWN ); - if( Entry->isAlias( ) ) + if( Entry->isAlias() ) frame->AppendMsgPanel( _( "Alias of" ), root_component->GetName(), BROWN ); frame->AppendMsgPanel( _( "Library" ), Entry->GetLibraryName(), BROWN ); @@ -1158,13 +1175,15 @@ void SCH_COMPONENT::DisplayInfo( WinEDA_DrawFrame* frame ) frame->AppendMsgPanel( _( "Key words" ), Entry->GetKeyWords(), DARKCYAN ); } + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ -void SCH_COMPONENT::Mirror_Y(int aYaxis_position) +void SCH_COMPONENT::Mirror_Y( int aYaxis_position ) { int dx = m_Pos.x; + SetOrientation( CMP_MIRROR_Y ); m_Pos.x -= aYaxis_position; NEGATE( m_Pos.x ); @@ -1180,15 +1199,58 @@ void SCH_COMPONENT::Mirror_Y(int aYaxis_position) } -bool SCH_COMPONENT::Matches( wxFindReplaceData& aSearchData, void * aAuxData ) +/** virtual function Mirror_X + * mirror item relative to an X axis + * @param aXaxis_position = the x axis position + */ +void SCH_COMPONENT::Mirror_X( int aXaxis_position ) +{ + int dy = m_Pos.y; + + SetOrientation( CMP_MIRROR_X ); + m_Pos.y -= aXaxis_position; + NEGATE( m_Pos.y ); + m_Pos.y += aXaxis_position; + dy -= m_Pos.y; // dy,0 is the move vector for this transform + + for( int ii = 0; ii < GetFieldCount(); ii++ ) + { + /* move the fields to the new position because the component itself + * has moved */ + GetField( ii )->m_Pos.y -= dy; + } +} + + +void SCH_COMPONENT::Rotate( wxPoint rotationPoint ) +{ + wxPoint prev = m_Pos; + + RotatePoint( &m_Pos, rotationPoint, 900 ); + + //SetOrientation( CMP_ROTATE_COUNTERCLOCKWISE ); + SetOrientation( CMP_ROTATE_CLOCKWISE ); + + for( int ii = 0; ii < GetFieldCount(); ii++ ) + { + /* move the fields to the new position because the component itself + * has moved */ + GetField( ii )->m_Pos.x -= prev.x - m_Pos.x; + GetField( ii )->m_Pos.y -= prev.y - m_Pos.y; + } +} + + +bool SCH_COMPONENT::Matches( wxFindReplaceData& aSearchData, void* aAuxData ) { // Search reference. // reference is a special field because a part identifier is added // in multi parts per package // the .m_AddExtraText of the field msut be set to add this identifier: LIB_COMPONENT* Entry = CMP_LIBRARY::FindLibraryComponent( m_ChipName ); + if( Entry && Entry->GetPartCount() > 1 ) - GetField( REFERENCE )->m_AddExtraText = true; + GetField( REFERENCE )->m_AddExtraText = true; else GetField( REFERENCE )->m_AddExtraText = false; @@ -1201,7 +1263,7 @@ bool SCH_COMPONENT::Matches( wxFindReplaceData& aSearchData, void * aAuxData ) if( !( aSearchData.GetFlags() & FR_SEARCH_ALL_FIELDS ) ) return false; - for( size_t i = VALUE+1; i < m_Fields.size(); i++ ) + for( size_t i = VALUE + 1; i < m_Fields.size(); i++ ) { if( GetField( i )->Matches( aSearchData, aAuxData ) ) return true; diff --git a/eeschema/class_sch_component.h b/eeschema/class_sch_component.h index e3ee560a87..37d5348baa 100644 --- a/eeschema/class_sch_component.h +++ b/eeschema/class_sch_component.h @@ -18,13 +18,14 @@ class SCH_SHEET_PATH; */ struct Error { - wxString errorText; + wxString errorText; Error( const wxChar* aMsg ) : errorText( aMsg ) { } + Error( const wxString& aMsg ) : errorText( aMsg ) { @@ -32,7 +33,7 @@ struct Error }; /// A container for several SCH_FIELD items -typedef std::vector SCH_FIELDS; +typedef std::vector SCH_FIELDS; /** @@ -44,14 +45,14 @@ class SCH_COMPONENT : public SCH_ITEM friend class DIALOG_EDIT_COMPONENT_IN_SCHEMATIC; public: - int m_Multi; // In multi unit chip - which unit to draw. + int m_Multi; // In multi unit chip - which unit to draw. - wxPoint m_Pos; + wxPoint m_Pos; - wxString m_ChipName; /* Key to look for in the library, + wxString m_ChipName; /* Key to look for in the library, * i.e. "74LS00". */ - wxString m_PrefixString; /* C, R, U, Q etc - the first character + wxString m_PrefixString; /* C, R, U, Q etc - the first character * which typically indicates what the * component is. Determined, upon * placement, from the library component. @@ -59,14 +60,14 @@ public: * first non-digits in the reference * fields. */ - int m_Convert; /* Handle multiple shape (for instance + int m_Convert; /* Handle multiple shape (for instance * De Morgan conversion) */ - int m_Transform[2][2]; /* The rotation/mirror transformation + int m_Transform[2][2]; /* The rotation/mirror transformation * matrix. */ private: - SCH_FIELDS m_Fields; ///< variable length list of fields + SCH_FIELDS m_Fields; ///< variable length list of fields /* Hierarchical references. @@ -78,7 +79,7 @@ private: * multi = part selection in multi parts per package (0 or 1 for one part * per package) */ - wxArrayString m_PathsAndReferences; + wxArrayString m_PathsAndReferences; void Init( const wxPoint& pos = wxPoint( 0, 0 ) ); @@ -128,7 +129,7 @@ public: * @param aFile The FILE to write to. * @return bool - true if success writing else false. */ - bool Save( FILE* aFile ) const; + bool Save( FILE* aFile ) const; /** @@ -147,12 +148,13 @@ public: * set to NULL. * @return SCH_COMPONENT* - a copy of me. */ - SCH_COMPONENT* GenCopy() + SCH_COMPONENT* GenCopy() { return new SCH_COMPONENT( *this ); } - void SetOrientation( int aOrientation ); + + void SetOrientation( int aOrientation ); /** function GetOrientation() * Used to display component orientation (in dialog editor or info) @@ -167,24 +169,24 @@ public: * ( a CMP_MIRROR_Y is find as a CMP_MIRROR_X + orientation 180, because * they are equivalent) */ - int GetOrientation(); + int GetOrientation(); - wxPoint GetScreenCoord( const wxPoint& coord ); - void DisplayInfo( WinEDA_DrawFrame* frame ); + wxPoint GetScreenCoord( const wxPoint& coord ); + void DisplayInfo( WinEDA_DrawFrame* frame ); /** * Suppress annotation ( i.i IC23 changed to IC? and part reset to 1) * @param aSheet: SCH_SHEET_PATH value: if NULL remove all annotations, * else remove annotation relative to this sheetpath */ - void ClearAnnotation( SCH_SHEET_PATH* aSheet ); + void ClearAnnotation( SCH_SHEET_PATH* aSheet ); /** function SetTimeStamp * Change the old time stamp to the new time stamp. * the time stamp is also modified in paths * @param aNewTimeStamp = new time stamp */ - void SetTimeStamp( long aNewTimeStamp); + void SetTimeStamp( long aNewTimeStamp ); /** * Function GetBoundaryBox @@ -193,7 +195,7 @@ public: * this include only fields defined in library * use GetBoundingBox() to include fields in schematic */ - EDA_Rect GetBoundaryBox() const; + EDA_Rect GetBoundaryBox() const; /** * Function GetBoundingBox @@ -202,7 +204,7 @@ public: * object, and the units should be in the pcb or schematic coordinate system. * It is OK to overestimate the size by a few counts. */ - EDA_Rect GetBoundingBox(); + EDA_Rect GetBoundingBox(); //---------------------------------------------------------------- @@ -212,7 +214,7 @@ public: * @reeturn wxString - the field name or wxEmptyString if invalid field * index. */ - wxString ReturnFieldName( int aFieldNdx ) const; + wxString ReturnFieldName( int aFieldNdx ) const; /** * Function GetField @@ -242,6 +244,7 @@ public: m_Fields = aFields; // vector copying, length is changed possibly } + //--------------------------------------------------------------- /** @@ -267,28 +270,29 @@ public: Draw( panel, DC, offset, draw_mode, Color, true ); } - void Draw( WinEDA_DrawPanel* panel, - wxDC* DC, - const wxPoint& offset, - int draw_mode, - int Color, - bool DrawPinText ); - void SwapData( SCH_COMPONENT* copyitem ); + void Draw( WinEDA_DrawPanel* panel, + wxDC* DC, + const wxPoint& offset, + int draw_mode, + int Color, + bool DrawPinText ); - void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); + void SwapData( SCH_COMPONENT* copyitem ); + + void Place( WinEDA_SchematicFrame* frame, wxDC* DC ); // returns a unique ID, in the form of a path. - wxString GetPath( SCH_SHEET_PATH* sheet ); + wxString GetPath( SCH_SHEET_PATH* sheet ); /** * Function GetRef * returns the reference, for the given sheet path. */ - const wxString GetRef( SCH_SHEET_PATH* sheet ); + const wxString GetRef( SCH_SHEET_PATH* sheet ); // Set the reference, for the given sheet path. - void SetRef( SCH_SHEET_PATH* sheet, const wxString& ref ); + void SetRef( SCH_SHEET_PATH* sheet, const wxString& ref ); /** * Function AddHierarchicalReference @@ -299,25 +303,26 @@ public: * @param aMulti = part selection, used in multi part per package (0 or 1 * for non multi) */ - void AddHierarchicalReference( const wxString& aPath, - const wxString& aRef, - int aMulti ); + void AddHierarchicalReference( const wxString& aPath, + const wxString& aRef, + int aMulti ); // returns the unit selection, for the given sheet path. - int GetUnitSelection( SCH_SHEET_PATH* aSheet ); + int GetUnitSelection( SCH_SHEET_PATH* aSheet ); // Set the unit selection, for the given sheet path. - void SetUnitSelection( SCH_SHEET_PATH* aSheet, - int aUnitSelection ); + void SetUnitSelection( SCH_SHEET_PATH* aSheet, + int aUnitSelection ); /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item * for a component, has no meaning, but it is necessary to satisfy the * SCH_ITEM class requirements. */ - virtual int GetPenSize( ) { return 0; } + virtual int GetPenSize() { return 0; } // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector @@ -329,11 +334,15 @@ public: GetField( ii )->Move( aMoveVector ); } + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y(int aYaxis_position); + virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); + /** * Compare schematic component reference and value fields against search string. @@ -344,9 +353,9 @@ public: * This param is used in this case * @return True if this component reference or value field matches the search criteria. */ - virtual bool Matches( wxFindReplaceData& aSearchData, void * aAuxData ); + virtual bool Matches( wxFindReplaceData& aSearchData, void* aAuxData ); - #if defined (DEBUG) + #if defined(DEBUG) /** * Function Show diff --git a/eeschema/class_schematic_items.cpp b/eeschema/class_schematic_items.cpp index c1dc7bb498..5821699ed7 100644 --- a/eeschema/class_schematic_items.cpp +++ b/eeschema/class_schematic_items.cpp @@ -5,7 +5,7 @@ #include "fctsys.h" #include "gr_basic.h" #include "class_drawpanel.h" - +#include "trigo.h" #include "common.h" #include "program.h" #include "general.h" @@ -97,11 +97,12 @@ bool SCH_BUS_ENTRY::Save( FILE* aFile ) const EDA_Rect SCH_BUS_ENTRY::GetBoundingBox() { EDA_Rect box; - box.SetOrigin(m_Pos); - box.SetEnd(m_End()); + + box.SetOrigin( m_Pos ); + box.SetEnd( m_End() ); box.Normalize(); - int width = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width; + int width = ( m_Width == 0 ) ? g_DrawDefaultLineThickness : m_Width; box.Inflate( width / 2 ); return box; @@ -141,6 +142,31 @@ void SCH_BUS_ENTRY::Draw( WinEDA_DrawPanel* panel, wxDC* DC, } +void SCH_BUS_ENTRY::Mirror_X( int aXaxis_position ) +{ + m_Pos.y -= aXaxis_position; + NEGATE( m_Pos.y ); + m_Pos.y += aXaxis_position; + NEGATE( m_Size.y ); +} + + +void SCH_BUS_ENTRY::Mirror_Y( int aYaxis_position ) +{ + m_Pos.x -= aYaxis_position; + NEGATE( m_Pos.x ); + m_Pos.x += aYaxis_position; + NEGATE( m_Size.x ); +} + + +void SCH_BUS_ENTRY::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); + RotatePoint( &m_Size.x, &m_Size.y, 900 ); +} + + /**********************/ /* class SCH_JUNCTION */ /**********************/ @@ -148,15 +174,14 @@ void SCH_BUS_ENTRY::Draw( WinEDA_DrawPanel* panel, wxDC* DC, SCH_JUNCTION::SCH_JUNCTION( const wxPoint& pos ) : SCH_ITEM( NULL, DRAW_JUNCTION_STRUCT_TYPE ) { -#define DRAWJUNCTION_DIAMETER 32 /* Diameter of junction symbol between wires */ - m_Pos = pos; - m_Layer = LAYER_JUNCTION; +#define DRAWJUNCTION_DIAMETER 32 /* Diameter of junction symbol between wires */ + m_Pos = pos; + m_Layer = LAYER_JUNCTION; m_Size.x = m_Size.y = DRAWJUNCTION_DIAMETER; #undef DRAWJUNCTION_DIAMETER } - SCH_JUNCTION* SCH_JUNCTION::GenCopy() { SCH_JUNCTION* newitem = new SCH_JUNCTION( m_Pos ); @@ -191,6 +216,7 @@ bool SCH_JUNCTION::Save( FILE* aFile ) const EDA_Rect SCH_JUNCTION::GetBoundingBox() { EDA_Rect rect; + rect.SetOrigin( m_Pos ); rect.Inflate( ( GetPenSize() + m_Size.x ) / 2 ); @@ -207,7 +233,7 @@ bool SCH_JUNCTION::HitTest( const wxPoint& aPosRef ) wxPoint dist = aPosRef - m_Pos; return sqrt( ( (double) ( dist.x * dist.x ) ) + - ( (double) ( dist.y * dist.y ) ) ) < ( m_Size.x / 2 ); + ( (double) ( dist.y * dist.y ) ) ) < ( m_Size.x / 2 ); } @@ -236,11 +262,33 @@ void SCH_JUNCTION::Draw( WinEDA_DrawPanel* panel, wxDC* DC, GRSetDrawMode( DC, DrawMode ); GRFilledCircle( &panel->m_ClipBox, DC, m_Pos.x + offset.x, - m_Pos.y + offset.y, (m_Size.x/2), 0, color, + m_Pos.y + offset.y, (m_Size.x / 2), 0, color, color ); } +void SCH_JUNCTION::Mirror_X( int aXaxis_position ) +{ + m_Pos.y -= aXaxis_position; + NEGATE( m_Pos.y ); + m_Pos.y += aXaxis_position; +} + + +void SCH_JUNCTION::Mirror_Y( int aYaxis_position ) +{ + m_Pos.x -= aYaxis_position; + NEGATE( m_Pos.x ); + m_Pos.x += aYaxis_position; +} + + +void SCH_JUNCTION::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); +} + + #if defined(DEBUG) void SCH_JUNCTION::Show( int nestLevel, std::ostream& os ) { @@ -263,7 +311,7 @@ SCH_NO_CONNECT::SCH_NO_CONNECT( const wxPoint& pos ) : SCH_ITEM( NULL, DRAW_NOCONNECT_STRUCT_TYPE ) { #define DRAWNOCONNECT_SIZE 48 /* No symbol connection range. */ - m_Pos = pos; + m_Pos = pos; m_Size.x = m_Size.y = DRAWNOCONNECT_SIZE; #undef DRAWNOCONNECT_SIZE } @@ -282,8 +330,9 @@ SCH_NO_CONNECT* SCH_NO_CONNECT::GenCopy() EDA_Rect SCH_NO_CONNECT::GetBoundingBox() { - int delta = ( GetPenSize() + m_Size.x ) / 2; - EDA_Rect box; + int delta = ( GetPenSize() + m_Size.x ) / 2; + EDA_Rect box; + box.SetOrigin( m_Pos ); box.Inflate( delta ); @@ -340,9 +389,9 @@ int SCH_NO_CONNECT::GetPenSize() void SCH_NO_CONNECT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int DrawMode, int Color ) { - int pX, pY, color; - int delta = m_Size.x / 2; - int width = g_DrawDefaultLineThickness; + int pX, pY, color; + int delta = m_Size.x / 2; + int width = g_DrawDefaultLineThickness; pX = m_Pos.x + offset.x; pY = m_Pos.y + offset.y; @@ -360,6 +409,28 @@ void SCH_NO_CONNECT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, } +void SCH_NO_CONNECT::Mirror_X( int aXaxis_position ) +{ + m_Pos.y -= aXaxis_position; + NEGATE( m_Pos.y ); + m_Pos.y += aXaxis_position; +} + + +void SCH_NO_CONNECT::Mirror_Y( int aYaxis_position ) +{ + m_Pos.x -= aYaxis_position; + NEGATE( m_Pos.x ); + m_Pos.x += aYaxis_position; +} + + +void SCH_NO_CONNECT::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); +} + + /******************/ /* Class SCH_LINE */ /******************/ @@ -431,6 +502,7 @@ void SCH_LINE::Show( int nestLevel, std::ostream& os ) << GetClass().Lower().mb_str() << ">\n"; } + #endif @@ -446,7 +518,7 @@ EDA_Rect SCH_LINE::GetBoundingBox() // return a rectangle which is [pos,dim) in nature. therefore the +1 EDA_Rect ret( wxPoint( xmin, ymin ), - wxSize( xmax - xmin + 1, ymax - ymin + 1 ) ); + wxSize( xmax - xmin + 1, ymax - ymin + 1 ) ); return ret; } @@ -530,6 +602,35 @@ void SCH_LINE::Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, } +void SCH_LINE::Mirror_X( int aXaxis_position ) +{ + m_Start.y -= aXaxis_position; + NEGATE( m_Start.y ); + m_Start.y += aXaxis_position; + m_End.y -= aXaxis_position; + NEGATE( m_End.y ); + m_End.y += aXaxis_position; +} + + +void SCH_LINE::Mirror_Y( int aYaxis_position ) +{ + m_Start.x -= aYaxis_position; + NEGATE( m_Start.x ); + m_Start.x += aYaxis_position; + m_End.x -= aYaxis_position; + NEGATE( m_End.x ); + m_End.x += aYaxis_position; +} + + +void SCH_LINE::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Start, rotationPoint, 900 ); + RotatePoint( &m_End, rotationPoint, 900 ); +} + + /***********************/ /* Class SCH_POLYLINE */ /***********************/ @@ -586,7 +687,7 @@ bool SCH_POLYLINE::Save( FILE* aFile ) const if( GetLayer() == LAYER_BUS ) layer = "Bus"; if( fprintf( aFile, "Poly %s %s %d\n", - width, layer, GetCornerCount() ) == EOF ) + width, layer, GetCornerCount() ) == EOF ) { return false; } @@ -648,3 +749,34 @@ void SCH_POLYLINE::Draw( WinEDA_DrawPanel* panel, wxDC* DC, m_PolyPoints[i].y + offset.y, width, color ); } } + + +void SCH_POLYLINE::Mirror_X( int aXaxis_position ) +{ + for( unsigned ii = 0; ii < GetCornerCount(); ii++ ) + { + m_PolyPoints[ii].y -= aXaxis_position; + NEGATE( m_PolyPoints[ii].y ); + m_PolyPoints[ii].y = aXaxis_position; + } +} + + +void SCH_POLYLINE::Mirror_Y( int aYaxis_position ) +{ + for( unsigned ii = 0; ii < GetCornerCount(); ii++ ) + { + m_PolyPoints[ii].x -= aYaxis_position; + NEGATE( m_PolyPoints[ii].x ); + m_PolyPoints[ii].x = aYaxis_position; + } +} + + +void SCH_POLYLINE::Rotate( wxPoint rotationPoint ) +{ + for( unsigned ii = 0; ii < GetCornerCount(); ii++ ) + { + RotatePoint( &m_PolyPoints[ii], rotationPoint, 900 ); + } +} diff --git a/eeschema/class_schematic_items.h b/eeschema/class_schematic_items.h index 45b15469d2..0009569cfa 100644 --- a/eeschema/class_schematic_items.h +++ b/eeschema/class_schematic_items.h @@ -71,14 +71,15 @@ public: /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item */ - virtual int GetPenSize( ); + virtual int GetPenSize(); // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector */ - virtual void Move(const wxPoint& aMoveVector) + virtual void Move( const wxPoint& aMoveVector ) { if( (m_Flags & STARTPOINT) == 0 ) m_Start += aMoveVector; @@ -86,22 +87,18 @@ public: m_End += aMoveVector; } + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y(int aYaxis_position) - { - m_Start.x -= aYaxis_position; - NEGATE( m_Start.x ); - m_Start.x += aYaxis_position; - m_End.x -= aYaxis_position; - NEGATE( m_End.x ); - m_End.x += aYaxis_position; - } + virtual void Mirror_X( int aXaxis_position ); + virtual void Mirror_Y( int aYaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ); + #endif }; @@ -110,7 +107,7 @@ class SCH_NO_CONNECT : public SCH_ITEM { public: wxPoint m_Pos; /* XY coordinates of NoConnect. */ - wxSize m_Size; // size of this symbol + wxSize m_Size; // size of this symbol public: SCH_NO_CONNECT( const wxPoint& pos ); @@ -126,11 +123,11 @@ public: /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item */ - virtual int GetPenSize( ); + virtual int GetPenSize(); - virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, - const wxPoint& offset, int draw_mode, - int Color = -1 ); + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, + const wxPoint& offset, int draw_mode, + int Color = -1 ); /** * Function Save @@ -139,13 +136,13 @@ public: * @param aFile The FILE to write to. * @return bool - true if success writing else false. */ - bool Save( FILE* aFile ) const; + bool Save( FILE* aFile ) const; /** Function HitTest * @return true if the point aPosRef is within item area * @param aPosRef = a wxPoint to test */ - bool HitTest( const wxPoint& aPosRef ); + bool HitTest( const wxPoint& aPosRef ); /** * Function GetBoundingBox @@ -155,28 +152,27 @@ public: * schematic coordinate system. It is OK to overestimate the size * by a few counts. */ - EDA_Rect GetBoundingBox(); + EDA_Rect GetBoundingBox(); // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector */ - virtual void Move(const wxPoint& aMoveVector) + virtual void Move( const wxPoint& aMoveVector ) { m_Pos += aMoveVector; } + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y(int aYaxis_position) - { - m_Pos.x -= aYaxis_position; - NEGATE( m_Pos.x ); - m_Pos.x += aYaxis_position; - } + virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); }; @@ -230,29 +226,27 @@ public: /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item */ - virtual int GetPenSize( ); + virtual int GetPenSize(); // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector */ - virtual void Move(const wxPoint& aMoveVector) + virtual void Move( const wxPoint& aMoveVector ) { m_Pos += aMoveVector; } + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y(int aYaxis_position) - { - m_Pos.x -= aYaxis_position; - NEGATE( m_Pos.x ); - m_Pos.x += aYaxis_position; - NEGATE( m_Size.x ); - } + virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); }; class SCH_POLYLINE : public SCH_ITEM @@ -271,10 +265,10 @@ public: } - SCH_POLYLINE* GenCopy(); - virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, - const wxPoint& offset, int draw_mode, - int Color = -1 ); + SCH_POLYLINE* GenCopy(); + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, + const wxPoint& offset, int draw_mode, + int Color = -1 ); /** * Function Save @@ -283,7 +277,7 @@ public: * @param aFile The FILE to write to. * @return bool - true if success writing else false. */ - bool Save( FILE* aFile ) const; + bool Save( FILE* aFile ) const; /** Function AddPoint * add a corner to m_PolyPoints @@ -293,6 +287,7 @@ public: m_PolyPoints.push_back( point ); } + /** Function GetCornerCount * @return the number of corners */ @@ -302,31 +297,28 @@ public: /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item */ - virtual int GetPenSize( ); + virtual int GetPenSize(); // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector */ - virtual void Move(const wxPoint& aMoveVector) + virtual void Move( const wxPoint& aMoveVector ) { for( unsigned ii = 0; ii < GetCornerCount(); ii++ ) m_PolyPoints[ii] += aMoveVector; } + + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y(int aYaxis_position) - { - for( unsigned ii = 0; ii < GetCornerCount(); ii++ ) - { - m_PolyPoints[ii].x -= aYaxis_position; - NEGATE( m_PolyPoints[ii].x ); - m_PolyPoints[ii].x = aYaxis_position; - } - } + virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); }; @@ -334,7 +326,7 @@ class SCH_JUNCTION : public SCH_ITEM { public: wxPoint m_Pos; /* XY coordinates of connection. */ - wxSize m_Size; + wxSize m_Size; public: SCH_JUNCTION( const wxPoint& pos ); @@ -350,7 +342,7 @@ public: * @return true if the point aPosRef is within item area * @param aPosRef = a wxPoint to test */ - bool HitTest( const wxPoint& aPosRef ); + bool HitTest( const wxPoint& aPosRef ); /** * Function GetBoundingBox @@ -360,17 +352,18 @@ public: * schematic coordinate system. It is OK to overestimate the size * by a few counts. */ - EDA_Rect GetBoundingBox(); + EDA_Rect GetBoundingBox(); SCH_JUNCTION* GenCopy(); /** Function GetPenSize * @return the size of the "pen" that be used to draw or plot this item */ - virtual int GetPenSize( ); + virtual int GetPenSize(); virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, int Color = -1 ); + /** * Function Save * writes the data structures for this object out to a FILE in "*.sch" @@ -381,28 +374,28 @@ public: bool Save( FILE* aFile ) const; // Geometric transforms (used in block operations): + /** virtual function Move * move item to a new position. * @param aMoveVector = the displacement vector */ - virtual void Move(const wxPoint& aMoveVector) + virtual void Move( const wxPoint& aMoveVector ) { m_Pos += aMoveVector; } + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ - virtual void Mirror_Y(int aYaxis_position) - { - m_Pos.x -= aYaxis_position; - NEGATE( m_Pos.x ); - m_Pos.x += aYaxis_position; - } + virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ); + #endif }; diff --git a/eeschema/class_text-label.cpp b/eeschema/class_text-label.cpp index a72adc9ec7..8001268dd4 100644 --- a/eeschema/class_text-label.cpp +++ b/eeschema/class_text-label.cpp @@ -218,10 +218,18 @@ void SCH_TEXT::Mirror_Y( int aYaxis_position ) dx = LenSize( m_Text ) / 2; break; + case 1: /* Vert Orientation UP */ + dx = -m_Size.x / 2; + break; + case 2: /* invert horizontal text*/ dx = -LenSize( m_Text ) / 2; break; + case 3: /* Vert Orientation BOTTOM */ + dx = m_Size.x / 2; + break; + default: dx = 0; break; @@ -236,6 +244,84 @@ void SCH_TEXT::Mirror_Y( int aYaxis_position ) } +/** virtual function Mirror_X + * mirror item relative to an X axis + * @param aXaxis_position = the x axis position + */ +void SCH_TEXT::Mirror_X( int aXaxis_position ) +{ + // Text is NOT really mirrored; it is moved to a suitable position + // which is the closest position for a true mirrored text + // The center position is mirrored and the text is moved for half + // horizontal len + int py = m_Pos.y; + int dy; + + switch( GetSchematicTextOrientation() ) + { + case 0: /* horizontal text */ + dy = -m_Size.y / 2; + break; + + case 1: /* Vert Orientation UP */ + dy = -LenSize( m_Text ) / 2; + break; + + case 2: /* invert horizontal text*/ + dy = m_Size.y / 2; // how to calculate text height? + break; + + case 3: /* Vert Orientation BOTTOM */ + dy = LenSize( m_Text ) / 2; + break; + + default: + dy = 0; + break; + } + + py += dy; + py -= aXaxis_position; + NEGATE( py ); + py += aXaxis_position; + py -= dy; + m_Pos.y = py; +} + + +void SCH_TEXT::Rotate( wxPoint rotationPoint ) +{ + int dy; + + RotatePoint( &m_Pos, rotationPoint, 900 ); + SetSchematicTextOrientation( (GetSchematicTextOrientation() + 1) % 4 ); + switch( GetSchematicTextOrientation() ) + { + case 0: /* horizontal text */ + dy = m_Size.y; + break; + + case 1: /* Vert Orientation UP */ + dy = 0; + break; + + case 2: /* invert horizontal text*/ + dy = m_Size.y; + break; + + case 3: /* Vert Orientation BOTTOM */ + dy = 0; + break; + + default: + dy = 0; + break; + } + + m_Pos.y += dy; +} + + /** function GetSchematicTextOffset (virtual) * @return the offset between the SCH_TEXT position and the text itself * position @@ -302,6 +388,32 @@ void SCH_HIERLABEL::Mirror_Y( int aYaxis_position ) } +void SCH_HIERLABEL::Mirror_X( int aXaxis_position ) +{ + switch( GetSchematicTextOrientation() ) + { + case 1: /* vertical text */ + SetSchematicTextOrientation( 3 ); + break; + + case 3: /* invert vertical text*/ + SetSchematicTextOrientation( 1 ); + break; + } + + m_Pos.y -= aXaxis_position; + NEGATE( m_Pos.y ); + m_Pos.y += aXaxis_position; +} + + +void SCH_HIERLABEL::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); + SetSchematicTextOrientation( (GetSchematicTextOrientation() + 3) % 4 ); +} + + /** virtual function Mirror_Y * mirror item relative to an Y axis * @param aYaxis_position = the y axis position @@ -330,6 +442,32 @@ void SCH_GLOBALLABEL::Mirror_Y( int aYaxis_position ) } +void SCH_GLOBALLABEL::Mirror_X( int aXaxis_position ) +{ + switch( GetSchematicTextOrientation() ) + { + case 1: /* vertical text */ + SetSchematicTextOrientation( 3 ); + break; + + case 3: /* invert vertical text*/ + SetSchematicTextOrientation( 1 ); + break; + } + + m_Pos.y -= aXaxis_position; + NEGATE( m_Pos.y ); + m_Pos.y += aXaxis_position; +} + + +void SCH_GLOBALLABEL::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); + SetSchematicTextOrientation( (GetSchematicTextOrientation() + 3) % 4 ); +} + + /** function GetSchematicTextOffset (virtual) * @return the offset between the SCH_TEXT position and the text itself * position @@ -717,6 +855,32 @@ SCH_LABEL::SCH_LABEL( const wxPoint& pos, const wxString& text ) : } +/** virtual function Mirror_X + * mirror item relative to an X axis + * @param aXaxis_position = the x axis position + */ +void SCH_LABEL::Mirror_X( int aXaxis_position ) +{ + // Text is NOT really mirrored; it is moved to a suitable position + // which is the closest position for a true mirrored text + // The center position is mirrored and the text is moved for half + // horizontal len + int py = m_Pos.y; + + py -= aXaxis_position; + NEGATE( py ); + py += aXaxis_position; + m_Pos.y = py; +} + + +void SCH_LABEL::Rotate( wxPoint rotationPoint ) +{ + RotatePoint( &m_Pos, rotationPoint, 900 ); + SetSchematicTextOrientation( (GetSchematicTextOrientation() + 1) % 4 ); +} + + /** * Function Save * writes the data structures for this object out to a FILE in "*.brd" format. @@ -795,8 +959,8 @@ bool SCH_GLOBALLABEL::HitTest( const wxPoint& aPosRef ) /*****************************************************************************/ -SCH_HIERLABEL::SCH_HIERLABEL( const wxPoint& pos, const wxString& text ) : - SCH_TEXT( pos, text, TYPE_SCH_HIERLABEL ) +SCH_HIERLABEL::SCH_HIERLABEL( const wxPoint& pos, const wxString& text, KICAD_T aType ) : + SCH_TEXT( pos, text, aType ) { /*****************************************************************************/ m_Layer = LAYER_HIERLABEL; diff --git a/eeschema/class_text-label.h b/eeschema/class_text-label.h index 4a0a2eedd6..f8cc008de3 100644 --- a/eeschema/class_text-label.h +++ b/eeschema/class_text-label.h @@ -49,7 +49,6 @@ protected: * Saving file */ - public: SCH_TEXT( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString, @@ -143,7 +142,10 @@ public: * mirror item relative to an Y axis * @param aYaxis_position = the y axis position */ + virtual void Rotate( wxPoint rotationPoint ); virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + /** * Compare schematic text entry against search string. @@ -152,7 +154,7 @@ public: * @param aAuxData - a pointer on auxiliary data, if needed. Can be null * @return True if this schematic text item matches the search criteria. */ - virtual bool Matches( wxFindReplaceData& aSearchData, void * aAuxData ); + virtual bool Matches( wxFindReplaceData& aSearchData, void* aAuxData ); #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ); @@ -201,6 +203,8 @@ public: * wire) */ virtual wxPoint GetSchematicTextOffset(); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); /** * Function GetBoundingBox @@ -209,7 +213,7 @@ public: * object, and the units should be in the pcb or schematic coordinate system. * It is OK to overestimate the size by a few counts. */ - EDA_Rect GetBoundingBox(); + EDA_Rect GetBoundingBox(); /** * Function Save @@ -300,6 +304,8 @@ public: * @param aYaxis_position = the y axis position */ virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); }; @@ -307,7 +313,7 @@ class SCH_HIERLABEL : public SCH_TEXT { public: SCH_HIERLABEL( const wxPoint& pos = wxPoint( 0, 0 ), - const wxString& text = wxEmptyString ); + const wxString& text = wxEmptyString, KICAD_T aType = TYPE_SCH_HIERLABEL ); ~SCH_HIERLABEL() { } virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, @@ -381,6 +387,8 @@ public: * @param aYaxis_position = the y axis position */ virtual void Mirror_Y( int aYaxis_position ); + virtual void Mirror_X( int aXaxis_position ); + virtual void Rotate( wxPoint rotationPoint ); }; #endif /* CLASS_TEXT_LABEL_H */ diff --git a/eeschema/dangling_ends.cpp b/eeschema/dangling_ends.cpp index e18fd85714..fe817f72fa 100644 --- a/eeschema/dangling_ends.cpp +++ b/eeschema/dangling_ends.cpp @@ -57,15 +57,15 @@ DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList ); /* Returns true if the point P is on the segment S. */ bool SegmentIntersect( wxPoint aSegStart, wxPoint aSegEnd, wxPoint aTestPoint ) { - wxPoint vectSeg = aSegEnd - aSegStart; // Vector from S1 to S2 + wxPoint vectSeg = aSegEnd - aSegStart; // Vector from S1 to S2 wxPoint vectPoint = aTestPoint - aSegStart; // Vector from S1 to P // Use long long here to avoid overflow in calculations - if( (long long)vectSeg.x * vectPoint.y - (long long)vectSeg.y * vectPoint.x ) + if( (long long) vectSeg.x * vectPoint.y - (long long) vectSeg.y * vectPoint.x ) return false; /* Cross product non-zero, vectors not parallel */ - if( ((long long)vectSeg.x * vectPoint.x + (long long)vectSeg.y * vectPoint.y) < - ((long long)vectPoint.x * vectPoint.x + (long long)vectPoint.y * vectPoint.y) ) + if( ( (long long) vectSeg.x * vectPoint.x + (long long) vectSeg.y * vectPoint.y ) < + ( (long long) vectPoint.x * vectPoint.x + (long long) vectPoint.y * vectPoint.y ) ) return false; /* Point not on segment */ return true; @@ -100,6 +100,14 @@ void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC ) TestLabelForDangling( (SCH_LABEL*) item, this, DC ); break; + case DRAW_SHEET_STRUCT_TYPE: + + // Read the hierarchical pins list and teast for dangling pins: + BOOST_FOREACH( SCH_SHEET_PIN & sheetPin, ( (SCH_SHEET*) item )->GetSheetPins() ) { + TestLabelForDangling( &sheetPin, this, DC ); + } + break; + case DRAW_SEGMENT_STRUCT_TYPE: #undef STRUCT #define STRUCT ( (SCH_LINE*) item ) @@ -118,7 +126,7 @@ void WinEDA_SchematicFrame::TestDanglingEnds( SCH_ITEM* DrawList, wxDC* DC ) break; default: - ; + break; } } } diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 1c8634eb5c..67eb1e117b 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -435,7 +435,11 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, break; case HK_ROTATE: // Component or other schematic item rotation - + if ( screen->m_BlockLocate.m_State != STATE_NO_BLOCK)//allows bloc operation on hotkey + { + HandleBlockEndByPopUp(BLOCK_ROTATE, DC ); + break; + } if( DrawStruct == NULL ) { // Find the schematic object to rotate under the cursor @@ -465,6 +469,9 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, switch( DrawStruct->Type() ) { + case DRAW_SHEET_STRUCT_TYPE: //TODO allow sheet rotate on hotkey + //wxPostEvent( this, eventRotateSheet ); + break; case TYPE_SCH_COMPONENT: wxPostEvent( this, eventRotateComponent ); break; @@ -487,6 +494,11 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, break; case HK_MIRROR_Y_COMPONENT: // Mirror Y (Component) + if ( screen->m_BlockLocate.m_State != STATE_NO_BLOCK) + { + HandleBlockEndByPopUp(BLOCK_MIRROR_Y, DC ); + break; + } if( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( (SCH_SCREEN*) GetScreen() ); if( DrawStruct ) @@ -501,6 +513,11 @@ void WinEDA_SchematicFrame::OnHotKey( wxDC* DC, int hotkey, break; case HK_MIRROR_X_COMPONENT: // Mirror X (Component) + if ( screen->m_BlockLocate.m_State != STATE_NO_BLOCK) //allows bloc operation on hotkey + { + HandleBlockEndByPopUp(BLOCK_MIRROR_X, DC ); + break; + } if( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if( DrawStruct ) diff --git a/eeschema/onrightclick.cpp b/eeschema/onrightclick.cpp index e00260034b..64431a180e 100644 --- a/eeschema/onrightclick.cpp +++ b/eeschema/onrightclick.cpp @@ -19,7 +19,6 @@ using namespace std; - static void AddMenusForBlock( wxMenu* PopMenu, WinEDA_SchematicFrame* frame ); static void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, WinEDA_SchematicFrame* frame ); static void AddMenusForBus( wxMenu* PopMenu, SCH_LINE* Bus, WinEDA_SchematicFrame* frame ); @@ -209,7 +208,7 @@ bool WinEDA_SchematicFrame::OnRightClick( const wxPoint& MousePos, wxMenu* PopMe default: wxString msg; msg.Printf( wxT( "WinEDA_SchematicFrame::OnRightClick Error: unknown DrawType %d" ), - DrawStruct->Type() ); + DrawStruct->Type() ); DisplayError( this, msg ); break; } @@ -223,7 +222,8 @@ void AddMenusForComponentField( wxMenu* PopMenu, SCH_FIELD* Field ) { wxString msg; - if( !Field->m_Flags ){ + if( !Field->m_Flags ) + { msg = AddHotkeyName( _( "Move Field" ), s_Schematic_Hokeys_Descr, HK_MOVE_COMPONENT_OR_ITEM ); ADD_MENUITEM( PopMenu, ID_POPUP_SCH_MOVE_ITEM_REQUEST, msg, move_text_xpm ); @@ -444,7 +444,7 @@ void AddMenusForLabel( wxMenu* PopMenu, SCH_LABEL* Label ) void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ) { wxString msg; - wxMenu* menu_change_type = new wxMenu; + wxMenu* menu_change_type = new wxMenu; if( !Text->m_Flags ) { @@ -482,7 +482,7 @@ void AddMenusForText( wxMenu* PopMenu, SCH_TEXT* Text ) void AddMenusForJunction( wxMenu* PopMenu, SCH_JUNCTION* Junction, WinEDA_SchematicFrame* frame ) { - bool is_new = (Junction->m_Flags & IS_NEW) ? TRUE : FALSE; + bool is_new = (Junction->m_Flags & IS_NEW) ? TRUE : FALSE; wxString msg; if( !is_new ) @@ -506,8 +506,8 @@ void AddMenusForJunction( wxMenu* PopMenu, SCH_JUNCTION* Junction, WinEDA_Schema void AddMenusForWire( wxMenu* PopMenu, SCH_LINE* Wire, WinEDA_SchematicFrame* frame ) { - bool is_new = (Wire->m_Flags & IS_NEW) ? TRUE : FALSE; - wxPoint pos = frame->GetScreen()->m_Curseur; + bool is_new = (Wire->m_Flags & IS_NEW) ? TRUE : FALSE; + wxPoint pos = frame->GetScreen()->m_Curseur; wxString msg; if( is_new ) @@ -630,6 +630,7 @@ void AddMenusForPinSheet( wxMenu* PopMenu, SCH_SHEET_PIN* PinSheet ) void AddMenusForBlock( wxMenu* PopMenu, WinEDA_SchematicFrame* frame ) { wxString msg; + ADD_MENUITEM( PopMenu, ID_POPUP_CANCEL_CURRENT_COMMAND, _( "Cancel Block" ), cancel_xpm ); PopMenu->AppendSeparator(); @@ -650,6 +651,9 @@ void AddMenusForBlock( wxMenu* PopMenu, WinEDA_SchematicFrame* frame ) ADD_MENUITEM( PopMenu, ID_POPUP_DRAG_BLOCK, msg, move_xpm ); ADD_MENUITEM( PopMenu, ID_POPUP_DELETE_BLOCK, _( "Delete Block" ), delete_xpm ); ADD_MENUITEM( PopMenu, ID_POPUP_MIRROR_Y_BLOCK, _( "Mirror Block ||" ), mirror_H_xpm ); + ADD_MENUITEM( PopMenu, ID_POPUP_MIRROR_X_BLOCK, _( "Mirror Block --" ), mirror_V_xpm ); + ADD_MENUITEM( PopMenu, ID_POPUP_ROTATE_BLOCK, _( "Rotate Block ccw" ), rotate_pos_xpm ); + #if 0 #ifdef __WINDOWS__ ADD_MENUITEM( menu_other_block_commands, ID_GEN_COPY_BLOCK_TO_CLIPBOARD, diff --git a/eeschema/operations_on_items_lists.cpp b/eeschema/operations_on_items_lists.cpp index 8341099fcd..fcc137d3f7 100644 --- a/eeschema/operations_on_items_lists.cpp +++ b/eeschema/operations_on_items_lists.cpp @@ -1,8 +1,8 @@ /*************************************************** * operations_on_item_lists.cpp - * functions used in block commands, on lists of schematic items: - * move, mirror, delete and copy - ****************************************************/ + * functions used in block commands, or undo/redo, + * to move, mirror, delete, copy ... lists of schematic items + */ #include "fctsys.h" #include "appl_wxstruct.h" @@ -14,9 +14,17 @@ #include "class_marker_sch.h" #include "protos.h" +void RotateListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& rotationPoint ) +{ + for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) + { + SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetPickedItem( ii ); + item->Rotate( rotationPoint ); // Place it in its new position. + item->m_Flags = 0; + } +} + -void MoveItemsInList( PICKED_ITEMS_LIST& aItemsList, const wxPoint aMoveVector ); -void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& aMirrorPoint ); void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList ); void DuplicateItemsInList( SCH_SCREEN* screen, PICKED_ITEMS_LIST& aItemsList, @@ -34,6 +42,17 @@ void MirrorListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& aMirrorPoint ) } +void Mirror_X_ListOfItems( PICKED_ITEMS_LIST& aItemsList, wxPoint& aMirrorPoint ) +{ + for( unsigned ii = 0; ii < aItemsList.GetCount(); ii++ ) + { + SCH_ITEM* item = (SCH_ITEM*) aItemsList.GetPickedItem( ii ); + item->Mirror_X( aMirrorPoint.y ); // Place it in its new position. + item->m_Flags = 0; + } +} + + /** Function MoveItemsInList * Move a list of items to a given move vector * @param aItemsList = list of picked items @@ -68,8 +87,9 @@ void DeleteItemsInList( WinEDA_DrawPanel* panel, PICKED_ITEMS_LIST& aItemsList ) if( item->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE ) { /* this item is depending on a sheet, and is not in global list */ - wxMessageBox( wxT( "DeleteItemsInList() err: unexpected \ -DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE" ) ); + wxMessageBox( wxT( + "DeleteItemsInList() err: unexpected \ +DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE" ) ); } else { @@ -102,7 +122,7 @@ void DeleteStruct( WinEDA_DrawPanel* panel, wxDC* DC, SCH_ITEM* DrawStruct ) /* This structure is attached to a node, and is not accessible by * the global list directly. */ frame->SaveCopyInUndoList( - (SCH_ITEM*) ( (SCH_SHEET_PIN*) DrawStruct )-> GetParent(), + (SCH_ITEM*)( (SCH_SHEET_PIN*) DrawStruct )->GetParent(), UR_CHANGED ); frame->DeleteSheetLabel( DC ? true : false, (SCH_SHEET_PIN*) DrawStruct ); @@ -199,7 +219,7 @@ SCH_ITEM* DuplicateStruct( SCH_ITEM* aDrawStruct, bool aClone ) wxMessageBox( wxT( "DuplicateStruct error: NULL struct" ) ); return NULL; } - + switch( aDrawStruct->Type() ) { case DRAW_POLYLINE_STRUCT_TYPE: @@ -248,9 +268,10 @@ SCH_ITEM* DuplicateStruct( SCH_ITEM* aDrawStruct, bool aClone ) case DRAW_SHEET_STRUCT_TYPE: NewDrawStruct = ( (SCH_SHEET*) aDrawStruct )->GenCopy(); - if ( aClone ) + if( aClone ) { - ((SCH_SHEET*)NewDrawStruct)->m_SheetName = ((SCH_SHEET*)aDrawStruct)->m_SheetName; + ( (SCH_SHEET*) NewDrawStruct )->m_SheetName = + ( (SCH_SHEET*) aDrawStruct )->m_SheetName; } break; @@ -264,7 +285,7 @@ SCH_ITEM* DuplicateStruct( SCH_ITEM* aDrawStruct, bool aClone ) break; } - if ( aClone ) + if( aClone ) NewDrawStruct->m_TimeStamp = aDrawStruct->m_TimeStamp; NewDrawStruct->m_Image = aDrawStruct; diff --git a/eeschema/plot.cpp b/eeschema/plot.cpp index c0a8c1d40b..622401e980 100644 --- a/eeschema/plot.cpp +++ b/eeschema/plot.cpp @@ -106,10 +106,10 @@ static void PlotTextField( PLOTTER* plotter, SCH_COMPONENT* DrawLibItem, */ EDA_Rect BoundaryBox = field->GetBoundaryBox(); GRTextHorizJustifyType hjustify = GR_TEXT_HJUSTIFY_CENTER; - GRTextVertJustifyType vjustify = GR_TEXT_VJUSTIFY_CENTER; - wxPoint textpos = BoundaryBox.Centre(); + GRTextVertJustifyType vjustify = GR_TEXT_VJUSTIFY_CENTER; + wxPoint textpos = BoundaryBox.Centre(); - int thickness = field->GetPenSize(); + int thickness = field->GetPenSize(); if( !IsMulti || (FieldNumber != REFERENCE) ) { @@ -242,6 +242,7 @@ static void PlotTextStruct( PLOTTER* plotter, SCH_TEXT* aSchText ) switch( aSchText->Type() ) { + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: case TYPE_SCH_GLOBALLABEL: case TYPE_SCH_HIERLABEL: case TYPE_SCH_LABEL: @@ -293,7 +294,8 @@ static void PlotTextStruct( PLOTTER* plotter, SCH_TEXT* aSchText ) aSchText->m_Pos ); plotter->poly( Poly.size(), &Poly[0].x, NO_FILL ); } - if( aSchText->Type() == TYPE_SCH_HIERLABEL ) + if( ( aSchText->Type() == TYPE_SCH_HIERLABEL ) + || ( aSchText->Type() == DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE) ) { ( (SCH_HIERLABEL*) aSchText )->CreateGraphicShape( Poly, aSchText->m_Pos ); @@ -307,6 +309,8 @@ static void PlotSheetStruct( PLOTTER* plotter, SCH_SHEET* Struct ) EDA_Colors txtcolor = UNSPECIFIED_COLOR; wxSize size; wxString Text; + int name_orientation; + wxPoint pos_sheetname, pos_filename; wxPoint pos; plotter->set_color( ReturnLayerColor( Struct->m_Layer ) ); @@ -326,18 +330,32 @@ static void PlotSheetStruct( PLOTTER* plotter, SCH_SHEET* Struct ) plotter->line_to( pos ); plotter->finish_to( Struct->m_Pos ); + if( Struct->IsVerticalOrientation() ) + { + pos_sheetname = wxPoint( Struct->m_Pos.x - 8, Struct->m_Pos.y + Struct->m_Size.y ); + pos_filename = wxPoint( Struct->m_Pos.x + Struct->m_Size.x + 4, + Struct->m_Pos.y + Struct->m_Size.y ); + name_orientation = TEXT_ORIENT_VERT; + } + else + { + pos_sheetname = wxPoint( Struct->m_Pos.x, Struct->m_Pos.y - 4 ); + pos_filename = wxPoint( Struct->m_Pos.x, Struct->m_Pos.y + Struct->m_Size.y + 4 ); + name_orientation = TEXT_ORIENT_HORIZ; + } /* Draw texts: SheetName */ Text = Struct->m_SheetName; size = wxSize( Struct->m_SheetNameSize, Struct->m_SheetNameSize ); - pos = Struct->m_Pos; pos.y -= 4; + + //pos = Struct->m_Pos; pos.y -= 4; thickness = g_DrawDefaultLineThickness; thickness = Clamp_Text_PenSize( thickness, size, false ); plotter->set_color( ReturnLayerColor( LAYER_SHEETNAME ) ); bool italic = false; - plotter->text( pos, txtcolor, - Text, TEXT_ORIENT_HORIZ, size, + plotter->text( pos_sheetname, txtcolor, + Text, name_orientation, size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_BOTTOM, thickness, italic, false ); @@ -349,17 +367,17 @@ static void PlotSheetStruct( PLOTTER* plotter, SCH_SHEET* Struct ) plotter->set_color( ReturnLayerColor( LAYER_SHEETFILENAME ) ); - plotter->text( wxPoint( Struct->m_Pos.x, Struct->m_Pos.y + Struct->m_Size.y + 4 ), - txtcolor, Text, TEXT_ORIENT_HORIZ, size, + plotter->text( pos_filename, txtcolor, + Text, name_orientation, size, GR_TEXT_HJUSTIFY_LEFT, GR_TEXT_VJUSTIFY_TOP, thickness, italic, false ); plotter->set_color( ReturnLayerColor( Struct->m_Layer ) ); /* Draw texts : SheetLabel */ - BOOST_FOREACH( SCH_SHEET_PIN& pin_sheet, Struct->GetSheetPins() ) - { - pin_sheet.Plot( plotter ); + BOOST_FOREACH( SCH_SHEET_PIN & pin_sheet, Struct->GetSheetPins() ) { + //pin_sheet.Plot( plotter ); + PlotTextStruct( plotter, &pin_sheet ); } } diff --git a/eeschema/read_from_file_schematic_items_descriptions.cpp b/eeschema/read_from_file_schematic_items_descriptions.cpp index cc3ce2f57f..659009ba6b 100644 --- a/eeschema/read_from_file_schematic_items_descriptions.cpp +++ b/eeschema/read_from_file_schematic_items_descriptions.cpp @@ -323,7 +323,7 @@ error line %d, aborted\n" ), if( size == 0 ) size = DEFAULT_SIZE_TEXT; SheetLabelStruct->m_Size.x = SheetLabelStruct->m_Size.y = size; - + SheetLabelStruct->m_Pos.x=x; //to readjust x of first label if vertical switch( Char1[0] ) { case 'I': @@ -347,9 +347,22 @@ error line %d, aborted\n" ), break; } - if( Char2[0] == 'R' ) - SheetLabelStruct->m_Edge = 1; - + switch( Char2[0] ) + { + case 'R' : /* pin on right side */ + SheetLabelStruct->SetEdge(1); + break; + case 'T' : /* pin on top side */ + SheetLabelStruct->SetEdge(2); + break; + case 'B' : /* pin on bottom side */ + SheetLabelStruct->SetEdge(3); + break; + case 'L' : /* pin on left side */ + default : + SheetLabelStruct->SetEdge(0); + break; + } SheetStruct->AddLabel( SheetLabelStruct ); } } diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 93ff8d5601..e6fa2f0317 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -124,7 +124,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) m_PanelDefaultCursor ) ); // Stop the current command (if any) but keep the current tool - DrawPanel->UnManageCursor( ); + DrawPanel->UnManageCursor(); /* Should not be executed, except bug. */ if( screen->m_BlockLocate.m_Command != BLOCK_IDLE ) @@ -137,11 +137,13 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_SCH_DELETE_CMP: case ID_POPUP_SCH_DELETE: + // Stop the current command (if any) but keep the current tool - DrawPanel->UnManageCursor( ); + DrawPanel->UnManageCursor(); break; default: + // Stop the current command and deselect the current tool DrawPanel->m_PanelCursor = DrawPanel->m_PanelDefaultCursor = wxCURSOR_ARROW; @@ -327,7 +329,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) SaveCopyInUndoList( oldWiresList, UR_WIRE_IMAGE ); TestDanglingEnds( screen->EEDrawList, &dc ); } - break; + break; case ID_POPUP_SCH_DELETE_CMP: if( screen->GetCurItem() == NULL ) @@ -339,19 +341,19 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) screen->SetCurItem( LocateSmallestComponent( screen ) ); case ID_POPUP_SCH_DELETE: - { - SCH_ITEM* item = screen->GetCurItem(); - if( item == NULL ) - break; + { + SCH_ITEM* item = screen->GetCurItem(); + if( item == NULL ) + break; - DeleteStruct( DrawPanel, &dc, item ); - screen->SetCurItem( NULL ); - g_ItemToRepeat = NULL; - TestDanglingEnds( screen->EEDrawList, &dc ); - SetSheetNumberAndCount(); - OnModify(); - } - break; + DeleteStruct( DrawPanel, &dc, item ); + screen->SetCurItem( NULL ); + g_ItemToRepeat = NULL; + TestDanglingEnds( screen->EEDrawList, &dc ); + SetSheetNumberAndCount(); + OnModify(); + } + break; case ID_SCHEMATIC_DELETE_ITEM_BUTT: SetToolID( id, wxCURSOR_BULLSEYE, _( "Delete item" ) ); @@ -374,19 +376,19 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_IMPORT_GLABEL: - if ( screen->GetCurItem() && screen->GetCurItem()->Type() == DRAW_SHEET_STRUCT_TYPE ) - GetScreen()->SetCurItem( Import_PinSheet( (SCH_SHEET*)screen->GetCurItem(), &dc ) ); + if( screen->GetCurItem() && screen->GetCurItem()->Type() == DRAW_SHEET_STRUCT_TYPE ) + GetScreen()->SetCurItem( Import_PinSheet( (SCH_SHEET*) screen->GetCurItem(), &dc ) ); break; case ID_POPUP_SCH_CLEANUP_SHEET: - if ( screen->GetCurItem() && screen->GetCurItem()->Type() == DRAW_SHEET_STRUCT_TYPE ) + if( screen->GetCurItem() && screen->GetCurItem()->Type() == DRAW_SHEET_STRUCT_TYPE ) { SCH_SHEET* sheet = (SCH_SHEET*) screen->GetCurItem(); if( !sheet->HasUndefinedLabels() ) { DisplayInfoMessage( this, - _( "There are no undefined labels in this sheet to clean up." ) ); + _( "There are no undefined labels in this sheet to clean up." ) ); return; } @@ -407,23 +409,25 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_SCH_MOVE_PINSHEET: DrawPanel->MouseToCursorSchema(); - StartMove_PinSheet( (SCH_SHEET_PIN*)screen->GetCurItem(), &dc ); + StartMove_PinSheet( (SCH_SHEET_PIN*) screen->GetCurItem(), &dc ); break; case ID_POPUP_SCH_DRAG_CMP_REQUEST: case ID_POPUP_SCH_MOVE_CMP_REQUEST: + // Ensure the struct is a component (could be a struct of a // component, like Field, text..) or a hierachical sheet // or a label if( (screen->GetCurItem()->Type() != TYPE_SCH_COMPONENT) - && (screen->GetCurItem()->Type() != TYPE_SCH_LABEL) - && (screen->GetCurItem()->Type() != TYPE_SCH_GLOBALLABEL) - && (screen->GetCurItem()->Type() != TYPE_SCH_HIERLABEL) - && (screen->GetCurItem()->Type() != DRAW_SHEET_STRUCT_TYPE) ) + && (screen->GetCurItem()->Type() != TYPE_SCH_LABEL) + && (screen->GetCurItem()->Type() != TYPE_SCH_GLOBALLABEL) + && (screen->GetCurItem()->Type() != TYPE_SCH_HIERLABEL) + && (screen->GetCurItem()->Type() != DRAW_SHEET_STRUCT_TYPE) ) screen->SetCurItem( LocateSmallestComponent( screen ) ); if( screen->GetCurItem() == NULL ) break; - // fall through + + // fall through case ID_POPUP_SCH_MOVE_ITEM_REQUEST: DrawPanel->MouseToCursorSchema(); if( id == ID_POPUP_SCH_DRAG_CMP_REQUEST ) @@ -435,8 +439,9 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) if( !HandleBlockBegin( &dc, BLOCK_DRAG, screen->m_Curseur ) ) break; + // Give a non null size to the search block: - screen->m_BlockLocate.Inflate(1); + screen->m_BlockLocate.Inflate( 1 ); HandleBlockEnd( &dc ); } } @@ -446,6 +451,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_SCH_DRAG_WIRE_REQUEST: DrawPanel->MouseToCursorSchema(); + // The easiest way to handle a drag component is to simulate a // block drag command if( screen->m_BlockLocate.m_State == STATE_NO_BLOCK ) @@ -453,6 +459,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) if( !HandleBlockBegin( &dc, BLOCK_DRAG, screen->m_Curseur ) ) break; + // Ensure the block selection contains the segment, or one end of // the segment. The initial rect is only one point (w = h = 0) // The rect must contains one or 2 ends. @@ -461,18 +468,18 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) // whole segment. This works fine only for H and V segments and // only if they do not cross a component // TODO: a better way to drag only wires - SCH_LINE* segm = (SCH_LINE*)screen->GetCurItem(); - if( !screen->m_BlockLocate.Inside(segm->m_Start) && - !screen->m_BlockLocate.Inside(segm->m_End) ) + SCH_LINE* segm = (SCH_LINE*) screen->GetCurItem(); + if( !screen->m_BlockLocate.Inside( segm->m_Start ) + && !screen->m_BlockLocate.Inside( segm->m_End ) ) { - screen->m_BlockLocate.SetOrigin(segm->m_Start); - screen->m_BlockLocate.SetEnd(segm->m_End); + screen->m_BlockLocate.SetOrigin( segm->m_Start ); + screen->m_BlockLocate.SetEnd( segm->m_End ); } HandleBlockEnd( &dc ); } break; - case ID_POPUP_SCH_EDIT_CMP: + case ID_POPUP_SCH_EDIT_CMP: // Ensure the struct is a component (could be a struct of a // component, like Field, text..) @@ -521,10 +528,10 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) DrawPanel->MouseToCursorSchema(); if( screen->GetCurItem()->m_Flags == 0 ) SaveCopyInUndoList( (SCH_ITEM*) screen->GetCurItem(), - UR_CHANGED ); + UR_CHANGED ); CmpRotationMiroir( (SCH_COMPONENT*) screen->GetCurItem(), - &dc, option ); + &dc, option ); break; } @@ -618,7 +625,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) break; DrawPanel->MouseToCursorSchema(); SelPartUnit( (SCH_COMPONENT*) screen->GetCurItem(), - id + 1 - ID_POPUP_SCH_SELECT_UNIT1, &dc ); + id + 1 - ID_POPUP_SCH_SELECT_UNIT1, &dc ); break; case ID_POPUP_SCH_DISPLAYDOC_CMP: @@ -637,7 +644,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) if( LibEntry && LibEntry->GetDocFileName() != wxEmptyString ) { GetAssociatedDocument( this, LibEntry->GetDocFileName(), - &wxGetApp().GetLibraryPathList() ); + &wxGetApp().GetLibraryPathList() ); } } break; @@ -650,7 +657,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) InstallNextScreen( (SCH_SHEET*) DrawStruct ); } } - break; + break; case ID_POPUP_SCH_LEAVE_SHEET: InstallPreviousSheet(); @@ -686,6 +693,10 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) break; case ID_POPUP_MIRROR_X_BLOCK: + DrawPanel->MouseToCursorSchema(); + HandleBlockEndByPopUp( BLOCK_MIRROR_X, &dc ); + break; + case ID_POPUP_MIRROR_Y_BLOCK: DrawPanel->MouseToCursorSchema(); HandleBlockEndByPopUp( BLOCK_MIRROR_Y, &dc ); @@ -717,7 +728,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) LAYER_LOCLABEL : LAYER_GLOBLABEL ) ); if( screen->GetCurItem() ) { - ((SCH_ITEM*)screen->GetCurItem())->Place( this, &dc ); + ( (SCH_ITEM*) screen->GetCurItem() )->Place( this, &dc ); TestDanglingEnds( screen->EEDrawList, &dc ); screen->SetCurItem( NULL ); } @@ -726,12 +737,12 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) case ID_POPUP_SCH_GETINFO_MARKER: if( screen->GetCurItem() && screen->GetCurItem()->Type() == TYPE_SCH_MARKER ) - ((SCH_MARKER*)screen->GetCurItem())->DisplayMarkerInfo( this ); + ( (SCH_MARKER*) screen->GetCurItem() )->DisplayMarkerInfo( this ); break; default: // Log error: DisplayError( this, - wxT( "WinEDA_SchematicFrame::Process_Special_Functions error" ) ); + wxT( "WinEDA_SchematicFrame::Process_Special_Functions error" ) ); break; } @@ -743,7 +754,7 @@ void WinEDA_SchematicFrame::Process_Special_Functions( wxCommandEvent& event ) } -void WinEDA_SchematicFrame::Process_Move_Item( SCH_ITEM* DrawStruct, wxDC* DC ) +void WinEDA_SchematicFrame::Process_Move_Item( SCH_ITEM* DrawStruct, wxDC* DC ) { if( DrawStruct == NULL ) return; diff --git a/eeschema/schematic_undo_redo.cpp b/eeschema/schematic_undo_redo.cpp index f2a8a6cbfc..e6de77cb1a 100644 --- a/eeschema/schematic_undo_redo.cpp +++ b/eeschema/schematic_undo_redo.cpp @@ -157,8 +157,7 @@ void SwapData( EDA_BaseStruct* aItem, EDA_BaseStruct* aImage ) #undef DEST #define SOURCE ( (SCH_SHEET_PIN*) aItem ) #define DEST ( (SCH_SHEET_PIN*) aImage ) - EXCHG( SOURCE->m_Edge, DEST->m_Edge ); - EXCHG( SOURCE->m_Shape, DEST->m_Shape ); + DEST->SwapData( SOURCE ); break; case DRAW_NOCONNECT_STRUCT_TYPE: @@ -174,13 +173,12 @@ void SwapData( EDA_BaseStruct* aItem, EDA_BaseStruct* aImage ) // not directly used in schematic: default: - wxMessageBox(wxT( "SwapData() error: unexpected type" ) ); + wxMessageBox( wxT( "SwapData() error: unexpected type" ) ); break; } } - /** function SaveCopyInUndoList * Create a copy of the current schematic item, and put it in the undo list. * @@ -225,7 +223,7 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItem, if( aItem ) { itemWrapper.m_PickedItemType = aItem->Type(); - itemWrapper.m_PickerFlags = aItem->m_Flags; + itemWrapper.m_PickerFlags = aItem->m_Flags; } switch( aCommandType ) @@ -233,7 +231,7 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItem, case UR_CHANGED: /* Create a copy of item */ CopyOfItem = DuplicateStruct( aItem, true ); itemWrapper.m_Link = CopyOfItem; - if ( CopyOfItem ) + if( CopyOfItem ) commandToUndo->PushItem( itemWrapper ); break; @@ -273,10 +271,12 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( SCH_ITEM* aItem, */ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, UndoRedoOpType aTypeCommand, - const wxPoint& aTransformPoint ) + const wxPoint& aTransformPoint ) { PICKED_ITEMS_LIST* commandToUndo = new PICKED_ITEMS_LIST(); + commandToUndo->m_TransformPoint = aTransformPoint; + // Copy picker list: commandToUndo->CopyList( aItemsList ); @@ -286,27 +286,30 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, SCH_ITEM* item = (SCH_ITEM*) commandToUndo->GetPickedItem( ii ); wxASSERT( item ); - UndoRedoOpType command = commandToUndo->GetPickedItemStatus( ii ); + UndoRedoOpType command = commandToUndo->GetPickedItemStatus( ii ); if( command == UR_UNSPECIFIED ) { command = aTypeCommand; - commandToUndo->SetPickedItemStatus(command, ii ); + commandToUndo->SetPickedItemStatus( command, ii ); } switch( command ) { case UR_CHANGED: /* Create a copy of item */ + /* If needed, create a copy of item, and put in undo list * in the picker, as link * If this link is not null, the copy is already done */ - if( commandToUndo->GetPickedItemLink(ii) == NULL ) + if( commandToUndo->GetPickedItemLink( ii ) == NULL ) commandToUndo->SetPickedItemLink( DuplicateStruct( item, true ), ii ); - wxASSERT( commandToUndo->GetPickedItemLink(ii) ); + wxASSERT( commandToUndo->GetPickedItemLink( ii ) ); break; case UR_MOVED: case UR_MIRRORED_Y: + case UR_MIRRORED_X: + case UR_ROTATED: case UR_NEW: case UR_DELETED: break; @@ -343,7 +346,7 @@ void WinEDA_SchematicFrame::SaveCopyInUndoList( PICKED_ITEMS_LIST& aItemsList, * @param aRedoCommand = a bool: true for redo, false for undo */ void WinEDA_SchematicFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, - bool aRedoCommand ) + bool aRedoCommand ) { SCH_ITEM* item; SCH_ITEM* alt_item; @@ -351,13 +354,13 @@ void WinEDA_SchematicFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, // Undo in the reverse order of list creation: (this can allow stacked // changes like the same item can be changes and deleted in the same // complex command - for( int ii = aList->GetCount()-1; ii >= 0 ; ii-- ) + for( int ii = aList->GetCount() - 1; ii >= 0; ii-- ) { ITEM_PICKER itemWrapper = aList->GetItemWrapper( ii ); item = (SCH_ITEM*) itemWrapper.m_PickedItem; - if ( item ) + if( item ) item->m_Flags = 0; - SCH_ITEM* image = (SCH_ITEM*) itemWrapper.m_Link; + SCH_ITEM* image = (SCH_ITEM*) itemWrapper.m_Link; switch( itemWrapper.m_UndoRedoStatus ) { case UR_CHANGED: /* Exchange old and new data for each item */ @@ -376,9 +379,9 @@ void WinEDA_SchematicFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, break; case UR_MOVED: - item->m_Flags = aList->GetPickerFlags(ii); + item->m_Flags = aList->GetPickerFlags( ii ); item->Move( aRedoCommand ? - aList->m_TransformPoint : - aList->m_TransformPoint ); + aList->m_TransformPoint : -aList->m_TransformPoint ); item->m_Flags = 0; break; @@ -387,7 +390,23 @@ void WinEDA_SchematicFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, wxPoint mirrorPoint = aList->m_TransformPoint; item->Mirror_Y( mirrorPoint.x ); } - break; + break; + + case UR_MIRRORED_X: + { + wxPoint mirrorPoint = aList->m_TransformPoint; + item->Mirror_X( mirrorPoint.y ); + } + break; + + case UR_ROTATED: + { + wxPoint RotationPoint = aList->m_TransformPoint; + item->Rotate( RotationPoint ); + item->Rotate( RotationPoint ); + item->Rotate( RotationPoint ); + } + break; case UR_WIRE_IMAGE: /* Exchange the current wires and the old wires */ @@ -423,7 +442,7 @@ void WinEDA_SchematicFrame::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, * - Get the previous version of the schematic from undo list * @return none */ -void WinEDA_SchematicFrame::GetSchematicFromUndoList(wxCommandEvent& event) +void WinEDA_SchematicFrame::GetSchematicFromUndoList( wxCommandEvent& event ) { if( GetScreen()->GetUndoCommandCount() <= 0 ) return; @@ -439,13 +458,13 @@ void WinEDA_SchematicFrame::GetSchematicFromUndoList(wxCommandEvent& event) GetScreen()->PushCommandToRedoList( List ); // m_drawItem = NULL; - OnModify( ); + OnModify(); SetSheetNumberAndCount(); ReCreateHToolbar(); SetToolbars(); TestDanglingEnds( GetScreen()->EEDrawList, NULL ); - DrawPanel->Refresh( ); + DrawPanel->Refresh(); } @@ -455,7 +474,7 @@ void WinEDA_SchematicFrame::GetSchematicFromUndoList(wxCommandEvent& event) * - Get the previous version from Redo list * @return none */ -void WinEDA_SchematicFrame::GetSchematicFromRedoList(wxCommandEvent& event) +void WinEDA_SchematicFrame::GetSchematicFromRedoList( wxCommandEvent& event ) { if( GetScreen()->GetRedoCommandCount() == 0 ) return; @@ -472,13 +491,13 @@ void WinEDA_SchematicFrame::GetSchematicFromRedoList(wxCommandEvent& event) GetScreen()->PushCommandToUndoList( List ); // m_drawItem = NULL; - OnModify( ); + OnModify(); SetSheetNumberAndCount(); ReCreateHToolbar(); SetToolbars(); TestDanglingEnds( GetScreen()->EEDrawList, NULL ); - DrawPanel->Refresh( ); + DrawPanel->Refresh(); } diff --git a/eeschema/sheetlab.cpp b/eeschema/sheetlab.cpp index c8cf52831c..458fa91d49 100644 --- a/eeschema/sheetlab.cpp +++ b/eeschema/sheetlab.cpp @@ -20,7 +20,7 @@ static void Move_PinSheet( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ); static int s_CurrentTypeLabel = NET_INPUT; static wxSize NetSheetTextSize( DEFAULT_SIZE_TEXT, DEFAULT_SIZE_TEXT ); static wxPoint s_InitialPosition; // remember the initial value of the pin label when moving it - +static int s_InitialEdge; /****************************************/ /* class WinEDA_PinSheetPropertiesFrame */ @@ -38,8 +38,8 @@ private: WinEDA_GraphicTextCtrl* m_TextWin; public: WinEDA_PinSheetPropertiesFrame( WinEDA_SchematicFrame* parent, - SCH_SHEET_PIN* curr_pinsheet, - const wxPoint& framepos = wxPoint( -1, -1 ) ); + SCH_SHEET_PIN* curr_pinsheet, + const wxPoint& framepos = wxPoint( -1, -1 ) ); ~WinEDA_PinSheetPropertiesFrame() { }; private: @@ -50,8 +50,8 @@ private: }; BEGIN_EVENT_TABLE( WinEDA_PinSheetPropertiesFrame, wxDialog ) - EVT_BUTTON( wxID_OK, WinEDA_PinSheetPropertiesFrame::OnOkClick ) - EVT_BUTTON( wxID_CANCEL, WinEDA_PinSheetPropertiesFrame::OnCancelClick ) +EVT_BUTTON( wxID_OK, WinEDA_PinSheetPropertiesFrame::OnOkClick ) +EVT_BUTTON( wxID_CANCEL, WinEDA_PinSheetPropertiesFrame::OnCancelClick ) END_EVENT_TABLE() @@ -126,6 +126,7 @@ void WinEDA_PinSheetPropertiesFrame::OnOkClick( wxCommandEvent& event ) EndModal( wxID_OK ); } + /* Called when aborting a move pinsheet label * delete a new pin sheet label, or restire its old position */ @@ -145,13 +146,9 @@ static void ExitPinSheet( WinEDA_DrawPanel* Panel, wxDC* DC ) { RedrawOneStruct( Panel, DC, SheetLabel, g_XorMode ); SheetLabel->m_Pos = s_InitialPosition; - // Restore edge position: - SCH_SHEET* sheet = (SCH_SHEET*) SheetLabel->GetParent(); - if( s_InitialPosition.x > ( sheet->m_Pos.x + (sheet->m_Size.x / 2) ) ) - SheetLabel->m_Edge = 1; - else - SheetLabel->m_Edge = 0; + // Restore edge position: + SheetLabel->SetEdge( s_InitialEdge ); RedrawOneStruct( Panel, DC, SheetLabel, GR_DEFAULT_DRAWMODE ); SheetLabel->m_Flags = 0; } @@ -165,6 +162,7 @@ static void ExitPinSheet( WinEDA_DrawPanel* Panel, wxDC* DC ) void SCH_SHEET_PIN::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) { SCH_SHEET* Sheet = (SCH_SHEET*) GetParent(); + wxASSERT( Sheet != NULL && Sheet->Type() == DRAW_SHEET_STRUCT_TYPE ); SAFE_DELETE( g_ItemToUndoCopy ); @@ -180,27 +178,12 @@ void SCH_SHEET_PIN::Place( WinEDA_SchematicFrame* frame, wxDC* DC ) { wxPoint tmp = m_Pos; m_Pos = s_InitialPosition; - m_Edge = 0; - if( m_Pos.x > ( Sheet->m_Pos.x + (Sheet->m_Size.x / 2) ) ) - m_Edge = 1; + SetEdge( s_InitialEdge ); frame->SaveCopyInUndoList( Sheet, UR_CHANGED ); m_Pos = tmp; } - m_Pos.x = Sheet->m_Pos.x; - m_Edge = 0; - - if( frame->GetScreen()->m_Curseur.x > ( Sheet->m_Pos.x + ( Sheet->m_Size.x / 2 ) ) ) - { - m_Edge = 1; - m_Pos.x = Sheet->m_Pos.x + Sheet->m_Size.x; - } - - m_Pos.y = frame->GetScreen()->m_Curseur.y; - if( m_Pos.y < Sheet->m_Pos.y ) - m_Pos.y = Sheet->m_Pos.y; - if( m_Pos.y > (Sheet->m_Pos.y + Sheet->m_Size.y) ) - m_Pos.y = Sheet->m_Pos.y + Sheet->m_Size.y; + ConstraintOnEdge( frame->GetScreen()->m_Curseur ); RedrawOneStruct( frame->DrawPanel, DC, Sheet, GR_DEFAULT_DRAWMODE ); frame->DrawPanel->ManageCurseur = NULL; @@ -214,7 +197,8 @@ void WinEDA_SchematicFrame::StartMove_PinSheet( SCH_SHEET_PIN* SheetLabel, NetSheetTextSize = SheetLabel->m_Size; s_CurrentTypeLabel = SheetLabel->m_Shape; SheetLabel->m_Flags |= IS_MOVED; - s_InitialPosition = SheetLabel->m_Pos; + s_InitialPosition = SheetLabel->m_Pos; + s_InitialEdge = SheetLabel->GetEdge(); DrawPanel->ManageCurseur = Move_PinSheet; DrawPanel->ForceCloseManageCurseur = ExitPinSheet; @@ -229,27 +213,10 @@ static void Move_PinSheet( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) if( SheetLabel == NULL ) return; - SCH_SHEET* Sheet = (SCH_SHEET*) SheetLabel->GetParent(); - - if( Sheet == NULL ) - return; if( erase ) RedrawOneStruct( panel, DC, SheetLabel, g_XorMode ); - SheetLabel->m_Edge = 0; - SheetLabel->m_Pos.x = Sheet->m_Pos.x; - - if( panel->GetScreen()->m_Curseur.x > ( Sheet->m_Pos.x + (Sheet->m_Size.x / 2) ) ) - { - SheetLabel->m_Edge = 1; - SheetLabel->m_Pos.x = Sheet->m_Pos.x + Sheet->m_Size.x; - } - - SheetLabel->m_Pos.y = panel->GetScreen()->m_Curseur.y; - if( SheetLabel->m_Pos.y < Sheet->m_Pos.y ) - SheetLabel->m_Pos.y = Sheet->m_Pos.y; - if( SheetLabel->m_Pos.y > (Sheet->m_Pos.y + Sheet->m_Size.y) ) - SheetLabel->m_Pos.y = Sheet->m_Pos.y + Sheet->m_Size.y; + SheetLabel->ConstraintOnEdge( panel->GetScreen()->m_Curseur ); RedrawOneStruct( panel, DC, SheetLabel, g_XorMode ); } @@ -269,7 +236,7 @@ int WinEDA_SchematicFrame::Edit_PinSheet( SCH_SHEET_PIN* SheetLabel, wxDC* DC ) int diag = frame->ShowModal(); frame->Destroy(); - if ( DC ) + if( DC ) RedrawOneStruct( DrawPanel, DC, SheetLabel, GR_DEFAULT_DRAWMODE ); return diag; @@ -302,7 +269,7 @@ SCH_SHEET_PIN* WinEDA_SchematicFrame::Create_PinSheet( SCH_SHEET* Sheet, wxDC* D DrawPanel->ForceCloseManageCurseur = ExitPinSheet; DrawPanel->ManageCurseur( DrawPanel, DC, TRUE ); - OnModify( ); + OnModify(); return NewSheetLabel; } @@ -342,7 +309,7 @@ SCH_SHEET_PIN* WinEDA_SchematicFrame::Import_PinSheet( SCH_SHEET* Sheet, wxDC* D return NULL; } - OnModify( ); + OnModify(); SAFE_DELETE( g_ItemToUndoCopy ); SaveCopyInUndoList( Sheet, UR_CHANGED ); diff --git a/include/sch_item_struct.h b/include/sch_item_struct.h index 3ff39a5c37..dcf5429972 100644 --- a/include/sch_item_struct.h +++ b/include/sch_item_struct.h @@ -79,6 +79,9 @@ public: * @param aYaxis_position = the y axis position */ virtual void Mirror_Y(int aYaxis_position) = 0; + virtual void Mirror_X(int aXaxis_position) = 0; + virtual void Rotate(wxPoint rotationPoint) = 0; + /** * Function Save diff --git a/kicad/commandframe.cpp b/kicad/commandframe.cpp index 56d49b415f..15b4031b58 100644 --- a/kicad/commandframe.cpp +++ b/kicad/commandframe.cpp @@ -97,7 +97,7 @@ wxBitmapButton* RIGHT_KM_FRAME::AddBitmapButton( wxWindowID aId, const wxBitmap { wxPoint buttPos = m_ButtonLastPosition; wxSize buttSize; - int btn_margin = 8; + int btn_margin = 10; buttSize.x = aBitmap.GetWidth() + btn_margin; buttSize.y = aBitmap.GetHeight() + btn_margin; buttPos.y -= buttSize.y;