Add 2 python action plugins in demos
This commit is contained in:
parent
b66cb871e6
commit
75b08e49cf
|
@ -0,0 +1,247 @@
|
|||
# add_automatic_border.py
|
||||
#
|
||||
# Copyright (C) 2017 KiCad Developers, see CHANGELOG.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, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
#
|
||||
#
|
||||
|
||||
from pcbnew import *
|
||||
import re
|
||||
import datetime
|
||||
|
||||
|
||||
class add_automatic_border( ActionPlugin ):
|
||||
"""
|
||||
add_automatic_border: An other sample plugin as an example of ActionPlugin
|
||||
Build PCB edges to include all PCB elements
|
||||
How to use:
|
||||
- add all your modules/track/area/text...
|
||||
- Call the plugin
|
||||
- An including PCB edge will be created automaticaly
|
||||
"""
|
||||
|
||||
def defaults( self ):
|
||||
"""
|
||||
Method defaults must be redefined
|
||||
self.name should be the menu label to use
|
||||
self.category should be the category (not yet used)
|
||||
self.description should be a comprehensive description
|
||||
of the plugin
|
||||
"""
|
||||
self.name = "Add or update automatic PCB edges"
|
||||
self.category = "Modify PCB"
|
||||
self.description = "Automaticaly add or update edges on an existing PCB"
|
||||
# Offset between existing elements and edge we will add/update (fixed at 2.54mm)
|
||||
self.offset = FromMM( 2.54 )
|
||||
# Attach to a grid step (fixed at 2.54mm)
|
||||
self.grid = FromMM( 2.54 )
|
||||
|
||||
def min( self, a, b ):
|
||||
"""
|
||||
Method min: Found min between a and b even is one is None
|
||||
"""
|
||||
if a is None:
|
||||
return b
|
||||
if b is None:
|
||||
return a
|
||||
if a < b:
|
||||
return a
|
||||
return b
|
||||
|
||||
def max( self, a, b ):
|
||||
"""
|
||||
Method max: Found max between a and b even is one is None
|
||||
"""
|
||||
if a is None:
|
||||
return b
|
||||
if b is None:
|
||||
return a
|
||||
if a > b:
|
||||
return a
|
||||
return b
|
||||
|
||||
def Run( self ):
|
||||
"""
|
||||
Method Run is called by Action menu
|
||||
"""
|
||||
pcb = GetBoard()
|
||||
# Find including area on min/max x/y
|
||||
min_x = None
|
||||
max_x = None
|
||||
min_y = None
|
||||
max_y = None
|
||||
|
||||
# Enum all area
|
||||
for i in range( pcb.GetAreaCount() ):
|
||||
min_x = self.min( min_x, pcb.GetArea( i ).GetBoundingBox().GetX() )
|
||||
min_y = self.min( min_y, pcb.GetArea( i ).GetBoundingBox().GetY() )
|
||||
max_x = self.max( max_x, \
|
||||
pcb.GetArea( i ).GetBoundingBox().GetX() \
|
||||
+ pcb.GetArea( i ).GetBoundingBox().GetWidth() )
|
||||
max_y = self.max( max_y, \
|
||||
pcb.GetArea( i ).GetBoundingBox().GetY() \
|
||||
+ pcb.GetArea( i ).GetBoundingBox().GetHeight() )
|
||||
|
||||
# Same with track
|
||||
for track in pcb.GetTracks():
|
||||
min_x = self.min( min_x, track.GetStart().x )
|
||||
min_y = self.min( min_y, track.GetStart().y )
|
||||
max_x = self.max( max_x, track.GetEnd().x )
|
||||
max_y = self.max( max_y, track.GetEnd().y )
|
||||
|
||||
min_x = self.min( min_x, track.GetEnd().x )
|
||||
min_y = self.min( min_y, track.GetEnd().y )
|
||||
max_x = self.max( max_x, track.GetStart().x )
|
||||
max_y = self.max( max_y, track.GetStart().y )
|
||||
|
||||
# Variable to store PCB edges we found
|
||||
west = None
|
||||
north = None
|
||||
east = None
|
||||
south = None
|
||||
|
||||
for draw in pcb.GetDrawings():
|
||||
edge_candidate = False
|
||||
# Detect if current drawing is a PCB edge
|
||||
# and a candicate for north/south/east or west
|
||||
if draw.GetClass() == 'DRAWSEGMENT' \
|
||||
and draw.GetLayer() == Edge_Cuts:
|
||||
# Try candicate for east/west ?
|
||||
if draw.GetStart().x == draw.GetEnd().x:
|
||||
if west is None and east is None:
|
||||
west = draw
|
||||
edge_candidate = True
|
||||
elif west is None: # east is not none
|
||||
if draw.GetStart().x < east.GetStart().x:
|
||||
west = draw
|
||||
edge_candidate = True
|
||||
else:
|
||||
west = east
|
||||
east = draw
|
||||
edge_candidate = True
|
||||
elif east is None: # west is not none
|
||||
if draw.GetStart().x > west.GetStart().x:
|
||||
east = draw
|
||||
edge_candidate = True
|
||||
else:
|
||||
east = west
|
||||
west = draw
|
||||
edge_candidate = True
|
||||
else:
|
||||
None # west and east are already found...
|
||||
|
||||
# Try candicate for north/south ?
|
||||
if draw.GetStart().y == draw.GetEnd().y:
|
||||
if north is None and south is None:
|
||||
north = draw
|
||||
edge_candidate = True
|
||||
elif north is None: # south is not none
|
||||
if draw.GetStart().y < south.GetStart().y:
|
||||
north = draw
|
||||
edge_candidate = True
|
||||
else:
|
||||
north = south
|
||||
south = draw
|
||||
edge_candidate = True
|
||||
elif south is None: # north is not none
|
||||
if draw.GetStart().y > north.GetStart().y:
|
||||
south = draw
|
||||
edge_candidate = True
|
||||
else:
|
||||
south = north
|
||||
north = draw
|
||||
edge_candidate = True
|
||||
else:
|
||||
None # north and south are already found...
|
||||
# Not a edge candidate: use it to find including edges
|
||||
if not edge_candidate:
|
||||
bbox = draw.GetBoundingBox()
|
||||
min_x = self.min( min_x, bbox.GetX() )
|
||||
min_y = self.min( min_y, bbox.GetY() )
|
||||
max_x = self.max( max_x, bbox.GetX() + bbox.GetWidth() )
|
||||
max_y = self.max( max_y, bbox.GetY() + bbox.GetHeight() )
|
||||
|
||||
# Same with modules: Find including area
|
||||
for module in pcb.GetModules():
|
||||
bbox = module.GetBoundingBox()
|
||||
min_x = self.min( min_x, bbox.GetX() )
|
||||
min_y = self.min( min_y, bbox.GetY() )
|
||||
max_x = self.max( max_x, bbox.GetX() + bbox.GetWidth() )
|
||||
max_y = self.max( max_y, bbox.GetY() + bbox.GetHeight() )
|
||||
|
||||
# Add a space between including area and edge (3mm)
|
||||
min_x = min_x - self.offset
|
||||
min_y = min_y - self.offset
|
||||
max_x = max_x + self.offset
|
||||
max_y = max_y + self.offset
|
||||
|
||||
# Fix on the defined grid
|
||||
min_x = min_x - (min_x % self.grid)
|
||||
min_y = min_y - (min_y % self.grid)
|
||||
if ( max_x % self.grid ) != 0:
|
||||
max_x = max_x - (max_x % self.grid) + self.grid
|
||||
if ( max_y % self.grid ) != 0:
|
||||
max_y = max_y - (max_y % self.grid) + self.grid
|
||||
|
||||
# Add or update all edges
|
||||
need_add = False
|
||||
if west is None:
|
||||
need_add = True
|
||||
west = DRAWSEGMENT()
|
||||
west.SetLayer( Edge_Cuts )
|
||||
|
||||
west.SetStart( wxPoint( min_x, min_y ) )
|
||||
west.SetEnd( wxPoint( min_x, max_y ) )
|
||||
if need_add:
|
||||
pcb.Add( west )
|
||||
|
||||
need_add = False
|
||||
if north is None:
|
||||
need_add = True
|
||||
north = DRAWSEGMENT()
|
||||
north.SetLayer( Edge_Cuts )
|
||||
|
||||
north.SetStart( wxPoint( min_x, min_y ) )
|
||||
north.SetEnd( wxPoint( max_x, min_y ) )
|
||||
if need_add:
|
||||
pcb.Add( north )
|
||||
|
||||
need_add = False
|
||||
if east is None:
|
||||
need_add = True
|
||||
east = DRAWSEGMENT()
|
||||
east.SetLayer( Edge_Cuts )
|
||||
|
||||
east.SetStart( wxPoint( max_x, min_y ) )
|
||||
east.SetEnd( wxPoint( max_x, max_y ) )
|
||||
if need_add:
|
||||
pcb.Add( east )
|
||||
|
||||
need_add = False
|
||||
if south is None:
|
||||
need_add = True
|
||||
south = DRAWSEGMENT()
|
||||
south.SetLayer( Edge_Cuts )
|
||||
|
||||
south.SetStart( wxPoint( min_x, max_y ) )
|
||||
south.SetEnd( wxPoint( max_x, max_y ) )
|
||||
if need_add:
|
||||
pcb.Add( south )
|
||||
|
||||
|
||||
# Register the action
|
||||
add_automatic_border().register()
|
|
@ -0,0 +1,59 @@
|
|||
# text_by_date.py
|
||||
#
|
||||
# Copyright (C) 2017 KiCad Developers, see CHANGELOG.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, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
# MA 02110-1301, USA.
|
||||
#
|
||||
#
|
||||
|
||||
import pcbnew
|
||||
import re
|
||||
import datetime
|
||||
|
||||
|
||||
class text_by_date( pcbnew.ActionPlugin ):
|
||||
"""
|
||||
test_by_date: A sample plugin as an example of ActionPlugin
|
||||
Add the date to any text field of the board where the content is '$date$'
|
||||
How to use:
|
||||
- Add a text on your board with the content '$date$'
|
||||
- Call the plugin
|
||||
- Automaticaly the date will be added to the text (format YYYY-MM-DD)
|
||||
"""
|
||||
|
||||
def defaults( self ):
|
||||
"""
|
||||
Method defaults must be redefined
|
||||
self.name should be the menu label to use
|
||||
self.category should be the category (not yet used)
|
||||
self.description should be a comprehensive description
|
||||
of the plugin
|
||||
"""
|
||||
self.name = "Add date on PCB"
|
||||
self.category = "Modify PCB"
|
||||
self.description = "Automaticaly add date on an existing PCB"
|
||||
|
||||
def Run( self ):
|
||||
pcb = pcbnew.GetBoard()
|
||||
for draw in pcb.m_Drawings:
|
||||
if draw.GetClass() == 'PTEXT':
|
||||
txt = re.sub( "\$date\$ [0-9]{4}-[0-9]{2}-[0-9]{2}",
|
||||
"$date$", draw.GetText() )
|
||||
if txt == "$date$":
|
||||
draw.SetText( "$date$ %s"%datetime.date.today() )
|
||||
|
||||
|
||||
text_by_date().register()
|
Loading…
Reference in New Issue