Loading change_log.txt +20 −10 Original line number Diff line number Diff line Loading @@ -5,6 +5,15 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. 2008-Feb-13 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew specctra export: now generate unique pin names from module padnames in the case where there are non-unique pad names within a module. Tested with Electra demo, and *.dsn files load OK in there as well as in freerouter. Stopped using reserved layer name "signal" and instead output a full padstack consisting of all pertinent layers for via, pads, and keepouts. 2008-Feb-12 UPDATE Tim Hanson sideskate@gmail.com ================================================================================ Loading @@ -18,7 +27,7 @@ email address. ** GetScreen is virtual, as some of the dialogs keep around a WinEDA_BaseScreen pointer. ** all sub-sheets in a given schematic must have different names to generate a meaningful netlist. ======= 2008-Feb-12 UPDATE Igor Plyatov <plyatov@mail.ru> ================================================================================ +eeschema Loading @@ -26,6 +35,7 @@ email address. +all Russian translation update. 2008-Feb-11 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew Loading pcbnew/class_board_item.cpp +48 −47 Original line number Diff line number Diff line Loading @@ -213,6 +213,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const { text << wxT( " [" ) << net->m_Netname << wxT( "]" ); } text << wxChar(' ') << _("Net:") << via->GetNet(); if( shape != VIA_THROUGH ) { Loading pcbnew/specctra.cpp +108 −46 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ namespace DSN { //-----<SPECCTRA_DB>------------------------------------------------- #if !defined(STANDALONE) void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard ) { Loading @@ -100,6 +101,7 @@ void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard ) layerIds.push_back( CONV_TO_UTF8( aBoard->GetLayerName( kilayer ) ) ); } } #endif int SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const Loading Loading @@ -183,13 +185,21 @@ void SPECCTRA_DB::needRIGHT() throw( IOError ) expecting( T_RIGHT ); } void SPECCTRA_DB::needSYMBOL() throw( IOError ) DSN_T SPECCTRA_DB::needSYMBOL() throw( IOError ) { DSN_T tok = nextTok(); if( !isSymbol( tok ) ) expecting( T_SYMBOL ); return tok; } DSN_T SPECCTRA_DB::needSYMBOLorNUMBER() throw( IOError ) { DSN_T tok = nextTok(); if( !isSymbol( tok ) && tok!=T_NUMBER ) expecting( "symbol|number" ); return tok; } void SPECCTRA_DB::readCOMPnPIN( std::string* component_id, std::string* pin_id ) throw( IOError ) { Loading Loading @@ -468,6 +478,8 @@ void SPECCTRA_DB::doPCB( PCB* growth ) throw( IOError ) void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError ) { DSN_T tok; std::string const1; std::string const2; /* <parser_descriptor >::= (parser Loading Loading @@ -519,17 +531,19 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError ) break; case T_host_version: needSYMBOL(); needSYMBOLorNUMBER(); growth->host_version = lexer->CurText(); needRIGHT(); break; case T_constant: needSYMBOL(); growth->const_id1 = lexer->CurText(); needSYMBOL(); growth->const_id2 = lexer->CurText(); needSYMBOLorNUMBER(); const1 = lexer->CurText(); needSYMBOLorNUMBER(); const2 = lexer->CurText(); needRIGHT(); growth->constants.push_back( const1 ); growth->constants.push_back( const2 ); break; case T_write_resolution: // [(writee_resolution {<character> <positive_integer >})] Loading Loading @@ -710,6 +724,8 @@ void SPECCTRA_DB::doSTRUCTURE( STRUCTURE* growth ) throw(IOError) break; case T_layer_noise_weight: if( growth->layer_noise_weight ) unexpected( tok ); growth->layer_noise_weight = new LAYER_NOISE_WEIGHT( growth ); doLAYER_NOISE_WEIGHT( growth->layer_noise_weight ); break; Loading Loading @@ -755,11 +771,15 @@ L_place: break; case T_via: if( growth->via ) unexpected( tok ); growth->via = new VIA( growth ); doVIA( growth->via ); break; case T_control: if( growth->control ) unexpected( tok ); growth->control = new CONTROL( growth ); doCONTROL( growth->control ); break; Loading @@ -772,11 +792,15 @@ L_place: break; case T_rule: if( growth->rules ) unexpected( tok ); growth->rules = new RULE( growth, T_rule ); doRULE( growth->rules ); break; case T_place_rule: if( growth->place_rules ) unexpected( tok ); growth->place_rules = new RULE( growth, T_place_rule ); doRULE( growth->place_rules ); break; Loading Loading @@ -2219,7 +2243,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError ) growth->padstack_id = lexer->CurText(); tok = nextTok(); while( (tok = nextTok()) != T_RIGHT ) { if( tok == T_LEFT ) { tok = nextTok(); Loading @@ -2230,9 +2255,9 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError ) expecting( T_NUMBER ); growth->SetRotation( strtod( lexer->CurText(), 0 ) ); needRIGHT(); tok = nextTok(); } else { if( !isSymbol(tok) && tok!=T_NUMBER ) expecting( "pin_id" ); Loading @@ -2245,9 +2270,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError ) if( nextTok() != T_NUMBER ) expecting( T_NUMBER ); growth->vertex.y = strtod( lexer->CurText(), 0 ); if( nextTok() != T_RIGHT ) unexpected( lexer->CurText() ); } } } Loading Loading @@ -2286,8 +2310,8 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError ) case T_padstack: PADSTACK* padstack; padstack = new PADSTACK( growth ); growth->padstacks.push_back( padstack ); padstack = new PADSTACK(); growth->AddPadstack( padstack ); doPADSTACK( padstack ); break; Loading @@ -2308,6 +2332,7 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError ) void SPECCTRA_DB::doNET( NET* growth ) throw( IOError ) { DSN_T tok = nextTok(); PIN_REFS* pin_refs; /* <net_descriptor >::= (net <net_id > Loading Loading @@ -2358,14 +2383,38 @@ void SPECCTRA_DB::doNET( NET* growth ) throw( IOError ) case T_pins: case T_order: growth->pins_type = tok; pin_refs = &growth->pins; goto L_pins; case T_expose: pin_refs = &growth->expose; goto L_pins; case T_noexpose: pin_refs = &growth->noexpose; goto L_pins; case T_source: pin_refs = &growth->source; goto L_pins; case T_load: pin_refs = &growth->load; goto L_pins; case T_terminator: pin_refs = &growth->terminator; //goto L_pins; L_pins: { PIN_REF empty( growth ); while( (tok = nextTok()) != T_RIGHT ) { // copy the empty one, then fill its copy later thru pin_ref. growth->pins.push_back( empty ); pin_refs->push_back( empty ); PIN_REF* pin_ref = &growth->pins.back(); PIN_REF* pin_ref = &pin_refs->back(); readCOMPnPIN( &pin_ref->component_id, &pin_ref->pin_id ); } Loading Loading @@ -3431,7 +3480,7 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote if( strlen(wrapee)==0 ) return quote_char; bool isNumber = true; // bool isNumber = true; for( ; *wrapee; ++wrapee ) { Loading @@ -3444,12 +3493,12 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote if( strchr( quoteThese, *wrapee ) ) return quote_char; if( !strchr( "01234567890.-+", *wrapee ) ) isNumber = false; // if( !strchr( "01234567890.-+", *wrapee ) ) // isNumber = false; } if( isNumber ) return quote_char; // if( isNumber ) // return quote_char; return ""; // can use an unwrapped string. } Loading Loading @@ -3670,6 +3719,11 @@ int ELEM_HOLDER::FindElem( DSN_T aType, int instanceNum ) return -1; } // a reasonably small memory price to pay for improved performance STRINGFORMATTER ELEM::sf; //-----<UNIT_RES>--------------------------------------------------------- UNIT_RES UNIT_RES::Default( NULL, T_resolution ); Loading @@ -3679,6 +3733,8 @@ UNIT_RES UNIT_RES::Default( NULL, T_resolution ); int PADSTACK::Compare( PADSTACK* lhs, PADSTACK* rhs ) { // printf( "PADSTACK::Compare( %p, %p)\n", lhs, rhs ); if( !lhs->hash.size() ) lhs->hash = lhs->makeHash(); Loading Loading @@ -3725,7 +3781,6 @@ int COMPONENT::Compare( COMPONENT* lhs, COMPONENT* rhs ) */ //-----<PARSER>----------------------------------------------------------- PARSER::PARSER( ELEM* aParent ) : ELEM( T_parser, aParent ) { Loading @@ -3752,10 +3807,17 @@ void PARSER::FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOErro out->Print( nestLevel, "(host_cad \"%s\")\n", host_cad.c_str() ); out->Print( nestLevel, "(host_version \"%s\")\n", host_version.c_str() ); if( const_id1.length()>0 || const_id2.length()>0 ) out->Print( nestLevel, "(constant %c%s%c %c%s%c)\n", string_quote, const_id1.c_str(), string_quote, string_quote, const_id2.c_str(), string_quote ); for( STRINGS::iterator i=constants.begin(); i!=constants.end(); ) { const std::string& s1 = *i++; const std::string& s2 = *i++; const char* q1 = out->GetQuoteChar( s1.c_str() ); const char* q2 = out->GetQuoteChar( s2.c_str() ); out->Print( nestLevel, "(constant %s%s%s %s%s%s)\n", q1, s1.c_str(), q1, q2, s2.c_str(), q2 ); } if( routes_include_testpoint || routes_include_guides || routes_include_image_conductor ) out->Print( nestLevel, "(routes_include%s%s%s)\n", Loading pcbnew/specctra.h +94 −19 Original line number Diff line number Diff line Loading @@ -29,6 +29,10 @@ // see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html #include <boost/ptr_container/ptr_vector.hpp> // see http://www.boost.org/libs/ptr_container/doc/ptr_set.html #include <boost/ptr_container/ptr_set.hpp> #include <boost/noncopyable.hpp> #include "fctsys.h" #include "dsn.h" Loading Loading @@ -303,14 +307,16 @@ protected: */ std::string makeHash() { STRINGFORMATTER sf; sf.Clear(); FormatContents( &sf, 0 ); sf.StripUseless(); return sf.GetString(); } // avoid creating this for every compare, make static. static STRINGFORMATTER sf; public: Loading Loading @@ -466,8 +472,8 @@ class PARSER : public ELEM bool via_rotate_first; bool generated_by_freeroute; std::string const_id1; std::string const_id2; /// This holds pairs of strings, one pair for each constant definition STRINGS constants; std::string host_cad; std::string host_version; Loading Loading @@ -1924,12 +1930,16 @@ class PIN : public ELEM std::string pin_id; POINT vertex; int kiNetCode; ///< kicad netcode public: PIN( ELEM* aParent ) : ELEM( T_pin, aParent ) { rotation = 0.0; isRotated = false; kiNetCode = 0; } void SetRotation( double aRotation ) Loading Loading @@ -1960,6 +1970,8 @@ public: vertex.x, vertex.y ); } }; typedef boost::ptr_vector<PIN> PINS; class LIBRARY; class IMAGE : public ELEM_HOLDER Loading @@ -1978,7 +1990,6 @@ class IMAGE : public ELEM_HOLDER the kids list. */ typedef boost::ptr_vector<PIN> PINS; PINS pins; RULE* rules; Loading Loading @@ -2085,7 +2096,7 @@ typedef boost::ptr_vector<IMAGE> IMAGES; * Class PADSTACK * holds either a via or a pad definition. */ class PADSTACK : public ELEM_HOLDER class PADSTACK : public ELEM_HOLDER, private boost::noncopyable { friend class SPECCTRA_DB; Loading @@ -2105,8 +2116,14 @@ class PADSTACK : public ELEM_HOLDER public: PADSTACK( ELEM* aParent ) : ELEM_HOLDER( T_padstack, aParent ) /** * Constructor PADSTACK() * cannot take ELEM* aParent because PADSTACKSET confuses this with a * copy constructor and causes havoc. Instead set parent with * LIBRARY::AddPadstack() */ PADSTACK() : ELEM_HOLDER( T_padstack, NULL ) { unit = 0; rotate = T_on; Loading @@ -2131,6 +2148,7 @@ public: */ static int Compare( PADSTACK* lhs, PADSTACK* rhs ); void SetPadstackId( const char* aPadstackId ) { padstack_id = aPadstackId; Loading Loading @@ -2194,6 +2212,15 @@ public: }; typedef boost::ptr_vector<PADSTACK> PADSTACKS; /** * Function operator<() * is used by the PADSTACKSET boost::ptr_set below */ inline bool operator<( const PADSTACK& lhs, const PADSTACK& rhs ) { return PADSTACK::Compare( (PADSTACK*) &lhs, (PADSTACK*) &rhs ) < 0; } /** * Class LIBRARY Loading Loading @@ -2228,6 +2255,7 @@ public: void AddPadstack( PADSTACK* aPadstack ) { aPadstack->SetParent( this ); padstacks.push_back( aPadstack ); } Loading Loading @@ -2537,10 +2565,15 @@ class NET : public ELEM bool unassigned; int net_number; DSN_T pins_type; ///< T_pins | T_order DSN_T pins_type; ///< T_pins | T_order, type of field 'pins' below PIN_REFS pins; PIN_REFS expose; PIN_REFS noexpose; PIN_REFS source; PIN_REFS load; PIN_REFS terminator; DSN_T type; ///< T_fix | T_normal DSN_T supply; ///< T_power | T_ground Loading Loading @@ -3525,6 +3558,9 @@ public: }; typedef boost::ptr_set<PADSTACK> PADSTACKSET; /** * Class SPECCTRA_DB * holds a DSN data tree, usually coming from a DSN file. Loading Loading @@ -3561,6 +3597,12 @@ class SPECCTRA_DB : public OUTPUTFORMATTER static const KICAD_T scanPADs[]; PADSTACKSET padstackset; /// we don't want ownership here permanently, so we don't use boost::ptr_vector std::vector<NET*> nets; /** * Function buildLayerMaps * creates a few data translation structures for layer name and number Loading Loading @@ -3612,9 +3654,20 @@ class SPECCTRA_DB : public OUTPUTFORMATTER * calls nextTok() and then verifies that the token read in * satisfies bool isSymbol(). * If not, an IOError is thrown. * @return DSN_T - the actual token read in. * @throw IOError, if the next token does not satisfy isSymbol() */ void needSYMBOL() throw( IOError ); DSN_T needSYMBOL() throw( IOError ); /** * Function needSYMBOLorNUMBER * calls nextTok() and then verifies that the token read in * satisfies bool isSymbol() or tok==T_NUMBER. * If not, an IOError is thrown. * @return DSN_T - the actual token read in. * @throw IOError, if the next token does not satisfy the above test */ DSN_T needSYMBOLorNUMBER() throw( IOError ); /** * Function readCOMPnPIN Loading Loading @@ -3718,28 +3771,35 @@ class SPECCTRA_DB : public OUTPUTFORMATTER /** * Function makeIMAGE * allocates an IMAGE on the heap and creates all the PINs according * to the PADs in the MODULE. * to the D_PADs in the MODULE. * @param aBoard The owner of the MODULE. * @param aModule The MODULE from which to build the IMAGE. * @return IMAGE* - not tested for duplication yet. */ IMAGE* makeIMAGE( MODULE* aModule ); IMAGE* makeIMAGE( BOARD* aBoard, MODULE* aModule ); /** * Function makePADSTACKs * makes all the PADSTACKs, and marks each D_PAD with the index into the * LIBRARY::padstacks list that it matches. * Function makePADSTACK * creates a PADSTACK which matches the given pad. Only pads which do not * satisfy the function isKeepout() should be passed to this function. * @param aPad The D_PAD which needs to be made into a PADSTACK. * @return PADSTACK* - The created padstack, including its padstack_id. */ void makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads ); PADSTACK* makePADSTACK( BOARD* aBoard, D_PAD* aPad ); /** * Function makeVia * makes a round through hole PADSTACK using the given Kicad diameter in deci-mils. * @param aCopperDiameter The diameter of the copper pad. * @param aDrillDiameter The drill diameter, used on re-import of the session file. * @param aTopLayer The DSN::PCB top most layer index. * @param aBotLayer The DSN::PCB bottom most layer index. * @return PADSTACK* - The padstack, which is on the heap only, user must save * or delete it. */ PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter ); PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter, int aTopLayer, int aBotLayer ); /** * Function makeVia Loading @@ -3751,6 +3811,19 @@ class SPECCTRA_DB : public OUTPUTFORMATTER PADSTACK* makeVia( const SEGVIA* aVia ); /** * Function deleteNETs * deletes all the NETs that may be in here. */ void deleteNETs() { for( unsigned n=0; n<nets.size(); ++n ) delete nets[n]; nets.clear(); } //-----<FromSESSION>----------------------------------------------------- /** Loading Loading @@ -3786,6 +3859,8 @@ public: delete pcb; delete session; deleteNETs(); if( fp ) fclose( fp ); } Loading Loading
change_log.txt +20 −10 Original line number Diff line number Diff line Loading @@ -5,6 +5,15 @@ Started 2007-June-11 Please add newer entries at the top, list the date and your name with email address. 2008-Feb-13 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew specctra export: now generate unique pin names from module padnames in the case where there are non-unique pad names within a module. Tested with Electra demo, and *.dsn files load OK in there as well as in freerouter. Stopped using reserved layer name "signal" and instead output a full padstack consisting of all pertinent layers for via, pads, and keepouts. 2008-Feb-12 UPDATE Tim Hanson sideskate@gmail.com ================================================================================ Loading @@ -18,7 +27,7 @@ email address. ** GetScreen is virtual, as some of the dialogs keep around a WinEDA_BaseScreen pointer. ** all sub-sheets in a given schematic must have different names to generate a meaningful netlist. ======= 2008-Feb-12 UPDATE Igor Plyatov <plyatov@mail.ru> ================================================================================ +eeschema Loading @@ -26,6 +35,7 @@ email address. +all Russian translation update. 2008-Feb-11 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ +pcbnew Loading
pcbnew/class_board_item.cpp +48 −47 Original line number Diff line number Diff line Loading @@ -213,6 +213,7 @@ wxString BOARD_ITEM::MenuText( const BOARD* aPcb ) const { text << wxT( " [" ) << net->m_Netname << wxT( "]" ); } text << wxChar(' ') << _("Net:") << via->GetNet(); if( shape != VIA_THROUGH ) { Loading
pcbnew/specctra.cpp +108 −46 Original line number Diff line number Diff line Loading @@ -76,6 +76,7 @@ namespace DSN { //-----<SPECCTRA_DB>------------------------------------------------- #if !defined(STANDALONE) void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard ) { Loading @@ -100,6 +101,7 @@ void SPECCTRA_DB::buildLayerMaps( BOARD* aBoard ) layerIds.push_back( CONV_TO_UTF8( aBoard->GetLayerName( kilayer ) ) ); } } #endif int SPECCTRA_DB::findLayerName( const std::string& aLayerName ) const Loading Loading @@ -183,13 +185,21 @@ void SPECCTRA_DB::needRIGHT() throw( IOError ) expecting( T_RIGHT ); } void SPECCTRA_DB::needSYMBOL() throw( IOError ) DSN_T SPECCTRA_DB::needSYMBOL() throw( IOError ) { DSN_T tok = nextTok(); if( !isSymbol( tok ) ) expecting( T_SYMBOL ); return tok; } DSN_T SPECCTRA_DB::needSYMBOLorNUMBER() throw( IOError ) { DSN_T tok = nextTok(); if( !isSymbol( tok ) && tok!=T_NUMBER ) expecting( "symbol|number" ); return tok; } void SPECCTRA_DB::readCOMPnPIN( std::string* component_id, std::string* pin_id ) throw( IOError ) { Loading Loading @@ -468,6 +478,8 @@ void SPECCTRA_DB::doPCB( PCB* growth ) throw( IOError ) void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError ) { DSN_T tok; std::string const1; std::string const2; /* <parser_descriptor >::= (parser Loading Loading @@ -519,17 +531,19 @@ void SPECCTRA_DB::doPARSER( PARSER* growth ) throw( IOError ) break; case T_host_version: needSYMBOL(); needSYMBOLorNUMBER(); growth->host_version = lexer->CurText(); needRIGHT(); break; case T_constant: needSYMBOL(); growth->const_id1 = lexer->CurText(); needSYMBOL(); growth->const_id2 = lexer->CurText(); needSYMBOLorNUMBER(); const1 = lexer->CurText(); needSYMBOLorNUMBER(); const2 = lexer->CurText(); needRIGHT(); growth->constants.push_back( const1 ); growth->constants.push_back( const2 ); break; case T_write_resolution: // [(writee_resolution {<character> <positive_integer >})] Loading Loading @@ -710,6 +724,8 @@ void SPECCTRA_DB::doSTRUCTURE( STRUCTURE* growth ) throw(IOError) break; case T_layer_noise_weight: if( growth->layer_noise_weight ) unexpected( tok ); growth->layer_noise_weight = new LAYER_NOISE_WEIGHT( growth ); doLAYER_NOISE_WEIGHT( growth->layer_noise_weight ); break; Loading Loading @@ -755,11 +771,15 @@ L_place: break; case T_via: if( growth->via ) unexpected( tok ); growth->via = new VIA( growth ); doVIA( growth->via ); break; case T_control: if( growth->control ) unexpected( tok ); growth->control = new CONTROL( growth ); doCONTROL( growth->control ); break; Loading @@ -772,11 +792,15 @@ L_place: break; case T_rule: if( growth->rules ) unexpected( tok ); growth->rules = new RULE( growth, T_rule ); doRULE( growth->rules ); break; case T_place_rule: if( growth->place_rules ) unexpected( tok ); growth->place_rules = new RULE( growth, T_place_rule ); doRULE( growth->place_rules ); break; Loading Loading @@ -2219,7 +2243,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError ) growth->padstack_id = lexer->CurText(); tok = nextTok(); while( (tok = nextTok()) != T_RIGHT ) { if( tok == T_LEFT ) { tok = nextTok(); Loading @@ -2230,9 +2255,9 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError ) expecting( T_NUMBER ); growth->SetRotation( strtod( lexer->CurText(), 0 ) ); needRIGHT(); tok = nextTok(); } else { if( !isSymbol(tok) && tok!=T_NUMBER ) expecting( "pin_id" ); Loading @@ -2245,9 +2270,8 @@ void SPECCTRA_DB::doPIN( PIN* growth ) throw( IOError ) if( nextTok() != T_NUMBER ) expecting( T_NUMBER ); growth->vertex.y = strtod( lexer->CurText(), 0 ); if( nextTok() != T_RIGHT ) unexpected( lexer->CurText() ); } } } Loading Loading @@ -2286,8 +2310,8 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError ) case T_padstack: PADSTACK* padstack; padstack = new PADSTACK( growth ); growth->padstacks.push_back( padstack ); padstack = new PADSTACK(); growth->AddPadstack( padstack ); doPADSTACK( padstack ); break; Loading @@ -2308,6 +2332,7 @@ void SPECCTRA_DB::doLIBRARY( LIBRARY* growth ) throw( IOError ) void SPECCTRA_DB::doNET( NET* growth ) throw( IOError ) { DSN_T tok = nextTok(); PIN_REFS* pin_refs; /* <net_descriptor >::= (net <net_id > Loading Loading @@ -2358,14 +2383,38 @@ void SPECCTRA_DB::doNET( NET* growth ) throw( IOError ) case T_pins: case T_order: growth->pins_type = tok; pin_refs = &growth->pins; goto L_pins; case T_expose: pin_refs = &growth->expose; goto L_pins; case T_noexpose: pin_refs = &growth->noexpose; goto L_pins; case T_source: pin_refs = &growth->source; goto L_pins; case T_load: pin_refs = &growth->load; goto L_pins; case T_terminator: pin_refs = &growth->terminator; //goto L_pins; L_pins: { PIN_REF empty( growth ); while( (tok = nextTok()) != T_RIGHT ) { // copy the empty one, then fill its copy later thru pin_ref. growth->pins.push_back( empty ); pin_refs->push_back( empty ); PIN_REF* pin_ref = &growth->pins.back(); PIN_REF* pin_ref = &pin_refs->back(); readCOMPnPIN( &pin_ref->component_id, &pin_ref->pin_id ); } Loading Loading @@ -3431,7 +3480,7 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote if( strlen(wrapee)==0 ) return quote_char; bool isNumber = true; // bool isNumber = true; for( ; *wrapee; ++wrapee ) { Loading @@ -3444,12 +3493,12 @@ const char* OUTPUTFORMATTER::GetQuoteChar( const char* wrapee, const char* quote if( strchr( quoteThese, *wrapee ) ) return quote_char; if( !strchr( "01234567890.-+", *wrapee ) ) isNumber = false; // if( !strchr( "01234567890.-+", *wrapee ) ) // isNumber = false; } if( isNumber ) return quote_char; // if( isNumber ) // return quote_char; return ""; // can use an unwrapped string. } Loading Loading @@ -3670,6 +3719,11 @@ int ELEM_HOLDER::FindElem( DSN_T aType, int instanceNum ) return -1; } // a reasonably small memory price to pay for improved performance STRINGFORMATTER ELEM::sf; //-----<UNIT_RES>--------------------------------------------------------- UNIT_RES UNIT_RES::Default( NULL, T_resolution ); Loading @@ -3679,6 +3733,8 @@ UNIT_RES UNIT_RES::Default( NULL, T_resolution ); int PADSTACK::Compare( PADSTACK* lhs, PADSTACK* rhs ) { // printf( "PADSTACK::Compare( %p, %p)\n", lhs, rhs ); if( !lhs->hash.size() ) lhs->hash = lhs->makeHash(); Loading Loading @@ -3725,7 +3781,6 @@ int COMPONENT::Compare( COMPONENT* lhs, COMPONENT* rhs ) */ //-----<PARSER>----------------------------------------------------------- PARSER::PARSER( ELEM* aParent ) : ELEM( T_parser, aParent ) { Loading @@ -3752,10 +3807,17 @@ void PARSER::FormatContents( OUTPUTFORMATTER* out, int nestLevel ) throw( IOErro out->Print( nestLevel, "(host_cad \"%s\")\n", host_cad.c_str() ); out->Print( nestLevel, "(host_version \"%s\")\n", host_version.c_str() ); if( const_id1.length()>0 || const_id2.length()>0 ) out->Print( nestLevel, "(constant %c%s%c %c%s%c)\n", string_quote, const_id1.c_str(), string_quote, string_quote, const_id2.c_str(), string_quote ); for( STRINGS::iterator i=constants.begin(); i!=constants.end(); ) { const std::string& s1 = *i++; const std::string& s2 = *i++; const char* q1 = out->GetQuoteChar( s1.c_str() ); const char* q2 = out->GetQuoteChar( s2.c_str() ); out->Print( nestLevel, "(constant %s%s%s %s%s%s)\n", q1, s1.c_str(), q1, q2, s2.c_str(), q2 ); } if( routes_include_testpoint || routes_include_guides || routes_include_image_conductor ) out->Print( nestLevel, "(routes_include%s%s%s)\n", Loading
pcbnew/specctra.h +94 −19 Original line number Diff line number Diff line Loading @@ -29,6 +29,10 @@ // see http://www.boost.org/libs/ptr_container/doc/ptr_sequence_adapter.html #include <boost/ptr_container/ptr_vector.hpp> // see http://www.boost.org/libs/ptr_container/doc/ptr_set.html #include <boost/ptr_container/ptr_set.hpp> #include <boost/noncopyable.hpp> #include "fctsys.h" #include "dsn.h" Loading Loading @@ -303,14 +307,16 @@ protected: */ std::string makeHash() { STRINGFORMATTER sf; sf.Clear(); FormatContents( &sf, 0 ); sf.StripUseless(); return sf.GetString(); } // avoid creating this for every compare, make static. static STRINGFORMATTER sf; public: Loading Loading @@ -466,8 +472,8 @@ class PARSER : public ELEM bool via_rotate_first; bool generated_by_freeroute; std::string const_id1; std::string const_id2; /// This holds pairs of strings, one pair for each constant definition STRINGS constants; std::string host_cad; std::string host_version; Loading Loading @@ -1924,12 +1930,16 @@ class PIN : public ELEM std::string pin_id; POINT vertex; int kiNetCode; ///< kicad netcode public: PIN( ELEM* aParent ) : ELEM( T_pin, aParent ) { rotation = 0.0; isRotated = false; kiNetCode = 0; } void SetRotation( double aRotation ) Loading Loading @@ -1960,6 +1970,8 @@ public: vertex.x, vertex.y ); } }; typedef boost::ptr_vector<PIN> PINS; class LIBRARY; class IMAGE : public ELEM_HOLDER Loading @@ -1978,7 +1990,6 @@ class IMAGE : public ELEM_HOLDER the kids list. */ typedef boost::ptr_vector<PIN> PINS; PINS pins; RULE* rules; Loading Loading @@ -2085,7 +2096,7 @@ typedef boost::ptr_vector<IMAGE> IMAGES; * Class PADSTACK * holds either a via or a pad definition. */ class PADSTACK : public ELEM_HOLDER class PADSTACK : public ELEM_HOLDER, private boost::noncopyable { friend class SPECCTRA_DB; Loading @@ -2105,8 +2116,14 @@ class PADSTACK : public ELEM_HOLDER public: PADSTACK( ELEM* aParent ) : ELEM_HOLDER( T_padstack, aParent ) /** * Constructor PADSTACK() * cannot take ELEM* aParent because PADSTACKSET confuses this with a * copy constructor and causes havoc. Instead set parent with * LIBRARY::AddPadstack() */ PADSTACK() : ELEM_HOLDER( T_padstack, NULL ) { unit = 0; rotate = T_on; Loading @@ -2131,6 +2148,7 @@ public: */ static int Compare( PADSTACK* lhs, PADSTACK* rhs ); void SetPadstackId( const char* aPadstackId ) { padstack_id = aPadstackId; Loading Loading @@ -2194,6 +2212,15 @@ public: }; typedef boost::ptr_vector<PADSTACK> PADSTACKS; /** * Function operator<() * is used by the PADSTACKSET boost::ptr_set below */ inline bool operator<( const PADSTACK& lhs, const PADSTACK& rhs ) { return PADSTACK::Compare( (PADSTACK*) &lhs, (PADSTACK*) &rhs ) < 0; } /** * Class LIBRARY Loading Loading @@ -2228,6 +2255,7 @@ public: void AddPadstack( PADSTACK* aPadstack ) { aPadstack->SetParent( this ); padstacks.push_back( aPadstack ); } Loading Loading @@ -2537,10 +2565,15 @@ class NET : public ELEM bool unassigned; int net_number; DSN_T pins_type; ///< T_pins | T_order DSN_T pins_type; ///< T_pins | T_order, type of field 'pins' below PIN_REFS pins; PIN_REFS expose; PIN_REFS noexpose; PIN_REFS source; PIN_REFS load; PIN_REFS terminator; DSN_T type; ///< T_fix | T_normal DSN_T supply; ///< T_power | T_ground Loading Loading @@ -3525,6 +3558,9 @@ public: }; typedef boost::ptr_set<PADSTACK> PADSTACKSET; /** * Class SPECCTRA_DB * holds a DSN data tree, usually coming from a DSN file. Loading Loading @@ -3561,6 +3597,12 @@ class SPECCTRA_DB : public OUTPUTFORMATTER static const KICAD_T scanPADs[]; PADSTACKSET padstackset; /// we don't want ownership here permanently, so we don't use boost::ptr_vector std::vector<NET*> nets; /** * Function buildLayerMaps * creates a few data translation structures for layer name and number Loading Loading @@ -3612,9 +3654,20 @@ class SPECCTRA_DB : public OUTPUTFORMATTER * calls nextTok() and then verifies that the token read in * satisfies bool isSymbol(). * If not, an IOError is thrown. * @return DSN_T - the actual token read in. * @throw IOError, if the next token does not satisfy isSymbol() */ void needSYMBOL() throw( IOError ); DSN_T needSYMBOL() throw( IOError ); /** * Function needSYMBOLorNUMBER * calls nextTok() and then verifies that the token read in * satisfies bool isSymbol() or tok==T_NUMBER. * If not, an IOError is thrown. * @return DSN_T - the actual token read in. * @throw IOError, if the next token does not satisfy the above test */ DSN_T needSYMBOLorNUMBER() throw( IOError ); /** * Function readCOMPnPIN Loading Loading @@ -3718,28 +3771,35 @@ class SPECCTRA_DB : public OUTPUTFORMATTER /** * Function makeIMAGE * allocates an IMAGE on the heap and creates all the PINs according * to the PADs in the MODULE. * to the D_PADs in the MODULE. * @param aBoard The owner of the MODULE. * @param aModule The MODULE from which to build the IMAGE. * @return IMAGE* - not tested for duplication yet. */ IMAGE* makeIMAGE( MODULE* aModule ); IMAGE* makeIMAGE( BOARD* aBoard, MODULE* aModule ); /** * Function makePADSTACKs * makes all the PADSTACKs, and marks each D_PAD with the index into the * LIBRARY::padstacks list that it matches. * Function makePADSTACK * creates a PADSTACK which matches the given pad. Only pads which do not * satisfy the function isKeepout() should be passed to this function. * @param aPad The D_PAD which needs to be made into a PADSTACK. * @return PADSTACK* - The created padstack, including its padstack_id. */ void makePADSTACKs( BOARD* aBoard, TYPE_COLLECTOR& aPads ); PADSTACK* makePADSTACK( BOARD* aBoard, D_PAD* aPad ); /** * Function makeVia * makes a round through hole PADSTACK using the given Kicad diameter in deci-mils. * @param aCopperDiameter The diameter of the copper pad. * @param aDrillDiameter The drill diameter, used on re-import of the session file. * @param aTopLayer The DSN::PCB top most layer index. * @param aBotLayer The DSN::PCB bottom most layer index. * @return PADSTACK* - The padstack, which is on the heap only, user must save * or delete it. */ PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter ); PADSTACK* makeVia( int aCopperDiameter, int aDrillDiameter, int aTopLayer, int aBotLayer ); /** * Function makeVia Loading @@ -3751,6 +3811,19 @@ class SPECCTRA_DB : public OUTPUTFORMATTER PADSTACK* makeVia( const SEGVIA* aVia ); /** * Function deleteNETs * deletes all the NETs that may be in here. */ void deleteNETs() { for( unsigned n=0; n<nets.size(); ++n ) delete nets[n]; nets.clear(); } //-----<FromSESSION>----------------------------------------------------- /** Loading Loading @@ -3786,6 +3859,8 @@ public: delete pcb; delete session; deleteNETs(); if( fp ) fclose( fp ); } Loading