2014-02-04 21:16:32 +00:00
|
|
|
import code
|
|
|
|
import unittest
|
2014-02-08 23:21:47 +00:00
|
|
|
import os
|
2014-02-04 21:16:32 +00:00
|
|
|
import pcbnew
|
|
|
|
import pdb
|
2014-02-08 23:21:47 +00:00
|
|
|
import tempfile
|
|
|
|
|
2014-02-04 21:16:32 +00:00
|
|
|
|
2014-02-08 00:02:29 +00:00
|
|
|
from pcbnew import *
|
2014-02-04 21:16:32 +00:00
|
|
|
|
2015-02-15 13:31:47 +00:00
|
|
|
|
|
|
|
BACK_COPPER = 'Back_Copper'
|
|
|
|
B_CU = 'B.Cu'
|
|
|
|
NEW_NAME = 'My_Fancy_Layer_Name'
|
|
|
|
|
|
|
|
|
2014-02-04 21:16:32 +00:00
|
|
|
class TestBoardClass(unittest.TestCase):
|
|
|
|
|
|
|
|
def setUp(self):
|
2014-02-08 00:02:29 +00:00
|
|
|
self.pcb = LoadBoard("data/complex_hierarchy.kicad_pcb")
|
2014-02-08 23:21:47 +00:00
|
|
|
self.TITLE="Test Board"
|
|
|
|
self.COMMENT1="For load/save test"
|
|
|
|
self.FILENAME=tempfile.mktemp()+".kicad_pcb"
|
2014-02-08 00:02:29 +00:00
|
|
|
|
2014-02-04 21:16:32 +00:00
|
|
|
def test_pcb_find_module(self):
|
2020-11-13 23:06:31 +00:00
|
|
|
module = self.pcb.FindFootprintByReference('P1')
|
2014-02-04 21:16:32 +00:00
|
|
|
self.assertEqual(module.GetReference(),'P1')
|
|
|
|
|
2014-02-08 00:02:29 +00:00
|
|
|
def test_pcb_get_track_count(self):
|
|
|
|
pcb = BOARD()
|
|
|
|
|
2019-05-31 02:30:28 +00:00
|
|
|
self.assertEqual(pcb.Tracks().size(),0)
|
2014-02-08 00:02:29 +00:00
|
|
|
|
|
|
|
track0 = TRACK(pcb)
|
|
|
|
pcb.Add(track0)
|
2019-05-31 02:30:28 +00:00
|
|
|
self.assertEqual(pcb.Tracks().size(),1)
|
2014-02-08 00:02:29 +00:00
|
|
|
|
|
|
|
track1 = TRACK(pcb)
|
|
|
|
pcb.Add(track1)
|
2019-05-31 02:30:28 +00:00
|
|
|
self.assertEqual(pcb.Tracks().size(),2)
|
2014-02-08 00:02:29 +00:00
|
|
|
|
2014-02-04 21:16:32 +00:00
|
|
|
def test_pcb_bounding_box(self):
|
2014-02-08 00:02:29 +00:00
|
|
|
pcb = BOARD()
|
|
|
|
track = TRACK(pcb)
|
|
|
|
pcb.Add(track)
|
|
|
|
|
|
|
|
track.SetStart(wxPointMM(10.0, 10.0))
|
|
|
|
track.SetEnd(wxPointMM(20.0, 30.0))
|
|
|
|
|
|
|
|
track.SetWidth(FromMM(0.5))
|
|
|
|
|
|
|
|
#!!! THIS FAILS? == 0.0 x 0.0 ??
|
|
|
|
#height, width = ToMM(pcb.ComputeBoundingBox().GetSize())
|
|
|
|
bounding_box = pcb.ComputeBoundingBox()
|
|
|
|
height, width = ToMM(bounding_box.GetSize())
|
|
|
|
|
2018-06-12 15:21:03 +00:00
|
|
|
margin = 0 # margin around bounding boxes (currently 0)
|
|
|
|
self.assertAlmostEqual(width, (30-10) + 0.5 + margin, 2)
|
|
|
|
self.assertAlmostEqual(height, (20-10) + 0.5 + margin, 2)
|
2014-02-08 00:02:29 +00:00
|
|
|
|
|
|
|
def test_pcb_get_pad(self):
|
|
|
|
pcb = BOARD()
|
2020-11-13 23:10:45 +00:00
|
|
|
module = FOOTPRINT(pcb)
|
2014-02-08 00:02:29 +00:00
|
|
|
pcb.Add(module)
|
2020-11-14 01:06:05 +00:00
|
|
|
pad = PAD(module)
|
2014-02-08 00:02:29 +00:00
|
|
|
module.Add(pad)
|
|
|
|
|
2016-11-25 13:52:34 +00:00
|
|
|
pad.SetShape(PAD_SHAPE_OVAL)
|
2014-02-08 00:02:29 +00:00
|
|
|
pad.SetSize(wxSizeMM(2.0, 3.0))
|
|
|
|
pad.SetPosition(wxPointMM(0,0))
|
2016-11-25 13:52:34 +00:00
|
|
|
|
2018-05-23 07:17:35 +00:00
|
|
|
#Update the footprint bounding box, because
|
|
|
|
#the new pad must be inside the bounding box to be located
|
|
|
|
module.CalculateBoundingBox()
|
|
|
|
|
2014-02-08 00:02:29 +00:00
|
|
|
# easy case
|
|
|
|
p1 = pcb.GetPad(wxPointMM(0,0))
|
|
|
|
|
|
|
|
# top side
|
|
|
|
p2 = pcb.GetPad(wxPointMM(0.9,0.0))
|
2014-02-04 21:16:32 +00:00
|
|
|
|
2014-02-08 00:02:29 +00:00
|
|
|
# bottom side
|
|
|
|
p3 = pcb.GetPad(wxPointMM(0,1.4))
|
2014-02-04 21:16:32 +00:00
|
|
|
|
2014-02-08 00:02:29 +00:00
|
|
|
# TODO: get pad == p1 evaluated as true instead
|
|
|
|
# of relying in the internal C++ object pointer
|
|
|
|
self.assertEqual(pad.this, p1.this)
|
|
|
|
self.assertEqual(pad.this, p2.this)
|
|
|
|
self.assertEqual(pad.this, p3.this)
|
2014-02-04 21:16:32 +00:00
|
|
|
|
2014-02-08 23:21:47 +00:00
|
|
|
def test_pcb_save_and_load(self):
|
|
|
|
pcb = BOARD()
|
|
|
|
pcb.GetTitleBlock().SetTitle(self.TITLE)
|
2019-08-22 23:55:39 +00:00
|
|
|
pcb.GetTitleBlock().SetComment(0,self.COMMENT1)
|
2014-02-08 23:21:47 +00:00
|
|
|
result = SaveBoard(self.FILENAME,pcb)
|
|
|
|
self.assertTrue(result)
|
2016-11-25 13:52:34 +00:00
|
|
|
|
2014-02-08 23:21:47 +00:00
|
|
|
pcb2 = LoadBoard(self.FILENAME)
|
2014-02-10 09:15:48 +00:00
|
|
|
self.assertNotEqual(pcb2,None)
|
2014-02-08 23:21:47 +00:00
|
|
|
|
|
|
|
tb = pcb2.GetTitleBlock()
|
|
|
|
self.assertEqual(tb.GetTitle(),self.TITLE)
|
2019-08-22 23:55:39 +00:00
|
|
|
self.assertEqual(tb.GetComment(0),self.COMMENT1)
|
2014-02-08 23:21:47 +00:00
|
|
|
|
|
|
|
os.remove(self.FILENAME)
|
|
|
|
|
2015-02-15 13:31:47 +00:00
|
|
|
def test_pcb_layer_name_set_get(self):
|
|
|
|
pcb = BOARD()
|
|
|
|
pcb.SetLayerName(31, BACK_COPPER)
|
|
|
|
self.assertEqual(pcb.GetLayerName(31), BACK_COPPER)
|
|
|
|
|
|
|
|
def test_pcb_layer_name_set_get(self):
|
|
|
|
pcb = BOARD()
|
|
|
|
pcb.SetLayerName(31, BACK_COPPER)
|
|
|
|
self.assertEqual(pcb.GetLayerName(31), BACK_COPPER)
|
|
|
|
|
|
|
|
def test_pcb_layer_id_get(self):
|
|
|
|
pcb = BOARD()
|
|
|
|
b_cu_id = pcb.GetLayerID(B_CU)
|
|
|
|
pcb.SetLayerName(b_cu_id, NEW_NAME)
|
|
|
|
|
|
|
|
# ensure we can get the ID for the new name
|
|
|
|
self.assertEqual(pcb.GetLayerID(NEW_NAME), b_cu_id)
|
|
|
|
|
|
|
|
# ensure we can get to the ID via the STD name too
|
|
|
|
self.assertEqual(pcb.GetLayerID(B_CU), b_cu_id)
|
|
|
|
|
2021-01-25 05:51:44 +00:00
|
|
|
def test_footprint_properties(self):
|
|
|
|
pcb = LoadBoard("data/custom_fields.kicad_pcb")
|
|
|
|
footprint = pcb.FindFootprintByReference('J1')
|
|
|
|
expected_properties = {
|
|
|
|
'Sheet file': 'custom_fields.kicad_sch',
|
|
|
|
'Sheet name': '',
|
|
|
|
'myfield': 'myvalue'
|
|
|
|
}
|
|
|
|
self.assertEquals(footprint.GetProperties(), expected_properties)
|
|
|
|
self.assertEquals(footprint.GetProperty('myfield'), 'myvalue')
|
|
|
|
self.assertEquals(footprint.HasProperty('myfield'), True)
|
|
|
|
self.assertEquals(footprint.HasProperty('abcd'), False)
|
|
|
|
footprint.SetProperty('abcd', 'efgh')
|
|
|
|
self.assertEquals(footprint.HasProperty('abcd'), True)
|
|
|
|
self.assertEquals(footprint.GetProperty('abcd'), 'efgh')
|
|
|
|
|
2014-02-04 21:16:32 +00:00
|
|
|
#def test_interactive(self):
|
|
|
|
# code.interact(local=locals())
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|
2016-11-25 13:52:34 +00:00
|
|
|
|