From f3c324d5350514456dfe47f83a862acf93828516 Mon Sep 17 00:00:00 2001 From: dickelbeck Date: Fri, 24 Aug 2007 15:10:46 +0000 Subject: [PATCH] EDA_BaseStruct::m_StructType is now type KICAD_T --- 3d-viewer/3d_class.cpp | 8 +- change_log.txt | 15 +- common/base_struct.cpp | 20 +- eeschema/affiche.cpp | 229 +-- eeschema/block.cpp | 3 + eeschema/block_libedit.cpp | 6 + eeschema/cmpclass.cpp | 2 +- eeschema/component_class.cpp | 2 +- eeschema/component_class.h | 2 +- eeschema/dangling_ends.cpp | 711 ++++----- eeschema/eelibs_draw_components.cpp | 1698 ++++++++++++---------- eeschema/eelibs_read_libraryfiles.cpp | 1925 +++++++++++++------------ eeschema/hotkeys.cpp | 2 + eeschema/libclass.cpp | 1037 +++++++------ eeschema/libcmp.h | 498 +++---- eeschema/libframe.cpp | 1 + eeschema/locate.cpp | 3 + eeschema/plot.cpp | 3 + eeschema/program.h | 239 +-- eeschema/symbdraw.cpp | 1281 ++++++++-------- eeschema/symbedit.cpp | 772 +++++----- include/base_struct.h | 33 +- include/pcbstruct.h | 2 +- include/wxstruct.h | 2 +- pcbnew/block_module_editor.cpp | 9 + pcbnew/class_edge_mod.cpp | 1 + pcbnew/class_track.cpp | 3 +- pcbnew/class_track.h | 2 +- pcbnew/classpcb.cpp | 4 +- pcbnew/classtrc.cpp | 2 +- pcbnew/dialog_track_options.cpp | 2 +- pcbnew/ratsnest.cpp | 3 + 32 files changed, 4536 insertions(+), 3984 deletions(-) diff --git a/3d-viewer/3d_class.cpp b/3d-viewer/3d_class.cpp index 61c53e49f2..99e9c0921e 100644 --- a/3d-viewer/3d_class.cpp +++ b/3d-viewer/3d_class.cpp @@ -25,8 +25,8 @@ S3D_Vertex::S3D_Vertex(void) /**************************************************************************/ -S3D_Material::S3D_Material(Struct3D_Master * father, const wxString & name): - EDA_BaseStruct( father, -1) +S3D_Material::S3D_Material( Struct3D_Master * father, const wxString & name ): + EDA_BaseStruct( father, NOT_USED ) /**************************************************************************/ { m_DiffuseColor.x = m_DiffuseColor.y = m_DiffuseColor.z = 1.0; @@ -67,7 +67,7 @@ void Struct3D_Master::Copy(Struct3D_Master * pattern) /***************************************************************/ Struct3D_Master::Struct3D_Master(EDA_BaseStruct * StructFather): - EDA_BaseStruct( StructFather, -1) + EDA_BaseStruct( StructFather, NOT_USED ) /***************************************************************/ { m_MatScale.x = m_MatScale.y = m_MatScale.z = 1.0; @@ -100,7 +100,7 @@ S3D_Material * nextmat; /***************************************************************/ Struct3D_Shape::Struct3D_Shape(EDA_BaseStruct * StructFather): - EDA_BaseStruct( StructFather, -1) + EDA_BaseStruct( StructFather, NOT_USED ) /***************************************************************/ { m_3D_Coord = NULL; diff --git a/change_log.txt b/change_log.txt index d73d4ecc29..bde59d05d6 100644 --- a/change_log.txt +++ b/change_log.txt @@ -5,6 +5,18 @@ Please add newer entries at the top, list the date and your name with email address. +2007-Aug-23 UPDATE Dick Hollenbeck +================================================================================ ++ eeschema & pcbnew + * Removed class EDA_BaseLineStruct, which brought no behavioral advantage, only data. + Classes which were based on got its data members added and their initializers. + * Changed type of EDA_BaseStruct::m_StructType from int to KICAD_T which is an + enum. This makes debugging easier since gdb will show the name of the + KICAD_T rather than simply a number. Added NOT_USED = -1 to KICAD_T enum for + 3d which was using -1. + * More beautification using latest uncrustify and the committed uncrustify.cfg + + 2007-Aug-24 UPDATE Geoff Harland ================================================================================ + pcbnew @@ -27,9 +39,6 @@ email address. tomorrow I will add a new class COLLECTORS_GUIDE which can be used by a COLLECTOR to control its operation. It adds the concept of layer locking, even though PCBNEW does not support that in the UI yet. - @todo: - add constructor initializers for classes that were derived from - EDA_BaseLineStruct but are now not. Its late, will do tomorrow. 2007-Aug-22 UPDATE Dick Hollenbeck diff --git a/common/base_struct.cpp b/common/base_struct.cpp index b124110dfe..2a9f8d3ac3 100644 --- a/common/base_struct.cpp +++ b/common/base_struct.cpp @@ -17,8 +17,8 @@ #include "macros.h" -// DrawStructureType names for error messages only: -static wxString DrawStructureTypeName[MAX_STRUCT_TYPE_ID + 1] = { +// KICAD_T names for error messages only: +static wxString KICAD_TName[MAX_STRUCT_TYPE_ID + 1] = { wxT( "Not init" ), wxT( "Pcb" ), @@ -74,7 +74,7 @@ enum textbox { /******************************************************************************/ -EDA_BaseStruct::EDA_BaseStruct( EDA_BaseStruct* parent, int idType ) +EDA_BaseStruct::EDA_BaseStruct( EDA_BaseStruct* parent, KICAD_T idType ) /******************************************************************************/ { InitVars(); @@ -84,7 +84,7 @@ EDA_BaseStruct::EDA_BaseStruct( EDA_BaseStruct* parent, int idType ) /********************************************/ -EDA_BaseStruct::EDA_BaseStruct( int idType ) +EDA_BaseStruct::EDA_BaseStruct( KICAD_T idType ) /********************************************/ { InitVars(); @@ -183,7 +183,7 @@ wxString EDA_BaseStruct::ReturnClassName() const if( (ii < 0) || (ii > MAX_STRUCT_TYPE_ID) ) ii = MAX_STRUCT_TYPE_ID; - classname = DrawStructureTypeName[ii]; + classname = KICAD_TName[ii]; return classname; } @@ -287,16 +287,6 @@ std::ostream& EDA_BaseStruct::NestedSpace( int nestLevel, std::ostream& os ) -/**********************************************************************************************/ -EDA_BaseLineStruct::EDA_BaseLineStruct( EDA_BaseStruct* StructFather, DrawStructureType idtype ) : - EDA_BaseStruct( StructFather, idtype ) -/**********************************************************************************************/ -{ - m_Layer = 0; - m_Width = 0; // 0 = line, > 0 = tracks, bus ... -}; - - /*********************************************************/ /* EDA_TextStruct (classe de base, non utilis� seule */ /*********************************************************/ diff --git a/eeschema/affiche.cpp b/eeschema/affiche.cpp index 92e6024c60..15344f83e8 100644 --- a/eeschema/affiche.cpp +++ b/eeschema/affiche.cpp @@ -1,8 +1,8 @@ - /**********************************************************/ - /* Routines d'affichage de parametres et caracteristiques */ - /**********************************************************/ +/**********************************************************/ +/* Routines d'affichage de parametres et caracteristiques */ +/**********************************************************/ - /* Fichier AFFICHE.CPP */ +/* Fichier AFFICHE.CPP */ #include "fctsys.h" #include "gr_basic.h" @@ -15,136 +15,175 @@ /***********************************************************/ -void DrawSheetStruct::Display_Infos(WinEDA_DrawFrame * frame) +void DrawSheetStruct::Display_Infos( WinEDA_DrawFrame* frame ) /************************************************************/ { - frame->MsgPanel->EraseMsgBox(); - Affiche_1_Parametre(frame, 1, _("Name"), m_SheetName, CYAN); - Affiche_1_Parametre(frame, 30, _("FileName"), m_FileName, BROWN); + frame->MsgPanel->EraseMsgBox(); + Affiche_1_Parametre( frame, 1, _( "Name" ), m_SheetName, CYAN ); + Affiche_1_Parametre( frame, 30, _( "FileName" ), m_FileName, BROWN ); } + /***************************************************************/ -void EDA_SchComponentStruct::Display_Infos(WinEDA_DrawFrame * frame) +void EDA_SchComponentStruct::Display_Infos( WinEDA_DrawFrame* frame ) /***************************************************************/ { -EDA_LibComponentStruct * Entry = FindLibPart(m_ChipName.GetData(),wxEmptyString,FIND_ROOT);; -wxString msg; - - frame->MsgPanel->EraseMsgBox(); + EDA_LibComponentStruct* Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT );; - Affiche_1_Parametre(frame, 1, _("Ref"), - m_Field[REFERENCE].m_Text, DARKCYAN); + wxString msg; - if (Entry && Entry->m_Options == ENTRY_POWER) - msg = _("Pwr Symb"); - else msg = _("Val"); - Affiche_1_Parametre(frame, 10, msg, m_Field[VALUE].m_Text, DARKCYAN); + frame->MsgPanel->EraseMsgBox(); - Affiche_1_Parametre(frame, 28, _("RefLib"), m_ChipName.GetData(), BROWN); + Affiche_1_Parametre( frame, 1, _( "Ref" ), + m_Field[REFERENCE].m_Text, DARKCYAN ); - msg = FindLibName; - Affiche_1_Parametre(frame, 40, _("Lib"), msg, DARKRED); + if( Entry && Entry->m_Options == ENTRY_POWER ) + msg = _( "Pwr Symb" ); + else + msg = _( "Val" ); + Affiche_1_Parametre( frame, 10, msg, m_Field[VALUE].m_Text, DARKCYAN ); - if( Entry ) - { - Affiche_1_Parametre(frame, 52, Entry->m_Doc, wxEmptyString, DARKCYAN); - Affiche_1_Parametre(frame, 52, wxEmptyString, Entry->m_KeyWord, DARKGREEN); - } + Affiche_1_Parametre( frame, 28, _( "RefLib" ), m_ChipName.GetData(), BROWN ); + + msg = FindLibName; + Affiche_1_Parametre( frame, 40, _( "Lib" ), msg, DARKRED ); + + if( Entry ) + { + Affiche_1_Parametre( frame, 52, Entry->m_Doc, wxEmptyString, DARKCYAN ); + Affiche_1_Parametre( frame, 52, wxEmptyString, Entry->m_KeyWord, DARKGREEN ); + } } +/*******************************************************/ +void LibDrawPin::Display_Infos( WinEDA_DrawFrame* frame ) +/*******************************************************/ -/*******************************************************/ -void LibDrawPin::Display_Infos(WinEDA_DrawFrame * frame) -/*******************************************************/ /* Affiche en bas d'ecran les caracteristiques de la pin -*/ + */ { -wxString Text; -int ii; + wxString Text; + int ii; - frame->MsgPanel->EraseMsgBox(); + frame->MsgPanel->EraseMsgBox(); - /* Affichage du nom */ - Affiche_1_Parametre(frame, 24, _("PinName"), m_PinName, DARKCYAN); + /* Affichage du nom */ + Affiche_1_Parametre( frame, 24, _( "PinName" ), m_PinName, DARKCYAN ); - /* Affichage du numero */ - if(m_PinNum == 0) Text = wxT("?" ); - else ReturnPinStringNum(Text); + /* Affichage du numero */ + if( m_PinNum == 0 ) + Text = wxT( "?" ); + else + ReturnPinStringNum( Text ); - Affiche_1_Parametre(frame, 40, _("PinNum"), Text, DARKCYAN); + Affiche_1_Parametre( frame, 40, _( "PinNum" ), Text, DARKCYAN ); - /* Affichage du type */ - ii = m_PinType; - Affiche_1_Parametre(frame, 48, _("PinType"), MsgPinElectricType[ii], RED); + /* Affichage du type */ + ii = m_PinType; + Affiche_1_Parametre( frame, 48, _( "PinType" ), MsgPinElectricType[ii], RED ); - /* Affichage de la visiblite */ - ii = m_Attributs; - if( ii & 1 ) Text = _("no"); - else Text = _("yes"); - Affiche_1_Parametre(frame, 58, _("Display"), Text, DARKGREEN); + /* Affichage de la visiblite */ + ii = m_Attributs; + if( ii & 1 ) + Text = _( "no" ); + else + Text = _( "yes" ); + Affiche_1_Parametre( frame, 58, _( "Display" ), Text, DARKGREEN ); - /* Affichage de la longueur */ - Text.Printf( wxT("%d"), m_PinLen); - Affiche_1_Parametre(frame, 66, _("Lengh"), Text, MAGENTA); + /* Affichage de la longueur */ + Text.Printf( wxT( "%d" ), m_PinLen ); + Affiche_1_Parametre( frame, 66, _( "Lengh" ), Text, MAGENTA ); - /* Affichage de l'orientation */ - switch(m_Orient) - { - case PIN_UP: Text = _("Up"); break; - case PIN_DOWN: Text = _("Down"); break; - case PIN_LEFT: Text = _("Left"); break; - case PIN_RIGHT: Text = _("Right"); break; - default: Text = wxT("??"); break; - } + /* Affichage de l'orientation */ + switch( m_Orient ) + { + case PIN_UP: + Text = _( "Up" ); break; - Affiche_1_Parametre(frame, 72, _("Orient"), Text, MAGENTA); + case PIN_DOWN: + Text = _( "Down" ); break; + + case PIN_LEFT: + Text = _( "Left" ); break; + + case PIN_RIGHT: + Text = _( "Right" ); break; + + default: + Text = wxT( "??" ); break; + } + + Affiche_1_Parametre( frame, 72, _( "Orient" ), Text, MAGENTA ); } /***********************************************************************/ -void LibEDA_BaseStruct::Display_Infos_DrawEntry(WinEDA_DrawFrame * frame) +void LibEDA_BaseStruct::Display_Infos_DrawEntry( WinEDA_DrawFrame* frame ) /***********************************************************************/ + /* Affiche en bas d'ecran les caracteristiques de l'element -*/ + */ { -wxString msg; + wxString msg; - frame->MsgPanel->EraseMsgBox(); + frame->MsgPanel->EraseMsgBox(); - /* affichage du type */ - msg = wxT("??"); - switch( m_StructType ) - { - case COMPONENT_ARC_DRAW_TYPE: msg = wxT("Arc"); break; - case COMPONENT_CIRCLE_DRAW_TYPE: msg = wxT("Circle"); break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: msg = wxT("Text"); break; - case COMPONENT_RECT_DRAW_TYPE: msg = wxT("Rect"); break; - case COMPONENT_POLYLINE_DRAW_TYPE: msg = wxT("PolyLine"); break; - case COMPONENT_LINE_DRAW_TYPE: msg = wxT("Segment"); break; - case COMPONENT_PIN_DRAW_TYPE: - ((LibDrawPin*) this)->Display_Infos(frame); - msg = wxT("Pin"); - break; - } + /* affichage du type */ + msg = wxT( "??" ); - Affiche_1_Parametre(frame, 1, wxT("Type"), msg, CYAN); + switch( m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + msg = wxT( "Arc" ); break; + + case COMPONENT_CIRCLE_DRAW_TYPE: + msg = wxT( "Circle" ); break; + + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + msg = wxT( "Text" ); break; + + case COMPONENT_RECT_DRAW_TYPE: + msg = wxT( "Rect" ); break; + + case COMPONENT_POLYLINE_DRAW_TYPE: + msg = wxT( "PolyLine" ); break; + + case COMPONENT_LINE_DRAW_TYPE: + msg = wxT( "Segment" ); break; + + case COMPONENT_PIN_DRAW_TYPE: + ( (LibDrawPin*) this )->Display_Infos( frame ); + msg = wxT( "Pin" ); + break; + + default: + ; + } + + Affiche_1_Parametre( frame, 1, wxT( "Type" ), msg, CYAN ); - /* Affichage de l'appartenance */ - if( m_Unit == 0 ) msg = _("All"); - else msg.Printf( wxT("%d"), m_Unit ); - Affiche_1_Parametre(frame, 10, _("Unit"), msg, BROWN); + /* Affichage de l'appartenance */ + if( m_Unit == 0 ) + msg = _( "All" ); + else + msg.Printf( wxT( "%d" ), m_Unit ); + Affiche_1_Parametre( frame, 10, _( "Unit" ), msg, BROWN ); - if( m_Convert == 0 ) msg = _("All" ); - else if( m_Convert == 1 ) msg = _("no"); - else if( m_Convert == 2 ) msg = _("yes"); - else msg = wxT("?"); - Affiche_1_Parametre(frame, 16, _("Convert"), msg, BROWN); + if( m_Convert == 0 ) + msg = _( "All" ); + else if( m_Convert == 1 ) + msg = _( "no" ); + else if( m_Convert == 2 ) + msg = _( "yes" ); + else + msg = wxT( "?" ); + Affiche_1_Parametre( frame, 16, _( "Convert" ), msg, BROWN ); - if ( m_Width ) valeur_param(m_Width, msg); - else msg = _("default"); - Affiche_1_Parametre(frame, 24, _("Width"), msg, BLUE); + if( m_Width ) + valeur_param( m_Width, msg ); + else + msg = _( "default" ); + Affiche_1_Parametre( frame, 24, _( "Width" ), msg, BLUE ); } - - diff --git a/eeschema/block.cpp b/eeschema/block.cpp index 5c3ff75905..c130d45b5e 100644 --- a/eeschema/block.cpp +++ b/eeschema/block.cpp @@ -841,6 +841,9 @@ static EDA_BaseStruct* CopyStruct( WinEDA_DrawPanel* panel, wxDC* DC, BASE_SCREE sheet->m_FileName = sheet->m_SheetName + wxT( ".sch" ); break; } + + default: + ; } SetStructFather( Struct, screen ); diff --git a/eeschema/block_libedit.cpp b/eeschema/block_libedit.cpp index 9da5575cc2..a1a19c4f58 100644 --- a/eeschema/block_libedit.cpp +++ b/eeschema/block_libedit.cpp @@ -594,6 +594,9 @@ void MoveMarkedItems( EDA_LibComponentStruct* LibEntry, wxPoint offset ) ( (LibDrawText*) item )->m_Pos.x += offset.x; ( (LibDrawText*) item )->m_Pos.y += offset.y; break; + + default: + ; } item->m_Flags = item->m_Selected = 0; @@ -701,6 +704,9 @@ void MirrorMarkedItems( EDA_LibComponentStruct* LibEntry, wxPoint offset ) case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: SETMIRROR( ( (LibDrawText*) item )->m_Pos.x ); break; + + default: + ; } item->m_Flags = item->m_Selected = 0; diff --git a/eeschema/cmpclass.cpp b/eeschema/cmpclass.cpp index 8b06880594..2c06ec54a6 100644 --- a/eeschema/cmpclass.cpp +++ b/eeschema/cmpclass.cpp @@ -148,7 +148,7 @@ wxString DrawMarkerStruct::GetComment( void ) /***************************/ EDA_DrawLineStruct::EDA_DrawLineStruct( const wxPoint& pos, int layer ) : - EDA_BaseLineStruct( NULL, DRAW_SEGMENT_STRUCT_TYPE ) + EDA_BaseStruct( NULL, DRAW_SEGMENT_STRUCT_TYPE ) { m_Start = pos; m_End = pos; diff --git a/eeschema/component_class.cpp b/eeschema/component_class.cpp index f70d08482d..430301f3e2 100644 --- a/eeschema/component_class.cpp +++ b/eeschema/component_class.cpp @@ -23,7 +23,7 @@ /***************************/ /***********************************************************************************/ -DrawPartStruct::DrawPartStruct( DrawStructureType struct_type, const wxPoint & pos): +DrawPartStruct::DrawPartStruct( KICAD_T struct_type, const wxPoint & pos): EDA_BaseStruct(struct_type) /***********************************************************************************/ { diff --git a/eeschema/component_class.h b/eeschema/component_class.h index 9939d0244b..4e4ebcc6aa 100644 --- a/eeschema/component_class.h +++ b/eeschema/component_class.h @@ -70,7 +70,7 @@ public: wxPoint m_Pos; /* Exact position of part. */ public: - DrawPartStruct( DrawStructureType struct_type, const wxPoint & pos); + DrawPartStruct( KICAD_T struct_type, const wxPoint & pos); ~DrawPartStruct(void); }; diff --git a/eeschema/dangling_ends.cpp b/eeschema/dangling_ends.cpp index 13816a92dc..cf9bfd907a 100644 --- a/eeschema/dangling_ends.cpp +++ b/eeschema/dangling_ends.cpp @@ -1,6 +1,6 @@ - /*********************/ - /* dangling_ends.cpp */ - /*********************/ +/*********************/ +/* dangling_ends.cpp */ +/*********************/ #include "fctsys.h" #include "gr_basic.h" @@ -9,401 +9,452 @@ #include "libcmp.h" #include "general.h" -#include "netlist.h" /* Definitions generales liees au calcul de netliste */ +#include "netlist.h" /* Definitions generales liees au calcul de netliste */ #include "protos.h" -enum End_Type -{ - UNKNOWN = 0, - WIRE_START_END, - WIRE_END_END, - BUS_START_END, - BUS_END_END, - JUNCTION_END, - PIN_END, - LABEL_END, - ENTRY_END, - SHEET_LABEL_END +enum End_Type { + UNKNOWN = 0, + WIRE_START_END, + WIRE_END_END, + BUS_START_END, + BUS_END_END, + JUNCTION_END, + PIN_END, + LABEL_END, + ENTRY_END, + SHEET_LABEL_END }; class DanglingEndHandle { public: - const void * m_Item; - wxPoint m_Pos; - int m_Type; - DanglingEndHandle * m_Pnext; - - DanglingEndHandle(int type) - { - m_Item = NULL; - m_Type = type; - m_Pnext = NULL; - } + const void* m_Item; + wxPoint m_Pos; + int m_Type; + DanglingEndHandle* m_Pnext; + + DanglingEndHandle( int type ) { + m_Item = NULL; + m_Type = type; + m_Pnext = NULL; + } }; -DanglingEndHandle * ItemList; +DanglingEndHandle* ItemList; -static void TestWireForDangling(EDA_DrawLineStruct * DrawRef, - WinEDA_SchematicFrame * frame, wxDC * DC); -void TestLabelForDangling(DrawTextStruct * label, - WinEDA_SchematicFrame * frame, wxDC * DC); -DanglingEndHandle * RebuildEndList(EDA_BaseStruct *DrawList); +static void TestWireForDangling( EDA_DrawLineStruct* DrawRef, + WinEDA_SchematicFrame* frame, wxDC* DC ); +void TestLabelForDangling( DrawTextStruct* label, + WinEDA_SchematicFrame* frame, wxDC* DC ); +DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList ); /**********************************************************/ -bool SegmentIntersect(int Sx1, int Sy1, int Sx2, int Sy2, - int Px1, int Py1) +bool SegmentIntersect( int Sx1, int Sy1, int Sx2, int Sy2, + int Px1, int Py1 ) /**********************************************************/ + /* Retourne TRUE si le point P est sur le segment S. - Le segment est suppose horizontal ou vertical. -*/ + * Le segment est suppose horizontal ou vertical. + */ { -int Sxmin, Sxmax, Symin, Symax; + int Sxmin, Sxmax, Symin, Symax; - if (Sx1 == Sx2) /* Line S is vertical. */ - { - Symin = MIN(Sy1, Sy2); Symax = MAX(Sy1, Sy2); - if (Px1 != Sx1) return FALSE; - if (Py1 >= Symin && Py1 <= Symax) return TRUE; - else return FALSE; - } - - else if (Sy1 == Sy2) /* Line S is horizontal. */ - { - Sxmin = MIN(Sx1, Sx2); Sxmax = MAX(Sx1, Sx2); - if (Py1 != Sy1) return FALSE; - if (Px1 >= Sxmin && Px1 <= Sxmax) return TRUE; - else return FALSE; - } - else return FALSE; // Segments quelconques + if( Sx1 == Sx2 ) /* Line S is vertical. */ + { + Symin = MIN( Sy1, Sy2 ); Symax = MAX( Sy1, Sy2 ); + if( Px1 != Sx1 ) + return FALSE; + if( Py1 >= Symin && Py1 <= Symax ) + return TRUE; + else + return FALSE; + } + else if( Sy1 == Sy2 ) /* Line S is horizontal. */ + { + Sxmin = MIN( Sx1, Sx2 ); Sxmax = MAX( Sx1, Sx2 ); + if( Py1 != Sy1 ) + return FALSE; + if( Px1 >= Sxmin && Px1 <= Sxmax ) + return TRUE; + else + return FALSE; + } + else + return FALSE; // Segments quelconques } +/******************************************************************************/ +void WinEDA_SchematicFrame::TestDanglingEnds( EDA_BaseStruct* DrawList, wxDC* DC ) +/******************************************************************************/ -/******************************************************************************/ -void WinEDA_SchematicFrame::TestDanglingEnds(EDA_BaseStruct *DrawList, wxDC *DC) -/******************************************************************************/ /* Met a jour les membres m_Dangling des wires, bus, labels -*/ + */ { -EDA_BaseStruct * DrawItem; -const DanglingEndHandle * DanglingItem, * nextitem; - - if ( ItemList ) - for ( DanglingItem = ItemList; DanglingItem != NULL; DanglingItem = nextitem) - { - nextitem = DanglingItem->m_Pnext; - delete DanglingItem; - } - - ItemList = RebuildEndList(DrawList); - // Controle des elements - for ( DrawItem = DrawList; DrawItem != NULL; DrawItem= DrawItem->Pnext) - { - switch( DrawItem->m_StructType ) - { - case DRAW_GLOBAL_LABEL_STRUCT_TYPE: - case DRAW_LABEL_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ((DrawLabelStruct*)DrawItem) - TestLabelForDangling(STRUCT, this, DC); - break; - break; - - case DRAW_SEGMENT_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ((EDA_DrawLineStruct*)DrawItem) - if( STRUCT->m_Layer == LAYER_WIRE) - { - TestWireForDangling(STRUCT, this, DC); - break; - } - if( STRUCT->m_Layer == LAYER_NOTES) break; - if( STRUCT->m_Layer == LAYER_BUS) - { - STRUCT->m_StartIsDangling = - STRUCT->m_EndIsDangling = FALSE; - break; - } - break; - } - } + EDA_BaseStruct* DrawItem; + const DanglingEndHandle* DanglingItem, * nextitem; + + if( ItemList ) + for( DanglingItem = ItemList; DanglingItem != NULL; DanglingItem = nextitem ) + { + nextitem = DanglingItem->m_Pnext; + delete DanglingItem; + } + + ItemList = RebuildEndList( DrawList ); + + // Controle des elements + for( DrawItem = DrawList; DrawItem != NULL; DrawItem = DrawItem->Pnext ) + { + switch( DrawItem->m_StructType ) + { + case DRAW_GLOBAL_LABEL_STRUCT_TYPE: + case DRAW_LABEL_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawLabelStruct*) DrawItem ) + TestLabelForDangling( STRUCT, this, DC ); + break; + break; + + case DRAW_SEGMENT_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (EDA_DrawLineStruct*) DrawItem ) + if( STRUCT->m_Layer == LAYER_WIRE ) + { + TestWireForDangling( STRUCT, this, DC ); + break; + } + if( STRUCT->m_Layer == LAYER_NOTES ) + break; + if( STRUCT->m_Layer == LAYER_BUS ) + { + STRUCT->m_StartIsDangling = + STRUCT->m_EndIsDangling = FALSE; + break; + } + break; + + default: + ; + } + } } + /********************************************************************/ -LibDrawPin * WinEDA_SchematicFrame::LocatePinEnd(EDA_BaseStruct *DrawList, - const wxPoint & pos) +LibDrawPin* WinEDA_SchematicFrame::LocatePinEnd( EDA_BaseStruct* DrawList, + const wxPoint& pos ) /********************************************************************/ + /* Teste si le point de coordonnées pos est sur l'extrémité d'une PIN - retourne un pointeur sur la pin - NULL sinon -*/ + * retourne un pointeur sur la pin + * NULL sinon + */ { -EDA_SchComponentStruct * DrawLibItem; -LibDrawPin * Pin; -wxPoint pinpos; - - Pin = LocateAnyPin(DrawList,pos, &DrawLibItem); - if( ! Pin ) return NULL; - - pinpos = Pin->m_Pos; + EDA_SchComponentStruct* DrawLibItem; + LibDrawPin* Pin; + wxPoint pinpos; - if(DrawLibItem == NULL ) pinpos.y = -pinpos.y; + Pin = LocateAnyPin( DrawList, pos, &DrawLibItem ); + if( !Pin ) + return NULL; - else - { - int x1 = pinpos.x, y1 = pinpos.y; - pinpos.x = DrawLibItem->m_Pos.x + DrawLibItem->m_Transform[0][0] * x1 - + DrawLibItem->m_Transform[0][1] * y1; - pinpos.y = DrawLibItem->m_Pos.y + DrawLibItem->m_Transform[1][0] * x1 - + DrawLibItem->m_Transform[1][1] * y1; - } + pinpos = Pin->m_Pos; - if( (pos.x == pinpos.x) && (pos.y == pinpos.y) ) return Pin; - return NULL; + if( DrawLibItem == NULL ) + pinpos.y = -pinpos.y; + + else + { + int x1 = pinpos.x, y1 = pinpos.y; + pinpos.x = DrawLibItem->m_Pos.x + DrawLibItem->m_Transform[0][0] * x1 + + DrawLibItem->m_Transform[0][1] * y1; + pinpos.y = DrawLibItem->m_Pos.y + DrawLibItem->m_Transform[1][0] * x1 + + DrawLibItem->m_Transform[1][1] * y1; + } + + if( (pos.x == pinpos.x) && (pos.y == pinpos.y) ) + return Pin; + return NULL; } /****************************************************************************/ -void TestWireForDangling(EDA_DrawLineStruct * DrawRef, - WinEDA_SchematicFrame * frame, wxDC * DC) +void TestWireForDangling( EDA_DrawLineStruct* DrawRef, + WinEDA_SchematicFrame* frame, wxDC* DC ) /****************************************************************************/ { -DanglingEndHandle * terminal_item; -bool Sdangstate = TRUE, Edangstate = TRUE; - - for ( terminal_item = ItemList; terminal_item != NULL; - terminal_item = terminal_item->m_Pnext) - { - if ( terminal_item->m_Item == DrawRef ) continue; - - if ( (DrawRef->m_Start.x == terminal_item->m_Pos.x) && - (DrawRef->m_Start.y == terminal_item->m_Pos.y) ) - Sdangstate = FALSE; + DanglingEndHandle* terminal_item; + bool Sdangstate = TRUE, Edangstate = TRUE; - if ( (DrawRef->m_End.x == terminal_item->m_Pos.x) && - (DrawRef->m_End.y == terminal_item->m_Pos.y) ) - Edangstate = FALSE; + for( terminal_item = ItemList; terminal_item != NULL; + terminal_item = terminal_item->m_Pnext ) + { + if( terminal_item->m_Item == DrawRef ) + continue; - if ( (Sdangstate == FALSE) && (Edangstate == FALSE) ) - break; - } + if( (DrawRef->m_Start.x == terminal_item->m_Pos.x) + && (DrawRef->m_Start.y == terminal_item->m_Pos.y) ) + Sdangstate = FALSE; - if ( (Sdangstate != DrawRef->m_StartIsDangling) || - (Edangstate != DrawRef->m_EndIsDangling) ) - { - if ( DC ) - RedrawOneStruct(frame->DrawPanel,DC, DrawRef, g_XorMode); - DrawRef->m_StartIsDangling = Sdangstate; - DrawRef->m_EndIsDangling = Edangstate; - if ( DC ) - RedrawOneStruct(frame->DrawPanel,DC, DrawRef, GR_DEFAULT_DRAWMODE); - } + if( (DrawRef->m_End.x == terminal_item->m_Pos.x) + && (DrawRef->m_End.y == terminal_item->m_Pos.y) ) + Edangstate = FALSE; + + if( (Sdangstate == FALSE) && (Edangstate == FALSE) ) + break; + } + + if( (Sdangstate != DrawRef->m_StartIsDangling) + || (Edangstate != DrawRef->m_EndIsDangling) ) + { + if( DC ) + RedrawOneStruct( frame->DrawPanel, DC, DrawRef, g_XorMode ); + DrawRef->m_StartIsDangling = Sdangstate; + DrawRef->m_EndIsDangling = Edangstate; + if( DC ) + RedrawOneStruct( frame->DrawPanel, DC, DrawRef, GR_DEFAULT_DRAWMODE ); + } } + /********************************************************/ -void TestLabelForDangling(DrawTextStruct * label, - WinEDA_SchematicFrame * frame, wxDC * DC) +void TestLabelForDangling( DrawTextStruct* label, + WinEDA_SchematicFrame* frame, wxDC* DC ) /********************************************************/ { -DanglingEndHandle * terminal_item; -bool dangstate = TRUE; - - for ( terminal_item = ItemList; terminal_item != NULL; - terminal_item = terminal_item->m_Pnext) - { - if ( terminal_item->m_Item == label ) continue; - switch( terminal_item->m_Type ) - { - case PIN_END: - case LABEL_END: - case SHEET_LABEL_END: - if ( (label->m_Pos.x == terminal_item->m_Pos.x) && - (label->m_Pos.y == terminal_item->m_Pos.y) ) - dangstate = FALSE; - break; + DanglingEndHandle* terminal_item; + bool dangstate = TRUE; - case WIRE_START_END: - case BUS_START_END: - dangstate = ! SegmentIntersect(terminal_item->m_Pos.x, - terminal_item->m_Pos.y, - terminal_item->m_Pnext->m_Pos.x, - terminal_item->m_Pnext->m_Pos.y, - label->m_Pos.x, label->m_Pos.y); - terminal_item = terminal_item->m_Pnext; - break; + for( terminal_item = ItemList; terminal_item != NULL; + terminal_item = terminal_item->m_Pnext ) + { + if( terminal_item->m_Item == label ) + continue; - case UNKNOWN: - case JUNCTION_END: - case ENTRY_END: - case WIRE_END_END: - case BUS_END_END: - break; - } + switch( terminal_item->m_Type ) + { + case PIN_END: + case LABEL_END: + case SHEET_LABEL_END: + if( (label->m_Pos.x == terminal_item->m_Pos.x) + && (label->m_Pos.y == terminal_item->m_Pos.y) ) + dangstate = FALSE; + break; - if (dangstate == FALSE) break; - } + case WIRE_START_END: + case BUS_START_END: + dangstate = !SegmentIntersect( terminal_item->m_Pos.x, + terminal_item->m_Pos.y, + terminal_item->m_Pnext->m_Pos.x, + terminal_item->m_Pnext->m_Pos.y, + label->m_Pos.x, label->m_Pos.y ); + terminal_item = terminal_item->m_Pnext; + break; - if ( dangstate != label->m_IsDangling ) - { - if ( DC ) - RedrawOneStruct(frame->DrawPanel,DC, label, g_XorMode); - label->m_IsDangling = dangstate; - if ( DC ) - RedrawOneStruct(frame->DrawPanel,DC, label, GR_DEFAULT_DRAWMODE); - } + case UNKNOWN: + case JUNCTION_END: + case ENTRY_END: + case WIRE_END_END: + case BUS_END_END: + break; + } + + if( dangstate == FALSE ) + break; + } + + if( dangstate != label->m_IsDangling ) + { + if( DC ) + RedrawOneStruct( frame->DrawPanel, DC, label, g_XorMode ); + label->m_IsDangling = dangstate; + if( DC ) + RedrawOneStruct( frame->DrawPanel, DC, label, GR_DEFAULT_DRAWMODE ); + } } /****************************************************/ -wxPoint ReturnPinPhysicalPosition( LibDrawPin * Pin, - EDA_SchComponentStruct * DrawLibItem) +wxPoint ReturnPinPhysicalPosition( LibDrawPin* Pin, + EDA_SchComponentStruct* DrawLibItem ) /****************************************************/ + /* Retourne la position physique de la pin, qui dépend de l'orientation -du composant */ + * du composant */ { -wxPoint PinPos = Pin->m_Pos; - - if(DrawLibItem == NULL ) PinPos.y = -PinPos.y; + wxPoint PinPos = Pin->m_Pos; - else - { - int x = Pin->m_Pos.x, y = Pin->m_Pos.y; - PinPos.x = DrawLibItem->m_Pos.x + DrawLibItem->m_Transform[0][0] * x - + DrawLibItem->m_Transform[0][1] * y; - PinPos.y = DrawLibItem->m_Pos.y + DrawLibItem->m_Transform[1][0] * x - + DrawLibItem->m_Transform[1][1] * y; - } + if( DrawLibItem == NULL ) + PinPos.y = -PinPos.y; - return PinPos; + else + { + int x = Pin->m_Pos.x, y = Pin->m_Pos.y; + PinPos.x = DrawLibItem->m_Pos.x + DrawLibItem->m_Transform[0][0] * x + + DrawLibItem->m_Transform[0][1] * y; + PinPos.y = DrawLibItem->m_Pos.y + DrawLibItem->m_Transform[1][0] * x + + DrawLibItem->m_Transform[1][1] * y; + } + + return PinPos; } /***********************************************************/ -DanglingEndHandle * RebuildEndList(EDA_BaseStruct *DrawList) +DanglingEndHandle* RebuildEndList( EDA_BaseStruct* DrawList ) /***********************************************************/ { -DanglingEndHandle * StartList = NULL, *item, *lastitem = NULL; -EDA_BaseStruct * DrawItem; - - for ( DrawItem = DrawList; DrawItem != NULL; DrawItem = DrawItem->Pnext) - { - switch( DrawItem->m_StructType ) - { - case DRAW_LABEL_STRUCT_TYPE: - break; - - case DRAW_GLOBAL_LABEL_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ((DrawGlobalLabelStruct*)DrawItem) - item = new DanglingEndHandle(LABEL_END); - item->m_Item = DrawItem; - item->m_Pos = STRUCT->m_Pos; - if ( lastitem ) lastitem->m_Pnext = item; - else StartList = item; - lastitem = item; - break; - - case DRAW_SEGMENT_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ((EDA_DrawLineStruct*)DrawItem) - if( STRUCT->m_Layer == LAYER_NOTES ) break; - if( (STRUCT->m_Layer == LAYER_BUS) || (STRUCT->m_Layer == LAYER_WIRE) ) - { - item = new DanglingEndHandle((STRUCT->m_Layer == LAYER_BUS) ? - BUS_START_END : WIRE_START_END); - item->m_Item = DrawItem; - item->m_Pos = STRUCT->m_Start; - if ( lastitem ) lastitem->m_Pnext = item; - else StartList = item; - lastitem = item; - item = new DanglingEndHandle((STRUCT->m_Layer == LAYER_BUS) ? - BUS_END_END : WIRE_END_END); - item->m_Item = DrawItem; - item->m_Pos = STRUCT->m_End; - lastitem->m_Pnext = item; - lastitem = item; - } - break; - - case DRAW_JUNCTION_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ((DrawJunctionStruct*)DrawItem) - item = new DanglingEndHandle(JUNCTION_END); - item->m_Item = DrawItem; - item->m_Pos = STRUCT->m_Pos; - if ( lastitem ) lastitem->m_Pnext = item; - else StartList = item; - lastitem = item; - break; - - case DRAW_BUSENTRY_STRUCT_TYPE: - #undef STRUCT - #define STRUCT ((DrawBusEntryStruct*)DrawItem) - item = new DanglingEndHandle(ENTRY_END); - item->m_Item = DrawItem; - item->m_Pos = STRUCT->m_Pos; - if ( lastitem ) lastitem->m_Pnext = item; - else StartList = item; - lastitem = item; - item = new DanglingEndHandle(ENTRY_END); - item->m_Item = DrawItem; - item->m_Pos = STRUCT->m_End(); - lastitem->m_Pnext = item; - lastitem = item; - break; - - case DRAW_LIB_ITEM_STRUCT_TYPE: - { - #undef STRUCT - #define STRUCT ((EDA_SchComponentStruct*)DrawItem) - EDA_LibComponentStruct * Entry; - Entry = FindLibPart( STRUCT->m_ChipName, wxEmptyString, FIND_ROOT); - if( Entry == NULL ) break; - LibEDA_BaseStruct * DrawLibItem = Entry->m_Drawings; - for ( ; DrawLibItem != NULL; DrawLibItem = DrawLibItem->Next()) - { - if(DrawLibItem->m_StructType != COMPONENT_PIN_DRAW_TYPE) continue; + DanglingEndHandle* StartList = NULL, * item, * lastitem = NULL; + EDA_BaseStruct* DrawItem; - LibDrawPin * Pin = (LibDrawPin *) DrawLibItem; + for( DrawItem = DrawList; DrawItem != NULL; DrawItem = DrawItem->Pnext ) + { + switch( DrawItem->m_StructType ) + { + case DRAW_LABEL_STRUCT_TYPE: + break; - if( Pin->m_Unit && DrawLibItem->m_Unit && - (DrawLibItem->m_Unit != Pin->m_Unit) ) - continue; + case DRAW_GLOBAL_LABEL_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawGlobalLabelStruct*) DrawItem ) + item = new DanglingEndHandle( LABEL_END ); - if( Pin->m_Convert && DrawLibItem->m_Convert && - (DrawLibItem->m_Convert != Pin->m_Convert) ) - continue; + item->m_Item = DrawItem; + item->m_Pos = STRUCT->m_Pos; + if( lastitem ) + lastitem->m_Pnext = item; + else + StartList = item; + lastitem = item; + break; - item = new DanglingEndHandle(PIN_END); - item->m_Item = Pin; - item->m_Pos = ReturnPinPhysicalPosition( Pin,STRUCT); - if ( lastitem ) lastitem->m_Pnext = item; - else StartList = item; - lastitem = item; - } - break; + case DRAW_SEGMENT_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (EDA_DrawLineStruct*) DrawItem ) + if( STRUCT->m_Layer == LAYER_NOTES ) + break; + if( (STRUCT->m_Layer == LAYER_BUS) || (STRUCT->m_Layer == LAYER_WIRE) ) + { + item = new DanglingEndHandle( (STRUCT->m_Layer == LAYER_BUS) ? + BUS_START_END : WIRE_START_END ); - } + item->m_Item = DrawItem; + item->m_Pos = STRUCT->m_Start; + if( lastitem ) + lastitem->m_Pnext = item; + else + StartList = item; + lastitem = item; + item = new DanglingEndHandle( (STRUCT->m_Layer == LAYER_BUS) ? + BUS_END_END : WIRE_END_END ); - case DRAW_SHEET_STRUCT_TYPE: - { - #undef STRUCT - #define STRUCT ((DrawSheetStruct*)DrawItem) - DrawSheetLabelStruct * pinsheet = STRUCT->m_Label; - while(pinsheet) - { - item = new DanglingEndHandle(SHEET_LABEL_END); - item->m_Item = pinsheet; - item->m_Pos = pinsheet->m_Pos; - if ( lastitem ) lastitem->m_Pnext = item; - else StartList = item; - lastitem = item; - pinsheet = (DrawSheetLabelStruct*)pinsheet->Pnext; - } - break; - } - } - } - return StartList; + item->m_Item = DrawItem; + item->m_Pos = STRUCT->m_End; + lastitem->m_Pnext = item; + lastitem = item; + } + break; + + case DRAW_JUNCTION_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawJunctionStruct*) DrawItem ) + item = new DanglingEndHandle( JUNCTION_END ); + + item->m_Item = DrawItem; + item->m_Pos = STRUCT->m_Pos; + if( lastitem ) + lastitem->m_Pnext = item; + else + StartList = item; + lastitem = item; + break; + + case DRAW_BUSENTRY_STRUCT_TYPE: + #undef STRUCT + #define STRUCT ( (DrawBusEntryStruct*) DrawItem ) + item = new DanglingEndHandle( ENTRY_END ); + + item->m_Item = DrawItem; + item->m_Pos = STRUCT->m_Pos; + if( lastitem ) + lastitem->m_Pnext = item; + else + StartList = item; + lastitem = item; + item = new DanglingEndHandle( ENTRY_END ); + + item->m_Item = DrawItem; + item->m_Pos = STRUCT->m_End(); + lastitem->m_Pnext = item; + lastitem = item; + break; + + case DRAW_LIB_ITEM_STRUCT_TYPE: + { + #undef STRUCT + #define STRUCT ( (EDA_SchComponentStruct*) DrawItem ) + EDA_LibComponentStruct* Entry; + Entry = FindLibPart( STRUCT->m_ChipName, wxEmptyString, FIND_ROOT ); + if( Entry == NULL ) + break; + + LibEDA_BaseStruct* DrawLibItem = Entry->m_Drawings; + for( ; DrawLibItem != NULL; DrawLibItem = DrawLibItem->Next() ) + { + if( DrawLibItem->m_StructType != COMPONENT_PIN_DRAW_TYPE ) + continue; + + LibDrawPin* Pin = (LibDrawPin*) DrawLibItem; + + if( Pin->m_Unit && DrawLibItem->m_Unit + && (DrawLibItem->m_Unit != Pin->m_Unit) ) + continue; + + if( Pin->m_Convert && DrawLibItem->m_Convert + && (DrawLibItem->m_Convert != Pin->m_Convert) ) + continue; + + item = new DanglingEndHandle( PIN_END ); + + item->m_Item = Pin; + item->m_Pos = ReturnPinPhysicalPosition( Pin, STRUCT ); + if( lastitem ) + lastitem->m_Pnext = item; + else + StartList = item; + lastitem = item; + } + + break; + } + + case DRAW_SHEET_STRUCT_TYPE: + { + #undef STRUCT + #define STRUCT ( (DrawSheetStruct*) DrawItem ) + DrawSheetLabelStruct* pinsheet = STRUCT->m_Label; + while( pinsheet ) + { + item = new DanglingEndHandle( SHEET_LABEL_END ); + + item->m_Item = pinsheet; + item->m_Pos = pinsheet->m_Pos; + if( lastitem ) + lastitem->m_Pnext = item; + else + StartList = item; + lastitem = item; + pinsheet = (DrawSheetLabelStruct*) pinsheet->Pnext; + } + + break; + } + + default: + ; + } + } + + return StartList; } diff --git a/eeschema/eelibs_draw_components.cpp b/eeschema/eelibs_draw_components.cpp index 16820162bd..d532a22be4 100644 --- a/eeschema/eelibs_draw_components.cpp +++ b/eeschema/eelibs_draw_components.cpp @@ -1,6 +1,6 @@ - /****************************************/ - /* Modules to handle component drawing. */ - /****************************************/ +/****************************************/ +/* Modules to handle component drawing. */ +/****************************************/ #include "fctsys.h" #include "gr_basic.h" @@ -21,339 +21,375 @@ /* Fonctions locales */ /* Descr component used when a component is not found in library, - to draw a dummy shape*/ + * to draw a dummy shape*/ + /* -This component is a 400 mils square with the text ?? -DEF DUMMY U 0 40 Y Y 1 0 N -F0 "U" 0 -350 60 H V -F1 "DUMMY" 0 350 60 H V -DRAW -T 0 0 0 150 0 0 0 ?? -S -200 200 200 -200 0 1 0 -ENDDRAW -ENDDEF -*/ + * This component is a 400 mils square with the text ?? + * DEF DUMMY U 0 40 Y Y 1 0 N + * F0 "U" 0 -350 60 H V + * F1 "DUMMY" 0 350 60 H V + * DRAW + * T 0 0 0 150 0 0 0 ?? + * S -200 200 200 -200 0 1 0 + * ENDDRAW + * ENDDEF + */ -static int s_ItemSelectColor = BROWN; +static int s_ItemSelectColor = BROWN; -static EDA_LibComponentStruct * DummyCmp; -static int * Buf_Poly_Drawings, Buf_Poly_Size; // Used fo polyline drawings -static void DrawLibPartAux(WinEDA_DrawPanel * panel, wxDC * DC, - EDA_SchComponentStruct *Component, - EDA_LibComponentStruct *Entry, - const wxPoint & Pos, - int TransMat[2][2], - int Multi, int convert, - int DrawMode, int Color = -1, bool DrawPinText = TRUE); +static EDA_LibComponentStruct* DummyCmp; +static int* Buf_Poly_Drawings, Buf_Poly_Size; // Used fo polyline drawings +static void DrawLibPartAux( WinEDA_DrawPanel* panel, wxDC* DC, + EDA_SchComponentStruct* Component, + EDA_LibComponentStruct* Entry, + const wxPoint& Pos, + int TransMat[2][2], + int Multi, int convert, + int DrawMode, int Color = -1, bool DrawPinText = TRUE ); /******************************/ -static void CreateDummyCmp(void) +static void CreateDummyCmp( void ) /******************************/ { - DummyCmp = new EDA_LibComponentStruct( NULL); + DummyCmp = new EDA_LibComponentStruct( NULL ); - LibDrawSquare * Square = new LibDrawSquare(); - Square->m_Pos = wxPoint(- 200,200); - Square->m_End = wxPoint(200, - 200); - Square->m_Width = 4; + LibDrawSquare* Square = new LibDrawSquare(); - LibDrawText * Text = new LibDrawText(); - Text->m_Size.x = Text->m_Size.y = 150; - Text->m_Text = wxT("??"); + Square->m_Pos = wxPoint( -200, 200 ); + Square->m_End = wxPoint( 200, -200 ); + Square->m_Width = 4; - DummyCmp->m_Drawings = Square; - Square->Pnext = Text; + LibDrawText* Text = new LibDrawText(); + + Text->m_Size.x = Text->m_Size.y = 150; + Text->m_Text = wxT( "??" ); + + DummyCmp->m_Drawings = Square; + Square->Pnext = Text; } /*************************************************************/ -void DrawLibEntry(WinEDA_DrawPanel * panel,wxDC * DC, - EDA_LibComponentStruct *LibEntry, - int posX, int posY, - int Multi, int convert, - int DrawMode, int Color) +void DrawLibEntry( WinEDA_DrawPanel* panel, wxDC* DC, + EDA_LibComponentStruct* LibEntry, + int posX, int posY, + int Multi, int convert, + int DrawMode, int Color ) /**************************************************************/ + /* Routine de dessin d'un composant d'une librairie - LibEntry = pointeur sur la description en librairie - posX, posY = position du composant - DrawMode = GrOR .. - Color = 0 : dessin en vraies couleurs, sinon couleur = Color - - Une croix symbolise le point d'accrochage (ref position) du composant - - Le composant est toujours trace avec orientation 0 -*/ + * LibEntry = pointeur sur la description en librairie + * posX, posY = position du composant + * DrawMode = GrOR .. + * Color = 0 : dessin en vraies couleurs, sinon couleur = Color + * + * Une croix symbolise le point d'accrochage (ref position) du composant + * + * Le composant est toujours trace avec orientation 0 + */ { -int color; -int TransMat[2][2]; -wxString Prefix; -LibDrawField * Field; -wxPoint text_pos; + int color; + int TransMat[2][2]; + wxString Prefix; + LibDrawField* Field; + wxPoint text_pos; - /* Orientation normale */ - TransMat[0][0] = 1; TransMat[1][1] = -1; - TransMat[1][0] = TransMat[0][1] = 0; + /* Orientation normale */ + TransMat[0][0] = 1; TransMat[1][1] = -1; + TransMat[1][0] = TransMat[0][1] = 0; - DrawLibPartAux(panel, DC, NULL, LibEntry, wxPoint(posX, posY), - TransMat, Multi, - convert, DrawMode, Color); + DrawLibPartAux( panel, DC, NULL, LibEntry, wxPoint( posX, posY ), + TransMat, Multi, + convert, DrawMode, Color ); - /* Trace des 2 champs ref et value (Attention aux coord: la matrice - de transformation change de signe les coord Y */ + /* Trace des 2 champs ref et value (Attention aux coord: la matrice + * de transformation change de signe les coord Y */ - GRSetDrawMode(DC, DrawMode); + GRSetDrawMode( DC, DrawMode ); - if( LibEntry->m_Prefix.m_Attributs & TEXT_NO_VISIBLE ) - { - if( Color >= 0 ) color = Color; - else color = UNVISIBLE_COLOR; - } + if( LibEntry->m_Prefix.m_Attributs & TEXT_NO_VISIBLE ) + { + if( Color >= 0 ) + color = Color; + else + color = UNVISIBLE_COLOR; + } + else + { + if( Color >= 0 ) + color = Color; + else + color = ReturnLayerColor( LAYER_REFERENCEPART ); + } - else { - if( Color >= 0) color = Color; - else color = ReturnLayerColor(LAYER_REFERENCEPART); - } + if( LibEntry->m_UnitCount > 1 ) + Prefix.Printf( wxT( "%s?%c" ), LibEntry->m_Prefix.m_Text.GetData(), Multi + 'A' - 1 ); + else + Prefix = LibEntry->m_Prefix.m_Text + wxT( "?" ); - if (LibEntry->m_UnitCount > 1) - Prefix.Printf( wxT("%s?%c"),LibEntry->m_Prefix.m_Text.GetData(),Multi + 'A' - 1); - else Prefix = LibEntry->m_Prefix.m_Text + wxT("?"); + text_pos.x = LibEntry->m_Prefix.m_Pos.x + posX; + text_pos.y = posY - LibEntry->m_Prefix.m_Pos.y; + int LineWidth = MAX( LibEntry->m_Prefix.m_Width, g_DrawMinimunLineWidth ); + if( (LibEntry->m_Prefix.m_Flags & IS_MOVED) == 0 ) + DrawGraphicText( panel, DC, text_pos, + color, LibEntry->m_Prefix.m_Text.GetData(), + LibEntry->m_Prefix.m_Orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, + LibEntry->m_Prefix.m_Size, + LibEntry->m_Prefix.m_HJustify, LibEntry->m_Prefix.m_VJustify, LineWidth ); - text_pos.x = LibEntry->m_Prefix.m_Pos.x + posX; - text_pos.y = posY - LibEntry->m_Prefix.m_Pos.y; -int LineWidth = MAX(LibEntry->m_Prefix.m_Width, g_DrawMinimunLineWidth); - if ( (LibEntry->m_Prefix.m_Flags & IS_MOVED) == 0 ) - DrawGraphicText(panel, DC, text_pos, - color,LibEntry->m_Prefix.m_Text.GetData(), - LibEntry->m_Prefix.m_Orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, - LibEntry->m_Prefix.m_Size, - LibEntry->m_Prefix.m_HJustify, LibEntry->m_Prefix.m_VJustify, LineWidth); + if( LibEntry->m_Name.m_Attributs & TEXT_NO_VISIBLE ) + { + if( Color >= 0 ) + color = Color; + else + color = UNVISIBLE_COLOR; + } + else + { + if( Color >= 0 ) + color = Color; + else + color = ReturnLayerColor( LAYER_VALUEPART ); + } - if( LibEntry->m_Name.m_Attributs & TEXT_NO_VISIBLE ) - { - if( Color >= 0) color = Color; - else color = UNVISIBLE_COLOR; - } + text_pos.x = LibEntry->m_Name.m_Pos.x + posX; + text_pos.y = posY - LibEntry->m_Name.m_Pos.y; + LineWidth = MAX( LibEntry->m_Name.m_Width, g_DrawMinimunLineWidth ); + if( (LibEntry->m_Name.m_Flags & IS_MOVED) == 0 ) + DrawGraphicText( panel, DC, text_pos, + color, LibEntry->m_Name.m_Text.GetData(), + LibEntry->m_Name.m_Orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, + LibEntry->m_Name.m_Size, + LibEntry->m_Name.m_HJustify, LibEntry->m_Name.m_VJustify, LineWidth ); - else { - if( Color >= 0 ) color = Color; - else color = ReturnLayerColor(LAYER_VALUEPART); - } + for( Field = LibEntry->Fields; Field != NULL; Field = (LibDrawField*) Field->Pnext ) + { + if( Field->m_Text.IsEmpty() ) + return; + if( (Field->m_Flags & IS_MOVED) != 0 ) + continue; + if( Field->m_Attributs & TEXT_NO_VISIBLE ) + { + if( Color >= 0 ) + color = Color; + else + color = UNVISIBLE_COLOR; + } + else + { + if( Color >= 0 ) + color = Color; + else + color = ReturnLayerColor( LAYER_FIELDS ); + } - text_pos.x = LibEntry->m_Name.m_Pos.x + posX; - text_pos.y = posY - LibEntry->m_Name.m_Pos.y; - LineWidth = MAX(LibEntry->m_Name.m_Width, g_DrawMinimunLineWidth); - if ( (LibEntry->m_Name.m_Flags & IS_MOVED) == 0 ) - DrawGraphicText(panel, DC, text_pos, - color, LibEntry->m_Name.m_Text.GetData(), - LibEntry->m_Name.m_Orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, - LibEntry->m_Name.m_Size, - LibEntry->m_Name.m_HJustify, LibEntry->m_Name.m_VJustify, LineWidth); - - for( Field = LibEntry->Fields; Field != NULL; Field = (LibDrawField *)Field->Pnext ) - { - if( Field->m_Text.IsEmpty() ) return; - if ( (Field->m_Flags & IS_MOVED) != 0 ) continue; - if( Field->m_Attributs & TEXT_NO_VISIBLE ) - { - if( Color >= 0) color = Color; - else color = UNVISIBLE_COLOR; - } - else - { - if( Color >= 0) color = Color; - else color = ReturnLayerColor(LAYER_FIELDS); - } - - text_pos.x = Field->m_Pos.x + posX; - text_pos.y = posY - Field->m_Pos.y; - LineWidth = MAX(Field->m_Width, g_DrawMinimunLineWidth); - DrawGraphicText(panel, DC, text_pos, - color, Field->m_Text, - Field->m_Orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, - Field->m_Size, - Field->m_HJustify, Field->m_VJustify, LineWidth); - } - - // Tracé de l'ancre - int len = 3 * panel->GetZoom(); - GRLine(&panel->m_ClipBox, DC, posX, posY - len, posX, posY + len, 0, color); - GRLine(&panel->m_ClipBox, DC, posX - len, posY, posX + len, posY, 0, color); + text_pos.x = Field->m_Pos.x + posX; + text_pos.y = posY - Field->m_Pos.y; + LineWidth = MAX( Field->m_Width, g_DrawMinimunLineWidth ); + DrawGraphicText( panel, DC, text_pos, + color, Field->m_Text, + Field->m_Orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, + Field->m_Size, + Field->m_HJustify, Field->m_VJustify, LineWidth ); + } + // Tracé de l'ancre + int len = 3 * panel->GetZoom(); + GRLine( &panel->m_ClipBox, DC, posX, posY - len, posX, posY + len, 0, color ); + GRLine( &panel->m_ClipBox, DC, posX - len, posY, posX + len, posY, 0, color ); } + /***************************************************************************** * Routine to draw the given part at given position, transformed/mirror as * * specified, and in the given drawing mode. Only this one is visible... * *****************************************************************************/ -void EDA_SchComponentStruct::Draw(WinEDA_DrawPanel * panel,wxDC * DC, - const wxPoint & offset, int DrawMode, int Color) +void EDA_SchComponentStruct::Draw( WinEDA_DrawPanel* panel, wxDC* DC, + const wxPoint& offset, int DrawMode, int Color ) { -EDA_LibComponentStruct *Entry; -int ii; -bool dummy = FALSE; + EDA_LibComponentStruct* Entry; + int ii; + bool dummy = FALSE; - if( (Entry = FindLibPart(m_ChipName.GetData(),wxEmptyString,FIND_ROOT)) == NULL) - { /* composant non trouvé, on affiche un composant "dummy" */ - dummy = TRUE; - if( DummyCmp == NULL ) CreateDummyCmp(); - Entry = DummyCmp; - } + if( ( Entry = FindLibPart( m_ChipName.GetData(), wxEmptyString, FIND_ROOT ) ) == NULL ) + { /* composant non trouvé, on affiche un composant "dummy" */ + dummy = TRUE; + if( DummyCmp == NULL ) + CreateDummyCmp(); + Entry = DummyCmp; + } - DrawLibPartAux(panel, DC, this, Entry, m_Pos + offset, - m_Transform, - dummy ? 0 : m_Multi, - dummy ? 0 : m_Convert, - DrawMode); + DrawLibPartAux( panel, DC, this, Entry, m_Pos + offset, + m_Transform, + dummy ? 0 : m_Multi, + dummy ? 0 : m_Convert, + DrawMode ); - /* Trace des champs, avec placement et orientation selon orient. du - composant - */ + /* Trace des champs, avec placement et orientation selon orient. du + * composant + */ - if( ((m_Field[REFERENCE].m_Attributs & TEXT_NO_VISIBLE) == 0) - && ! (m_Field[REFERENCE].m_Flags & IS_MOVED) ) - { - if ( Entry->m_UnitCount > 1 ) - DrawTextField(panel, DC, &m_Field[REFERENCE],1,DrawMode); - else - DrawTextField(panel, DC, &m_Field[REFERENCE],0,DrawMode); - } + if( ( (m_Field[REFERENCE].m_Attributs & TEXT_NO_VISIBLE) == 0 ) + && !(m_Field[REFERENCE].m_Flags & IS_MOVED) ) + { + if( Entry->m_UnitCount > 1 ) + DrawTextField( panel, DC, &m_Field[REFERENCE], 1, DrawMode ); + else + DrawTextField( panel, DC, &m_Field[REFERENCE], 0, DrawMode ); + } - for( ii = VALUE; ii < NUMBER_OF_FIELDS; ii++ ) - { - if (m_Field[ii].m_Flags & IS_MOVED) continue; - DrawTextField(panel, DC, &m_Field[ii],0,DrawMode); - } + for( ii = VALUE; ii < NUMBER_OF_FIELDS; ii++ ) + { + if( m_Field[ii].m_Flags & IS_MOVED ) + continue; + DrawTextField( panel, DC, &m_Field[ii], 0, DrawMode ); + } } + /***********************************************************/ -void DrawTextField(WinEDA_DrawPanel * panel,wxDC * DC, - PartTextStruct * Field, int IsMulti, int DrawMode) +void DrawTextField( WinEDA_DrawPanel* panel, wxDC* DC, + PartTextStruct* Field, int IsMulti, int DrawMode ) /***********************************************************/ + /* Routine de trace des textes type Field du composant. - entree: - IsMulti: flag Non Null si il y a plusieurs parts par boitier. - n'est utile que pour le champ reference pour ajouter a celui ci - l'identification de la part ( A, B ... ) - DrawMode: mode de trace -*/ + * entree: + * IsMulti: flag Non Null si il y a plusieurs parts par boitier. + * n'est utile que pour le champ reference pour ajouter a celui ci + * l'identification de la part ( A, B ... ) + * DrawMode: mode de trace + */ { -int orient, color; -wxPoint pos; /* Position des textes */ -EDA_SchComponentStruct *DrawLibItem = (EDA_SchComponentStruct *) Field->m_Parent; -int hjustify, vjustify; -int LineWidth = MAX(Field->m_Width, g_DrawMinimunLineWidth); + int orient, color; + wxPoint pos; /* Position des textes */ + EDA_SchComponentStruct* DrawLibItem = (EDA_SchComponentStruct*) Field->m_Parent; + int hjustify, vjustify; + int LineWidth = MAX( Field->m_Width, g_DrawMinimunLineWidth ); - if( Field->m_Attributs & TEXT_NO_VISIBLE ) return; - if( Field->IsVoid() ) return; - - GRSetDrawMode(DC, DrawMode); + if( Field->m_Attributs & TEXT_NO_VISIBLE ) + return; + if( Field->IsVoid() ) + return; - /* Calcul de la position des textes, selon orientation du composant */ - orient = Field->m_Orient; - hjustify = Field->m_HJustify; vjustify = Field->m_VJustify; - pos.x = Field->m_Pos.x - DrawLibItem->m_Pos.x; - pos.y = Field->m_Pos.y - DrawLibItem->m_Pos.y; + GRSetDrawMode( DC, DrawMode ); - pos = DrawLibItem->GetScreenCoord(pos); - pos.x += DrawLibItem->m_Pos.x; - pos.y += DrawLibItem->m_Pos.y; + /* Calcul de la position des textes, selon orientation du composant */ + orient = Field->m_Orient; + hjustify = Field->m_HJustify; vjustify = Field->m_VJustify; + pos.x = Field->m_Pos.x - DrawLibItem->m_Pos.x; + pos.y = Field->m_Pos.y - DrawLibItem->m_Pos.y; - /* Y a t-il rotation (pour l'orientation, la justification)*/ - if(DrawLibItem->m_Transform[0][1]) // Rotation du composant de 90deg - { - if ( orient == TEXT_ORIENT_HORIZ) orient = TEXT_ORIENT_VERT; - else orient = TEXT_ORIENT_HORIZ; - /* Y a t-il rotation, miroir (pour les justifications)*/ - EXCHG(hjustify, vjustify); - if (DrawLibItem->m_Transform[1][0] < 0 ) vjustify = - vjustify; - if (DrawLibItem->m_Transform[1][0] > 0 ) hjustify = - hjustify; - } - else - { /* Texte horizontal: Y a t-il miroir (pour les justifications)*/ - if (DrawLibItem->m_Transform[0][0] < 0 ) - hjustify = - hjustify; - if (DrawLibItem->m_Transform[1][1] > 0 ) - vjustify = - vjustify; - } + pos = DrawLibItem->GetScreenCoord( pos ); + pos.x += DrawLibItem->m_Pos.x; + pos.y += DrawLibItem->m_Pos.y; - if( Field->m_FieldId == REFERENCE ) - color = ReturnLayerColor(LAYER_REFERENCEPART); - else if( Field->m_FieldId == VALUE ) - color = ReturnLayerColor(LAYER_VALUEPART); - else color = ReturnLayerColor(LAYER_FIELDS); - if( !IsMulti || (Field->m_FieldId != REFERENCE) ) - { - DrawGraphicText(panel, DC, pos, color, Field->m_Text.GetData(), - orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, - Field->m_Size, - hjustify, vjustify, LineWidth); - } + /* Y a t-il rotation (pour l'orientation, la justification)*/ + if( DrawLibItem->m_Transform[0][1] ) // Rotation du composant de 90deg + { + if( orient == TEXT_ORIENT_HORIZ ) + orient = TEXT_ORIENT_VERT; + else + orient = TEXT_ORIENT_HORIZ; + /* Y a t-il rotation, miroir (pour les justifications)*/ + EXCHG( hjustify, vjustify ); + if( DrawLibItem->m_Transform[1][0] < 0 ) + vjustify = -vjustify; + if( DrawLibItem->m_Transform[1][0] > 0 ) + hjustify = -hjustify; + } + else + { + /* Texte horizontal: Y a t-il miroir (pour les justifications)*/ + if( DrawLibItem->m_Transform[0][0] < 0 ) + hjustify = -hjustify; + if( DrawLibItem->m_Transform[1][1] > 0 ) + vjustify = -vjustify; + } - else /* Le champ est la reference, et il y a plusieurs parts par boitier */ - {/* On ajoute alors A ou B ... a la reference */ - wxString fulltext = Field->m_Text; - fulltext.Append('A' - 1 + DrawLibItem->m_Multi); - DrawGraphicText(panel, DC, pos, color, fulltext.GetData(), - orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, - Field->m_Size, - hjustify, vjustify, LineWidth); - } + if( Field->m_FieldId == REFERENCE ) + color = ReturnLayerColor( LAYER_REFERENCEPART ); + else if( Field->m_FieldId == VALUE ) + color = ReturnLayerColor( LAYER_VALUEPART ); + else + color = ReturnLayerColor( LAYER_FIELDS ); + if( !IsMulti || (Field->m_FieldId != REFERENCE) ) + { + DrawGraphicText( panel, DC, pos, color, Field->m_Text.GetData(), + orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, + Field->m_Size, + hjustify, vjustify, LineWidth ); + } + else /* Le champ est la reference, et il y a plusieurs parts par boitier */ + { + /* On ajoute alors A ou B ... a la reference */ + wxString fulltext = Field->m_Text; + fulltext.Append( 'A' - 1 + DrawLibItem->m_Multi ); + DrawGraphicText( panel, DC, pos, color, fulltext.GetData(), + orient ? TEXT_ORIENT_VERT : TEXT_ORIENT_HORIZ, + Field->m_Size, + hjustify, vjustify, LineWidth ); + } } /********************************************************************************/ -EDA_LibComponentStruct *FindLibPart(const wxChar *Name, const wxString & LibName, int Alias) +EDA_LibComponentStruct* FindLibPart( const wxChar* Name, const wxString& LibName, int Alias ) /********************************************************************************/ + /* - Routine to find a part in one of the libraries given its name. - Name = Name of part. - LibName = Name of Lib; if "": seach in all libs - Alias = Flag: si flag != 0, retourne un pointeur sur une part ou un alias - si flag = 0, retourne un pointeur sur une part meme si le nom - correspond a un alias - Alias = FIND_ROOT, ou Alias = FIND_ALIAS -*/ + * Routine to find a part in one of the libraries given its name. + * Name = Name of part. + * LibName = Name of Lib; if "": seach in all libs + * Alias = Flag: si flag != 0, retourne un pointeur sur une part ou un alias + * si flag = 0, retourne un pointeur sur une part meme si le nom + * correspond a un alias + * Alias = FIND_ROOT, ou Alias = FIND_ALIAS + */ { -EDA_LibComponentStruct *Entry; -static EDA_LibComponentStruct DummyEntry(wxEmptyString); /* Used only to call PQFind. */ -LibraryStruct *Lib = g_LibraryList; + EDA_LibComponentStruct* Entry; - DummyEntry.m_Drawings = NULL; /* Used only to call PQFind. */ - DummyEntry.m_Name.m_Text = Name; + static EDA_LibComponentStruct DummyEntry( wxEmptyString );/* Used only to call PQFind. */ - PQCompFunc((PQCompFuncType) LibraryEntryCompare); + LibraryStruct* Lib = g_LibraryList; - Entry = NULL; FindLibName.Empty(); - while (Lib) - { - if( ! LibName.IsEmpty() ) - { - if( Lib->m_Name != LibName ) - { - Lib = Lib->m_Pnext; continue ; - } - } - if( Lib == NULL ) break; - Entry = (EDA_LibComponentStruct*)PQFind(Lib->m_Entries, &DummyEntry); - if( Entry != NULL) - { - FindLibName = Lib->m_Name; - break; - } - Lib = Lib->m_Pnext; - } + DummyEntry.m_Drawings = NULL;/* Used only to call PQFind. */ + DummyEntry.m_Name.m_Text = Name; - /* Si le nom est un alias, recherche du vrai composant */ - if( Entry ) - { - if( (Entry->Type != ROOT ) && (Alias == FIND_ROOT) ) - Entry = FindLibPart( ((EDA_LibCmpAliasStruct*)Entry)->m_RootName.GetData() , - Lib->m_Name, FIND_ROOT); - } + PQCompFunc( (PQCompFuncType) LibraryEntryCompare ); - return (Entry); + Entry = NULL; FindLibName.Empty(); + while( Lib ) + { + if( !LibName.IsEmpty() ) + { + if( Lib->m_Name != LibName ) + { + Lib = Lib->m_Pnext; continue; + } + } + if( Lib == NULL ) + break; + Entry = (EDA_LibComponentStruct*) PQFind( Lib->m_Entries, &DummyEntry ); + if( Entry != NULL ) + { + FindLibName = Lib->m_Name; + break; + } + Lib = Lib->m_Pnext; + } + + /* Si le nom est un alias, recherche du vrai composant */ + if( Entry ) + { + if( (Entry->Type != ROOT ) && (Alias == FIND_ROOT) ) + Entry = FindLibPart( ( (EDA_LibCmpAliasStruct*) Entry )->m_RootName.GetData(), + Lib->m_Name, FIND_ROOT ); + } + + return Entry; } + /***************************************************************************** * Routine to draw the given part at given position, transformed/mirror as * specified, and in the given drawing mode. @@ -361,375 +397,417 @@ LibraryStruct *Lib = g_LibraryList; * else draw in color = Color *****************************************************************************/ /* DrawMode = GrXOR, GrOR ..*/ -void DrawLibPartAux(WinEDA_DrawPanel * panel,wxDC * DC, - EDA_SchComponentStruct *Component, - EDA_LibComponentStruct *Entry, - const wxPoint & Pos, - int TransMat[2][2], - int Multi, int convert, int DrawMode, - int Color, bool DrawPinText) +void DrawLibPartAux( WinEDA_DrawPanel* panel, wxDC* DC, + EDA_SchComponentStruct* Component, + EDA_LibComponentStruct* Entry, + const wxPoint& Pos, + int TransMat[2][2], + int Multi, int convert, int DrawMode, + int Color, bool DrawPinText ) { -int i, x1, y1, x2, y2, t1, t2, orient; -LibEDA_BaseStruct *DEntry = NULL; -int CharColor; -int fill_option; -int SetHightColor; -int LineWidth; + int i, x1, y1, x2, y2, t1, t2, orient; + LibEDA_BaseStruct* DEntry = NULL; + int CharColor; + int fill_option; + int SetHightColor; + int LineWidth; + //#define GETCOLOR(l) Color < 0 ? (ReturnLayerColor(l)| SetHightColor) : Color; -#define GETCOLOR(l) Color < 0 ? SetHightColor ? s_ItemSelectColor : (ReturnLayerColor(l)| SetHightColor) : Color; - - if (Entry->m_Drawings == NULL) return; - GRSetDrawMode(DC, DrawMode); +#define GETCOLOR( l ) Color < 0 ? SetHightColor ?\ + s_ItemSelectColor : (ReturnLayerColor( l ) | SetHightColor) : Color; - for( DEntry = Entry->m_Drawings; DEntry != NULL;DEntry = DEntry->Next()) - { - /* Elimination des elements non relatifs a l'unite */ - if( Multi && DEntry->m_Unit && (DEntry->m_Unit != Multi) ) continue; - if( convert && DEntry->m_Convert && (DEntry->m_Convert != convert) ) - continue; + if( Entry->m_Drawings == NULL ) + return; + GRSetDrawMode( DC, DrawMode ); - if ( DEntry->m_Flags & IS_MOVED ) continue; // Element en deplacement non trace - SetHightColor = (DEntry->m_Selected & IS_SELECTED) ? HIGHT_LIGHT_FLAG : 0; - LineWidth = MAX(DEntry->m_Width, g_DrawMinimunLineWidth); - switch (DEntry->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - { - int xc,yc, x2, y2; - LibDrawArc * Arc = (LibDrawArc *) DEntry; - CharColor = GETCOLOR(LAYER_DEVICE); - xc = Pos.x + TransMat[0][0] * Arc->m_Pos.x + - TransMat[0][1] * Arc->m_Pos.y; - yc = Pos.y + TransMat[1][0] * Arc->m_Pos.x + - TransMat[1][1] * Arc->m_Pos.y; - x2 = Pos.x + TransMat[0][0] * Arc->m_ArcStart.x + - TransMat[0][1] * Arc->m_ArcStart.y;; - y2 = Pos.y + TransMat[1][0] * Arc->m_ArcStart.x + - TransMat[1][1] * Arc->m_ArcStart.y; - x1 = Pos.x + TransMat[0][0] * Arc->m_ArcEnd.x + - TransMat[0][1] * Arc->m_ArcEnd.y;; - y1 = Pos.y + TransMat[1][0] * Arc->m_ArcEnd.x + - TransMat[1][1] * Arc->m_ArcEnd.y; - t1 = Arc->t1; t2 = Arc->t2; - bool swap = MapAngles(&t1, &t2, TransMat); - if ( swap ) { EXCHG(x1,x2); EXCHG(y1, y2) } - fill_option = Arc->m_Fill & (~g_PrintFillMask); - if ( Color < 0 ) // Normal Color Layer - { - if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRFilledArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, - Arc->m_Rayon, Arc->m_Width, CharColor, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( fill_option == FILLED_SHAPE) - GRFilledArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, - Arc->m_Rayon, CharColor, CharColor); + for( DEntry = Entry->m_Drawings; DEntry != NULL; DEntry = DEntry->Next() ) + { + /* Elimination des elements non relatifs a l'unite */ + if( Multi && DEntry->m_Unit && (DEntry->m_Unit != Multi) ) + continue; + if( convert && DEntry->m_Convert && (DEntry->m_Convert != convert) ) + continue; + + if( DEntry->m_Flags & IS_MOVED ) + continue; // Element en deplacement non trace + SetHightColor = (DEntry->m_Selected & IS_SELECTED) ? HIGHT_LIGHT_FLAG : 0; + LineWidth = MAX( DEntry->m_Width, g_DrawMinimunLineWidth ); + + switch( DEntry->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + { + int xc, yc, x2, y2; + LibDrawArc* Arc = (LibDrawArc*) DEntry; + CharColor = GETCOLOR( LAYER_DEVICE ); + xc = Pos.x + TransMat[0][0] * Arc->m_Pos.x + + TransMat[0][1] * Arc->m_Pos.y; + yc = Pos.y + TransMat[1][0] * Arc->m_Pos.x + + TransMat[1][1] * Arc->m_Pos.y; + x2 = Pos.x + TransMat[0][0] * Arc->m_ArcStart.x + + TransMat[0][1] * Arc->m_ArcStart.y;; + y2 = Pos.y + TransMat[1][0] * Arc->m_ArcStart.x + + TransMat[1][1] * Arc->m_ArcStart.y; + x1 = Pos.x + TransMat[0][0] * Arc->m_ArcEnd.x + + TransMat[0][1] * Arc->m_ArcEnd.y;; + y1 = Pos.y + TransMat[1][0] * Arc->m_ArcEnd.x + + TransMat[1][1] * Arc->m_ArcEnd.y; + t1 = Arc->t1; t2 = Arc->t2; + bool swap = MapAngles( &t1, &t2, TransMat ); + if( swap ) + { + EXCHG( x1, x2 ); EXCHG( y1, y2 ) + } + fill_option = Arc->m_Fill & (~g_PrintFillMask); + if( Color < 0 ) // Normal Color Layer + { + if( (fill_option == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRFilledArc( &panel->m_ClipBox, DC, xc, yc, t1, t2, + Arc->m_Rayon, Arc->m_Width, CharColor, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( fill_option == FILLED_SHAPE ) + GRFilledArc( &panel->m_ClipBox, DC, xc, yc, t1, t2, + Arc->m_Rayon, CharColor, CharColor ); #ifdef DRAW_ARC_WITH_ANGLE - else GRArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, - Arc->m_Rayon, LineWidth, CharColor); + else + GRArc( &panel->m_ClipBox, DC, xc, yc, t1, t2, + Arc->m_Rayon, LineWidth, CharColor ); #else - else GRArc1(&panel->m_ClipBox, DC, x1, y1, x2, y2, - xc, yc, LineWidth, CharColor); + else + GRArc1( &panel->m_ClipBox, DC, x1, y1, x2, y2, + xc, yc, LineWidth, CharColor ); #endif - } + } #ifdef DRAW_ARC_WITH_ANGLE - else GRArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, - Arc->m_Rayon, Circle->m_Width, CharColor); + else + GRArc( &panel->m_ClipBox, DC, xc, yc, t1, t2, + Arc->m_Rayon, Circle->m_Width, CharColor ); #else - else GRArc1(&panel->m_ClipBox, DC, x1, y1, x2, y2, - xc, yc, Arc->m_Width, CharColor); + else + GRArc1( &panel->m_ClipBox, DC, x1, y1, x2, y2, + xc, yc, Arc->m_Width, CharColor ); #endif - } - break; + } + break; - case COMPONENT_CIRCLE_DRAW_TYPE: - { - LibDrawCircle * Circle = (LibDrawCircle *) DEntry; - CharColor = GETCOLOR(LAYER_DEVICE); - x1 = Pos.x + TransMat[0][0] * Circle->m_Pos.x + - TransMat[0][1] * Circle->m_Pos.y; - y1 = Pos.y + TransMat[1][0] * Circle->m_Pos.x + - TransMat[1][1] * Circle->m_Pos.y; - fill_option = Circle->m_Fill & (~g_PrintFillMask); - if ( Color < 0 ) - { - if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRFilledCircle(&panel->m_ClipBox, DC, x1, y1, - Circle->m_Rayon, LineWidth, CharColor, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( fill_option == FILLED_SHAPE) - GRFilledCircle(&panel->m_ClipBox, DC, x1, y1, - Circle->m_Rayon, 0, CharColor, CharColor); - else GRCircle(&panel->m_ClipBox, DC, x1, y1, - Circle->m_Rayon, LineWidth, CharColor); - } - else GRCircle(&panel->m_ClipBox, DC, x1, y1, - Circle->m_Rayon, LineWidth, CharColor); - } - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + { + LibDrawCircle* Circle = (LibDrawCircle*) DEntry; + CharColor = GETCOLOR( LAYER_DEVICE ); + x1 = Pos.x + TransMat[0][0] * Circle->m_Pos.x + + TransMat[0][1] * Circle->m_Pos.y; + y1 = Pos.y + TransMat[1][0] * Circle->m_Pos.x + + TransMat[1][1] * Circle->m_Pos.y; + fill_option = Circle->m_Fill & (~g_PrintFillMask); + if( Color < 0 ) + { + if( (fill_option == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRFilledCircle( &panel->m_ClipBox, DC, x1, y1, + Circle->m_Rayon, LineWidth, CharColor, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( fill_option == FILLED_SHAPE ) + GRFilledCircle( &panel->m_ClipBox, DC, x1, y1, + Circle->m_Rayon, 0, CharColor, CharColor ); + else + GRCircle( &panel->m_ClipBox, DC, x1, y1, + Circle->m_Rayon, LineWidth, CharColor ); + } + else + GRCircle( &panel->m_ClipBox, DC, x1, y1, + Circle->m_Rayon, LineWidth, CharColor ); + } + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - { - LibDrawText * Text = (LibDrawText *) DEntry; - CharColor = GETCOLOR(LAYER_DEVICE); + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + { + LibDrawText* Text = (LibDrawText*) DEntry; + CharColor = GETCOLOR( LAYER_DEVICE ); - /* The text orientation may need to be flipped if the - transformation matrix cuases xy axes to be flipped. */ - t1 = (TransMat[0][0] != 0) ^ (Text->m_Horiz != 0); - x1 = Pos.x + TransMat[0][0] * Text->m_Pos.x - + TransMat[0][1] * Text->m_Pos.y; - y1 = Pos.y + TransMat[1][0] * Text->m_Pos.x - + TransMat[1][1] * Text->m_Pos.y; - DrawGraphicText(panel, DC, wxPoint(x1, y1), CharColor, Text->m_Text, - t1 ? TEXT_ORIENT_HORIZ : TEXT_ORIENT_VERT, - Text->m_Size, - GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, LineWidth); - } - break; + /* The text orientation may need to be flipped if the + * transformation matrix cuases xy axes to be flipped. */ + t1 = (TransMat[0][0] != 0) ^ (Text->m_Horiz != 0); + x1 = Pos.x + TransMat[0][0] * Text->m_Pos.x + + TransMat[0][1] * Text->m_Pos.y; + y1 = Pos.y + TransMat[1][0] * Text->m_Pos.x + + TransMat[1][1] * Text->m_Pos.y; + DrawGraphicText( panel, DC, wxPoint( x1, y1 ), CharColor, Text->m_Text, + t1 ? TEXT_ORIENT_HORIZ : TEXT_ORIENT_VERT, + Text->m_Size, + GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, LineWidth ); + } + break; - case COMPONENT_RECT_DRAW_TYPE: - { - LibDrawSquare * Square = (LibDrawSquare *) DEntry; - CharColor = GETCOLOR(LAYER_DEVICE); + case COMPONENT_RECT_DRAW_TYPE: + { + LibDrawSquare* Square = (LibDrawSquare*) DEntry; + CharColor = GETCOLOR( LAYER_DEVICE ); - x1 = Pos.x + TransMat[0][0] * Square->m_Pos.x - + TransMat[0][1] * Square->m_Pos.y; - y1 = Pos.y + TransMat[1][0] * Square->m_Pos.x - + TransMat[1][1] * Square->m_Pos.y; - x2 = Pos.x + TransMat[0][0] * Square->m_End.x - + TransMat[0][1] * Square->m_End.y; - y2 = Pos.y + TransMat[1][0] * Square->m_End.x - + TransMat[1][1] * Square->m_End.y; - fill_option = Square->m_Fill & (~g_PrintFillMask); - if ( Color < 0 ) - { - if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRFilledRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, - CharColor, LineWidth, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( fill_option == FILLED_SHAPE) - GRFilledRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, - CharColor, CharColor); - else GRRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, - LineWidth, CharColor); - } - else GRRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, - LineWidth, CharColor); - } - break; + x1 = Pos.x + TransMat[0][0] * Square->m_Pos.x + + TransMat[0][1] * Square->m_Pos.y; + y1 = Pos.y + TransMat[1][0] * Square->m_Pos.x + + TransMat[1][1] * Square->m_Pos.y; + x2 = Pos.x + TransMat[0][0] * Square->m_End.x + + TransMat[0][1] * Square->m_End.y; + y2 = Pos.y + TransMat[1][0] * Square->m_End.x + + TransMat[1][1] * Square->m_End.y; + fill_option = Square->m_Fill & (~g_PrintFillMask); + if( Color < 0 ) + { + if( (fill_option == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRFilledRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, + CharColor, LineWidth, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( fill_option == FILLED_SHAPE ) + GRFilledRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, + CharColor, CharColor ); + else + GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, + LineWidth, CharColor ); + } + else + GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, + LineWidth, CharColor ); + } + break; - case COMPONENT_PIN_DRAW_TYPE: /* Trace des Pins */ - { - LibDrawPin * Pin = (LibDrawPin *) DEntry; - if(Pin->m_Attributs & PINNOTDRAW) - { - if( (ActiveScreen->m_Type == SCHEMATIC_FRAME) && - !g_ShowAllPins ) - break; - } - /* Calcul de l'orientation reelle de la Pin */ - orient = Pin->ReturnPinDrawOrient(TransMat); + case COMPONENT_PIN_DRAW_TYPE: /* Trace des Pins */ + { + LibDrawPin* Pin = (LibDrawPin*) DEntry; + if( Pin->m_Attributs & PINNOTDRAW ) + { + if( (ActiveScreen->m_Type == SCHEMATIC_FRAME) + && !g_ShowAllPins ) + break; + } + /* Calcul de l'orientation reelle de la Pin */ + orient = Pin->ReturnPinDrawOrient( TransMat ); - /* Calcul de la position du point de reference */ - x2 = Pos.x + (TransMat[0][0] * Pin->m_Pos.x) - + (TransMat[0][1] * Pin->m_Pos.y); - y2 = Pos.y + (TransMat[1][0] * Pin->m_Pos.x) - + (TransMat[1][1] * Pin->m_Pos.y); + /* Calcul de la position du point de reference */ + x2 = Pos.x + (TransMat[0][0] * Pin->m_Pos.x) + + (TransMat[0][1] * Pin->m_Pos.y); + y2 = Pos.y + (TransMat[1][0] * Pin->m_Pos.x) + + (TransMat[1][1] * Pin->m_Pos.y); - /* Dessin de la pin et du symbole special associe */ - CharColor = GETCOLOR(LAYER_PIN); - Pin->DrawPinSymbol(panel, DC, wxPoint(x2, y2) , orient, DrawMode, CharColor ); + /* Dessin de la pin et du symbole special associe */ + CharColor = GETCOLOR( LAYER_PIN ); + Pin->DrawPinSymbol( panel, DC, wxPoint( x2, y2 ), orient, DrawMode, CharColor ); - if ( DrawPinText ) - { - wxPoint pinpos(x2,y2); - CharColor = SetHightColor ? s_ItemSelectColor : Color; - Pin->DrawPinTexts(panel, DC, pinpos, orient, - Entry->m_TextInside, - Entry->m_DrawPinNum,Entry->m_DrawPinName, - CharColor, DrawMode); - } - } - break; + if( DrawPinText ) + { + wxPoint pinpos( x2, y2 ); - case COMPONENT_POLYLINE_DRAW_TYPE: - { - LibDrawPolyline * polyline = (LibDrawPolyline *) DEntry; - CharColor = GETCOLOR(LAYER_DEVICE); - if ( Buf_Poly_Drawings == NULL ) - { - Buf_Poly_Size = polyline->n; - Buf_Poly_Drawings = (int *) MyMalloc(sizeof(int) * 2 * Buf_Poly_Size); - } - else if ( Buf_Poly_Size < polyline->n ) - { - Buf_Poly_Size = polyline->n; - Buf_Poly_Drawings = (int *) realloc(Buf_Poly_Drawings, - sizeof(int) * 2 * Buf_Poly_Size); - } - for (i = 0; i < polyline->n; i++) - { - Buf_Poly_Drawings[i * 2] = Pos.x + - TransMat[0][0] * polyline->PolyList[i * 2] + - TransMat[0][1] * polyline->PolyList[i * 2 + 1]; - Buf_Poly_Drawings[i * 2 + 1] = Pos.y + - TransMat[1][0] * polyline->PolyList[i * 2] + - TransMat[1][1] * polyline->PolyList[i * 2 + 1]; - } - fill_option = polyline->m_Fill & (~g_PrintFillMask); - if ( Color < 0 ) - { - if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRPoly(&panel->m_ClipBox, DC, polyline->n, - Buf_Poly_Drawings, 1, LineWidth, CharColor, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( fill_option == FILLED_SHAPE ) - GRPoly(&panel->m_ClipBox, DC, polyline->n, - Buf_Poly_Drawings, 1, LineWidth, CharColor, CharColor); - else GRPoly(&panel->m_ClipBox, DC, polyline->n, - Buf_Poly_Drawings, 0, LineWidth, CharColor, CharColor); - } - else GRPoly(&panel->m_ClipBox, DC, polyline->n, - Buf_Poly_Drawings, 0, LineWidth, CharColor, CharColor); - } - break; + CharColor = SetHightColor ? s_ItemSelectColor : Color; + Pin->DrawPinTexts( panel, DC, pinpos, orient, + Entry->m_TextInside, + Entry->m_DrawPinNum, Entry->m_DrawPinName, + CharColor, DrawMode ); + } + } + break; - default: - wxBell(); - break; - } /* Fin Switch */ - } /* Fin Boucle de dessin */ - if ( g_DebugLevel > 4 ) /* Draw the component boundary box */ - { - EDA_Rect BoundaryBox; - if ( Component ) BoundaryBox = Component->GetBoundaryBox(); - else BoundaryBox = Entry->GetBoundaryBox(Multi, convert); - x1 = BoundaryBox.GetX(); - y1 = BoundaryBox.GetY(); - x2 = BoundaryBox.GetRight(); - y2 = BoundaryBox.GetBottom(); - GRRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN); - BoundaryBox = Component->m_Field[REFERENCE].GetBoundaryBox(); - x1 = BoundaryBox.GetX(); - y1 = BoundaryBox.GetY(); - x2 = BoundaryBox.GetRight(); - y2 = BoundaryBox.GetBottom(); - GRRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN); - BoundaryBox = Component->m_Field[VALUE].GetBoundaryBox(); - x1 = BoundaryBox.GetX(); - y1 = BoundaryBox.GetY(); - x2 = BoundaryBox.GetRight(); - y2 = BoundaryBox.GetBottom(); - GRRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN); - } + case COMPONENT_POLYLINE_DRAW_TYPE: + { + LibDrawPolyline* polyline = (LibDrawPolyline*) DEntry; + CharColor = GETCOLOR( LAYER_DEVICE ); + if( Buf_Poly_Drawings == NULL ) + { + Buf_Poly_Size = polyline->n; + Buf_Poly_Drawings = (int*) MyMalloc( sizeof(int) * 2 * Buf_Poly_Size ); + } + else if( Buf_Poly_Size < polyline->n ) + { + Buf_Poly_Size = polyline->n; + Buf_Poly_Drawings = (int*) realloc( Buf_Poly_Drawings, + sizeof(int) * 2 * Buf_Poly_Size ); + } + for( i = 0; i < polyline->n; i++ ) + { + Buf_Poly_Drawings[i * 2] = Pos.x + + TransMat[0][0] * polyline->PolyList[i * 2] + + TransMat[0][1] * polyline->PolyList[i * 2 + 1]; + Buf_Poly_Drawings[i * 2 + 1] = Pos.y + + TransMat[1][0] * polyline->PolyList[i * 2] + + TransMat[1][1] * polyline->PolyList[i * 2 + 1]; + } + + fill_option = polyline->m_Fill & (~g_PrintFillMask); + if( Color < 0 ) + { + if( (fill_option == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRPoly( &panel->m_ClipBox, DC, polyline->n, + Buf_Poly_Drawings, 1, LineWidth, CharColor, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( fill_option == FILLED_SHAPE ) + GRPoly( &panel->m_ClipBox, DC, polyline->n, + Buf_Poly_Drawings, 1, LineWidth, CharColor, CharColor ); + else + GRPoly( &panel->m_ClipBox, DC, polyline->n, + Buf_Poly_Drawings, 0, LineWidth, CharColor, CharColor ); + } + else + GRPoly( &panel->m_ClipBox, DC, polyline->n, + Buf_Poly_Drawings, 0, LineWidth, CharColor, CharColor ); + } + break; + + default: + wxBell(); + break; + } + + /* Fin Switch */ + } + + /* Fin Boucle de dessin */ + if( g_DebugLevel > 4 ) /* Draw the component boundary box */ + { + EDA_Rect BoundaryBox; + if( Component ) + BoundaryBox = Component->GetBoundaryBox(); + else + BoundaryBox = Entry->GetBoundaryBox( Multi, convert ); + x1 = BoundaryBox.GetX(); + y1 = BoundaryBox.GetY(); + x2 = BoundaryBox.GetRight(); + y2 = BoundaryBox.GetBottom(); + GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN ); + BoundaryBox = Component->m_Field[REFERENCE].GetBoundaryBox(); + x1 = BoundaryBox.GetX(); + y1 = BoundaryBox.GetY(); + x2 = BoundaryBox.GetRight(); + y2 = BoundaryBox.GetBottom(); + GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN ); + BoundaryBox = Component->m_Field[VALUE].GetBoundaryBox(); + x1 = BoundaryBox.GetX(); + y1 = BoundaryBox.GetY(); + x2 = BoundaryBox.GetRight(); + y2 = BoundaryBox.GetBottom(); + GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN ); + } } /********************************************************************************/ -void LibDrawPin::DrawPinSymbol(WinEDA_DrawPanel * panel, wxDC * DC, - const wxPoint & pin_pos, int orient, int DrawMode, int Color) +void LibDrawPin::DrawPinSymbol( WinEDA_DrawPanel* panel, wxDC* DC, + const wxPoint& pin_pos, int orient, int DrawMode, int Color ) /*******************************************************************************/ /* Draw the pin symbol (without texts) - if Color != 0 draw with Color, eles with the normal pin color -*/ + * if Color != 0 draw with Color, eles with the normal pin color + */ { -int MapX1, MapY1, x1, y1; -int color; -int width = MAX(m_Width, g_DrawMinimunLineWidth); -int posX = pin_pos.x, posY = pin_pos.y, len = m_PinLen; - - - if( Color >= 0) color = Color; - else color = ReturnLayerColor(LAYER_PIN); - GRSetDrawMode(DC, DrawMode); + int MapX1, MapY1, x1, y1; + int color; + int width = MAX( m_Width, g_DrawMinimunLineWidth ); + int posX = pin_pos.x, posY = pin_pos.y, len = m_PinLen; - MapX1 = MapY1 = 0; x1 = posX; y1 = posY; - switch ( orient ) - { - case PIN_UP: - y1 = posY - len; MapY1 = 1; - break; - case PIN_DOWN: - y1 = posY + len; MapY1 = -1; - break; - case PIN_LEFT: - x1 = posX - len, MapX1 = 1; - break; - case PIN_RIGHT: - x1 = posX + len; MapX1 = -1; - break; - } - - if( m_PinShape & INVERT) - { - GRCircle(&panel->m_ClipBox, DC, MapX1 * INVERT_PIN_RADIUS + x1, - MapY1 * INVERT_PIN_RADIUS + y1, - INVERT_PIN_RADIUS, width, color); - - GRMoveTo(MapX1 * INVERT_PIN_RADIUS * 2 + x1, - MapY1 * INVERT_PIN_RADIUS * 2 + y1); - GRLineTo(&panel->m_ClipBox, DC, posX, posY, width, color); - } - - else - { - GRMoveTo(x1, y1); - GRLineTo(&panel->m_ClipBox, DC, posX, posY, width, color); - } - - if(m_PinShape & CLOCK) - { - if(MapY1 == 0 ) /* MapX1 = +- 1 */ - { - GRMoveTo(x1, y1 + CLOCK_PIN_DIM); - GRLineTo(&panel->m_ClipBox, DC, x1 - MapX1 * CLOCK_PIN_DIM, y1, width, color); - GRLineTo(&panel->m_ClipBox, DC, x1, y1 - CLOCK_PIN_DIM, width, color); - } - else /* MapX1 = 0 */ - { - GRMoveTo(x1 + CLOCK_PIN_DIM, y1 ); - GRLineTo(&panel->m_ClipBox, DC, x1, y1 - MapY1 * CLOCK_PIN_DIM, width, color); - GRLineTo(&panel->m_ClipBox, DC, x1 - CLOCK_PIN_DIM, y1, width, color); - } - } - - if(m_PinShape & LOWLEVEL_IN) /* IEEE symbol "Active Low Input" */ - { - if(MapY1 == 0 ) /* MapX1 = +- 1 */ - { - GRMoveTo(x1 + MapX1 * IEEE_SYMBOL_PIN_DIM*2, y1); - GRLineTo(&panel->m_ClipBox, DC, x1 + MapX1 * IEEE_SYMBOL_PIN_DIM*2, - y1 - IEEE_SYMBOL_PIN_DIM, width, color); - GRLineTo(&panel->m_ClipBox, DC, x1, y1, width, color); - } - else /* MapX1 = 0 */ - { - GRMoveTo(x1, y1 + MapY1 * IEEE_SYMBOL_PIN_DIM*2); - GRLineTo(&panel->m_ClipBox, DC, x1 - IEEE_SYMBOL_PIN_DIM, - y1 + MapY1 * IEEE_SYMBOL_PIN_DIM*2, width, color); - GRLineTo(&panel->m_ClipBox, DC, x1 , y1, width, color); - } - } + if( Color >= 0 ) + color = Color; + else + color = ReturnLayerColor( LAYER_PIN ); + GRSetDrawMode( DC, DrawMode ); - if(m_PinShape & LOWLEVEL_OUT) /* IEEE symbol "Active Low Output" */ - { - if(MapY1 == 0 ) /* MapX1 = +- 1 */ - { - GRMoveTo(x1, y1 - IEEE_SYMBOL_PIN_DIM); - GRLineTo(&panel->m_ClipBox, DC, x1 + MapX1 * IEEE_SYMBOL_PIN_DIM*2, y1, width, color); - } - else /* MapX1 = 0 */ - { - GRMoveTo(x1 - IEEE_SYMBOL_PIN_DIM, y1); - GRLineTo(&panel->m_ClipBox, DC, x1 , y1 + MapY1 * IEEE_SYMBOL_PIN_DIM*2, width, color); - } - } + MapX1 = MapY1 = 0; x1 = posX; y1 = posY; - /* Draw the pin end target (active end of the pin) */ - if ( ! g_IsPrinting ) // Draw but do not print the pin end target 1 pixel width */ - GRCircle(&panel->m_ClipBox, DC, posX,posY,TARGET_PIN_DIAM, 0, color); + switch( orient ) + { + case PIN_UP: + y1 = posY - len; MapY1 = 1; + break; + + case PIN_DOWN: + y1 = posY + len; MapY1 = -1; + break; + + case PIN_LEFT: + x1 = posX - len, MapX1 = 1; + break; + + case PIN_RIGHT: + x1 = posX + len; MapX1 = -1; + break; + } + + if( m_PinShape & INVERT ) + { + GRCircle( &panel->m_ClipBox, DC, MapX1 * INVERT_PIN_RADIUS + x1, + MapY1 * INVERT_PIN_RADIUS + y1, + INVERT_PIN_RADIUS, width, color ); + + GRMoveTo( MapX1 * INVERT_PIN_RADIUS * 2 + x1, + MapY1 * INVERT_PIN_RADIUS * 2 + y1 ); + GRLineTo( &panel->m_ClipBox, DC, posX, posY, width, color ); + } + else + { + GRMoveTo( x1, y1 ); + GRLineTo( &panel->m_ClipBox, DC, posX, posY, width, color ); + } + + if( m_PinShape & CLOCK ) + { + if( MapY1 == 0 ) /* MapX1 = +- 1 */ + { + GRMoveTo( x1, y1 + CLOCK_PIN_DIM ); + GRLineTo( &panel->m_ClipBox, DC, x1 - MapX1 * CLOCK_PIN_DIM, y1, width, color ); + GRLineTo( &panel->m_ClipBox, DC, x1, y1 - CLOCK_PIN_DIM, width, color ); + } + else /* MapX1 = 0 */ + { + GRMoveTo( x1 + CLOCK_PIN_DIM, y1 ); + GRLineTo( &panel->m_ClipBox, DC, x1, y1 - MapY1 * CLOCK_PIN_DIM, width, color ); + GRLineTo( &panel->m_ClipBox, DC, x1 - CLOCK_PIN_DIM, y1, width, color ); + } + } + + if( m_PinShape & LOWLEVEL_IN ) /* IEEE symbol "Active Low Input" */ + { + if( MapY1 == 0 ) /* MapX1 = +- 1 */ + { + GRMoveTo( x1 + MapX1 * IEEE_SYMBOL_PIN_DIM * 2, y1 ); + GRLineTo( &panel->m_ClipBox, DC, x1 + MapX1 * IEEE_SYMBOL_PIN_DIM * 2, + y1 - IEEE_SYMBOL_PIN_DIM, width, color ); + GRLineTo( &panel->m_ClipBox, DC, x1, y1, width, color ); + } + else /* MapX1 = 0 */ + { + GRMoveTo( x1, y1 + MapY1 * IEEE_SYMBOL_PIN_DIM * 2 ); + GRLineTo( &panel->m_ClipBox, DC, x1 - IEEE_SYMBOL_PIN_DIM, + y1 + MapY1 * IEEE_SYMBOL_PIN_DIM * 2, width, color ); + GRLineTo( &panel->m_ClipBox, DC, x1, y1, width, color ); + } + } + + + if( m_PinShape & LOWLEVEL_OUT ) /* IEEE symbol "Active Low Output" */ + { + if( MapY1 == 0 ) /* MapX1 = +- 1 */ + { + GRMoveTo( x1, y1 - IEEE_SYMBOL_PIN_DIM ); + GRLineTo( &panel->m_ClipBox, + DC, + x1 + MapX1 * IEEE_SYMBOL_PIN_DIM * 2, + y1, + width, + color ); + } + else /* MapX1 = 0 */ + { + GRMoveTo( x1 - IEEE_SYMBOL_PIN_DIM, y1 ); + GRLineTo( &panel->m_ClipBox, + DC, + x1, + y1 + MapY1 * IEEE_SYMBOL_PIN_DIM * 2, + width, + color ); + } + } + + /* Draw the pin end target (active end of the pin) */ + if( !g_IsPrinting ) // Draw but do not print the pin end target 1 pixel width */ + GRCircle( &panel->m_ClipBox, DC, posX, posY, TARGET_PIN_DIAM, 0, color ); } @@ -744,56 +822,58 @@ int posX = pin_pos.x, posY = pin_pos.y, len = m_PinLen; * transform (only mirror and rotate so it remains on the unit circle) to * * a new point which is used to detect new angle. * *****************************************************************************/ -bool MapAngles(int *Angle1, int *Angle2, int TransMat[2][2]) +bool MapAngles( int* Angle1, int* Angle2, int TransMat[2][2] ) { -int Angle, Delta; -double x, y, t; -bool swap = FALSE; + int Angle, Delta; + double x, y, t; + bool swap = FALSE; - Delta = *Angle2 - *Angle1; - if ( Delta >= 1800 ) - { - *Angle1 -=1; - *Angle2 +=1; - } - - x = cos(*Angle1 * M_PI / 1800.0); - y = sin(*Angle1 * M_PI / 1800.0); - t = x * TransMat[0][0] + y * TransMat[0][1]; - y = x * TransMat[1][0] + y * TransMat[1][1]; - x = t; - *Angle1 = (int) (atan2(y, x) * 1800.0 / M_PI + 0.5); + Delta = *Angle2 - *Angle1; + if( Delta >= 1800 ) + { + *Angle1 -= 1; + *Angle2 += 1; + } - x = cos(*Angle2 * M_PI / 1800.0); - y = sin(*Angle2 * M_PI / 1800.0); - t = x * TransMat[0][0] + y * TransMat[0][1]; - y = x * TransMat[1][0] + y * TransMat[1][1]; - x = t; - *Angle2 = (int) (atan2(y, x) * 1800.0 / M_PI + 0.5); + x = cos( *Angle1 * M_PI / 1800.0 ); + y = sin( *Angle1 * M_PI / 1800.0 ); + t = x * TransMat[0][0] + y * TransMat[0][1]; + y = x * TransMat[1][0] + y * TransMat[1][1]; + x = t; + *Angle1 = (int) (atan2( y, x ) * 1800.0 / M_PI + 0.5); - NORMALIZE_ANGLE(*Angle1); - NORMALIZE_ANGLE(*Angle2); - if (*Angle2 < *Angle1) *Angle2 += 3600; + x = cos( *Angle2 * M_PI / 1800.0 ); + y = sin( *Angle2 * M_PI / 1800.0 ); + t = x * TransMat[0][0] + y * TransMat[0][1]; + y = x * TransMat[1][0] + y * TransMat[1][1]; + x = t; + *Angle2 = (int) (atan2( y, x ) * 1800.0 / M_PI + 0.5); - if (*Angle2 - *Angle1 > 1800) - { /* Need to swap the two angles. */ - Angle = (*Angle1); - *Angle1 = (*Angle2); - *Angle2 = Angle; + NORMALIZE_ANGLE( *Angle1 ); + NORMALIZE_ANGLE( *Angle2 ); + if( *Angle2 < *Angle1 ) + *Angle2 += 3600; - NORMALIZE_ANGLE(*Angle1); - NORMALIZE_ANGLE(*Angle2); - if (*Angle2 < *Angle1) *Angle2 += 3600; - swap = TRUE; - } + if( *Angle2 - *Angle1 > 1800 ) + { /* Need to swap the two angles. */ + Angle = (*Angle1); + *Angle1 = (*Angle2); + *Angle2 = Angle; - if ( Delta >= 1800 ) - { - *Angle1 +=1; - *Angle2 -=1; - } - - return swap; + NORMALIZE_ANGLE( *Angle1 ); + NORMALIZE_ANGLE( *Angle2 ); + if( *Angle2 < *Angle1 ) + *Angle2 += 3600; + swap = TRUE; + } + + if( Delta >= 1800 ) + { + *Angle1 += 1; + *Angle2 -= 1; + } + + return swap; } @@ -801,186 +881,200 @@ bool swap = FALSE; * Routine to display an outline version of given library entry. * * This routine is applied by the PlaceLibItem routine above. * *****************************************************************************/ -void DrawingLibInGhost(WinEDA_DrawPanel * panel, wxDC * DC, - EDA_LibComponentStruct *LibEntry, - EDA_SchComponentStruct *DrawLibItem, int PartX, int PartY, - int multi, int convert, int Color, bool DrawPinText) +void DrawingLibInGhost( WinEDA_DrawPanel* panel, wxDC* DC, + EDA_LibComponentStruct* LibEntry, + EDA_SchComponentStruct* DrawLibItem, int PartX, int PartY, + int multi, int convert, int Color, bool DrawPinText ) { -int DrawMode = g_XorMode; - - DrawLibPartAux(panel, DC, DrawLibItem, LibEntry, wxPoint(PartX, PartY), - DrawLibItem->m_Transform, - multi, convert, DrawMode, Color, DrawPinText); + int DrawMode = g_XorMode; + DrawLibPartAux( panel, DC, DrawLibItem, LibEntry, wxPoint( PartX, PartY ), + DrawLibItem->m_Transform, + multi, convert, DrawMode, Color, DrawPinText ); } + /************************************************************/ /* Routine to draw One LibraryDrawStruct at given position, */ /* matrice de transformation 1 0 0 -1 (normale) */ /* DrawMode = GrXOR, GrOR .. */ /************************************************************/ /* Utilise en LibEdit et Lib Browse */ -void DrawLibraryDrawStruct(WinEDA_DrawPanel * panel, wxDC * DC, - EDA_LibComponentStruct *LibEntry, - int PartX, int PartY, - LibEDA_BaseStruct *DrawItem, int Multi, - int DrawMode, int Color) +void DrawLibraryDrawStruct( WinEDA_DrawPanel* panel, wxDC* DC, + EDA_LibComponentStruct* LibEntry, + int PartX, int PartY, + LibEDA_BaseStruct* DrawItem, int Multi, + int DrawMode, int Color ) { -int i, x1, y1, x2, y2, t1, t2, orient; -int CharColor; -int TransMat[2][2]; -int fill_option; + int i, x1, y1, x2, y2, t1, t2, orient; + int CharColor; + int TransMat[2][2]; + int fill_option; #undef GETCOLOR -#define GETCOLOR(l) Color < 0 ? ReturnLayerColor(l) : Color; +#define GETCOLOR( l ) Color < 0 ? ReturnLayerColor( l ) : Color; - Multi = 0; /* unused */ - /* Trace de la structure */ - CharColor = GETCOLOR(LAYER_DEVICE); - GRSetDrawMode(DC, DrawMode); + Multi = 0; /* unused */ + /* Trace de la structure */ + CharColor = GETCOLOR( LAYER_DEVICE ); + GRSetDrawMode( DC, DrawMode ); - TransMat[0][0] = 1; - TransMat[0][1] = TransMat[1][0] = 0; - TransMat[1][1] = -1; + TransMat[0][0] = 1; + TransMat[0][1] = TransMat[1][0] = 0; + TransMat[1][1] = -1; - int LineWidth = MAX(DrawItem->m_Width, g_DrawMinimunLineWidth); + int LineWidth = MAX( DrawItem->m_Width, g_DrawMinimunLineWidth ); - switch (DrawItem->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - { - int xc,yc, x2,y2; - LibDrawArc * Arc = (LibDrawArc *) DrawItem; - t1 = Arc->t1; t2 = Arc->t2; - bool swap = MapAngles(&t1, &t2, TransMat); - xc = PartX + Arc->m_Pos.x; - yc = PartY - Arc->m_Pos.y; - x2 = PartX + Arc->m_ArcStart.x; - y2 = PartY - Arc->m_ArcStart.y; - x1 = PartX + Arc->m_ArcEnd.x; - y1 = PartY - Arc->m_ArcEnd.y; - - if ( swap ) { EXCHG(x1,x2); EXCHG(y1, y2)} - fill_option = Arc->m_Fill & (~g_PrintFillMask); - if ( (Arc->m_Fill == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRFilledArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, - Arc->m_Rayon, CharColor, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( Arc->m_Fill == FILLED_SHAPE) - GRFilledArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, - Arc->m_Rayon, LineWidth, CharColor, CharColor); + switch( DrawItem->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + { + int xc, yc, x2, y2; + LibDrawArc* Arc = (LibDrawArc*) DrawItem; + t1 = Arc->t1; t2 = Arc->t2; + bool swap = MapAngles( &t1, &t2, TransMat ); + xc = PartX + Arc->m_Pos.x; + yc = PartY - Arc->m_Pos.y; + x2 = PartX + Arc->m_ArcStart.x; + y2 = PartY - Arc->m_ArcStart.y; + x1 = PartX + Arc->m_ArcEnd.x; + y1 = PartY - Arc->m_ArcEnd.y; + + if( swap ) + { + EXCHG( x1, x2 ); EXCHG( y1, y2 ) + } + fill_option = Arc->m_Fill & (~g_PrintFillMask); + if( (Arc->m_Fill == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRFilledArc( &panel->m_ClipBox, DC, xc, yc, t1, t2, + Arc->m_Rayon, CharColor, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( Arc->m_Fill == FILLED_SHAPE ) + GRFilledArc( &panel->m_ClipBox, DC, xc, yc, t1, t2, + Arc->m_Rayon, LineWidth, CharColor, CharColor ); #ifdef DRAW_ARC_WITH_ANGLE - else GRArc(&panel->m_ClipBox, DC, xc, yc, t1, t2, - Arc->m_Rayon, CharColor); + else + GRArc( &panel->m_ClipBox, DC, xc, yc, t1, t2, + Arc->m_Rayon, CharColor ); #else - else GRArc1(&panel->m_ClipBox, DC, x1, y1, x2, y2, - xc, yc, LineWidth, CharColor); + else + GRArc1( &panel->m_ClipBox, DC, x1, y1, x2, y2, + xc, yc, LineWidth, CharColor ); #endif - } - break; + } + break; - case COMPONENT_CIRCLE_DRAW_TYPE: - { - LibDrawCircle * Circle = (LibDrawCircle *) DrawItem; - x1 = PartX + Circle->m_Pos.x; - y1 = PartY - Circle->m_Pos.y; - fill_option = Circle->m_Fill & (~g_PrintFillMask); - if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRFilledCircle(&panel->m_ClipBox, DC, x1, y1, - Circle->m_Rayon, LineWidth, CharColor, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( fill_option == FILLED_SHAPE) - GRFilledCircle(&panel->m_ClipBox, DC, x1, y1, - Circle->m_Rayon, 0, CharColor, CharColor); - else GRCircle(&panel->m_ClipBox, DC, x1, y1, - Circle->m_Rayon, LineWidth, CharColor); - } - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + { + LibDrawCircle* Circle = (LibDrawCircle*) DrawItem; + x1 = PartX + Circle->m_Pos.x; + y1 = PartY - Circle->m_Pos.y; + fill_option = Circle->m_Fill & (~g_PrintFillMask); + if( (fill_option == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRFilledCircle( &panel->m_ClipBox, DC, x1, y1, + Circle->m_Rayon, LineWidth, CharColor, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( fill_option == FILLED_SHAPE ) + GRFilledCircle( &panel->m_ClipBox, DC, x1, y1, + Circle->m_Rayon, 0, CharColor, CharColor ); + else + GRCircle( &panel->m_ClipBox, DC, x1, y1, + Circle->m_Rayon, LineWidth, CharColor ); + } + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - { - LibDrawText * Text = (LibDrawText *) DrawItem; - x1 = PartX + Text->m_Pos.x; - y1 = PartY - Text->m_Pos.y; - DrawGraphicText(panel, DC, wxPoint(x1, y1), CharColor, Text->m_Text, - Text->m_Horiz, - Text->m_Size, - GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, LineWidth); - } - break; + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + { + LibDrawText* Text = (LibDrawText*) DrawItem; + x1 = PartX + Text->m_Pos.x; + y1 = PartY - Text->m_Pos.y; + DrawGraphicText( panel, DC, wxPoint( x1, y1 ), CharColor, Text->m_Text, + Text->m_Horiz, + Text->m_Size, + GR_TEXT_HJUSTIFY_CENTER, GR_TEXT_VJUSTIFY_CENTER, LineWidth ); + } + break; - case COMPONENT_RECT_DRAW_TYPE: - { - LibDrawSquare * Square = (LibDrawSquare *) DrawItem; - x1 = PartX + Square->m_Pos.x; - y1 = PartY - Square->m_Pos.y; - x2 = PartX + Square->m_End.x; - y2 = PartY - Square->m_End.y; - fill_option = Square->m_Fill & (~g_PrintFillMask); - if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRFilledRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, - CharColor, LineWidth, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( fill_option == FILLED_SHAPE) - GRFilledRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, - CharColor, CharColor); - else GRRect(&panel->m_ClipBox, DC, x1, y1, x2, y2, LineWidth, - CharColor); - } - break; + case COMPONENT_RECT_DRAW_TYPE: + { + LibDrawSquare* Square = (LibDrawSquare*) DrawItem; + x1 = PartX + Square->m_Pos.x; + y1 = PartY - Square->m_Pos.y; + x2 = PartX + Square->m_End.x; + y2 = PartY - Square->m_End.y; + fill_option = Square->m_Fill & (~g_PrintFillMask); + if( (fill_option == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRFilledRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, + CharColor, LineWidth, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( fill_option == FILLED_SHAPE ) + GRFilledRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, + CharColor, CharColor ); + else + GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, LineWidth, + CharColor ); + } + break; - case COMPONENT_PIN_DRAW_TYPE: /* Trace des Pins */ - { - LibDrawPin * Pin = (LibDrawPin *) DrawItem; - x2 = PartX + Pin->m_Pos.x; - y2 = PartY - Pin->m_Pos.y; - /* Compute the real pin orientation, i.e. pin orient + component orient */ - orient = Pin->ReturnPinDrawOrient(TransMat); + case COMPONENT_PIN_DRAW_TYPE: /* Trace des Pins */ + { + LibDrawPin* Pin = (LibDrawPin*) DrawItem; + x2 = PartX + Pin->m_Pos.x; + y2 = PartY - Pin->m_Pos.y; + /* Compute the real pin orientation, i.e. pin orient + component orient */ + orient = Pin->ReturnPinDrawOrient( TransMat ); - /* Dessin de la pin et du symbole special associe */ - if( Pin->m_Attributs & PINNOTDRAW) CharColor = DARKGRAY; - else CharColor = -1; + /* Dessin de la pin et du symbole special associe */ + if( Pin->m_Attributs & PINNOTDRAW ) + CharColor = DARKGRAY; + else + CharColor = -1; - Pin->DrawPinSymbol(panel, DC, wxPoint(x2, y2), orient, DrawMode); - wxPoint pinpos(x2,y2); - Pin->DrawPinTexts(panel, DC, pinpos, orient, - LibEntry->m_TextInside, - LibEntry->m_DrawPinNum,LibEntry->m_DrawPinName, - CharColor, DrawMode); - } - break; + Pin->DrawPinSymbol( panel, DC, wxPoint( x2, y2 ), orient, DrawMode ); + wxPoint pinpos( x2, y2 ); - case COMPONENT_POLYLINE_DRAW_TYPE: - { - LibDrawPolyline * polyline = (LibDrawPolyline *) DrawItem; - if ( Buf_Poly_Drawings == NULL ) - { - Buf_Poly_Size = polyline->n; - Buf_Poly_Drawings = (int *) MyMalloc(sizeof(int) * 2 * Buf_Poly_Size); - } - else if ( Buf_Poly_Size < polyline->n ) - { - Buf_Poly_Size = polyline->n; - Buf_Poly_Drawings = (int *) realloc(Buf_Poly_Drawings, - sizeof(int) * 2 * Buf_Poly_Size); - } - for (i = 0; i < polyline->n; i++) - { - Buf_Poly_Drawings[i * 2] = PartX + polyline->PolyList[i * 2]; - Buf_Poly_Drawings[i * 2 + 1] = PartY - polyline->PolyList[i * 2 + 1]; - } - fill_option = polyline->m_Fill & (~g_PrintFillMask); - if ( (fill_option == FILLED_WITH_BG_BODYCOLOR) && ! g_IsPrinting ) - GRPoly(&panel->m_ClipBox, DC, polyline->n, - Buf_Poly_Drawings, 1, LineWidth, CharColor, - ReturnLayerColor(LAYER_DEVICE_BACKGROUND)); - else if ( fill_option == FILLED_SHAPE ) - GRPoly(&panel->m_ClipBox, DC, polyline->n, - Buf_Poly_Drawings, 1, LineWidth, CharColor, CharColor); - else GRPoly(&panel->m_ClipBox, DC, polyline->n, - Buf_Poly_Drawings, 0, LineWidth, CharColor, CharColor); - break; - } - } + Pin->DrawPinTexts( panel, DC, pinpos, orient, + LibEntry->m_TextInside, + LibEntry->m_DrawPinNum, LibEntry->m_DrawPinName, + CharColor, DrawMode ); + } + break; + + case COMPONENT_POLYLINE_DRAW_TYPE: + { + LibDrawPolyline* polyline = (LibDrawPolyline*) DrawItem; + if( Buf_Poly_Drawings == NULL ) + { + Buf_Poly_Size = polyline->n; + Buf_Poly_Drawings = (int*) MyMalloc( sizeof(int) * 2 * Buf_Poly_Size ); + } + else if( Buf_Poly_Size < polyline->n ) + { + Buf_Poly_Size = polyline->n; + Buf_Poly_Drawings = (int*) realloc( Buf_Poly_Drawings, + sizeof(int) * 2 * Buf_Poly_Size ); + } + for( i = 0; i < polyline->n; i++ ) + { + Buf_Poly_Drawings[i * 2] = PartX + polyline->PolyList[i * 2]; + Buf_Poly_Drawings[i * 2 + 1] = PartY - polyline->PolyList[i * 2 + 1]; + } + + fill_option = polyline->m_Fill & (~g_PrintFillMask); + if( (fill_option == FILLED_WITH_BG_BODYCOLOR) && !g_IsPrinting ) + GRPoly( &panel->m_ClipBox, DC, polyline->n, + Buf_Poly_Drawings, 1, LineWidth, CharColor, + ReturnLayerColor( LAYER_DEVICE_BACKGROUND ) ); + else if( fill_option == FILLED_SHAPE ) + GRPoly( &panel->m_ClipBox, DC, polyline->n, + Buf_Poly_Drawings, 1, LineWidth, CharColor, CharColor ); + else + GRPoly( &panel->m_ClipBox, DC, polyline->n, + Buf_Poly_Drawings, 0, LineWidth, CharColor, CharColor ); + break; + } + + default: + ; + } } - diff --git a/eeschema/eelibs_read_libraryfiles.cpp b/eeschema/eelibs_read_libraryfiles.cpp index 95cf56a18a..bb60e1d028 100644 --- a/eeschema/eelibs_read_libraryfiles.cpp +++ b/eeschema/eelibs_read_libraryfiles.cpp @@ -17,22 +17,22 @@ /* Fonctions locales */ /* pour librairies de composants */ -static LibEDA_BaseStruct *GetDrawEntry(WinEDA_DrawFrame * frame, FILE *f, - char *Line, int *LineNum); -static bool GetLibEntryField(EDA_LibComponentStruct *LibEntry, char * line); -static bool AddAliasNames(EDA_LibComponentStruct *LibEntry, char * line); -static void InsertAlias(PriorQue ** PQ, - EDA_LibComponentStruct *LibEntry, int *NumOfParts); -static bool ReadLibEntryDateAndTime(EDA_LibComponentStruct * LibEntry, char * Line); -static int AddFootprintFilterList(EDA_LibComponentStruct *LibEntryLibEntry, - FILE * f, char * Line, int *LineNum); +static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, + char* Line, int* LineNum ); +static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line ); +static bool AddAliasNames( EDA_LibComponentStruct* LibEntry, char* line ); +static void InsertAlias( PriorQue** PQ, + EDA_LibComponentStruct* LibEntry, int* NumOfParts ); +static bool ReadLibEntryDateAndTime( EDA_LibComponentStruct* LibEntry, char* Line ); +static int AddFootprintFilterList( EDA_LibComponentStruct* LibEntryLibEntry, + FILE* f, char* Line, int* LineNum ); /* pour doc librairies */ - /****************************************************/ - /* Routines de lecture des librairies de composants */ - /****************************************************/ +/****************************************************/ +/* Routines de lecture des librairies de composants */ +/****************************************************/ /***************************************************************************** @@ -41,197 +41,222 @@ static int AddFootprintFilterList(EDA_LibComponentStruct *LibEntryLibEntry, * IF library already exists, it is NOT reloaded. * * return: new lib or NULL * *****************************************************************************/ -LibraryStruct * LoadLibraryName(WinEDA_DrawFrame * frame, - const wxString & FullLibName, const wxString & LibName) +LibraryStruct* LoadLibraryName( WinEDA_DrawFrame* frame, + const wxString& FullLibName, const wxString& LibName ) { -int NumOfParts; -FILE *f; -LibraryStruct *NewLib; -PriorQue *Entries; -wxString FullFileName; + int NumOfParts; + FILE* f; + LibraryStruct* NewLib; + PriorQue* Entries; + wxString FullFileName; - if ( (NewLib = FindLibrary(LibName)) != NULL) - { - if ( NewLib->m_FullFileName == FullLibName ) - return NewLib; - FreeCmpLibrary(frame, LibName); - } + if( ( NewLib = FindLibrary( LibName ) ) != NULL ) + { + if( NewLib->m_FullFileName == FullLibName ) + return NewLib; + FreeCmpLibrary( frame, LibName ); + } - NewLib = NULL; + NewLib = NULL; - f = wxFopen(FullLibName, wxT("rt") ); - if (f == NULL) - { - wxString msg; - msg.Printf( _("Library <%s> not found"), FullLibName.GetData()); - DisplayError(frame, msg); - return NULL; - } - - NewLib = new LibraryStruct(LIBRARY_TYPE_EESCHEMA, LibName, FullLibName); - Entries = LoadLibraryAux(frame, NewLib, f, &NumOfParts); - if ( Entries != NULL) - { - NewLib->m_Entries = Entries; - NewLib->m_NumOfParts = NumOfParts; - - if ( g_LibraryList == NULL ) g_LibraryList = NewLib; - else - { - LibraryStruct *tmplib = g_LibraryList; - while ( tmplib->m_Pnext ) tmplib = tmplib->m_Pnext; - tmplib->m_Pnext = NewLib; - } + f = wxFopen( FullLibName, wxT( "rt" ) ); + if( f == NULL ) + { + wxString msg; + msg.Printf( _( "Library <%s> not found" ), FullLibName.GetData() ); + DisplayError( frame, msg ); + return NULL; + } - FullFileName = FullLibName; - ChangeFileNameExt(FullFileName, DOC_EXT); - LoadDocLib(frame, FullFileName, NewLib->m_Name); - } - else delete NewLib; - - fclose(f); - return NewLib; + NewLib = new LibraryStruct( LIBRARY_TYPE_EESCHEMA, LibName, FullLibName ); + + Entries = LoadLibraryAux( frame, NewLib, f, &NumOfParts ); + if( Entries != NULL ) + { + NewLib->m_Entries = Entries; + NewLib->m_NumOfParts = NumOfParts; + + if( g_LibraryList == NULL ) + g_LibraryList = NewLib; + else + { + LibraryStruct* tmplib = g_LibraryList; + while( tmplib->m_Pnext ) + tmplib = tmplib->m_Pnext; + + tmplib->m_Pnext = NewLib; + } + + FullFileName = FullLibName; + ChangeFileNameExt( FullFileName, DOC_EXT ); + LoadDocLib( frame, FullFileName, NewLib->m_Name ); + } + else + delete NewLib; + + fclose( f ); + return NewLib; } /******************************************/ -void LoadLibraries(WinEDA_DrawFrame * frame) +void LoadLibraries( WinEDA_DrawFrame* frame ) /******************************************/ + /* Delete toutes les librairies chargees et recree toutes les librairies -donnes dans la liste g_LibName_List -*/ + * donnes dans la liste g_LibName_List + */ { -wxString FullLibName, msg; -wxString LibName; -unsigned ii, iimax = g_LibName_List.GetCount(); + wxString FullLibName, msg; + wxString LibName; + unsigned ii, iimax = g_LibName_List.GetCount(); - frame->PrintMsg( _("Start loading schematic libs")); + frame->PrintMsg( _( "Start loading schematic libs" ) ); - // Free the unwanted libraries (i.e. not in list) but keep the .cache lib -LibraryStruct *nextlib, *lib = g_LibraryList; - for (; lib != NULL; lib = nextlib ) - { - nextlib = lib->m_Pnext; - if ( lib->m_IsLibCache ) continue; + // Free the unwanted libraries (i.e. not in list) but keep the .cache lib + LibraryStruct* nextlib, * lib = g_LibraryList; + for( ; lib != NULL; lib = nextlib ) + { + nextlib = lib->m_Pnext; + if( lib->m_IsLibCache ) + continue; - wxString libname = lib->m_Name; + wxString libname = lib->m_Name; - // is this library in "wanted list" g_LibName_List ? - int test = g_LibName_List.Index(libname); - if ( test == wxNOT_FOUND ) FreeCmpLibrary(frame, libname); - } + // is this library in "wanted list" g_LibName_List ? + int test = g_LibName_List.Index( libname ); + if( test == wxNOT_FOUND ) + FreeCmpLibrary( frame, libname ); + } - // Load missing libraries (if any) - for ( ii = 0 ; ii < iimax; ii++) - { - LibName = g_LibName_List[ii]; + // Load missing libraries (if any) + for( ii = 0; ii < iimax; ii++ ) + { + LibName = g_LibName_List[ii]; - if( LibName.IsEmpty() ) continue; - FullLibName = MakeFileName(g_RealLibDirBuffer, LibName, g_LibExtBuffer); - msg = wxT("Loading ") + FullLibName; - if ( LoadLibraryName(frame, FullLibName, LibName) ) - msg += wxT(" OK"); - else - msg += wxT(" ->Error"); - frame->PrintMsg( msg ); - } - - // reorder the linked list to match the order filename list: - int NumOfLibs; - for (NumOfLibs = 0, lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext) - { - lib->m_Flags = 0; - NumOfLibs++; - } - if ( NumOfLibs == 0 ) return; - - LibraryStruct ** libs = - (LibraryStruct **) MyZMalloc(sizeof(LibraryStruct *) * (NumOfLibs + 2)); + if( LibName.IsEmpty() ) + continue; + FullLibName = MakeFileName( g_RealLibDirBuffer, LibName, g_LibExtBuffer ); + msg = wxT( "Loading " ) + FullLibName; + if( LoadLibraryName( frame, FullLibName, LibName ) ) + msg += wxT( " OK" ); + else + msg += wxT( " ->Error" ); + frame->PrintMsg( msg ); + } - int jj = 0; - for (ii = 0; ii < g_LibName_List.GetCount(); ii++) - { - if ( jj >= NumOfLibs ) break; - lib = FindLibrary(g_LibName_List[ii]); - if ( lib ) - { - lib->m_Flags = 1; - libs[jj++] = lib; - } - } - /* Put lib cache at end of list */ - for (lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext) - { - if ( lib->m_Flags == 0 ) libs[jj++] = lib; - } - libs[jj] = NULL; + // reorder the linked list to match the order filename list: + int NumOfLibs; + for( NumOfLibs = 0, lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext ) + { + lib->m_Flags = 0; + NumOfLibs++; + } - /* Change the linked list pointers */ - for (ii = 0; libs[ii] != NULL; ii++) - libs[ii]->m_Pnext = libs[ii+1]; + if( NumOfLibs == 0 ) + return; - g_LibraryList = libs[0]; - - MyFree(libs); + LibraryStruct** libs = + (LibraryStruct**) MyZMalloc( sizeof(LibraryStruct *) * (NumOfLibs + 2) ); - for (lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext) - lib->m_Flags = 0; + int jj = 0; + for( ii = 0; ii < g_LibName_List.GetCount(); ii++ ) + { + if( jj >= NumOfLibs ) + break; + lib = FindLibrary( g_LibName_List[ii] ); + if( lib ) + { + lib->m_Flags = 1; + libs[jj++] = lib; + } + } + + /* Put lib cache at end of list */ + for( lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext ) + { + if( lib->m_Flags == 0 ) + libs[jj++] = lib; + } + + libs[jj] = NULL; + + /* Change the linked list pointers */ + for( ii = 0; libs[ii] != NULL; ii++ ) + libs[ii]->m_Pnext = libs[ii + 1]; + + g_LibraryList = libs[0]; + + MyFree( libs ); + + for( lib = g_LibraryList; lib != NULL; lib = lib->m_Pnext ) + lib->m_Flags = 0; } + /***************************************************************************** * Routine to free a library from the current loaded libraries. * *****************************************************************************/ -void FreeCmpLibrary(wxWindow * frame, const wxString & LibName) +void FreeCmpLibrary( wxWindow* frame, const wxString& LibName ) { -int NumOfLibs = NumOfLibraries(); -LibraryStruct *Lib, *TempLib; + int NumOfLibs = NumOfLibraries(); + LibraryStruct* Lib, * TempLib; - if (NumOfLibs == 0) - { - DisplayError(frame, wxT("No libraries are loaded"),20); - return; - } + if( NumOfLibs == 0 ) + { + DisplayError( frame, wxT( "No libraries are loaded" ), 20 ); + return; + } - /* Search for this library name: */ - for (Lib = g_LibraryList; Lib != NULL; Lib = Lib->m_Pnext) - { - if (LibName == Lib->m_Name) break; - } + /* Search for this library name: */ + for( Lib = g_LibraryList; Lib != NULL; Lib = Lib->m_Pnext ) + { + if( LibName == Lib->m_Name ) + break; + } - if (Lib == NULL) return; + if( Lib == NULL ) + return; - if ( Lib == g_LibraryList) g_LibraryList = Lib->m_Pnext; - else - { - for( TempLib = g_LibraryList; TempLib->m_Pnext != Lib; TempLib=TempLib->m_Pnext); - TempLib->m_Pnext = TempLib->m_Pnext->m_Pnext; - } + if( Lib == g_LibraryList ) + g_LibraryList = Lib->m_Pnext; + else + { + for( TempLib = g_LibraryList; TempLib->m_Pnext != Lib; TempLib = TempLib->m_Pnext ) + ; - delete Lib; + TempLib->m_Pnext = TempLib->m_Pnext->m_Pnext; + } - /* La librairie supprimee est peut etre celle selectee dans libedit */ - if ( Lib == CurrentLib ) CurrentLib = NULL; + delete Lib; + + /* La librairie supprimee est peut etre celle selectee dans libedit */ + if( Lib == CurrentLib ) + CurrentLib = NULL; } + /******************************/ -const wxChar **GetLibNames(void) +const wxChar** GetLibNames( void ) /******************************/ + /* Routine to return pointers to all library names. - User is responsible to deallocate memory -*/ + * User is responsible to deallocate memory + */ { -int ii, NumOfLibs = NumOfLibraries(); -const wxChar **Names; -LibraryStruct *Lib; + int ii, NumOfLibs = NumOfLibraries(); + const wxChar** Names; + LibraryStruct* Lib; - Names = (const wxChar **) MyZMalloc(sizeof(wxChar *) * (NumOfLibs + 1)); - for (ii = 0, Lib = g_LibraryList; Lib != NULL; Lib = Lib->m_Pnext, ii++) - { - Names[ii] = Lib->m_Name.GetData(); - } - Names[ii] = NULL; + Names = (const wxChar**) MyZMalloc( sizeof(wxChar *) * (NumOfLibs + 1) ); + for( ii = 0, Lib = g_LibraryList; Lib != NULL; Lib = Lib->m_Pnext, ii++ ) + { + Names[ii] = Lib->m_Name.GetData(); + } - return Names; + Names[ii] = NULL; + + return Names; } @@ -239,911 +264,1017 @@ LibraryStruct *Lib; * Routine to compare two EDA_LibComponentStruct for the PriorQue module. * * Comparison (insensitive case) is based on Part name. * *****************************************************************************/ -int LibraryEntryCompare(EDA_LibComponentStruct *LE1, EDA_LibComponentStruct *LE2) +int LibraryEntryCompare( EDA_LibComponentStruct* LE1, EDA_LibComponentStruct* LE2 ) { - return LE1->m_Name.m_Text.CmpNoCase(LE2->m_Name.m_Text); + return LE1->m_Name.m_Text.CmpNoCase( LE2->m_Name.m_Text ); } + /***************************************************************************** * Routine to load a library from given open file. * *****************************************************************************/ -PriorQue *LoadLibraryAux(WinEDA_DrawFrame * frame, LibraryStruct * Library, FILE *libfile, int *NumOfParts) +PriorQue* LoadLibraryAux( WinEDA_DrawFrame* frame, LibraryStruct* Library, FILE* libfile, + int* NumOfParts ) { -int LineNum = 0; -char Line[1024]; -PriorQue *PQ = NULL; -EDA_LibComponentStruct *LibEntry; -wxString msg; - -wxBusyCursor ShowWait; // Display a Busy Cursor.. + int LineNum = 0; + char Line[1024]; + PriorQue* PQ = NULL; + EDA_LibComponentStruct* LibEntry; + wxString msg; - *NumOfParts = 0; + wxBusyCursor ShowWait; // Display a Busy Cursor.. - if ( GetLine(libfile, Line, &LineNum, sizeof(Line) ) == NULL) - { - msg = _("File <") + Library->m_Name + _("> is empty!"); - DisplayError(frame, msg); - return NULL; - } + *NumOfParts = 0; - if( strnicmp(Line, LIBFILE_IDENT, 10) != 0) - { - msg = _("File <") + Library->m_Name + _("> is NOT EESCHEMA library!"); - DisplayError(frame, msg); - return NULL; - } + if( GetLine( libfile, Line, &LineNum, sizeof(Line) ) == NULL ) + { + msg = _( "File <" ) + Library->m_Name + _( "> is empty!" ); + DisplayError( frame, msg ); + return NULL; + } - if ( Library ) Library->m_Header = CONV_FROM_UTF8(Line); + if( strnicmp( Line, LIBFILE_IDENT, 10 ) != 0 ) + { + msg = _( "File <" ) + Library->m_Name + _( "> is NOT EESCHEMA library!" ); + DisplayError( frame, msg ); + return NULL; + } - PQInit(&PQ); - PQCompFunc((PQCompFuncType) LibraryEntryCompare); + if( Library ) + Library->m_Header = CONV_FROM_UTF8( Line ); - while (GetLine(libfile, Line, &LineNum, sizeof(Line)) ) - { - if (strnicmp(Line, "$HEADER", 7) == 0) - { - if ( Library ) - { - if ( ! Library->ReadHeader(libfile, &LineNum) ) - { - msg = _("Library <") + Library->m_Name + _("> header read error"); - DisplayError(frame, msg, 30); - } - } - continue; - } - - if (strnicmp(Line, "DEF", 3) == 0) - { - /* Read one DEF/ENDDEF part entry from library: */ - LibEntry = Read_Component_Definition(frame, Line, libfile, &LineNum); - if ( LibEntry ) - { - /* If we are here, this part is O.k. - put it in: */ - ++*NumOfParts; - PQInsert(&PQ, LibEntry); - InsertAlias(&PQ, LibEntry, NumOfParts); - } - } - } + PQInit( &PQ ); + PQCompFunc( (PQCompFuncType) LibraryEntryCompare ); - return PQ; + while( GetLine( libfile, Line, &LineNum, sizeof(Line) ) ) + { + if( strnicmp( Line, "$HEADER", 7 ) == 0 ) + { + if( Library ) + { + if( !Library->ReadHeader( libfile, &LineNum ) ) + { + msg = _( "Library <" ) + Library->m_Name + _( "> header read error" ); + DisplayError( frame, msg, 30 ); + } + } + continue; + } + + if( strnicmp( Line, "DEF", 3 ) == 0 ) + { + /* Read one DEF/ENDDEF part entry from library: */ + LibEntry = Read_Component_Definition( frame, Line, libfile, &LineNum ); + if( LibEntry ) + { + /* If we are here, this part is O.k. - put it in: */ + ++ * NumOfParts; + PQInsert( &PQ, LibEntry ); + InsertAlias( &PQ, LibEntry, NumOfParts ); + } + } + } + + return PQ; } /*********************************************************************************************/ -EDA_LibComponentStruct * Read_Component_Definition(WinEDA_DrawFrame * frame, char * Line, - FILE *f, int *LineNum) +EDA_LibComponentStruct* Read_Component_Definition( WinEDA_DrawFrame* frame, char* Line, + FILE* f, int* LineNum ) /*********************************************************************************************/ + /* Routine to Read a DEF/ENDDEF part entry from given open file. -*/ + */ { -int unused; -char *p, *Name, *Prefix = NULL; -EDA_LibComponentStruct *LibEntry = NULL; -bool Res; -wxString Msg; + int unused; + char* p, * Name, * Prefix = NULL; + EDA_LibComponentStruct* LibEntry = NULL; + bool Res; + wxString Msg; - p = strtok(Line, " \t\r\n"); + p = strtok( Line, " \t\r\n" ); - if (strcmp(p, "DEF") != 0) - { - Msg.Printf( wxT("DEF command expected in line %d, aborted."), *LineNum); - DisplayError(frame, Msg); - return NULL; - } + if( strcmp( p, "DEF" ) != 0 ) + { + Msg.Printf( wxT( "DEF command expected in line %d, aborted." ), *LineNum ); + DisplayError( frame, Msg ); + return NULL; + } - /* Read DEF line: */ - char drawnum = 0, drawname = 0; - LibEntry = new EDA_LibComponentStruct( NULL); - - if ((Name = strtok(NULL, " \t\n")) == NULL || /* Part name: */ - (Prefix = strtok(NULL, " \t\n")) == NULL || /* Prefix name: */ - (p = strtok(NULL, " \t\n")) == NULL || /* NumOfPins: */ - sscanf(p, "%d", &unused) != 1 || - (p = strtok(NULL, " \t\n")) == NULL || /* TextInside: */ - sscanf(p, "%d", &LibEntry->m_TextInside) != 1 || - (p = strtok(NULL, " \t\n")) == NULL || /* DrawNums: */ - sscanf(p, "%c", &drawnum) != 1 || - (p = strtok(NULL, " \t\n")) == NULL || /* DrawNums: */ - sscanf(p, "%c", &drawname) != 1 || - (p = strtok(NULL, " \t\n")) == NULL || /* m_UnitCount: */ - sscanf(p, "%d", &LibEntry->m_UnitCount) != 1 ) - { - Msg.Printf( wxT("Wrong DEF format in line %d, skipped."),*LineNum); - DisplayError(frame, Msg); - while (GetLine(f, Line, LineNum, 1024) ) - { - p = strtok(Line, " \t\n"); - if (stricmp(p, "ENDDEF") == 0) break; - } - return NULL; - } + /* Read DEF line: */ + char drawnum = 0, drawname = 0; + LibEntry = new EDA_LibComponentStruct( NULL ); - else /* Mise a jour des infos de la ligne "DEF" */ - { - LibEntry->m_DrawPinNum = (drawnum == 'N') ? FALSE : TRUE; - LibEntry->m_DrawPinName = (drawname == 'N') ? FALSE : TRUE; - /* Copy part name and prefix. */ - strupper(Name); - if(Name[0] != '~') LibEntry->m_Name.m_Text = CONV_FROM_UTF8(Name); - else - { - LibEntry->m_Name.m_Text = CONV_FROM_UTF8(&Name[1]); - LibEntry->m_Name.m_Attributs |= TEXT_NO_VISIBLE; - } + if( ( Name = strtok( NULL, " \t\n" ) ) == NULL /* Part name: */ + || ( Prefix = strtok( NULL, " \t\n" ) ) == NULL /* Prefix name: */ + || ( p = strtok( NULL, " \t\n" ) ) == NULL /* NumOfPins: */ + || sscanf( p, "%d", &unused ) != 1 + || ( p = strtok( NULL, " \t\n" ) ) == NULL /* TextInside: */ + || sscanf( p, "%d", &LibEntry->m_TextInside ) != 1 + || ( p = strtok( NULL, " \t\n" ) ) == NULL /* DrawNums: */ + || sscanf( p, "%c", &drawnum ) != 1 + || ( p = strtok( NULL, " \t\n" ) ) == NULL /* DrawNums: */ + || sscanf( p, "%c", &drawname ) != 1 + || ( p = strtok( NULL, " \t\n" ) ) == NULL /* m_UnitCount: */ + || sscanf( p, "%d", &LibEntry->m_UnitCount ) != 1 ) + { + Msg.Printf( wxT( "Wrong DEF format in line %d, skipped." ), *LineNum ); + DisplayError( frame, Msg ); + while( GetLine( f, Line, LineNum, 1024 ) ) + { + p = strtok( Line, " \t\n" ); + if( stricmp( p, "ENDDEF" ) == 0 ) + break; + } - if (strcmp(Prefix, "~") == 0) - { - LibEntry->m_Prefix.m_Text.Empty(); - LibEntry->m_Prefix.m_Attributs |= TEXT_NO_VISIBLE; - } - else LibEntry->m_Prefix.m_Text = CONV_FROM_UTF8(Prefix); - - // Copy optional infos - if ( (p = strtok(NULL, " \t\n")) != NULL ) // m_UnitSelectionLocked param - { - if ( *p == 'L') LibEntry->m_UnitSelectionLocked = TRUE; - } - if ( (p = strtok(NULL, " \t\n")) != NULL ) /* Type Of Component */ - { - if ( *p == 'P') LibEntry->m_Options = ENTRY_POWER; - } - } + return NULL; + } + else /* Mise a jour des infos de la ligne "DEF" */ + { + LibEntry->m_DrawPinNum = (drawnum == 'N') ? FALSE : TRUE; + LibEntry->m_DrawPinName = (drawname == 'N') ? FALSE : TRUE; + /* Copy part name and prefix. */ + strupper( Name ); + if( Name[0] != '~' ) + LibEntry->m_Name.m_Text = CONV_FROM_UTF8( Name ); + else + { + LibEntry->m_Name.m_Text = CONV_FROM_UTF8( &Name[1] ); + LibEntry->m_Name.m_Attributs |= TEXT_NO_VISIBLE; + } - /* Analyse lignes suivantes */ - while (GetLine(f, Line, LineNum, 1024) ) - { - p = strtok(Line, " \t\n"); - Res = TRUE; /* Pour test d'erreur (Res = FALSE = erreur) */ + if( strcmp( Prefix, "~" ) == 0 ) + { + LibEntry->m_Prefix.m_Text.Empty(); + LibEntry->m_Prefix.m_Attributs |= TEXT_NO_VISIBLE; + } + else + LibEntry->m_Prefix.m_Text = CONV_FROM_UTF8( Prefix ); - if( (Line[0] == 'T') && (Line[1] == 'i') ) - { - Res = ReadLibEntryDateAndTime(LibEntry, Line); - } + // Copy optional infos + if( ( p = strtok( NULL, " \t\n" ) ) != NULL ) // m_UnitSelectionLocked param + { + if( *p == 'L' ) + LibEntry->m_UnitSelectionLocked = TRUE; + } + if( ( p = strtok( NULL, " \t\n" ) ) != NULL ) /* Type Of Component */ + { + if( *p == 'P' ) + LibEntry->m_Options = ENTRY_POWER; + } + } - else if(Line[0] == 'F') - { - Res = GetLibEntryField(LibEntry, Line); - } + /* Analyse lignes suivantes */ + while( GetLine( f, Line, LineNum, 1024 ) ) + { + p = strtok( Line, " \t\n" ); + Res = TRUE; /* Pour test d'erreur (Res = FALSE = erreur) */ - else if (strcmp(p, "ENDDEF") == 0) - { - break; - } + if( (Line[0] == 'T') && (Line[1] == 'i') ) + { + Res = ReadLibEntryDateAndTime( LibEntry, Line ); + } + else if( Line[0] == 'F' ) + { + Res = GetLibEntryField( LibEntry, Line ); + } + else if( strcmp( p, "ENDDEF" ) == 0 ) + { + break; + } + else if( strcmp( p, "DRAW" ) == 0 ) + { + LibEntry->m_Drawings = GetDrawEntry( frame, f, Line, LineNum ); + } + else if( strncmp( p, "ALIAS", 5 ) == 0 ) + { + p = strtok( NULL, "\r\n" ); + Res = AddAliasNames( LibEntry, p ); + } + else if( strncmp( p, "$FPLIST", 5 ) == 0 ) + { + Res = AddFootprintFilterList( LibEntry, f, Line, LineNum ); + } + else + { + Msg.Printf( wxT( "Undefined command \"%s\" in line %d, skipped." ), p, *LineNum ); + frame->PrintMsg( Msg ); + } - else if (strcmp(p, "DRAW") == 0) - { - LibEntry->m_Drawings = GetDrawEntry(frame, f, Line, LineNum); - } + /* Fin analyse de la ligne ou block: test de l'info lue */ + if( !Res ) + { /* Something went wrong there. */ + Msg.Printf( wxT( " Error Line %d, Library not loaded" ), *LineNum ); + DisplayError( frame, Msg ); + delete LibEntry; + return NULL; + } + } - else if(strncmp(p, "ALIAS", 5) == 0 ) - { - p = strtok(NULL, "\r\n"); - Res = AddAliasNames(LibEntry, p); - } - - else if(strncmp(p, "$FPLIST", 5) == 0 ) - { - Res = AddFootprintFilterList(LibEntry, f, Line, LineNum); - } - - else - { - Msg.Printf( wxT("Undefined command \"%s\" in line %d, skipped."), p, * LineNum); - frame->PrintMsg(Msg); - } - - /* Fin analyse de la ligne ou block: test de l'info lue */ - if (!Res) - { /* Something went wrong there. */ - Msg.Printf( wxT(" Error Line %d, Library not loaded"), *LineNum); - DisplayError(frame, Msg); - delete LibEntry; - return NULL; - } - } - - /* If we are here, this part is O.k. - put it in: */ - LibEntry->SortDrawItems(); - return LibEntry; + /* If we are here, this part is O.k. - put it in: */ + LibEntry->SortDrawItems(); + return LibEntry; } - /***************************************************************************** * Routine to load a DRAW definition from given file. Note "DRAW" line has * * been read already. Reads upto and include ENDDRAW, or an error (NULL ret). * *****************************************************************************/ -static LibEDA_BaseStruct *GetDrawEntry(WinEDA_DrawFrame * frame, FILE *f, char *Line, int *LineNum) +static LibEDA_BaseStruct* GetDrawEntry( WinEDA_DrawFrame* frame, FILE* f, char* Line, int* LineNum ) { -int i = 0, jj, ll, Unit, Convert, size1, size2; -char *p, Buffer[1024], BufName[256], - PinNum[256], - chartmp[256], chartmp1[256]; -wxString MsgLine; -bool Error = FALSE; -LibEDA_BaseStruct *Tail = NULL, - *New = NULL, - *Head = NULL; + int i = 0, jj, ll, Unit, Convert, size1, size2; + char* p, Buffer[1024], BufName[256], + PinNum[256], + chartmp[256], chartmp1[256]; + wxString MsgLine; + bool Error = FALSE; + LibEDA_BaseStruct* Tail = NULL, + * New = NULL, + * Head = NULL; - while (TRUE) - { - if (GetLine(f, Line, LineNum, 1024 ) == NULL) - { - DisplayError(frame, wxT("File ended prematurely")); - return Head; - } + while( TRUE ) + { + if( GetLine( f, Line, LineNum, 1024 ) == NULL ) + { + DisplayError( frame, wxT( "File ended prematurely" ) ); + return Head; + } - if (strncmp(Line, "ENDDRAW", 7) == 0) - { - break; - } + if( strncmp( Line, "ENDDRAW", 7 ) == 0 ) + { + break; + } - New = NULL; + New = NULL; - switch (Line[0]) - { - case 'A': /* Arc */ - { - int startx, starty, endx, endy; - LibDrawArc * Arc = new LibDrawArc(); - New = Arc; - ll = 0; - int nbarg = sscanf(&Line[2], "%d %d %d %d %d %d %d %d %s %d %d %d %d", - &Arc->m_Pos.x, &Arc->m_Pos.y, &Arc->m_Rayon, - &Arc->t1, &Arc->t2, &Unit, &Convert, - &Arc->m_Width, chartmp, &startx, &starty, &endx, &endy); - if ( nbarg < 8 ) Error = TRUE; - Arc->m_Unit = Unit; Arc->m_Convert = Convert; - if ( chartmp[0] == 'F') Arc->m_Fill = FILLED_SHAPE; - if ( chartmp[0] == 'f') Arc->m_Fill = FILLED_WITH_BG_BODYCOLOR; + switch( Line[0] ) + { + case 'A': /* Arc */ + { + int startx, starty, endx, endy; + LibDrawArc* Arc = new LibDrawArc(); - NORMALIZE_ANGLE(Arc->t1); - NORMALIZE_ANGLE(Arc->t2); - - if ( nbarg >= 13 ) // Coord reelles des extremites de l'arc lues - { - Arc->m_ArcStart.x = startx; Arc->m_ArcStart.y = starty; - Arc->m_ArcEnd.x = endx; Arc->m_ArcEnd.y = endy; - } - else - { - Arc->m_ArcStart.x = Arc->m_Rayon; Arc->m_ArcStart.y = 0; - Arc->m_ArcEnd.x = Arc->m_Rayon; Arc->m_ArcEnd.y = 0; - RotatePoint( &Arc->m_ArcStart.x, &Arc->m_ArcStart.y, -Arc->t1); - Arc->m_ArcStart.x += Arc->m_Pos.x; Arc->m_ArcStart.y +=Arc->m_Pos.y; - RotatePoint( &Arc->m_ArcEnd.x, &Arc->m_ArcEnd.y, -Arc->t2); - Arc->m_ArcEnd.x += Arc->m_Pos.x; Arc->m_ArcEnd.y +=Arc->m_Pos.y; - } - } - break; + New = Arc; + ll = 0; + int nbarg = sscanf( &Line[2], "%d %d %d %d %d %d %d %d %s %d %d %d %d", + &Arc->m_Pos.x, &Arc->m_Pos.y, &Arc->m_Rayon, + &Arc->t1, &Arc->t2, &Unit, &Convert, + &Arc->m_Width, chartmp, &startx, &starty, &endx, &endy ); + if( nbarg < 8 ) + Error = TRUE; + Arc->m_Unit = Unit; Arc->m_Convert = Convert; + if( chartmp[0] == 'F' ) + Arc->m_Fill = FILLED_SHAPE; + if( chartmp[0] == 'f' ) + Arc->m_Fill = FILLED_WITH_BG_BODYCOLOR; - case 'C': /* Circle */ - { - LibDrawCircle * Circle = new LibDrawCircle(); - New = Circle; ll = 0; - Error = sscanf(&Line[2], "%d %d %d %d %d %d %s", - &Circle->m_Pos.x, &Circle->m_Pos.y, &Circle->m_Rayon, - &Unit, &Convert,&Circle->m_Width, chartmp) < 6; - Circle->m_Unit = Unit; - Circle->m_Convert = Convert; - if ( chartmp[0] == 'F') Circle->m_Fill = FILLED_SHAPE; - if ( chartmp[0] == 'f') Circle->m_Fill = FILLED_WITH_BG_BODYCOLOR; - } - break; + NORMALIZE_ANGLE( Arc->t1 ); + NORMALIZE_ANGLE( Arc->t2 ); - case 'T': /* Text */ - { - LibDrawText * Text = new LibDrawText(); - New = Text; - Buffer[0] = 0; - Error = sscanf(&Line[2], "%d %d %d %d %d %d %d %s", - &Text->m_Horiz, - &Text->m_Pos.x, &Text->m_Pos.y, - &Text->m_Size.x, &Text->m_Type, - &Unit, &Convert, Buffer) != 8; + if( nbarg >= 13 ) // Coord reelles des extremites de l'arc lues + { + Arc->m_ArcStart.x = startx; Arc->m_ArcStart.y = starty; + Arc->m_ArcEnd.x = endx; Arc->m_ArcEnd.y = endy; + } + else + { + Arc->m_ArcStart.x = Arc->m_Rayon; Arc->m_ArcStart.y = 0; + Arc->m_ArcEnd.x = Arc->m_Rayon; Arc->m_ArcEnd.y = 0; + RotatePoint( &Arc->m_ArcStart.x, &Arc->m_ArcStart.y, -Arc->t1 ); + Arc->m_ArcStart.x += Arc->m_Pos.x; Arc->m_ArcStart.y += Arc->m_Pos.y; + RotatePoint( &Arc->m_ArcEnd.x, &Arc->m_ArcEnd.y, -Arc->t2 ); + Arc->m_ArcEnd.x += Arc->m_Pos.x; Arc->m_ArcEnd.y += Arc->m_Pos.y; + } + } + break; - Text->m_Unit = Unit; Text->m_Convert = Convert; - Text->m_Size.y = Text->m_Size.x; - if (!Error) - { /* Convert '~' to spaces. */ - Text->m_Text = CONV_FROM_UTF8(Buffer); - Text->m_Text.Replace(wxT("~"), wxT(" ")); // Les espaces sont restitués - } - } - break; + case 'C': /* Circle */ + { + LibDrawCircle* Circle = new LibDrawCircle(); - case 'S': /* Square */ - { - LibDrawSquare * Square = new LibDrawSquare(); - New = Square; ll = 0; - Error = sscanf(&Line[2], "%d %d %d %d %d %d %d %s", - &Square->m_Pos.x, &Square->m_Pos.y, - &Square->m_End.x, &Square->m_End.y, - &Unit, &Convert,&Square->m_Width, chartmp) < 7; - Square->m_Unit = Unit; Square->m_Convert = Convert; - if ( chartmp[0] == 'F') Square->m_Fill = FILLED_SHAPE; - if ( chartmp[0] == 'f') Square->m_Fill = FILLED_WITH_BG_BODYCOLOR; - } - break; + New = Circle; ll = 0; + Error = sscanf( &Line[2], "%d %d %d %d %d %d %s", + &Circle->m_Pos.x, &Circle->m_Pos.y, &Circle->m_Rayon, + &Unit, &Convert, &Circle->m_Width, chartmp ) < 6; + Circle->m_Unit = Unit; + Circle->m_Convert = Convert; + if( chartmp[0] == 'F' ) + Circle->m_Fill = FILLED_SHAPE; + if( chartmp[0] == 'f' ) + Circle->m_Fill = FILLED_WITH_BG_BODYCOLOR; + } + break; - case 'X': /* Pin Description */ - { - *Buffer = 0; - LibDrawPin * Pin = new LibDrawPin(); - New = Pin; - i = sscanf(Line+2, "%s %s %d %d %d %s %d %d %d %d %s %s", - BufName, PinNum, - &Pin->m_Pos.x, &Pin->m_Pos.y, - &ll, chartmp1, - &size1, &size2, - &Unit, &Convert, chartmp, Buffer); + case 'T': /* Text */ + { + LibDrawText* Text = new LibDrawText(); - Pin->m_PinNumSize = size1; /* Parametres type short */ - Pin->m_PinNameSize = size2; - Pin->m_PinLen = ll; - Pin->m_Orient = chartmp1[0] & 255; + New = Text; + Buffer[0] = 0; + Error = sscanf( &Line[2], "%d %d %d %d %d %d %d %s", + &Text->m_Horiz, + &Text->m_Pos.x, &Text->m_Pos.y, + &Text->m_Size.x, &Text->m_Type, + &Unit, &Convert, Buffer ) != 8; - Pin->m_Unit = Unit; Pin->m_Convert = Convert; - strncpy((char*)&Pin->m_PinNum, PinNum, 4); - Error = (i != 11 && i != 12); + Text->m_Unit = Unit; Text->m_Convert = Convert; + Text->m_Size.y = Text->m_Size.x; + if( !Error ) + { /* Convert '~' to spaces. */ + Text->m_Text = CONV_FROM_UTF8( Buffer ); + Text->m_Text.Replace( wxT( "~" ), wxT( " " ) ); // Les espaces sont restitués + } + } + break; - Pin->m_PinName = CONV_FROM_UTF8(BufName); + case 'S': /* Square */ + { + LibDrawSquare* Square = new LibDrawSquare(); - jj = *chartmp & 255; - switch(jj) - { - case 'I': - Pin->m_PinType = PIN_INPUT; break; - case 'O': - Pin->m_PinType = PIN_OUTPUT; break; - case 'B': - Pin->m_PinType = PIN_BIDI; break; - case 'T': - Pin->m_PinType = PIN_TRISTATE; break; - case 'P': - Pin->m_PinType = PIN_PASSIVE; break; - case 'U': - Pin->m_PinType = PIN_UNSPECIFIED; break; - case 'W': - Pin->m_PinType = PIN_POWER_IN; break; - case 'w': - Pin->m_PinType = PIN_POWER_OUT; break; - case 'C': - Pin->m_PinType = PIN_OPENCOLLECTOR; break; - case 'E': - Pin->m_PinType = PIN_OPENEMITTER; break; - default: - MsgLine.Printf( wxT("Unknown Pin Type [%c] line %d"), - jj, *LineNum); - DisplayError(frame, MsgLine); - } - if( i == 12 ) /* Special Symbole defined */ - for( jj = strlen(Buffer); jj > 0 ; ) - { - switch(Buffer[--jj]) - { - case '~': break; - case 'N': Pin->m_Attributs |= PINNOTDRAW; break; - case 'I': Pin->m_PinShape |= INVERT; break; - case 'C': Pin->m_PinShape |= CLOCK; break; - case 'L': Pin->m_PinShape |= LOWLEVEL_IN; break; - case 'V': Pin->m_PinShape |= LOWLEVEL_OUT; break; - default: - MsgLine.Printf( wxT("Unknown Pin Shape [%c] line %d"), - Buffer[jj], *LineNum); - DisplayError(frame, MsgLine); break; - } - } - } - break; + New = Square; ll = 0; + Error = sscanf( &Line[2], "%d %d %d %d %d %d %d %s", + &Square->m_Pos.x, &Square->m_Pos.y, + &Square->m_End.x, &Square->m_End.y, + &Unit, &Convert, &Square->m_Width, chartmp ) < 7; + Square->m_Unit = Unit; Square->m_Convert = Convert; + if( chartmp[0] == 'F' ) + Square->m_Fill = FILLED_SHAPE; + if( chartmp[0] == 'f' ) + Square->m_Fill = FILLED_WITH_BG_BODYCOLOR; + } + break; - case 'P': /* Polyline */ - { - LibDrawPolyline * Polyl = new LibDrawPolyline(); - New = Polyl; + case 'X': /* Pin Description */ + { + *Buffer = 0; + LibDrawPin* Pin = new LibDrawPin(); - if (sscanf(&Line[2], "%d %d %d %d", - &Polyl->n, &Unit, &Convert, - &Polyl->m_Width) == 4 && - Polyl->n > 0) - { - Polyl->m_Unit = Unit; Polyl->m_Convert = Convert; + New = Pin; + i = sscanf( Line + 2, "%s %s %d %d %d %s %d %d %d %d %s %s", + BufName, PinNum, + &Pin->m_Pos.x, &Pin->m_Pos.y, + &ll, chartmp1, + &size1, &size2, + &Unit, &Convert, chartmp, Buffer ); - Polyl->PolyList = (int *) - MyZMalloc(sizeof(int) * Polyl->n * 2); + Pin->m_PinNumSize = size1; /* Parametres type short */ + Pin->m_PinNameSize = size2; + Pin->m_PinLen = ll; + Pin->m_Orient = chartmp1[0] & 255; - p = strtok(&Line[2], " \t\n"); - p = strtok(NULL, " \t\n"); - p = strtok(NULL, " \t\n"); - p = strtok(NULL, " \t\n"); + Pin->m_Unit = Unit; Pin->m_Convert = Convert; + strncpy( (char*) &Pin->m_PinNum, PinNum, 4 ); + Error = (i != 11 && i != 12); - for (i = 0; i < Polyl->n * 2 && !Error; i++) - { - p = strtok(NULL, " \t\n"); - Error = sscanf(p, "%d", &Polyl->PolyList[i]) != 1; - } - Polyl->m_Fill = NO_FILL; - if ( (p = strtok(NULL, " \t\n")) != NULL ) - { - if ( p[0] == 'F') Polyl->m_Fill = FILLED_SHAPE; - if ( p[0] == 'f') - Polyl->m_Fill = FILLED_WITH_BG_BODYCOLOR; - } - } + Pin->m_PinName = CONV_FROM_UTF8( BufName ); - else Error = TRUE; - } - break; + jj = *chartmp & 255; - default: - MsgLine.Printf( wxT("Undefined DRAW command in line %d, aborted."), - *LineNum); - DisplayError(frame, MsgLine); - return Head; - } + switch( jj ) + { + case 'I': + Pin->m_PinType = PIN_INPUT; break; - if (Error) - { - MsgLine.Printf( wxT("Error in %c DRAW command in line %d, aborted."), - Line[0], *LineNum); - DisplayError(frame, MsgLine); - delete New; - /* FLush till end of draw: */ - do { - if (GetLine(f, Line, LineNum, 1024 ) == NULL) - { - DisplayError(frame, wxT("File ended prematurely") ); - return Head; - } - } while (strncmp(Line, "ENDDRAW", 7) != 0); - return (Head); - } + case 'O': + Pin->m_PinType = PIN_OUTPUT; break; - else - { - if (Head == NULL) Head = Tail = New; - else - { - Tail->Pnext = New; Tail = New; - } - } - } + case 'B': + Pin->m_PinType = PIN_BIDI; break; - return Head; + case 'T': + Pin->m_PinType = PIN_TRISTATE; break; + + case 'P': + Pin->m_PinType = PIN_PASSIVE; break; + + case 'U': + Pin->m_PinType = PIN_UNSPECIFIED; break; + + case 'W': + Pin->m_PinType = PIN_POWER_IN; break; + + case 'w': + Pin->m_PinType = PIN_POWER_OUT; break; + + case 'C': + Pin->m_PinType = PIN_OPENCOLLECTOR; break; + + case 'E': + Pin->m_PinType = PIN_OPENEMITTER; break; + + default: + MsgLine.Printf( wxT( "Unknown Pin Type [%c] line %d" ), + jj, *LineNum ); + DisplayError( frame, MsgLine ); + } + + if( i == 12 ) /* Special Symbole defined */ + for( jj = strlen( Buffer ); jj > 0; ) + { + switch( Buffer[--jj] ) + { + case '~': + break; + + case 'N': + Pin->m_Attributs |= PINNOTDRAW; break; + + case 'I': + Pin->m_PinShape |= INVERT; break; + + case 'C': + Pin->m_PinShape |= CLOCK; break; + + case 'L': + Pin->m_PinShape |= LOWLEVEL_IN; break; + + case 'V': + Pin->m_PinShape |= LOWLEVEL_OUT; break; + + default: + MsgLine.Printf( wxT( "Unknown Pin Shape [%c] line %d" ), + Buffer[jj], *LineNum ); + DisplayError( frame, MsgLine ); break; + } + } + + } + break; + + case 'P': /* Polyline */ + { + LibDrawPolyline* Polyl = new LibDrawPolyline(); + + New = Polyl; + + if( sscanf( &Line[2], "%d %d %d %d", + &Polyl->n, &Unit, &Convert, + &Polyl->m_Width ) == 4 + && Polyl->n > 0 ) + { + Polyl->m_Unit = Unit; Polyl->m_Convert = Convert; + + Polyl->PolyList = (int*) + MyZMalloc( sizeof(int) * Polyl->n * 2 ); + + p = strtok( &Line[2], " \t\n" ); + p = strtok( NULL, " \t\n" ); + p = strtok( NULL, " \t\n" ); + p = strtok( NULL, " \t\n" ); + + for( i = 0; i < Polyl->n * 2 && !Error; i++ ) + { + p = strtok( NULL, " \t\n" ); + Error = sscanf( p, "%d", &Polyl->PolyList[i] ) != 1; + } + + Polyl->m_Fill = NO_FILL; + if( ( p = strtok( NULL, " \t\n" ) ) != NULL ) + { + if( p[0] == 'F' ) + Polyl->m_Fill = FILLED_SHAPE; + if( p[0] == 'f' ) + Polyl->m_Fill = FILLED_WITH_BG_BODYCOLOR; + } + } + else + Error = TRUE; + } + break; + + default: + MsgLine.Printf( wxT( "Undefined DRAW command in line %d, aborted." ), + *LineNum ); + DisplayError( frame, MsgLine ); + return Head; + } + + if( Error ) + { + MsgLine.Printf( wxT( "Error in %c DRAW command in line %d, aborted." ), + Line[0], *LineNum ); + DisplayError( frame, MsgLine ); + delete New; + + /* FLush till end of draw: */ + do { + if( GetLine( f, Line, LineNum, 1024 ) == NULL ) + { + DisplayError( frame, wxT( "File ended prematurely" ) ); + return Head; + } + } while( strncmp( Line, "ENDDRAW", 7 ) != 0 ); + + return Head; + } + else + { + if( Head == NULL ) + Head = Tail = New; + else + { + Tail->Pnext = New; Tail = New; + } + } + } + + return Head; } /***************************************************************************** * Routine to find the library given its name. * *****************************************************************************/ -LibraryStruct *FindLibrary(const wxString & Name) +LibraryStruct* FindLibrary( const wxString& Name ) { -LibraryStruct *Lib = g_LibraryList; + LibraryStruct* Lib = g_LibraryList; - while (Lib) - { - if (Lib->m_Name == Name ) return Lib; - Lib = Lib->m_Pnext; - } - return NULL; + while( Lib ) + { + if( Lib->m_Name == Name ) + return Lib; + Lib = Lib->m_Pnext; + } + + return NULL; } + /***************************************************************************** * Routine to find the number of libraries currently loaded. * *****************************************************************************/ -int NumOfLibraries(void) +int NumOfLibraries( void ) { -int ii; -LibraryStruct *Lib = g_LibraryList; + int ii; + LibraryStruct* Lib = g_LibraryList; - for (ii = 0; Lib != NULL; Lib = Lib->m_Pnext) ii++; - return ii; + for( ii = 0; Lib != NULL; Lib = Lib->m_Pnext ) + ii++; + + return ii; } /*****************************************************************************/ -static bool GetLibEntryField(EDA_LibComponentStruct *LibEntry, char * line) +static bool GetLibEntryField( EDA_LibComponentStruct* LibEntry, char* line ) /*****************************************************************************/ + /* Analyse la ligne de description du champ de la forme: - Fn "CA3130" 150 -200 50 H V - ou n = 0 (REFERENCE), 1 (VALUE) , 2 .. 11 = autres champs, facultatifs -*/ + * Fn "CA3130" 150 -200 50 H V + * ou n = 0 (REFERENCE), 1 (VALUE) , 2 .. 11 = autres champs, facultatifs + */ { -int posx, posy, size, orient, hjustify, vjustify; -bool draw; -char *Text, - Char1[256], Char2[256], - Char3[256], Char4[256], - FieldUserName[1024]; -int NumOfField, nbparam; -LibDrawField * Field = NULL; + int posx, posy, size, orient, hjustify, vjustify; + bool draw; + char* Text, + Char1[256], Char2[256], + Char3[256], Char4[256], + FieldUserName[1024]; + int NumOfField, nbparam; + LibDrawField* Field = NULL; - if( sscanf(line+1, "%d", &NumOfField) != 1) return(0); + if( sscanf( line + 1, "%d", &NumOfField ) != 1 ) + return 0; - /* Recherche du debut des donnees (debut du texte suivant) */ - while(*line != 0) line++; - while(*line == 0) line++; + /* Recherche du debut des donnees (debut du texte suivant) */ + while( *line != 0 ) + line++; - /* recherche du texte */ - while ( *line && (*line != '"') ) line++; - if ( *line == 0 ) return(0); - line ++; Text = line; + while( *line == 0 ) + line++; - /* recherche fin de texte */ - while ( *line && (*line != '"') ) line++; - if ( *line == 0 ) return(0); - *line = 0; line++; + /* recherche du texte */ + while( *line && (*line != '"') ) + line++; - FieldUserName[0] = 0; - nbparam = sscanf(line, " %d %d %d %c %c %c %c", - &posx, &posy, &size, Char1, Char2, Char3, Char4); - orient = TEXT_ORIENT_HORIZ; if(Char1[0] == 'V') orient = TEXT_ORIENT_VERT; - draw = TRUE; if(Char2[0] == 'I') draw = FALSE; - hjustify = GR_TEXT_HJUSTIFY_CENTER; - vjustify = GR_TEXT_VJUSTIFY_CENTER; - if ( nbparam >= 6 ) - { - if ( *Char3 == 'L' ) hjustify = GR_TEXT_HJUSTIFY_LEFT; - else if ( *Char3 == 'R' ) hjustify = GR_TEXT_HJUSTIFY_RIGHT; - if ( *Char4 == 'B' ) vjustify = GR_TEXT_VJUSTIFY_BOTTOM; - else if ( *Char4 == 'T' ) vjustify = GR_TEXT_VJUSTIFY_TOP; - } - switch(NumOfField) - { - case REFERENCE: - Field = &LibEntry->m_Prefix; - Field->m_FieldId = REFERENCE; - break; + if( *line == 0 ) + return 0; + line++; Text = line; - case VALUE: - Field = &LibEntry->m_Name; - Field->m_FieldId = VALUE; - break; + /* recherche fin de texte */ + while( *line && (*line != '"') ) + line++; - default: - if(NumOfField >= NUMBER_OF_FIELDS ) break; - Field = new LibDrawField(NumOfField); - Field->Pnext = LibEntry->Fields; - LibEntry->Fields = Field; - break; - } + if( *line == 0 ) + return 0; + *line = 0; line++; - if ( Field == NULL ) return FALSE; + FieldUserName[0] = 0; + nbparam = sscanf( line, " %d %d %d %c %c %c %c", + &posx, &posy, &size, Char1, Char2, Char3, Char4 ); + orient = TEXT_ORIENT_HORIZ; if( Char1[0] == 'V' ) + orient = TEXT_ORIENT_VERT; + draw = TRUE; if( Char2[0] == 'I' ) + draw = FALSE; + hjustify = GR_TEXT_HJUSTIFY_CENTER; + vjustify = GR_TEXT_VJUSTIFY_CENTER; + if( nbparam >= 6 ) + { + if( *Char3 == 'L' ) + hjustify = GR_TEXT_HJUSTIFY_LEFT; + else if( *Char3 == 'R' ) + hjustify = GR_TEXT_HJUSTIFY_RIGHT; + if( *Char4 == 'B' ) + vjustify = GR_TEXT_VJUSTIFY_BOTTOM; + else if( *Char4 == 'T' ) + vjustify = GR_TEXT_VJUSTIFY_TOP; + } - Field->m_Pos.x = posx; Field->m_Pos.y = posy; - Field->m_Orient = orient; - if( draw == FALSE ) Field->m_Attributs |= TEXT_NO_VISIBLE; - Field->m_Size.x = Field->m_Size.y = size; - Field->m_Text = CONV_FROM_UTF8(Text); - if ( NumOfField >= FIELD1 ) - { - ReadDelimitedText(FieldUserName,line, sizeof(FieldUserName) ); - Field->m_Name = CONV_FROM_UTF8(FieldUserName); - } - Field->m_HJustify = hjustify; - Field->m_VJustify = vjustify; - return(TRUE); + switch( NumOfField ) + { + case REFERENCE: + Field = &LibEntry->m_Prefix; + Field->m_FieldId = REFERENCE; + break; + + case VALUE: + Field = &LibEntry->m_Name; + Field->m_FieldId = VALUE; + break; + + default: + if( NumOfField >= NUMBER_OF_FIELDS ) + break; + Field = new LibDrawField( NumOfField ); + + Field->Pnext = LibEntry->Fields; + LibEntry->Fields = Field; + break; + } + + if( Field == NULL ) + return FALSE; + + Field->m_Pos.x = posx; Field->m_Pos.y = posy; + Field->m_Orient = orient; + if( draw == FALSE ) + Field->m_Attributs |= TEXT_NO_VISIBLE; + Field->m_Size.x = Field->m_Size.y = size; + Field->m_Text = CONV_FROM_UTF8( Text ); + if( NumOfField >= FIELD1 ) + { + ReadDelimitedText( FieldUserName, line, sizeof(FieldUserName) ); + Field->m_Name = CONV_FROM_UTF8( FieldUserName ); + } + Field->m_HJustify = hjustify; + Field->m_VJustify = vjustify; + return TRUE; } /********************************************************************/ -static bool AddAliasNames(EDA_LibComponentStruct *LibEntry, char * line) +static bool AddAliasNames( EDA_LibComponentStruct* LibEntry, char* line ) /********************************************************************/ + /* Read the alias names (in buffer line) and add them in alias list - names are separated by spaces -*/ + * names are separated by spaces + */ { -char * text; -wxString name; - text = strtok(line, " \t\r\n"); + char* text; + wxString name; - while ( text ) - { - name = CONV_FROM_UTF8(text); - LibEntry->m_AliasList.Add(name); - text = strtok(NULL, " \t\r\n"); - } - return( TRUE ); + text = strtok( line, " \t\r\n" ); + + while( text ) + { + name = CONV_FROM_UTF8( text ); + LibEntry->m_AliasList.Add( name ); + text = strtok( NULL, " \t\r\n" ); + } + + return TRUE; } + /********************************************************************/ -static void InsertAlias(PriorQue ** PQ, EDA_LibComponentStruct *LibEntry, - int *NumOfParts) +static void InsertAlias( PriorQue** PQ, EDA_LibComponentStruct* LibEntry, + int* NumOfParts ) /********************************************************************/ /* create in library (in list PQ) aliases of the "root" component LibEntry*/ { -EDA_LibCmpAliasStruct *AliasEntry; -unsigned ii; - - if(LibEntry->m_AliasList.GetCount() == 0) - return; /* No alias for this component */ + EDA_LibCmpAliasStruct* AliasEntry; + unsigned ii; - for( ii = 0; ii < LibEntry->m_AliasList.GetCount(); ii++ ) - { - AliasEntry = new EDA_LibCmpAliasStruct(LibEntry->m_AliasList[ii], - LibEntry->m_Name.m_Text.GetData()); - ++*NumOfParts; - PQInsert(PQ, AliasEntry); - } + if( LibEntry->m_AliasList.GetCount() == 0 ) + return;/* No alias for this component */ + + for( ii = 0; ii < LibEntry->m_AliasList.GetCount(); ii++ ) + { + AliasEntry = new EDA_LibCmpAliasStruct( LibEntry->m_AliasList[ii], + LibEntry->m_Name.m_Text.GetData() ); + + ++ * NumOfParts; + PQInsert( PQ, AliasEntry ); + } } - /*******************************************************/ - /* Routines de lecture des Documentation de composants */ - /*******************************************************/ + +/*******************************************************/ +/* Routines de lecture des Documentation de composants */ +/*******************************************************/ /**********************************************************************************************/ -int LoadDocLib(WinEDA_DrawFrame * frame, const wxString & FullDocLibName, const wxString & Libname) +int LoadDocLib( WinEDA_DrawFrame* frame, const wxString& FullDocLibName, const wxString& Libname ) /**********************************************************************************************/ /* Routine to load a library from given open file.*/ { -int LineNum = 0; -char Line[1024], *Name, *Text; -EDA_LibComponentStruct * Entry; -FILE * f; -wxString msg; - - f = wxFopen(FullDocLibName, wxT("rt") ); - if (f == NULL) return(0); + int LineNum = 0; + char Line[1024], * Name, * Text; + EDA_LibComponentStruct* Entry; + FILE* f; + wxString msg; - if ( GetLine(f, Line, &LineNum, sizeof(Line) ) == NULL) - { /* pas de lignes utiles */ - fclose(f); - return 0; - } + f = wxFopen( FullDocLibName, wxT( "rt" ) ); + if( f == NULL ) + return 0; - if( strnicmp(Line, DOCFILE_IDENT, 10) != 0) - { - DisplayError(frame, wxT("File is NOT EESCHEMA doclib!") ); - fclose(f); - return 0; - } + if( GetLine( f, Line, &LineNum, sizeof(Line) ) == NULL ) + { /* pas de lignes utiles */ + fclose( f ); + return 0; + } - while (GetLine(f, Line, &LineNum, sizeof(Line)) ) - { - if (strncmp(Line, "$CMP",4) != 0) - { - msg.Printf( wxT("$CMP command expected in line %d, aborted."), LineNum); - DisplayError(frame, msg); - fclose(f); - return 0; - } + if( strnicmp( Line, DOCFILE_IDENT, 10 ) != 0 ) + { + DisplayError( frame, wxT( "File is NOT EESCHEMA doclib!" ) ); + fclose( f ); + return 0; + } - /* Read one $CMP/$ENDCMP part entry from library: */ - Name = strtok(Line + 5,"\n\r"); - wxString cmpname; cmpname = CONV_FROM_UTF8(Name); - Entry = FindLibPart(cmpname.GetData(),Libname,FIND_ALIAS); - while( GetLine(f, Line, &LineNum, sizeof(Line)) ) - { - if( strncmp(Line, "$ENDCMP",7) == 0) break; - Text = strtok(Line + 2,"\n\r"); - switch ( Line[0] ) - { - case 'D': - if(Entry) Entry->m_Doc = CONV_FROM_UTF8(Text); - break; + while( GetLine( f, Line, &LineNum, sizeof(Line) ) ) + { + if( strncmp( Line, "$CMP", 4 ) != 0 ) + { + msg.Printf( wxT( "$CMP command expected in line %d, aborted." ), LineNum ); + DisplayError( frame, msg ); + fclose( f ); + return 0; + } - case 'K': - if(Entry) Entry->m_KeyWord = CONV_FROM_UTF8(Text); - break; + /* Read one $CMP/$ENDCMP part entry from library: */ + Name = strtok( Line + 5, "\n\r" ); + wxString cmpname; cmpname = CONV_FROM_UTF8( Name ); + Entry = FindLibPart( cmpname.GetData(), Libname, FIND_ALIAS ); + while( GetLine( f, Line, &LineNum, sizeof(Line) ) ) + { + if( strncmp( Line, "$ENDCMP", 7 ) == 0 ) + break; + Text = strtok( Line + 2, "\n\r" ); - case 'F': - if(Entry) Entry->m_DocFile = CONV_FROM_UTF8(Text); - break; - } - } - } - fclose(f); - return 1; + switch( Line[0] ) + { + case 'D': + if( Entry ) + Entry->m_Doc = CONV_FROM_UTF8( Text ); + break; + + case 'K': + if( Entry ) + Entry->m_KeyWord = CONV_FROM_UTF8( Text ); + break; + + case 'F': + if( Entry ) + Entry->m_DocFile = CONV_FROM_UTF8( Text ); + break; + } + } + } + + fclose( f ); + return 1; } /*********************************************************************************/ -static bool ReadLibEntryDateAndTime(EDA_LibComponentStruct * LibEntry, char * Line) +static bool ReadLibEntryDateAndTime( EDA_LibComponentStruct* LibEntry, char* Line ) /*********************************************************************************/ + /* lit date et time de modif composant sous le format: - "Ti yy/mm/jj hh:mm:ss" -*/ + * "Ti yy/mm/jj hh:mm:ss" + */ { -int year,mon,day,hour,min,sec; -char * text; + int year, mon, day, hour, min, sec; + char* text; - year = mon = day = hour = min = sec = 0; - text = strtok(Line," \r\t\n"); - text = strtok(NULL," \r\t\n"); // text pointe donnees utiles + year = mon = day = hour = min = sec = 0; + text = strtok( Line, " \r\t\n" ); + text = strtok( NULL, " \r\t\n" ); // text pointe donnees utiles - sscanf(Line,"%d/%d/%d %d:%d:%d",&year,&mon,&day,&hour,&min,&sec); + sscanf( Line, "%d/%d/%d %d:%d:%d", &year, &mon, &day, &hour, &min, &sec ); - LibEntry->m_LastDate = (sec & 63) - + ((min & 63) << 6) - + ((hour & 31) << 12) - + ((day & 31) << 17) - + ((mon & 15) << 22) - + ((year-1990) << 26); + LibEntry->m_LastDate = (sec & 63) + + ( (min & 63) << 6 ) + + ( (hour & 31) << 12 ) + + ( (day & 31) << 17 ) + + ( (mon & 15) << 22 ) + + ( (year - 1990) << 26 ); - return TRUE; + return TRUE; } + /*******************************************/ -static int SortItemsFct(const void * ref, const void * item); -void EDA_LibComponentStruct::SortDrawItems(void) +static int SortItemsFct( const void* ref, const void* item ); + +void EDA_LibComponentStruct::SortDrawItems( void ) /*******************************************/ + /* Trie les éléments graphiques d'un composant lib pour améliorer -le tracé: -items remplis en premier, pins en dernier -En cas de superposition d'items, c'est plus lisible -*/ + * le tracé: + * items remplis en premier, pins en dernier + * En cas de superposition d'items, c'est plus lisible + */ { -LibEDA_BaseStruct ** Bufentry, ** BufentryBase, *Entry = m_Drawings; -int ii, nbitems; + LibEDA_BaseStruct** Bufentry, ** BufentryBase, * Entry = m_Drawings; + int ii, nbitems; - if(Entry == NULL ) return; /* Pas d'alias pour ce composant */ - /* calcul du nombre d'items */ - for( nbitems = 0; Entry != NULL; Entry = Entry->Next()) nbitems++; + if( Entry == NULL ) + return; /* Pas d'alias pour ce composant */ + /* calcul du nombre d'items */ + for( nbitems = 0; Entry != NULL; Entry = Entry->Next() ) + nbitems++; - BufentryBase = - (LibEDA_BaseStruct **) MyZMalloc( (nbitems+1) * sizeof(LibEDA_BaseStruct *)); - /* memorisation du chainage : */ - for( Entry = m_Drawings, ii = 0; Entry != NULL; Entry = Entry->Next()) - BufentryBase[ii++] = Entry; + BufentryBase = + (LibEDA_BaseStruct**) MyZMalloc( (nbitems + 1) * sizeof(LibEDA_BaseStruct *) ); + /* memorisation du chainage : */ + for( Entry = m_Drawings, ii = 0; Entry != NULL; Entry = Entry->Next() ) + BufentryBase[ii++] = Entry; - /* Tri du chainage */ - qsort(BufentryBase, nbitems, sizeof(LibEDA_BaseStruct *), SortItemsFct); + /* Tri du chainage */ + qsort( BufentryBase, nbitems, sizeof(LibEDA_BaseStruct *), SortItemsFct ); - /* Mise a jour du chainage. Remarque: - le dernier element de BufEntryBase (BufEntryBase[nbitems]) est NULL*/ - m_Drawings = * BufentryBase; - Bufentry = BufentryBase; - for (ii = 0 ; ii < nbitems; ii++) - { - (* Bufentry)->Pnext = * (Bufentry+1); - Bufentry++; - } + /* Mise a jour du chainage. Remarque: + * le dernier element de BufEntryBase (BufEntryBase[nbitems]) est NULL*/ + m_Drawings = *BufentryBase; + Bufentry = BufentryBase; + for( ii = 0; ii < nbitems; ii++ ) + { + (*Bufentry)->Pnext = *(Bufentry + 1); + Bufentry++; + } - MyFree(BufentryBase); + MyFree( BufentryBase ); } -int SortItemsFct(const void * ref, const void * item) + +int SortItemsFct( const void* ref, const void* item ) { -#define Ref (*(LibEDA_BaseStruct **)(ref)) -#define Item (*(LibEDA_BaseStruct **)(item)) +#define Ref ( *(LibEDA_BaseStruct**) (ref) ) +#define Item ( *(LibEDA_BaseStruct**) (item) ) #define BEFORE -1 -#define AFTER 1 +#define AFTER 1 -int fill_ref = 0, fill_item = 0; + int fill_ref = 0, fill_item = 0; - switch (Ref->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - { - const LibDrawArc * draw = (const LibDrawArc *) Ref; - fill_ref = draw->m_Fill; - break; - } + switch( Ref->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + { + const LibDrawArc* draw = (const LibDrawArc*) Ref; + fill_ref = draw->m_Fill; + break; + } - case COMPONENT_CIRCLE_DRAW_TYPE: - { - const LibDrawCircle * draw = (const LibDrawCircle *) Ref; - fill_ref = draw->m_Fill; - break; - } + case COMPONENT_CIRCLE_DRAW_TYPE: + { + const LibDrawCircle* draw = (const LibDrawCircle*) Ref; + fill_ref = draw->m_Fill; + break; + } - case COMPONENT_RECT_DRAW_TYPE: - { - const LibDrawSquare * draw = (const LibDrawSquare *) Ref; - fill_ref = draw->m_Fill; - break; - } + case COMPONENT_RECT_DRAW_TYPE: + { + const LibDrawSquare* draw = (const LibDrawSquare*) Ref; + fill_ref = draw->m_Fill; + break; + } - case COMPONENT_POLYLINE_DRAW_TYPE: - { - const LibDrawPolyline * draw = (const LibDrawPolyline *) Ref; - fill_ref = draw->m_Fill; - break; - } + case COMPONENT_POLYLINE_DRAW_TYPE: + { + const LibDrawPolyline* draw = (const LibDrawPolyline*) Ref; + fill_ref = draw->m_Fill; + break; + } - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - if ( Item->m_StructType == COMPONENT_PIN_DRAW_TYPE ) return BEFORE; - if ( Item->m_StructType == COMPONENT_GRAPHIC_TEXT_DRAW_TYPE ) return 0; - return 1; - break; + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + if( Item->m_StructType == COMPONENT_PIN_DRAW_TYPE ) + return BEFORE; + if( Item->m_StructType == COMPONENT_GRAPHIC_TEXT_DRAW_TYPE ) + return 0; + return 1; + break; - case COMPONENT_PIN_DRAW_TYPE: - if ( Item->m_StructType == COMPONENT_PIN_DRAW_TYPE ) - { - int ii; - // We sort the pins by orientation - ii = ((LibDrawPin *) Ref)->m_Orient - ((LibDrawPin *) Item)->m_Orient; - if ( ii ) return ii; - - /* We sort the pins by position (x or y). - note: at this point, most of pins have same x pos or y pos, - because they are sorted by orientation and generally are vertically or - horizontally aligned */ - wxPoint pos_ref, pos_tst; - pos_ref = ((LibDrawPin *) Ref)->m_Pos; - pos_tst = ((LibDrawPin *) Item)->m_Pos; - if ( (ii = pos_ref.x - pos_tst.x) ) return ii; - ii = pos_ref.y - pos_tst.y; - return ii; - } - else return AFTER; - break; - } + case COMPONENT_PIN_DRAW_TYPE: + if( Item->m_StructType == COMPONENT_PIN_DRAW_TYPE ) + { + int ii; - /* Test de l'item */ - switch (Item->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - { - const LibDrawArc * draw = (const LibDrawArc *) Item; - fill_item = draw->m_Fill; - break; - } + // We sort the pins by orientation + ii = ( (LibDrawPin*) Ref )->m_Orient - ( (LibDrawPin*) Item )->m_Orient; + if( ii ) + return ii; - case COMPONENT_CIRCLE_DRAW_TYPE: - { - const LibDrawCircle * draw = (const LibDrawCircle *) Item; - fill_item = draw->m_Fill; - break; - } + /* We sort the pins by position (x or y). + * note: at this point, most of pins have same x pos or y pos, + * because they are sorted by orientation and generally are vertically or + * horizontally aligned */ + wxPoint pos_ref, pos_tst; + pos_ref = ( (LibDrawPin*) Ref )->m_Pos; + pos_tst = ( (LibDrawPin*) Item )->m_Pos; + if( (ii = pos_ref.x - pos_tst.x) ) + return ii; + ii = pos_ref.y - pos_tst.y; + return ii; + } + else + return AFTER; + break; - case COMPONENT_RECT_DRAW_TYPE: - { - const LibDrawSquare * draw = (const LibDrawSquare *) Item; - fill_item = draw->m_Fill; - break; - } + default: + ; + } - case COMPONENT_POLYLINE_DRAW_TYPE: - { - const LibDrawPolyline * draw = (const LibDrawPolyline *) Item; - fill_item = draw->m_Fill; - break; - } + /* Test de l'item */ + switch( Item->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + { + const LibDrawArc* draw = (const LibDrawArc*) Item; + fill_item = draw->m_Fill; + break; + } - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - return BEFORE; - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + { + const LibDrawCircle* draw = (const LibDrawCircle*) Item; + fill_item = draw->m_Fill; + break; + } - case COMPONENT_PIN_DRAW_TYPE: - return BEFORE; - break; - } + case COMPONENT_RECT_DRAW_TYPE: + { + const LibDrawSquare* draw = (const LibDrawSquare*) Item; + fill_item = draw->m_Fill; + break; + } - if ( fill_ref & fill_item ) return 0; - if ( fill_ref ) return BEFORE; - return AFTER; + case COMPONENT_POLYLINE_DRAW_TYPE: + { + const LibDrawPolyline* draw = (const LibDrawPolyline*) Item; + fill_item = draw->m_Fill; + break; + } + + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + return BEFORE; + break; + + case COMPONENT_PIN_DRAW_TYPE: + return BEFORE; + break; + + default: + ; + } + + if( fill_ref & fill_item ) + return 0; + if( fill_ref ) + return BEFORE; + return AFTER; } /*****************************************************************************/ -int AddFootprintFilterList(EDA_LibComponentStruct *LibEntryLibEntry, FILE * f, - char * Line, int *LineNum) +int AddFootprintFilterList( EDA_LibComponentStruct* LibEntryLibEntry, FILE* f, + char* Line, int* LineNum ) /******************************************************************************/ + /* read the FootprintFilter List stating with: - FPLIST - and ending with: - ENDFPLIST -*/ + * FPLIST + * and ending with: + * ENDFPLIST + */ { - for ( ; ; ) - { - if (GetLine(f, Line, LineNum, 1024 ) == NULL) - { - DisplayError(NULL, wxT("File ended prematurely")); - return 0; - } - - if ( stricmp(Line, "$ENDFPLIST") == 0 ) - { - break; /*normal exit on end of list */ - } - - LibEntryLibEntry->m_FootprintList.Add(CONV_FROM_UTF8(Line+1)); - } - - return 1; + for( ; ; ) + { + if( GetLine( f, Line, LineNum, 1024 ) == NULL ) + { + DisplayError( NULL, wxT( "File ended prematurely" ) ); + return 0; + } + + if( stricmp( Line, "$ENDFPLIST" ) == 0 ) + { + break; /*normal exit on end of list */ + } + + LibEntryLibEntry->m_FootprintList.Add( CONV_FROM_UTF8( Line + 1 ) ); + } + + return 1; } diff --git a/eeschema/hotkeys.cpp b/eeschema/hotkeys.cpp index 014bd87c4d..da97498587 100644 --- a/eeschema/hotkeys.cpp +++ b/eeschema/hotkeys.cpp @@ -212,6 +212,8 @@ wxPoint MousePos = m_CurrentScreen->m_MousePosition; } ChangeTextOrient( (DrawTextStruct*)DrawStruct, DC); break; + + default:; } break; diff --git a/eeschema/libclass.cpp b/eeschema/libclass.cpp index 1936245c24..eab2db309e 100644 --- a/eeschema/libclass.cpp +++ b/eeschema/libclass.cpp @@ -13,695 +13,780 @@ #include "protos.h" - /*******************************************************/ - /* Methodes relatives a la manipulation des librairies */ - /*******************************************************/ +/*******************************************************/ +/* Methodes relatives a la manipulation des librairies */ +/*******************************************************/ /***************************************************************************************/ -LibraryStruct::LibraryStruct(int type, const wxString & name, const wxString & fullname) +LibraryStruct::LibraryStruct( int type, const wxString& name, const wxString& fullname ) /***************************************************************************************/ { - m_Type = type; /* type indicator */ - m_Name = name; /* Name of library loaded. */ - m_FullFileName = fullname; /* Full File Name (with path) of library loaded. */ - m_NumOfParts = 0; /* Number of parts this library has. */ - m_Entries = NULL; /* Parts themselves are saved here. */ - m_Pnext = NULL; /* Point on next lib in chain. */ - m_Modified = FALSE; /* flag indicateur d'edition */ - m_TimeStamp = 0; - m_Flags = 0; - m_IsLibCache = FALSE; - + m_Type = type; /* type indicator */ + m_Name = name; /* Name of library loaded. */ + m_FullFileName = fullname; /* Full File Name (with path) of library loaded. */ + m_NumOfParts = 0; /* Number of parts this library has. */ + m_Entries = NULL; /* Parts themselves are saved here. */ + m_Pnext = NULL; /* Point on next lib in chain. */ + m_Modified = FALSE; /* flag indicateur d'edition */ + m_TimeStamp = 0; + m_Flags = 0; + m_IsLibCache = FALSE; } + /*****************************************/ -void FreeLibraryEntry(LibCmpEntry * Entry) +void FreeLibraryEntry( LibCmpEntry* Entry ) /*****************************************/ + /* Used by PQFreeFunc() to delete all entries -*/ + */ { - delete Entry; + delete Entry; } + /******************************/ LibraryStruct::~LibraryStruct() /******************************/ { - if ( m_Entries ) PQFreeFunc(m_Entries, (void(*)(void *))FreeLibraryEntry); + if( m_Entries ) + PQFreeFunc( m_Entries, ( void( * ) ( void* ) )FreeLibraryEntry ); } /*******************************************/ -bool LibraryStruct::WriteHeader(FILE * file) +bool LibraryStruct::WriteHeader( FILE* file ) /*******************************************/ -/* Ecrit l'entete du fichier librairie -*/ -{ -char BufLine[1024]; -bool succes = TRUE; - DateAndTime(BufLine); - if ( fprintf(file,"%s %d.%d Date: %s\n", LIBFILE_IDENT, - LIB_VERSION_MAJOR, LIB_VERSION_MINOR, - BufLine) != 5 ) - succes = FALSE; +/* Ecrit l'entete du fichier librairie + */ +{ + char BufLine[1024]; + bool succes = TRUE; + + DateAndTime( BufLine ); + if( fprintf( file, "%s %d.%d Date: %s\n", LIBFILE_IDENT, + LIB_VERSION_MAJOR, LIB_VERSION_MINOR, + BufLine ) != 5 ) + succes = FALSE; #if 0 - if ( fprintf(file,"$HEADER\n") != 1 ) succes = FALSE; - if ( fprintf(file,"TimeStamp %8.8lX\n", m_TimeStamp) != 2 ) succes = FALSE; - if ( fprintf(file,"Parts %d\n", m_NumOfParts) != 2 ) succes = FALSE; - if ( fprintf(file,"$ENDHEADER\n") != 1 ) succes = FALSE; + if( fprintf( file, "$HEADER\n" ) != 1 ) + succes = FALSE; + if( fprintf( file, "TimeStamp %8.8lX\n", m_TimeStamp ) != 2 ) + succes = FALSE; + if( fprintf( file, "Parts %d\n", m_NumOfParts ) != 2 ) + succes = FALSE; + if( fprintf( file, "$ENDHEADER\n" ) != 1 ) + succes = FALSE; #endif - return (succes); + return succes; } + /***********************************************************/ -bool LibraryStruct::ReadHeader(FILE * libfile, int * LineNum) +bool LibraryStruct::ReadHeader( FILE* libfile, int* LineNum ) /***********************************************************/ + /* Ecrit l'entete du fichier librairie -*/ + */ { -char Line[1024], * text, * data; + char Line[1024], * text, * data; - while (GetLine(libfile, Line, LineNum, sizeof(Line)) ) - { - text = strtok(Line, " \t\r\n"); - data = strtok(NULL, " \t\r\n"); - if ( stricmp(text, "TimeStamp") == 0 ) - m_TimeStamp = atol(data); - if ( stricmp(text,"$ENDHEADER") == 0 ) return TRUE; - } - return FALSE; + while( GetLine( libfile, Line, LineNum, sizeof(Line) ) ) + { + text = strtok( Line, " \t\r\n" ); + data = strtok( NULL, " \t\r\n" ); + if( stricmp( text, "TimeStamp" ) == 0 ) + m_TimeStamp = atol( data ); + if( stricmp( text, "$ENDHEADER" ) == 0 ) + return TRUE; + } + + return FALSE; } - /*********************/ - /* class LibCmpEntry */ - /*********************/ +/*********************/ +/* class LibCmpEntry */ +/*********************/ + /* Basic class for librarty oomponent description - Not directly used - Used to create the 2 derived classes : - - EDA_LibCmpAliasStruct - - EDA_LibComponentStruct -*/ + * Not directly used + * Used to create the 2 derived classes : + * - EDA_LibCmpAliasStruct + * - EDA_LibComponentStruct + */ /********************************************************************/ -LibCmpEntry::LibCmpEntry(LibrEntryType CmpType, const wxChar * CmpName): - EDA_BaseStruct(LIBCOMPONENT_STRUCT_TYPE) +LibCmpEntry::LibCmpEntry( LibrEntryType CmpType, const wxChar* CmpName ) : + EDA_BaseStruct( LIBCOMPONENT_STRUCT_TYPE ) /********************************************************************/ { - Type = CmpType; - m_Name.m_FieldId = VALUE; - if ( CmpName ) m_Name.m_Text = CmpName; + Type = CmpType; + m_Name.m_FieldId = VALUE; + if( CmpName ) + m_Name.m_Text = CmpName; } + /******************************/ -LibCmpEntry::~LibCmpEntry(void) +LibCmpEntry::~LibCmpEntry( void ) /******************************/ { } - /*******************************/ - /* class EDA_LibCmpAliasStruct */ - /*******************************/ +/*******************************/ +/* class EDA_LibCmpAliasStruct */ +/*******************************/ /* Class to define an alias of a component - An alias uses the component defintion (graphic, pins...) - but has its own name and documentation. - Therefore, when the component is modified, alias of this component are modified. - This is a simple method to create components with differs very few - (like 74LS00, 74HC00 ... and many op amps ) -*/ + * An alias uses the component defintion (graphic, pins...) + * but has its own name and documentation. + * Therefore, when the component is modified, alias of this component are modified. + * This is a simple method to create components with differs very few + * (like 74LS00, 74HC00 ... and many op amps ) + */ -EDA_LibCmpAliasStruct:: EDA_LibCmpAliasStruct( const wxChar * CmpName, - const wxChar * CmpRootName): - LibCmpEntry(ALIAS, CmpName) +EDA_LibCmpAliasStruct:: EDA_LibCmpAliasStruct( const wxChar* CmpName, + const wxChar* CmpRootName ) : + LibCmpEntry( ALIAS, CmpName ) { - if ( CmpRootName == NULL) m_RootName.Empty(); - else m_RootName = CmpRootName; + if( CmpRootName == NULL ) + m_RootName.Empty(); + else + m_RootName = CmpRootName; } -EDA_LibCmpAliasStruct::~EDA_LibCmpAliasStruct(void) + +EDA_LibCmpAliasStruct::~EDA_LibCmpAliasStruct( void ) { } - /********************************/ - /* class EDA_LibComponentStruct */ - /********************************/ +/********************************/ +/* class EDA_LibComponentStruct */ +/********************************/ /* This is a standard component (in library) -*/ -EDA_LibComponentStruct:: EDA_LibComponentStruct( const wxChar * CmpName): - LibCmpEntry(ROOT, CmpName) + */ +EDA_LibComponentStruct:: EDA_LibComponentStruct( const wxChar* CmpName ) : + LibCmpEntry( ROOT, CmpName ) { - m_Drawings = NULL; - m_LastDate = 0; - m_UnitCount = 1; - m_TextInside = 40; - m_Options = ENTRY_NORMAL; - m_UnitSelectionLocked = FALSE; - m_DrawPinNum = m_DrawPinName = 1; + m_Drawings = NULL; + m_LastDate = 0; + m_UnitCount = 1; + m_TextInside = 40; + m_Options = ENTRY_NORMAL; + m_UnitSelectionLocked = FALSE; + m_DrawPinNum = m_DrawPinName = 1; - Fields = NULL; - m_Prefix.m_FieldId = REFERENCE; + Fields = NULL; + m_Prefix.m_FieldId = REFERENCE; } + /******************************************************/ EDA_LibComponentStruct::~EDA_LibComponentStruct( void ) /******************************************************/ { -LibEDA_BaseStruct * DrawItem, * NextDrawItem; -LibDrawField *TempField, *field; + LibEDA_BaseStruct* DrawItem, * NextDrawItem; + LibDrawField* TempField, * field; - field = Fields; Fields = NULL; - while (field) - { - TempField = field; field = (LibDrawField *) field->Pnext; - delete TempField; - } + field = Fields; Fields = NULL; + while( field ) + { + TempField = field; field = (LibDrawField*) field->Pnext; + delete TempField; + } - /* suppression des elements dependants */ - DrawItem = m_Drawings; m_Drawings = NULL; - while(DrawItem) - { - NextDrawItem = DrawItem->Next(); - delete DrawItem; - DrawItem = NextDrawItem; - } + /* suppression des elements dependants */ + DrawItem = m_Drawings; m_Drawings = NULL; + while( DrawItem ) + { + NextDrawItem = DrawItem->Next(); + delete DrawItem; + DrawItem = NextDrawItem; + } } /**********************************************************************/ -EDA_Rect EDA_LibComponentStruct::GetBoundaryBox( int Unit, int Convert) +EDA_Rect EDA_LibComponentStruct::GetBoundaryBox( int Unit, int Convert ) /**********************************************************************/ + /* Return the componenty boundary box ( in user coordinates ) - The unit Unit, and the shape Convert are considered. - If Unit == 0, Unit is not used - if Convert == 0 Convert is non used -**/ + * The unit Unit, and the shape Convert are considered. + * If Unit == 0, Unit is not used + * if Convert == 0 Convert is non used + **/ { -int xmin, xmax, ymin, ymax, x1, y1; -int * pt, ii; -LibEDA_BaseStruct * DrawEntry; -EDA_Rect BoundaryBox; + int xmin, xmax, ymin, ymax, x1, y1; + int* pt, ii; + LibEDA_BaseStruct* DrawEntry; + EDA_Rect BoundaryBox; - DrawEntry = m_Drawings; - if ( DrawEntry ) - { - xmin = ymin = 0x7FFFFFFF; xmax = ymax = 0x80000000; - } - else - { - xmin = ymin = -50; xmax = ymax = 50; // Min size in 1/1000 inch - } + DrawEntry = m_Drawings; + if( DrawEntry ) + { + xmin = ymin = 0x7FFFFFFF; + xmax = ymax = 0x80000000; + } + else + { + xmin = ymin = -50; + xmax = ymax = 50; // Min size in 1/1000 inch + } - for ( ;DrawEntry != NULL; DrawEntry = DrawEntry->Next() ) - { - if ( DrawEntry->m_Unit > 0 ) // The item is non common to units - if ( (m_UnitCount > 1 ) && (Unit > 0) && (Unit != DrawEntry->m_Unit) ) - continue; - if ( DrawEntry->m_Convert > 0 ) //The item is not common to alls convert - if ( (Convert > 0) && (Convert != DrawEntry->m_Convert) ) - continue; - - switch ( DrawEntry->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - { - // Arc is reduced to a line from m_Start to m_End. - // TO DO better. - LibDrawArc * Arc = (LibDrawArc *) DrawEntry; - x1 = Arc->m_ArcStart.x; - y1 = Arc->m_ArcStart.y; - xmin = MIN(xmin, x1); - ymin = MIN(ymin, y1); - xmax = MAX(xmax, x1); - ymax = MAX(ymax, y1); - x1 = Arc->m_ArcEnd.x; - y1 = Arc->m_ArcEnd.y; - xmin = MIN(xmin, x1); - ymin = MIN(ymin, y1); - xmax = MAX(xmax, x1); - ymax = MAX(ymax, y1); - } - break; + for( ; DrawEntry != NULL; DrawEntry = DrawEntry->Next() ) + { + if( DrawEntry->m_Unit > 0 ) // The item is non common to units + if( (m_UnitCount > 1 ) && (Unit > 0) && (Unit != DrawEntry->m_Unit) ) + continue; + if( DrawEntry->m_Convert > 0 ) //The item is not common to alls convert + if( (Convert > 0) && (Convert != DrawEntry->m_Convert) ) + continue; - case COMPONENT_CIRCLE_DRAW_TYPE: - { - LibDrawCircle * Circle = (LibDrawCircle *) DrawEntry; - x1 = Circle->m_Pos.x - Circle->m_Rayon; - y1 = Circle->m_Pos.y - Circle->m_Rayon; - xmin = MIN(xmin, x1); - ymin = MIN(ymin, y1); - x1 = Circle->m_Pos.x + Circle->m_Rayon; - y1 = Circle->m_Pos.y + Circle->m_Rayon; - xmax = MAX(xmax, x1); - ymax = MAX(ymax, y1); - } - break; + switch( DrawEntry->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + { + // Arc is reduced to a line from m_Start to m_End. + // TO DO better. + LibDrawArc* Arc = (LibDrawArc*) DrawEntry; + x1 = Arc->m_ArcStart.x; + y1 = Arc->m_ArcStart.y; + xmin = MIN( xmin, x1 ); + ymin = MIN( ymin, y1 ); + xmax = MAX( xmax, x1 ); + ymax = MAX( ymax, y1 ); + x1 = Arc->m_ArcEnd.x; + y1 = Arc->m_ArcEnd.y; + xmin = MIN( xmin, x1 ); + ymin = MIN( ymin, y1 ); + xmax = MAX( xmax, x1 ); + ymax = MAX( ymax, y1 ); + } + break; - case COMPONENT_RECT_DRAW_TYPE: - { - LibDrawSquare * Square = (LibDrawSquare *) DrawEntry; - xmin = MIN(xmin, Square->m_Pos.x); - xmin = MIN(xmin, Square->m_End.x); - xmax = MAX(xmax, Square->m_Pos.x); - xmax = MAX(xmax, Square->m_End.x); - ymin = MIN(ymin, Square->m_Pos.y); - ymin = MIN(ymin, Square->m_End.y); - ymax = MAX(ymax, Square->m_Pos.y); - ymax = MAX(ymax, Square->m_End.y); - } - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + { + LibDrawCircle* Circle = (LibDrawCircle*) DrawEntry; + x1 = Circle->m_Pos.x - Circle->m_Rayon; + y1 = Circle->m_Pos.y - Circle->m_Rayon; + xmin = MIN( xmin, x1 ); + ymin = MIN( ymin, y1 ); + x1 = Circle->m_Pos.x + Circle->m_Rayon; + y1 = Circle->m_Pos.y + Circle->m_Rayon; + xmax = MAX( xmax, x1 ); + ymax = MAX( ymax, y1 ); + } + break; - case COMPONENT_PIN_DRAW_TYPE: - { - LibDrawPin * Pin = (LibDrawPin *) DrawEntry; - x1 = Pin->m_Pos.x; - y1 = Pin->m_Pos.y; - xmin = MIN(xmin, x1); - xmax = MAX(xmax, x1); - ymin = MIN(ymin, y1); - ymax = MAX(ymax, y1); -#if 0 // 0 pour englober le point origine de la pin, 1 pour englober toute la pin - switch ( Pin->Orient ) - { - case PIN_UP: y1 += Pin->Len; break; - case PIN_DOWN: y1 -= Pin->Len; break; - case PIN_LEFT: x1 -= Pin->Len; break; - case PIN_RIGHT: x1 += Pin->Len; break; - } - xmin = MIN(xmin, x1); - xmax = MAX(xmax, x1); - ymin = MIN(ymin, y1); - ymax = MAX(ymax, y1); + case COMPONENT_RECT_DRAW_TYPE: + { + LibDrawSquare* Square = (LibDrawSquare*) DrawEntry; + xmin = MIN( xmin, Square->m_Pos.x ); + xmin = MIN( xmin, Square->m_End.x ); + xmax = MAX( xmax, Square->m_Pos.x ); + xmax = MAX( xmax, Square->m_End.x ); + ymin = MIN( ymin, Square->m_Pos.y ); + ymin = MIN( ymin, Square->m_End.y ); + ymax = MAX( ymax, Square->m_Pos.y ); + ymax = MAX( ymax, Square->m_End.y ); + } + break; + + case COMPONENT_PIN_DRAW_TYPE: + { + LibDrawPin* Pin = (LibDrawPin*) DrawEntry; + x1 = Pin->m_Pos.x; + y1 = Pin->m_Pos.y; + xmin = MIN( xmin, x1 ); + xmax = MAX( xmax, x1 ); + ymin = MIN( ymin, y1 ); + ymax = MAX( ymax, y1 ); +#if 0 \ + // 0 pour englober le point origine de la pin, 1 pour englober toute la pin + switch( Pin->Orient ) + { + case PIN_UP: + y1 += Pin->Len; break; + + case PIN_DOWN: + y1 -= Pin->Len; break; + + case PIN_LEFT: + x1 -= Pin->Len; break; + + case PIN_RIGHT: + x1 += Pin->Len; break; + } + + xmin = MIN( xmin, x1 ); + xmax = MAX( xmax, x1 ); + ymin = MIN( ymin, y1 ); + ymax = MAX( ymax, y1 ); #endif - } - break; + } + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - break; + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - { - LibDrawPolyline * polyline = (LibDrawPolyline *) DrawEntry; - pt = polyline->PolyList; - for( ii = 0; ii < polyline->n; ii++ ) - { - if( xmin > *pt ) xmin = *pt; - if( xmax < *pt ) xmax = *pt; - pt++; - if( ymin > *pt ) ymin = *pt; - if( ymax < *pt ) ymax = *pt; - pt++; - } - } - break; - } - } + case COMPONENT_POLYLINE_DRAW_TYPE: + { + LibDrawPolyline* polyline = (LibDrawPolyline*) DrawEntry; + pt = polyline->PolyList; + for( ii = 0; ii < polyline->n; ii++ ) + { + if( xmin > *pt ) + xmin = *pt; + if( xmax < *pt ) + xmax = *pt; + pt++; + if( ymin > *pt ) + ymin = *pt; + if( ymax < *pt ) + ymax = *pt; + pt++; + } + } + break; + + default: + ; + } + } - // Update the BoundaryBox. Remenber the fact the screen Y axis is the reverse */ - ymax = - ymax; ymin = -ymin; // Y is is screen axis sense - // Ensure w and H > 0 (wxRect assume it) - if ( xmax < xmin ) EXCHG( xmax, xmin ); - if ( ymax < ymin ) EXCHG( ymax, ymin ); - BoundaryBox.SetX(xmin); BoundaryBox.SetWidth(xmax-xmin); - BoundaryBox.SetY(ymin); BoundaryBox.SetHeight(ymax-ymin); + // Update the BoundaryBox. Remenber the fact the screen Y axis is the reverse */ + ymax = -ymax; ymin = -ymin; // Y is is screen axis sense + // Ensure w and H > 0 (wxRect assume it) + if( xmax < xmin ) + EXCHG( xmax, xmin ); + if( ymax < ymin ) + EXCHG( ymax, ymin ); + BoundaryBox.SetX( xmin ); BoundaryBox.SetWidth( xmax - xmin ); + BoundaryBox.SetY( ymin ); BoundaryBox.SetHeight( ymax - ymin ); - return BoundaryBox; + return BoundaryBox; } - /***************************/ - /* class LibraryFieldEntry */ - /***************************/ +/***************************/ +/* class LibraryFieldEntry */ +/***************************/ + /* a Field is a string linked to a component. - Unlike a pure graphic text, fields can be used in netlist generation - and other things. - - 4 fields have a special meaning: - REFERENCE - VALUE - FOOTPRINT NAME - SCHEMATIC LINK (reserved but not used in kicad) -*/ -LibDrawField::LibDrawField(int idfield) : LibEDA_BaseStruct(COMPONENT_FIELD_DRAW_TYPE) + * Unlike a pure graphic text, fields can be used in netlist generation + * and other things. + * + * 4 fields have a special meaning: + * REFERENCE + * VALUE + * FOOTPRINT NAME + * SCHEMATIC LINK (reserved but not used in kicad) + */ +LibDrawField::LibDrawField( int idfield ) : LibEDA_BaseStruct( COMPONENT_FIELD_DRAW_TYPE ) { - m_FieldId = idfield; /* 0 a 11, 0 = REFERENCE, 1 = VALUE*/ - if ( m_FieldId < 0 ) m_FieldId = 0; - if ( m_FieldId >= NUMBER_OF_FIELDS ) m_FieldId = NUMBER_OF_FIELDS - 1; - m_Size.x = m_Size.y = DEFAULT_SIZE_TEXT; - m_Orient = 0; /* Orientation */ - m_Attributs = 0; /* Attributs = unvisible ... */ - m_Width = 0; - m_HJustify = GR_TEXT_HJUSTIFY_CENTER; - m_VJustify = GR_TEXT_VJUSTIFY_CENTER; /* Horizontal and vertical text justification */ + m_FieldId = idfield; /* 0 a 11, 0 = REFERENCE, 1 = VALUE*/ + if( m_FieldId < 0 ) + m_FieldId = 0; + if( m_FieldId >= NUMBER_OF_FIELDS ) + m_FieldId = NUMBER_OF_FIELDS - 1; + m_Size.x = m_Size.y = DEFAULT_SIZE_TEXT; + m_Orient = 0; /* Orientation */ + m_Attributs = 0; /* Attributs = unvisible ... */ + m_Width = 0; + m_HJustify = GR_TEXT_HJUSTIFY_CENTER; + m_VJustify = GR_TEXT_VJUSTIFY_CENTER; /* Horizontal and vertical text justification */ } -LibDrawField::~LibDrawField(void) + +LibDrawField::~LibDrawField( void ) { } - // Creation et Duplication d'un field -LibDrawField * LibDrawField::GenCopy(void) -{ - LibDrawField * newfield = new LibDrawField(m_FieldId); - Copy(newfield); - return newfield; +// Creation et Duplication d'un field +LibDrawField* LibDrawField::GenCopy( void ) +{ + LibDrawField* newfield = new LibDrawField( m_FieldId ); + + Copy( newfield ); + + return newfield; } - // copie du field dans le field Target -void LibDrawField::Copy(LibDrawField * Target) + +// copie du field dans le field Target +void LibDrawField::Copy( LibDrawField* Target ) { - Target->m_Pos = m_Pos; - Target->m_Size = m_Size; - Target->m_Width = m_Width; - Target->m_Orient = m_Orient; - Target->m_Attributs = m_Attributs; - Target->m_Text = m_Text; - Target->m_Name = m_Name; - Target->m_HJustify = m_HJustify; - Target->m_VJustify = m_VJustify; + Target->m_Pos = m_Pos; + Target->m_Size = m_Size; + Target->m_Width = m_Width; + Target->m_Orient = m_Orient; + Target->m_Attributs = m_Attributs; + Target->m_Text = m_Text; + Target->m_Name = m_Name; + Target->m_HJustify = m_HJustify; + Target->m_VJustify = m_VJustify; } + /* Elements Graphiques */ -LibEDA_BaseStruct::LibEDA_BaseStruct(int struct_type): - EDA_BaseStruct(struct_type) +LibEDA_BaseStruct::LibEDA_BaseStruct( KICAD_T struct_type ) : + EDA_BaseStruct( struct_type ) { - m_Unit = 0; /* Unit identification (for multi part per package) - 0 if the item is common to all units */ - m_Convert = 0; /* Shape identification (for parts which have a convert shape) - 0 if the item is common to all shapes */ - m_Width = 0; /* Default value to draw lines or arc ... */ + m_Unit = 0; /* Unit identification (for multi part per package) + * 0 if the item is common to all units */ + m_Convert = 0; /* Shape identification (for parts which have a convert shape) + * 0 if the item is common to all shapes */ + m_Width = 0; /* Default value to draw lines or arc ... */ } + /***************************************************************/ -LibDrawPin::LibDrawPin(void) : LibEDA_BaseStruct(COMPONENT_PIN_DRAW_TYPE) +LibDrawPin::LibDrawPin( void ) : LibEDA_BaseStruct( COMPONENT_PIN_DRAW_TYPE ) /***************************************************************/ { - m_PinLen = 300; /* default Pin len */ - m_Orient = PIN_RIGHT; /* Pin oprient: Up, Down, Left, Right */ - m_PinShape = NONE; /* Bit a bit: Pin shape (voir enum prec) */ - m_PinType = PIN_UNSPECIFIED; /* electrical type of pin */ - m_Attributs = 0; /* bit 0 != 0: pin invisible */ - m_PinNum = 0; /*pin number ( i.e. 4 codes Ascii ) */ - m_PinNumSize = 50; - m_PinNameSize = 50; /* Default size for pin name and num */ - m_Width = 0; + m_PinLen = 300; /* default Pin len */ + m_Orient = PIN_RIGHT; /* Pin oprient: Up, Down, Left, Right */ + m_PinShape = NONE; /* Bit a bit: Pin shape (voir enum prec) */ + m_PinType = PIN_UNSPECIFIED; /* electrical type of pin */ + m_Attributs = 0; /* bit 0 != 0: pin invisible */ + m_PinNum = 0; /*pin number ( i.e. 4 codes Ascii ) */ + m_PinNumSize = 50; + m_PinNameSize = 50; /* Default size for pin name and num */ + m_Width = 0; + // m_PinNumWidth = m_PinNameWidth = 0; // Unused } /******************************************/ -wxPoint LibDrawPin::ReturnPinEndPoint(void) +wxPoint LibDrawPin::ReturnPinEndPoint( void ) /******************************************/ + /* return the pin end position, for a component in normal orient -*/ + */ { -wxPoint pos = m_Pos; - switch ( m_Orient ) - { - case PIN_UP: pos.y += m_PinLen; break; - case PIN_DOWN: pos.y -= m_PinLen; break; - case PIN_LEFT: pos.x -= m_PinLen; break; - case PIN_RIGHT: pos.x += m_PinLen; break; - } + wxPoint pos = m_Pos; - return pos; + switch( m_Orient ) + { + case PIN_UP: + pos.y += m_PinLen; break; + + case PIN_DOWN: + pos.y -= m_PinLen; break; + + case PIN_LEFT: + pos.x -= m_PinLen; break; + + case PIN_RIGHT: + pos.x += m_PinLen; break; + } + + return pos; } + /********************************************************/ -int LibDrawPin::ReturnPinDrawOrient(int TransMat[2][2]) +int LibDrawPin::ReturnPinDrawOrient( int TransMat[2][2] ) /********************************************************/ + /* Return the pin real orientation (PIN_UP, PIN_DOWN, PIN_RIGHT, PIN_LEFT), - according to its orientation, - AND the matrix transform (rot, mirror) TransMat -*/ + * according to its orientation, + * AND the matrix transform (rot, mirror) TransMat + */ { -int orient; -int x1 = 0, y1 = 0; -int t1, t2; - - switch ( m_Orient ) - { - case PIN_UP: y1 = 1; break; - case PIN_DOWN: y1 = -1; break; - case PIN_LEFT: x1 = -1; break; - case PIN_RIGHT: x1 = 1; break; - } - t1 = TransMat[0][0] * x1 + TransMat[0][1] * y1; - t2 = TransMat[1][0] * x1 + TransMat[1][1] * y1; - orient = PIN_UP; - if( t1 == 0 ) - { - if ( t2 > 0 ) orient = PIN_DOWN; - } - else - { - orient = PIN_RIGHT; - if ( t1 < 0 ) orient = PIN_LEFT; - } + int orient; + int x1 = 0, y1 = 0; + int t1, t2; - return orient; + switch( m_Orient ) + { + case PIN_UP: + y1 = 1; break; + + case PIN_DOWN: + y1 = -1; break; + + case PIN_LEFT: + x1 = -1; break; + + case PIN_RIGHT: + x1 = 1; break; + } + + t1 = TransMat[0][0] * x1 + TransMat[0][1] * y1; + t2 = TransMat[1][0] * x1 + TransMat[1][1] * y1; + orient = PIN_UP; + if( t1 == 0 ) + { + if( t2 > 0 ) + orient = PIN_DOWN; + } + else + { + orient = PIN_RIGHT; + if( t1 < 0 ) + orient = PIN_LEFT; + } + + return orient; } /****************************************************/ -void LibDrawPin::ReturnPinStringNum(wxString & buffer) +void LibDrawPin::ReturnPinStringNum( wxString& buffer ) /****************************************************/ + /* fill the buffer with pin num as a wxString - Pin num is coded as a long - Used to print/draw the pin num -*/ + * Pin num is coded as a long + * Used to print/draw the pin num + */ { -char ascii_buf[5]; - - strncpy(ascii_buf, (char*)&m_PinNum,4); - ascii_buf[4]=0; + char ascii_buf[5]; - buffer = CONV_FROM_UTF8(ascii_buf); + strncpy( ascii_buf, (char*) &m_PinNum, 4 ); + ascii_buf[4] = 0; + + buffer = CONV_FROM_UTF8( ascii_buf ); } + + /****************************************************/ -void LibDrawPin::SetPinNumFromString(wxString & buffer) +void LibDrawPin::SetPinNumFromString( wxString& buffer ) /****************************************************/ + /* fill the buffer with pin num as a wxString - Pin num is coded as a long - Used to print/draw the pin num -*/ + * Pin num is coded as a long + * Used to print/draw the pin num + */ { -char ascii_buf[4]; -unsigned ii, len = buffer.Len(); - - ascii_buf[0] = ascii_buf[1] = ascii_buf[2] = ascii_buf[3] = 0; - if ( len > 4 ) len = 4; - for ( ii = 0; ii < len; ii ++ ) - { - ascii_buf[ii] = buffer.GetChar(ii) & 0xFF; - } - strncpy((char*)&m_PinNum, ascii_buf, 4); + char ascii_buf[4]; + unsigned ii, len = buffer.Len(); + + ascii_buf[0] = ascii_buf[1] = ascii_buf[2] = ascii_buf[3] = 0; + if( len > 4 ) + len = 4; + for( ii = 0; ii < len; ii++ ) + { + ascii_buf[ii] = buffer.GetChar( ii ) & 0xFF; + } + + strncpy( (char*) &m_PinNum, ascii_buf, 4 ); } + /*************************************/ -LibDrawPin * LibDrawPin::GenCopy(void) +LibDrawPin* LibDrawPin::GenCopy( void ) /*************************************/ { -LibDrawPin * newpin = new LibDrawPin(); + LibDrawPin* newpin = new LibDrawPin(); - newpin->m_Pos = m_Pos; - newpin->m_PinLen = m_PinLen; - newpin->m_Orient = m_Orient; - newpin->m_PinShape = m_PinShape; - newpin->m_PinType = m_PinType; - newpin->m_Attributs = m_Attributs; - newpin->m_PinNum = m_PinNum; - newpin->m_PinNumSize = m_PinNumSize; - newpin->m_PinNameSize = m_PinNameSize; - newpin->m_Unit = m_Unit; - newpin->m_Convert = m_Convert; - newpin->m_Flags = m_Flags; - newpin->m_Width = m_Width; + newpin->m_Pos = m_Pos; + newpin->m_PinLen = m_PinLen; + newpin->m_Orient = m_Orient; + newpin->m_PinShape = m_PinShape; + newpin->m_PinType = m_PinType; + newpin->m_Attributs = m_Attributs; + newpin->m_PinNum = m_PinNum; + newpin->m_PinNumSize = m_PinNumSize; + newpin->m_PinNameSize = m_PinNameSize; + newpin->m_Unit = m_Unit; + newpin->m_Convert = m_Convert; + newpin->m_Flags = m_Flags; + newpin->m_Width = m_Width; - newpin->m_PinName = m_PinName; + newpin->m_PinName = m_PinName; - return newpin; + return newpin; } + /**************************************************************/ -LibDrawArc::LibDrawArc(void) : LibEDA_BaseStruct(COMPONENT_ARC_DRAW_TYPE) +LibDrawArc::LibDrawArc( void ) : LibEDA_BaseStruct( COMPONENT_ARC_DRAW_TYPE ) /**************************************************************/ { - m_Rayon = 0; - t1 = t2 = 0; - m_Width = 0; - m_Fill = NO_FILL; + m_Rayon = 0; + t1 = t2 = 0; + m_Width = 0; + m_Fill = NO_FILL; } /************************************/ -LibDrawArc * LibDrawArc::GenCopy(void) +LibDrawArc* LibDrawArc::GenCopy( void ) /************************************/ { -LibDrawArc * newitem = new LibDrawArc(); + LibDrawArc* newitem = new LibDrawArc(); - newitem->m_Pos = m_Pos; - newitem->m_ArcStart = m_ArcStart; - newitem->m_ArcEnd = m_ArcEnd; - newitem->m_Rayon = m_Rayon; - newitem->t1 = t1; - newitem->t2 = t2; - newitem->m_Width = m_Width; - newitem->m_Unit = m_Unit; - newitem->m_Convert = m_Convert; - newitem->m_Flags = m_Flags; - newitem->m_Fill = m_Fill; - return newitem; + newitem->m_Pos = m_Pos; + newitem->m_ArcStart = m_ArcStart; + newitem->m_ArcEnd = m_ArcEnd; + newitem->m_Rayon = m_Rayon; + newitem->t1 = t1; + newitem->t2 = t2; + newitem->m_Width = m_Width; + newitem->m_Unit = m_Unit; + newitem->m_Convert = m_Convert; + newitem->m_Flags = m_Flags; + newitem->m_Fill = m_Fill; + return newitem; } /**********************************************************************/ -LibDrawCircle::LibDrawCircle(void) : LibEDA_BaseStruct(COMPONENT_CIRCLE_DRAW_TYPE) +LibDrawCircle::LibDrawCircle( void ) : LibEDA_BaseStruct( COMPONENT_CIRCLE_DRAW_TYPE ) /**********************************************************************/ { - m_Rayon = 0; - m_Fill = NO_FILL; + m_Rayon = 0; + m_Fill = NO_FILL; } + /*******************************************/ -LibDrawCircle * LibDrawCircle::GenCopy(void) +LibDrawCircle* LibDrawCircle::GenCopy( void ) /*******************************************/ { -LibDrawCircle * newitem = new LibDrawCircle(); + LibDrawCircle* newitem = new LibDrawCircle(); - newitem->m_Pos = m_Pos; - newitem->m_Rayon = m_Rayon; - newitem->m_Width = m_Width; - newitem->m_Unit = m_Unit; - newitem->m_Convert = m_Convert; - newitem->m_Flags = m_Flags; - newitem->m_Fill = m_Fill; - return newitem; + newitem->m_Pos = m_Pos; + newitem->m_Rayon = m_Rayon; + newitem->m_Width = m_Width; + newitem->m_Unit = m_Unit; + newitem->m_Convert = m_Convert; + newitem->m_Flags = m_Flags; + newitem->m_Fill = m_Fill; + return newitem; } /*****************************************************************/ -LibDrawText::LibDrawText(void) : LibEDA_BaseStruct(COMPONENT_GRAPHIC_TEXT_DRAW_TYPE) +LibDrawText::LibDrawText( void ) : LibEDA_BaseStruct( COMPONENT_GRAPHIC_TEXT_DRAW_TYPE ) /*****************************************************************/ { - m_Horiz = TEXT_ORIENT_HORIZ; - m_Size = wxSize(50,50); - m_Type = 0; - m_Width = 0; + m_Horiz = TEXT_ORIENT_HORIZ; + m_Size = wxSize( 50, 50 ); + m_Type = 0; + m_Width = 0; } + /***************************************/ -LibDrawText * LibDrawText::GenCopy(void) +LibDrawText* LibDrawText::GenCopy( void ) /***************************************/ { -LibDrawText * newitem = new LibDrawText(); + LibDrawText* newitem = new LibDrawText(); - newitem->m_Pos = m_Pos; - newitem->m_Horiz = m_Horiz; - newitem->m_Size = m_Size; - newitem->m_Type = m_Type; - newitem->m_Unit = m_Unit; - newitem->m_Convert = m_Convert; - newitem->m_Flags = m_Flags; - newitem->m_Text = m_Text; - newitem->m_Width = m_Width; - return newitem; + newitem->m_Pos = m_Pos; + newitem->m_Horiz = m_Horiz; + newitem->m_Size = m_Size; + newitem->m_Type = m_Type; + newitem->m_Unit = m_Unit; + newitem->m_Convert = m_Convert; + newitem->m_Flags = m_Flags; + newitem->m_Text = m_Text; + newitem->m_Width = m_Width; + return newitem; } - -LibDrawSquare::LibDrawSquare(void) : LibEDA_BaseStruct(COMPONENT_RECT_DRAW_TYPE) +LibDrawSquare::LibDrawSquare( void ) : LibEDA_BaseStruct( COMPONENT_RECT_DRAW_TYPE ) { - m_Width = 0; - m_Fill = NO_FILL; + m_Width = 0; + m_Fill = NO_FILL; } -LibDrawSquare * LibDrawSquare::GenCopy(void) + +LibDrawSquare* LibDrawSquare::GenCopy( void ) { -LibDrawSquare * newitem = new LibDrawSquare(); + LibDrawSquare* newitem = new LibDrawSquare(); - newitem->m_Pos = m_Pos; - newitem->m_End = m_End; - newitem->m_Width = m_Width; - newitem->m_Unit = m_Unit; - newitem->m_Convert = m_Convert; - newitem->m_Flags = m_Flags; - newitem->m_Fill = m_Fill; - return newitem; + newitem->m_Pos = m_Pos; + newitem->m_End = m_End; + newitem->m_Width = m_Width; + newitem->m_Unit = m_Unit; + newitem->m_Convert = m_Convert; + newitem->m_Flags = m_Flags; + newitem->m_Fill = m_Fill; + return newitem; } -LibDrawSegment::LibDrawSegment(void) : LibEDA_BaseStruct(COMPONENT_LINE_DRAW_TYPE) + +LibDrawSegment::LibDrawSegment( void ) : LibEDA_BaseStruct( COMPONENT_LINE_DRAW_TYPE ) { - m_Width = 0; + m_Width = 0; } -LibDrawSegment * LibDrawSegment::GenCopy(void) + +LibDrawSegment* LibDrawSegment::GenCopy( void ) { -LibDrawSegment * newitem = new LibDrawSegment(); + LibDrawSegment* newitem = new LibDrawSegment(); - newitem->m_Pos = m_Pos; - newitem->m_End = m_End; - newitem->m_Width = m_Width; - newitem->m_Unit = m_Unit; - newitem->m_Convert = m_Convert; - newitem->m_Flags = m_Flags; - return newitem; + newitem->m_Pos = m_Pos; + newitem->m_End = m_End; + newitem->m_Width = m_Width; + newitem->m_Unit = m_Unit; + newitem->m_Convert = m_Convert; + newitem->m_Flags = m_Flags; + return newitem; } -LibDrawPolyline::LibDrawPolyline(void) : LibEDA_BaseStruct(COMPONENT_POLYLINE_DRAW_TYPE) +LibDrawPolyline::LibDrawPolyline( void ) : LibEDA_BaseStruct( COMPONENT_POLYLINE_DRAW_TYPE ) { - n = 0; - PolyList = NULL; - m_Fill = NO_FILL; - m_Width = 0; + n = 0; + PolyList = NULL; + m_Fill = NO_FILL; + m_Width = 0; } + /************************************************/ -LibDrawPolyline * LibDrawPolyline::GenCopy(void) +LibDrawPolyline* LibDrawPolyline::GenCopy( void ) /************************************************/ { -LibDrawPolyline * newitem = new LibDrawPolyline(); -int size; + LibDrawPolyline* newitem = new LibDrawPolyline(); - newitem->n = n; - size = sizeof(int) * 2 * n; - if( size ) - { - newitem->PolyList = (int*)MyMalloc(size); - memcpy(newitem->PolyList, PolyList, size); - } - newitem->m_Pos = m_Pos; - newitem->m_Width = m_Width; - newitem->m_Unit = m_Unit; - newitem->m_Convert = m_Convert; - newitem->m_Flags = m_Flags; - newitem->m_Fill = m_Fill; - return newitem; + int size; + + newitem->n = n; + size = sizeof(int) * 2 * n; + if( size ) + { + newitem->PolyList = (int*) MyMalloc( size ); + memcpy( newitem->PolyList, PolyList, size ); + } + newitem->m_Pos = m_Pos; + newitem->m_Width = m_Width; + newitem->m_Unit = m_Unit; + newitem->m_Convert = m_Convert; + newitem->m_Flags = m_Flags; + newitem->m_Fill = m_Fill; + return newitem; } + /***************************************************/ -void LibDrawPolyline::AddPoint(const wxPoint & point) +void LibDrawPolyline::AddPoint( const wxPoint& point ) /***************************************************/ + /* add a point to the polyline coordinate list, and realloc the memory -*/ + */ { -int allocsize; + int allocsize; - n++; - allocsize = 2 * sizeof(int) * n; - if (PolyList == NULL) - PolyList = (int*)MyMalloc( allocsize ); - else - PolyList = (int*)realloc(PolyList, allocsize ); + n++; + allocsize = 2 * sizeof(int) * n; + if( PolyList == NULL ) + PolyList = (int*) MyMalloc( allocsize ); + else + PolyList = (int*) realloc( PolyList, allocsize ); - PolyList[(n*2) - 2] = point.x; - PolyList[(n*2) - 1] = - point.y; + PolyList[(n * 2) - 2] = point.x; + PolyList[(n * 2) - 1] = -point.y; } - - diff --git a/eeschema/libcmp.h b/eeschema/libcmp.h index af10386a4a..91d3e910a7 100644 --- a/eeschema/libcmp.h +++ b/eeschema/libcmp.h @@ -13,118 +13,120 @@ #define LIB_VERSION_MAJOR 2 #define LIB_VERSION_MINOR 3 -#define LIBFILE_IDENT "EESchema-LIBRARY Version" /* Must be at the lib file start. */ -#define DOCFILE_IDENT "EESchema-DOCLIB Version 2.0" /* Must be at the doc file start. */ -#define DOC_EXT wxT(".dcm") /* extension des fichiers de documentation */ +#define LIBFILE_IDENT "EESchema-LIBRARY Version" /* Must be at the lib file start. */ +#define DOCFILE_IDENT "EESchema-DOCLIB Version 2.0" /* Must be at the doc file start. */ +#define DOC_EXT wxT( ".dcm" ) /* extension des fichiers de documentation */ -#define TARGET_PIN_DIAM 12 /* Diam cercle des extremites des pins */ +#define TARGET_PIN_DIAM 12 /* Diam cercle des extremites des pins */ -#define DEFAULT_TEXT_SIZE 50 /* Default size for field texts */ -#define PART_NAME_LEN 15 /* Maximum length of part name. */ -#define PREFIX_NAME_LEN 5 /* Maximum length of prefix (IC, R, SW etc.). */ -#define PIN_WIDTH 100 /* Width between 2 pins in internal units. */ -#define PIN_LENGTH 300 /* Default Length of each pin to be drawn. */ +#define DEFAULT_TEXT_SIZE 50 /* Default size for field texts */ +#define PART_NAME_LEN 15 /* Maximum length of part name. */ +#define PREFIX_NAME_LEN 5 /* Maximum length of prefix (IC, R, SW etc.). */ +#define PIN_WIDTH 100 /* Width between 2 pins in internal units. */ +#define PIN_LENGTH 300 /* Default Length of each pin to be drawn. */ -#define INVERT_PIN_RADIUS 35 /* Radius of inverted pin circle. */ -#define CLOCK_PIN_DIM 40 /* Dim of clock pin symbol. */ -#define IEEE_SYMBOL_PIN_DIM 40 /* Dim of special pin symbol. */ +#define INVERT_PIN_RADIUS 35 /* Radius of inverted pin circle. */ +#define CLOCK_PIN_DIM 40 /* Dim of clock pin symbol. */ +#define IEEE_SYMBOL_PIN_DIM 40 /* Dim of special pin symbol. */ -#define NO_FILL 0 // Poly, Squar, Circle, Arc = option No Fill -#define FILLED_SHAPE 1 // Poly, Squar, Circle, Arc = option Fill with current color -#define FILLED_WITH_BG_BODYCOLOR 2 // Poly, Squar, Circle, Arc = option Fill - // with background body color +#define NO_FILL 0 // Poly, Squar, Circle, Arc = option No Fill +#define FILLED_SHAPE 1 // Poly, Squar, Circle, Arc = option Fill with current color +#define FILLED_WITH_BG_BODYCOLOR 2 // Poly, Squar, Circle, Arc = option Fill + // with background body color //Offsets used in editing library component, for handle aliad dats -#define ALIAS_NAME 0 -#define ALIAS_DOC 1 -#define ALIAS_KEYWORD 2 +#define ALIAS_NAME 0 +#define ALIAS_DOC 1 +#define ALIAS_KEYWORD 2 #define ALIAS_DOC_FILENAME 3 -#define ALIAS_NEXT 4 +#define ALIAS_NEXT 4 typedef enum { - LOCATE_COMPONENT_ARC_DRAW_TYPE = 1, - LOCATE_COMPONENT_CIRCLE_DRAW_TYPE = 2, - LOCATE_COMPONENT_GRAPHIC_TEXT_DRAW_TYPE = 4, - LOCATE_COMPONENT_RECT_DRAW_TYPE = 8, - LOCATE_LINE_DRAW_TYPE = 0x10, - LOCATE_COMPONENT_POLYLINE_DRAW_TYPE = 0x20, - LOCATE_COMPONENT_LINE_DRAW_TYPE = 0x40 + LOCATE_COMPONENT_ARC_DRAW_TYPE = 1, + LOCATE_COMPONENT_CIRCLE_DRAW_TYPE = 2, + LOCATE_COMPONENT_GRAPHIC_TEXT_DRAW_TYPE = 4, + LOCATE_COMPONENT_RECT_DRAW_TYPE = 8, + LOCATE_LINE_DRAW_TYPE = 0x10, + LOCATE_COMPONENT_POLYLINE_DRAW_TYPE = 0x20, + LOCATE_COMPONENT_LINE_DRAW_TYPE = 0x40 } LocateDrawStructType; #define LOCATE_ALL_DRAW_ITEM 0xFFFFFFFF /* flags utilises dans FindLibPart() : */ -#define FIND_ROOT 0 /* indique la recherche du composant racine si - meme si le composant specifie est un alias */ -#define FIND_ALIAS 1 /* indique la recherche du composant specifie - (alias ou racine) */ +#define FIND_ROOT 0 /* indique la recherche du composant racine si + * meme si le composant specifie est un alias */ +#define FIND_ALIAS 1 /* indique la recherche du composant specifie + * (alias ou racine) */ /* definition des types des structures d'elements de librairie */ typedef enum { - ROOT, /* Structure est a standard EDA_LibComponentStruct */ - ALIAS /* Structure is an alias */ + ROOT, /* Structure est a standard EDA_LibComponentStruct */ + ALIAS /* Structure is an alias */ } LibrEntryType; /* valeur du membre .m_Options */ typedef enum { - ENTRY_NORMAL, // Libentry is standard - ENTRY_POWER // Libentry is a power symbol + ENTRY_NORMAL, // Libentry is standard + ENTRY_POWER // Libentry is a power symbol } LibrEntryOptions; /* Definitions des Pins */ -typedef enum { /* Type des Pins. si modif: modifier tableau des mgs suivant */ - PIN_INPUT, - PIN_OUTPUT, - PIN_BIDI, - PIN_TRISTATE, - PIN_PASSIVE, - PIN_UNSPECIFIED, - PIN_POWER_IN, - PIN_POWER_OUT, - PIN_OPENCOLLECTOR, - PIN_OPENEMITTER, - PIN_NC, /* No connect */ - PIN_NMAX /* Valeur limite ( utilisee comme limite de tableaux) */ +typedef enum { /* Type des Pins. si modif: modifier tableau des mgs suivant */ + PIN_INPUT, + PIN_OUTPUT, + PIN_BIDI, + PIN_TRISTATE, + PIN_PASSIVE, + PIN_UNSPECIFIED, + PIN_POWER_IN, + PIN_POWER_OUT, + PIN_OPENCOLLECTOR, + PIN_OPENEMITTER, + PIN_NC, /* No connect */ + PIN_NMAX /* Valeur limite ( utilisee comme limite de tableaux) */ } ElectricPinType; /* Messages d'affichage du type electrique */ -eda_global wxChar * MsgPinElectricType[] +eda_global wxChar* MsgPinElectricType[] #ifdef MAIN - = { - wxT("input"), - wxT("output"), - wxT("BiDi"), - wxT("3state"), - wxT("passive"), - wxT("unspc"), - wxT("power_in"), - wxT("power_out"), - wxT("openCol"), - wxT("openEm"), - wxT("?????") - } += { + wxT( "input" ), + wxT( "output" ), + wxT( "BiDi" ), + wxT( "3state" ), + wxT( "passive" ), + wxT( "unspc" ), + wxT( "power_in" ), + wxT( "power_out" ), + wxT( "openCol" ), + wxT( "openEm" ), + wxT( "?????" ) +} + + #endif - ; +; /* Autres bits: bits du membre .Flag des Pins */ -#define PINNOTDRAW 1 /* si 1: pin invisible */ +#define PINNOTDRAW 1 /* si 1: pin invisible */ -typedef enum { /* Forme des Pins */ - NONE = 0, - INVERT = 1, - CLOCK = 2, - LOWLEVEL_IN = 4, - LOWLEVEL_OUT = 8 - } DrawPinShape; +typedef enum { /* Forme des Pins */ + NONE = 0, + INVERT = 1, + CLOCK = 2, + LOWLEVEL_IN = 4, + LOWLEVEL_OUT = 8 +} DrawPinShape; -typedef enum { /* Orientation des Pins */ - PIN_RIGHT = 'R', - PIN_LEFT = 'L', - PIN_UP = 'U', - PIN_DOWN = 'D', - } DrawPinOrient; +typedef enum { /* Orientation des Pins */ + PIN_RIGHT = 'R', + PIN_LEFT = 'L', + PIN_UP = 'U', + PIN_DOWN = 'D', +} DrawPinOrient; /*************************************/ /* Classe representant une librairie */ @@ -133,25 +135,25 @@ typedef enum { /* Orientation des Pins */ class LibraryStruct { public: - int m_Type; /* type indicator */ - wxString m_Name; /* Name of library loaded. */ - wxString m_FullFileName; /* Full File Name (with path) of library loaded. */ - wxString m_Header; /* first line of library loaded. */ - int m_NumOfParts; /* Number of parts this library has. */ - PriorQue * m_Entries; /* Parts themselves are saved here. */ - LibraryStruct * m_Pnext; /* Point on next lib in chain. */ - int m_Modified; /* flag indicateur d'edition */ - int m_Size; // Size in bytes (for statistics) - unsigned long m_TimeStamp; // Signature temporelle - int m_Flags; // variable used in some functions - bool m_IsLibCache; // False for the "standard" libraries, - // True for the library cache + int m_Type; /* type indicator */ + wxString m_Name; /* Name of library loaded. */ + wxString m_FullFileName; /* Full File Name (with path) of library loaded. */ + wxString m_Header; /* first line of library loaded. */ + int m_NumOfParts; /* Number of parts this library has. */ + PriorQue* m_Entries; /* Parts themselves are saved here. */ + LibraryStruct* m_Pnext; /* Point on next lib in chain. */ + int m_Modified; /* flag indicateur d'edition */ + int m_Size; // Size in bytes (for statistics) + unsigned long m_TimeStamp; // Signature temporelle + int m_Flags; // variable used in some functions + bool m_IsLibCache; // False for the "standard" libraries, + // True for the library cache public: - LibraryStruct(int type, const wxString & name, const wxString & fullname); - ~LibraryStruct(); - bool WriteHeader(FILE * file); - bool ReadHeader(FILE * file, int * LineNum); + LibraryStruct( int type, const wxString &name, const wxString &fullname ); + ~LibraryStruct(); + bool WriteHeader( FILE* file ); + bool ReadHeader( FILE* file, int* LineNum ); }; @@ -161,252 +163,260 @@ public: /* class LibEDA_BaseStruct : Basic class for items used in a library component - (graphic shapes, texts, fields, pins) -*/ + * (graphic shapes, texts, fields, pins) + */ class LibEDA_BaseStruct : public EDA_BaseStruct { public: - int m_Unit; /* Unit identification (for multi part per parkage) - 0 if the item is common to all units */ - int m_Convert; /* Shape identification (for parts which have a convert shape) - 0 if the item is common to all shapes */ - wxPoint m_Pos; /* Position or centre (Arc and Circle) or start point (segments) */ - int m_Width; /* Width of draw lines */ + int m_Unit; /* Unit identification (for multi part per parkage) + * 0 if the item is common to all units */ + int m_Convert; /* Shape identification (for parts which have a convert shape) + * 0 if the item is common to all shapes */ + wxPoint m_Pos; /* Position or centre (Arc and Circle) or start point (segments) */ + int m_Width; /* Width of draw lines */ public: - LibEDA_BaseStruct * Next(void) {return (LibEDA_BaseStruct *) Pnext;} - LibEDA_BaseStruct(int struct_type); - virtual ~LibEDA_BaseStruct(void){} - void Display_Infos_DrawEntry(WinEDA_DrawFrame * frame); + LibEDA_BaseStruct* Next( void ) + { + return (LibEDA_BaseStruct*) Pnext; + } + LibEDA_BaseStruct( KICAD_T struct_type ); + virtual ~LibEDA_BaseStruct( void ) { } + void Display_Infos_DrawEntry( WinEDA_DrawFrame* frame ); }; class LibDrawPin : public LibEDA_BaseStruct { public: - int m_PinLen; /* Pin lenght */ - int m_Orient; /* Pin orientation (Up, Down, Left, Right) */ - int m_PinShape; /* Bitwise ORed: Pin shape (see enum DrawPinShape) */ - int m_PinType; /* Electrical pin properties */ - int m_Attributs; /* bit 0 != 0: pin invisible */ - long m_PinNum; /* Pin number: 4 Ascii code like "12" or "anod" or "G6" - "12" is really "12\0\0"*/ - wxString m_PinName; - int m_PinNumSize, m_PinNameSize; /* Pin num and Pin name sizes */ + int m_PinLen; /* Pin lenght */ + int m_Orient; /* Pin orientation (Up, Down, Left, Right) */ + int m_PinShape; /* Bitwise ORed: Pin shape (see enum DrawPinShape) */ + int m_PinType; /* Electrical pin properties */ + int m_Attributs; /* bit 0 != 0: pin invisible */ + long m_PinNum; /* Pin number: 4 Ascii code like "12" or "anod" or "G6" + * "12" is really "12\0\0"*/ + wxString m_PinName; + int m_PinNumSize, m_PinNameSize;/* Pin num and Pin name sizes */ + // short m_PinNumWidth, m_PinNameWidth; /* (Unused) Pin num and Pin name text width */ public: - LibDrawPin(void); - ~LibDrawPin(void) {} - LibDrawPin * GenCopy(void); - bool WriteDescr( FILE * File ); - void Display_Infos(WinEDA_DrawFrame * frame); - wxPoint ReturnPinEndPoint(void); - int ReturnPinDrawOrient(int TransMat[2][2]); - void ReturnPinStringNum(wxString & buffer); - void SetPinNumFromString(wxString & buffer); - void DrawPinSymbol(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & pin_pos, int orient, - int DrawMode, int Color = -1); + LibDrawPin( void ); + ~LibDrawPin( void ) { } + LibDrawPin* GenCopy( void ); + bool WriteDescr( FILE* File ); + void Display_Infos( WinEDA_DrawFrame* frame ); + wxPoint ReturnPinEndPoint( void ); + int ReturnPinDrawOrient( int TransMat[2][2] ); + void ReturnPinStringNum( wxString& buffer ); + void SetPinNumFromString( wxString& buffer ); + void DrawPinSymbol( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& pin_pos, + int orient, + int DrawMode, int Color = -1 ); - void DrawPinTexts(WinEDA_DrawPanel * panel, wxDC * DC, - wxPoint & pin_pos, int orient, - int TextInside, bool DrawPinNum, bool DrawPinName, - int Color, int DrawMode); - void PlotPinTexts(wxPoint & pin_pos, int orient, - int TextInside, bool DrawPinNum, bool DrawPinName); + void DrawPinTexts( WinEDA_DrawPanel* panel, wxDC* DC, + wxPoint& pin_pos, int orient, + int TextInside, bool DrawPinNum, bool DrawPinName, + int Color, int DrawMode ); + void PlotPinTexts( wxPoint& pin_pos, int orient, + int TextInside, bool DrawPinNum, bool DrawPinName ); }; -class LibDrawArc : public LibEDA_BaseStruct +class LibDrawArc : public LibEDA_BaseStruct { public: - int m_Rayon; - int m_Fill; - int t1, t2; /* position des 2 extremites de l'arc en 0,1 degres */ - wxPoint m_ArcStart, m_ArcEnd; /* position des 2 extremites de l'arc en coord reelles*/ + int m_Rayon; + int m_Fill; + int t1, t2; /* position des 2 extremites de l'arc en 0,1 degres */ + wxPoint m_ArcStart, m_ArcEnd; /* position des 2 extremites de l'arc en coord reelles*/ public: - LibDrawArc(void); - ~LibDrawArc(void){} - LibDrawArc * GenCopy(void); - bool WriteDescr( FILE * File ); + LibDrawArc( void ); + ~LibDrawArc( void ) { } + LibDrawArc* GenCopy( void ); + bool WriteDescr( FILE* File ); }; -class LibDrawCircle : public LibEDA_BaseStruct +class LibDrawCircle : public LibEDA_BaseStruct { public: - int m_Rayon; - int m_Fill; + int m_Rayon; + int m_Fill; public: - LibDrawCircle(void); - ~LibDrawCircle(void){} - LibDrawCircle * GenCopy(void); - bool WriteDescr( FILE * File ); + LibDrawCircle( void ); + ~LibDrawCircle( void ) { } + LibDrawCircle* GenCopy( void ); + bool WriteDescr( FILE* File ); }; -class LibDrawText : public LibEDA_BaseStruct +class LibDrawText : public LibEDA_BaseStruct { public: - int m_Horiz; - wxSize m_Size; - int m_Type; - wxString m_Text; + int m_Horiz; + wxSize m_Size; + int m_Type; + wxString m_Text; public: - LibDrawText(void); - ~LibDrawText(void){} - LibDrawText * GenCopy(void); - bool WriteDescr( FILE * File ); + LibDrawText( void ); + ~LibDrawText( void ) { } + LibDrawText* GenCopy( void ); + bool WriteDescr( FILE* File ); }; -class LibDrawSquare : public LibEDA_BaseStruct +class LibDrawSquare : public LibEDA_BaseStruct { public: - wxPoint m_End; - int m_Fill; + wxPoint m_End; + int m_Fill; public: - LibDrawSquare(void); - ~LibDrawSquare(void){} - LibDrawSquare * GenCopy(void); - bool WriteDescr( FILE * File ); + LibDrawSquare( void ); + ~LibDrawSquare( void ) { } + LibDrawSquare* GenCopy( void ); + bool WriteDescr( FILE* File ); }; -class LibDrawSegment : public LibEDA_BaseStruct +class LibDrawSegment : public LibEDA_BaseStruct { public: - wxPoint m_End; + wxPoint m_End; public: - LibDrawSegment(void); - ~LibDrawSegment(void){} - LibDrawSegment * GenCopy(void); - bool WriteDescr( FILE * File ); + LibDrawSegment( void ); + ~LibDrawSegment( void ) { } + LibDrawSegment* GenCopy( void ); + bool WriteDescr( FILE* File ); }; class LibDrawPolyline : public LibEDA_BaseStruct { public: - int n, *PolyList; - int m_Fill; + int n, * PolyList; + int m_Fill; public: - LibDrawPolyline(void); - ~LibDrawPolyline(void){ if ( PolyList ) free(PolyList);} - LibDrawPolyline * GenCopy(void); - void AddPoint(const wxPoint & point); - bool WriteDescr( FILE * File ); + LibDrawPolyline( void ); + ~LibDrawPolyline( void ) { + if( PolyList ) + free( PolyList ); + } + LibDrawPolyline* GenCopy( void ); + void AddPoint( const wxPoint& point ); + bool WriteDescr( FILE* File ); }; /* Fields identiques aux fields des composants, pouvant etre predefinis en lib -2 Fields sont toujours presents : Prefix (U, IC..) et Name (74LS00..)*/ + * 2 Fields sont toujours presents : Prefix (U, IC..) et Name (74LS00..)*/ class LibDrawField : public LibEDA_BaseStruct { public: - int m_FieldId; // 0 a 11 - // 0 = Name 1 = Valeur 2 .. 11 autres fields - wxPoint m_Pos; - wxSize m_Size; - int m_Orient; /* Orientation */ - int m_Attributs; /* Attributs (Non visible ...) */ - int m_HJustify, m_VJustify; /* Justifications Horiz et Vert du texte */ - wxString m_Text; /* Field Data */ - wxString m_Name; /* Field Name */ + int m_FieldId; // 0 a 11 + // 0 = Name 1 = Valeur 2 .. 11 autres fields + wxPoint m_Pos; + wxSize m_Size; + int m_Orient; /* Orientation */ + int m_Attributs; /* Attributs (Non visible ...) */ + int m_HJustify, m_VJustify; /* Justifications Horiz et Vert du texte */ + wxString m_Text; /* Field Data */ + wxString m_Name; /* Field Name */ public: - LibDrawField(int idfield = 2); - ~LibDrawField(void); + LibDrawField( int idfield = 2 ); + ~LibDrawField( void ); - LibDrawField * GenCopy(void); - void Copy(LibDrawField * Target); - bool WriteDescr( FILE * File ); + LibDrawField* GenCopy( void ); + void Copy( LibDrawField* Target ); + bool WriteDescr( FILE* File ); }; /* classe de base de description des composants en librairie */ -class LibCmpEntry : public EDA_BaseStruct +class LibCmpEntry : public EDA_BaseStruct { public: - LibrEntryType Type; /* Type = ROOT; - = ALIAS pour struct LibraryAliasType */ - LibDrawField m_Name; // name (74LS00 ..) in lib ( = VALUE ) - wxString m_Doc; /* ligne de documentation */ - wxString m_KeyWord; /* liste des mots cles */ - wxString m_DocFile; /* nom du fichier Doc Associe */ - LibrEntryOptions m_Options; // special features (i.e. Entry is a POWER) + LibrEntryType Type; /* Type = ROOT; + * = ALIAS pour struct LibraryAliasType */ + LibDrawField m_Name; // name (74LS00 ..) in lib ( = VALUE ) + wxString m_Doc; /* ligne de documentation */ + wxString m_KeyWord; /* liste des mots cles */ + wxString m_DocFile; /* nom du fichier Doc Associe */ + LibrEntryOptions m_Options; // special features (i.e. Entry is a POWER) public: - LibCmpEntry(LibrEntryType CmpType, const wxChar * CmpName); - virtual ~LibCmpEntry(void); - bool WriteDescr( FILE * File ); + LibCmpEntry( LibrEntryType CmpType, const wxChar * CmpName ); + virtual ~LibCmpEntry( void ); + bool WriteDescr( FILE* File ); }; -class EDA_LibComponentStruct: public LibCmpEntry /* composant "racine" */ +class EDA_LibComponentStruct : public LibCmpEntry /* composant "racine" */ { public: - LibDrawField m_Prefix; /* Prefix ( U, IC ... ) = REFERENCE */ - wxArrayString m_AliasList; /* ALIAS list for the component */ - wxArrayString m_FootprintList; /* list of suitable footprint names for the component (wildcard names accepted)*/ - int m_UnitCount; /* Units (or sections) per package */ - bool m_UnitSelectionLocked; // True if units are differents and their selection is locked - // (i.e. if part A cannot be automatically changed in part B - int m_TextInside; /* if 0: pin name drawn on the pin itself - if > 0 pin name drawn inside the component, - with a distance of m_TextInside in mils */ - bool m_DrawPinNum; - bool m_DrawPinName; - LibDrawField *Fields; /* Auxiliairy Field list (id = 2 a 11*/ - LibEDA_BaseStruct * m_Drawings; /* How to draw this part */ - long m_LastDate; // Last change Date + LibDrawField m_Prefix; /* Prefix ( U, IC ... ) = REFERENCE */ + wxArrayString m_AliasList; /* ALIAS list for the component */ + wxArrayString m_FootprintList; /* list of suitable footprint names for the component (wildcard names accepted)*/ + int m_UnitCount; /* Units (or sections) per package */ + bool m_UnitSelectionLocked; // True if units are differents and their selection is locked + // (i.e. if part A cannot be automatically changed in part B + int m_TextInside;/* if 0: pin name drawn on the pin itself + * if > 0 pin name drawn inside the component, + * with a distance of m_TextInside in mils */ + bool m_DrawPinNum; + bool m_DrawPinName; + LibDrawField* Fields; /* Auxiliairy Field list (id = 2 a 11*/ + LibEDA_BaseStruct* m_Drawings; /* How to draw this part */ + long m_LastDate; // Last change Date public: - EDA_LibComponentStruct( const wxChar * CmpName); - EDA_Rect GetBoundaryBox( int Unit, int Convert); /* return Box around the part. */ - ~EDA_LibComponentStruct( void ); - void SortDrawItems(void); + EDA_LibComponentStruct( const wxChar * CmpName ); + EDA_Rect GetBoundaryBox( int Unit, int Convert );/* return Box around the part. */ + + ~EDA_LibComponentStruct( void ); + void SortDrawItems( void ); }; -class EDA_LibCmpAliasStruct: public LibCmpEntry +class EDA_LibCmpAliasStruct : public LibCmpEntry { public: - wxString m_RootName; /* Part name pour le composant de reference */ + wxString m_RootName; /* Part name pour le composant de reference */ public: - EDA_LibCmpAliasStruct( const wxChar * CmpName, const wxChar * CmpRootName); - ~EDA_LibCmpAliasStruct(void); + EDA_LibCmpAliasStruct( const wxChar * CmpName, const wxChar * CmpRootName ); + ~EDA_LibCmpAliasStruct( void ); }; /* Variables */ -extern LibraryStruct *LibraryList; /* All part libs are saved here. */ +extern LibraryStruct* LibraryList; /* All part libs are saved here. */ /* Variables Utiles pour les editions de composants en librairie */ -eda_global LibEDA_BaseStruct * LibItemToRepeat; /* pointeur sur l'élément que l'on - peut répéter (Pin..;) */ -eda_global LibraryStruct *CurrentLib; /* Pointeur sur la librairie du - composant en cours d'edition */ -eda_global EDA_LibComponentStruct *CurrentLibEntry; /* pointeur sur le composant en - cours d'edition */ -eda_global LibEDA_BaseStruct * CurrentDrawItem; /* pointeur sur les - elements de dessin du comp. en edition */ +eda_global LibEDA_BaseStruct* LibItemToRepeat;/* pointeur sur l'élément que l'on + * peut répéter (Pin..;) */ +eda_global LibraryStruct* CurrentLib; /* Pointeur sur la librairie du + * composant en cours d'edition */ +eda_global EDA_LibComponentStruct* CurrentLibEntry; /* pointeur sur le composant en + * cours d'edition */ +eda_global LibEDA_BaseStruct* CurrentDrawItem;/* pointeur sur les + * elements de dessin du comp. en edition */ -eda_global wxString CurrentAliasName; // Nom de l'alias selectionné -eda_global bool g_AsDeMorgan; // Pour libedit: -eda_global int CurrentUnit +eda_global wxString CurrentAliasName; // Nom de l'alias selectionné +eda_global bool g_AsDeMorgan; // Pour libedit: +eda_global int CurrentUnit #ifdef MAIN - = 1 += 1 #endif ; -eda_global int CurrentConvert /* Convert = 1 .. 255 */ +eda_global int CurrentConvert /* Convert = 1 .. 255 */ #ifdef MAIN - = 1 += 1 #endif ; -eda_global wxString FindLibName; /* nom de la librairie ou a ete trouve le - dernier composant recherche par FindLibPart() */ +eda_global wxString FindLibName; /* nom de la librairie ou a ete trouve le + * dernier composant recherche par FindLibPart() */ #endif // LIBCMP_H - diff --git a/eeschema/libframe.cpp b/eeschema/libframe.cpp index a2880fea3b..1a6115f350 100644 --- a/eeschema/libframe.cpp +++ b/eeschema/libframe.cpp @@ -543,6 +543,7 @@ wxClientDC dc(DrawPanel); case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: EditSymbolText(&dc, CurrentDrawItem); break; + default:; } DrawPanel->CursorOn(&dc); } diff --git a/eeschema/locate.cpp b/eeschema/locate.cpp index 65605d24d0..3de8204306 100644 --- a/eeschema/locate.cpp +++ b/eeschema/locate.cpp @@ -839,6 +839,9 @@ int seuil; return(DrawItem); /* Texte trouve */ } break; + + default: + ; } } return(NULL); diff --git a/eeschema/plot.cpp b/eeschema/plot.cpp index eb93e0439f..313875c334 100644 --- a/eeschema/plot.cpp +++ b/eeschema/plot.cpp @@ -290,6 +290,9 @@ wxPoint pos; MyFree(Poly); } break; + + default:; + } /* Fin Switch */ Plume('U'); } /* Fin Boucle de dessin */ diff --git a/eeschema/program.h b/eeschema/program.h index d5c5c5cae7..9c84438813 100644 --- a/eeschema/program.h +++ b/eeschema/program.h @@ -1,6 +1,6 @@ - /********************************************/ - /* Definitions for the EESchema program: */ - /********************************************/ +/********************************************/ +/* Definitions for the EESchema program: */ +/********************************************/ #ifndef PROGRAM_H #define PROGRAM_H @@ -15,9 +15,9 @@ #include "component_class.h" #include "class_screen.h" -#define DRAWJUNCTION_SIZE 16 /* Rayon du symbole connexion */ -#define DRAWMARKER_SIZE 16 /* Rayon du symbole marqueur */ -#define DRAWNOCONNECT_SIZE 48 /* Rayon du symbole No Connexion */ +#define DRAWJUNCTION_SIZE 16 /* Rayon du symbole connexion */ +#define DRAWMARKER_SIZE 16 /* Rayon du symbole marqueur */ +#define DRAWNOCONNECT_SIZE 48 /* Rayon du symbole No Connexion */ #define HIGHLIGHT_COLOR WHITE @@ -26,161 +26,191 @@ /* flags pour BUS ENTRY (bus to bus ou wire to bus */ #define WIRE_TO_BUS 0 -#define BUS_TO_BUS 1 +#define BUS_TO_BUS 1 -typedef enum { /* Type des Marqueurs */ - MARQ_UNSPEC, - MARQ_ERC, - MARQ_PCB, - MARQ_SIMUL, - MARQ_NMAX /* Derniere valeur: fin de tableau */ +typedef enum { /* Type des Marqueurs */ + MARQ_UNSPEC, + MARQ_ERC, + MARQ_PCB, + MARQ_SIMUL, + MARQ_NMAX /* Derniere valeur: fin de tableau */ } TypeMarker; /* Messages correspondants aux types des marqueurs */ #ifdef MAIN -const wxChar * NameMarqueurType[] = - { - wxT(""), - wxT("ERC"), - wxT("PCB"), - wxT("SIMUL"), - wxT("?????") - }; +const wxChar* NameMarqueurType[] = +{ + wxT( "" ), + wxT( "ERC" ), + wxT( "PCB" ), + wxT( "SIMUL" ), + wxT( "?????" ) +}; #else -extern const wxChar * NameMarqueurType[]; +extern const wxChar* NameMarqueurType[]; #endif /* Forward declarations */ class DrawSheetStruct; -class EDA_DrawLineStruct: public EDA_BaseLineStruct /* Segment decription - base class to describe items which have 2 end points (track, wire, draw line ...) */ + +/** + * Class EDA_DrawLineStruct + * is a segment decription base class to describe items which have 2 end + * points (track, wire, draw line ...) + */ +class EDA_DrawLineStruct : public EDA_BaseStruct { public: - bool m_StartIsDangling, m_EndIsDangling; // TRUE si Start ou End not connected (wires, tracks...) + int m_Layer; // Layer number + int m_Width; // 0 = line, > 0 = tracks, bus ... + wxPoint m_Start; // Line start point + wxPoint m_End; // Line end point + + bool m_StartIsDangling; + bool m_EndIsDangling; // TRUE si Start ou End not connected (wires, tracks...) public: - EDA_DrawLineStruct(const wxPoint & pos, int layer ); - ~EDA_DrawLineStruct(void) {} - bool IsOneEndPointAt(const wxPoint & pos); - EDA_DrawLineStruct * GenCopy(void); - bool IsNull(void) - { - return (m_Start == m_End); - } - virtual void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color = -1); + EDA_DrawLineStruct( const wxPoint &pos, int layer ); + ~EDA_DrawLineStruct( void ) { } + bool IsOneEndPointAt( const wxPoint& pos ); + EDA_DrawLineStruct* GenCopy( void ); + + bool IsNull( void ) + { + return m_Start == m_End; + } + + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, + int Color = -1 ); }; -class DrawMarkerStruct: public EDA_BaseStruct /* marqueurs */ +class DrawMarkerStruct : public EDA_BaseStruct /* marqueurs */ { public: - wxPoint m_Pos; /* XY coordinates of marker. */ - TypeMarker m_Type; - int m_MarkFlags; // complements d'information - wxString m_Comment; /* Texte (commentaireassocie eventuel */ + wxPoint m_Pos; /* XY coordinates of marker. */ + TypeMarker m_Type; + int m_MarkFlags; // complements d'information + wxString m_Comment; /* Texte (commentaireassocie eventuel */ public: - DrawMarkerStruct(const wxPoint & pos, const wxString & text); - ~DrawMarkerStruct(void); - DrawMarkerStruct * GenCopy(void); - wxString GetComment(void); - virtual void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color = -1); + DrawMarkerStruct( const wxPoint &pos, const wxString &text ); + ~DrawMarkerStruct( void ); + DrawMarkerStruct* GenCopy( void ); + wxString GetComment( void ); + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color = -1 ); }; -class DrawNoConnectStruct: public EDA_BaseStruct /* Symboles de non connexion */ + +class DrawNoConnectStruct : public EDA_BaseStruct /* Symboles de non connexion */ { public: - wxPoint m_Pos; /* XY coordinates of NoConnect. */ + wxPoint m_Pos; /* XY coordinates of NoConnect. */ public: - DrawNoConnectStruct(const wxPoint & pos); - ~DrawNoConnectStruct(void) {} - DrawNoConnectStruct * GenCopy(void); - virtual void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color = -1); + DrawNoConnectStruct( const wxPoint &pos ); + ~DrawNoConnectStruct( void ) { } + DrawNoConnectStruct* GenCopy( void ); + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color = -1 ); }; -class DrawBusEntryStruct: public EDA_BaseStruct /* Struct de descr 1 raccord - a 45 degres de BUS ou WIRE */ + +/** + * Class DrawBusEntryStruct + * Struct de descr 1 raccord a 45 degres de BUS ou WIRE + */ +class DrawBusEntryStruct : public EDA_BaseStruct { public: - int m_Layer; - int m_Width; - wxPoint m_Pos; - wxSize m_Size; + int m_Layer; + int m_Width; + wxPoint m_Pos; + wxSize m_Size; public: - DrawBusEntryStruct(const wxPoint & pos, int shape, int id ); - ~DrawBusEntryStruct(void) {} - DrawBusEntryStruct * GenCopy(void); - wxPoint m_End(void); // retourne la coord de fin du raccord - virtual void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color = -1); + DrawBusEntryStruct( const wxPoint &pos, int shape, int id ); + ~DrawBusEntryStruct( void ) { } + DrawBusEntryStruct* GenCopy( void ); + wxPoint m_End( void ); // retourne la coord de fin du raccord + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color = -1 ); }; -class DrawPolylineStruct: public EDA_BaseStruct /* Polyligne (serie de segments) */ +class DrawPolylineStruct : public EDA_BaseStruct/* Polyligne (serie de segments) */ { public: - int m_Layer; - int m_Width; - int m_NumOfPoints; /* Number of XY pairs in Points array. */ - int *m_Points; /* XY pairs that forms the polyline. */ + int m_Layer; + int m_Width; + int m_NumOfPoints; /* Number of XY pairs in Points array. */ + int* m_Points; /* XY pairs that forms the polyline. */ public: - DrawPolylineStruct(int layer); - ~DrawPolylineStruct(void); - DrawPolylineStruct * GenCopy(void); - virtual void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color = -1); + DrawPolylineStruct( int layer ); + ~DrawPolylineStruct( void ); + DrawPolylineStruct* GenCopy( void ); + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color = -1 ); }; -class DrawJunctionStruct: public EDA_BaseStruct +class DrawJunctionStruct : public EDA_BaseStruct { public: - int m_Layer; - wxPoint m_Pos; /* XY coordinates of connection. */ + int m_Layer; + wxPoint m_Pos; /* XY coordinates of connection. */ public: - DrawJunctionStruct(const wxPoint & pos); - ~DrawJunctionStruct(void){} - DrawJunctionStruct * GenCopy(void); - virtual void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color = -1); + DrawJunctionStruct( const wxPoint &pos ); + ~DrawJunctionStruct( void ) { } + DrawJunctionStruct* GenCopy( void ); + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color = -1 ); }; -class DrawTextStruct: public EDA_BaseStruct, public EDA_TextStruct +class DrawTextStruct : public EDA_BaseStruct, public EDA_TextStruct { public: - int m_Layer; - int m_Shape; - bool m_IsDangling; // TRUE si non connecté + int m_Layer; + int m_Shape; + bool m_IsDangling; // TRUE si non connecté public: - DrawTextStruct(const wxPoint & pos = wxPoint(0,0), const wxString & text = wxEmptyString); - ~DrawTextStruct(void) {} - DrawTextStruct * GenCopy(void); - virtual void Draw(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color = -1); - void SwapData(DrawTextStruct * copyitem); - virtual void Place(WinEDA_DrawFrame * frame, wxDC * DC); + DrawTextStruct( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString ); + ~DrawTextStruct( void ) { } + DrawTextStruct* GenCopy( void ); + virtual void Draw( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, int draw_mode, + int Color = -1 ); + void SwapData( DrawTextStruct* copyitem ); + virtual void Place( WinEDA_DrawFrame* frame, wxDC* DC ); + private: - void DrawAsText(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color); - void DrawAsLabel(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color); - void DrawAsGlobalLabel(WinEDA_DrawPanel * panel, wxDC * DC, const wxPoint & offset, int draw_mode, int Color); + void DrawAsText( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color ); + void DrawAsLabel( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color ); + void DrawAsGlobalLabel( WinEDA_DrawPanel* panel, wxDC* DC, const wxPoint& offset, + int draw_mode, int Color ); }; -class DrawLabelStruct: public DrawTextStruct +class DrawLabelStruct : public DrawTextStruct { public: - DrawLabelStruct(const wxPoint & pos = wxPoint(0,0), const wxString & text = wxEmptyString); - ~DrawLabelStruct(void) {} + DrawLabelStruct( const wxPoint& pos = wxPoint( 0, 0 ), const wxString& text = wxEmptyString ); + ~DrawLabelStruct( void ) { } }; -class DrawGlobalLabelStruct: public DrawTextStruct +class DrawGlobalLabelStruct : public DrawTextStruct { public: - DrawGlobalLabelStruct(const wxPoint & pos = wxPoint(0,0), const wxString & text = wxEmptyString); - ~DrawGlobalLabelStruct(void) {} + DrawGlobalLabelStruct( const wxPoint& pos = wxPoint( 0, 0 ), + const wxString& text = wxEmptyString ); + ~DrawGlobalLabelStruct( void ) { } }; @@ -188,16 +218,15 @@ public: class LayerStruct { public: - char LayerNames[MAX_LAYERS+1][8]; - int LayerColor[MAX_LAYERS+1]; - char LayerStatus[MAX_LAYERS+1]; - int NumberOfLayers; - int CurrentLayer; - int CurrentWidth; - int CommonColor; - int Flags; + char LayerNames[MAX_LAYERS + 1][8]; + int LayerColor[MAX_LAYERS + 1]; + char LayerStatus[MAX_LAYERS + 1]; + int NumberOfLayers; + int CurrentLayer; + int CurrentWidth; + int CommonColor; + int Flags; }; #endif /* PROGRAM_H */ - diff --git a/eeschema/symbdraw.cpp b/eeschema/symbdraw.cpp index 2376245f86..c24fbb9e5e 100644 --- a/eeschema/symbdraw.cpp +++ b/eeschema/symbdraw.cpp @@ -1,8 +1,8 @@ - /*********************************************************************/ - /* EESchema - symbdraw.cpp */ - /* Create, move .. graphic shapes used to build and draw a component */ - /* (lines, arcs .. */ - /*********************************************************************/ +/*********************************************************************/ +/* EESchema - symbdraw.cpp */ +/* Create, move .. graphic shapes used to build and draw a component */ +/* (lines, arcs .. */ +/*********************************************************************/ #include "fctsys.h" @@ -19,784 +19,833 @@ #include "id.h" /* Routines locales */ -static void SymbolDisplayDraw(WinEDA_DrawPanel * panel, wxDC * DC, bool erase); -static void ComputeArc(LibDrawArc * DrawItem, wxPoint ArcCentre); -static void RedrawWhileMovingCursor(WinEDA_DrawPanel * panel, wxDC * DC, bool erase); -static void MoveLibDrawItemAt(LibEDA_BaseStruct * DrawItem, wxPoint newpos); +static void SymbolDisplayDraw( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ); +static void ComputeArc( LibDrawArc* DrawItem, wxPoint ArcCentre ); +static void RedrawWhileMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ); +static void MoveLibDrawItemAt( LibEDA_BaseStruct* DrawItem, wxPoint newpos ); /* Variables locales */ -static int StateDrawArc, ArcStartX, ArcStartY, ArcEndX, ArcEndY; +static int StateDrawArc, ArcStartX, ArcStartY, ArcEndX, ArcEndY; static wxPoint InitPosition, StartCursor, ItemPreviousPos; -static int FlSymbol_Fill = NO_FILL; +static int FlSymbol_Fill = NO_FILL; - /************************************/ - /* class WinEDA_PartPropertiesFrame */ - /************************************/ +/************************************/ +/* class WinEDA_PartPropertiesFrame */ +/************************************/ #include "dialog_cmp_graphic_properties.cpp" /************************************************************/ void WinEDA_bodygraphics_PropertiesFrame:: - bodygraphics_PropertiesAccept(wxCommandEvent& event) +bodygraphics_PropertiesAccept( wxCommandEvent& event ) /************************************************************/ + /* Update the current draw item -*/ + */ { - g_FlDrawSpecificConvert = m_CommonConvert->GetValue() ? FALSE : TRUE; - g_FlDrawSpecificUnit = m_CommonUnit->GetValue() ? FALSE : TRUE; - if ( m_Filled ) - FlSymbol_Fill = m_Filled->GetSelection(); - g_LibSymbolDefaultLineWidth = m_GraphicShapeWidthCtrl->GetValue(); + g_FlDrawSpecificConvert = m_CommonConvert->GetValue() ? FALSE : TRUE; + g_FlDrawSpecificUnit = m_CommonUnit->GetValue() ? FALSE : TRUE; + if( m_Filled ) + FlSymbol_Fill = m_Filled->GetSelection(); + g_LibSymbolDefaultLineWidth = m_GraphicShapeWidthCtrl->GetValue(); - if ( CurrentDrawItem ) - { - if ( ! (CurrentDrawItem->m_Flags & IS_NEW) ) // if IS_NEW, copy for undo is done before place - m_Parent->SaveCopyInUndoList(CurrentLibEntry); - wxClientDC dc(m_Parent->DrawPanel); - m_Parent->DrawPanel->PrepareGraphicContext(&dc); + if( CurrentDrawItem ) + { + if( !(CurrentDrawItem->m_Flags & IS_NEW) ) // if IS_NEW, copy for undo is done before place + m_Parent->SaveCopyInUndoList( CurrentLibEntry ); + wxClientDC dc( m_Parent->DrawPanel ); - DrawLibraryDrawStruct(m_Parent->DrawPanel, &dc, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, g_XorMode); + m_Parent->DrawPanel->PrepareGraphicContext( &dc ); - if( g_FlDrawSpecificUnit ) CurrentDrawItem->m_Unit = CurrentUnit; - else CurrentDrawItem->m_Unit = 0; - if( g_FlDrawSpecificConvert ) CurrentDrawItem->m_Convert = CurrentConvert; - else CurrentDrawItem->m_Convert = 0; - if ( m_Filled ) - { - switch(CurrentDrawItem->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - ((LibDrawArc*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - ((LibDrawArc*)CurrentDrawItem)->m_Width = m_GraphicShapeWidthCtrl->GetValue(); - break; - - case COMPONENT_CIRCLE_DRAW_TYPE: - ((LibDrawCircle*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - ((LibDrawCircle*)CurrentDrawItem)->m_Width = m_GraphicShapeWidthCtrl->GetValue(); - break; - - case COMPONENT_RECT_DRAW_TYPE: - ((LibDrawSquare*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - ((LibDrawSquare*)CurrentDrawItem)->m_Width = m_GraphicShapeWidthCtrl->GetValue(); - break; - - case COMPONENT_POLYLINE_DRAW_TYPE: - ((LibDrawPolyline*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - ((LibDrawPolyline*)CurrentDrawItem)->m_Width = m_GraphicShapeWidthCtrl->GetValue(); - break; - - default: break; - } - } - CurrentLibEntry->SortDrawItems(); + DrawLibraryDrawStruct( m_Parent->DrawPanel, &dc, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, g_XorMode ); - m_Parent->m_CurrentScreen->SetModify(); + if( g_FlDrawSpecificUnit ) + CurrentDrawItem->m_Unit = CurrentUnit; + else + CurrentDrawItem->m_Unit = 0; + if( g_FlDrawSpecificConvert ) + CurrentDrawItem->m_Convert = CurrentConvert; + else + CurrentDrawItem->m_Convert = 0; + if( m_Filled ) + { + switch( CurrentDrawItem->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + ( (LibDrawArc*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + ( (LibDrawArc*) CurrentDrawItem )->m_Width = m_GraphicShapeWidthCtrl->GetValue(); + break; - DrawLibraryDrawStruct(m_Parent->DrawPanel, &dc, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, g_XorMode); - } + case COMPONENT_CIRCLE_DRAW_TYPE: + ( (LibDrawCircle*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + ( (LibDrawCircle*) CurrentDrawItem )->m_Width = m_GraphicShapeWidthCtrl->GetValue(); + break; - Close(); + case COMPONENT_RECT_DRAW_TYPE: + ( (LibDrawSquare*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + ( (LibDrawSquare*) CurrentDrawItem )->m_Width = m_GraphicShapeWidthCtrl->GetValue(); + break; - if ( CurrentDrawItem ) - CurrentDrawItem->Display_Infos_DrawEntry(m_Parent); - m_Parent->ReDrawPanel(); + case COMPONENT_POLYLINE_DRAW_TYPE: + ( (LibDrawPolyline*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + ( (LibDrawPolyline*) CurrentDrawItem )->m_Width = m_GraphicShapeWidthCtrl-> + GetValue(); + break; + + default: + break; + } + } + CurrentLibEntry->SortDrawItems(); + + m_Parent->m_CurrentScreen->SetModify(); + + DrawLibraryDrawStruct( m_Parent->DrawPanel, &dc, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, g_XorMode ); + } + + Close(); + + if( CurrentDrawItem ) + CurrentDrawItem->Display_Infos_DrawEntry( m_Parent ); + m_Parent->ReDrawPanel(); } + /**********************************************************/ -void WinEDA_LibeditFrame::EditGraphicSymbol(wxDC * DC, - LibEDA_BaseStruct * DrawItem) +void WinEDA_LibeditFrame::EditGraphicSymbol( wxDC* DC, + LibEDA_BaseStruct* DrawItem ) /**********************************************************/ + /* Install the dialog box for editing a graphical item properties -*/ + */ { - if ( DrawItem == NULL ) return; - - WinEDA_bodygraphics_PropertiesFrame * frame = new - WinEDA_bodygraphics_PropertiesFrame(this); - frame->ShowModal(); frame->Destroy(); + if( DrawItem == NULL ) + return; + + WinEDA_bodygraphics_PropertiesFrame* frame = new WinEDA_bodygraphics_PropertiesFrame( this ); + + frame->ShowModal(); frame->Destroy(); } /****************************************************************/ -static void AbortSymbolTraceOn(WinEDA_DrawPanel * Panel, wxDC * DC) +static void AbortSymbolTraceOn( WinEDA_DrawPanel* Panel, wxDC* DC ) /****************************************************************/ { + StateDrawArc = 0; + Panel->ManageCurseur = NULL; + Panel->ForceCloseManageCurseur = NULL; + if( CurrentDrawItem == NULL ) + return; - StateDrawArc = 0; - Panel->ManageCurseur = NULL; - Panel->ForceCloseManageCurseur = NULL; - if(CurrentDrawItem == NULL) return; + if( CurrentDrawItem->m_Flags & IS_NEW ) + { + if( CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE ) + { + Panel->m_Parent->RedrawActiveWindow( DC, TRUE ); + } + else + DrawLibraryDrawStruct( Panel, DC, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, g_XorMode ); + delete CurrentDrawItem; + } + else + { + wxPoint curpos; + curpos = Panel->GetScreen()->m_Curseur; + Panel->GetScreen()->m_Curseur = StartCursor; + RedrawWhileMovingCursor( Panel, DC, TRUE ); + Panel->GetScreen()->m_Curseur = curpos; + DrawLibraryDrawStruct( Panel, DC, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, GR_DEFAULT_DRAWMODE ); - if(CurrentDrawItem->m_Flags & IS_NEW) - { - if ( CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE ) - { - Panel->m_Parent->RedrawActiveWindow( DC,TRUE); - } - else DrawLibraryDrawStruct(Panel, DC, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, g_XorMode); - delete CurrentDrawItem; - } + CurrentDrawItem->m_Flags = 0; + } - else - { - wxPoint curpos; - curpos = Panel->GetScreen()->m_Curseur; - Panel->GetScreen()->m_Curseur = StartCursor; - RedrawWhileMovingCursor(Panel, DC, TRUE); - Panel->GetScreen()->m_Curseur = curpos; - DrawLibraryDrawStruct(Panel, DC, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, GR_DEFAULT_DRAWMODE); - - CurrentDrawItem->m_Flags = 0; - } - - CurrentDrawItem = NULL; + CurrentDrawItem = NULL; } +/*********************************************************************/ +LibEDA_BaseStruct* WinEDA_LibeditFrame::CreateGraphicItem( wxDC* DC ) +/*********************************************************************/ -/*********************************************************************/ -LibEDA_BaseStruct * WinEDA_LibeditFrame::CreateGraphicItem(wxDC * DC) -/*********************************************************************/ /* Routine de creation d'un nouvel element type LibraryDrawStruct - POLYLINE - ARC - CIRCLE - RECTANGLE -*/ + * POLYLINE + * ARC + * CIRCLE + * RECTANGLE + */ { -int DrawType; -int * ptpoly; + int DrawType; + int* ptpoly; - if(CurrentDrawItem) return NULL; + if( CurrentDrawItem ) + return NULL; - DrawPanel->m_IgnoreMouseEvents = TRUE; - // Creation du nouvel element - switch ( m_ID_current_state ) - { - case ID_LIBEDIT_BODY_LINE_BUTT: - DrawType = COMPONENT_POLYLINE_DRAW_TYPE; - break; + DrawPanel->m_IgnoreMouseEvents = TRUE; - case ID_LIBEDIT_BODY_ARC_BUTT: - DrawType = COMPONENT_ARC_DRAW_TYPE; - break; + // Creation du nouvel element + switch( m_ID_current_state ) + { + case ID_LIBEDIT_BODY_LINE_BUTT: + DrawType = COMPONENT_POLYLINE_DRAW_TYPE; + break; - case ID_LIBEDIT_BODY_CIRCLE_BUTT: - DrawType = COMPONENT_CIRCLE_DRAW_TYPE; - break; + case ID_LIBEDIT_BODY_ARC_BUTT: + DrawType = COMPONENT_ARC_DRAW_TYPE; + break; - case ID_LIBEDIT_BODY_RECT_BUTT: - DrawType = COMPONENT_RECT_DRAW_TYPE; - break; + case ID_LIBEDIT_BODY_CIRCLE_BUTT: + DrawType = COMPONENT_CIRCLE_DRAW_TYPE; + break; - case ID_LIBEDIT_BODY_TEXT_BUTT: - DrawType = COMPONENT_GRAPHIC_TEXT_DRAW_TYPE; - break; + case ID_LIBEDIT_BODY_RECT_BUTT: + DrawType = COMPONENT_RECT_DRAW_TYPE; + break; - default: - DisplayError(this, wxT("SymbolBeginDrawItem Internal err: Id error")); - return NULL; - } + case ID_LIBEDIT_BODY_TEXT_BUTT: + DrawType = COMPONENT_GRAPHIC_TEXT_DRAW_TYPE; + break; - DrawPanel->ManageCurseur = SymbolDisplayDraw; - DrawPanel->ForceCloseManageCurseur = AbortSymbolTraceOn; + default: + DisplayError( this, wxT( "SymbolBeginDrawItem Internal err: Id error" ) ); + return NULL; + } - switch ( DrawType ) - { - case COMPONENT_ARC_DRAW_TYPE: - { - LibDrawArc * Arc = new LibDrawArc(); - CurrentDrawItem = Arc; - ArcStartX = ArcEndX = m_CurrentScreen->m_Curseur.x; - ArcStartY = ArcEndY = - m_CurrentScreen->m_Curseur.y; - StateDrawArc = 1; - Arc->m_Fill = FlSymbol_Fill; - Arc->m_Width = g_LibSymbolDefaultLineWidth; - } - break; + DrawPanel->ManageCurseur = SymbolDisplayDraw; + DrawPanel->ForceCloseManageCurseur = AbortSymbolTraceOn; - case COMPONENT_CIRCLE_DRAW_TYPE: - { - LibDrawCircle * Circle = new LibDrawCircle(); - CurrentDrawItem = Circle; - Circle->m_Pos.x = m_CurrentScreen->m_Curseur.x; - Circle->m_Pos.y = - m_CurrentScreen->m_Curseur.y; - Circle->m_Fill = FlSymbol_Fill; - Circle->m_Width = g_LibSymbolDefaultLineWidth; - } - break; + switch( DrawType ) + { + case COMPONENT_ARC_DRAW_TYPE: + { + LibDrawArc* Arc = new LibDrawArc(); - case COMPONENT_RECT_DRAW_TYPE: - { - LibDrawSquare * Square = new LibDrawSquare(); - CurrentDrawItem = Square; - Square->m_Pos.x = m_CurrentScreen->m_Curseur.x; - Square->m_Pos.y = - m_CurrentScreen->m_Curseur.y; - Square->m_End = Square->m_Pos; - Square->m_Fill = FlSymbol_Fill; - Square->m_Width = g_LibSymbolDefaultLineWidth; - } - break; + CurrentDrawItem = Arc; + ArcStartX = ArcEndX = m_CurrentScreen->m_Curseur.x; + ArcStartY = ArcEndY = -m_CurrentScreen->m_Curseur.y; + StateDrawArc = 1; + Arc->m_Fill = FlSymbol_Fill; + Arc->m_Width = g_LibSymbolDefaultLineWidth; + } + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - { - LibDrawPolyline* polyline = new LibDrawPolyline(); - CurrentDrawItem = polyline; - polyline->n = 2; - ptpoly = (int*)MyZMalloc( 4 * sizeof(int)); - polyline->PolyList = ptpoly; - ptpoly[0] = ptpoly[2] = m_CurrentScreen->m_Curseur.x; - ptpoly[1] = ptpoly[3] = - m_CurrentScreen->m_Curseur.y; - polyline->m_Fill = FlSymbol_Fill; - polyline->m_Width = g_LibSymbolDefaultLineWidth; - } - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + { + LibDrawCircle* Circle = new LibDrawCircle(); - case COMPONENT_LINE_DRAW_TYPE: - { - LibDrawSegment* Segment = new LibDrawSegment(); - CurrentDrawItem = Segment; - Segment->m_Pos.x = m_CurrentScreen->m_Curseur.x; - Segment->m_Pos.y = -m_CurrentScreen->m_Curseur.y; - Segment->m_End = Segment->m_Pos; - Segment->m_Width = g_LibSymbolDefaultLineWidth; - } - break; + CurrentDrawItem = Circle; + Circle->m_Pos.x = m_CurrentScreen->m_Curseur.x; + Circle->m_Pos.y = -m_CurrentScreen->m_Curseur.y; + Circle->m_Fill = FlSymbol_Fill; + Circle->m_Width = g_LibSymbolDefaultLineWidth; + } + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - { - LibDrawText* Text = new LibDrawText(); - CurrentDrawItem = Text; - Text->m_Size.x = Text->m_Size.y = g_LastTextSize; - Text->m_Horiz = g_LastTextOrient; - Text->m_Pos.x = m_CurrentScreen->m_Curseur.x; - Text->m_Pos.y = - m_CurrentScreen->m_Curseur.y; - EditSymbolText(NULL, Text); - if ( Text->m_Text.IsEmpty() ) - { - delete Text; - CurrentDrawItem = NULL; - DrawPanel->ManageCurseur = NULL; - DrawPanel->ForceCloseManageCurseur = NULL; - } - else - { - StartMoveDrawSymbol(DC); - DrawLibraryDrawStruct(DrawPanel, DC, CurrentLibEntry, 0 , 0, - Text, CurrentUnit, g_XorMode); - } - } - break; - } + case COMPONENT_RECT_DRAW_TYPE: + { + LibDrawSquare* Square = new LibDrawSquare(); - if ( CurrentDrawItem ) - { - CurrentDrawItem->m_Flags |= IS_NEW; - if(g_FlDrawSpecificUnit) CurrentDrawItem->m_Unit = CurrentUnit; - if(g_FlDrawSpecificConvert) CurrentDrawItem->m_Convert = CurrentConvert; - } + CurrentDrawItem = Square; + Square->m_Pos.x = m_CurrentScreen->m_Curseur.x; + Square->m_Pos.y = -m_CurrentScreen->m_Curseur.y; + Square->m_End = Square->m_Pos; + Square->m_Fill = FlSymbol_Fill; + Square->m_Width = g_LibSymbolDefaultLineWidth; + } + break; - DrawPanel->MouseToCursorSchema(); - DrawPanel->m_IgnoreMouseEvents = FALSE; + case COMPONENT_POLYLINE_DRAW_TYPE: + { + LibDrawPolyline* polyline = new LibDrawPolyline(); - return CurrentDrawItem; + CurrentDrawItem = polyline; + polyline->n = 2; + ptpoly = (int*) MyZMalloc( 4 * sizeof(int) ); + polyline->PolyList = ptpoly; + ptpoly[0] = ptpoly[2] = m_CurrentScreen->m_Curseur.x; + ptpoly[1] = ptpoly[3] = -m_CurrentScreen->m_Curseur.y; + polyline->m_Fill = FlSymbol_Fill; + polyline->m_Width = g_LibSymbolDefaultLineWidth; + } + break; + + case COMPONENT_LINE_DRAW_TYPE: + { + LibDrawSegment* Segment = new LibDrawSegment(); + + CurrentDrawItem = Segment; + Segment->m_Pos.x = m_CurrentScreen->m_Curseur.x; + Segment->m_Pos.y = -m_CurrentScreen->m_Curseur.y; + Segment->m_End = Segment->m_Pos; + Segment->m_Width = g_LibSymbolDefaultLineWidth; + } + break; + + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + { + LibDrawText* Text = new LibDrawText(); + + CurrentDrawItem = Text; + Text->m_Size.x = Text->m_Size.y = g_LastTextSize; + Text->m_Horiz = g_LastTextOrient; + Text->m_Pos.x = m_CurrentScreen->m_Curseur.x; + Text->m_Pos.y = -m_CurrentScreen->m_Curseur.y; + EditSymbolText( NULL, Text ); + if( Text->m_Text.IsEmpty() ) + { + delete Text; + CurrentDrawItem = NULL; + DrawPanel->ManageCurseur = NULL; + DrawPanel->ForceCloseManageCurseur = NULL; + } + else + { + StartMoveDrawSymbol( DC ); + DrawLibraryDrawStruct( DrawPanel, DC, CurrentLibEntry, 0, 0, + Text, CurrentUnit, g_XorMode ); + } + } + break; + } + + if( CurrentDrawItem ) + { + CurrentDrawItem->m_Flags |= IS_NEW; + if( g_FlDrawSpecificUnit ) + CurrentDrawItem->m_Unit = CurrentUnit; + if( g_FlDrawSpecificConvert ) + CurrentDrawItem->m_Convert = CurrentConvert; + } + + DrawPanel->MouseToCursorSchema(); + DrawPanel->m_IgnoreMouseEvents = FALSE; + + return CurrentDrawItem; } /********************************************************/ -void WinEDA_LibeditFrame::GraphicItemBeginDraw(wxDC * DC) +void WinEDA_LibeditFrame::GraphicItemBeginDraw( wxDC* DC ) /********************************************************/ + /* Routine de creation d'un nouvel element type LibraryDrawStruct -*/ + */ { - if(CurrentDrawItem == NULL) return; + if( CurrentDrawItem == NULL ) + return; - switch ( CurrentDrawItem->m_StructType ) - { - case COMPONENT_ARC_DRAW_TYPE: - if(StateDrawArc == 1) - { - SymbolDisplayDraw(DrawPanel,DC, FALSE); - StateDrawArc = 2; - SymbolDisplayDraw(DrawPanel,DC, FALSE); - break; - } - if(StateDrawArc > 1) - { - EndDrawGraphicItem(DC); - return; - } - break; + switch( CurrentDrawItem->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + if( StateDrawArc == 1 ) + { + SymbolDisplayDraw( DrawPanel, DC, FALSE ); + StateDrawArc = 2; + SymbolDisplayDraw( DrawPanel, DC, FALSE ); + break; + } + if( StateDrawArc > 1 ) + { + EndDrawGraphicItem( DC ); + return; + } + break; - case COMPONENT_CIRCLE_DRAW_TYPE: - case COMPONENT_RECT_DRAW_TYPE: - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - EndDrawGraphicItem(DC); - return; + case COMPONENT_CIRCLE_DRAW_TYPE: + case COMPONENT_RECT_DRAW_TYPE: + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + EndDrawGraphicItem( DC ); + return; - case COMPONENT_POLYLINE_DRAW_TYPE: - { - wxPoint pos = m_CurrentScreen->m_Curseur; - ((LibDrawPolyline*)CurrentDrawItem)->AddPoint(pos); - } - break; + case COMPONENT_POLYLINE_DRAW_TYPE: + { + wxPoint pos = m_CurrentScreen->m_Curseur; + ( (LibDrawPolyline*) CurrentDrawItem )->AddPoint( pos ); + } + break; - case COMPONENT_LINE_DRAW_TYPE: - break; - } + case COMPONENT_LINE_DRAW_TYPE: + break; + default: + ; + } } + /**************************************************************************/ -static void RedrawWhileMovingCursor(WinEDA_DrawPanel * panel, wxDC * DC, bool erase) +static void RedrawWhileMovingCursor( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) /**************************************************************************/ + /* Redraw the graphoc shape while moving -*/ + */ { -BASE_SCREEN * Screen = panel->m_Parent->m_CurrentScreen; -int mx, my; - - /* Erase shape in the old positon*/ - if( erase ) - { - mx = ItemPreviousPos.x - StartCursor.x , - my = ItemPreviousPos.y - StartCursor.y ; - - DrawLibraryDrawStruct(panel, DC, CurrentLibEntry, mx, my, - CurrentDrawItem, CurrentUnit, g_XorMode); - } + BASE_SCREEN* Screen = panel->m_Parent->m_CurrentScreen; + int mx, my; - /* Redraw moved shape */ - mx = Screen->m_Curseur.x - StartCursor.x , - my = Screen->m_Curseur.y - StartCursor.y ; - DrawLibraryDrawStruct(panel, DC, CurrentLibEntry, mx , my, - CurrentDrawItem, CurrentUnit, g_XorMode); - ItemPreviousPos = Screen->m_Curseur; + /* Erase shape in the old positon*/ + if( erase ) + { + mx = ItemPreviousPos.x - StartCursor.x, + my = ItemPreviousPos.y - StartCursor.y; + + DrawLibraryDrawStruct( panel, DC, CurrentLibEntry, mx, my, + CurrentDrawItem, CurrentUnit, g_XorMode ); + } + + /* Redraw moved shape */ + mx = Screen->m_Curseur.x - StartCursor.x, + my = Screen->m_Curseur.y - StartCursor.y; + DrawLibraryDrawStruct( panel, DC, CurrentLibEntry, mx, my, + CurrentDrawItem, CurrentUnit, g_XorMode ); + ItemPreviousPos = Screen->m_Curseur; } - /*****************************************************************/ -void MoveLibDrawItemAt(LibEDA_BaseStruct * DrawItem, wxPoint newpos) +void MoveLibDrawItemAt( LibEDA_BaseStruct* DrawItem, wxPoint newpos ) /*****************************************************************/ { -int mx = newpos.x, my = newpos.y; -wxSize size; - - switch ( DrawItem->m_StructType ) - { - case COMPONENT_ARC_DRAW_TYPE: - { - int dx = mx - ((LibDrawArc*)CurrentDrawItem)->m_Pos.x; - int dy = - my - ((LibDrawArc*)CurrentDrawItem)->m_Pos.y; - ((LibDrawArc*)CurrentDrawItem)->m_Pos.x = mx; - ((LibDrawArc*)CurrentDrawItem)->m_Pos.y = - my; - ((LibDrawArc*)CurrentDrawItem)->m_ArcStart.x += dx; - ((LibDrawArc*)CurrentDrawItem)->m_ArcStart.y += dy; - ((LibDrawArc*)CurrentDrawItem)->m_ArcEnd.x += dx; - ((LibDrawArc*)CurrentDrawItem)->m_ArcEnd.y += dy; - break; - } + int mx = newpos.x, my = newpos.y; + wxSize size; - case COMPONENT_CIRCLE_DRAW_TYPE: - ((LibDrawCircle*)CurrentDrawItem)->m_Pos.x = mx; - ((LibDrawCircle*)CurrentDrawItem)->m_Pos.y = - my; - break; + switch( DrawItem->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + { + int dx = mx - ( (LibDrawArc*) CurrentDrawItem )->m_Pos.x; + int dy = -my - ( (LibDrawArc*) CurrentDrawItem )->m_Pos.y; + ( (LibDrawArc*) CurrentDrawItem )->m_Pos.x = mx; + ( (LibDrawArc*) CurrentDrawItem )->m_Pos.y = -my; + ( (LibDrawArc*) CurrentDrawItem )->m_ArcStart.x += dx; + ( (LibDrawArc*) CurrentDrawItem )->m_ArcStart.y += dy; + ( (LibDrawArc*) CurrentDrawItem )->m_ArcEnd.x += dx; + ( (LibDrawArc*) CurrentDrawItem )->m_ArcEnd.y += dy; + break; + } - case COMPONENT_RECT_DRAW_TYPE: - size.x = ((LibDrawSquare*)CurrentDrawItem)->m_End.x - - ((LibDrawSquare*)CurrentDrawItem)->m_Pos.x; - size.y = ((LibDrawSquare*)CurrentDrawItem)->m_End.y - - ((LibDrawSquare*)CurrentDrawItem)->m_Pos.y; - ((LibDrawSquare*)CurrentDrawItem)->m_Pos.x = mx; - ((LibDrawSquare*)CurrentDrawItem)->m_Pos.y = - my; - ((LibDrawSquare*)CurrentDrawItem)->m_End.x = mx + size.x; - ((LibDrawSquare*)CurrentDrawItem)->m_End.y = - my + size.y; - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + ( (LibDrawCircle*) CurrentDrawItem )->m_Pos.x = mx; + ( (LibDrawCircle*) CurrentDrawItem )->m_Pos.y = -my; + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - { - int ii , imax = ((LibDrawPolyline*)CurrentDrawItem)->n * 2; - int * ptpoly = ((LibDrawPolyline*)CurrentDrawItem)->PolyList; - int dx = mx - ptpoly[0]; - int dy = - my - ptpoly[1]; - for ( ii = 0; ii < imax; ii += 2) - { - ptpoly[ii] += dx; - ptpoly[ii + 1] += dy; - } - } - break; + case COMPONENT_RECT_DRAW_TYPE: + size.x = ( (LibDrawSquare*) CurrentDrawItem )->m_End.x - + ( (LibDrawSquare*) CurrentDrawItem )->m_Pos.x; + size.y = ( (LibDrawSquare*) CurrentDrawItem )->m_End.y - + ( (LibDrawSquare*) CurrentDrawItem )->m_Pos.y; + ( (LibDrawSquare*) CurrentDrawItem )->m_Pos.x = mx; + ( (LibDrawSquare*) CurrentDrawItem )->m_Pos.y = -my; + ( (LibDrawSquare*) CurrentDrawItem )->m_End.x = mx + size.x; + ( (LibDrawSquare*) CurrentDrawItem )->m_End.y = -my + size.y; + break; - case COMPONENT_LINE_DRAW_TYPE: - break; + case COMPONENT_POLYLINE_DRAW_TYPE: + { + int ii, imax = ( (LibDrawPolyline*) CurrentDrawItem )->n * 2; + int* ptpoly = ( (LibDrawPolyline*) CurrentDrawItem )->PolyList; + int dx = mx - ptpoly[0]; + int dy = -my - ptpoly[1]; + for( ii = 0; ii < imax; ii += 2 ) + { + ptpoly[ii] += dx; + ptpoly[ii + 1] += dy; + } + } + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - ((LibDrawText*)CurrentDrawItem)->m_Pos.x = mx; - ((LibDrawText*)CurrentDrawItem)->m_Pos.y = - my; - break; - } + case COMPONENT_LINE_DRAW_TYPE: + break; + + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + ( (LibDrawText*) CurrentDrawItem )->m_Pos.x = mx; + ( (LibDrawText*) CurrentDrawItem )->m_Pos.y = -my; + break; + + default: + ; + } } + /************************************************************/ -void WinEDA_LibeditFrame::StartMoveDrawSymbol(wxDC * DC) +void WinEDA_LibeditFrame::StartMoveDrawSymbol( wxDC* DC ) /************************************************************/ { - if(CurrentDrawItem == NULL) return; + if( CurrentDrawItem == NULL ) + return; - SetCursor(wxCURSOR_HAND); + SetCursor( wxCURSOR_HAND ); - CurrentDrawItem->m_Flags |= IS_MOVED; - StartCursor = m_CurrentScreen->m_Curseur; + CurrentDrawItem->m_Flags |= IS_MOVED; + StartCursor = m_CurrentScreen->m_Curseur; - switch ( CurrentDrawItem->m_StructType ) - { - case COMPONENT_ARC_DRAW_TYPE: - InitPosition = ((LibDrawArc*)CurrentDrawItem)->m_Pos; - break; + switch( CurrentDrawItem->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + InitPosition = ( (LibDrawArc*) CurrentDrawItem )->m_Pos; + break; - case COMPONENT_CIRCLE_DRAW_TYPE: - InitPosition = ((LibDrawCircle*)CurrentDrawItem)->m_Pos; - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + InitPosition = ( (LibDrawCircle*) CurrentDrawItem )->m_Pos; + break; - case COMPONENT_RECT_DRAW_TYPE: - InitPosition = ((LibDrawSquare*)CurrentDrawItem)->m_Pos; - break; + case COMPONENT_RECT_DRAW_TYPE: + InitPosition = ( (LibDrawSquare*) CurrentDrawItem )->m_Pos; + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - InitPosition.x = * ((LibDrawPolyline*)CurrentDrawItem)->PolyList; - InitPosition.y = * (((LibDrawPolyline*)CurrentDrawItem)->PolyList + 1); - break; + case COMPONENT_POLYLINE_DRAW_TYPE: + InitPosition.x = *( (LibDrawPolyline*) CurrentDrawItem )->PolyList; + InitPosition.y = *( ( (LibDrawPolyline*) CurrentDrawItem )->PolyList + 1 ); + break; - case COMPONENT_LINE_DRAW_TYPE: - break; + case COMPONENT_LINE_DRAW_TYPE: + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - InitPosition = ((LibDrawText*)CurrentDrawItem)->m_Pos; - break; - } + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + InitPosition = ( (LibDrawText*) CurrentDrawItem )->m_Pos; + break; - ItemPreviousPos = m_CurrentScreen->m_Curseur; - DrawPanel->ManageCurseur = RedrawWhileMovingCursor; - DrawPanel->ForceCloseManageCurseur = AbortSymbolTraceOn; - DrawPanel->ManageCurseur(DrawPanel, DC, TRUE); + default: + ; + } + + ItemPreviousPos = m_CurrentScreen->m_Curseur; + DrawPanel->ManageCurseur = RedrawWhileMovingCursor; + DrawPanel->ForceCloseManageCurseur = AbortSymbolTraceOn; + DrawPanel->ManageCurseur( DrawPanel, DC, TRUE ); } - /****************************************************************/ /* Routine de Gestion des evenements souris lors de la creation */ /* d'un nouvel element type LibraryDrawStruct */ /****************************************************************/ -static void SymbolDisplayDraw(WinEDA_DrawPanel * panel, wxDC * DC, bool erase) +static void SymbolDisplayDraw( WinEDA_DrawPanel* panel, wxDC* DC, bool erase ) { -int DrawMode = g_XorMode; -int * ptpoly; -int dx, dy; -BASE_SCREEN * Screen = panel->m_Parent->m_CurrentScreen; -int mx = Screen->m_Curseur.x, - my = Screen->m_Curseur.y; + int DrawMode = g_XorMode; + int* ptpoly; + int dx, dy; + BASE_SCREEN* Screen = panel->m_Parent->m_CurrentScreen; + int mx = Screen->m_Curseur.x, + my = Screen->m_Curseur.y; - GRSetDrawMode(DC, DrawMode); + GRSetDrawMode( DC, DrawMode ); - if( erase ) - { - if( StateDrawArc == 1 ) - { - int Color = ReturnLayerColor(LAYER_DEVICE); - GRLine(&panel->m_ClipBox, DC, ArcStartX, - ArcStartY, ArcEndX, - ArcEndY, 0, Color); - } - else - { - DrawLibraryDrawStruct(panel, DC, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, DrawMode); - if(CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE) - { - int Color = ReturnLayerColor(LAYER_DEVICE); - GRDashedLine(&panel->m_ClipBox, DC, ArcStartX, - ArcStartY, - ((LibDrawArc*)CurrentDrawItem)->m_Pos.x, - - ((LibDrawArc*)CurrentDrawItem)->m_Pos.y, - 0, Color); - GRDashedLine(&panel->m_ClipBox, DC, ArcEndX, - ArcEndY, - ((LibDrawArc*)CurrentDrawItem)->m_Pos.x, - - ((LibDrawArc*)CurrentDrawItem)->m_Pos.y, - 0, Color); - } - } - } + if( erase ) + { + if( StateDrawArc == 1 ) + { + int Color = ReturnLayerColor( LAYER_DEVICE ); + GRLine( &panel->m_ClipBox, DC, ArcStartX, -ArcStartY, ArcEndX, -ArcEndY, 0, Color ); + } + else + { + DrawLibraryDrawStruct( panel, DC, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, DrawMode ); + if( CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE ) + { + int Color = ReturnLayerColor( LAYER_DEVICE ); + GRDashedLine( &panel->m_ClipBox, DC, ArcStartX, -ArcStartY, + ( (LibDrawArc*) CurrentDrawItem )->m_Pos.x, + -( (LibDrawArc*) CurrentDrawItem )->m_Pos.y, + 0, Color ); + GRDashedLine( &panel->m_ClipBox, DC, ArcEndX, -ArcEndY, + ( (LibDrawArc*) CurrentDrawItem )->m_Pos.x, + -( (LibDrawArc*) CurrentDrawItem )->m_Pos.y, + 0, Color ); + } + } + } - switch ( CurrentDrawItem->m_StructType ) - { - case COMPONENT_ARC_DRAW_TYPE: - if( StateDrawArc == 1) - { - ArcEndX = mx; ArcEndY = - my; - } + switch( CurrentDrawItem->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + if( StateDrawArc == 1 ) + { + ArcEndX = mx; ArcEndY = -my; + } - if( StateDrawArc == 2) - { - ComputeArc((LibDrawArc*)CurrentDrawItem, Screen->m_Curseur); - } - ((LibDrawArc*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + if( StateDrawArc == 2 ) + { + ComputeArc( (LibDrawArc*) CurrentDrawItem, Screen->m_Curseur ); + } + ( (LibDrawArc*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - case COMPONENT_CIRCLE_DRAW_TYPE: - dx = ((LibDrawCircle*)CurrentDrawItem)->m_Pos.x - mx; - dy = ((LibDrawCircle*)CurrentDrawItem)->m_Pos.y + my; - ((LibDrawCircle*)CurrentDrawItem)->m_Rayon = (int)sqrt( (dx*dx) + (dy*dy) ); - ((LibDrawCircle*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + dx = ( (LibDrawCircle*) CurrentDrawItem )->m_Pos.x - mx; + dy = ( (LibDrawCircle*) CurrentDrawItem )->m_Pos.y + my; + ( (LibDrawCircle*) CurrentDrawItem )->m_Rayon = (int) sqrt( (dx * dx) + (dy * dy) ); + ( (LibDrawCircle*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - case COMPONENT_RECT_DRAW_TYPE: - ((LibDrawSquare*)CurrentDrawItem)->m_End.x = mx; - ((LibDrawSquare*)CurrentDrawItem)->m_End.y = - my; - ((LibDrawSquare*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + case COMPONENT_RECT_DRAW_TYPE: + ( (LibDrawSquare*) CurrentDrawItem )->m_End.x = mx; + ( (LibDrawSquare*) CurrentDrawItem )->m_End.y = -my; + ( (LibDrawSquare*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - ptpoly = ((LibDrawPolyline*)CurrentDrawItem)->PolyList; - ptpoly += 2 * (((LibDrawPolyline*)CurrentDrawItem)->n - 1); - ptpoly[0] = mx; - ptpoly[1] = - my; - ((LibDrawPolyline*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + case COMPONENT_POLYLINE_DRAW_TYPE: + ptpoly = ( (LibDrawPolyline*) CurrentDrawItem )->PolyList; + ptpoly += 2 * ( ( (LibDrawPolyline*) CurrentDrawItem )->n - 1 ); + ptpoly[0] = mx; + ptpoly[1] = -my; + ( (LibDrawPolyline*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - case COMPONENT_LINE_DRAW_TYPE: - ((LibDrawSegment*)CurrentDrawItem)->m_End.x = mx; - ((LibDrawSegment*)CurrentDrawItem)->m_End.y = - my; - break; + case COMPONENT_LINE_DRAW_TYPE: + ( (LibDrawSegment*) CurrentDrawItem )->m_End.x = mx; + ( (LibDrawSegment*) CurrentDrawItem )->m_End.y = -my; + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: /* Traite par des routines specifiques */ - break; - } + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: /* Traite par des routines specifiques */ + break; - if( StateDrawArc == 1 ) - { - int Color = ReturnLayerColor(LAYER_DEVICE); - GRLine(&panel->m_ClipBox, DC, ArcStartX, - ArcStartY, ArcEndX, - ArcEndY, 0, Color); - } - else - { - DrawLibraryDrawStruct(panel, DC, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, DrawMode); - if(CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE) - { - int Color = ReturnLayerColor(LAYER_DEVICE); - GRDashedLine(&panel->m_ClipBox, DC, ArcStartX, - ArcStartY, - ((LibDrawArc*)CurrentDrawItem)->m_Pos.x, - - ((LibDrawArc*)CurrentDrawItem)->m_Pos.y, - 0, Color); - GRDashedLine(&panel->m_ClipBox, DC, ArcEndX, - ArcEndY, - ((LibDrawArc*)CurrentDrawItem)->m_Pos.x, - - ((LibDrawArc*)CurrentDrawItem)->m_Pos.y, - 0, Color); - } - } + default: + ; + } + + if( StateDrawArc == 1 ) + { + int Color = ReturnLayerColor( LAYER_DEVICE ); + GRLine( &panel->m_ClipBox, DC, ArcStartX, -ArcStartY, ArcEndX, -ArcEndY, 0, Color ); + } + else + { + DrawLibraryDrawStruct( panel, DC, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, DrawMode ); + if( CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE ) + { + int Color = ReturnLayerColor( LAYER_DEVICE ); + GRDashedLine( &panel->m_ClipBox, DC, ArcStartX, -ArcStartY, + ( (LibDrawArc*) CurrentDrawItem )->m_Pos.x, + -( (LibDrawArc*) CurrentDrawItem )->m_Pos.y, + 0, Color ); + GRDashedLine( &panel->m_ClipBox, DC, ArcEndX, -ArcEndY, + ( (LibDrawArc*) CurrentDrawItem )->m_Pos.x, + -( (LibDrawArc*) CurrentDrawItem )->m_Pos.y, + 0, Color ); + } + } } /******************************************************/ -void WinEDA_LibeditFrame::EndDrawGraphicItem(wxDC * DC) +void WinEDA_LibeditFrame::EndDrawGraphicItem( wxDC* DC ) /******************************************************/ + /* Place la structure courante en liste des structures du composant - courant, si elle existe et redessine toujours celle ci - Parametres: (tous globaux) - CurrentDrawItem - CurrentLibEntry -*/ + * courant, si elle existe et redessine toujours celle ci + * Parametres: (tous globaux) + * CurrentDrawItem + * CurrentLibEntry + */ { - if(CurrentLibEntry == NULL) return; - if(CurrentDrawItem == NULL) return; + if( CurrentLibEntry == NULL ) + return; + if( CurrentDrawItem == NULL ) + return; - if( CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE ) - { - if (StateDrawArc == 1 ) /* Trace d'arc en cours: doit etre termine */ - { - DisplayError(this, wxT("Arc in progress.."), 10 ); return; - } - else - { - if ( (CurrentDrawItem->m_Flags & IS_MOVED) == 0 ) - SymbolDisplayDraw(DrawPanel, DC, FALSE); - } - } + if( CurrentDrawItem->m_StructType == COMPONENT_ARC_DRAW_TYPE ) + { + if( StateDrawArc == 1 ) /* Trace d'arc en cours: doit etre termine */ + { + DisplayError( this, wxT( "Arc in progress.." ), 10 ); return; + } + else + { + if( (CurrentDrawItem->m_Flags & IS_MOVED) == 0 ) + SymbolDisplayDraw( DrawPanel, DC, FALSE ); + } + } - StateDrawArc = 0; + StateDrawArc = 0; - if ( CurrentDrawItem->m_Flags & IS_NEW ) - { - SaveCopyInUndoList(CurrentLibEntry); - CurrentDrawItem->Pnext = CurrentLibEntry->m_Drawings; - CurrentLibEntry->m_Drawings = CurrentDrawItem; - switch ( CurrentDrawItem->m_StructType ) - { - case COMPONENT_ARC_DRAW_TYPE: - ((LibDrawArc*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + if( CurrentDrawItem->m_Flags & IS_NEW ) + { + SaveCopyInUndoList( CurrentLibEntry ); + CurrentDrawItem->Pnext = CurrentLibEntry->m_Drawings; + CurrentLibEntry->m_Drawings = CurrentDrawItem; - case COMPONENT_CIRCLE_DRAW_TYPE: - ((LibDrawCircle*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + switch( CurrentDrawItem->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + ( (LibDrawArc*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - case COMPONENT_RECT_DRAW_TYPE: - ((LibDrawSquare*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + ( (LibDrawCircle*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - ((LibDrawPolyline*)CurrentDrawItem)->m_Fill = FlSymbol_Fill; - break; + case COMPONENT_RECT_DRAW_TYPE: + ( (LibDrawSquare*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - case COMPONENT_PIN_DRAW_TYPE: - case COMPONENT_LINE_DRAW_TYPE: - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - break; - } - CurrentLibEntry->SortDrawItems(); - } + case COMPONENT_POLYLINE_DRAW_TYPE: + ( (LibDrawPolyline*) CurrentDrawItem )->m_Fill = FlSymbol_Fill; + break; - if ( m_ID_current_state ) SetCursor(wxCURSOR_PENCIL); - else SetCursor(wxCURSOR_ARROW); + case COMPONENT_PIN_DRAW_TYPE: + case COMPONENT_LINE_DRAW_TYPE: + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + break; - if ( (CurrentDrawItem->m_Flags & IS_MOVED) ) - { - wxPoint pos; - pos.x = GetScreen()->m_Curseur.x + InitPosition.x - StartCursor.x , - pos.y = GetScreen()->m_Curseur.y - InitPosition.y - StartCursor.y ; - MoveLibDrawItemAt(CurrentDrawItem, pos ); - } + default: + ; + } - DrawLibEntry(DrawPanel, DC, CurrentLibEntry, 0, 0, CurrentUnit, - CurrentConvert, GR_DEFAULT_DRAWMODE ); + CurrentLibEntry->SortDrawItems(); + } - CurrentDrawItem->m_Flags = 0; - CurrentDrawItem = NULL; + if( m_ID_current_state ) + SetCursor( wxCURSOR_PENCIL ); + else + SetCursor( wxCURSOR_ARROW ); - m_CurrentScreen->SetModify(); + if( (CurrentDrawItem->m_Flags & IS_MOVED) ) + { + wxPoint pos; + pos.x = GetScreen()->m_Curseur.x + InitPosition.x - StartCursor.x, + pos.y = GetScreen()->m_Curseur.y - InitPosition.y - StartCursor.y; + MoveLibDrawItemAt( CurrentDrawItem, pos ); + } - DrawPanel->ManageCurseur = NULL; - DrawPanel->ForceCloseManageCurseur = NULL; + DrawLibEntry( DrawPanel, DC, CurrentLibEntry, 0, 0, CurrentUnit, + CurrentConvert, GR_DEFAULT_DRAWMODE ); + + CurrentDrawItem->m_Flags = 0; + CurrentDrawItem = NULL; + + m_CurrentScreen->SetModify(); + + DrawPanel->ManageCurseur = NULL; + DrawPanel->ForceCloseManageCurseur = NULL; } +/***************************************************************/ +static void ComputeArc( LibDrawArc* DrawItem, wxPoint ArcCentre ) +/***************************************************************/ -/***************************************************************/ -static void ComputeArc(LibDrawArc * DrawItem, wxPoint ArcCentre) -/***************************************************************/ /* routine d'ajustage des parametres de l'arc en cours de trace - calcule le centre, rayon, angles pour que l'arc en cours - passe par les points ArcStartX,Y et ArcEndX,Y avec le centre le plus proche - de la pos souris - Remarque: le centre n'est evidemment pas sur la grille -*/ + * calcule le centre, rayon, angles pour que l'arc en cours + * passe par les points ArcStartX,Y et ArcEndX,Y avec le centre le plus proche + * de la pos souris + * Remarque: le centre n'est evidemment pas sur la grille + */ { -int dx, dy; -int cX, cY; /* Coord centre de l'arc */ -int angle; + int dx, dy; + int cX, cY; /* Coord centre de l'arc */ + int angle; - cX = ArcCentre.x; cY = ArcCentre.y; + cX = ArcCentre.x; cY = ArcCentre.y; - cY = -cY; /* Attention a l'orientation de l'axe Y */ + cY = -cY; /* Attention a l'orientation de l'axe Y */ - /* calcul de cX et cY pour que l'arc passe par ArcStartX,Y et ArcEndX,Y */ - dx = ArcEndX - ArcStartX; dy = ArcEndY - ArcStartY; - cX -= ArcStartX; cY -= ArcStartY; - angle = (int)(atan2(dy, dx) *1800 /M_PI); - RotatePoint( &dx, &dy, angle); /* Le segment dx, dy est horizontal */ - /* -> dx = longueur, dy = 0 */ - RotatePoint( &cX, &cY, angle); - cX = dx / 2; /* cX, cY est sur la mediane du segment 0,0 a dx,0 */ + /* calcul de cX et cY pour que l'arc passe par ArcStartX,Y et ArcEndX,Y */ + dx = ArcEndX - ArcStartX; dy = ArcEndY - ArcStartY; + cX -= ArcStartX; cY -= ArcStartY; + angle = (int) (atan2( dy, dx ) * 1800 / M_PI); + RotatePoint( &dx, &dy, angle ); /* Le segment dx, dy est horizontal */ + /* -> dx = longueur, dy = 0 */ + RotatePoint( &cX, &cY, angle ); + cX = dx / 2; /* cX, cY est sur la mediane du segment 0,0 a dx,0 */ - RotatePoint( &cX, &cY, -angle); - cX += ArcStartX; cY += ArcStartY; + RotatePoint( &cX, &cY, -angle ); + cX += ArcStartX; cY += ArcStartY; - DrawItem->m_Pos.x = cX; DrawItem->m_Pos.y = cY; + DrawItem->m_Pos.x = cX; DrawItem->m_Pos.y = cY; - dx = ArcStartX - DrawItem->m_Pos.x; - dy = ArcStartY - DrawItem->m_Pos.y; + dx = ArcStartX - DrawItem->m_Pos.x; + dy = ArcStartY - DrawItem->m_Pos.y; - DrawItem->m_Rayon = (int)sqrt( (dx*dx) + (dy*dy) ); + DrawItem->m_Rayon = (int) sqrt( (dx * dx) + (dy * dy) ); - DrawItem->t1 = (int)(atan2(dy, dx) *1800 /M_PI); + DrawItem->t1 = (int) (atan2( dy, dx ) * 1800 / M_PI); - dx = ArcEndX - DrawItem->m_Pos.x; - dy = ArcEndY - DrawItem->m_Pos.y; + dx = ArcEndX - DrawItem->m_Pos.x; + dy = ArcEndY - DrawItem->m_Pos.y; - DrawItem->t2 = (int)(atan2(dy, dx) *1800 /M_PI); - - DrawItem->m_ArcStart.x = ArcStartX; - DrawItem->m_ArcStart.y = ArcStartY; - DrawItem->m_ArcEnd.x = ArcEndX; - DrawItem->m_ArcEnd.y = ArcEndY; - - NORMALIZE_ANGLE(DrawItem->t1); - NORMALIZE_ANGLE(DrawItem->t2); // angles = 0 .. 3600 - - // limitation val abs a < 1800 (1/2 cercle) pour eviter Pbs d'affichage en miroir - // car en trace on suppose que l'arc fait moins de 180 deg pour trouver - // son orientation apres rot, miroir... - if ( (DrawItem->t2 - DrawItem->t1) > 1800 ) DrawItem->t2 -= 3600; - else if ( (DrawItem->t2 - DrawItem->t1) <= -1800 ) DrawItem->t2 += 3600; - -wxString msg; - angle = DrawItem->t2 - DrawItem->t1; - msg.Printf(_("Arc %.1f deg"), (float)angle/10 ); - EDA_Appl->LibeditFrame->PrintMsg(msg); - - while ( (DrawItem->t2 - DrawItem->t1) >= 1800 ) - { - DrawItem->t2--; - DrawItem->t1++; - } - while ( (DrawItem->t1 - DrawItem->t2) >= 1800 ) - { - DrawItem->t2++; - DrawItem->t1--; - } + DrawItem->t2 = (int) (atan2( dy, dx ) * 1800 / M_PI); - NORMALIZE_ANGLE(DrawItem->t1); - NORMALIZE_ANGLE(DrawItem->t2); + DrawItem->m_ArcStart.x = ArcStartX; + DrawItem->m_ArcStart.y = ArcStartY; + DrawItem->m_ArcEnd.x = ArcEndX; + DrawItem->m_ArcEnd.y = ArcEndY; + NORMALIZE_ANGLE( DrawItem->t1 ); + NORMALIZE_ANGLE( DrawItem->t2 ); // angles = 0 .. 3600 + + // limitation val abs a < 1800 (1/2 cercle) pour eviter Pbs d'affichage en miroir + // car en trace on suppose que l'arc fait moins de 180 deg pour trouver + // son orientation apres rot, miroir... + if( (DrawItem->t2 - DrawItem->t1) > 1800 ) + DrawItem->t2 -= 3600; + else if( (DrawItem->t2 - DrawItem->t1) <= -1800 ) + DrawItem->t2 += 3600; + + wxString msg; + angle = DrawItem->t2 - DrawItem->t1; + msg.Printf( _( "Arc %.1f deg" ), (float) angle / 10 ); + EDA_Appl->LibeditFrame->PrintMsg( msg ); + + while( (DrawItem->t2 - DrawItem->t1) >= 1800 ) + { + DrawItem->t2--; + DrawItem->t1++; + } + + while( (DrawItem->t1 - DrawItem->t2) >= 1800 ) + { + DrawItem->t2++; + DrawItem->t1--; + } + + NORMALIZE_ANGLE( DrawItem->t1 ); + NORMALIZE_ANGLE( DrawItem->t2 ); } + /***************************************************/ -void WinEDA_LibeditFrame::DeleteDrawPoly(wxDC * DC) +void WinEDA_LibeditFrame::DeleteDrawPoly( wxDC* DC ) /**************************************************/ + /* Used for deleting last entered segment while creating a Polyline -*/ + */ { - - if ( CurrentDrawItem == NULL ) return; - if( CurrentDrawItem->m_StructType != COMPONENT_POLYLINE_DRAW_TYPE ) - return; + if( CurrentDrawItem == NULL ) + return; + if( CurrentDrawItem->m_StructType != COMPONENT_POLYLINE_DRAW_TYPE ) + return; -int * ptpoly; -LibDrawPolyline * Poly = (LibDrawPolyline*)CurrentDrawItem; + int* ptpoly; + LibDrawPolyline* Poly = (LibDrawPolyline*) CurrentDrawItem; - DrawLibraryDrawStruct(DrawPanel, DC, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, g_XorMode); + DrawLibraryDrawStruct( DrawPanel, DC, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, g_XorMode ); - while( Poly->n > 2 ) // First segment is kept, only its end point is changed - { - Poly->n --; - ptpoly = Poly->PolyList + (2 * (Poly->n - 1)); - if ( (ptpoly[0] != m_CurrentScreen->m_Curseur.x) || - (ptpoly[1] != - m_CurrentScreen->m_Curseur.y) ) - { - ptpoly[0] = m_CurrentScreen->m_Curseur.x; - ptpoly[1] = - m_CurrentScreen->m_Curseur.y; - break; - } - } + while( Poly->n > 2 ) // First segment is kept, only its end point is changed + { + Poly->n--; + ptpoly = Poly->PolyList + ( 2 * (Poly->n - 1) ); + if( (ptpoly[0] != m_CurrentScreen->m_Curseur.x) + || (ptpoly[1] != -m_CurrentScreen->m_Curseur.y) ) + { + ptpoly[0] = m_CurrentScreen->m_Curseur.x; + ptpoly[1] = -m_CurrentScreen->m_Curseur.y; + break; + } + } - int allocsize = 2 * sizeof(int) * Poly->n; - Poly->PolyList = (int*)realloc(Poly->PolyList, allocsize ); + int allocsize = 2 * sizeof(int) * Poly->n; + Poly->PolyList = (int*) realloc( Poly->PolyList, allocsize ); - DrawLibraryDrawStruct(DrawPanel, DC, CurrentLibEntry, 0 , 0, - CurrentDrawItem, CurrentUnit, g_XorMode); + DrawLibraryDrawStruct( DrawPanel, DC, CurrentLibEntry, 0, 0, + CurrentDrawItem, CurrentUnit, g_XorMode ); } - diff --git a/eeschema/symbedit.cpp b/eeschema/symbedit.cpp index cf4a476875..e5b13f62eb 100644 --- a/eeschema/symbedit.cpp +++ b/eeschema/symbedit.cpp @@ -1,11 +1,11 @@ - /*************************************************/ - /* Functions to Load from file and save to file */ - /* the graphic shapes used to draw a component */ - /* When using the import/export symbol options */ - /* files are the *.sym files */ - /*************************************************/ +/*************************************************/ +/* Functions to Load from file and save to file */ +/* the graphic shapes used to draw a component */ +/* When using the import/export symbol options */ +/* files are the *.sym files */ +/*************************************************/ - /* fichier symbedit.cpp */ +/* fichier symbedit.cpp */ #include "fctsys.h" #include "gr_basic.h" @@ -19,362 +19,406 @@ /* Routines locales */ -static bool CompareSymbols(LibEDA_BaseStruct *DEntryRef, - LibEDA_BaseStruct *DEntryCompare); +static bool CompareSymbols( LibEDA_BaseStruct* DEntryRef, + LibEDA_BaseStruct* DEntryCompare ); /* Variables locales */ - - /***************************************************/ -void WinEDA_LibeditFrame::LoadOneSymbol(wxDC * DC) +void WinEDA_LibeditFrame::LoadOneSymbol( wxDC* DC ) /***************************************************/ + /* Read a component shape file and add data (graphic items) to the current - component. -*/ + * component. + */ { -int NumOfParts; -PriorQue *Entries; -EDA_LibComponentStruct *LibEntry = NULL; -LibEDA_BaseStruct *DrawEntry; -wxString FullFileName, mask; -FILE * ImportFile; -wxString msg; + int NumOfParts; + PriorQue* Entries; + EDA_LibComponentStruct* LibEntry = NULL; + LibEDA_BaseStruct* DrawEntry; + wxString FullFileName, mask; + FILE* ImportFile; + wxString msg; - if(CurrentDrawItem) return; - if( CurrentLibEntry == NULL) return; + if( CurrentDrawItem ) + return; + if( CurrentLibEntry == NULL ) + return; - DrawPanel->m_IgnoreMouseEvents = TRUE; + DrawPanel->m_IgnoreMouseEvents = TRUE; - mask = wxT("*") + g_SymbolExtBuffer; - FullFileName = EDA_FileSelector( _("Import symbol drawings:"), - g_RealLibDirBuffer, /* Chemin par defaut */ - wxEmptyString, /* nom fichier par defaut */ - g_SymbolExtBuffer, /* extension par defaut */ - mask, /* Masque d'affichage */ - this, - 0, - TRUE - ); + mask = wxT( "*" ) + g_SymbolExtBuffer; + FullFileName = EDA_FileSelector( _( "Import symbol drawings:" ), + g_RealLibDirBuffer, /* Chemin par defaut */ + wxEmptyString, /* nom fichier par defaut */ + g_SymbolExtBuffer, /* extension par defaut */ + mask, /* Masque d'affichage */ + this, + 0, + TRUE + ); - GetScreen()->m_Curseur = wxPoint(0,0); - DrawPanel->MouseToCursorSchema(); - DrawPanel->m_IgnoreMouseEvents = FALSE; + GetScreen()->m_Curseur = wxPoint( 0, 0 ); + DrawPanel->MouseToCursorSchema(); + DrawPanel->m_IgnoreMouseEvents = FALSE; - if ( FullFileName.IsEmpty() ) return; + if( FullFileName.IsEmpty() ) + return; - /* Load data */ - ImportFile = wxFopen(FullFileName, wxT("rt")); - if (ImportFile == NULL) - { - msg.Printf( _("Failed to open Symbol File <%s>"), FullFileName.GetData()); - DisplayError(this, msg, 20); - return; - } + /* Load data */ + ImportFile = wxFopen( FullFileName, wxT( "rt" ) ); + if( ImportFile == NULL ) + { + msg.Printf( _( "Failed to open Symbol File <%s>" ), FullFileName.GetData() ); + DisplayError( this, msg, 20 ); + return; + } - Entries = LoadLibraryAux(this, NULL, ImportFile, &NumOfParts); - fclose(ImportFile); + Entries = LoadLibraryAux( this, NULL, ImportFile, &NumOfParts ); + fclose( ImportFile ); - if( Entries == NULL) return; + if( Entries == NULL ) + return; - if(NumOfParts > 1 ) - DisplayError(this, _("Warning: more than 1 part in Symbol File"), 20); + if( NumOfParts > 1 ) + DisplayError( this, _( "Warning: more than 1 part in Symbol File" ), 20 ); - LibEntry = (EDA_LibComponentStruct *)PQFirst(&Entries,FALSE); + LibEntry = (EDA_LibComponentStruct*) PQFirst( &Entries, FALSE ); - if(LibEntry == NULL ) - DisplayError(this, _("Symbol File is void"), 20); + if( LibEntry == NULL ) + DisplayError( this, _( "Symbol File is void" ), 20 ); - else /* add data to the current symbol */ - { - DrawEntry = LibEntry->m_Drawings; - while(DrawEntry) - { - if(DrawEntry->m_Unit) DrawEntry->m_Unit = CurrentUnit; - if(DrawEntry->m_Convert) DrawEntry->m_Convert = CurrentConvert; - DrawEntry->m_Flags = IS_NEW; - DrawEntry->m_Selected = IS_SELECTED; + else /* add data to the current symbol */ + { + DrawEntry = LibEntry->m_Drawings; + while( DrawEntry ) + { + if( DrawEntry->m_Unit ) + DrawEntry->m_Unit = CurrentUnit; + if( DrawEntry->m_Convert ) + DrawEntry->m_Convert = CurrentConvert; + DrawEntry->m_Flags = IS_NEW; + DrawEntry->m_Selected = IS_SELECTED; - if(DrawEntry->Pnext == NULL) - { /* Fin de liste trouvee */ - DrawEntry->Pnext = CurrentLibEntry->m_Drawings; - CurrentLibEntry->m_Drawings = LibEntry->m_Drawings; - LibEntry->m_Drawings = NULL; - break; - } - DrawEntry = DrawEntry->Next(); - } - SuppressDuplicateDrawItem(CurrentLibEntry); - m_CurrentScreen->SetModify(); - // Move (and place ) the new draw items: - HandleBlockBegin(DC, -1, GetScreen()->m_Curseur); - HandleBlockEnd(DC); - RedrawActiveWindow( DC,TRUE); - } + if( DrawEntry->Pnext == NULL ) + { /* Fin de liste trouvee */ + DrawEntry->Pnext = CurrentLibEntry->m_Drawings; + CurrentLibEntry->m_Drawings = LibEntry->m_Drawings; + LibEntry->m_Drawings = NULL; + break; + } + DrawEntry = DrawEntry->Next(); + } - PQFreeFunc(Entries, (void(*)(void*))FreeLibraryEntry); + SuppressDuplicateDrawItem( CurrentLibEntry ); + m_CurrentScreen->SetModify(); + + // Move (and place ) the new draw items: + HandleBlockBegin( DC, -1, GetScreen()->m_Curseur ); + HandleBlockEnd( DC ); + RedrawActiveWindow( DC, TRUE ); + } + + PQFreeFunc( Entries, ( void( * ) ( void* ) )FreeLibraryEntry ); } /********************************************/ -void WinEDA_LibeditFrame::SaveOneSymbol(void) +void WinEDA_LibeditFrame::SaveOneSymbol( void ) /********************************************/ + /* Save in file the current symbol - file format is like the standard libraries, but there is only one symbol - Invisible pins are not saved -*/ + * file format is like the standard libraries, but there is only one symbol + * Invisible pins are not saved + */ { -EDA_LibComponentStruct *LibEntry = CurrentLibEntry; -int Unit = CurrentUnit, convert = CurrentConvert; -int SymbUnit, SymbConvert; -LibEDA_BaseStruct *DrawEntry; -wxString FullFileName, mask; -wxString msg; -FILE * ExportFile; + EDA_LibComponentStruct* LibEntry = CurrentLibEntry; + int Unit = CurrentUnit, convert = CurrentConvert; + int SymbUnit, SymbConvert; + LibEDA_BaseStruct* DrawEntry; + wxString FullFileName, mask; + wxString msg; + FILE* ExportFile; - if( LibEntry->m_Drawings == NULL ) return; + if( LibEntry->m_Drawings == NULL ) + return; - /* Creation du fichier symbole */ - mask = wxT("*") + g_SymbolExtBuffer; - FullFileName = EDA_FileSelector( _("Export symbol drawings:"), - g_RealLibDirBuffer, /* Chemin par defaut */ - wxEmptyString, /* nom fichier par defaut */ - g_SymbolExtBuffer, /* extension par defaut */ - mask, /* Masque d'affichage */ - this, - wxFD_SAVE, - TRUE - ); - if ( FullFileName.IsEmpty() ) return; + /* Creation du fichier symbole */ + mask = wxT( "*" ) + g_SymbolExtBuffer; + FullFileName = EDA_FileSelector( _( "Export symbol drawings:" ), + g_RealLibDirBuffer, /* Chemin par defaut */ + wxEmptyString, /* nom fichier par defaut */ + g_SymbolExtBuffer, /* extension par defaut */ + mask, /* Masque d'affichage */ + this, + wxFD_SAVE, + TRUE + ); + if( FullFileName.IsEmpty() ) + return; - ExportFile = wxFopen(FullFileName, wxT("wt") ); - if ( ExportFile == NULL ) - { - msg.Printf(_("Unable to create <%s>"), FullFileName.GetData()); - DisplayError(this, msg); - return; - } + ExportFile = wxFopen( FullFileName, wxT( "wt" ) ); + if( ExportFile == NULL ) + { + msg.Printf( _( "Unable to create <%s>" ), FullFileName.GetData() ); + DisplayError( this, msg ); + return; + } - msg.Printf(_("Save Symbol in [%s]"), FullFileName.GetData()); - Affiche_Message(msg); + msg.Printf( _( "Save Symbol in [%s]" ), FullFileName.GetData() ); + Affiche_Message( msg ); - /* Creation de l'entete de la librairie */ - char Line[256]; - fprintf(ExportFile,"%s %d.%d %s Date: %s\n",LIBFILE_IDENT, - LIB_VERSION_MAJOR, LIB_VERSION_MINOR, - "SYMBOL",DateAndTime(Line)); + /* Creation de l'entete de la librairie */ + char Line[256]; + fprintf( ExportFile, "%s %d.%d %s Date: %s\n", LIBFILE_IDENT, + LIB_VERSION_MAJOR, LIB_VERSION_MINOR, + "SYMBOL", DateAndTime( Line ) ); - /* Creation du commentaire donnant le nom du composant */ - fprintf(ExportFile,"# SYMBOL %s\n#\n", - (const char*) LibEntry->m_Name.m_Text.GetData()); + /* Creation du commentaire donnant le nom du composant */ + fprintf( ExportFile, "# SYMBOL %s\n#\n", + (const char*) LibEntry->m_Name.m_Text.GetData() ); - /* Generation des lignes utiles */ - fprintf(ExportFile,"DEF %s", (const char*)LibEntry->m_Name.m_Text.GetData()); - if( ! LibEntry->m_Prefix.m_Text.IsEmpty()) - fprintf(ExportFile," %s", (const char*)LibEntry->m_Prefix.m_Text.GetData()); - else fprintf(ExportFile," ~"); + /* Generation des lignes utiles */ + fprintf( ExportFile, "DEF %s", (const char*) LibEntry->m_Name.m_Text.GetData() ); + if( !LibEntry->m_Prefix.m_Text.IsEmpty() ) + fprintf( ExportFile, " %s", (const char*) LibEntry->m_Prefix.m_Text.GetData() ); + else + fprintf( ExportFile, " ~" ); - fprintf(ExportFile," %d %d %c %c %d %d %c\n", - 0, /* unused */ - LibEntry->m_TextInside, - LibEntry->m_DrawPinNum ? 'Y' : 'N', - LibEntry->m_DrawPinName ? 'Y' : 'N', - 1, 0 /* unused */, 'N'); + fprintf( ExportFile, " %d %d %c %c %d %d %c\n", + 0, /* unused */ + LibEntry->m_TextInside, + LibEntry->m_DrawPinNum ? 'Y' : 'N', + LibEntry->m_DrawPinName ? 'Y' : 'N', + 1, 0 /* unused */, 'N' ); - /* Position / orientation / visibilite des champs */ + /* Position / orientation / visibilite des champs */ LibEntry->m_Prefix.WriteDescr( ExportFile ); LibEntry->m_Name.WriteDescr( ExportFile ); - DrawEntry = LibEntry->m_Drawings; - if(DrawEntry) - { - fprintf(ExportFile,"DRAW\n"); - for( ; DrawEntry != NULL ; DrawEntry = DrawEntry->Next()) - { - /* Elimination des elements non relatifs a l'unite */ - if( Unit && DrawEntry->m_Unit && (DrawEntry->m_Unit != Unit) ) - continue; - if( convert && DrawEntry->m_Convert && (DrawEntry->m_Convert != convert) ) - continue; + DrawEntry = LibEntry->m_Drawings; + if( DrawEntry ) + { + fprintf( ExportFile, "DRAW\n" ); + for( ; DrawEntry != NULL; DrawEntry = DrawEntry->Next() ) + { + /* Elimination des elements non relatifs a l'unite */ + if( Unit && DrawEntry->m_Unit && (DrawEntry->m_Unit != Unit) ) + continue; + if( convert && DrawEntry->m_Convert && (DrawEntry->m_Convert != convert) ) + continue; - /* .Unit , . Convert est laisse a 0 ou mis a 1 */ - SymbUnit = DrawEntry->m_Unit; if ( SymbUnit > 1) SymbUnit = 1; - SymbConvert = DrawEntry->m_Convert; - if ( SymbConvert > 1) SymbConvert = 1; - switch( DrawEntry->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - #define DRAWSTRUCT ((LibDrawArc *) DrawEntry) - DRAWSTRUCT->WriteDescr( ExportFile ); - break; + /* .Unit , . Convert est laisse a 0 ou mis a 1 */ + SymbUnit = DrawEntry->m_Unit; if( SymbUnit > 1 ) + SymbUnit = 1; + SymbConvert = DrawEntry->m_Convert; + if( SymbConvert > 1 ) + SymbConvert = 1; - case COMPONENT_CIRCLE_DRAW_TYPE: - #undef DRAWSTRUCT - #define DRAWSTRUCT ((LibDrawCircle *) DrawEntry) - DRAWSTRUCT->WriteDescr( ExportFile ); - break; + switch( DrawEntry->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + #define DRAWSTRUCT ( (LibDrawArc*) DrawEntry ) + DRAWSTRUCT->WriteDescr( ExportFile ); + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - #undef DRAWSTRUCT - #define DRAWSTRUCT ((LibDrawText *) DrawEntry) - DRAWSTRUCT->WriteDescr( ExportFile ); - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + #undef DRAWSTRUCT + #define DRAWSTRUCT ( (LibDrawCircle*) DrawEntry ) + DRAWSTRUCT->WriteDescr( ExportFile ); + break; - case COMPONENT_RECT_DRAW_TYPE: - #undef DRAWSTRUCT - #define DRAWSTRUCT ((LibDrawSquare *) DrawEntry) - DRAWSTRUCT->WriteDescr( ExportFile ); - break; + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + #undef DRAWSTRUCT + #define DRAWSTRUCT ( (LibDrawText*) DrawEntry ) + DRAWSTRUCT->WriteDescr( ExportFile ); + break; - case COMPONENT_PIN_DRAW_TYPE: - #undef DRAWSTRUCT - #define DRAWSTRUCT ((LibDrawPin *) DrawEntry) - if(DRAWSTRUCT->m_Attributs & PINNOTDRAW) break; - DRAWSTRUCT->WriteDescr( ExportFile ); - break; + case COMPONENT_RECT_DRAW_TYPE: + #undef DRAWSTRUCT + #define DRAWSTRUCT ( (LibDrawSquare*) DrawEntry ) + DRAWSTRUCT->WriteDescr( ExportFile ); + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - #undef DRAWSTRUCT - #define DRAWSTRUCT ((LibDrawPolyline *) DrawEntry) - DRAWSTRUCT->WriteDescr( ExportFile ); - break; - } - } - fprintf(ExportFile,"ENDDRAW\n"); - } - fprintf(ExportFile,"ENDDEF\n"); - fclose(ExportFile); + case COMPONENT_PIN_DRAW_TYPE: + #undef DRAWSTRUCT + #define DRAWSTRUCT ( (LibDrawPin*) DrawEntry ) + if( DRAWSTRUCT->m_Attributs & PINNOTDRAW ) + break; + DRAWSTRUCT->WriteDescr( ExportFile ); + break; + + case COMPONENT_POLYLINE_DRAW_TYPE: + #undef DRAWSTRUCT + #define DRAWSTRUCT ( (LibDrawPolyline*) DrawEntry ) + DRAWSTRUCT->WriteDescr( ExportFile ); + break; + + default: + ; + } + } + fprintf( ExportFile, "ENDDRAW\n" ); + } + fprintf( ExportFile, "ENDDEF\n" ); + fclose( ExportFile ); } +/*****************************************************************/ +void SuppressDuplicateDrawItem( EDA_LibComponentStruct* LibEntry ) +/*****************************************************************/ -/*****************************************************************/ -void SuppressDuplicateDrawItem(EDA_LibComponentStruct * LibEntry) -/*****************************************************************/ /* Delete redundant graphic items. - Useful after loading asymbole from a file symbol, because some graphic items - can be duplicated. -*/ + * Useful after loading asymbole from a file symbol, because some graphic items + * can be duplicated. + */ { -LibEDA_BaseStruct *DEntryRef, *DEntryCompare; -bool deleted; -wxDC * DC = NULL; + LibEDA_BaseStruct* DEntryRef, * DEntryCompare; + bool deleted; + wxDC* DC = NULL; - DEntryRef = LibEntry->m_Drawings; - while( DEntryRef) - { - if( DEntryRef->Pnext == NULL ) return; - DEntryCompare = DEntryRef->Next(); - if( DEntryCompare == NULL ) return; - deleted = 0; - while( DEntryCompare ) - { - if( CompareSymbols(DEntryRef,DEntryCompare) == TRUE) - { - DeleteOneLibraryDrawStruct(NULL, DC, LibEntry,DEntryRef, 1); - deleted = TRUE; - break; - } - DEntryCompare = DEntryCompare->Next(); - } - if ( ! deleted ) DEntryRef = DEntryRef->Next(); - else DEntryRef = LibEntry->m_Drawings; - } + DEntryRef = LibEntry->m_Drawings; + while( DEntryRef ) + { + if( DEntryRef->Pnext == NULL ) + return; + DEntryCompare = DEntryRef->Next(); + if( DEntryCompare == NULL ) + return; + deleted = 0; + while( DEntryCompare ) + { + if( CompareSymbols( DEntryRef, DEntryCompare ) == TRUE ) + { + DeleteOneLibraryDrawStruct( NULL, DC, LibEntry, DEntryRef, 1 ); + deleted = TRUE; + break; + } + DEntryCompare = DEntryCompare->Next(); + } + + if( !deleted ) + DEntryRef = DEntryRef->Next(); + else + DEntryRef = LibEntry->m_Drawings; + } } - /********************************************************************/ -static bool CompareSymbols(LibEDA_BaseStruct *DEntryRef, - LibEDA_BaseStruct *DEntryCompare) - /********************************************************************/ +static bool CompareSymbols( LibEDA_BaseStruct* DEntryRef, + LibEDA_BaseStruct* DEntryCompare ) +/********************************************************************/ + /* Compare 2 graphic items (arc, lines ...). - return FALSE si different - TRUE si they are identical, and therefore redundant -*/ + * return FALSE si different + * TRUE si they are identical, and therefore redundant + */ { -int ii; -int * ptref, *ptcomp; + int ii; + int* ptref, * ptcomp; - /* Comparaison des proprietes generales */ - if( DEntryRef->m_StructType != DEntryCompare->m_StructType) return(FALSE); - if( DEntryRef->m_Unit != DEntryCompare->m_Unit) return(FALSE); - if( DEntryRef->m_Convert != DEntryCompare->m_Convert) return(FALSE); + /* Comparaison des proprietes generales */ + if( DEntryRef->m_StructType != DEntryCompare->m_StructType ) + return FALSE; + if( DEntryRef->m_Unit != DEntryCompare->m_Unit ) + return FALSE; + if( DEntryRef->m_Convert != DEntryCompare->m_Convert ) + return FALSE; - switch( DEntryRef->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - #undef REFSTRUCT - #undef CMPSTRUCT - #define REFSTRUCT ((LibDrawArc *) DEntryRef) - #define CMPSTRUCT ((LibDrawArc *) DEntryCompare) - if( REFSTRUCT->m_Pos.x != CMPSTRUCT->m_Pos.x) return(FALSE); - if( REFSTRUCT->m_Pos.y != CMPSTRUCT->m_Pos.y) return(FALSE); - if( REFSTRUCT->t1 != CMPSTRUCT->t1) return(FALSE); - if( REFSTRUCT->t2 != CMPSTRUCT->t2) return(FALSE); - break; + switch( DEntryRef->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + #undef REFSTRUCT + #undef CMPSTRUCT + #define REFSTRUCT ( (LibDrawArc*) DEntryRef ) + #define CMPSTRUCT ( (LibDrawArc*) DEntryCompare ) + if( REFSTRUCT->m_Pos.x != CMPSTRUCT->m_Pos.x ) + return FALSE; + if( REFSTRUCT->m_Pos.y != CMPSTRUCT->m_Pos.y ) + return FALSE; + if( REFSTRUCT->t1 != CMPSTRUCT->t1 ) + return FALSE; + if( REFSTRUCT->t2 != CMPSTRUCT->t2 ) + return FALSE; + break; - case COMPONENT_CIRCLE_DRAW_TYPE: - #undef REFSTRUCT - #undef CMPSTRUCT - #define REFSTRUCT ((LibDrawCircle *) DEntryRef) - #define CMPSTRUCT ((LibDrawCircle *) DEntryCompare) - if( REFSTRUCT->m_Pos.x != CMPSTRUCT->m_Pos.x) return(FALSE); - if( REFSTRUCT->m_Pos.y != CMPSTRUCT->m_Pos.y) return(FALSE); - if( REFSTRUCT->m_Rayon != CMPSTRUCT->m_Rayon) return(FALSE); - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + #undef REFSTRUCT + #undef CMPSTRUCT + #define REFSTRUCT ( (LibDrawCircle*) DEntryRef ) + #define CMPSTRUCT ( (LibDrawCircle*) DEntryCompare ) + if( REFSTRUCT->m_Pos.x != CMPSTRUCT->m_Pos.x ) + return FALSE; + if( REFSTRUCT->m_Pos.y != CMPSTRUCT->m_Pos.y ) + return FALSE; + if( REFSTRUCT->m_Rayon != CMPSTRUCT->m_Rayon ) + return FALSE; + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - #undef REFSTRUCT - #undef CMPSTRUCT - #define REFSTRUCT ((LibDrawText *) DEntryRef) - #define CMPSTRUCT ((LibDrawText *) DEntryCompare) - if( REFSTRUCT->m_Pos != CMPSTRUCT->m_Pos) return(FALSE); - if( REFSTRUCT->m_Size != CMPSTRUCT->m_Size) return(FALSE); - if( REFSTRUCT->m_Text != CMPSTRUCT->m_Text ) - return(FALSE); - break; + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + #undef REFSTRUCT + #undef CMPSTRUCT + #define REFSTRUCT ( (LibDrawText*) DEntryRef ) + #define CMPSTRUCT ( (LibDrawText*) DEntryCompare ) + if( REFSTRUCT->m_Pos != CMPSTRUCT->m_Pos ) + return FALSE; + if( REFSTRUCT->m_Size != CMPSTRUCT->m_Size ) + return FALSE; + if( REFSTRUCT->m_Text != CMPSTRUCT->m_Text ) + return FALSE; + break; - case COMPONENT_RECT_DRAW_TYPE: - #undef REFSTRUCT - #undef CMPSTRUCT - #define REFSTRUCT ((LibDrawSquare *) DEntryRef) - #define CMPSTRUCT ((LibDrawSquare *) DEntryCompare) - if( REFSTRUCT->m_Pos != CMPSTRUCT->m_Pos) return(FALSE); - if( REFSTRUCT->m_End != CMPSTRUCT->m_End) return(FALSE); - break; + case COMPONENT_RECT_DRAW_TYPE: + #undef REFSTRUCT + #undef CMPSTRUCT + #define REFSTRUCT ( (LibDrawSquare*) DEntryRef ) + #define CMPSTRUCT ( (LibDrawSquare*) DEntryCompare ) + if( REFSTRUCT->m_Pos != CMPSTRUCT->m_Pos ) + return FALSE; + if( REFSTRUCT->m_End != CMPSTRUCT->m_End ) + return FALSE; + break; - case COMPONENT_PIN_DRAW_TYPE: - #undef REFSTRUCT - #undef CMPSTRUCT - #define REFSTRUCT ((LibDrawPin *) DEntryRef) - #define CMPSTRUCT ((LibDrawPin *) DEntryCompare) - if( REFSTRUCT->m_Pos != CMPSTRUCT->m_Pos) return(FALSE); - break; + case COMPONENT_PIN_DRAW_TYPE: + #undef REFSTRUCT + #undef CMPSTRUCT + #define REFSTRUCT ( (LibDrawPin*) DEntryRef ) + #define CMPSTRUCT ( (LibDrawPin*) DEntryCompare ) + if( REFSTRUCT->m_Pos != CMPSTRUCT->m_Pos ) + return FALSE; + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - #undef REFSTRUCT - #undef CMPSTRUCT - #define REFSTRUCT ((LibDrawPolyline *) DEntryRef) - #define CMPSTRUCT ((LibDrawPolyline *) DEntryCompare) - if( REFSTRUCT->n != CMPSTRUCT->n) return(FALSE); - ptref = REFSTRUCT->PolyList; - ptcomp = CMPSTRUCT->PolyList; - for( ii = 2 * REFSTRUCT->n ; ii > 0; ii-- ) - { - if( *ptref != *ptcomp) return(FALSE); - ptref++; ptcomp++; - } - break; - } - return(TRUE); + case COMPONENT_POLYLINE_DRAW_TYPE: + #undef REFSTRUCT + #undef CMPSTRUCT + #define REFSTRUCT ( (LibDrawPolyline*) DEntryRef ) + #define CMPSTRUCT ( (LibDrawPolyline*) DEntryCompare ) + if( REFSTRUCT->n != CMPSTRUCT->n ) + return FALSE; + ptref = REFSTRUCT->PolyList; + ptcomp = CMPSTRUCT->PolyList; + for( ii = 2 * REFSTRUCT->n; ii > 0; ii-- ) + { + if( *ptref != *ptcomp ) + return FALSE; + ptref++; ptcomp++; + } + + break; + + default: + ; + } + + return TRUE; } - /***************************************************************************/ /* Routine de placement du point d'ancrage ( reference des coordonnes pour */ /* le trace) du composant courant */ @@ -383,86 +427,90 @@ int * ptref, *ptcomp; /* d'ancrage ( coord 0,0 ). */ /***************************************************************************/ -void WinEDA_LibeditFrame::PlaceAncre(void) +void WinEDA_LibeditFrame::PlaceAncre( void ) { -int ii, *ptsegm; -int dx, dy; /* Offsets de deplacement */ -EDA_LibComponentStruct * LibEntry; -LibEDA_BaseStruct * DrawEntry; + int ii, * ptsegm; + int dx, dy; /* Offsets de deplacement */ + EDA_LibComponentStruct* LibEntry; + LibEDA_BaseStruct* DrawEntry; - dx = - m_CurrentScreen->m_Curseur.x; - dy = m_CurrentScreen->m_Curseur.y; + dx = -m_CurrentScreen->m_Curseur.x; + dy = m_CurrentScreen->m_Curseur.y; - LibEntry = CurrentLibEntry; - if( LibEntry == NULL ) return; + LibEntry = CurrentLibEntry; + if( LibEntry == NULL ) + return; - m_CurrentScreen->SetModify(); + m_CurrentScreen->SetModify(); - LibEntry->m_Name.m_Pos.x += dx; LibEntry->m_Name.m_Pos.y += dy; - LibEntry->m_Prefix.m_Pos.x += dx; LibEntry->m_Prefix.m_Pos.y += dy; + LibEntry->m_Name.m_Pos.x += dx; LibEntry->m_Name.m_Pos.y += dy; + LibEntry->m_Prefix.m_Pos.x += dx; LibEntry->m_Prefix.m_Pos.y += dy; - DrawEntry = LibEntry->m_Drawings; - while(DrawEntry) - { - switch(DrawEntry->m_StructType) - { - case COMPONENT_ARC_DRAW_TYPE: - #undef STRUCT - #define STRUCT ((LibDrawArc *) DrawEntry) - STRUCT->m_Pos.x += dx; - STRUCT->m_Pos.y += dy; - STRUCT->m_ArcStart.x += dx; - STRUCT->m_ArcStart.y += dy; - STRUCT->m_ArcEnd.x += dx; - STRUCT->m_ArcEnd.y += dy; - break; + DrawEntry = LibEntry->m_Drawings; + while( DrawEntry ) + { + switch( DrawEntry->m_StructType ) + { + case COMPONENT_ARC_DRAW_TYPE: + #undef STRUCT + #define STRUCT ( (LibDrawArc*) DrawEntry ) + STRUCT->m_Pos.x += dx; + STRUCT->m_Pos.y += dy; + STRUCT->m_ArcStart.x += dx; + STRUCT->m_ArcStart.y += dy; + STRUCT->m_ArcEnd.x += dx; + STRUCT->m_ArcEnd.y += dy; + break; - case COMPONENT_CIRCLE_DRAW_TYPE: - #undef STRUCT - #define STRUCT ((LibDrawCircle *) DrawEntry) - STRUCT->m_Pos.x += dx; - STRUCT->m_Pos.y += dy; - break; + case COMPONENT_CIRCLE_DRAW_TYPE: + #undef STRUCT + #define STRUCT ( (LibDrawCircle*) DrawEntry ) + STRUCT->m_Pos.x += dx; + STRUCT->m_Pos.y += dy; + break; - case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: - #undef STRUCT - #define STRUCT ((LibDrawText *) DrawEntry) - STRUCT->m_Pos.x += dx; - STRUCT->m_Pos.y += dy; - break; + case COMPONENT_GRAPHIC_TEXT_DRAW_TYPE: + #undef STRUCT + #define STRUCT ( (LibDrawText*) DrawEntry ) + STRUCT->m_Pos.x += dx; + STRUCT->m_Pos.y += dy; + break; - case COMPONENT_RECT_DRAW_TYPE: - #undef STRUCT - #define STRUCT ((LibDrawSquare *) DrawEntry) - STRUCT->m_Pos.x += dx; - STRUCT->m_Pos.y += dy; - STRUCT->m_End.x += dx; - STRUCT->m_End.y += dy; - break; + case COMPONENT_RECT_DRAW_TYPE: + #undef STRUCT + #define STRUCT ( (LibDrawSquare*) DrawEntry ) + STRUCT->m_Pos.x += dx; + STRUCT->m_Pos.y += dy; + STRUCT->m_End.x += dx; + STRUCT->m_End.y += dy; + break; - case COMPONENT_PIN_DRAW_TYPE: - #undef STRUCT - #define STRUCT ((LibDrawPin *) DrawEntry) - STRUCT->m_Pos.x += dx; - STRUCT->m_Pos.y += dy; - break; + case COMPONENT_PIN_DRAW_TYPE: + #undef STRUCT + #define STRUCT ( (LibDrawPin*) DrawEntry ) + STRUCT->m_Pos.x += dx; + STRUCT->m_Pos.y += dy; + break; - case COMPONENT_POLYLINE_DRAW_TYPE: - #undef STRUCT - #define STRUCT ((LibDrawPolyline *) DrawEntry) - ptsegm = STRUCT->PolyList; - for( ii = STRUCT->n ; ii > 0; ii-- ) - { - *ptsegm += dx; ptsegm++; - *ptsegm += dy;ptsegm++; - } - break; - } - DrawEntry = DrawEntry->Next(); - } - /* Redraw the symbol */ - m_CurrentScreen->m_Curseur.x = m_CurrentScreen->m_Curseur.y = 0; - Recadre_Trace(TRUE); - m_CurrentScreen->SetRefreshReq(); + case COMPONENT_POLYLINE_DRAW_TYPE: + #undef STRUCT + #define STRUCT ( (LibDrawPolyline*) DrawEntry ) + ptsegm = STRUCT->PolyList; + for( ii = STRUCT->n; ii > 0; ii-- ) + { + *ptsegm += dx; ptsegm++; + *ptsegm += dy; ptsegm++; + } + break; + + default: + ; + } + DrawEntry = DrawEntry->Next(); + } + + /* Redraw the symbol */ + m_CurrentScreen->m_Curseur.x = m_CurrentScreen->m_Curseur.y = 0; + Recadre_Trace( TRUE ); + m_CurrentScreen->SetRefreshReq(); } - diff --git a/include/base_struct.h b/include/base_struct.h index aa012e12d1..a529a9069f 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -14,8 +14,10 @@ extern std::ostream& operator<<( std::ostream& out, const wxPoint& pt ); /* Id for class identification, at run time */ -enum DrawStructureType { - +enum KICAD_T { + + NOT_USED = -1, // the 3d code uses this value + EOT = 0, // search types array terminator (End Of Types) TYPE_NOT_INIT = 0, @@ -80,7 +82,6 @@ enum SEARCH_RESULT { SEARCH_CONTINUE }; -typedef DrawStructureType KICAD_T; // shorter name class EDA_BaseStruct; class WinEDA_DrawFrame; @@ -126,7 +127,7 @@ public: class EDA_BaseStruct /* Basic class, not directly used */ { public: - int m_StructType; /* Struct ident for run time identification */ + KICAD_T m_StructType; /* Struct ident for run time identification */ EDA_BaseStruct* Pnext; /* Linked list: Link (next struct) */ EDA_BaseStruct* Pback; /* Linked list: Link (previous struct) */ EDA_BaseStruct* m_Parent; /* Linked list: Link (parent struct) */ @@ -163,11 +164,11 @@ private: public: - EDA_BaseStruct( EDA_BaseStruct* parent, int idType ); - EDA_BaseStruct( int struct_type ); + EDA_BaseStruct( EDA_BaseStruct* parent, KICAD_T idType ); + EDA_BaseStruct( KICAD_T struct_type ); virtual ~EDA_BaseStruct() { }; - EDA_BaseStruct* Next( void ) { return Pnext; } + EDA_BaseStruct* Next() { return Pnext; } /* Gestion de l'etat (status) de la structure (active, deleted..) */ int GetState( int type ); @@ -381,7 +382,7 @@ protected: public: - BOARD_ITEM( BOARD_ITEM* StructFather, DrawStructureType idtype ) : + BOARD_ITEM( BOARD_ITEM* StructFather, KICAD_T idtype ) : EDA_BaseStruct( StructFather, idtype ), m_Layer(0) { @@ -450,22 +451,6 @@ public: }; -/* Base class for building items like lines, which have 1 start point and 1 end point. - * Arc and circles can use this class. - */ -class EDA_BaseLineStruct : public EDA_BaseStruct -{ -public: - int m_Layer; // Layer number - int m_Width; // 0 = line, > 0 = tracks, bus ... - wxPoint m_Start; // Line start point - wxPoint m_End; // Line end point - -public: - EDA_BaseLineStruct( EDA_BaseStruct* StructFather, DrawStructureType idtype ); -}; - - /**************************/ /* class DrawPickedStruct */ /**************************/ diff --git a/include/pcbstruct.h b/include/pcbstruct.h index 26566d8df6..5012164a3a 100644 --- a/include/pcbstruct.h +++ b/include/pcbstruct.h @@ -358,7 +358,7 @@ public: int m_Angle; // pour les arcs: "longueur" de l'arc en 1/10 deg public: - DRAWSEGMENT( BOARD_ITEM* StructFather, DrawStructureType idtype = TYPEDRAWSEGMENT ); + DRAWSEGMENT( BOARD_ITEM* StructFather, KICAD_T idtype = TYPEDRAWSEGMENT ); ~DRAWSEGMENT( void ); // Read/write data diff --git a/include/wxstruct.h b/include/wxstruct.h index cd5481eb78..17bdea0811 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -501,7 +501,7 @@ public: virtual void SwitchLayer( wxDC* DC, int layer ); // divers - void AddHistory( int value, DrawStructureType type ); // Add value in data list history + void AddHistory( int value, KICAD_T type ); // Add value in data list history void InstallGridFrame( const wxPoint& pos ); }; diff --git a/pcbnew/block_module_editor.cpp b/pcbnew/block_module_editor.cpp index fb8fb35937..9537cadf5c 100644 --- a/pcbnew/block_module_editor.cpp +++ b/pcbnew/block_module_editor.cpp @@ -502,6 +502,9 @@ void MoveMarkedItems( MODULE* module, wxPoint offset ) ( (EDGE_MODULE*) item )->m_End0.x += offset.x; ( (EDGE_MODULE*) item )->m_End0.y += offset.y; break; + + default: + ; } item->m_Flags = item->m_Selected = 0; @@ -588,6 +591,9 @@ void MirrorMarkedItems( MODULE* module, wxPoint offset ) SETMIRROR( ( (TEXTE_MODULE*) item )->m_Pos.x ); ( (TEXTE_MODULE*) item )->m_Pos0.x = ( (TEXTE_MODULE*) item )->m_Pos.x; break; + + default: + ; } item->m_Flags = item->m_Selected = 0; @@ -639,6 +645,9 @@ void RotateMarkedItems( MODULE* module, wxPoint offset ) ( (TEXTE_MODULE*) item )->m_Pos0 = ( (TEXTE_MODULE*) item )->m_Pos; ( (TEXTE_MODULE*) item )->m_Orient += 900; break; + + default: + ; } item->m_Flags = item->m_Selected = 0; diff --git a/pcbnew/class_edge_mod.cpp b/pcbnew/class_edge_mod.cpp index 3ba303a47d..e8b5510c1e 100644 --- a/pcbnew/class_edge_mod.cpp +++ b/pcbnew/class_edge_mod.cpp @@ -31,6 +31,7 @@ EDGE_MODULE::EDGE_MODULE( MODULE* parent ) : BOARD_ITEM( parent, TYPEEDGEMODULE ) { + m_Width = 0; m_Shape = S_SEGMENT; m_Angle = 0; m_Width = 120; diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 3f7bde08b6..d9a948bfbe 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -22,9 +22,10 @@ /* Constructeur des classes type pistes, vias et zones */ -TRACK::TRACK( BOARD_ITEM* StructFather, DrawStructureType idtype ) : +TRACK::TRACK( BOARD_ITEM* StructFather, KICAD_T idtype ) : BOARD_ITEM( StructFather, idtype ) { + m_Width = 0; m_Shape = S_SEGMENT; start = end = NULL; m_NetCode = 0; diff --git a/pcbnew/class_track.h b/pcbnew/class_track.h index 20b499c4b4..3baf3d2ff4 100644 --- a/pcbnew/class_track.h +++ b/pcbnew/class_track.h @@ -40,7 +40,7 @@ public: int m_Param; // Auxiliary variable ( used in some computations ) public: - TRACK( BOARD_ITEM* StructFather, DrawStructureType idtype = TYPETRACK ); + TRACK( BOARD_ITEM* StructFather, KICAD_T idtype = TYPETRACK ); TRACK( const TRACK& track ); TRACK* Next() { return (TRACK*) Pnext; } diff --git a/pcbnew/classpcb.cpp b/pcbnew/classpcb.cpp index 8327880929..f9bb8cedf5 100644 --- a/pcbnew/classpcb.cpp +++ b/pcbnew/classpcb.cpp @@ -52,10 +52,10 @@ EDGE_ZONE:: ~EDGE_ZONE( void ) /**********************/ /* Classe DRAWSEGMENT: constructeur */ -DRAWSEGMENT::DRAWSEGMENT( BOARD_ITEM* StructFather, DrawStructureType idtype ) : +DRAWSEGMENT::DRAWSEGMENT( BOARD_ITEM* StructFather, KICAD_T idtype ) : BOARD_ITEM( StructFather, idtype ) { - m_Flags = m_Shape = m_Type = m_Angle = 0; + m_Width = m_Flags = m_Shape = m_Type = m_Angle = 0; } diff --git a/pcbnew/classtrc.cpp b/pcbnew/classtrc.cpp index f7142292e9..4b47c7869a 100644 --- a/pcbnew/classtrc.cpp +++ b/pcbnew/classtrc.cpp @@ -19,7 +19,7 @@ /* Constructeur des classes type pistes, vias et zones */ -TRACK::TRACK( EDA_BaseStruct* StructFather, DrawStructureType idtype ) : +TRACK::TRACK( EDA_BaseStruct* StructFather, KICAD_T idtype ) : SEGDRAW_Struct( StructFather, idtype ) { m_Shape = S_SEGMENT; diff --git a/pcbnew/dialog_track_options.cpp b/pcbnew/dialog_track_options.cpp index cca3267a1a..122bc0e23b 100644 --- a/pcbnew/dialog_track_options.cpp +++ b/pcbnew/dialog_track_options.cpp @@ -281,7 +281,7 @@ void WinEDA_PcbTracksDialog::AcceptPcbOptions(wxCommandEvent& event) /*********************************************************************/ -void WinEDA_BasePcbFrame::AddHistory(int value, DrawStructureType type) +void WinEDA_BasePcbFrame::AddHistory(int value, KICAD_T type) /**********************************************************************/ // Mise a jour des listes des dernieres epaisseurs de via et track utilisées { diff --git a/pcbnew/ratsnest.cpp b/pcbnew/ratsnest.cpp index 1f113e4fa4..1b0f0f096b 100644 --- a/pcbnew/ratsnest.cpp +++ b/pcbnew/ratsnest.cpp @@ -1254,6 +1254,9 @@ int* WinEDA_BasePcbFrame::build_ratsnest_pad( EDA_BaseStruct* ref, conn_number = track_ref->m_Sous_Netcode; break; } + + default: + ; } if( current_net_code <= 0 )