From e05f3f6a3c9dc4675a7b9de20c6e7c7c5a52cc99 Mon Sep 17 00:00:00 2001 From: "Morgan 'ARR\\!' Allen" Date: Tue, 29 Apr 2025 10:25:16 -0700 Subject: [PATCH] major rework of Board making bidirectional syncing more reliable --- freecad/kiconnect/bases/BaseObject.py | 3 +- freecad/kiconnect/board.py | 64 ++++++++++++++++----- freecad/kiconnect/commands/cmd_reload.py | 2 +- freecad/kiconnect/commands/cmd_sync_from.py | 2 +- freecad/kiconnect/commands/cmd_sync_to.py | 2 +- 5 files changed, 56 insertions(+), 17 deletions(-) diff --git a/freecad/kiconnect/bases/BaseObject.py b/freecad/kiconnect/bases/BaseObject.py index abb4cfa..eae183d 100644 --- a/freecad/kiconnect/bases/BaseObject.py +++ b/freecad/kiconnect/bases/BaseObject.py @@ -13,7 +13,8 @@ class BaseObject: def execute(self, feature): # TODO this might not be the right move - self.onDocumentRestored(feature) + print(self, 'BaseObject.execute') + #self.onDocumentRestored(feature) def get_api(self): p = self.feature diff --git a/freecad/kiconnect/board.py b/freecad/kiconnect/board.py index 76f115c..0b23dcd 100644 --- a/freecad/kiconnect/board.py +++ b/freecad/kiconnect/board.py @@ -19,23 +19,52 @@ class BoardObject(BaseObject): super(BoardObject, self).__init__(feature) self.kicad_board = None - self.substrate_body = None - self.substrate_sketch = None self.via_sketch = None feature.addProperty('App::PropertyPlacement', 'BoardOffset', 'KiConnect', 'Internal offset for zeroing out Footprint offset', hidden=True, read_only=True) - def onDocumentRestored(self, feature): + + def execute(self, feature): if self.kicad_board is None: self.kicad_board = self.get_api().kicad.get_board() - if self.substrate_body is None: - self.extrude_substrate(feature) - self.sketch_outline(feature) + if not self.substrate_body: + self.create_substrate_body() + + if not self.substrate_sketch: + self.create_substrate_sketch() + self.sketch_outline() + + def onDocumentRestored(self, feature): + super(BoardObject, self).onDocumentRestored(feature) + + self.kicad_board = self.get_api().kicad.get_board() + + @property + def substrate_body(self): + return self.feature.getObject('Substrate') + + @property + def substrate_sketch(self): + return self.substrate_body.getObject('Sketch') + + def create_substrate_body(self): + substrate_body = App.ActiveDocument.addObject('PartDesign::Body', 'Substrate') + self.feature.addObject(substrate_body) + + + def create_substrate_sketch(self): + substrate_sketch = App.ActiveDocument.addObject('Sketcher::SketchObject', 'Sketch') + substrate_sketch.Visibility = False + + self.substrate_body.addObject(substrate_sketch) + + pad = self.substrate_body.newObject('PartDesign::Pad', 'Outline') + + pad.Profile = substrate_sketch + pad.Length = 1.6 + pad.Midplane = True - if len(self.kicad_board.get_vias()) > 0 and self.via_sketch is None: - self.setup_vias() - self.pocket_vias() def extrude_substrate(self, feature): self.substrate_sketch = App.ActiveDocument.addObject('Sketcher::SketchObject', 'Sketch') @@ -95,7 +124,14 @@ class BoardObject(BaseObject): via_pocket.Midplane = True via_pocket.Type = 1 - def sketch_outline(self, feature): + def sketch_outline(self, do_offset=True): + ''' + Draws the Board outline fetched from the API + + Parameters: + do_offset (bool): If offset should be recalcualted, typically this is undesired after calculated the first time. (Default: True) + ''' + boardpoly = self.get_boardpoly() poly = boardpoly.polygons[0] @@ -104,13 +140,15 @@ class BoardObject(BaseObject): self.feature.PolygonId = boardpoly.id.value # this offset centers the board to 0,0 - bb = boardpoly.bounding_box() - self.feature.BoardOffset.Base = (App.Vector(bb.pos.x, -bb.pos.y) + App.Vector(bb.size.x, -bb.size.y) / 2) / 1000000.0 + if do_offset: + bb = boardpoly.bounding_box() + self.feature.BoardOffset.Base = (App.Vector(bb.pos.x, -bb.pos.y) + App.Vector(bb.size.x, -bb.size.y) / 2) / 1000000.0 begin = None start = None - # reset Sketch Geometry + # reset Sketch Constraints and Geometry + self.substrate_sketch.Constraints = [] self.substrate_sketch.Geometry = [] # sketch outline diff --git a/freecad/kiconnect/commands/cmd_reload.py b/freecad/kiconnect/commands/cmd_reload.py index c67614e..b426a4f 100644 --- a/freecad/kiconnect/commands/cmd_reload.py +++ b/freecad/kiconnect/commands/cmd_reload.py @@ -8,7 +8,7 @@ from ..project import Project class Reload: def GetResources(self): - tooltip = '

Reload KiConnect Workbench for development.

' + tooltip = '

Reload KiConnect Workbench for development.\nNOTE: Does not reload toolbars.

' iconFile = os.path.join(settings.ICONPATH, 'kiconnect.svg') return { diff --git a/freecad/kiconnect/commands/cmd_sync_from.py b/freecad/kiconnect/commands/cmd_sync_from.py index 01ad8af..3b1f5e5 100644 --- a/freecad/kiconnect/commands/cmd_sync_from.py +++ b/freecad/kiconnect/commands/cmd_sync_from.py @@ -22,7 +22,7 @@ class Sync: boards = [ sel for sel in Gui.Selection.getSelection() if sel.Type == 'KiConnect::Board' ] for board in boards: - board.KiConnBoard.sketch_outline() + board.Proxy.sketch_outline(do_offset=False) App.ActiveDocument.recompute() diff --git a/freecad/kiconnect/commands/cmd_sync_to.py b/freecad/kiconnect/commands/cmd_sync_to.py index f519c40..3ddc617 100644 --- a/freecad/kiconnect/commands/cmd_sync_to.py +++ b/freecad/kiconnect/commands/cmd_sync_to.py @@ -21,7 +21,7 @@ class Sync: boards = [ sel for sel in Gui.Selection.getSelection() if sel.Type == 'KiConnect::Board' ] for board in boards: - board.KiConnBoard.sync() + board.Proxy.sync()