Commit 9ebe983e authored by Miguel Angel Ajo's avatar Miguel Angel Ajo

* cleanups: board.i board_item.i separated from pcbnew.i

* dlist.i empty list fixed (Segfault)
* units.i: FromMM FromMils ToMM ToMils
* added a little example (listPcb.py) that shows most items in a board
parent 9398eb97
iterator for NETCLASSES (NETCLASS) see class_netclass.h
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 NBEE Embedded Systems, Miguel Angel Ajo <miguelangel@nbee.es>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
*
* 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, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file board.i
* @brief Specific BOARD extensions and templates
*/
%extend BOARD
{
%pythoncode
{
def GetModules(self): return self.m_Modules
def GetDrawings(self): return self.m_Drawings
def GetTracks(self): return self.m_Track
def GetSegZones(self): return self.m_Zone
def GetFullRatsnest(self): return self.m_FullRatsnest
def GetLocalRatsnest(self): return self.m_LocalRatsnest
def GetNetClasses(self): return self.m_NetClasses
def GetCurrentNetClassName(self): return self.m_CurrentNetClassName
def GetViasDimensionsList(self): return self.m_ViasDimensionsList
def GetTrackWidthList(self): return self.m_TrackWidthList
def Save(self,filename):
return pcbnew.SaveBoard(filename,self)
}
}
// this is to help python with the * accessor of DLIST templates
%rename(Get) operator BOARD_ITEM*;
%rename(Get) operator TRACK*;
%rename(Get) operator D_PAD*;
%rename(Get) operator MODULE*;
%rename(Get) operator SEGZONE*;
// we must translate C++ templates to scripting languages
%template(BOARD_ITEM_List) DLIST<BOARD_ITEM>;
%template(MODULE_List) DLIST<MODULE>;
%template(SEGZONE_List) DLIST<SEGZONE>;
%template(TRACK_List) DLIST<TRACK>;
%template(PAD_List) DLIST<D_PAD>;
// std::vector templates
%template(VIA_DIMENSION_Vector) std::vector<VIA_DIMENSION>;
%template (RASTNET_Vector) std::vector<RATSNEST_ITEM>;
%extend DRAWSEGMENT
{
%pythoncode
{
def GetShapeStr(self):
return self.ShowShape(self.GetShape())
}
}
\ No newline at end of file
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 Miguel Angel Ajo <miguelangel@nbee.es>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
*
* 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, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file board_item.i
* @brief board_item helpers, mainly for casting down to all child classes
*/
/* Cast downs from EDA_ITEM/BOARD_ITEM to childs */
%inline
{
BOARD_ITEM* Cast_to_BOARD_ITEM(EDA_ITEM* base) { return dynamic_cast<BOARD_ITEM*>(base); }
}
%extend BOARD_ITEM
{
TEXTE_PCB* Cast_to_TEXTE_PCB() { return dynamic_cast<TEXTE_PCB*>(self); }
DIMENSION* Cast_to_DIMENSION() { return dynamic_cast<DIMENSION*>(self); }
MODULE* Cast_to_MODULE() { return dynamic_cast<MODULE*>(self); }
TEXTE_MODULE* Cast_to_TEXTE_MODULE(){ return dynamic_cast<TEXTE_MODULE*>(self); }
DRAWSEGMENT* Cast_to_DRAWSEGMENT() { return dynamic_cast<DRAWSEGMENT*>(self); }
MARKER_PCB* Cast_to_MARKER_PCB() { return dynamic_cast<MARKER_PCB*>(self); }
BOARD* Cast_to_BOARD() { return dynamic_cast<BOARD*>(self); }
EDGE_MODULE* Cast_to_EDGE_MODULE() { return dynamic_cast<EDGE_MODULE*>(self); }
D_PAD* Cast_to_D_PAD() { return dynamic_cast<D_PAD*>(self); }
TRACK* Cast_to_TRACK() { return dynamic_cast<TRACK*>(self); }
SEGZONE* Cast_to_SEGZONE() { return dynamic_cast<SEGZONE*>(self); }
SEGVIA* Cast_to_SEGVIA() { return dynamic_cast<SEGVIA*>(self); }
%pythoncode
{
def Cast(self):
ct = self.GetClass()
if ct=="PTEXT":
return self.Cast_to_TEXTE_PCB()
elif ct=="BOARD":
return self.Cast_to_BOARD()
elif ct=="DIMENSION":
return self.Cast_to_DIMENSION()
elif ct=="DRAWSEGMENT":
return self.Cast_to_DRAWSEGMENT()
elif ct=="MGRAPHIC":
return self.Cast_to_EDGE_MODULE()
elif ct=="MODULE":
return self.Cast_to_MODULE()
elif ct=="PAD":
return self.Cast_to_D_PAD()
elif ct=="MTEXT":
return self.Cast_to_TEXTE_MODULE()
elif ct=="ZONE":
return self.Cast_to_SEGZONE()
elif ct=="VIA":
return self.Cast_to_SEGVIA()
elif ct=="TRACK":
return self.Cast_to_TRACK()
else:
return None
}
}
import sys
from pcbnew import *
filename=sys.argv[1]
pcb = LoadBoard(filename)
#ToUnits = ToMM
#FromUnits = FromMM
ToUnits=ToMils
FromUnits=FromMils
print "LISTING VIAS:"
for item in pcb.GetTracks():
if type(item) is SEGVIA:
pos = item.GetPosition()
drill = item.GetDrillValue()
width = item.GetWidth()
print " * Via: %s - %f/%f "%(ToUnits(pos),ToUnits(drill),ToUnits(width))
elif type(item) is TRACK:
start = item.GetStart()
end = item.GetEnd()
width = item.GetWidth()
print " * Track: %s to %s, width %f" % (ToUnits(start),ToUnits(end),ToUnits(width))
else:
print "Unknown type %s" % type(item)
print ""
print "LISTING DRAWINGS:"
for item in pcb.GetDrawings():
if type(item) is TEXTE_PCB:
print "* Text: '%s' at %s"%(item.GetText(),item.GetPosition())
elif type(item) is DRAWSEGMENT:
print "* Drawing: %s"%item.GetShapeStr() # dir(item)
else:
print type(item)
print ""
print "LIST MODULES:"
for module in pcb.GetModules():
print "* Module: %s at %s"%(module.GetReference(),ToUnits(module.GetPosition()))
print ""
print "LIST ZONES:"
for zone in pcb.GetSegZones():
print zone
print ""
print "RATSNEST:",len(pcb.GetFullRatsnest())
print dir(pcb.GetNetClasses())
\ No newline at end of file
...@@ -85,76 +85,7 @@ ...@@ -85,76 +85,7 @@
%include <class_netinfo.h> %include <class_netinfo.h>
%include <layers_id_colors_and_visibility.h> %include <layers_id_colors_and_visibility.h>
%include "board_item.i"
/* the IO_ERROR exception handler, not working yet... */
%exception
{
try {
$function
}
catch (IO_ERROR e) {
PyErr_SetString(PyExc_IOError,"IO error");
return NULL;
}
}
/* Cast downs from EDA_ITEM/BOARD_ITEM to childs */
%inline
{
BOARD_ITEM* Cast_to_BOARD_ITEM(EDA_ITEM* base) { return dynamic_cast<BOARD_ITEM*>(base); }
}
%extend BOARD_ITEM
{
TEXTE_PCB* Cast_to_TEXTE_PCB() { return dynamic_cast<TEXTE_PCB*>(self); }
DIMENSION* Cast_to_DIMENSION() { return dynamic_cast<DIMENSION*>(self); }
MODULE* Cast_to_MODULE() { return dynamic_cast<MODULE*>(self); }
TEXTE_MODULE* Cast_to_TEXTE_MODULE(){ return dynamic_cast<TEXTE_MODULE*>(self); }
DRAWSEGMENT* Cast_to_DRAWSEGMENT() { return dynamic_cast<DRAWSEGMENT*>(self); }
MARKER_PCB* Cast_to_MARKER_PCB() { return dynamic_cast<MARKER_PCB*>(self); }
BOARD* Cast_to_BOARD() { return dynamic_cast<BOARD*>(self); }
EDGE_MODULE* Cast_to_EDGE_MODULE() { return dynamic_cast<EDGE_MODULE*>(self); }
D_PAD* Cast_to_D_PAD() { return dynamic_cast<D_PAD*>(self); }
TRACK* Cast_to_TRACK() { return dynamic_cast<TRACK*>(self); }
SEGZONE* Cast_to_SEGZONE() { return dynamic_cast<SEGZONE*>(self); }
SEGVIA* Cast_to_SEGVIA() { return dynamic_cast<SEGVIA*>(self); }
%pythoncode
{
def Cast(self):
ct = self.GetClass()
if ct=="PTEXT":
return self.Cast_to_TEXTE_PCB()
elif ct=="BOARD":
return self.Cast_to_BOARD()
elif ct=="DIMENSION":
return self.Cast_to_DIMENSION()
elif ct=="DRAWSEGMENT":
return self.Cast_to_DRAWSEGMENT()
elif ct=="MGRAPHIC":
return self.Cast_to_EDGE_MODULE()
elif ct=="MODULE":
return self.Cast_to_MODULE()
elif ct=="PAD":
return self.Cast_to_D_PAD()
elif ct=="MTEXT":
return self.Cast_to_TEXTE_MODULE()
elif ct=="ZONE":
return self.Cast_to_SEGZONE()
elif ct=="VIA":
return self.Cast_to_SEGVIA()
elif ct=="TRACK":
return self.Cast_to_TRACK()
else:
return None
}
}
%include <pcbnew_scripting_helpers.h> %include <pcbnew_scripting_helpers.h>
...@@ -163,27 +94,7 @@ ...@@ -163,27 +94,7 @@
%include <kicad_plugin.h> %include <kicad_plugin.h>
#endif #endif
/* this is to help python with the * accessor of DLIST templates */
%rename(Get) operator BOARD_ITEM*;
%rename(Get) operator TRACK*;
%rename(Get) operator D_PAD*;
%rename(Get) operator MODULE*;
BOARD *GetBoard();
// we must translate C++ templates to scripting languages
%template(BOARD_ITEM_List) DLIST<BOARD_ITEM>;
%template(MODULE_List) DLIST<MODULE>;
%template(TRACK_List) DLIST<TRACK>;
%template(PAD_List) DLIST<D_PAD>;
%template(MARKER_Vector) std::vector<MARKER_PCB*>;
%template(ZONE_CONTAINER_Vector) std::vector<ZONE_CONTAINER*>;
%template(VIA_DIMENSION_Vector) std::vector<VIA_DIMENSION>;
%include "board.i"
%include "units.i"
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#ifndef SWIG #ifndef SWIG
void ScriptingSetPcbEditFrame(PCB_EDIT_FRAME *aPCBEdaFrame); void ScriptingSetPcbEditFrame(PCB_EDIT_FRAME *aPCBEdaFrame);
BOARD *GetBoard();
#endif #endif
BOARD* LoadBoard(wxString aFileName); BOARD* LoadBoard(wxString aFileName);
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2012 NBEE Embedded Systems, Miguel Angel Ajo <miguelangel@nbee.es>
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
*
* 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, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
/**
* @file units.i
* @brief unit conversion code
*/
// Unit conversion, must be conditionally adapter to the new
// nanometer mode that will be soon included in pcbnew
%pythoncode
{
def ToMM(iu):
if type(iu) is int:
return iu * 0.00254
elif type(iu) is wxPoint:
return tuple(map(ToMM,iu))
def FromMM(mm):
if type(iu) is int:
return iu / 0.00254
elif type(iu) is wxPoint:
return tuple(map(FromMM,iu))
def ToMils(iu):
if type(iu) is int:
return iu / 10.0
elif type(iu) is wxPoint:
return tuple(map(ToMils,iu))
def FromMils(mils):
if type(iu) is int:
return mils*10.0
elif type(iu) is wxPoint:
return tuple(map(FromMils,iu))
}
\ No newline at end of file
/* DLIST python iteration code, to allow standard iteration over DLIST */
%extend DLIST
{
%pythoncode
{
class DLISTIter:
def __init__(self,aList):
self.last = aList
def next(self):
item = self.last
try:
item = item.Get()
except:
pass
if item is None:
raise StopIteration
else:
ret = None
# first item in list has "Get" as a DLIST
try:
ret = self.last.Get()
except:
ret = self.last #next items just not..
self.last = self.last.Next()
# when the iterated object can be casted down in inheritance, just do it..
if 'Cast' in dir(ret):
ret = ret.Cast()
return ret
def __iter__(self):
return self.DLISTIter(self)
}
}
...@@ -60,47 +60,39 @@ ...@@ -60,47 +60,39 @@
using namespace std; using namespace std;
#include <class_title_block.h> #include <class_title_block.h>
#include <class_colors_design_settings.h> #include <class_colors_design_settings.h>
#include <class_marker_base.h>
%} %}
/* all the wx wrappers for wxString, wxPoint, wxRect, wxChar .. */ /* all the wx wrappers for wxString, wxPoint, wxRect, wxChar .. */
%include <wx.i> %include <wx.i>
/* exception handling */
/* the IO_ERROR exception handler, not working yet... */
%exception
{
try {
$function
}
catch (IO_ERROR e) {
PyErr_SetString(PyExc_IOError,"IO error");
return NULL;
}
}
%include <dlist.h> %include <dlist.h>
%include <base_struct.h> %include <base_struct.h>
%include <common.h> %include <common.h>
%include <class_title_block.h> %include <class_title_block.h>
%include <class_colors_design_settings.h> %include <class_colors_design_settings.h>
%include <class_marker_base.h>
%extend DLIST %include "dlist.i"
{
%pythoncode
{
class DLISTIter:
def __init__(self,aList):
self.last = aList
def next(self):
if self.last is None:
raise StopIteration
else:
ret = None
# first item in list has "Get" as a DLIST
try:
ret = self.last.Get()
except:
ret = self.last #next items just not..
self.last = self.last.Next()
return ret
def __iter__(self):
return self.DLISTIter(self)
} /* std template mappings */
}
%template(intVector) std::vector<int>; %template(intVector) std::vector<int>;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment