# HG changeset patch # User Alexis Jeandet # Date 2015-06-18 10:23:38 # Node ID f3cd68e05582f171d5eca415353728ebd233b7f7 # Parent 442ac78a55ba443e124028fba67969496ab8818d PCB Viewer is working but still WIP. diff --git a/qilib/parsers/Flex_Bison_FIles/lispLike.yy b/qilib/parsers/Flex_Bison_FIles/lispLike.yy --- a/qilib/parsers/Flex_Bison_FIles/lispLike.yy +++ b/qilib/parsers/Flex_Bison_FIles/lispLike.yy @@ -2,8 +2,8 @@ //%require "3.0" //%debug %defines -%define namespace "QIlib" -%define parser_class_name "lispLike_Parser" +%define api.namespace {QIlib} +%define parser_class_name {lispLike_Parser} %code requires{ #include diff --git a/qilib/qicadlisplikelexique.cpp b/qilib/qicadlisplikelexique.cpp --- a/qilib/qicadlisplikelexique.cpp +++ b/qilib/qicadlisplikelexique.cpp @@ -20,7 +20,12 @@ -- Mail : alexis.jeandet@member.fsf.org ----------------------------------------------------------------------------*/ const char* add_net_c = "(add_net"; +const char* angle_c = "(angle"; const char* area_c = "(area"; +const char* arrow1a_c = "(arrow1a"; +const char* arrow1b_c = "(arrow1b"; +const char* arrow2a_c = "(arrow2a"; +const char* arrow2b_c = "(arrow2b"; const char* at_c = "(at"; const char* attr_c = "(attr"; const char* center_c = "(center"; @@ -28,15 +33,20 @@ const char* clearance_c = "(clearan const char* code_c = "(code"; const char* component_c = "(component"; const char* components_c = "(components"; +const char* crossbar_c = "(crossbar"; const char* date_c = "(date"; const char* design_c = "(design"; +const char* dimension_c = "(dimension"; const char* drawings_c = "(drawings"; +const char* drill_c = "(drill"; 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* feature1_c = "(feature1"; +const char* feature2_c = "(feature2"; const char* field_c = "(field"; const char* fields_c = "(fields"; const char* font_c = "(font"; @@ -44,6 +54,10 @@ const char* fp_circle_c = "(fp_circ const char* fp_line_c = "(fp_line"; const char* fp_text_c = "(fp_text"; const char* general_c = "(general"; +const char* gr_arc_c = "(gr_arc"; +const char* gr_circle_c = "(gr_circle"; +const char* gr_line_c = "(gr_line"; +const char* gr_text_c = "(gr_text"; const char* host_c = "(host"; const char* hpglpendiameter_c = "(hpglpendiameter"; const char* hpglpennumber_c = "(hpglpennumber"; @@ -52,6 +66,7 @@ const char* hpglpenspeed_c = "(hpgl const char* kicad_pcb_c = "(kicad_pcb"; const char* last_trace_width_c = "(last_trace_width"; const char* layers_c = "(layers"; +const char* layer_c = "(layer"; const char* layerselection_c = "(layerselection"; const char* lib_c = "(lib"; const char* libpart_c = "(libpart"; @@ -103,9 +118,11 @@ const char* ref_c = "(ref"; const char* rotate = "(rota"; const char* scale_c = "(scale"; const char* scaleselection_c = "(scaleselection"; +const char* segment_c = "(segment"; const char* segment_width_c = "(segment_width"; const char* setup_c = "(setup"; const char* sheetpath_c = "(sheetpath"; +const char* size_c = "(size"; const char* source_c = "(source"; const char* start_c = "(start"; const char* subtractmaskfromsilk_c = "(subtractmaskfromsilk"; @@ -131,6 +148,7 @@ const char* uvia_size_c = "(uvia_si const char* uvias_allowed_c = "(uvias_allowed"; const char* value_c = "(value"; const char* version_c = "(version"; +const char* via_c = "(via"; const char* via_dia_c = "(via_dia"; const char* via_drill_c = "(via_drill"; const char* via_min_drill_c = "(via_min_drill"; @@ -142,6 +160,7 @@ 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* zone_c = "(zone"; const char* zones_c = "(zones"; diff --git a/qilib/qicadlisplikelexique.h b/qilib/qicadlisplikelexique.h --- a/qilib/qicadlisplikelexique.h +++ b/qilib/qicadlisplikelexique.h @@ -30,7 +30,12 @@ namespace QIlib{ namespace Lexique { extern "C" const char* add_net_c; +extern "C" const char* angle_c; extern "C" const char* area_c; +extern "C" const char* arrow1a_c; +extern "C" const char* arrow1b_c; +extern "C" const char* arrow2a_c; +extern "C" const char* arrow2b_c; extern "C" const char* at_c; extern "C" const char* attr_c; extern "C" const char* center_c; @@ -38,15 +43,20 @@ 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* crossbar_c; extern "C" const char* date_c; extern "C" const char* design_c; +extern "C" const char* dimension_c; extern "C" const char* drawings_c; +extern "C" const char* drill_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* feature1_c; +extern "C" const char* feature2_c; extern "C" const char* field_c; extern "C" const char* fields_c; extern "C" const char* font_c; @@ -54,6 +64,10 @@ 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* gr_arc_c; +extern "C" const char* gr_circle_c; +extern "C" const char* gr_line_c; +extern "C" const char* gr_text_c; extern "C" const char* host_c; extern "C" const char* hpglpendiameter_c; extern "C" const char* hpglpennumber_c; @@ -62,6 +76,7 @@ extern "C" const char* hpglpenspeed_c; extern "C" const char* kicad_pcb_c; extern "C" const char* last_trace_width_c; extern "C" const char* layers_c; +extern "C" const char* layer_c; extern "C" const char* layerselection_c; extern "C" const char* lib_c; extern "C" const char* libpart_c; @@ -113,9 +128,11 @@ 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_c; extern "C" const char* segment_width_c; extern "C" const char* setup_c; extern "C" const char* sheetpath_c; +extern "C" const char* size_c; extern "C" const char* source_c; extern "C" const char* start_c; extern "C" const char* subtractmaskfromsilk_c; @@ -141,6 +158,7 @@ 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_c; extern "C" const char* via_dia_c; extern "C" const char* via_drill_c; extern "C" const char* via_min_drill_c; @@ -152,6 +170,7 @@ 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* zone_c; extern "C" const char* zones_c; } } diff --git a/qilib/qicadpcb.cpp b/qilib/qicadpcb.cpp --- a/qilib/qicadpcb.cpp +++ b/qilib/qicadpcb.cpp @@ -48,10 +48,19 @@ QIlib::QIcadPcbRoot::QIcadPcbRoot(QIlib: void QIlib::QIcadPcbRoot::setNode(QIlib::AbstractNode *node) { - this->p_node = node; this->clrNets(); + this->clrModules(); + this->clrDimensions(); + this->clrLines(); + this->clrSegments(); + this->clrVias(); + this->clrArcs(); + this->clrCircles(); + this->clrTexts(); + this->clrZones(); if(node->name==QIlib::Lexique::kicad_pcb_c) { + this->p_node = node; for(int i=0;inodes.count();i++) { if(node->nodes.at(i)->name==QIlib::Lexique::version_c) @@ -82,6 +91,42 @@ void QIlib::QIcadPcbRoot::setNode(QIlib: { this->apendNet(node->nodes.at(i)); } + if(node->nodes.at(i)->name==QIlib::Lexique::module_c) + { + this->apendModule(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::gr_line_c) + { + this->apendLine(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::dimension_c) + { + this->apendDimension(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::via_c) + { + this->apendVia(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::segment_c) + { + this->apendSegment(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::gr_text_c) + { + this->apendText(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::gr_arc_c) + { + this->apendArc(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::gr_circle_c) + { + this->apendCircle(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::zone_c) + { + this->apendZone(node->nodes.at(i)); + } } } } @@ -105,6 +150,176 @@ void QIlib::QIcadPcbRoot::apendNet(QIlib } } +void QIlib::QIcadPcbRoot::clrModules() +{ + while(modules.count()) + { + QIcadPcbModule* module; + module = modules.last(); + modules.removeLast(); + delete module; + } +} + +void QIlib::QIcadPcbRoot::apendModule(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::module_c) + { + this->modules.append(new QIcadPcbModule(node)); + } +} + +void QIlib::QIcadPcbRoot::clrDimensions() +{ + while(dimensions.count()) + { + QIcadPcbDimension* dimension; + dimension = dimensions.last(); + dimensions.removeLast(); + delete dimension; + } +} + +void QIlib::QIcadPcbRoot::apendDimension(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::dimension_c) + { + this->dimensions.append(new QIcadPcbDimension(node)); + } +} + +void QIlib::QIcadPcbRoot::apendLine(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::gr_line_c) + { + this->lines.append(new QIcadPcbLine(node)); + } +} + +void QIlib::QIcadPcbRoot::clrLines() +{ + while(lines.count()) + { + QIcadPcbLine* line; + line = lines.last(); + lines.removeLast(); + delete line; + } +} + +void QIlib::QIcadPcbRoot::clrSegments() +{ + while(segments.count()) + { + QIcadPcbSegment* segment; + segment = segments.last(); + segments.removeLast(); + delete segment; + } +} + +void QIlib::QIcadPcbRoot::apendSegment(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::segment_c) + { + this->segments.append(new QIcadPcbSegment(node)); + } +} + +void QIlib::QIcadPcbRoot::clrVias() +{ + while(vias.count()) + { + QIcadPcbVia* via; + via = vias.last(); + vias.removeLast(); + delete via; + } +} + +void QIlib::QIcadPcbRoot::apendVia(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::via_c) + { + this->vias.append(new QIcadPcbVia(node)); + } +} + +void QIlib::QIcadPcbRoot::clrArcs() +{ + while(arcs.count()) + { + QIcadPcbArc* arc; + arc = arcs.last(); + arcs.removeLast(); + delete arc; + } +} + +void QIlib::QIcadPcbRoot::apendArc(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::gr_arc_c) + { + this->arcs.append(new QIcadPcbArc(node)); + } +} + +void QIlib::QIcadPcbRoot::clrCircles() +{ + while(circles.count()) + { + QIcadPcbCircle* circle; + circle = circles.last(); + circles.removeLast(); + delete circle; + } +} + +void QIlib::QIcadPcbRoot::apendCircle(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::gr_circle_c) + { + this->circles.append(new QIcadPcbCircle(node)); + } +} + +void QIlib::QIcadPcbRoot::clrTexts() +{ + while(texts.count()) + { + QIcadPcbText* text; + text = texts.last(); + texts.removeLast(); + delete text; + } +} + +void QIlib::QIcadPcbRoot::apendText(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::gr_text_c) + { + this->texts.append(new QIcadPcbText(node)); + } +} + +void QIlib::QIcadPcbRoot::clrZones() +{ + while(zones.count()) + { + QIcadPcbZone* zone; + zone = zones.last(); + zones.removeLast(); + delete zone; + } +} + +void QIlib::QIcadPcbRoot::apendZone(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::zone_c) + { + this->zones.append(new QIcadPcbZone(node)); + } +} QIlib::QIcadPcbGeneralInfo::QIcadPcbGeneralInfo(QIlib::AbstractNode *node) :QIcadAbstractNodeWrapper(node) @@ -114,7 +329,49 @@ QIlib::QIcadPcbGeneralInfo::QIcadPcbGene void QIlib::QIcadPcbGeneralInfo::setNode(QIlib::AbstractNode *node) { - this->p_node = node; + if(node->name==QIlib::Lexique::general_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::links_c) + { + this->links.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::no_connect_c) + { + this->no_connections.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::area_c) + { + this->area.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::thickness_c) + { + this->thickness.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::drawings_c) + { + this->drawings.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::tracks_c) + { + this->tracks.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::zones_c) + { + this->zones.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::modules_c) + { + this->modules.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::nets_c) + { + this->nets.setNode(node->nodes.at(i)); + } + } + } } @@ -127,18 +384,73 @@ QIlib::QIcadPcbLayers::QIcadPcbLayers(QI void QIlib::QIcadPcbLayers::setNode(QIlib::AbstractNode *node) { this->p_node = node; + if(node->name==QIlib::Lexique::layers_c) + { + this->clrLayers(); + for(int i=0;inodes.count();i++) + { + this->apendLayer(node->nodes.at(i)); + } + } +} + +void QIlib::QIcadPcbLayers::clrLayers() +{ + while(layers.count()) + { + QIcadPcbLayer* layer; + layer = layers.last(); + layers.removeLast(); + delete layer; + } +} + +void QIlib::QIcadPcbLayers::apendLayer(QIlib::AbstractNode *node) +{ + this->layers.append(new QIcadPcbLayer(node)); } QIlib::QIcadPcbLine::QIcadPcbLine(QIlib::AbstractNode *node) - :QIcadAbstractNodeWrapper(node) + :QIcadAbstractPcbLine(node) { this->setNode(node); } + void QIlib::QIcadPcbLine::setNode(QIlib::AbstractNode *node) { - this->p_node = node; + if(node->name==QIlib::Lexique::gr_line_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::start_c) + { + this->p_startpos = nodeTo2DCoords(node->nodes.at(i)); + this->start.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::end_c) + { + this->p_stoppos = nodeTo2DCoords(node->nodes.at(i)); + this->end.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::angle_c) + { + this->angle.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->p_layers = node->nodes.at(i)->Values; + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->p_width = nodeValueToDouble(node->nodes.at(i)); + this->width.setNode(node->nodes.at(i)); + } + } + } } @@ -148,9 +460,152 @@ QIlib::QIcadPcbModule::QIcadPcbModule(QI this->setNode(node); } +const QPointF &QIlib::QIcadPcbModule::pos() +{ + return p_pos; +} + +double QIlib::QIcadPcbModule::angle() +{ + return p_angle; +} + void QIlib::QIcadPcbModule::setNode(QIlib::AbstractNode *node) { - this->p_node = node; + this->clrPads(); + if(node->name==QIlib::Lexique::module_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::tedit_c) + { + this->tedit.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::tstamp_c) + { + this->tstamp.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::at_c) + { + this->at.setNode(node->nodes.at(i)); + QStringList coords=node->nodes.at(i)->Values; + p_pos = nodeTo2DCoords(node->nodes.at(i)); + if(coords.count()==3) + { + p_angle = coords.at(2).toDouble(); + } + } + if(node->nodes.at(i)->name==QIlib::Lexique::tags_c) + { + this->tags.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::path_c) + { + this->path.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::attr_c) + { + this->attr.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::pad_c) + { + this->apendPad(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::fp_line_c) + { + this->apendLine(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::fp_text_c) + { + this->apendText(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::fp_circle_c) + { + this->apendCircle(node->nodes.at(i)); + } + } + } +} + +void QIlib::QIcadPcbModule::clrPads() +{ + while(pads.count()) + { + QIcadPcbPad* pad; + pad = pads.last(); + pads.removeLast(); + delete pad; + } +} + +void QIlib::QIcadPcbModule::apendPad(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::pad_c) + { + this->pads.append(new QIcadPcbPad(node)); + } +} + +void QIlib::QIcadPcbModule::clrTexts() +{ + while(fp_texts.count()) + { + QIcadPcbFPText* text; + text = fp_texts.last(); + fp_texts.removeLast(); + delete text; + } +} + +void QIlib::QIcadPcbModule::apendText(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::fp_text_c) + { + this->fp_texts.append(new QIcadPcbFPText(node)); + } +} + +void QIlib::QIcadPcbModule::clrLines() +{ + while(fp_lines.count()) + { + QIcadPcbFPLine* line; + line = fp_lines.last(); + fp_lines.removeLast(); + delete line; + } +} + +void QIlib::QIcadPcbModule::apendLine(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::fp_line_c) + { + this->fp_lines.append(new QIcadPcbFPLine(node)); + } +} + +void QIlib::QIcadPcbModule::clrCircles() +{ + while(fp_circles.count()) + { + QIcadPcbFPCircle* circle; + circle = fp_circles.last(); + fp_circles.removeLast(); + delete circle; + } +} + +void QIlib::QIcadPcbModule::apendCircle(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::fp_circle_c) + { + this->fp_circles.append(new QIcadPcbFPCircle(node)); + } } @@ -162,7 +617,49 @@ QIlib::QIcadPcbDimension::QIcadPcbDimens void QIlib::QIcadPcbDimension::setNode(QIlib::AbstractNode *node) { - this->p_node = node; + if(node->name==QIlib::Lexique::dimension_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->width.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::gr_text_c) + { + this->gr_text.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::feature1_c) + { + this->feature1.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::crossbar_c) + { + this->crossbar.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::arrow1a_c) + { + this->arrow1a.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::arrow1b_c) + { + this->arrow1b.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::arrow2a_c) + { + this->arrow2a.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::arrow2b_c) + { + this->arrow2b.setNode(node->nodes.at(i)); + } + } + } } @@ -178,15 +675,33 @@ void QIlib::QIcadPcbModuleModel::setNode } -QIlib::QIcadPcbFpText::QIcadPcbFpText(QIlib::AbstractNode *node) +QIlib::QIcadPcbFPText::QIcadPcbFPText(QIlib::AbstractNode *node) :QIcadAbstractNodeWrapper(node) { this->setNode(node); } -void QIlib::QIcadPcbFpText::setNode(QIlib::AbstractNode *node) +void QIlib::QIcadPcbFPText::setNode(QIlib::AbstractNode *node) { - this->p_node = node; + if(node->name==QIlib::Lexique::pad_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::at_c) + { + this->at.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::effects_c) + { + this->effects.setNode(node->nodes.at(i)); + } + } + } } @@ -251,14 +766,44 @@ void QIlib::QIcadPcbPlotParams::setNode( QIlib::QIcadPcbSegment::QIcadPcbSegment(QIlib::AbstractNode *node) - :QIcadAbstractNodeWrapper(node) + :QIcadAbstractPcbLine(node) { this->setNode(node); } void QIlib::QIcadPcbSegment::setNode(QIlib::AbstractNode *node) { - this->p_node = node; + if(node->name==QIlib::Lexique::segment_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::start_c) + { + this->p_startpos = nodeTo2DCoords(node->nodes.at(i)); + this->start.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::end_c) + { + this->p_stoppos = nodeTo2DCoords(node->nodes.at(i)); + this->end.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->p_width = nodeValueToDouble(node->nodes.at(i)); + this->width.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->p_layers = node->nodes.at(i)->Values; + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::net_c) + { + this->net.setNode(node->nodes.at(i)); + } + } + } } @@ -270,5 +815,358 @@ QIlib::QIcadPcbVia::QIcadPcbVia(QIlib::A void QIlib::QIcadPcbVia::setNode(QIlib::AbstractNode *node) { - this->p_node = node; + if(node->name==QIlib::Lexique::via_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::at_c) + { + this->at.setNode(node->nodes.at(i)); + p_pos = nodeTo2DCoords(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::size_c) + { + this->sizeNode.setNode(node->nodes.at(i)); + p_size = nodeTo2DSize(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::drill_c) + { + this->drillNode.setNode(node->nodes.at(i)); + p_drill = nodeValueToDouble(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layers_c) + { + this->layersNode.setNode(node->nodes.at(i)); + p_layers = node->nodes.at(i)->Values; + } + if(node->nodes.at(i)->name==QIlib::Lexique::net_c) + { + this->net.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::tstamp_c) + { + this->tstamp.setNode(node->nodes.at(i)); + } + } + } +} + + +QIlib::QIcadPcbPad::QIcadPcbPad(QIlib::AbstractNode *node) + :QIcadAbstractNodeWrapper(node) +{ + this->setNode(node); +} + +void QIlib::QIcadPcbPad::setNode(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::pad_c) + { + this->p_node = node; + if(p_node->Values.count()>=3) + { + if(!this->p_node->Values.at((2)).compare("rect")) + { + this->p_shape = rectangle; + } + else + if(!this->p_node->Values.at((2)).compare("circle")) + { + this->p_shape = circle; + } + + } + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::at_c) + { + this->at.setNode(node->nodes.at(i)); + this->p_pos = nodeTo2DCoords(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::size_c) + { + this->sizeNode.setNode(node->nodes.at(i)); + this->p_size = nodeTo2DSize(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layers_c) + { + this->layer.setNode(node->nodes.at(i)); + this->p_layers = node->nodes.at(i)->Values; + } + if(node->nodes.at(i)->name==QIlib::Lexique::net_c) + { + this->netNode.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::drill_c) + { + this->drillNode.setNode(node->nodes.at(i)); + this->p_drill = nodeValueToDouble(node->nodes.at(i)); + } + } + } +} + + +QIlib::QIcadPcbFPLine::QIcadPcbFPLine(QIlib::AbstractNode *node) + :QIcadAbstractPcbLine(node) +{ + this->setNode(node); +} + +void QIlib::QIcadPcbFPLine::setNode(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::fp_line_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::start_c) + { + this->p_startpos = nodeTo2DCoords(node->nodes.at(i)); + this->start.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::end_c) + { + this->p_stoppos = nodeTo2DCoords(node->nodes.at(i)); + this->end.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->p_layers = node->nodes.at(i)->Values; + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->p_width = nodeValueToDouble(node->nodes.at(i)); + this->width.setNode(node->nodes.at(i)); + } + } + } +} + + +QIlib::QIcadPcbFPCircle::QIcadPcbFPCircle(QIlib::AbstractNode *node) + :QIcadAbstractNodeWrapper(node) +{ + this->setNode(node); +} + +void QIlib::QIcadPcbFPCircle::setNode(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::fp_circle_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::center_c) + { + this->center.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::end_c) + { + this->end.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->width.setNode(node->nodes.at(i)); + } + } + } +} + + +QIlib::QIcadPcbText::QIcadPcbText(QIlib::AbstractNode *node) + :QIcadAbstractNodeWrapper(node) +{ + this->setNode(node); } + +void QIlib::QIcadPcbText::setNode(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::gr_text_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::at_c) + { + this->at.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->width.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::effects_c) + { + this->effects.setNode(node->nodes.at(i)); + } + } + } +} + + +QIlib::QIcadPcbCircle::QIcadPcbCircle(QIlib::AbstractNode *node) + :QIcadAbstractNodeWrapper(node) +{ + this->setNode(node); +} + +void QIlib::QIcadPcbCircle::setNode(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::gr_circle_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::center_c) + { + this->center.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::end_c) + { + this->end.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->width.setNode(node->nodes.at(i)); + } + } + } +} + + +QIlib::QIcadPcbArc::QIcadPcbArc(QIlib::AbstractNode *node) + :QIcadAbstractNodeWrapper(node) +{ + this->setNode(node); +} + +void QIlib::QIcadPcbArc::setNode(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::gr_arc_c) + { + this->p_node = node; + for(int i=0;inodes.count();i++) + { + if(node->nodes.at(i)->name==QIlib::Lexique::start_c) + { + this->start.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::end_c) + { + this->end.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::angle_c) + { + this->angle.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::layer_c) + { + this->layer.setNode(node->nodes.at(i)); + } + if(node->nodes.at(i)->name==QIlib::Lexique::width_c) + { + this->width.setNode(node->nodes.at(i)); + } + } + } +} + + +QIlib::QIcadPcbZone::QIcadPcbZone(QIlib::AbstractNode *node) + :QIcadAbstractNodeWrapper(node) +{ + this->setNode(node); +} + +void QIlib::QIcadPcbZone::setNode(QIlib::AbstractNode *node) +{ + if(node->name==QIlib::Lexique::zone_c) + { + this->p_node = node; + } +} + + +const QPointF QIlib::nodeTo2DCoords(QIlib::AbstractNode *node) +{ + QPointF point; + QStringList coords=node->Values; + if(coords.count()>=2) + { + point.setX(coords.at(0).toDouble()); + point.setY(coords.at(1).toDouble()); + } + return point; +} + + +double QIlib::nodeValueToDouble(QIlib::AbstractNode *node, int index) +{ + if(node->Values.count()>index) + { + return node->Values.at(index).toDouble(); + } + return 0.0; +} + + +int QIlib::nodeValueToInt(QIlib::AbstractNode *node, int index) +{ + if(node->Values.count()>index) + { + return node->Values.at(index).toInt(); + } + return 0; +} + + +QIlib::QIcadPcbLayer::QIcadPcbLayer(QIlib::AbstractNode *node) + :QIcadAbstractNodeWrapper(node) +{ + this->p_index = QString(this->p_node->name).remove('(').toInt(); + if(this->p_node->Values.count()>=1) + { + this->p_name = this->p_node->Values.at(0); + } + if(this->p_node->Values.count()>=2) + { + QString typestr=this->p_node->Values.at(1); + this->p_type = none; + if(!typestr.compare("signal")) + { + this->p_type = signal; + } + else + if(!typestr.compare("user")) + { + this->p_type = user; + } + } +} + + +const QSizeF QIlib::nodeTo2DSize(QIlib::AbstractNode *node) +{ + QSizeF size; + QStringList sz=node->Values; + if(sz.count()>=2) + { + size.setWidth(sz.at(0).toDouble()); + size.setHeight(sz.at(1).toDouble()); + } + return size; +} diff --git a/qilib/qicadpcb.h b/qilib/qicadpcb.h --- a/qilib/qicadpcb.h +++ b/qilib/qicadpcb.h @@ -27,9 +27,53 @@ #include #include #include +#include +#include namespace QIlib{ +const QPointF nodeTo2DCoords(QIlib::AbstractNode* node); +const QSizeF nodeTo2DSize(QIlib::AbstractNode* node); +double nodeValueToDouble(QIlib::AbstractNode* node,int index=0); +int nodeValueToInt(QIlib::AbstractNode* node,int index=0); + +class QIcadAbstractPcbLine : public QIcadAbstractNodeWrapper +{ +public: + QIcadAbstractPcbLine(QIlib::AbstractNode* node) + :QIcadAbstractNodeWrapper(node) + {} + QIcadAbstractPcbLine(){} + virtual const QPointF& startPos(){return p_startpos;} + virtual const QPointF& stopPos(){return p_stoppos;} + virtual double width(){return p_width;} + virtual const QStringList& layers(){return p_layers;} +protected: + double p_width; + QPointF p_startpos; + QPointF p_stoppos; + QStringList p_layers; +}; + +class QIcadPcbLayer : public QIcadAbstractNodeWrapper +{ +public: + typedef enum + { + signal, + user, + none + }layetType_t; + QIcadPcbLayer(QIlib::AbstractNode* node); + QIcadPcbLayer(){} + int index(){return p_index;} + const QString& name(){return p_name;} + layetType_t type(){return p_type;} +protected: + int p_index; + QString p_name; + layetType_t p_type; +}; class QIcadPcbPlotParams : public QIcadAbstractNodeWrapper { @@ -99,7 +143,6 @@ public: void setNode(QIlib::AbstractNode* node); }; - class QIcadPcbNetClass : public QIcadAbstractNodeWrapper { public: @@ -133,13 +176,14 @@ public: void setNode(QIlib::AbstractNode* node); }; -class QIcadPcbFpText : public QIcadAbstractNodeWrapper +class QIcadPcbFPText : public QIcadAbstractNodeWrapper { public: - QIcadPcbFpText(QIlib::AbstractNode* node); - QIcadPcbFpText(){} + QIcadPcbFPText(QIlib::AbstractNode* node); + QIcadPcbFPText(){} QIcadAbstractNodeWrapper at; QIcadAbstractNodeWrapper layer; + QIcadPcbFpTextEffects effects; void setNode(QIlib::AbstractNode* node); }; @@ -154,7 +198,6 @@ public: void setNode(QIlib::AbstractNode* node); }; - class QIcadPcbDimension : public QIcadAbstractNodeWrapper { public: @@ -173,11 +216,66 @@ public: void setNode(QIlib::AbstractNode* node); }; +class QIcadPcbPad : public QIcadAbstractNodeWrapper +{ +public: + typedef enum + { + rectangle, + circle + }padShape; + QIcadPcbPad(QIlib::AbstractNode* node); + QIcadPcbPad(){} + QIcadAbstractNodeWrapper at; + QIcadAbstractNodeWrapper sizeNode; + QIcadAbstractNodeWrapper layer; + QIcadAbstractNodeWrapper netNode; + QIcadAbstractNodeWrapper drillNode; + const QStringList& layers(){return p_layers;} + const QSizeF& size(){return p_size;} + const QPointF& pos(){return p_pos;} + double drill(){return p_drill;} + padShape shape(){return p_shape;} + void setNode(QIlib::AbstractNode* node); +private: + padShape p_shape; + double p_drill; + QSizeF p_size; + QPointF p_pos; + QStringList p_layers; +}; + +class QIcadPcbFPLine : public QIcadAbstractPcbLine +{ +public: + QIcadPcbFPLine(QIlib::AbstractNode* node); + QIcadPcbFPLine(){} + QIcadAbstractNodeWrapper start; + QIcadAbstractNodeWrapper end; + QIcadAbstractNodeWrapper layer; + QIcadAbstractNodeWrapper width; + void setNode(QIlib::AbstractNode* node); +}; + +class QIcadPcbFPCircle : public QIcadAbstractNodeWrapper +{ +public: + QIcadPcbFPCircle(QIlib::AbstractNode* node); + QIcadPcbFPCircle(){} + QIcadAbstractNodeWrapper center; + QIcadAbstractNodeWrapper end; + QIcadAbstractNodeWrapper layer; + QIcadAbstractNodeWrapper width; + void setNode(QIlib::AbstractNode* node); +}; + class QIcadPcbModule : public QIcadAbstractNodeWrapper { public: QIcadPcbModule(QIlib::AbstractNode* node); QIcadPcbModule(){} + const QPointF& pos(); + double angle(); QIcadAbstractNodeWrapper layer; QIcadAbstractNodeWrapper tedit; QIcadAbstractNodeWrapper tstamp; @@ -186,14 +284,26 @@ public: QIcadAbstractNodeWrapper tags; QIcadAbstractNodeWrapper path; QIcadAbstractNodeWrapper attr; - QList fp_texts; - QList fp_lines; - QList pads; + QList fp_texts; + QList fp_lines; + QList fp_circles; + QList pads; QIcadPcbModuleModel model; void setNode(QIlib::AbstractNode* node); + void clrPads(); + void apendPad(QIlib::AbstractNode* node); + void clrTexts(); + void apendText(QIlib::AbstractNode* node); + void clrLines(); + void apendLine(QIlib::AbstractNode* node); + void clrCircles(); + void apendCircle(QIlib::AbstractNode* node); +private: + QPointF p_pos; + double p_angle; }; -class QIcadPcbSegment : public QIcadAbstractNodeWrapper +class QIcadPcbSegment : public QIcadAbstractPcbLine { public: QIcadPcbSegment(QIlib::AbstractNode* node); @@ -205,20 +315,31 @@ public: QIcadAbstractNodeWrapper net; void setNode(QIlib::AbstractNode* node); }; + class QIcadPcbVia : public QIcadAbstractNodeWrapper { public: QIcadPcbVia(QIlib::AbstractNode* node); QIcadPcbVia(){} QIcadAbstractNodeWrapper at; - QIcadAbstractNodeWrapper size; - QIcadAbstractNodeWrapper drill; - QIcadAbstractNodeWrapper layer; + QIcadAbstractNodeWrapper sizeNode; + QIcadAbstractNodeWrapper drillNode; + QIcadAbstractNodeWrapper layersNode; QIcadAbstractNodeWrapper net; + QIcadAbstractNodeWrapper tstamp; void setNode(QIlib::AbstractNode* node); + const QStringList& layers(){return p_layers;} + const QSizeF& size(){return p_size;} + const QPointF& pos(){return p_pos;} + double drill(){return p_drill;} +private: + double p_drill; + QSizeF p_size; + QPointF p_pos; + QStringList p_layers; }; -class QIcadPcbLine : public QIcadAbstractNodeWrapper +class QIcadPcbLine : public QIcadAbstractPcbLine { public: QIcadPcbLine(QIlib::AbstractNode* node); @@ -231,13 +352,60 @@ public: void setNode(QIlib::AbstractNode* node); }; +class QIcadPcbZone : public QIcadAbstractNodeWrapper +{ +public: + QIcadPcbZone(QIlib::AbstractNode* node); + QIcadPcbZone(){} + void setNode(QIlib::AbstractNode* node); +}; + +class QIcadPcbArc : public QIcadAbstractNodeWrapper +{ +public: + QIcadPcbArc(QIlib::AbstractNode* node); + QIcadPcbArc(){} + QIcadAbstractNodeWrapper start; + QIcadAbstractNodeWrapper end; + QIcadAbstractNodeWrapper angle; + QIcadAbstractNodeWrapper layer; + QIcadAbstractNodeWrapper width; + void setNode(QIlib::AbstractNode* node); +}; + +class QIcadPcbCircle : public QIcadAbstractNodeWrapper +{ +public: + QIcadPcbCircle(QIlib::AbstractNode* node); + QIcadPcbCircle(){} + QIcadAbstractNodeWrapper center; + QIcadAbstractNodeWrapper end; + QIcadAbstractNodeWrapper layer; + QIcadAbstractNodeWrapper width; + void setNode(QIlib::AbstractNode* node); +}; + +class QIcadPcbText : public QIcadAbstractNodeWrapper +{ +public: + QIcadPcbText(QIlib::AbstractNode* node); + QIcadPcbText(){} + QIcadAbstractNodeWrapper at; + QIcadAbstractNodeWrapper layer; + QIcadAbstractNodeWrapper width; + QIcadPcbFpTextEffects effects; + void setNode(QIlib::AbstractNode* node); +}; + class QIcadPcbLayers : public QIcadAbstractNodeWrapper { public: QIcadPcbLayers(QIlib::AbstractNode* node); QIcadPcbLayers(){} - QList layers; + QList layers; void setNode(QIlib::AbstractNode* node); + void clrLayers(); + void apendLayer(QIlib::AbstractNode* node); }; class QIcadPcbGeneralInfo : public QIcadAbstractNodeWrapper @@ -273,19 +441,31 @@ public: QList lines; QList segments; QList vias; + QList arcs; + QList circles; + QList texts; + QList zones; void setNode(QIlib::AbstractNode* node); void clrNets(); void apendNet(QIlib::AbstractNode* node); - void setModules(QIlib::AbstractNode* node); - void apendModules(QIlib::AbstractNode* node); - void setDimensions(QIlib::AbstractNode* node); - void apendDimensions(QIlib::AbstractNode* node); - void setLines(QIlib::AbstractNode* node); - void apendLines(QIlib::AbstractNode* node); - void setSegments(QIlib::AbstractNode* node); - void apendSegments(QIlib::AbstractNode* node); - void setVias(QIlib::AbstractNode* node); - void apendVias(QIlib::AbstractNode* node); + void clrModules(); + void apendModule(QIlib::AbstractNode* node); + void clrDimensions(); + void apendDimension(QIlib::AbstractNode* node); + void apendLine(QIlib::AbstractNode* node); + void clrLines(); + void clrSegments(); + void apendSegment(QIlib::AbstractNode* node); + void clrVias(); + void apendVia(QIlib::AbstractNode* node); + void clrArcs(); + void apendArc(QIlib::AbstractNode* node); + void clrCircles(); + void apendCircle(QIlib::AbstractNode* node); + void clrTexts(); + void apendText(QIlib::AbstractNode* node); + void clrZones(); + void apendZone(QIlib::AbstractNode* node); }; class QIcadPcb : private lispLike_Driver diff --git a/test/PCBView/PCBView.pro b/test/PCBView/PCBView.pro new file mode 100644 --- /dev/null +++ b/test/PCBView/PCBView.pro @@ -0,0 +1,41 @@ +#------------------------------------------------- +# +# Project created by QtCreator 2015-06-11T21:37:25 +# +#------------------------------------------------- + +QT += core gui opengl +CONFIG += qilib + +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets + +TARGET = PCBView +TEMPLATE = app + +MOC_DIR = moc +RCC_DIR = resources +OBJECTS_DIR = obj +DESTDIR = ../../bin + +INCLUDEPATH += ../../qilib $${DESTDIR}/../qilib/ + +LIBS += -L../../bin -lQIlib + +SOURCES += main.cpp\ + mainwindow.cpp \ + pcbgraphicview.cpp \ + pcbrectpad.cpp \ + pcbmodule.cpp \ + pcbline.cpp \ + pcbcontext.cpp \ + pcbvia.cpp + +HEADERS += mainwindow.h \ + pcbgraphicview.h \ + pcbrectpad.h \ + pcbmodule.h \ + pcbline.h \ + pcbcontext.h \ + pcbvia.h + +FORMS += mainwindow.ui diff --git a/test/PCBView/main.cpp b/test/PCBView/main.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/main.cpp @@ -0,0 +1,32 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "mainwindow.h" +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + w.show(); + + return a.exec(); +} diff --git a/test/PCBView/mainwindow.cpp b/test/PCBView/mainwindow.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/mainwindow.cpp @@ -0,0 +1,87 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "mainwindow.h" +#include "ui_mainwindow.h" +#include "pcbmodule.h" +#include "pcbline.h" +#include "pcbvia.h" + + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + this->p_scene = new QGraphicsScene(); + this->p_scene->setSceneRect(0, 0, 500, 200); + + this->context = new PCBContext(); + this->ui->graphicsView->setScene(this->p_scene); + QIlib::QIcadPcb pcbDriver; +// pcbDriver.parsePcb("/opt/kicadTools/test/testFiles/pcb2.kicad_pcb"); +// pcbDriver.parsePcb("/home/jeandet/Documents/PCB/ADC_STAMP/ADC_STAMP.kicad_pcb"); + pcbDriver.parsePcb("/usr/share/kicad/demos/video/video.kicad_pcb"); +// pcbDriver.parsePcb("/usr/share/kicad/demos/kit-dev-coldfire-xilinx_5213/kit-dev-coldfire-xilinx_5213.kicad_pcb"); + for(int i=0;ilayers.layers.count();i++) + { + this->context->addlayer(pcbDriver.pcbRoot->layers.layers.at(i)->name(),pcbDriver.pcbRoot->layers.layers.at(i)->index()); + } + for(int i=0;imodules.count();i++) + { + this->p_scene->addItem(new PCBModule(pcbDriver.pcbRoot->modules.at(i),this->context)); + } + for(int i=0;ilines.count();i++) + { + this->p_scene->addItem(new PCBLine((QIlib::QIcadAbstractPcbLine*)pcbDriver.pcbRoot->lines.at(i),this->context)); + } + for(int i=0;isegments.count();i++) + { + this->p_scene->addItem(new PCBLine((QIlib::QIcadAbstractPcbLine*)pcbDriver.pcbRoot->segments.at(i),this->context)); + } + for(int i=0;ivias.count();i++) + { + this->p_scene->addItem(new PCBVia(pcbDriver.pcbRoot->vias.at(i),this->context)); + } + connect(this->ui->actionRedraw,SIGNAL(triggered(bool)),this,SLOT(redraw())); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::redraw() +{ + this->p_scene->update(); +} + +void MainWindow::changeEvent(QEvent *e) +{ + QMainWindow::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} diff --git a/test/PCBView/mainwindow.h b/test/PCBView/mainwindow.h new file mode 100644 --- /dev/null +++ b/test/PCBView/mainwindow.h @@ -0,0 +1,57 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include +#include +#include +#include +#include + + + +namespace Ui { +class MainWindow; +} + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + explicit MainWindow(QWidget *parent = 0); + ~MainWindow(); + +public slots: + void redraw(); +protected: + void changeEvent(QEvent *e); + +private: + Ui::MainWindow *ui; + QGraphicsScene* p_scene; + PCBContext* context; +}; + +#endif // MAINWINDOW_H diff --git a/test/PCBView/mainwindow.ui b/test/PCBView/mainwindow.ui new file mode 100644 --- /dev/null +++ b/test/PCBView/mainwindow.ui @@ -0,0 +1,77 @@ + + + MainWindow + + + + 0 + 0 + 547 + 393 + + + + MainWindow + + + + + + + + + + + + 0 + 0 + 547 + 27 + + + + + Fi&le + + + + + + edit + + + + + + + + + TopToolBarArea + + + false + + + + + + &open + + + + + &redraw + + + + + + + PCBGraphicView + QGraphicsView +
pcbgraphicview.h
+
+
+ + +
diff --git a/test/PCBView/pcbcontext.cpp b/test/PCBView/pcbcontext.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbcontext.cpp @@ -0,0 +1,73 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "pcbcontext.h" + +Qt::GlobalColor Colours[]= { + Qt::red, + Qt::blue, + Qt::black, + Qt::green, + Qt::darkGreen, + Qt::cyan, + Qt::darkRed, + Qt::gray, + Qt::yellow, + Qt::darkBlue, + Qt::darkCyan, + Qt::magenta, + Qt::darkMagenta, + Qt::darkYellow, + Qt::darkGray, + Qt::lightGray +}; + +PCBContext::PCBContext(QObject *parent) : QObject(parent) +{ + +} + +void PCBContext::addlayer(const QString &name, int number) +{ + this->layers_map[name]=number; + layers_colors[number] = Colours[number%15]; +} + +int PCBContext::layer(const QString &name) +{ + return layers_map[name]; +} + +const QColor &PCBContext::layerColor(const QString &name) +{ + return layers_colors[layers_map[name]]; +} + +const QColor &PCBContext::layerColor(int number) +{ + return layers_colors[number]; +} + +const QString PCBContext::layer(int number) +{ + return layers_map.key(number); +} + diff --git a/test/PCBView/pcbcontext.h b/test/PCBView/pcbcontext.h new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbcontext.h @@ -0,0 +1,48 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 PCBCONTEXT_H +#define PCBCONTEXT_H + +#include +#include +#include + +class PCBContext : public QObject +{ + Q_OBJECT +public: + explicit PCBContext(QObject *parent = 0); + void addlayer(const QString& name,int number); + int layer(const QString& name); + const QColor& layerColor(const QString& name); + const QColor& layerColor(int number); + const QString layer(int number); +signals: + +public slots: + +private: + QMap layers_colors; + QMap layers_map; +}; + +#endif // PCBCONTEXT_H diff --git a/test/PCBView/pcbgraphicview.cpp b/test/PCBView/pcbgraphicview.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbgraphicview.cpp @@ -0,0 +1,145 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "pcbgraphicview.h" + +#include +#include + +PCBGraphicView::PCBGraphicView(QWidget *parent) + :QGraphicsView(parent) +{ + + this->setRenderHint(QPainter::Antialiasing, true); + this->setDragMode(QGraphicsView::RubberBandDrag); + this->setOptimizationFlags(QGraphicsView::DontSavePainterState); + this->setViewportUpdateMode(QGraphicsView::SmartViewportUpdate); + + this->setContextMenuPolicy(Qt::ActionsContextMenu); + this->setTransformationAnchor(AnchorUnderMouse); + this->scale(qreal(0.8), qreal(0.8)); + this->setRubberBandSelectionMode(Qt::ContainsItemBoundingRect); + this->setDragMode(RubberBandDrag); + this->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + this->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + this->ctrl_pressed = false; + this->shift_pressed = false; +} + + +void PCBGraphicView::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Plus: + zoomIn(); + break; + case Qt::Key_Minus: + zoomOut(); + break; + case Qt::Key_Shift: + this->shift_pressed = true; + break; + case Qt::Key_Control: + this->ctrl_pressed = true; + break; + default: + QGraphicsView::keyPressEvent(event); + } +} + +void PCBGraphicView::keyReleaseEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Shift: + this->shift_pressed = false; + break; + case Qt::Key_Control: + this->ctrl_pressed = false; + break; + default: + QGraphicsView::keyReleaseEvent(event); + } +} + +void PCBGraphicView::wheelEvent(QWheelEvent *event) +{ + + if (event->modifiers() & Qt::ControlModifier) + { + if (event->orientation()== Qt::Vertical) + scaleView(pow((double)2, event->delta() / 240.0)); + } + else + { + if (event->modifiers() & Qt::ShiftModifier) + { + QWheelEvent* tempevent = new QWheelEvent(event->pos(),(event->delta()/10),event->buttons(),event->modifiers(),Qt::Horizontal); + QGraphicsView::wheelEvent(tempevent); + } + else + QGraphicsView::wheelEvent(event); + } +} + + + +void PCBGraphicView::drawBackground(QPainter *painter, const QRectF &rect) +{ + Q_UNUSED(rect); + + // Shadow + QRectF sceneRect = this->sceneRect(); + QRectF rightShadow(sceneRect.right(), sceneRect.top() + 20, 20, sceneRect.height()); + QRectF bottomShadow(sceneRect.left() + 20, sceneRect.bottom(), sceneRect.width(), 20); + if (rightShadow.intersects(rect) || rightShadow.contains(rect)) + painter->fillRect(rightShadow, Qt::darkGray); + if (bottomShadow.intersects(rect) || bottomShadow.contains(rect)) + painter->fillRect(bottomShadow, Qt::darkGray); + + // Fill + QLinearGradient gradient(sceneRect.topLeft(), sceneRect.bottomRight()); + gradient.setColorAt(0, Qt::white); + gradient.setColorAt(1, Qt::lightGray); + painter->fillRect(rect.intersected(sceneRect), gradient); + painter->setBrush(Qt::NoBrush); + painter->drawRect(sceneRect); +} + + +void PCBGraphicView::scaleView(qreal scaleFactor) +{ + qreal factor = transform().scale(scaleFactor, scaleFactor).mapRect(QRectF(0, 0, 1, 1)).width(); + if (factor < 0.02 || factor > 1000) + return; + scale(scaleFactor, scaleFactor); +} + + +void PCBGraphicView::zoomIn() +{ + scaleView(qreal(1.2)); +} + +void PCBGraphicView::zoomOut() +{ + scaleView(1 / qreal(1.2)); +} diff --git a/test/PCBView/pcbgraphicview.h b/test/PCBView/pcbgraphicview.h new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbgraphicview.h @@ -0,0 +1,54 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 PCBGRAPHICVIEW_H +#define PCBGRAPHICVIEW_H + +#include +#include +#include +#include +#include +#include + +class PCBGraphicView : public QGraphicsView +{ +public: + PCBGraphicView(QWidget *parent = 0); + void itemMoved(); + +public slots: + void zoomIn(); + void zoomOut(); + +protected: + void keyPressEvent(QKeyEvent *event); + void keyReleaseEvent(QKeyEvent *event); + void wheelEvent(QWheelEvent *event); + void drawBackground(QPainter *painter, const QRectF &rect); + + void scaleView(qreal scaleFactor); +private: + bool ctrl_pressed; + bool shift_pressed; +}; + +#endif // PCBGRAPHICVIEW_H diff --git a/test/PCBView/pcbline.cpp b/test/PCBView/pcbline.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbline.cpp @@ -0,0 +1,52 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "pcbline.h" +#include + +PCBLine::PCBLine(QIlib::QIcadAbstractPcbLine *lineNode, QPointF offset,PCBContext* context) + :lineNode(lineNode),context(context) +{ + init(offset); +} + +PCBLine::PCBLine(QIlib::QIcadAbstractPcbLine *lineNode, PCBContext *context) + :lineNode(lineNode),context(context) +{ + init(QPointF(0,0)); +} + +void PCBLine::init(QPointF offset) +{ + this->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + this->setFlags(ItemIsMovable|ItemIsSelectable|ItemIsFocusable); + QPointF startPos=(offset+lineNode->startPos()); + QPointF stopPos=(offset+lineNode->stopPos()); + this->setLine(startPos.x(),startPos.y(),stopPos.x(),stopPos.y()); + QPen pen = this->pen(); + pen.setWidthF(lineNode->width()); + pen.setJoinStyle(Qt::RoundJoin); + pen.setCapStyle(Qt::RoundCap); + pen.setColor(context->layerColor(lineNode->layers().first())); + this->setZValue(-context->layer(lineNode->layers().first())); + this->setPen(pen); + setOpacity(0.6); +} diff --git a/test/PCBView/pcbline.h b/test/PCBView/pcbline.h new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbline.h @@ -0,0 +1,42 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 PCBLINE_H +#define PCBLINE_H + +#include +#include +#include +#include +#include + +class PCBLine: public QGraphicsLineItem +{ +public: + PCBLine(QIlib::QIcadAbstractPcbLine* lineNode,QPointF offset,PCBContext* context); + PCBLine(QIlib::QIcadAbstractPcbLine* lineNode,PCBContext* context); +private: + void init(QPointF offset); + QIlib::QIcadAbstractPcbLine* lineNode; + PCBContext* context; +}; + +#endif // PCBLINE_H diff --git a/test/PCBView/pcbmodule.cpp b/test/PCBView/pcbmodule.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbmodule.cpp @@ -0,0 +1,44 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "pcbmodule.h" +#include "pcbline.h" +#include "pcbrectpad.h" + +PCBModule::PCBModule(QIlib::QIcadPcbModule *moduleNode, PCBContext *context) + :QGraphicsItemGroup(),context(context) +{ + this->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + this->setFlags(ItemIsMovable|ItemIsSelectable|ItemIsFocusable); +// this->setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); +// this->addToGroup(new QGraphicsRectItem(0,0,2,2)); + this->setPos(moduleNode->pos()); + for(int i=0;ifp_lines.count();i++) + { + this->addToGroup(new PCBLine((QIlib::QIcadAbstractPcbLine*)moduleNode->fp_lines.at(i),moduleNode->pos(),context)); + } + for(int i=0;ipads.count();i++) + { + this->addToGroup(new PCBRectPad((QIlib::QIcadPcbPad*)moduleNode->pads.at(i),moduleNode->pos(),context)); + } + this->setRotation(moduleNode->angle()); +} + diff --git a/test/PCBView/pcbmodule.h b/test/PCBView/pcbmodule.h new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbmodule.h @@ -0,0 +1,40 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 PCBMODULE_H +#define PCBMODULE_H + +#include +#include +#include +#include +#include + +class PCBModule : public QGraphicsItemGroup +{ +public: + PCBModule(QIlib::QIcadPcbModule* moduleNode,PCBContext* context); +private: + QIlib::QIcadPcbModule* moduleNode; + PCBContext* context; +}; + +#endif // PCBMODULE_H diff --git a/test/PCBView/pcbrectpad.cpp b/test/PCBView/pcbrectpad.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbrectpad.cpp @@ -0,0 +1,80 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "pcbrectpad.h" +#include + +PCBRectPad::PCBRectPad(QIlib::QIcadPcbPad *padNode, PCBContext *context) + :QGraphicsItemGroup(),padNode(padNode),context(context) +{ + this->init(QPointF(0.0,0.0)); +} + + + +PCBRectPad::PCBRectPad(QIlib::QIcadPcbPad *padNode, QPointF offset, PCBContext *context) + :QGraphicsItemGroup(),padNode(padNode),context(context) +{ + this->init(offset); +} + +void PCBRectPad::init( QPointF offset) +{ + this->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + offset-=QPointF(this->padNode->size().width()/2,this->padNode->size().height()/2); + if(this->padNode->shape()==QIlib::QIcadPcbPad::rectangle) + { + for(int i=0;ipadNode->layers().count();i++) + { + QGraphicsRectItem* rect = new QGraphicsRectItem(); + QPen pen = rect->pen(); + pen.setWidthF(0.01); + rect->setPen(pen); + QBrush brush = rect->brush(); + brush.setStyle(Qt::SolidPattern); + brush.setColor(context->layerColor(this->padNode->layers().at(i))); + rect->setBrush(brush); + QRectF rec(this->padNode->pos()+offset,this->padNode->size()); + rect->setRect(rec); + rect->setZValue(-context->layer(padNode->layers().at(i))); + this->addToGroup(rect); + } + } + if(this->padNode->shape()==QIlib::QIcadPcbPad::circle) + { + for(int i=0;ipadNode->layers().count();i++) + { + QGraphicsEllipseItem* ellipse = new QGraphicsEllipseItem(); + QPen pen = ellipse->pen(); + pen.setWidthF(0.01); + ellipse->setPen(pen); + QBrush brush = ellipse->brush(); + brush.setStyle(Qt::SolidPattern); + brush.setColor(context->layerColor(this->padNode->layers().at(i))); + ellipse->setBrush(brush); + QRectF rec(this->padNode->pos()+offset,this->padNode->size()); + ellipse->setRect(rec); + ellipse->setZValue(-context->layer(padNode->layers().at(i))); + this->addToGroup(ellipse); + } + } + setOpacity(0.6); +} diff --git a/test/PCBView/pcbrectpad.h b/test/PCBView/pcbrectpad.h new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbrectpad.h @@ -0,0 +1,48 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 PCBRECTPAD_H +#define PCBRECTPAD_H + +#include +#include +#include +#include +#include +#include + +class PCBRectPad : public QGraphicsItemGroup +{ +public: + PCBRectPad(QIlib::QIcadPcbPad* padNode,PCBContext* context); + PCBRectPad(QIlib::QIcadPcbPad* padNode,QPointF offset,PCBContext* context); + +private: + void init(QPointF offset); + QIlib::QIcadPcbPad* padNode; + QString name; + QPointF pos; + QRectF size; + QList layers; + PCBContext* context; +}; + +#endif // PCBRECTPAD_H diff --git a/test/PCBView/pcbvia.cpp b/test/PCBView/pcbvia.cpp new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbvia.cpp @@ -0,0 +1,60 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 "pcbvia.h" +#include + + +PCBVia::PCBVia(QIlib::QIcadPcbVia *viaNode, PCBContext *context) + :QGraphicsItemGroup(),viaNode(viaNode),context(context) +{ + this->init(QPointF(0.0,0.0)); +} + +PCBVia::PCBVia(QIlib::QIcadPcbVia *viaNode, QPointF offset, PCBContext *context) + :QGraphicsItemGroup(),viaNode(viaNode),context(context) +{ + this->init(offset); +} + +void PCBVia::init(QPointF offset) +{ + this->setCacheMode(QGraphicsItem::DeviceCoordinateCache); + offset-=QPointF(this->viaNode->size().width()/2,this->viaNode->size().height()/2); + + for(int i=0;iviaNode->layers().count();i++) + { + QGraphicsEllipseItem* ellipse = new QGraphicsEllipseItem(); + QPen pen = ellipse->pen(); + pen.setWidthF(0.01); + ellipse->setPen(pen); + QBrush brush = ellipse->brush(); + brush.setStyle(Qt::SolidPattern); + brush.setColor(context->layerColor(this->viaNode->layers().at(i))); + ellipse->setBrush(brush); + QRectF rec(this->viaNode->pos()+offset,this->viaNode->size()); + ellipse->setRect(rec); + ellipse->setZValue(-context->layer(viaNode->layers().at(i))); + this->addToGroup(ellipse); + } + + setOpacity(0.6); +} diff --git a/test/PCBView/pcbvia.h b/test/PCBView/pcbvia.h new file mode 100644 --- /dev/null +++ b/test/PCBView/pcbvia.h @@ -0,0 +1,46 @@ +/*------------------------------------------------------------------------------ +-- This file is a part of the Kicad Tools Software +-- Copyright (C) 2015, 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 PCBVIA_H +#define PCBVIA_H +#include +#include +#include +#include +#include +#include + +class PCBVia: public QGraphicsItemGroup +{ +public: + PCBVia(QIlib::QIcadPcbVia* viaNode,PCBContext* context); + PCBVia(QIlib::QIcadPcbVia* viaNode,QPointF offset,PCBContext* context); +private: + void init(QPointF offset); + QIlib::QIcadPcbVia* viaNode; + QString name; + QPointF pos; + QRectF size; + QList layers; + PCBContext* context; +}; + +#endif // PCBVIA_H diff --git a/test/dumpLispLikeFiles/dumpLispLikeFiles.pro b/test/dumpLispLikeFiles/dumpLispLikeFiles.pro --- a/test/dumpLispLikeFiles/dumpLispLikeFiles.pro +++ b/test/dumpLispLikeFiles/dumpLispLikeFiles.pro @@ -19,7 +19,9 @@ LIBS += -L../../bin -lQIlib FILESTOCOPY.files += \ $${PWD}/../testFiles/netlist1.net \ $${PWD}/../testFiles/netlist2.net \ - $${PWD}/../testFiles/pcb1.kicad_pcb + $${PWD}/../testFiles/pcb1.kicad_pcb\ + $${PWD}/../testFiles/pcb2.kicad_pcb\ + $${PWD}/../testFiles/pcb3.kicad_pcb FILESTOCOPY.path = $${DESTDIR} diff --git a/test/test.pro b/test/test.pro --- a/test/test.pro +++ b/test/test.pro @@ -3,7 +3,8 @@ TEMPLATE = subdirs CONFIG += ordered release -SUBDIRS += dumpLispLikeFiles +SUBDIRS += dumpLispLikeFiles \ + PCBView @@ -12,7 +13,8 @@ OTHER_FILES += \ testFiles/netlist1.net \ testFiles/netlist2.net \ testFiles/pcb1.kicad_pcb \ - testFiles/pcb2.kicad_pcb + testFiles/pcb2.kicad_pcb \ + testFiles/pcb3.kicad_pcb diff --git a/test/testFiles/pcb3.kicad_pcb b/test/testFiles/pcb3.kicad_pcb new file mode 100644 --- /dev/null +++ b/test/testFiles/pcb3.kicad_pcb @@ -0,0 +1,776 @@ +(kicad_pcb (version 4) (host pcbnew "(after 2015-mar-04 BZR unknown)-product") + + (general + (links 5) + (no_connects 0) + (area 125.75 89.15 189.850001 130.750001) + (thickness 1.6) + (drawings 6) + (tracks 11) + (zones 0) + (modules 6) + (nets 30) + ) + + (page A4) + (layers + (0 F.Cu signal) + (31 B.Cu signal) + (32 B.Adhes user) + (33 F.Adhes user) + (34 B.Paste user) + (35 F.Paste user) + (36 B.SilkS user) + (37 F.SilkS user) + (38 B.Mask user) + (39 F.Mask user) + (40 Dwgs.User user) + (41 Cmts.User user) + (42 Eco1.User user) + (43 Eco2.User user) + (44 Edge.Cuts user) + (45 Margin user) + (46 B.CrtYd user) + (47 F.CrtYd user) + (48 B.Fab user) + (49 F.Fab user) + ) + + (setup + (last_trace_width 0.25) + (trace_clearance 0.2) + (zone_clearance 0.508) + (zone_45_only yes) + (trace_min 0.2) + (segment_width 0.2) + (edge_width 0.1) + (via_size 0.6) + (via_drill 0.4) + (via_min_size 0.4) + (via_min_drill 0.3) + (uvia_size 0.3) + (uvia_drill 0.1) + (uvias_allowed no) + (uvia_min_size 0.2) + (uvia_min_drill 0.1) + (pcb_text_width 0.3) + (pcb_text_size 1.5 1.5) + (mod_edge_width 0.15) + (mod_text_size 1 1) + (mod_text_width 0.15) + (pad_size 1.5 1.5) + (pad_drill 0.6) + (pad_to_mask_clearance 0) + (aux_axis_origin 0 0) + (visible_elements FFFFFF7F) + (pcbplotparams + (layerselection 0x00030_80000001) + (usegerberextensions false) + (excludeedgelayer true) + (linewidth 0.100000) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15) + (hpglpenoverlay 2) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotinvisibletext false) + (padsonsilk false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "")) + ) + + (net 0 "") + (net 1 "Net-(R101-Pad1)") + (net 2 "Net-(R101-Pad2)") + (net 3 "Net-(R102-Pad1)") + (net 4 "Net-(R103-Pad1)") + (net 5 "Net-(U101-Pad2)") + (net 6 "Net-(U101-Pad3)") + (net 7 "Net-(U101-Pad4)") + (net 8 "Net-(U101-Pad5)") + (net 9 "Net-(U101-Pad6)") + (net 10 "Net-(U101-Pad7)") + (net 11 "Net-(U101-Pad9)") + (net 12 "Net-(U101-Pad11)") + (net 13 "Net-(U101-Pad12)") + (net 14 "Net-(U101-Pad13)") + (net 15 "Net-(U101-Pad14)") + (net 16 "Net-(U101-Pad15)") + (net 17 "Net-(U101-Pad16)") + (net 18 "Net-(U101-Pad17)") + (net 19 "Net-(U101-Pad18)") + (net 20 "Net-(U101-Pad19)") + (net 21 "Net-(U101-Pad20)") + (net 22 "Net-(U101-Pad21)") + (net 23 "Net-(U101-Pad22)") + (net 24 "Net-(U101-Pad23)") + (net 25 "Net-(U101-Pad24)") + (net 26 "Net-(U101-Pad25)") + (net 27 "Net-(U101-Pad26)") + (net 28 "Net-(U101-Pad27)") + (net 29 "Net-(U101-Pad28)") + + (net_class Default "Ceci est la Netclass par défaut" + (clearance 0.2) + (trace_width 0.25) + (via_dia 0.6) + (via_drill 0.4) + (uvia_dia 0.3) + (uvia_drill 0.1) + (add_net "Net-(R101-Pad1)") + (add_net "Net-(R101-Pad2)") + (add_net "Net-(R102-Pad1)") + (add_net "Net-(R103-Pad1)") + (add_net "Net-(U101-Pad11)") + (add_net "Net-(U101-Pad12)") + (add_net "Net-(U101-Pad13)") + (add_net "Net-(U101-Pad14)") + (add_net "Net-(U101-Pad15)") + (add_net "Net-(U101-Pad16)") + (add_net "Net-(U101-Pad17)") + (add_net "Net-(U101-Pad18)") + (add_net "Net-(U101-Pad19)") + (add_net "Net-(U101-Pad2)") + (add_net "Net-(U101-Pad20)") + (add_net "Net-(U101-Pad21)") + (add_net "Net-(U101-Pad22)") + (add_net "Net-(U101-Pad23)") + (add_net "Net-(U101-Pad24)") + (add_net "Net-(U101-Pad25)") + (add_net "Net-(U101-Pad26)") + (add_net "Net-(U101-Pad27)") + (add_net "Net-(U101-Pad28)") + (add_net "Net-(U101-Pad3)") + (add_net "Net-(U101-Pad4)") + (add_net "Net-(U101-Pad5)") + (add_net "Net-(U101-Pad6)") + (add_net "Net-(U101-Pad7)") + (add_net "Net-(U101-Pad9)") + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 5577DFA1) + (at 157 104.5 180) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /5577DF53) + (attr smd) + (fp_text reference R101 (at 0 -1.9 180) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 180) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(R101-Pad1)")) + (pad 2 smd rect (at 0.75 0 180) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(R101-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 5577DFA7) + (at 168 116 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /5577E050) + (attr smd) + (fp_text reference R102 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(R102-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(R101-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module Resistors_SMD:R_0603 (layer F.Cu) (tedit 5415CC62) (tstamp 5577DFAD) + (at 170.5 116 270) + (descr "Resistor SMD 0603, reflow soldering, Vishay (see dcrcw.pdf)") + (tags "resistor 0603") + (path /5577E07A) + (attr smd) + (fp_text reference R103 (at 0 -1.9 270) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value R (at 0 1.9 270) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -1.3 -0.8) (end 1.3 -0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start -1.3 -0.8) (end -1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 1.3 -0.8) (end 1.3 0.8) (layer F.CrtYd) (width 0.05)) + (fp_line (start 0.5 0.675) (end -0.5 0.675) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.5 -0.675) (end 0.5 -0.675) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(R103-Pad1)")) + (pad 2 smd rect (at 0.75 0 270) (size 0.5 0.9) (layers F.Cu F.Paste F.Mask) + (net 2 "Net-(R101-Pad2)")) + (model Resistors_SMD.3dshapes/R_0603.wrl + (at (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) + ) + + (module SMD_Packages:PLCC-28 (layer F.Cu) (tedit 0) (tstamp 5577DFCD) + (at 168 104.5) + (descr "Support CMS Plcc 28 pins") + (tags "CMS PLCC") + (path /5577DF13) + (attr smd) + (fp_text reference U101 (at -0.254 -7.874) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value AD390JD (at 0 7.62) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start -8.89 7.62) (end -7.62 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.62 8.89) (end 8.89 8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 8.89) (end 8.89 -8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.89 -8.89) (end -8.89 -8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.89 7.62) (end -8.89 -8.89) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 -4.064) (end 3.81 -4.064) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 -4.064) (end 3.81 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.81 3.81) (end -2.54 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 -4.064) (end -3.81 2.54) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.81 2.54) (end -2.54 3.81) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.715 0) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 1 "Net-(R101-Pad1)")) + (pad 2 smd rect (at -5.715 1.27) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 5 "Net-(U101-Pad2)")) + (pad 3 smd rect (at -5.715 2.54) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 6 "Net-(U101-Pad3)")) + (pad 4 smd rect (at -5.715 3.81) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 7 "Net-(U101-Pad4)")) + (pad 5 smd rect (at -3.81 5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 8 "Net-(U101-Pad5)")) + (pad 6 smd rect (at -2.54 5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 9 "Net-(U101-Pad6)")) + (pad 7 smd rect (at -1.27 5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 10 "Net-(U101-Pad7)")) + (pad 8 smd rect (at 0 5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 3 "Net-(R102-Pad1)")) + (pad 9 smd rect (at 1.27 5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 11 "Net-(U101-Pad9)")) + (pad 10 smd rect (at 2.54 5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 4 "Net-(R103-Pad1)")) + (pad 11 smd rect (at 3.81 5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 12 "Net-(U101-Pad11)")) + (pad 12 smd rect (at 5.715 3.81) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 13 "Net-(U101-Pad12)")) + (pad 13 smd rect (at 5.715 2.54) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 14 "Net-(U101-Pad13)")) + (pad 14 smd rect (at 5.715 1.27) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 15 "Net-(U101-Pad14)")) + (pad 15 smd rect (at 5.715 0) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 16 "Net-(U101-Pad15)")) + (pad 16 smd rect (at 5.715 -1.27) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 17 "Net-(U101-Pad16)")) + (pad 17 smd rect (at 5.715 -2.54) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 18 "Net-(U101-Pad17)")) + (pad 18 smd rect (at 5.715 -3.81) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 19 "Net-(U101-Pad18)")) + (pad 19 smd rect (at 3.81 -5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 20 "Net-(U101-Pad19)")) + (pad 20 smd rect (at 2.54 -5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 21 "Net-(U101-Pad20)")) + (pad 21 smd rect (at 1.27 -5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 22 "Net-(U101-Pad21)")) + (pad 22 smd rect (at 0 -5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 23 "Net-(U101-Pad22)")) + (pad 23 smd rect (at -1.27 -5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 24 "Net-(U101-Pad23)")) + (pad 24 smd rect (at -2.54 -5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 25 "Net-(U101-Pad24)")) + (pad 25 smd rect (at -3.81 -5.715) (size 0.762 2.032) (layers F.Cu F.Paste F.Mask) + (net 26 "Net-(U101-Pad25)")) + (pad 26 smd rect (at -5.715 -3.81) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 27 "Net-(U101-Pad26)")) + (pad 27 smd rect (at -5.715 -2.54) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 28 "Net-(U101-Pad27)")) + (pad 28 smd rect (at -5.715 -1.27) (size 2.032 0.762) (layers F.Cu F.Paste F.Mask) + (net 29 "Net-(U101-Pad28)")) + ) + + (module NF-Transformers_ETAL:NF-Transformer_P2781_ETAL (layer F.Cu) (tedit 0) (tstamp 557A29C0) + (at 188.5 83.25) + (descr "NF-Transformer, ETAL, P2781, SMD,") + (tags "NF-Transformer, ETAL, P2781, SMD,") + (attr smd) + (fp_text reference REF** (at 0 -7.00024) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value NF-Transformer_P2781_ETAL (at 0 7.50062) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 6.49986 4.50088) (end 6.49986 4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.49986 -4.50088) (end 6.49986 -4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.9591 3.83032) (end 3.83032 3.83032) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.98958 2.8194) (end 3.43916 2.3495) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.43916 2.3495) (end 3.43916 3.83032) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0193 2.30886) (end 2.25044 2.35966) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.25044 2.35966) (end 2.37998 2.55016) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.37998 2.55016) (end 2.4003 2.75844) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.4003 2.75844) (end 2.32918 2.89052) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.32918 2.89052) (end 2.159 2.97942) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.159 2.97942) (end 1.89992 2.98958) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.89992 2.98958) (end 1.66878 3.08864) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.66878 3.08864) (end 1.51892 3.3401) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.51892 3.3401) (end 1.52908 3.64998) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.52908 3.64998) (end 1.67894 3.7592) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.67894 3.7592) (end 1.8288 3.81) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.8288 3.81) (end 2.05994 3.83032) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.05994 3.83032) (end 2.28092 3.7592) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.28092 3.7592) (end 2.37998 3.57886) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.37998 3.57886) (end 2.39014 3.3782) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.39014 3.3782) (end 2.3495 3.21056) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.3495 3.21056) (end 2.23012 3.08864) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.23012 3.08864) (end 2.0193 3.0099) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0193 3.0099) (end 1.7907 2.97942) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.7907 2.97942) (end 1.651 2.89052) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.651 2.89052) (end 1.56972 2.6797) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.56972 2.6797) (end 1.6002 2.51968) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6002 2.51968) (end 1.6891 2.41046) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.6891 2.41046) (end 1.9304 2.32918) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.04064 2.31902) (end 1.02108 2.30886) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.02108 2.30886) (end 0.40894 3.83032) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.38938 2.51968) (end -1.24968 2.39014) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.24968 2.39014) (end -1.08966 2.32918) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.08966 2.32918) (end -0.83058 2.32918) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.83058 2.32918) (end -0.67056 2.39014) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.67056 2.39014) (end -0.51054 2.57048) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.51054 2.57048) (end -0.4699 2.75844) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.4699 2.75844) (end -0.51054 2.92862) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.51054 2.92862) (end -0.65024 3.0988) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.65024 3.0988) (end -1.45034 3.82016) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.45034 3.82016) (end -0.49022 3.83032) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.80924 3.85826) (end -2.8194 2.33934) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.8194 2.33934) (end -2.17932 2.35966) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.17932 2.35966) (end -1.99898 2.51968) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.99898 2.51968) (end -1.94056 2.80924) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.94056 2.80924) (end -1.99898 3.02006) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.99898 3.02006) (end -2.2098 3.12928) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.2098 3.12928) (end -2.44094 3.1496) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.44094 3.1496) (end -2.77114 3.12928) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.65938 -3.91668) (end 2.64922 -2.41808) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.64922 -2.41808) (end 3.36042 -2.41808) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.27 -2.82702) (end 1.92024 -2.82702) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.10998 -2.37744) (end 1.63068 -3.91668) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.63068 -3.91668) (end 2.13106 -2.40792) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.13106 -2.40792) (end 2.14884 -2.40792) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.40132 -3.8862) (end 0.40132 -2.41808) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.02032 -3.90652) (end 0.81026 -3.91668) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.17094 -3.16738) (end -0.71882 -3.16738) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.4699 -3.90652) (end -1.19888 -3.90652) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.19888 -3.90652) (end -1.19888 -2.39776) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.19888 -2.39776) (end -0.51054 -2.3876) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.9591 -2.41046) (end -2.09042 -2.42062) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.93878 -3.3909) (end -2.50952 -3.90906) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.50952 -3.90906) (end -2.49936 -2.43078) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.49986 -4.0005) (end -3.50012 -4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.49986 4.50088) (end -6.49986 4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.50012 -4.50088) (end -3.50012 4.50088) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.49986 -4.50088) (end -6.49986 -4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.49986 4.50088) (end -6.49986 4.50088) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.49986 -4.50088) (end 6.49986 -4.50088) (layer F.SilkS) (width 0.15)) + (pad 1 smd rect (at -5.53974 -2.54) (size 2.49936 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 2 smd rect (at -5.53974 0) (size 2.49936 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 3 smd rect (at -5.53974 2.54) (size 2.49936 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 4 smd rect (at 5.53974 2.54) (size 2.49936 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 5 smd rect (at 5.53974 0) (size 2.5019 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 6 smd rect (at 5.53974 -2.54) (size 2.49936 1.39954) (layers F.Cu F.Paste F.Mask)) + (pad 7 smd oval (at -1.99898 0 90) (size 3.50012 1.39954) (layers F.Adhes)) + (pad 7 smd oval (at 1.99898 0 90) (size 3.50012 1.39954) (layers F.Adhes)) + (model NF-Transformers_ETAL.3dshapes/NF-Transformer_P2781_ETAL.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 0)) + ) + ) + + (module NF-Transformers_ETAL:NF-Transformer_1-1_P1200_ETAL (layer F.Cu) (tedit 0) (tstamp 557A34AF) + (at 151.75 82) + (descr "NF-Transformer, 1:1, ETAL P1200,") + (tags "NF-Transformer, 1:1, ETAL P1200,") + (fp_text reference REF** (at -0.01016 -11.6205) (layer F.SilkS) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_text value NF-Transformer_1-1_P1200_ETAL (at -0.07112 12.05992) (layer F.Fab) + (effects (font (size 1 1) (thickness 0.15))) + ) + (fp_line (start 5.80136 0.44958) (end 6.79196 0.44958) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.79196 0.44958) (end 6.30174 1.05918) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.30174 1.05918) (end 6.61162 1.0795) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.61162 1.0795) (end 6.7818 1.27) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.7818 1.27) (end 6.82244 1.5494) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.82244 1.5494) (end 6.75132 1.8288) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.75132 1.8288) (end 6.5913 1.97866) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.5913 1.97866) (end 6.37032 2.00914) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.37032 2.00914) (end 6.18998 1.98882) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.18998 1.98882) (end 6.02996 1.9685) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.02996 1.9685) (end 5.8801 1.85928) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.23062 1.01854) (end -6.25094 2.03962) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.61924 0.32004) (end -7.04088 1.52908) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.04088 1.52908) (end -5.969 1.50876) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.59308 -5.58038) (end -5.58292 -5.62102) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.58292 -5.62102) (end -5.58292 -5.61086) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.10108 -7.21106) (end -6.40334 -7.2009) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.40334 -7.2009) (end -6.61162 -7.17042) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.61162 -7.17042) (end -6.74116 -7.05104) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.74116 -7.05104) (end -6.95198 -6.8199) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.95198 -6.8199) (end -6.98246 -6.53034) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.98246 -6.53034) (end -7.01294 -6.1214) (layer F.SilkS) (width 0.15)) + (fp_line (start -7.01294 -6.1214) (end -6.9215 -5.80136) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.9215 -5.80136) (end -6.76148 -5.67182) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.76148 -5.67182) (end -6.47192 -5.61086) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.47192 -5.61086) (end -6.28142 -5.6515) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.28142 -5.6515) (end -6.14172 -5.85216) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.14172 -5.85216) (end -6.1214 -6.1214) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.1214 -6.1214) (end -6.19252 -6.35) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.19252 -6.35) (end -6.39318 -6.53034) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.39318 -6.53034) (end -6.70306 -6.5405) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.70306 -6.5405) (end -6.8834 -6.47192) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.98932 -5.6007) (end 6.97992 -5.6007) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.95122 -6.56082) (end 6.47954 -7.05104) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.47954 -7.05104) (end 6.47954 -5.58038) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.90042 6.69036) (end 6.12902 6.78942) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.12902 6.78942) (end 6.25094 6.93928) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.25094 6.93928) (end 6.28904 7.13994) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.28904 7.13994) (end 6.28904 7.60984) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.28904 7.60984) (end 6.2611 7.8994) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.2611 7.8994) (end 6.18998 8.05942) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.18998 8.05942) (end 6.08076 8.17118) (layer F.SilkS) (width 0.15)) + (fp_line (start 6.08076 8.17118) (end 5.98932 8.21944) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.98932 8.21944) (end 5.8801 8.2296) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.8801 8.2296) (end 5.75056 8.17118) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.75056 8.17118) (end 5.61086 8.06958) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.61086 8.06958) (end 5.52958 7.87908) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.52958 7.87908) (end 5.4991 7.52094) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.4991 7.52094) (end 5.4991 7.26948) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.4991 7.26948) (end 5.53974 7.03072) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.53974 7.03072) (end 5.6388 6.88086) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.6388 6.88086) (end 5.75056 6.74878) (layer F.SilkS) (width 0.15)) + (fp_line (start 5.75056 6.74878) (end 5.85978 6.70052) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.42976 6.72084) (end 4.62026 6.7691) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.62026 6.7691) (end 4.81076 6.99008) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.81076 6.99008) (end 4.87934 7.29996) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.87934 7.29996) (end 4.86918 7.59968) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.86918 7.59968) (end 4.79044 7.9502) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.79044 7.9502) (end 4.6609 8.15086) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.6609 8.15086) (end 4.4704 8.2296) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.4704 8.2296) (end 4.24942 8.17118) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.24942 8.17118) (end 4.09956 7.98068) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.09956 7.98068) (end 4.03098 7.69112) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.03098 7.69112) (end 4.02082 7.31012) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.02082 7.31012) (end 4.09956 7.00024) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.09956 7.00024) (end 4.21894 6.77926) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.21894 6.77926) (end 4.37896 6.72084) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.51968 6.90118) (end 2.57048 6.84022) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.57048 6.84022) (end 2.77114 6.72084) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.77114 6.72084) (end 2.96926 6.70052) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.96926 6.70052) (end 3.18008 6.731) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.18008 6.731) (end 3.3401 6.85038) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.3401 6.85038) (end 3.429 7.04088) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.429 7.04088) (end 3.38074 7.29996) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.38074 7.29996) (end 2.55016 8.23976) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.55016 8.23976) (end 3.43916 8.23976) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.06934 8.20928) (end 1.96088 8.21944) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.06934 7.18058) (end 1.5494 6.74116) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.5494 6.74116) (end 1.55956 8.21944) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.34036 8.20928) (end -0.35052 6.731) (layer F.SilkS) (width 0.15)) + (fp_line (start -0.35052 6.731) (end 0.1397 6.74116) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.1397 6.74116) (end 0.3302 6.78942) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.3302 6.78942) (end 0.51054 6.97992) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.51054 6.97992) (end 0.53086 7.22122) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.53086 7.22122) (end 0.4699 7.3406) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.4699 7.3406) (end 0.37084 7.43966) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.37084 7.43966) (end 0.24892 7.50062) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.24892 7.50062) (end -0.26924 7.50062) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.72034 6.65988) (end -2.72034 8.20928) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.72034 8.20928) (end -1.99898 8.2296) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.04114 7.79018) (end -3.51028 7.79018) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.26974 8.2296) (end -3.7592 6.70052) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.7592 6.70052) (end -3.24104 8.20928) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.44068 6.70052) (end -4.63042 6.70052) (layer F.SilkS) (width 0.15)) + (fp_line (start -4.98094 8.20928) (end -4.98094 6.74116) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.55066 7.4295) (end -6.10108 7.4295) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.86994 6.70052) (end -6.61924 6.72084) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.61924 6.72084) (end -6.61924 8.24992) (layer F.SilkS) (width 0.15)) + (fp_line (start -6.61924 8.24992) (end -5.92074 8.24992) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.40716 -6.77926) (end -0.7874 -6.79958) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.82042 -6.85038) (end 1.4605 -6.85038) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.09906 -6.91896) (end 0.02032 -6.91896) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.03048 -7.71906) (end -0.02032 -7.69874) (layer F.SilkS) (width 0.15)) + (fp_line (start 0.67056 -7.87908) (end 1.17094 -8.30072) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.17094 -8.30072) (end 1.17094 -6.85038) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.56972 -7.82066) (end -1.03124 -8.30072) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.03124 -8.30072) (end -1.03124 -6.78942) (layer F.SilkS) (width 0.15)) + (fp_line (start 4.82092 -4.0005) (end 3.0607 -4.04114) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.0607 -4.04114) (end 2.75082 -3.98018) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.75082 -3.98018) (end 2.42062 -3.78968) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.42062 -3.78968) (end 2.11074 -3.50012) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.11074 -3.50012) (end 1.98882 -3.10896) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.98882 -3.10896) (end 2.0193 -2.74066) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0193 -2.74066) (end 2.16916 -2.35966) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.16916 -2.35966) (end 2.42062 -2.16916) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.42062 -2.16916) (end 2.88036 -1.96088) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.88036 -1.96088) (end 3.12928 -1.96088) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.12928 -1.96088) (end 2.64922 -1.86944) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.64922 -1.86944) (end 2.14884 -1.5494) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.14884 -1.5494) (end 2.00914 -1.23952) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.00914 -1.23952) (end 1.98882 -0.889) (layer F.SilkS) (width 0.15)) + (fp_line (start 1.98882 -0.889) (end 2.11074 -0.5207) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.11074 -0.5207) (end 2.4003 -0.21082) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.4003 -0.21082) (end 2.72034 -0.02032) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.72034 -0.02032) (end 3.15976 0) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.15976 0) (end 2.6797 0.07112) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.6797 0.07112) (end 2.32918 0.26924) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.32918 0.26924) (end 2.11074 0.55118) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.11074 0.55118) (end 2.00914 0.87122) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.00914 0.87122) (end 2.0193 1.22936) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.0193 1.22936) (end 2.16916 1.57988) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.16916 1.57988) (end 2.43078 1.81102) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.43078 1.81102) (end 2.74066 1.97104) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.74066 1.97104) (end 2.97942 2.02946) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.97942 2.02946) (end 3.2004 2.02946) (layer F.SilkS) (width 0.15)) + (fp_line (start 3.2004 2.02946) (end 2.46888 2.14884) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.46888 2.14884) (end 2.17932 2.4003) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.17932 2.4003) (end 2.03962 2.76098) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.03962 2.76098) (end 2.00914 3.08102) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.00914 3.08102) (end 2.11074 3.44932) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.11074 3.44932) (end 2.30886 3.68046) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.30886 3.68046) (end 2.5908 3.92938) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.5908 3.92938) (end 2.96926 4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start 2.96926 4.0005) (end 4.89966 4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start -5.00126 -4.0005) (end -2.99974 -4.0005) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.99974 -4.0005) (end -2.61874 -3.9497) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.61874 -3.9497) (end -2.32918 -3.73126) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.32918 -3.73126) (end -2.10058 -3.50012) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.10058 -3.50012) (end -2.04978 -3.2893) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.04978 -3.2893) (end -1.98882 -2.94894) (layer F.SilkS) (width 0.15)) + (fp_line (start -1.98882 -2.94894) (end -2.04978 -2.51968) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.04978 -2.51968) (end -2.23012 -2.32918) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.23012 -2.32918) (end -2.44094 -2.18948) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.44094 -2.18948) (end -2.84988 -2.00914) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.84988 -2.00914) (end -3.0099 -2.00914) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.0099 -2.00914) (end -2.72034 -1.92024) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.72034 -1.92024) (end -2.4003 -1.81102) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.4003 -1.81102) (end -2.14122 -1.62052) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.14122 -1.62052) (end -2.0701 -1.3208) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0701 -1.3208) (end -2.02946 -0.98044) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.02946 -0.98044) (end -2.0701 -0.6604) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0701 -0.6604) (end -2.2098 -0.42926) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.2098 -0.42926) (end -2.30886 -0.2794) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.30886 -0.2794) (end -2.55016 -0.11938) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.55016 -0.11938) (end -2.78892 -0.02032) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.78892 -0.02032) (end -2.93878 -0.02032) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.93878 -0.02032) (end -2.66954 0.07112) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.66954 0.07112) (end -2.42062 0.20066) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.42062 0.20066) (end -2.16916 0.43942) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.16916 0.43942) (end -2.0701 0.6604) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.0701 0.6604) (end -2.00914 0.9398) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.00914 0.9398) (end -2.02946 1.20904) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.02946 1.20904) (end -2.10058 1.48082) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.10058 1.48082) (end -2.28092 1.6891) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.28092 1.6891) (end -2.44094 1.8288) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.44094 1.8288) (end -2.61874 1.92024) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.61874 1.92024) (end -2.94894 1.96088) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.94894 1.96088) (end -2.68986 2.03962) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.68986 2.03962) (end -2.42062 2.19964) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.42062 2.19964) (end -2.23012 2.44094) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.23012 2.44094) (end -2.10058 2.64922) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.10058 2.64922) (end -2.04978 2.88036) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.04978 2.88036) (end -2.04978 3.1496) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.04978 3.1496) (end -2.14122 3.46964) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.14122 3.46964) (end -2.2606 3.68046) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.2606 3.68046) (end -2.46888 3.88112) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.46888 3.88112) (end -2.74066 3.92938) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.74066 3.92938) (end -2.94894 3.98018) (layer F.SilkS) (width 0.15)) + (fp_line (start -2.94894 3.98018) (end -3.0099 3.95986) (layer F.SilkS) (width 0.15)) + (fp_line (start -3.0099 3.95986) (end -4.93014 3.9497) (layer F.SilkS) (width 0.15)) + (fp_line (start 0 -5.99948) (end 0 5.99948) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.99922 -8.99922) (end -8.99922 -8.99922) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.99922 -8.99922) (end -8.99922 8.99922) (layer F.SilkS) (width 0.15)) + (fp_line (start -8.99922 8.99922) (end 8.99922 8.99922) (layer F.SilkS) (width 0.15)) + (fp_line (start 8.99922 8.99922) (end 8.99922 -8.99922) (layer F.SilkS) (width 0.15)) + (pad 6 thru_hole circle (at -6.35 -3.81) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 4 thru_hole circle (at -6.35 3.81) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 1 thru_hole circle (at 6.35 -3.81) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (pad 3 thru_hole circle (at 6.35 3.81) (size 1.524 1.524) (drill 0.8128) (layers *.Cu *.Mask F.SilkS)) + (model NF-Transformers_ETAL.3dshapes/NF-Transformer_1-1_P1200_ETAL.wrl + (at (xyz 0 0 0)) + (scale (xyz 0.3937 0.3937 0.3937)) + (rotate (xyz 0 0 0)) + ) + ) + + (target plus (at 126 82.75) (size 5) (width 0.1) (layer Edge.Cuts)) + (target plus (at 198.25 93.75) (size 5) (width 0.1) (layer Edge.Cuts)) + (dimension 7.5 (width 0.3) (layer F.SilkS) + (gr_text "7,500 mm" (at 168 90.65) (layer F.SilkS) + (effects (font (size 1.5 1.5) (thickness 0.3))) + ) + (feature1 (pts (xy 171.75 98.75) (xy 171.75 89.3))) + (feature2 (pts (xy 164.25 98.75) (xy 164.25 89.3))) + (crossbar (pts (xy 164.25 92) (xy 171.75 92))) + (arrow1a (pts (xy 171.75 92) (xy 170.623496 92.586421))) + (arrow1b (pts (xy 171.75 92) (xy 170.623496 91.413579))) + (arrow2a (pts (xy 164.25 92) (xy 165.376504 92.586421))) + (arrow2b (pts (xy 164.25 92) (xy 165.376504 91.413579))) + ) + (gr_text hello (at 181.75 101.25) (layer F.SilkS) + (effects (font (size 1.5 1.5) (thickness 0.3))) + ) + (gr_arc (start 185.5 106) (end 189.75 107.5) (angle 174.5962086) (layer F.SilkS) (width 0.2)) + (gr_circle (center 183 113) (end 186 115.75) (layer F.SilkS) (width 0.2)) + + (via (at 159.75 103.5) (size 0.6) (drill 0.4) (layers F.Cu B.Cu) (net 1)) + (segment (start 160.036365 103.786365) (end 159.75 103.5) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 160.036365 104.5) (end 160.036365 103.786365) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 157.75 104.5) (end 160.036365 104.5) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 160.036365 104.5) (end 162.285 104.5) (width 0.25) (layer F.Cu) (net 1)) + (segment (start 161.25 116.75) (end 170.5 116.75) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 156.25 111.75) (end 161.25 116.75) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 156.25 104.5) (end 156.25 111.75) (width 0.25) (layer F.Cu) (net 2)) + (segment (start 168 115.25) (end 168 110.215) (width 0.25) (layer F.Cu) (net 3)) + (segment (start 170.5 110.255) (end 170.54 110.215) (width 0.25) (layer F.Cu) (net 4)) + (segment (start 170.5 115.25) (end 170.5 110.255) (width 0.25) (layer F.Cu) (net 4)) + + (zone (net 2) (net_name "Net-(R101-Pad2)") (layer F.Cu) (tstamp 0) (hatch edge 0.508) + (priority 1) + (connect_pads (clearance 0.508)) + (min_thickness 0.254) + (fill yes (arc_segments 32) (thermal_gap 0.508) (thermal_bridge_width 0.508) (smoothing fillet) (radius 0.2)) + (polygon + (pts + (xy 195 119.75) (xy 179.75 114.75) (xy 192.5 127.25) (xy 133.75 130) (xy 137.630288 117.262531) + (xy 124.5 106.5) (xy 142.197095 102.27149) (xy 145.25 92.25) (xy 169.536242 105.674556) (xy 182.5 110.25) + (xy 181.034023 112.030113) + ) + ) + (filled_polygon + (pts + (xy 193.120387 118.902543) (xy 193.118602 118.91578) (xy 193.114419 118.928464) (xy 193.107978 118.940164) (xy 193.099499 118.950484) + (xy 193.089272 118.959071) (xy 193.07764 118.965636) (xy 193.065001 118.969955) (xy 193.051785 118.97188) (xy 193.038439 118.971347) + (xy 193.019677 118.967062) (xy 180.597879 114.894341) (xy 180.542689 114.881941) (xy 180.480035 114.880102) (xy 180.418177 114.890227) + (xy 180.35938 114.911951) (xy 180.305798 114.944475) (xy 180.25939 114.98661) (xy 180.221859 115.036812) (xy 180.194574 115.093243) + (xy 180.178539 115.15384) (xy 180.174337 115.216379) (xy 180.182126 115.278576) (xy 180.201617 115.33815) (xy 180.232099 115.39292) + (xy 180.268515 115.436202) (xy 192.079136 127.015241) (xy 192.092092 127.030665) (xy 192.098855 127.042889) (xy 192.103146 127.056188) + (xy 192.104803 127.070062) (xy 192.103764 127.083994) (xy 192.100067 127.09747) (xy 192.093852 127.109985) (xy 192.085349 127.121071) + (xy 192.074874 127.130318) (xy 192.062819 127.13738) (xy 192.049632 127.141996) (xy 192.029695 127.144875) (xy 171.585 128.10186) + (xy 171.585 117.062542) (xy 171.585 117.03375) (xy 171.42625 116.875) (xy 170.627 116.875) (xy 170.627 117.47625) + (xy 170.78575 117.635) (xy 170.887458 117.635) (xy 171.012542 117.635) (xy 171.135223 117.610597) (xy 171.250785 117.56273) + (xy 171.354789 117.493237) (xy 171.443237 117.404789) (xy 171.51273 117.300785) (xy 171.560597 117.185223) (xy 171.585 117.062542) + (xy 171.585 128.10186) (xy 170.373 128.158592) (xy 170.373 117.47625) (xy 170.373 116.875) (xy 169.57375 116.875) + (xy 169.415 117.03375) (xy 169.415 117.062542) (xy 169.439403 117.185223) (xy 169.48727 117.300785) (xy 169.556763 117.404789) + (xy 169.645211 117.493237) (xy 169.749215 117.56273) (xy 169.864777 117.610597) (xy 169.987458 117.635) (xy 170.112542 117.635) + (xy 170.21425 117.635) (xy 170.373 117.47625) (xy 170.373 128.158592) (xy 169.085 128.218882) (xy 169.085 117.062542) + (xy 169.085 117.03375) (xy 168.92625 116.875) (xy 168.127 116.875) (xy 168.127 117.47625) (xy 168.28575 117.635) + (xy 168.387458 117.635) (xy 168.512542 117.635) (xy 168.635223 117.610597) (xy 168.750785 117.56273) (xy 168.854789 117.493237) + (xy 168.943237 117.404789) (xy 169.01273 117.300785) (xy 169.060597 117.185223) (xy 169.085 117.062542) (xy 169.085 128.218882) + (xy 167.873 128.275614) (xy 167.873 117.47625) (xy 167.873 116.875) (xy 167.07375 116.875) (xy 166.915 117.03375) + (xy 166.915 117.062542) (xy 166.939403 117.185223) (xy 166.98727 117.300785) (xy 167.056763 117.404789) (xy 167.145211 117.493237) + (xy 167.249215 117.56273) (xy 167.364777 117.610597) (xy 167.487458 117.635) (xy 167.612542 117.635) (xy 167.71425 117.635) + (xy 167.873 117.47625) (xy 167.873 128.275614) (xy 156.125 128.82552) (xy 156.125 105.42625) (xy 156.125 104.627) + (xy 156.125 104.373) (xy 156.125 103.57375) (xy 155.96625 103.415) (xy 155.937458 103.415) (xy 155.814777 103.439403) + (xy 155.699215 103.48727) (xy 155.595211 103.556763) (xy 155.506763 103.645211) (xy 155.43727 103.749215) (xy 155.389403 103.864777) + (xy 155.365 103.987458) (xy 155.365 104.112542) (xy 155.365 104.21425) (xy 155.52375 104.373) (xy 156.125 104.373) + (xy 156.125 104.627) (xy 155.52375 104.627) (xy 155.365 104.78575) (xy 155.365 104.887458) (xy 155.365 105.012542) + (xy 155.389403 105.135223) (xy 155.43727 105.250785) (xy 155.506763 105.354789) (xy 155.595211 105.443237) (xy 155.699215 105.51273) + (xy 155.814777 105.560597) (xy 155.937458 105.585) (xy 155.96625 105.585) (xy 156.125 105.42625) (xy 156.125 128.82552) + (xy 134.033461 129.859593) (xy 134.013543 129.858618) (xy 134.000107 129.855327) (xy 133.98754 129.84954) (xy 133.976304 129.84147) + (xy 133.966808 129.83141) (xy 133.959398 129.819728) (xy 133.954344 129.80685) (xy 133.951832 129.793246) (xy 133.951953 129.779412) + (xy 133.955915 129.759868) (xy 137.714318 117.4225) (xy 137.72476 117.373854) (xy 137.727122 117.318776) (xy 137.720211 117.264083) + (xy 137.704224 117.211325) (xy 137.679612 117.161996) (xy 137.647074 117.117494) (xy 137.611387 117.082826) (xy 124.896799 106.661033) + (xy 124.883072 106.647477) (xy 124.87544 106.636479) (xy 124.869962 106.624264) (xy 124.866825 106.611248) (xy 124.866135 106.597877) + (xy 124.867917 106.584609) (xy 124.87211 106.571897) (xy 124.87857 106.560172) (xy 124.887079 106.549833) (xy 124.897344 106.541238) + (xy 124.909013 106.534678) (xy 124.927282 106.528481) (xy 142.12052 102.420362) (xy 142.169092 102.404198) (xy 142.219015 102.377269) + (xy 142.26354 102.342131) (xy 142.301336 102.299835) (xy 142.331266 102.251651) (xy 142.350369 102.204158) (xy 145.29788 92.528636) + (xy 145.304847 92.511428) (xy 145.311723 92.500526) (xy 145.320419 92.491016) (xy 145.330662 92.483196) (xy 145.34213 92.477312) + (xy 145.354456 92.473552) (xy 145.367255 92.472034) (xy 145.380118 92.472806) (xy 145.392642 92.475844) (xy 145.409626 92.483346) + (xy 160.630928 100.897131) (xy 160.630928 101.071) (xy 160.639303 101.174043) (xy 160.688156 101.330278) (xy 160.656081 101.401611) + (xy 160.630928 101.579) (xy 160.630928 102.341) (xy 160.639303 102.444043) (xy 160.688156 102.600278) (xy 160.656081 102.671611) + (xy 160.630928 102.849) (xy 160.630928 103.183571) (xy 160.57955 103.05892) (xy 160.478079 102.906193) (xy 160.348875 102.776084) + (xy 160.19686 102.673549) (xy 160.027825 102.602493) (xy 159.848207 102.565623) (xy 159.664849 102.564343) (xy 159.484733 102.598701) + (xy 159.314722 102.66739) (xy 159.161291 102.767793) (xy 159.030283 102.896086) (xy 158.926689 103.047381) (xy 158.854454 103.215916) + (xy 158.816331 103.395272) (xy 158.813771 103.578617) (xy 158.84339 103.74) (xy 158.552421 103.74) (xy 158.477326 103.626566) + (xy 158.340792 103.510558) (xy 158.177389 103.437081) (xy 158 103.411928) (xy 157.5 103.411928) (xy 157.396957 103.420303) + (xy 157.225959 103.473773) (xy 157.076566 103.572674) (xy 157.002788 103.659505) (xy 156.993237 103.645211) (xy 156.904789 103.556763) + (xy 156.800785 103.48727) (xy 156.685223 103.439403) (xy 156.562542 103.415) (xy 156.53375 103.415) (xy 156.375 103.57375) + (xy 156.375 104.373) (xy 156.397 104.373) (xy 156.397 104.627) (xy 156.375 104.627) (xy 156.375 105.42625) + (xy 156.53375 105.585) (xy 156.562542 105.585) (xy 156.685223 105.560597) (xy 156.800785 105.51273) (xy 156.904789 105.443237) + (xy 156.993237 105.354789) (xy 157.001823 105.341938) (xy 157.022674 105.373434) (xy 157.159208 105.489442) (xy 157.322611 105.562919) + (xy 157.5 105.588072) (xy 158 105.588072) (xy 158.103043 105.579697) (xy 158.274041 105.526227) (xy 158.423434 105.427326) + (xy 158.539442 105.290792) (xy 158.553288 105.26) (xy 160.036365 105.26) (xy 160.649219 105.26) (xy 160.630928 105.389) + (xy 160.630928 106.151) (xy 160.639303 106.254043) (xy 160.688156 106.410278) (xy 160.656081 106.481611) (xy 160.630928 106.659) + (xy 160.630928 107.421) (xy 160.639303 107.524043) (xy 160.688156 107.680278) (xy 160.656081 107.751611) (xy 160.630928 107.929) + (xy 160.630928 108.691) (xy 160.639303 108.794043) (xy 160.692773 108.965041) (xy 160.791674 109.114434) (xy 160.928208 109.230442) + (xy 161.091611 109.303919) (xy 161.269 109.329072) (xy 163.170928 109.329072) (xy 163.170928 111.231) (xy 163.179303 111.334043) + (xy 163.232773 111.505041) (xy 163.331674 111.654434) (xy 163.468208 111.770442) (xy 163.631611 111.843919) (xy 163.809 111.869072) + (xy 164.571 111.869072) (xy 164.674043 111.860697) (xy 164.830278 111.811843) (xy 164.901611 111.843919) (xy 165.079 111.869072) + (xy 165.841 111.869072) (xy 165.944043 111.860697) (xy 166.100278 111.811843) (xy 166.171611 111.843919) (xy 166.349 111.869072) + (xy 167.111 111.869072) (xy 167.214043 111.860697) (xy 167.24 111.85258) (xy 167.24 114.447578) (xy 167.126566 114.522674) + (xy 167.010558 114.659208) (xy 166.937081 114.822611) (xy 166.911928 115) (xy 166.911928 115.5) (xy 166.920303 115.603043) + (xy 166.973773 115.774041) (xy 167.072674 115.923434) (xy 167.159505 115.997211) (xy 167.145211 116.006763) (xy 167.056763 116.095211) + (xy 166.98727 116.199215) (xy 166.939403 116.314777) (xy 166.915 116.437458) (xy 166.915 116.46625) (xy 167.07375 116.625) + (xy 167.873 116.625) (xy 167.873 116.603) (xy 168.127 116.603) (xy 168.127 116.625) (xy 168.92625 116.625) + (xy 169.085 116.46625) (xy 169.085 116.437458) (xy 169.060597 116.314777) (xy 169.01273 116.199215) (xy 168.943237 116.095211) + (xy 168.854789 116.006763) (xy 168.841938 115.998176) (xy 168.873434 115.977326) (xy 168.989442 115.840792) (xy 169.062919 115.677389) + (xy 169.088072 115.5) (xy 169.088072 115) (xy 169.079697 114.896957) (xy 169.026227 114.725959) (xy 168.927326 114.576566) + (xy 168.790792 114.460558) (xy 168.76 114.446711) (xy 168.76 111.85078) (xy 168.889 111.869072) (xy 169.651 111.869072) + (xy 169.74 111.861838) (xy 169.74 114.447578) (xy 169.626566 114.522674) (xy 169.510558 114.659208) (xy 169.437081 114.822611) + (xy 169.411928 115) (xy 169.411928 115.5) (xy 169.420303 115.603043) (xy 169.473773 115.774041) (xy 169.572674 115.923434) + (xy 169.659505 115.997211) (xy 169.645211 116.006763) (xy 169.556763 116.095211) (xy 169.48727 116.199215) (xy 169.439403 116.314777) + (xy 169.415 116.437458) (xy 169.415 116.46625) (xy 169.57375 116.625) (xy 170.373 116.625) (xy 170.373 116.603) + (xy 170.627 116.603) (xy 170.627 116.625) (xy 171.42625 116.625) (xy 171.585 116.46625) (xy 171.585 116.437458) + (xy 171.560597 116.314777) (xy 171.51273 116.199215) (xy 171.443237 116.095211) (xy 171.354789 116.006763) (xy 171.341938 115.998176) + (xy 171.373434 115.977326) (xy 171.489442 115.840792) (xy 171.562919 115.677389) (xy 171.588072 115.5) (xy 171.588072 115) + (xy 171.579697 114.896957) (xy 171.526227 114.725959) (xy 171.427326 114.576566) (xy 171.290792 114.460558) (xy 171.26 114.446711) + (xy 171.26 111.845108) (xy 171.429 111.869072) (xy 172.191 111.869072) (xy 172.294043 111.860697) (xy 172.465041 111.807227) + (xy 172.614434 111.708326) (xy 172.730442 111.571792) (xy 172.803919 111.408389) (xy 172.829072 111.231) (xy 172.829072 109.329072) + (xy 174.731 109.329072) (xy 174.834043 109.320697) (xy 175.005041 109.267227) (xy 175.154434 109.168326) (xy 175.270442 109.031792) + (xy 175.343919 108.868389) (xy 175.369072 108.691) (xy 175.369072 107.929) (xy 175.363957 107.866074) (xy 182.182469 110.272608) + (xy 182.200617 110.281048) (xy 182.211858 110.289199) (xy 182.221337 110.299345) (xy 182.228705 110.311115) (xy 182.233692 110.324073) + (xy 182.236113 110.337746) (xy 182.23588 110.351628) (xy 182.233002 110.36521) (xy 182.227583 110.377996) (xy 182.216399 110.394595) + (xy 181.085029 111.768399) (xy 181.052943 111.816173) (xy 181.028317 111.874998) (xy 181.015554 111.93748) (xy 181.015138 112.001253) + (xy 181.027085 112.063898) (xy 181.050943 112.12304) (xy 181.085807 112.17644) (xy 181.130357 112.222074) (xy 181.177773 112.254683) + (xy 193.078176 118.832796) (xy 193.094089 118.843619) (xy 193.103567 118.85303) (xy 193.111157 118.864021) (xy 193.1166 118.876216) + (xy 193.119712 118.889205) (xy 193.120387 118.902543) + ) + ) + ) +)