diff --git a/qilib/parsers/Flex_Bison_FIles/lispLike.l b/qilib/parsers/Flex_Bison_FIles/lispLike.l --- a/qilib/parsers/Flex_Bison_FIles/lispLike.l +++ b/qilib/parsers/Flex_Bison_FIles/lispLike.l @@ -38,7 +38,7 @@ typedef QIlib::lispLike_Parser::token to return( token::VALUE ); } -\([a-zA-Z0-9]+ { +\([a-zA-Z0-9\_]+ { yylval->sval = STOKEN( yytext ); return( token::NODE ); } diff --git a/qilib/parsers/LispLikeLexique.ods b/qilib/parsers/LispLikeLexique.ods new file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..378d6e50226ec979814b04a11e73a0a99392a3ad GIT binary patch literal 47476 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 diff --git a/qilib/parsers/lispLike_driver.cpp b/qilib/parsers/lispLike_driver.cpp --- a/qilib/parsers/lispLike_driver.cpp +++ b/qilib/parsers/lispLike_driver.cpp @@ -23,6 +23,54 @@ #include "lispLike_driver.h" #include + +QIlib::QIcadAbstractNodeWrapper::QIcadAbstractNodeWrapper(AbstractNode *node) +{ + this->p_node = node; +} + +QIlib::QIcadAbstractNodeWrapper::~QIcadAbstractNodeWrapper() +{ + /*First delete all the childs*/ + for(int i=0;ichilds.count();i++) + { + if(this->childs.at(i)) + delete this->childs.at(i); + } +} + +QString QIlib::QIcadAbstractNodeWrapper::value() +{ + if((p_node->Values.count()>0) && p_node) + return p_node->Values.at(0); + return QString(""); +} + +QString QIlib::QIcadAbstractNodeWrapper::value(int index) +{ + if((p_node->Values.count()>index) && p_node) + return p_node->Values.at(index); + return QString(""); +} + +QString QIlib::QIcadAbstractNodeWrapper::catValues() +{ + if(p_node) + { + QString result(""); + for(int i=0;iValues.count();i++) + { + result.append(p_node->Values.at(i)); + } + return result; + } +} + +void QIlib::QIcadAbstractNodeWrapper::setNode(QIlib::AbstractNode *node) +{ + this->p_node = node; +} + QIlib::lispLike_Driver::lispLike_Driver() :parser( NULL ),scanner( NULL ) { diff --git a/qilib/parsers/lispLike_driver.h b/qilib/parsers/lispLike_driver.h --- a/qilib/parsers/lispLike_driver.h +++ b/qilib/parsers/lispLike_driver.h @@ -46,6 +46,22 @@ public: QIlib::AbstractNode* parent; }; +class QIcadAbstractNodeWrapper +{ +public: + QIcadAbstractNodeWrapper(QIlib::AbstractNode* node); + QIcadAbstractNodeWrapper(){} + ~QIcadAbstractNodeWrapper(); + QString value(); + QString value(int index); + QString catValues(); + QList childs; + QIcadAbstractNodeWrapper* parent; + virtual void setNode(QIlib::AbstractNode* node); + + QIlib::AbstractNode* p_node; +}; + class lispLike_Driver { public: diff --git a/qilib/qicadlisplikelexique.cpp b/qilib/qicadlisplikelexique.cpp new file mode 100644 --- /dev/null +++ b/qilib/qicadlisplikelexique.cpp @@ -0,0 +1,147 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2014, Plasma Physics Laboratory - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +/*-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +----------------------------------------------------------------------------*/ +const char* add_net_c = "(add_net"; +const char* area_c = "(area"; +const char* at_c = "(at"; +const char* attr_c = "(attr"; +const char* center_c = "(center"; +const char* clearance_c = "(clearance"; +const char* code_c = "(code"; +const char* component_c = "(component"; +const char* components_c = "(components"; +const char* date_c = "(date"; +const char* design_c = "(design"; +const char* drawings_c = "(drawings"; +const char* drillshape_c = "(drillshape"; +const char* edge_width_c = "(edge_width"; +const char* effects_c = "(effects"; +const char* end_c = "(end"; +const char* excludeedgelayer_c = "(excludeedgelayer"; +const char* export_c = "(export"; +const char* field_c = "(field"; +const char* fields_c = "(fields"; +const char* font_c = "(font"; +const char* fp_circle_c = "(fp_circle"; +const char* fp_line_c = "(fp_line"; +const char* fp_text_c = "(fp_text"; +const char* general_c = "(general"; +const char* host_c = "(host"; +const char* hpglpendiameter_c = "(hpglpendiameter"; +const char* hpglpennumber_c = "(hpglpennumber"; +const char* hpglpenoverlay_c = "(hpglpenoverlay"; +const char* hpglpenspeed_c = "(hpglpenspeed"; +const char* last_trace_width_c = "(last_trace_width"; +const char* layers_c = "(layers"; +const char* layerselection_c = "(layerselection"; +const char* lib_c = "(lib"; +const char* libpart_c = "(libpart"; +const char* libparts_c = "(libparts"; +const char* libraries_c = "(libraries"; +const char* library_c = "(library"; +const char* libsource_c = "(libsource"; +const char* linewidth_c = "(linewidth"; +const char* links_c = "(links"; +const char* logical_c = "(logical"; +const char* mirror_c = "(mirror"; +const char* mod_edge_width_c = "(mod_edge_width"; +const char* mod_text_size_c = "(mod_text_size"; +const char* mode_c = "(mode"; +const char* model_c = "(model"; +const char* module_c = "(module"; +const char* modules_c = "(modules"; +const char* name_c = "(name"; +const char* names_c = "(names"; +const char* net_c = "(net"; +const char* net_class_c = "(net_class"; +const char* nets_c = "(nets"; +const char* no_connect_c = "(no_connect"; +const char* node_c = "(node"; +const char* num_c = "(num"; +const char* outputdirectory_c = "(outputdirectory"; +const char* outputformat_c = "(outputformat"; +const char* pad_c = "(pad"; +const char* pad_drill_c = "(pad_drill"; +const char* pad_size_c = "(pad_size"; +const char* pad_to_mask_clearance_c = "(pad_to_mask_clearance"; +const char* padsonsilk_c = "(padsonsilk"; +const char* page_c = "(page"; +const char* part_c = "(part"; +const char* path_c = "(path"; +const char* pcb_text_size_c = "(pcb_text_size"; +const char* pcb_text_width_c = "(pcb_text_width"; +const char* pcbplotparams_c = "(pcbplotparams"; +const char* pin_c = "(pin"; +const char* pins_c = "(pins"; +const char* plotframeref_c = "(plotframeref"; +const char* plotinvisibletext_c = "(plotinvisibletext"; +const char* plotothertext_c = "(plotothertext"; +const char* plotreference_c = "(plotreference"; +const char* plotvalue_c = "(plotvalue"; +const char* psa4output_c = "(psa4output"; +const char* psnegative_c = "(psnegative"; +const char* ref_c = "(ref"; +const char* rotate = "(rota"; +const char* scale_c = "(scale"; +const char* scaleselection_c = "(scaleselection"; +const char* segment_width_c = "(segment_width"; +const char* setup_c = "(setup"; +const char* sheetpath_c = "(sheetpath"; +const char* source_c = "(source"; +const char* start_c = "(start"; +const char* subtractmaskfromsilk_c = "(subtractmaskfromsilk"; +const char* tags_c = "(tags"; +const char* tedit_c = "(tedit"; +const char* thickness_c = "(thickness"; +const char* tool_c = "(tool"; +const char* trace_clearance_c = "(trace_clearance"; +const char* trace_min_c = "(trace_min"; +const char* trace_width_c = "(trace_width"; +const char* tracks_c = "(tracks"; +const char* tstamp_c = "(tstamp"; +const char* tstamps_c = "(tstamps"; +const char* type_c = "(type"; +const char* uri_c = "(uri"; +const char* useauxorigin_c = "(useauxorigin"; +const char* usegerberextensions_c = "(usegerberextensions"; +const char* uvia_dia_c = "(uvia_dia"; +const char* uvia_drill_c = "(uvia_drill"; +const char* uvia_min_drill_c = "(uvia_min_drill"; +const char* uvia_min_size_c = "(uvia_min_size"; +const char* uvia_size_c = "(uvia_size"; +const char* uvias_allowed_c = "(uvias_allowed"; +const char* value_c = "(value"; +const char* version_c = "(version"; +const char* via_dia_c = "(via_dia"; +const char* via_drill_c = "(via_drill"; +const char* via_min_drill_c = "(via_min_drill"; +const char* via_min_size_c = "(via_min_size"; +const char* via_size_c = "(via_size"; +const char* viasonmask_c = "(viasonmask"; +const char* visible_elements_c = "(visible_elements"; +const char* width_c = "(width"; +const char* xyz = "(x"; +const char* zone_45_only_c = "(zone_45_only"; +const char* zone_clearance_c = "(zone_clearance"; +const char* zones_c = "(zones"; + + + diff --git a/qilib/qicadlisplikelexique.h b/qilib/qicadlisplikelexique.h new file mode 100644 --- /dev/null +++ b/qilib/qicadlisplikelexique.h @@ -0,0 +1,158 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2014, Plasma Physics Laboratory - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +/*-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +----------------------------------------------------------------------------*/ +/* + * Have a look to LispLikeLexique.ods +*/ +#ifndef LEXIQUE_H +#define LEXIQUE_H + +namespace QIlib{ + +namespace Lexique +{ +extern "C" const char* add_net_c; +extern "C" const char* area_c; +extern "C" const char* at_c; +extern "C" const char* attr_c; +extern "C" const char* center_c; +extern "C" const char* clearance_c; +extern "C" const char* code_c; +extern "C" const char* component_c; +extern "C" const char* components_c; +extern "C" const char* date_c; +extern "C" const char* design_c; +extern "C" const char* drawings_c; +extern "C" const char* drillshape_c; +extern "C" const char* edge_width_c; +extern "C" const char* effects_c; +extern "C" const char* end_c; +extern "C" const char* excludeedgelayer_c; +extern "C" const char* export_c; +extern "C" const char* field_c; +extern "C" const char* fields_c; +extern "C" const char* font_c; +extern "C" const char* fp_circle_c; +extern "C" const char* fp_line_c; +extern "C" const char* fp_text_c; +extern "C" const char* general_c; +extern "C" const char* host_c; +extern "C" const char* hpglpendiameter_c; +extern "C" const char* hpglpennumber_c; +extern "C" const char* hpglpenoverlay_c; +extern "C" const char* hpglpenspeed_c; +extern "C" const char* last_trace_width_c; +extern "C" const char* layers_c; +extern "C" const char* layerselection_c; +extern "C" const char* lib_c; +extern "C" const char* libpart_c; +extern "C" const char* libparts_c; +extern "C" const char* libraries_c; +extern "C" const char* library_c; +extern "C" const char* libsource_c; +extern "C" const char* linewidth_c; +extern "C" const char* links_c; +extern "C" const char* logical_c; +extern "C" const char* mirror_c; +extern "C" const char* mod_edge_width_c; +extern "C" const char* mod_text_size_c; +extern "C" const char* mode_c; +extern "C" const char* model_c; +extern "C" const char* module_c; +extern "C" const char* modules_c; +extern "C" const char* name_c; +extern "C" const char* names_c; +extern "C" const char* net_c; +extern "C" const char* net_class_c; +extern "C" const char* nets_c; +extern "C" const char* no_connect_c; +extern "C" const char* node_c; +extern "C" const char* num_c; +extern "C" const char* outputdirectory_c; +extern "C" const char* outputformat_c; +extern "C" const char* pad_c; +extern "C" const char* pad_drill_c; +extern "C" const char* pad_size_c; +extern "C" const char* pad_to_mask_clearance_c; +extern "C" const char* padsonsilk_c; +extern "C" const char* page_c; +extern "C" const char* part_c; +extern "C" const char* path_c; +extern "C" const char* pcb_text_size_c; +extern "C" const char* pcb_text_width_c; +extern "C" const char* pcbplotparams_c; +extern "C" const char* pin_c; +extern "C" const char* pins_c; +extern "C" const char* plotframeref_c; +extern "C" const char* plotinvisibletext_c; +extern "C" const char* plotothertext_c; +extern "C" const char* plotreference_c; +extern "C" const char* plotvalue_c; +extern "C" const char* psa4output_c; +extern "C" const char* psnegative_c; +extern "C" const char* ref_c; +extern "C" const char* rotate; +extern "C" const char* scale_c; +extern "C" const char* scaleselection_c; +extern "C" const char* segment_width_c; +extern "C" const char* setup_c; +extern "C" const char* sheetpath_c; +extern "C" const char* source_c; +extern "C" const char* start_c; +extern "C" const char* subtractmaskfromsilk_c; +extern "C" const char* tags_c; +extern "C" const char* tedit_c; +extern "C" const char* thickness_c; +extern "C" const char* tool_c; +extern "C" const char* trace_clearance_c; +extern "C" const char* trace_min_c; +extern "C" const char* trace_width_c; +extern "C" const char* tracks_c; +extern "C" const char* tstamp_c; +extern "C" const char* tstamps_c; +extern "C" const char* type_c; +extern "C" const char* uri_c; +extern "C" const char* useauxorigin_c; +extern "C" const char* usegerberextensions_c; +extern "C" const char* uvia_dia_c; +extern "C" const char* uvia_drill_c; +extern "C" const char* uvia_min_drill_c; +extern "C" const char* uvia_min_size_c; +extern "C" const char* uvia_size_c; +extern "C" const char* uvias_allowed_c; +extern "C" const char* value_c; +extern "C" const char* version_c; +extern "C" const char* via_dia_c; +extern "C" const char* via_drill_c; +extern "C" const char* via_min_drill_c; +extern "C" const char* via_min_size_c; +extern "C" const char* via_size_c; +extern "C" const char* viasonmask_c; +extern "C" const char* visible_elements_c; +extern "C" const char* width_c; +extern "C" const char* xyz; +extern "C" const char* zone_45_only_c; +extern "C" const char* zone_clearance_c; +extern "C" const char* zones_c; +} +} + +#endif // LEXIQUE_H diff --git a/qilib/qicadnet.cpp b/qilib/qicadnet.cpp deleted file mode 100644 --- a/qilib/qicadnet.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the Kicad Tools Software --- Copyright (C) 2014, Plasma Physics Laboratory - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ -/*-- Author : Alexis Jeandet --- Mail : alexis.jeandet@member.fsf.org -----------------------------------------------------------------------------*/ -#include "qicadnet.h" - -QIlib::QIcadNet::QIcadNet() -{ -} - -QIlib::QIcadNet::~QIcadNet() -{ - -} - - -QIlib::QIcadNetNode::QIcadNetNode(QString ref, QString node) -{ - this->p_ref = ref; - this->p_node = node; -} diff --git a/qilib/qicadnet.h b/qilib/qicadnet.h deleted file mode 100644 --- a/qilib/qicadnet.h +++ /dev/null @@ -1,52 +0,0 @@ -/*------------------------------------------------------------------------------ --- This file is a part of the Kicad Tools Software --- Copyright (C) 2014, Plasma Physics Laboratory - CNRS --- --- This program is free software; you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation; either version 2 of the License, or --- (at your option) any later version. --- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. --- --- You should have received a copy of the GNU General Public License --- along with this program; if not, write to the Free Software --- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------------------*/ -/*-- Author : Alexis Jeandet --- Mail : alexis.jeandet@member.fsf.org -----------------------------------------------------------------------------*/ -#ifndef QINET_H -#define QINET_H -#include -#include - -namespace QIlib{ -class QIcadNetNode -{ -public: - QIcadNetNode(QString ref,QString node); - QString ref(){return this->p_ref;} - QString node(){return this->p_node;} -private: - QString p_ref; - QString p_node; -}; - -class QIcadNet -{ -public: - QIcadNet(); - ~QIcadNet(); - int code(); - QString name(); -private: - int p_code; - QString p_name; - QList p_nodes; -}; -} -#endif // QINET_H diff --git a/qilib/qicadnetlist.cpp b/qilib/qicadnetlist.cpp --- a/qilib/qicadnetlist.cpp +++ b/qilib/qicadnetlist.cpp @@ -23,41 +23,6 @@ #include -const char* root_c ="(export"; -const char* version_c ="(version"; -const char* design_c ="(design"; -const char* source_c ="(source"; -const char* date_c ="(date"; -const char* tool_c ="(tool"; -const char* components_c ="(components"; -const char* component_c ="(comp"; -const char* ref_c ="(ref"; -const char* value_c ="(value"; -const char* libsource_c ="(libsource"; -const char* lib_c ="(lib"; -const char* part_c ="(part"; -const char* sheetpath_c ="(sheetpath"; -const char* names_c ="(names"; -const char* tstamps_c ="(tstamps"; -const char* tstamp_c ="(tstamp"; -const char* libparts_c ="(libparts"; -const char* libpart_c ="(libpart"; -const char* fields_c ="(fields"; -const char* field_c ="(field"; -const char* name_c ="(name"; -const char* pins_c ="(pins"; -const char* pin_c ="(pin"; -const char* num_c ="(num"; -const char* type_c ="(type"; -const char* libraries_c ="(libraries"; -const char* library_c ="(library"; -const char* logical_c ="(logical"; -const char* uri_c ="(uri"; -const char* nets_c ="(nets"; -const char* net_c ="(net"; -const char* code_c ="(code"; -const char* node_c ="(node"; - QIlib::QIcadNetList::QIcadNetList() :netlistRoot(NULL) @@ -113,7 +78,7 @@ void QIlib::QIcadNetList::updateConcrete { if(this->rootNode.nodes.count()) { - if(this->rootNode.nodes.at(0)->name==QIlib::Lexique::root_c) + if(this->rootNode.nodes.at(0)->name==QIlib::Lexique::export_c) { if(this->netlistRoot==NULL) { @@ -125,52 +90,6 @@ void QIlib::QIcadNetList::updateConcrete -QIlib::QIcadAbstractNodeWrapper::QIcadAbstractNodeWrapper(AbstractNode *node) -{ - this->p_node = node; -} - -QIlib::QIcadAbstractNodeWrapper::~QIcadAbstractNodeWrapper() -{ - /*First delete all the childs*/ - for(int i=0;ichilds.count();i++) - { - if(this->childs.at(i)) - delete this->childs.at(i); - } -} - -QString QIlib::QIcadAbstractNodeWrapper::value() -{ - if((p_node->Values.count()>0) && p_node) - return p_node->Values.at(0); - return QString(""); -} - -QString QIlib::QIcadAbstractNodeWrapper::value(int index) -{ - if((p_node->Values.count()>index) && p_node) - return p_node->Values.at(index); - return QString(""); -} - -QString QIlib::QIcadAbstractNodeWrapper::catValues() -{ - if(p_node) - { - QString result(""); - for(int i=0;iValues.count();i++) - { - result.append(p_node->Values.at(i)); - } - return result; - } -} - -void QIlib::QIcadAbstractNodeWrapper::setNode(QIlib::AbstractNode *node) -{ - this->p_node = node; -} @@ -183,7 +102,7 @@ QIlib::QIcadNetListRoot::QIcadNetListRoo void QIlib::QIcadNetListRoot::setNode(QIlib::AbstractNode *node) { this->p_node = node; - if(node->name==QIlib::Lexique::root_c) + if(node->name==QIlib::Lexique::export_c) { for(int i=0;inodes.count();i++) { diff --git a/qilib/qicadnetlist.h b/qilib/qicadnetlist.h --- a/qilib/qicadnetlist.h +++ b/qilib/qicadnetlist.h @@ -1,7 +1,3 @@ -#ifndef QICADNETLIST_H -#define QICADNETLIST_H -#include -#include /*------------------------------------------------------------------------------ -- This file is a part of the Kicad Tools Software -- Copyright (C) 2014, Plasma Physics Laboratory - CNRS @@ -23,69 +19,18 @@ /*-- Author : Alexis Jeandet -- Mail : alexis.jeandet@member.fsf.org ----------------------------------------------------------------------------*/ +#ifndef QICADNETLIST_H +#define QICADNETLIST_H +#include +#include #include #include #include -#include +#include namespace QIlib{ -namespace Lexique -{ -extern "C" const char* root_c ; -extern "C" const char* version_c ; -extern "C" const char* design_c ; -extern "C" const char* source_c ; -extern "C" const char* date_c ; -extern "C" const char* tool_c ; -extern "C" const char* components_c ; -extern "C" const char* component_c ; -extern "C" const char* ref_c ; -extern "C" const char* value_c ; -extern "C" const char* libsource_c ; -extern "C" const char* lib_c ; -extern "C" const char* part_c ; -extern "C" const char* sheetpath_c ; -extern "C" const char* names_c ; -extern "C" const char* tstamps_c ; -extern "C" const char* tstamp_c ; -extern "C" const char* libparts_c ; -extern "C" const char* libpart_c ; -extern "C" const char* fields_c ; -extern "C" const char* field_c ; -extern "C" const char* name_c ; -extern "C" const char* pins_c ; -extern "C" const char* pin_c ; -extern "C" const char* num_c ; -extern "C" const char* type_c ; -extern "C" const char* libraries_c ; -extern "C" const char* library_c ; -extern "C" const char* logical_c ; -extern "C" const char* uri_c ; -extern "C" const char* nets_c ; -extern "C" const char* net_c ; -extern "C" const char* code_c ; -extern "C" const char* node_c ; -} - - - -class QIcadAbstractNodeWrapper -{ -public: - QIcadAbstractNodeWrapper(QIlib::AbstractNode* node); - QIcadAbstractNodeWrapper(){} - ~QIcadAbstractNodeWrapper(); - QString value(); - QString value(int index); - QString catValues(); - QList childs; - QIcadAbstractNodeWrapper* parent; - virtual void setNode(QIlib::AbstractNode* node); - - QIlib::AbstractNode* p_node; -}; class QIcadNetListDesign : public QIcadAbstractNodeWrapper { @@ -255,7 +200,7 @@ class QIcadNetList : private lispLike_Dr public: QIcadNetList(); bool parseNetList(const QString& netlist); - QString toString(); +// QString toString(); QString fileName; QString print(); QIcadNetListRoot* netlistRoot; diff --git a/qilib/qicadpcb.cpp b/qilib/qicadpcb.cpp new file mode 100644 --- /dev/null +++ b/qilib/qicadpcb.cpp @@ -0,0 +1,39 @@ +#include "qicadpcb.h" + + +QIlib::QIcadPcb::QIcadPcb() +{ + +} + +bool QIlib::QIcadPcb::parsePcb(const QString &pcb) +{ + parse(pcb.toStdString().c_str()); + updateConcreteTree(); + return false; +} + +QString QIlib::QIcadPcb::toString() +{ + +} + +QString QIlib::QIcadPcb::print() +{ + return rootNode.print(); +} + + +void QIlib::QIcadPcb::updateConcreteTree() +{ +// if(this->rootNode.nodes.count()) +// { +// if(this->rootNode.nodes.at(0)->name==QIlib::Lexique::root_c) +// { +// if(this->netlistRoot==NULL) +// { +// this->netlistRoot = new QIcadNetListRoot(this->rootNode.nodes.at(0)); +// } +// } +// } +} diff --git a/qilib/qicadpcb.h b/qilib/qicadpcb.h new file mode 100644 --- /dev/null +++ b/qilib/qicadpcb.h @@ -0,0 +1,56 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2014, Plasma Physics Laboratory - CNRS +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program; if not, write to the Free Software +-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +-------------------------------------------------------------------------------*/ +/*-- Author : Alexis Jeandet +-- Mail : alexis.jeandet@member.fsf.org +----------------------------------------------------------------------------*/ +#ifndef QICADPCB_H +#define QICADPCB_H +#include +#include +#include +#include +#include +#include + +namespace QIlib{ + +class QIcadPcbRoot : public QIcadAbstractNodeWrapper +{ +public: + QIcadPcbRoot(QIlib::AbstractNode* node); + QIcadAbstractNodeWrapper version; + QIcadAbstractNodeWrapper host; + void setNode(QIlib::AbstractNode* node); +}; + +class QIcadPcb : private lispLike_Driver +{ +public: + QIcadPcb(); + bool parsePcb(const QString& pcb); + QString toString(); + QString fileName; + QString print(); +private: + void updateConcreteTree(); +}; + + +} +#endif // QICADPCB_H diff --git a/qilib/qilib.pro b/qilib/qilib.pro --- a/qilib/qilib.pro +++ b/qilib/qilib.pro @@ -35,7 +35,8 @@ target.path = $$[QT_INSTALL_LIBS] qilibHeaders.path = $$[QT_INSTALL_HEADERS]/QIlib qilibHeaders.files = \ qicadnetlist.h \ - qicadnet.h \ + qicadpcb.h \ + qicadlisplikelexique.h qilibParsersHeaders.path = $$[QT_INSTALL_HEADERS]/QIlib/parsers qilibParsersHeaders.files = \ @@ -49,16 +50,18 @@ INCLUDEPATH += ./parsers SOURCES += \ qicadnetlist.cpp \ - qicadnet.cpp \ parsers/lispLike_driver.cpp \ - parsers/lispLike_scanner.cpp + parsers/lispLike_scanner.cpp \ + qicadpcb.cpp \ + qicadlisplikelexique.cpp HEADERS += \ qicadnetlist.h \ - qicadnet.h \ parsers/lispLike_driver.h \ - parsers/lispLike_scanner.h + parsers/lispLike_scanner.h \ + qicadpcb.h \ + qicadlisplikelexique.h OTHER_FILES += qilib.prf diff --git a/test/dumpLispLikeFiles/main.cpp b/test/dumpLispLikeFiles/main.cpp --- a/test/dumpLispLikeFiles/main.cpp +++ b/test/dumpLispLikeFiles/main.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include /* @@ -32,24 +33,45 @@ int main(int argc, char *argv[]) { QApplication ap(argc,argv); - QIlib::QIcadNetList NetListdriver; if(argc>1) { if(QFile::exists(argv[1])) { QTime tm; - tm.start(); - NetListdriver.parseNetList(argv[1]); - qDebug()<<"File parsed in "<nets.count();i++) + { + std::cout<<"Found net:"<nets.at(i)->name.value().toStdString()<<" "<nets.at(i)->code.value().toStdString()<<"\n"; + } + } } else { - for(int i=0;inets.count();i++) + QIlib::QIcadPcb pcbDriver; + tm.start(); + pcbDriver.parsePcb(argv[1]); + qDebug()<<"File parsed in "<nets.at(i)->name.value().toStdString()<<" "<nets.at(i)->code.value().toStdString()<<"\n"; + std::cout<nets.count();i++) +// { +// std::cout<<"Found net:"<nets.at(i)->name.value().toStdString()<<" "<nets.at(i)->code.value().toStdString()<<"\n"; +// } } } }