mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-04-20 15:51:41 +00:00
Make ARCs accessible from python
This commit is contained in:
parent
375cd12258
commit
cc6df515a1
3
.gitignore
vendored
3
.gitignore
vendored
@ -117,8 +117,9 @@ CMakeSettings.json
|
||||
i18n_status.svg
|
||||
i18n_status.csv
|
||||
|
||||
# Project local settings files (in demos and qa tests)
|
||||
# Project local settings files and backups (in demos and qa tests)
|
||||
*.kicad_prl
|
||||
*-backups
|
||||
|
||||
# Don't actually ignore any of these files, since we need them in the tree
|
||||
!resources/linux/icons/hicolor/**/**/*
|
||||
|
@ -94,6 +94,20 @@ HANDLE_EXCEPTIONS(BOARD::TracksInNetBetweenPoints)
|
||||
return
|
||||
%}
|
||||
}
|
||||
%extend std::deque<TRACK *>
|
||||
{
|
||||
%pythoncode
|
||||
%{
|
||||
def __iter__(self):
|
||||
it = self.iterator()
|
||||
try:
|
||||
while True:
|
||||
item = it.next() # throws StopIteration when iterator reached the end.
|
||||
yield item.Cast()
|
||||
except StopIteration:
|
||||
return
|
||||
%}
|
||||
}
|
||||
|
||||
%extend BOARD
|
||||
{
|
||||
|
@ -62,6 +62,7 @@ class FP_SHAPE;
|
||||
class PAD;
|
||||
class TRACK;
|
||||
class VIA;
|
||||
class ARC;
|
||||
class ZONE;
|
||||
class FP_ZONE;
|
||||
class PCB_TARGET;
|
||||
@ -87,6 +88,7 @@ static FP_SHAPE* Cast_to_FP_SHAPE( BOARD_ITEM* );
|
||||
static PAD* Cast_to_PAD( BOARD_ITEM* );
|
||||
static TRACK* Cast_to_TRACK( BOARD_ITEM* );
|
||||
static VIA* Cast_to_VIA( BOARD_ITEM* );
|
||||
static ARC* Cast_to_ARC( BOARD_ITEM* );
|
||||
static ZONE* Cast_to_ZONE( BOARD_ITEM* );
|
||||
static FP_ZONE* Cast_to_FP_ZONE( BOARD_ITEM* );
|
||||
static PCB_TARGET* Cast_to_PCB_TARGET( BOARD_ITEM* );
|
||||
@ -112,6 +114,7 @@ static FP_SHAPE* Cast_to_FP_SHAPE( BOARD_ITEM* );
|
||||
static PAD* Cast_to_PAD( BOARD_ITEM* );
|
||||
static TRACK* Cast_to_TRACK( BOARD_ITEM* );
|
||||
static VIA* Cast_to_VIA( BOARD_ITEM* );
|
||||
static ARC* Cast_to_ARC( BOARD_ITEM* );
|
||||
static ZONE* Cast_to_ZONE( BOARD_ITEM* );
|
||||
static FP_ZONE* Cast_to_FP_ZONE( BOARD_ITEM* );
|
||||
static PCB_TARGET* Cast_to_PCB_TARGET( BOARD_ITEM* );
|
||||
@ -153,6 +156,8 @@ static PCB_TARGET* Cast_to_PCB_TARGET( BOARD_ITEM* );
|
||||
return Cast_to_VIA(self)
|
||||
elif ct=="TRACK":
|
||||
return Cast_to_TRACK(self)
|
||||
elif ct=="ARC":
|
||||
return Cast_to_ARC(self)
|
||||
elif ct=="PCB_TARGET":
|
||||
return Cast_to_PCB_TARGET(self)
|
||||
elif ct=="ZONE":
|
||||
@ -200,6 +205,7 @@ static FP_SHAPE* Cast_to_FP_SHAPE( BOARD_ITEM* self ) {
|
||||
static PAD* Cast_to_PAD( BOARD_ITEM* self ) { return dynamic_cast<PAD*>(self); }
|
||||
static TRACK* Cast_to_TRACK( BOARD_ITEM* self ) { return dynamic_cast<TRACK*>(self); }
|
||||
static VIA* Cast_to_VIA( BOARD_ITEM* self ) { return dynamic_cast<VIA*>(self); }
|
||||
static ARC* Cast_to_ARC( BOARD_ITEM* self ) { return dynamic_cast<ARC*>(self); }
|
||||
static ZONE* Cast_to_ZONE( BOARD_ITEM* self ) { return dynamic_cast<ZONE*>(self); }
|
||||
static FP_ZONE* Cast_to_FP_ZONE( BOARD_ITEM* self ) { return dynamic_cast<FP_ZONE*>(self); }
|
||||
static PCB_TARGET* Cast_to_PCB_TARGET( BOARD_ITEM* self ) { return dynamic_cast<PCB_TARGET*>(self); }
|
||||
|
qa/data/tracks_arcs_vias.kicad_pcb
Normal file
LOADING design file
175
qa/data/tracks_arcs_vias.kicad_pro
Normal file
175
qa/data/tracks_arcs_vias.kicad_pro
Normal file
@ -0,0 +1,175 @@
|
||||
{
|
||||
"board": {
|
||||
"design_settings": {
|
||||
"defaults": {
|
||||
"board_outline_line_width": 0.09999999999999999,
|
||||
"copper_line_width": 0.19999999999999998,
|
||||
"copper_text_italic": false,
|
||||
"copper_text_size_h": 1.5,
|
||||
"copper_text_size_v": 1.5,
|
||||
"copper_text_thickness": 0.3,
|
||||
"copper_text_upright": false,
|
||||
"courtyard_line_width": 0.049999999999999996,
|
||||
"dimension_precision": 4,
|
||||
"dimension_units": 3,
|
||||
"dimensions": {
|
||||
"arrow_length": 1270000,
|
||||
"extension_offset": 500000,
|
||||
"keep_text_aligned": true,
|
||||
"suppress_zeroes": false,
|
||||
"text_position": 0,
|
||||
"units_format": 1
|
||||
},
|
||||
"fab_line_width": 0.09999999999999999,
|
||||
"fab_text_italic": false,
|
||||
"fab_text_size_h": 1.0,
|
||||
"fab_text_size_v": 1.0,
|
||||
"fab_text_thickness": 0.15,
|
||||
"fab_text_upright": false,
|
||||
"other_line_width": 0.15,
|
||||
"other_text_italic": false,
|
||||
"other_text_size_h": 1.0,
|
||||
"other_text_size_v": 1.0,
|
||||
"other_text_thickness": 0.15,
|
||||
"other_text_upright": false,
|
||||
"pads": {
|
||||
"drill": 0.762,
|
||||
"height": 1.524,
|
||||
"width": 1.524
|
||||
},
|
||||
"silk_line_width": 0.15,
|
||||
"silk_text_italic": false,
|
||||
"silk_text_size_h": 1.0,
|
||||
"silk_text_size_v": 1.0,
|
||||
"silk_text_thickness": 0.15,
|
||||
"silk_text_upright": false,
|
||||
"zones": {
|
||||
"45_degree_only": false,
|
||||
"min_clearance": 0.508
|
||||
}
|
||||
},
|
||||
"diff_pair_dimensions": [],
|
||||
"drc_exclusions": [],
|
||||
"meta": {
|
||||
"version": 1
|
||||
},
|
||||
"rule_severities": {
|
||||
"annular_width": "error",
|
||||
"clearance": "error",
|
||||
"copper_edge_clearance": "error",
|
||||
"courtyards_overlap": "error",
|
||||
"diff_pair_gap_out_of_range": "error",
|
||||
"diff_pair_uncoupled_length_too_long": "error",
|
||||
"drill_out_of_range": "error",
|
||||
"duplicate_footprints": "warning",
|
||||
"extra_footprint": "warning",
|
||||
"hole_clearance": "error",
|
||||
"hole_near_hole": "error",
|
||||
"invalid_outline": "error",
|
||||
"item_on_disabled_layer": "error",
|
||||
"items_not_allowed": "error",
|
||||
"length_out_of_range": "error",
|
||||
"malformed_courtyard": "error",
|
||||
"microvia_drill_out_of_range": "error",
|
||||
"missing_courtyard": "ignore",
|
||||
"missing_footprint": "warning",
|
||||
"net_conflict": "warning",
|
||||
"npth_inside_courtyard": "ignore",
|
||||
"padstack": "error",
|
||||
"pth_inside_courtyard": "ignore",
|
||||
"shorting_items": "error",
|
||||
"silk_over_copper": "error",
|
||||
"silk_overlap": "error",
|
||||
"skew_out_of_range": "error",
|
||||
"too_many_vias": "error",
|
||||
"track_dangling": "warning",
|
||||
"track_width": "error",
|
||||
"tracks_crossing": "error",
|
||||
"unconnected_items": "error",
|
||||
"unresolved_variable": "error",
|
||||
"via_dangling": "warning",
|
||||
"zone_has_empty_net": "error",
|
||||
"zones_intersect": "error"
|
||||
},
|
||||
"rules": {
|
||||
"allow_blind_buried_vias": false,
|
||||
"allow_microvias": false,
|
||||
"max_error": 0.005,
|
||||
"min_clearance": 0.0,
|
||||
"min_copper_edge_clearance": 0.0,
|
||||
"min_hole_clearance": 0.0,
|
||||
"min_hole_to_hole": 0.25,
|
||||
"min_microvia_diameter": 0.19999999999999998,
|
||||
"min_microvia_drill": 0.09999999999999999,
|
||||
"min_silk_clearance": 0.0,
|
||||
"min_through_hole_diameter": 0.3,
|
||||
"min_track_width": 0.19999999999999998,
|
||||
"min_via_annular_width": 0.049999999999999996,
|
||||
"min_via_diameter": 0.39999999999999997,
|
||||
"solder_mask_clearance": 0.0,
|
||||
"solder_mask_min_width": 0.0,
|
||||
"solder_paste_clearance": 0.0,
|
||||
"solder_paste_margin_ratio": 0.0
|
||||
},
|
||||
"track_widths": [],
|
||||
"via_dimensions": [],
|
||||
"zones_allow_external_fillets": false,
|
||||
"zones_use_no_outline": true
|
||||
},
|
||||
"layer_presets": []
|
||||
},
|
||||
"boards": [],
|
||||
"cvpcb": {
|
||||
"equivalence_files": []
|
||||
},
|
||||
"libraries": {
|
||||
"pinned_footprint_libs": [],
|
||||
"pinned_symbol_libs": []
|
||||
},
|
||||
"meta": {
|
||||
"filename": "tracks_arcs_vias.kicad_pro",
|
||||
"version": 1
|
||||
},
|
||||
"net_settings": {
|
||||
"classes": [
|
||||
{
|
||||
"bus_width": 6.0,
|
||||
"clearance": 0.2,
|
||||
"diff_pair_gap": 0.25,
|
||||
"diff_pair_via_gap": 0.25,
|
||||
"diff_pair_width": 0.2,
|
||||
"line_style": 0,
|
||||
"microvia_diameter": 0.3,
|
||||
"microvia_drill": 0.1,
|
||||
"name": "Default",
|
||||
"pcb_color": "rgba(0, 0, 0, 0.000)",
|
||||
"schematic_color": "rgba(0, 0, 0, 0.000)",
|
||||
"track_width": 0.25,
|
||||
"via_diameter": 0.8,
|
||||
"via_drill": 0.4,
|
||||
"wire_width": 6.0
|
||||
}
|
||||
],
|
||||
"meta": {
|
||||
"version": 0
|
||||
},
|
||||
"net_colors": null
|
||||
},
|
||||
"pcbnew": {
|
||||
"last_paths": {
|
||||
"gencad": "",
|
||||
"idf": "",
|
||||
"netlist": "",
|
||||
"specctra_dsn": "",
|
||||
"step": "",
|
||||
"vrml": ""
|
||||
},
|
||||
"page_layout_descr_file": ""
|
||||
},
|
||||
"schematic": {
|
||||
"legacy_lib_dir": "",
|
||||
"legacy_lib_list": []
|
||||
},
|
||||
"sheets": [],
|
||||
"text_variables": {}
|
||||
}
|
qa/data/tracks_arcs_vias.kicad_sch
Normal file
LOADING design file
31
qa/testcases/test_004_tracks.py
Normal file
31
qa/testcases/test_004_tracks.py
Normal file
@ -0,0 +1,31 @@
|
||||
import unittest
|
||||
import pcbnew
|
||||
|
||||
class TestTracks(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.pcb = pcbnew.LoadBoard("data/tracks_arcs_vias.kicad_pcb")
|
||||
|
||||
def test_tracks(self):
|
||||
tracks = [t for t in self.pcb.Tracks() if t.GetClass() == 'TRACK']
|
||||
self.assertEqual(16, len(tracks))
|
||||
track = sorted(tracks, key=lambda t: [t.GetStart()[0], t.GetStart()[1]])[0]
|
||||
self.assertEqual([27000000, 27585787], [track.GetStart()[0], track.GetStart()[1]])
|
||||
self.assertEqual([27000000, 26500000], [track.GetEnd()[0], track.GetEnd()[1]])
|
||||
self.assertEqual(250000, track.GetWidth())
|
||||
self.assertEqual('McNetty', track.GetNetname())
|
||||
|
||||
def test_arcs(self):
|
||||
arcs = [t for t in self.pcb.Tracks() if t.GetClass() == 'ARC']
|
||||
self.assertEqual(13, len(arcs))
|
||||
arc = sorted(arcs, key=lambda t: [t.GetStart()[0], t.GetStart()[1]])[0]
|
||||
self.assertEqual([29414211, 26499999], [arc.GetCenter()[0], arc.GetCenter()[1]])
|
||||
self.assertEqual([1800, 2250], [round(arc.GetArcAngleStart()), round(arc.GetArcAngleEnd())])
|
||||
self.assertEqual(2414211, round(arc.GetRadius()))
|
||||
|
||||
def test_vias(self):
|
||||
vias = [t for t in self.pcb.Tracks() if t.GetClass() == 'VIA']
|
||||
self.assertEqual(2, len(vias))
|
||||
via = sorted(vias, key=lambda t: [t.GetStart()[0], t.GetStart()[1]])[0]
|
||||
self.assertEqual([29000000, 41000000], [via.GetStart()[0], via.GetStart()[1]])
|
||||
self.assertEqual(400000, via.GetDrillValue())
|
Loading…
Reference in New Issue
Block a user