[docs]classElectroImpactExtruder(Extruder):"""Represents the custom extruder on the ElectroImpact AFP/LFAM machine. Deposited volume is computed from the bead cross-sectional area (J parameter, stored as extrusion_rate) and the change in cumulative extrusion distance (K parameter, stored in command.settings["extrusion_length"]). Attributes: on (bool): Whether the extruder head is active. last_extrusion_distance (float): Cumulative extrusion distance at the last processed command, used to compute delta per move. """def__init__(self,options=None):super().__init__(options=options)self.on=Falseself.last_extrusion_distance:float=0.0
def_calc_last_deposited_volume(self,command,process_data:AdditiveProcessData):"""Calculate deposited volume from bead area and delta extrusion distance. When K is present: volume = bead_area * (K - last_K) (cumulative tracking) When K is absent: volume = bead_area * process_data.distance (move distance fallback) """bead_area=command.extrusion_rateextrusion_distance=command.settings.get("extrusion_length")ifextrusion_distanceisnotNone:delta_extrusion_distance=extrusion_distance-self.last_extrusion_distanceself.last_extrusion_distance=extrusion_distanceelse:delta_extrusion_distance=process_data.distanceor0.0volume=bead_area*delta_extrusion_distanceifself.onelse0.0self.last_extrusion_rate=bead_areaself.last_bead_area=bead_areaself.last_deposited_volume=volumedef_calc_last_extrusion_rate(self,command,process_data:AdditiveProcessData):"""Not used for ElectroImpact — bead_area (J) is always explicitly provided."""logging.warning("ElectroImpactExtruder._calc_last_extrusion_rate called unexpectedly. ""ElectroImpact G-code always specifies bead area (J) directly.")
[docs]@register("electroimpact")classElectroImpact(Machine):"""Represents the ElectroImpact AFP machine configured for large-scale additive manufacturing. Handles ElectroImpact-specific M-codes: M9: Pellet head on. S code is layer number. M301: Enable extruder lanes. S code specifies lane count (1-4). M38: Load part offsets. M22: Load head offsets. """def__init__(self,**options):super().__init__(tools=(ElectroImpactExtruder(),),parser=GcodeParser(syntax_name="electroimpact"),)self._options_type=ElectroImpactOptionsself.options=optionsdef_config(self,command:Config,process_data:AdditiveProcessData)->AdditiveProcessData:process_data=super()._config(command,process_data)ifnotisinstance(command,M):returnprocess_dataifcommand.code==9:# M9: pellet head on, S = layer numberself.tools[0].on=Trueelifcommand.code==10:# M10: Pellet head offself.tools[0].on=Falseelifcommand.code==301:# M301: enable extruder lanes, S = lane count (1-4)passelifcommand.code==38:# M38: load part offsetspasselifcommand.code==22:# M22: load head offsetspassreturnprocess_data