major rework of parts, somewhat handles updates from KiCAD via recompute, needs Live switch to enable/disable
This commit is contained in:
parent
5f7a058706
commit
ce25779b5d
1 changed files with 47 additions and 21 deletions
|
@ -15,28 +15,35 @@ from .bases import BaseObject, BaseViewProvider
|
|||
class PartsObject(BaseObject):
|
||||
TYPE = 'KiConnect::Parts'
|
||||
|
||||
class PartsViewProvider(BaseViewProvider):
|
||||
ICON = 'icon_footprint_browser.svg'
|
||||
TYPE = 'KiConnect::Parts'
|
||||
|
||||
class Parts():
|
||||
def __init__(self, kicad_board, kiconn_board):
|
||||
self.kicad_board = kicad_board
|
||||
self.kiconn_board = kiconn_board
|
||||
|
||||
feature = App.ActiveDocument.addObject('App::DocumentObjectGroupPython', 'Parts')
|
||||
|
||||
PartsObject(self, feature)
|
||||
PartsViewProvider(self, feature.ViewObject)
|
||||
|
||||
self.feature = feature
|
||||
def execute(self, feature):
|
||||
super(PartsObject, self).execute(feature)
|
||||
|
||||
self.import_footprints()
|
||||
|
||||
def import_footprints(self):
|
||||
for footprint in self.kicad_board.get_footprints():
|
||||
kiconn_board = self.feature.getParentGroup()
|
||||
kicad_board = self.get_api().kicad.get_board()
|
||||
|
||||
existing_footprints_by_ref = { part.KiCadRef: part for part in self.feature.Group }
|
||||
|
||||
for footprint in kicad_board.get_footprints():
|
||||
# NOTE this doesn't handle footprints that have been removed
|
||||
if App.ActiveDocument.getObjectsByLabel(footprint.reference_field.text.value): continue
|
||||
reference = footprint.reference_field.text.value
|
||||
|
||||
if reference in existing_footprints_by_ref:
|
||||
model = existing_footprints_by_ref[reference]
|
||||
|
||||
placement = App.Placement()
|
||||
placement.Base.x = (footprint.position.x / 1000000.0) - kiconn_board.BoardOffset.Base.x
|
||||
placement.Base.y = (-footprint.position.y / 1000000.0) - kiconn_board.BoardOffset.Base.y
|
||||
# TODO get from kicad board settings
|
||||
placement.Base.z = 0.8
|
||||
placement.Rotation.Angle = footprint.orientation.to_radians()
|
||||
|
||||
if model.Placement != placement:
|
||||
model.Placement = placement
|
||||
|
||||
continue
|
||||
|
||||
for item in [item for item in footprint.definition.items if isinstance(item, Footprint3DModel)]:
|
||||
filename = item.filename.replace('${KICAD9_3DMODEL_DIR}', settings.KICAD9_3DMODEL_DIR).replace('wrl', 'step')
|
||||
|
@ -45,15 +52,34 @@ class Parts():
|
|||
|
||||
# simply grabs the last object in the document, probably need to figure out a safer way to handle
|
||||
model = App.ActiveDocument.findObjects()[-1]
|
||||
model.Label = footprint.reference_field.text.value
|
||||
model.Label = reference
|
||||
model.Label2 = reference
|
||||
|
||||
model.addProperty('App::PropertyPlacement', 'BoardOffset', 'Base', 'Internal offset for zeroing out Footprint offset', hidden=True, read_only=True)
|
||||
model.addProperty('App::PropertyString', 'KiCadRef', 'KiConnect', 'Original KiCAD REF', hidden=True, read_only=True)
|
||||
model.KiCadRef = reference
|
||||
|
||||
self.feature.addObject(model)
|
||||
|
||||
model.Placement.Base.x = (footprint.position.x / 1000000.0) - self.kiconn_board.offset.x
|
||||
model.Placement.Base.y = (-footprint.position.y / 1000000.0) - self.kiconn_board.offset.y
|
||||
model.Placement.Base.x = (footprint.position.x / 1000000.0) - kiconn_board.BoardOffset.Base.x
|
||||
model.Placement.Base.y = (-footprint.position.y / 1000000.0) - kiconn_board.BoardOffset.Base.y
|
||||
# TODO get from kicad board settings
|
||||
model.Placement.Base.z = 0.8
|
||||
model.Placement.Rotation.Angle = footprint.orientation.to_radians()
|
||||
model.BoardOffset = model.Placement
|
||||
except:
|
||||
except Exception as e:
|
||||
print('failed to load', filename)
|
||||
print(e)
|
||||
|
||||
class PartsViewProvider(BaseViewProvider):
|
||||
ICON = 'icon_footprint_browser.svg'
|
||||
TYPE = 'KiConnect::Parts'
|
||||
|
||||
def makeParts(parent):
|
||||
feature = App.ActiveDocument.addObject('App::DocumentObjectGroupPython', 'Parts')
|
||||
parent.addObject(feature)
|
||||
|
||||
PartsObject(feature)
|
||||
PartsViewProvider(feature.ViewObject)
|
||||
|
||||
return feature
|
||||
|
|
Loading…
Add table
Reference in a new issue