├── macro ├── M0.cfg ├── _BETWEEN_OBJECT.cfg ├── M117.cfg ├── TURN_OFF_FAN.cfg ├── TURN_OFF_MOTOR.cfg ├── TURN_OFF_BED.cfg ├── TURN_OFF_NOZZLE.cfg ├── TURN_OFF_ALL.cfg ├── UNKNOWN_MACRO.cfg ├── SET_Z_OFFSET.cfg ├── PREHEAT.cfg ├── M600.cfg ├── PREPARE_FOR_PRINT.cfg ├── CANCEL_PRINT.cfg ├── _AFTER_PRINT.cfg ├── PRESSURE_ADVANCE.cfg ├── _MACRO_STATUS.cfg ├── CENTER_ALL.cfg ├── PAUSE.cfg ├── M300.cfg ├── _MACRO_END.cfg ├── _PRINT_PRIMER_LINES.cfg ├── RESUME.cfg ├── FILAMENT_CHANGE.cfg ├── PID_TUNE.cfg ├── _AFTER_LAYER_CHANGE.cfg ├── _AFTER_PRINT_WIPE.cfg ├── M205.cfg ├── M203.cfg ├── SET_VAR.cfg ├── VAR_DUMP.cfg ├── _MACRO_START.cfg ├── LOG.cfg ├── _ASSERT_PRINTING.cfg ├── HOME.cfg ├── _ASSERT_HOMED.cfg ├── _BEFORE_LAYER_CHANGE.cfg ├── SET_FAN_SPEED.cfg ├── M201.cfg ├── M204.cfg ├── PRESENT_PRINT.cfg ├── _BEFORE_PRINT.cfg ├── G27.cfg └── MOVE.cfg ├── .gitignore ├── .editorconfig ├── .gitattributes ├── telegram.conf ├── config ├── sks-library.gcode.j2 ├── server.cfg ├── features.cfg ├── init_vars.cfg └── machine.cfg ├── package.json ├── webcam.conf ├── README.md ├── LICENSE.md ├── moonraker.conf ├── webcam.txt ├── crowsnest.conf └── printer.cfg /macro/M0.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M0] 2 | description: M0: Pause 3 | gcode: 4 | PAUSE -------------------------------------------------------------------------------- /macro/_BETWEEN_OBJECT.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _BETWEEN_OBJECT] 2 | description: Run this between objects (Sequential Printing) 3 | gcode: 4 | ; Run this between objects 5 | -------------------------------------------------------------------------------- /macro/M117.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M117] 2 | description: Send all LCD messages to the console log too 3 | rename_existing: M117.1 4 | gcode: 5 | M117.1 {rawparams} 6 | LOG MSG="{rawparams}" 7 | -------------------------------------------------------------------------------- /macro/TURN_OFF_FAN.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro TURN_OFF_FAN] 2 | description: Move the tool head to the back left 3 | gcode: 4 | _MACRO_START NAME="TURN_OFF_FAN" 5 | M106 S0 6 | _MACRO_END NAME="TURN_OFF_FAN" -------------------------------------------------------------------------------- /macro/TURN_OFF_MOTOR.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro TURN_OFF_MOTOR] 2 | description: Move the tool head to the back left 3 | gcode: 4 | _MACRO_START NAME="TURN_OFF_MOTOR" 5 | M84 E 6 | _MACRO_END NAME="TURN_OFF_MOTOR" 7 | -------------------------------------------------------------------------------- /macro/TURN_OFF_BED.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro TURN_OFF_BED] 2 | description: Move the tool head to the back left 3 | gcode: 4 | _MACRO_START NAME="TURN_OFF_BED" 5 | SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET=0 6 | _MACRO_END NAME="TURN_OFF_BED" 7 | -------------------------------------------------------------------------------- /macro/TURN_OFF_NOZZLE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro TURN_OFF_NOZZLE] 2 | description: Move the tool head to the back left 3 | gcode: 4 | _MACRO_START NAME="TURN_OFF_NOZZLE" 5 | SET_HEATER_TEMPERATURE HEATER=extruder TARGET=0 6 | _MACRO_END NAME="TURN_OFF_NOZZLE" 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### OS ### 2 | .DS_Store 3 | .DS_Store? 4 | ._* 5 | .Spotlight-V100 6 | .Trashes 7 | Icon? 8 | ehthumbs.db 9 | Thumbs.db 10 | 11 | ### IDE ### 12 | .idea 13 | 14 | ### Klipper ### 15 | printer-????????_??????.cfg 16 | *.backup 17 | crowsnest.conf.* 18 | -------------------------------------------------------------------------------- /macro/TURN_OFF_ALL.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro TURN_OFF_ALL] 2 | description: Move the tool head to the back left 3 | gcode: 4 | _MACRO_START NAME="TURN_OFF_ALL" 5 | TURN_OFF_NOZZLE 6 | TURN_OFF_BED 7 | TURN_OFF_FAN 8 | TURN_OFF_MOTOR 9 | _MACRO_END NAME="TURN_OFF_ALL" 10 | -------------------------------------------------------------------------------- /macro/UNKNOWN_MACRO.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro UNKNOWN_MACRO] 2 | description: This is a placeholder macro that doesn't do anything 3 | gcode: 4 | ; No state management required since this doesn't actually interact with the printer 5 | RESPOND MSG="This is a placeholder macro that doesn't do anything" -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # Standard 2 | [*] 3 | charset = utf-8 4 | end_of_line = lf 5 | insert_final_newline = true 6 | indent_size = 2 7 | indent_style = tab 8 | 9 | # Spaces are important 10 | [*.yml] 11 | indent_style = space 12 | 13 | # Windows endings 14 | [*.bat] 15 | end_of_line = crlf 16 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Force Unix-Style Line Endings 2 | *.css text eol=lf 3 | *.html text eol=lf 4 | *.js text eol=lf 5 | *.json text eol=lf 6 | *.less text eol=lf 7 | *.markdown text eol=lf 8 | *.md text eol=lf 9 | *.php text eol=lf 10 | *.svg text eol=lf 11 | *.xml text eol=lf 12 | -------------------------------------------------------------------------------- /macro/SET_Z_OFFSET.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro SET_Z_OFFSET] 2 | description: Prepair to print 3 | gcode: 4 | ; No state managment since we are modifying it 5 | _MACRO_START SAVE=0 NAME="SET_Z_OFFSET" 6 | {% set VALUE = params.VALUE|default(0)|float %} 7 | HOME 8 | SET_GCODE_OFFSET Z={VALUE} MOVE=1 9 | _MACRO_END LOAD=0 NAME="SET_Z_OFFSET" 10 | -------------------------------------------------------------------------------- /macro/PREHEAT.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro PREHEAT] 2 | description: Preheat the bed and nozzle 3 | gcode: 4 | _MACRO_START NAME="PREHEAT" 5 | {% set NOZZLE = params.NOZZLE|default(150)|float %} 6 | {% set BED = params.BED|default(50)|float %} 7 | SET_HEATER_TEMPERATURE HEATER=extruder TARGET={NOZZLE} 8 | SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={BED} 9 | _MACRO_END NAME="PREHEAT" -------------------------------------------------------------------------------- /macro/M600.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M600] 2 | description: 3 | M600: Filament Change. This macro will pause the printer, move the tool to 4 | the change position, and retract the filament 50mm. Adjust the retraction 5 | settings for your own extruder. After filament has been changed, the print can 6 | be resumed from its previous position with the "RESUME" gcode. 7 | gcode: 8 | FILAMENT_CHANGE -------------------------------------------------------------------------------- /macro/PREPARE_FOR_PRINT.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro PREPARE_FOR_PRINT] 2 | description: Prepare to print: Preheat, present bed for cleaning/glue 3 | gcode: 4 | _MACRO_START NAME="PREPARE_FOR_PRINT" 5 | {% set NOZZLE = params.NOZZLE|default(150)|float %} 6 | {% set BED = params.BED|default(50)|float %} 7 | PREHEAT NOZZLE={NOZZLE} BED={BED} 8 | PRESENT_PRINT 9 | _MACRO_END NAME="PREPARE_FOR_PRINT" -------------------------------------------------------------------------------- /macro/CANCEL_PRINT.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro CANCEL_PRINT] 2 | description: Cancel the actual running print 3 | rename_existing: CANCEL_PRINT_BASE 4 | gcode: 5 | ; No state management since we are cancelling the print 6 | _MACRO_START SAVE=0 NAME="CANCEL_PRINT" 7 | _AFTER_PRINT_WIPE 8 | TURN_OFF_HEATERS 9 | TURN_OFF_FAN 10 | CANCEL_PRINT_BASE 11 | PRESENT_PRINT 12 | _MACRO_END LOAD=0 NAME="CANCEL_PRINT" -------------------------------------------------------------------------------- /telegram.conf: -------------------------------------------------------------------------------- 1 | [bot] 2 | server: localhost 3 | chat_id: 123456789 4 | bot_token: AweSomeBotToken 5 | log_path: /home/pi/klipper_logs 6 | 7 | [camera] 8 | flipVertically: false 9 | flipHorizontally: false 10 | videoDuration: 15 11 | 12 | [progress_notification] 13 | percent: 5 14 | height: 5 15 | time: 5 16 | min_delay_between_notifications: 60 17 | 18 | 19 | [timelapse] 20 | cleanup: true 21 | height: 0.2 22 | time: 5 23 | target_fps: 30 24 | -------------------------------------------------------------------------------- /macro/_AFTER_PRINT.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _AFTER_PRINT] 2 | description: Prepair to print 3 | gcode: 4 | _MACRO_START NAME="_AFTER_PRINT" 5 | {% set DISABLE_STEPPERS = params.DISABLE_STEPPERS|default(0)|int %} 6 | _AFTER_PRINT_WIPE 7 | G91 ;Relative positioning 8 | G1 Z10 F1200;Raise Z more 9 | PRESENT_PRINT 10 | TURN_OFF_HEATERS 11 | TURN_OFF_FAN 12 | {% if DISABLE_STEPPERS != 0 %} 13 | M84 ; Disable stepper motors 14 | {% endif %} 15 | _MACRO_END NAME="_AFTER_PRINT" -------------------------------------------------------------------------------- /macro/PRESSURE_ADVANCE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro PRESSURE_ADVANCE] 2 | description: Temporarily set the pressure advance to a value 3 | gcode: 4 | _MACRO_START SAVE=0 NAME="PRESSURE_ADVANCE" 5 | {% set VALUE = params.VALUE|default(printer.configfile.settings.extruder.pressure_advance)|float %} 6 | RESPOND MSG="Setting pressure advance to '{VALUE}' (orginal value was '{printer.configfile.settings.extruder.pressure_advance}')" 7 | SET_PRESSURE_ADVANCE ADVANCE="{VALUE}" 8 | _MACRO_END LOAD=0 NAME="PRESSURE_ADVANCE" -------------------------------------------------------------------------------- /config/sks-library.gcode.j2: -------------------------------------------------------------------------------- 1 | {% macro getSetting(setting_name, is_required = false) -%} 2 | {% set value = none -%} 3 | {% if 'save_variables' in printer -%} 4 | {% set vars = printer.save_variables.variables -%} 5 | {% if setting_name in vars -%} 6 | {% set value = vars[setting_name] -%} 7 | {% elif is_required -%} 8 | LOG TYPE=ERROR MSG="[{SELF}] Required setting \"{setting_name}\" not found in save_variables" 9 | {% endif -%} 10 | {% endif -%} 11 | {value} 12 | {%- endmacro -%} 13 | -------------------------------------------------------------------------------- /macro/_MACRO_STATUS.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _MACRO_STATUS] 2 | description: Send a message to the console about a macro's status 3 | gcode: 4 | ; No state management required since this doesn't actually interact with the printer 5 | {% set NAME = params.NAME|default('UNKNOWN_MACRO') %} 6 | {% set END = params.END|default(0)|float %} 7 | {% if END == 1 %} 8 | {% set STATUS = 'Finish' %} 9 | {% else %} 10 | {% set STATUS = 'Start' %} 11 | {% endif %} 12 | LOG TYPE="STATUS" MSG="Macro {STATUS} - {NAME}" -------------------------------------------------------------------------------- /macro/CENTER_ALL.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro CENTER_ALL] 2 | description: Center all the axes 3 | gcode: 4 | ; No state management since we are cancelling the print 5 | _MACRO_START NAME="CENTER_ALL" 6 | {% set HALF_X = printer.toolhead.axis_maximum.x / 2 %} 7 | {% set HALF_Y = printer.toolhead.axis_maximum.y / 2 %} 8 | {% set HALF_Z = printer.toolhead.axis_maximum.z / 2 %} 9 | G90 ; Absolute positioning 10 | {% if printer.toolhead.position.x < HALF_Z %} 11 | G1 Z{HALF_Z} F1200 12 | {% endif %} 13 | G1 X{HALF_X} Y{HALF_Y} F2700 14 | _MACRO_END NAME="CENTER_ALL" -------------------------------------------------------------------------------- /config/server.cfg: -------------------------------------------------------------------------------- 1 | ### Raspberry Pi 3 B+ Core Config ############################################### 2 | [virtual_sdcard] 3 | path: ~/gcode_files 4 | 5 | [mcu] 6 | serial: /dev/serial/by-id/usb-1a86_USB_Serial-if00-port0 7 | restart_method: command 8 | 9 | # Lets show the temp of the RPi CPU on the temp graph 10 | [temperature_sensor Host_CPU] 11 | sensor_type: temperature_host 12 | sensor_path: /sys/class/thermal/thermal_zone0/temp 13 | max_temp: 100 14 | 15 | # Lets show the temp of the printer CPU on the temp graph 16 | [temperature_sensor Printer_CPU] 17 | sensor_type: temperature_mcu 18 | max_temp: 100 19 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "summers-klipper-suite", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "klipper:restart": "echo RESTART > /tmp/printer", 7 | "firmware:restart": "echo FIRMWARE_RESTART > /tmp/printer", 8 | "sks:reset-files": "git reset --hard", 9 | "sks:clear-files": "git add --all && git reset --hard", 10 | "sks:update": "npm run sks:clear-files && git pull --all && npm run klipper:restart" 11 | }, 12 | "description": "A collection of macros and configurations for Klipper (3D printer firmware)", 13 | "author": "Nicholas Summers", 14 | "license": "MIT" 15 | } 16 | -------------------------------------------------------------------------------- /macro/PAUSE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro PAUSE] 2 | description: Pause the actual running print 3 | rename_existing: PAUSE_BASE 4 | # change this if you need more or less extrusion 5 | variable_extrude: 1.0 6 | gcode: 7 | _MACRO_START NAME="PAUSE" 8 | ##### read E from pause macro ##### 9 | {% set E = printer["gcode_macro PAUSE"].extrude|float %} 10 | ##### end of definitions ##### 11 | PAUSE_BASE 12 | G91 ; Relative Positioning 13 | {% if printer.extruder.can_extrude|lower == 'true' %} 14 | G1 E-{E} F3600 15 | {% else %} 16 | {action_respond_info("Extruder not hot enough")} 17 | {% endif %} 18 | PRESENT_PRINT 19 | _MACRO_END NAME="PAUSE" -------------------------------------------------------------------------------- /macro/M300.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M300] 2 | gcode: 3 | {% set S = params.S|default(1000)|int %} ; S sets the tone frequency 4 | {% set P = params.P|default(100)|int %} ; P sets the tone duration 5 | {% set L = 0.5 %} ; L varies the PWM on time, close to 0 or 1 the tone gets a bit quieter. 0.5 is a symmetric waveform 6 | {% if S <= 0 %} ; dont divide through zero 7 | {% set F = 1 %} 8 | {% set L = 0 %} 9 | {% elif S >= 10000 %} ;max frequency set to 10kHz 10 | {% set F = 0 %} 11 | {% else %} 12 | {% set F = 1/S %} ;convert frequency to seconds 13 | {% endif %} 14 | SET_PIN PIN=BEEPER_Pin VALUE={L} CYCLE_TIME={F} ;Play tone 15 | G4 P{P} ;tone duration 16 | SET_PIN PIN=BEEPER_Pin VALUE=0 -------------------------------------------------------------------------------- /macro/_MACRO_END.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _MACRO_END] 2 | description: End status and load state manager for macros 3 | gcode: 4 | {% set NAME = params.NAME|default('UNKNOWN_MACRO') %} 5 | {% set LOAD = params.LOAD|default(1)|int %} 6 | {% set LOG = params.LOG|default(1)|int %} 7 | {% set MOVE = params.MOVE|default(0)|int %} 8 | {% set SPEED = params.SPEED|default(0)|int %} 9 | {% if LOAD == 1 %} 10 | {% if MOVE == 1 and SPEED != 0 %} 11 | RESTORE_GCODE_STATE NAME="{NAME}_STATE" MOVE={MOVE} MOVE_SPEED={SPEED} 12 | {% else %} 13 | RESTORE_GCODE_STATE NAME="{NAME}_STATE" MOVE={MOVE} 14 | {% endif %} 15 | {% endif %} 16 | {% if LOG == 1 %} 17 | _MACRO_STATUS END=1 NAME="{NAME}" 18 | {% endif %} -------------------------------------------------------------------------------- /macro/_PRINT_PRIMER_LINES.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _PRINT_PRIMER_LINES] 2 | description: Print lines to prime the nozzle before a print 3 | gcode: 4 | _MACRO_START NAME="_PRINT_PRIMER_LINES" 5 | G90 ; Absolute Positioning 6 | G1 Z5 F1200 ; Move nozzle up little to prevent scratching the bed 7 | G1 X5 Y30 F2700; Move to start position X/Y 8 | G1 Z0.25 F1200; Move to start position Z 9 | G1 E2 F3600 ; Prime nozzle, globbing if needed 10 | G1 X5 Y130 F2700 E8 ; Draw the first line 11 | G1 X5.6 Y130 F2700 ; Move to side a little 12 | G1 X5.6 Y30 F2700 E16 ; Draw the second line 13 | _AFTER_PRINT_WIPE 14 | G92 E0 ; Reset Extruder 15 | G1 Z5.0 F1200 ; Move nozzle up little to prevent scratching the bed 16 | _MACRO_END NAME="_PRINT_PRIMER_LINES" -------------------------------------------------------------------------------- /macro/RESUME.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro RESUME] 2 | description: Resume the actual running print 3 | rename_existing: RESUME_BASE 4 | gcode: 5 | _MACRO_START NAME="RESUME" 6 | ##### read E from pause macro ##### 7 | {% set E = printer["gcode_macro PAUSE"].extrude|float %} 8 | #### get VELOCITY parameter if specified #### 9 | {% if 'VELOCITY' in params|upper %} 10 | {% set get_params = ('VELOCITY=' + params.VELOCITY) %} 11 | {%else %} 12 | {% set get_params = "" %} 13 | {% endif %} 14 | ##### end of definitions ##### 15 | {% if printer.extruder.can_extrude|lower == 'true' %} 16 | G91 ; Relative positioning 17 | G1 E{E} F3600 18 | {% else %} 19 | {action_respond_info("Extruder not hot enough")} 20 | {% endif %} 21 | RESUME_BASE {get_params} 22 | _MACRO_END NAME="RESUME" -------------------------------------------------------------------------------- /macro/FILAMENT_CHANGE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro FILAMENT_CHANGE] 2 | description: 3 | M600: Filament Change. This macro will pause the printer, move the tool to 4 | the change position, and retract the filament 50mm. Adjust the retraction 5 | settings for your own extruder. After filament has been changed, the print can 6 | be resumed from its previous position with the "RESUME" gcode. 7 | gcode: 8 | _MACRO_START NAME="FILAMENT_CHANGE" 9 | {% set X = params.X|default(0)|float %} 10 | {% set Y = params.Y|default(printer.toolhead.axis_maximum.y - 20)|float %} 11 | {% set Z = params.Z|default(5)|float %} 12 | PAUSE 13 | G91 ; Relative positioning 14 | G1 E-.8 F3600 ; Quick Retract 15 | PRESENT_PRINT 16 | G91 ; Relative positioning 17 | G1 E-100 F3600 ; Retract out of nozzle 18 | _MACRO_END NAME="FILAMENT_CHANGE" 19 | -------------------------------------------------------------------------------- /webcam.conf: -------------------------------------------------------------------------------- 1 | ### webcam.conf 2 | ### This is mainsail / MainsailOS default config. 3 | ### See docs.mainsail.xyz/whatever for Details to configure to your needs. 4 | 5 | 6 | [webcamd] 7 | log_path: ~/klipper_logs/webcamd.log # Default logfile in ~/klipper_logs/webcamd.log 8 | log_level: quiet # Valid Options are quiet/verbose/debug 9 | 10 | [cam 1] 11 | streamer: ustreamer # ustreamer/rtsp 12 | port: 8080 # Port 13 | device: /dev/video0 # See Log for available ... 14 | resolution: 640x480 # widthxheight format 15 | max_fps: 15 # If Hardware Supports this it will be forced, ohterwise ignored/coerced. 16 | #custom_flags: # You can run the Stream Services with custom flags. 17 | -------------------------------------------------------------------------------- /macro/PID_TUNE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro PID_TUNE] 2 | description: PID tune the extruder or bed 3 | gcode: 4 | _MACRO_START SAVE=0 NAME="PID_TUNE" 5 | {% set FAN_PERCENT = params.FAN_PERCENT|default(100)|float %} 6 | {% set NOZZLE_TEMP = params.NOZZLE_TEMP|default(210)|float %} 7 | {% set BED_TEMP = params.BED_TEMP|default(50)|float %} 8 | M106 S{2.55 * FAN_PERCENT} 9 | SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={BED_TEMP} 10 | SET_HEATER_TEMPERATURE HEATER=extruder TARGET={NOZZLE_TEMP} 11 | HOME 12 | M190 S{BED_TEMP} ; Wait for bed to finish heating so we can print primer lines 13 | M109 S{NOZZLE_TEMP} ; Wait for nozzle to finish heating so we can print primer lines 14 | PID_CALIBRATE HEATER=extruder TARGET={NOZZLE_TEMP} 15 | PID_CALIBRATE HEATER=heater_bed TARGET={BED_TEMP} 16 | SAVE_CONFIG 17 | _MACRO_END LOAD=0 NAME="PID_TUNE" 18 | -------------------------------------------------------------------------------- /macro/_AFTER_LAYER_CHANGE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _AFTER_LAYER_CHANGE] 2 | description: After layer change 3 | gcode: 4 | _MACRO_START LOG=0 NAME="_AFTER_LAYER_CHANGE" 5 | {% set LAYER = params.LAYER|default(-1)|int %} 6 | {% set LAST_LAYER = params.LAST_LAYER|default(-1)|int %} 7 | {% set HEIGHT = params.HEIGHT|default(-1)|float %} 8 | {% if LAYER > -1 %} 9 | {% if LAST_LAYER > -1 %} 10 | {% set FMT_LAYER = "layer " ~ LAYER ~ "/" ~ LAST_LAYER %} 11 | {% else %} 12 | {% set FMT_LAYER = "layer " ~ LAYER %} 13 | {% endif %} 14 | {% else %} 15 | {% set FMT_LAYER = "new layer" %} 16 | {% endif %} 17 | {% if HEIGHT > -1 %} 18 | {% set FMT_HEIGHT = " (Z = " ~ HEIGHT ~ ")" %} 19 | {% else %} 20 | {% set FMT_HEIGHT = "" %} 21 | {% endif %} 22 | LOG TYPE="STATUS" MSG="Starting {FMT_LAYER}{FMT_HEIGHT}" 23 | _MACRO_END LOG=0 NAME="_AFTER_LAYER_CHANGE" 24 | -------------------------------------------------------------------------------- /macro/_AFTER_PRINT_WIPE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _AFTER_PRINT_WIPE] 2 | description: Tries to break (aka wipe) any extra filament attached to the nozzle after a print 3 | gcode: 4 | _MACRO_START NAME="_AFTER_PRINT_WIPE" 5 | G91 ; Relative positioning 6 | G1 X1 E-3 F3600 ; Quick X move and retract to stop globbing 7 | G1 X-1 Z0.2 F1200 ; Raise Z and move back to original X position 8 | G1 Z0.8 E-7 F1200 ; Retract and raise Z to try and break string 9 | ; Move slowly try to stretch string (to make it easier to break) 10 | G1 X1 F1200 ; Right 11 | G1 Y-1 F1200 ; Down 12 | G1 X-2 F1200 ; Left 13 | G1 Y2 F1200 ; Up 14 | ; Move quickly to try and break string 15 | G1 Z10 F1200 ; Raise Z 16 | G1 X3 F3600 ; Right 17 | G1 Y-4 F3600 ; Down 18 | G1 X-4 F3600 ; Left 19 | G1 Y4 F3600 ; Up 20 | G1 E9 F3600 ; Prime nozzle (A little under to account for pressure in the nozzle) 21 | _MACRO_END NAME="_AFTER_PRINT_WIPE" -------------------------------------------------------------------------------- /macro/M205.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M205] 2 | description: 3 | Set various motion settings. Klipper only supports square corner velocity, 4 | so this only use the slowest jerk setting to set that. 5 | See: https://marlinfw.org/docs/gcode/M204.html 6 | gcode: 7 | ; Start Macro (We are modifying the state) 8 | {% set SELF = 'M205' %} 9 | _MACRO_START LOG=0 SAVE=0 NAME="{SELF}" 10 | 11 | ; Params (marlin) 12 | {% set X_JERK = params.X|default(0)|float %} 13 | {% set Y_JERK = params.Y|default(0)|float %} 14 | 15 | ; Run macro 16 | {% if 0 < X_JERK + Y_JERK %} 17 | ; We can only set 1 jerk speed, so just choose the slowest non-zero 18 | {% set JERK = [X_JERK, Y_JERK]|select('greaterthan', 0)|min %} 19 | 20 | SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={JERK} 21 | 22 | LOG TYPE=STATUS MSG="Set square corner velocity (aka jerk) to {JERK}" 23 | {% endif %} 24 | 25 | ; End Macro 26 | _MACRO_END LOG=0 LOAD=0 NAME="{SELF}" 27 | -------------------------------------------------------------------------------- /macro/M203.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M203] 2 | description: 3 | Set the max feedrate for one or more axes. Klipper only global velocity, 4 | so this will only use the slowest X or Y velocity setting to set that. 5 | See: https://marlinfw.org/docs/gcode/M203.html 6 | gcode: 7 | ; Start Macro (We are modifying the state) 8 | {% set SELF = 'M203' %} 9 | _MACRO_START LOG=0 SAVE=0 NAME="{SELF}" 10 | 11 | ; Params (marlin) 12 | {% set X_VELOCITY = params.X|default(0)|float %} 13 | {% set Y_VELOCITY = params.Y|default(0)|float %} 14 | 15 | ; Run macro 16 | {% if 0 < X_VELOCITY + Y_VELOCITY %} 17 | ; We can only set 1 jerk speed, so just choose the slowest non-zero 18 | {% set VELOCITY = [X_VELOCITY, Y_VELOCITY]|select('greaterthan', 0)|min %} 19 | 20 | SET_VELOCITY_LIMIT VELOCITY={VELOCITY} 21 | LOG TYPE=STATUS MSG="Set max velocity to {VELOCITY}" 22 | {% endif %} 23 | 24 | ; End Macro 25 | _MACRO_END LOG=0 LOAD=0 NAME="{SELF}" 26 | -------------------------------------------------------------------------------- /config/features.cfg: -------------------------------------------------------------------------------- 1 | ### Flags ###################################################################### 2 | [display_status] 3 | [pause_resume] 4 | 5 | ### Enable GCODE Features ###################################################### 6 | [gcode_arcs] 7 | resolution: 0.64 8 | # An arc will be split into segments. Each segment's length will 9 | # equal the resolution in mm set above. Lower values will produce a 10 | # finer arc, but also more work for your machine. Arcs smaller than 11 | # the configured value will become straight lines. The default is 12 | # 1mm. 13 | 14 | [respond] 15 | # default_type: command 16 | # Sets the default prefix of the "M118" and "RESPOND" output to one 17 | # of the following: 18 | # echo: "echo: " (This is the default) 19 | # command: "// " 20 | # error: "!! " 21 | default_prefix: "" 22 | # Directly sets the default prefix. If present, this value will 23 | # override the "default_type". 24 | -------------------------------------------------------------------------------- /macro/SET_VAR.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro SET_VAR] 2 | description : Save a variable that will persist through restarts 3 | gcode : 4 | ; Start Macro 5 | {% set SELF = 'SET_VAR' %} 6 | _MACRO_START LOG=0 SAVE=0 NAME="{SELF}" 7 | 8 | ; Params 9 | {% set NAME = params.NAME|string %} 10 | {% set VALUE = params.VALUE|string|replace("\"", "\\\"") %} 11 | 12 | ; Run macro 13 | {% if 'NAME' not in params %} 14 | LOG TYPE=ERROR MACRO="{SELF}" MSG="Missing NAME parameter" 15 | {% elif 'VALUE' not in params %} 16 | LOG TYPE=ERROR MACRO="{SELF} MSG="Missing VALUE parameter" 17 | {% else %} 18 | {% if NAME != NAME|lower %} 19 | LOG TYPE=WARNING MACRO={SELF} MSG="Variables must be lowercase, '{NAME}' was passed but '{NAME|lower}' will be used" 20 | {% set NAME = NAME|lower %} 21 | {% endif %} 22 | SAVE_VARIABLE VARIABLE={params.NAME} VALUE="{params.VALUE}" 23 | {% endif %} 24 | 25 | ; End Macro 26 | _MACRO_END LOG=0 LOAD=0 NAME="{SELF}" 27 | -------------------------------------------------------------------------------- /macro/VAR_DUMP.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro VAR_DUMP] 2 | gcode: 3 | {% set filter_name = params.NAME|default('')|string|lower %} 4 | {% set filter_value = params.VALUE|default('')|string|lower %} 5 | {% set show_cfg = params.SHOW_CFG|default(0)|int %} 6 | 7 | {% set out = [] %} 8 | 9 | {% for key1 in printer %} 10 | {% for key2 in printer[key1] %} 11 | {% if (show_cfg or not (key1|lower == 'configfile' and key2|lower in ['config', 'settings'])) and (filter_name in key1|lower or filter_name in key2|lower) and filter_value in printer[key1][key2]|string|lower %} 12 | {% set dummy = out.append("printer['%s'].%s = %s" % (key1, key2, printer[key1][key2])) %} 13 | {% endif %} 14 | {% else %} 15 | {% if filter_name in key1|lower and filter_value in printer[key1]|string|lower %} 16 | {% set dummy = out.append("printer['%s'] = %s" % (key1, printer[key1])) %} 17 | {% endif %} 18 | {% endfor %} 19 | {% endfor %} 20 | 21 | {action_respond_info(out|join("\n"))} 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Summers Klipper Suite 2 | A collection of macros and configurations for Klipper (3D printer firmware) 3 | 4 | --- 5 | 6 | ### WARNING: 7 | This repo is currently only configured for my exact Ender-3 v2 with its set of hardware. 8 | 9 | HOWEVER, it should be pretty easy to modify it to work for any other printer that klipper supports by just clearing the auto-generated portion of `./printer.cfg` and then splitting your existing `printer.cfg` into the respective `./config/*.cfg` files. 10 | 11 | Alternatively, you can just copy the `./macro` directory into your `klipper_config` directory and add `[include macro/*.cfg]` to your existing `printer.cfg` 12 | 13 | ## Usage & Contributing 14 | 15 | You are welcome to use this as-is and request any features as well as report any bugs as Github issues. 16 | 17 | Eventually there will be formal Alpha & Beta versions with proper installation instructions, easier install, versioning, etc., but for now this will have to do if you want to use it immediately. 18 | -------------------------------------------------------------------------------- /macro/_MACRO_START.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _MACRO_START] 2 | description: Start status and save state manager for macros 3 | gcode: 4 | ; Start Macro (Skip recursion) 5 | {% set SELF = '_MACRO_START' %} 6 | 7 | ; Config defaults 8 | {% set DEBUG = 0 %} 9 | 10 | ; Import vars 11 | {% if 'save_variables' in printer %} 12 | {% set vars = printer.save_variables.variables %} 13 | {% if 'debug' in vars %} 14 | {% set DEBUG = vars.debug %} 15 | {% endif %} 16 | {% endif %} 17 | 18 | ; Params 19 | {% set NAME = params.NAME|default('UNKNOWN_MACRO') %} 20 | {% set LOG = params.LOG|default(1)|int %} 21 | {% set SAVE = params.SAVE|default(1)|int %} 22 | {% set DEBUG = params.DEBUG|default(DEBUG)|int > 0 %} 23 | {% set RAW_PARAMS = params.RAW_PARAMS|default('')|string %} 24 | 25 | ; Run Macro 26 | {% if DEBUG %} 27 | LOG TYPE=COMMAND MSG="{NAME} {RAW_PARAMS}" 28 | {% endif %} 29 | {% if LOG %} 30 | _MACRO_STATUS NAME="{NAME}" 31 | {% endif %} 32 | {% if SAVE %} 33 | SAVE_GCODE_STATE NAME="{NAME}_STATE" 34 | {% endif %} 35 | 36 | ; End Macro (Skip recursion) 37 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2021 Nicholas Summers 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | -------------------------------------------------------------------------------- /macro/LOG.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro LOG] 2 | description: Log a message back to the console 3 | gcode: 4 | ; Config defaults 5 | {% set VALID_TYPES = ['ECHO', 'COMMAND', 'STATUS', 'INFO', 'WARNING', 'ERROR', 'FATAL'] %} 6 | {% set ERROR_TYPES = ['WARNING', 'ERROR', 'FATAL'] %} 7 | 8 | ; Params 9 | {% set MSG = params.MSG|string %} 10 | {% set TYPE = params.TYPE|default("INFO")|string|upper %} 11 | {% set MACRO = params.MACRO|default("")|string|upper %} 12 | 13 | ; Validate params 14 | {% if TYPE not in VALID_TYPES %} 15 | {action_raise_error("[FATAL] The LOG TYPE '" ~ TYPE ~ "' is not valid")} 16 | {% endif %} 17 | 18 | ; Run macro 19 | {% set PREFIX = "[" ~ TYPE ~ "] " %} 20 | {% set SUFFIX = "" %} 21 | 22 | {% if TYPE == "STATUS" %} 23 | {% set PREFIX = ">> " %} 24 | {% set SUFFIX = " <<" %} 25 | {% elif TYPE == "ECHO" %} 26 | {% set PREFIX = "echo: " %} 27 | {% elif TYPE == "COMMAND" %} 28 | {% set PREFIX = "//// " %} 29 | {% elif TYPE == "ERROR" %} 30 | {% set PREFIX = "!!!! " %} 31 | {% endif %} 32 | 33 | {% if MACRO != "" %} 34 | {% set SUFFIX = SUFFIX ~ " (in " ~ MACRO ~ ")" %} 35 | {% endif %} 36 | 37 | {% set OUTPUT = PREFIX ~ MSG ~ SUFFIX %} 38 | 39 | {% if TYPE in ERROR_TYPES %} 40 | RESPOND TYPE=ERROR MSG="{OUTPUT}" 41 | {% if TYPE == 'FATAL' %} 42 | {action_raise_error(OUTPUT)} 43 | {% endif %} 44 | {% else %} 45 | RESPOND MSG="{OUTPUT}" 46 | {% endif %} 47 | -------------------------------------------------------------------------------- /macro/_ASSERT_PRINTING.cfg: -------------------------------------------------------------------------------- 1 | ;;; 2 | ; @param string MACRO The name of the macro calling this macro 3 | ; @param boolean INVERT Set to 1 to invert the assert 4 | ; @param string ERROR_TYPE The log type to use on errors 5 | ;;; 6 | [gcode_macro _ASSERT_PRINTING] 7 | variable_is_printing: 0 8 | description: 9 | Error and cancel the current macro chain if the printer is NOT printing. Can 10 | be inverted. 11 | gcode: 12 | ; Start Macro 13 | {% set SELF = '_ASSERT_PRINTING' %} 14 | _MACRO_START LOG=0 SAVE=0 NAME="{SELF}" 15 | 16 | ; Set Defaults 17 | {% set IS_PRINTING = false %} 18 | 19 | ; Params 20 | {% set MACRO = params.MACRO|default(SELF)|string %} 21 | {% set INVERT = params.INVERT|default(0)|int > 0 %} 22 | {% set ERROR_TYPE = params.ERROR_TYPE|default('FATAL')|string %} 23 | 24 | ; Run macro 25 | {% if printer.idle_timeout.state == "Printing" %} 26 | {% set IS_PRINTING = true %} 27 | {% endif %} 28 | 29 | SET_GCODE_VARIABLE MACRO={SELF} VARIABLE=is_printing VALUE={IS_PRINTING} 30 | 31 | {% if printer.idle_timeout.state != "Printing" and INVERT == 0 %} 32 | LOG TYPE={ERROR_TYPE} MACRO={MACRO} MSG="This command cannot be used unless you are printing" 33 | {% elif printer.idle_timeout.state == "Printing" and INVERT %} 34 | LOG TYPE={ERROR_TYPE} MACRO={MACRO} MSG="This command cannot be used while printing" 35 | {% endif %} 36 | 37 | ; End Macro 38 | _MACRO_END LOG=0 LOAD=0 NAME="{SELF}" 39 | -------------------------------------------------------------------------------- /macro/HOME.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro HOME] 2 | description: Home all axes, but only if needed 3 | gcode: 4 | ; Start Macro 5 | _MACRO_START NAME="HOME" 6 | 7 | ; Config defaults 8 | {% set CURRENT_X = printer.toolhead.position.x %} 9 | {% set CURRENT_Y = printer.toolhead.position.x %} 10 | {% set CURRENT_Z = printer.toolhead.position.x %} 11 | 12 | ; Params 13 | {% set FORCE = params.FORCE|default(0)|int > 0 %} 14 | {% set CHECK = params.CHECK|default(0)|int > 0 %} 15 | {% set CHECK_AXIS = params.CHECK_AXIS|default('')|lower %} 16 | {% set MOVE = params.MOVE|default(0)|int > 0 %} 17 | {% set X = params.X|default(CURRENT_X)|float %} 18 | {% set Y = params.Y|default(CURRENT_Y)|float %} 19 | {% set Z = params.Z|default(CURRENT_Z)|float %} 20 | 21 | ; Run macro 22 | {% if CHECK %} 23 | _ASSERT_HOMED 24 | {% endif %} 25 | {% if CHECK_AXIS != '' and printer.toolhead.homed_axes != "xyz" %} 26 | {% if CHECK_AXIS not in printer.toolhead.homed_axes %} 27 | LOG TYPE=FATAL MACRO=HOME MSG="Printer is not homed in "{CHECK_AXIS|upper}" axis!" 28 | {% endif %} 29 | {% endif %} 30 | {% if FORCE == 1 or printer.toolhead.homed_axes != "xyz" %} 31 | LOG MSG="Homing..." 32 | G28 ; Home X, Y, & Z 33 | {% if MOVE %} 34 | MOVE X="{X}" Y="{Y}" Z="{Z}" ; Move to starting X/Y position 35 | {% endif %} 36 | {% else %} 37 | LOG MSG="Homing Skipped" 38 | {% endif %} 39 | 40 | ; End Macro 41 | _MACRO_END NAME="HOME" 42 | -------------------------------------------------------------------------------- /macro/_ASSERT_HOMED.cfg: -------------------------------------------------------------------------------- 1 | ;;; 2 | ; @param string MACRO The name of the macro calling this macro 3 | ; @param boolean INVERT Set to 1 to invert the assert 4 | ; @param string ERROR_TYPE The log type to use on errors 5 | ; @param boolean FIX Set to 1 to auto fix if not homed 6 | ;;; 7 | [gcode_macro _ASSERT_HOMED] 8 | variable_is_homed: 0 9 | description: 10 | Error and cancel the current macro chain if the printer is NOT homed. Can 11 | be inverted. 12 | gcode: 13 | ; Start Macro 14 | {% set SELF = '_ASSERT_HOMED' %} 15 | _MACRO_START LOG=0 SAVE=0 NAME="{SELF}" 16 | 17 | ; Set Defaults 18 | {% set IS_HOMED = false %} 19 | 20 | ; Params 21 | {% set MACRO = params.MACRO|default(SELF)|string %} 22 | {% set INVERT = params.INVERT|default(0)|int > 0 %} 23 | {% set ERROR_TYPE = params.ERROR_TYPE|default('FATAL')|string %} 24 | {% set FIX = params.FIX|default(0)|int > 0 %} 25 | 26 | ; Run macro 27 | {% if printer.toolhead.homed_axes == "xyz" %} 28 | {% set IS_HOMED = true %} 29 | {% elif FIX %} 30 | HOME 31 | {% set IS_HOMED = true %} 32 | {% endif %} 33 | 34 | SET_GCODE_VARIABLE MACRO={SELF} VARIABLE=is_homed VALUE={IS_HOMED} 35 | 36 | {% if printer.toolhead.homed_axes != "xyz" and INVERT == 0 %} 37 | LOG TYPE={ERROR_TYPE} MACRO="{MACRO}" MSG="This command cannot be used unless the printer is homed" 38 | {% elif printer.toolhead.homed_axes == "xyz" and INVERT %} 39 | LOG TYPE={ERROR_TYPE} MACRO="{MACRO}" MSG="This command cannot be used unless the printer is NOT homed" 40 | {% endif %} 41 | 42 | ; End Macro 43 | _MACRO_END LOG=0 LOAD=0 NAME="{SELF}" 44 | -------------------------------------------------------------------------------- /macro/_BEFORE_LAYER_CHANGE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _BEFORE_LAYER_CHANGE] 2 | description: Tries to break (aka wipe) any extra filament attached to the nozzle after a print 3 | gcode: 4 | ; Start Macro 5 | _MACRO_START LOG=0 NAME="_BEFORE_LAYER_CHANGE" 6 | 7 | ; Config defaults 8 | {% set DSCV_ENABLED = 0 %} 9 | {% set DSCV_MIN = 1 %} 10 | {% set DSCV_MAX = 5 %} 11 | {% set DSCV_STEP = 1 %} 12 | 13 | ; Import vars 14 | {% if 'save_variables' in printer %} 15 | {% set vars = printer.save_variables.variables %} 16 | {% if 'dscv_enabled' in vars %} 17 | {% set DSCV_ENABLED = vars.dscv_enabled %} 18 | {% endif %} 19 | {% if 'dscv_min' in vars %} 20 | {% set DSCV_MIN = vars.dscv_min %} 21 | {% endif %} 22 | {% if 'dscv_max' in vars %} 23 | {% set DSCV_MAX = vars.dscv_max %} 24 | {% endif %} 25 | {% if 'dscv_step' in vars %} 26 | {% set DSCV_STEP = vars.dscv_step %} 27 | {% endif %} 28 | {% endif %} 29 | 30 | ; Params 31 | {% set DSCV_ENABLED = params.DSCV_ENABLED|default(DSCV_ENABLED)|int > 0 %} 32 | {% set LAYER = params.LAYER|default(-1)|int %} 33 | {% set LAST_LAYER = params.LAST_LAYER|default(-1)|int %} 34 | {% set HEIGHT = params.HEIGHT|default(-1)|float %} 35 | 36 | ; Run macro 37 | {% if DSCV_ENABLED == 1 and LAYER > -1 %} 38 | {% set DSCV = [DSCV_MAX, [DSCV_MIN, DSCV_MIN + (DSCV_STEP * LAYER)]|max]|min %} 39 | {% if DSCV != printer.toolhead.square_corner_velocity %} 40 | SET_VELOCITY_LIMIT SQUARE_CORNER_VELOCITY={DSCV} 41 | LOG TYPE="STATUS" MSG="DSCV set to {DSCV}" 42 | {% endif %} 43 | {% endif %} 44 | 45 | ; End Macro 46 | _MACRO_END LOG=0 NAME="_BEFORE_LAYER_CHANGE" 47 | -------------------------------------------------------------------------------- /macro/SET_FAN_SPEED.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro SET_FAN_SPEED] 2 | description: Set the fan speed based on either a PERCENT or a INT from 0-255 (Shows REAL percent when set) 3 | gcode: 4 | ; Setup vars 5 | {% set PERCENT = params.PERCENT|default(0)|float %} 6 | {% set INT = params.INT|default(0)|int %} 7 | {% set REAL_PERCENT = 0 %} 8 | {% set REAL_INT = 0 %} 9 | 10 | ; Check for valid params 11 | {% if params.PERCENT is defined and params.INT is defined %} 12 | LOG TYPE="WARNING" MSG="Both PERCENT and INT are set. Using PERCENT." 13 | {% set INT = 0 %} 14 | {% endif %} 15 | {% if params.PERCENT is defined %} 16 | {% if PERCENT > 100 %} 17 | LOG TYPE="WARNING" MSG="PERCENT must be between 0 and 100. Setting to 100." 18 | {% set PERCENT = 100 %} 19 | {% elif PERCENT < 0 %} 20 | LOG TYPE="WARNING" MSG="PERCENT must be between 0 and 100. Setting to 0." 21 | {% set PERCENT = 0 %} 22 | {% endif %} 23 | {% elif params.INT is defined != 0 %} 24 | {% if INT > 255 %} 25 | LOG TYPE="WARNING" MSG="INT must be between 0 and 255. Setting to 255." 26 | {% set INT = 255 %} 27 | {% elif INT < 0 %} 28 | LOG TYPE="WARNING" MSG="INT must be between 0 and 255. Setting to 0." 29 | {% set INT = 0 %} 30 | {% endif %} 31 | {% else %} 32 | LOG MSG="No fan speed set. Defaulting to 0%" 33 | {% endif %} 34 | 35 | ; Determine real values 36 | {% if PERCENT != 0 %} 37 | {% set REAL_INT = ((PERCENT / 100)*255)|round|int %} 38 | {% set REAL_PERCENT = REAL_INT / 255 * 100 %} 39 | {% elif INT != 0 %} 40 | {% set REAL_INT = INT %} 41 | {% set REAL_PERCENT = INT / 255 * 100 %} 42 | {% endif %} 43 | 44 | ; Set fan speed 45 | LOG MSG="Setting fan speed to {REAL_PERCENT|round(2)}% ({REAL_INT} of 255)" 46 | M106 S{REAL_INT} 47 | -------------------------------------------------------------------------------- /moonraker.conf: -------------------------------------------------------------------------------- 1 | [server] 2 | host: 0.0.0.0 3 | port: 7125 4 | enable_debug_logging: False 5 | klippy_uds_address: /tmp/klippy_uds 6 | 7 | [database] 8 | database_path: ~/.moonraker_database 9 | 10 | [authorization] 11 | trusted_clients: 12 | 10.0.0.0/16 13 | 10.0.0.0/8 14 | 127.0.0.0/8 15 | 169.254.0.0/16 16 | 172.16.0.0/12 17 | 192.168.0.0/16 18 | FE80::/10 19 | ::1/128 20 | cors_domains: 21 | *.lan 22 | *.local 23 | *://my.mainsail.xyz 24 | *://app.fluidd.xyz 25 | 26 | [file_manager] 27 | config_path: /home/pi/klipper_config 28 | log_path: /home/pi/klipper_logs 29 | 30 | [octoprint_compat] 31 | 32 | [history] 33 | 34 | [update_manager] 35 | channel: dev 36 | 37 | [update_manager mainsail] 38 | type: web 39 | repo: mainsail-crew/mainsail 40 | path: ~/mainsail 41 | 42 | [update_manager fluidd] 43 | type: web 44 | repo: fluidd-core/fluidd 45 | path: ~/fluidd 46 | 47 | #[update_manager KlipperScreen] 48 | #type: git_repo 49 | #path: /home/pi/KlipperScreen 50 | #origin: https://github.com/jordanruthe/KlipperScreen.git 51 | #env: /home/pi/.KlipperScreen-env/bin/python 52 | #requirements: scripts/KlipperScreen-requirements.txt 53 | #install_script: scripts/KlipperScreen-install.sh 54 | 55 | # Crowsnest update_manager entry 56 | [update_manager crowsnest] 57 | type: git_repo 58 | path: ~/crowsnest 59 | origin: https://github.com/mainsail-crew/crowsnest.git 60 | managed_services: crowsnest 61 | install_script: tools/pkglist.sh 62 | 63 | # [webcam camera] 64 | # enabled: True 65 | # type: mjpg-streamer 66 | # stream_url: rtsp://nsummers:LEjohn23@10.0.0.155:554/stream1 67 | # snapshot_url: rtsp://nsummers:LEjohn23@10.0.0.155:554/stream2 68 | # flip_horizontal: False 69 | # flip_vertical: False 70 | # rotation: 0 71 | -------------------------------------------------------------------------------- /macro/M201.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M201] 2 | description: 3 | Set the max acceleration for one or more axes. Klipper only supports global 4 | acceleration and global deceleration, so this will only choose the slowest 5 | acceleration and apply "DECEL_FACTOR" or "F" to get the deceleration. - See: 6 | https://marlinfw.org/docs/gcode/M201.html 7 | gcode: 8 | ; Start Macro (We are modifying the state) 9 | {% set SELF = 'M201' %} 10 | _MACRO_START LOG=0 SAVE=0 NAME="{SELF}" 11 | 12 | ; Params (marlin) 13 | {% set DECEL_FACTOR = params.F|default(0.5)|float %} 14 | {% set X_ACCEL = params.X|default(0)|float %} 15 | {% set Y_ACCEL = params.Y|default(0)|float %} 16 | {% set Z_ACCEL = params.Z|default(0)|float %} 17 | {% set E_ACCEL = params.E|default(false) %} 18 | 19 | ; Params (custom) 20 | {% set DECEL_FACTOR = params.DECEL_FACTOR|default(DECEL_FACTOR)|float %} 21 | {% set X_ACCEL = params.X_ACCEL|default(X_ACCEL)|float %} 22 | {% set Y_ACCEL = params.Y_ACCEL|default(Y_ACCEL)|float %} 23 | {% set Z_ACCEL = params.Z_ACCEL|default(Z_ACCEL)|float %} 24 | 25 | ; Run macro 26 | {% if E_ACCEL is not false %} 27 | LOG TYPE=WARNING MARCO="{SELF}" MSG="The E parameter is not supported, use pressure advance instead" 28 | {% endif %} 29 | 30 | {% if 0 < X_ACCEL + Y_ACCEL + Z_ACCEL %} 31 | ; We can only set 1 acceleration speed, so just choose the slowest non-zero 32 | {% set ACCEL = [X_ACCEL, Y_ACCEL, Z_ACCEL]|select('greaterthan', 0)|min %} 33 | {% set DECEL = ACCEL * DECEL_FACTOR %} 34 | 35 | {% if DECEL > 0 %} 36 | SET_VELOCITY_LIMIT ACCEL={ACCEL} ACCEL_TO_DECEL={DECEL} 37 | LOG TYPE=STATUS MSG="Set acceleration to {ACCEL} and deceleration to {DECEL}" 38 | {% else %} 39 | SET_VELOCITY_LIMIT ACCEL={ACCEL} 40 | LOG TYPE=STATUS MSG="Set acceleration to {ACCEL} and deceleration is unchanged" 41 | {% endif %} 42 | {% endif %} 43 | 44 | ; End Macro 45 | _MACRO_END LOG=0 LOAD=0 NAME="{SELF}" 46 | -------------------------------------------------------------------------------- /config/init_vars.cfg: -------------------------------------------------------------------------------- 1 | [save_variables] 2 | filename: ~/variables.cfg 3 | 4 | [delayed_gcode init_vars] 5 | initial_duration: 1 6 | gcode: 7 | ; Since some of these are calculated it is easier to set them up in Jinja and 8 | ; then save them as variables. 9 | 10 | ; Movement min/max positions 11 | {% set X_MIN = 0 %} 12 | {% set X_MAX = 229 %} 13 | {% set Y_MIN = 0 %} 14 | {% set Y_MAX = 229 %} 15 | {% set Z_MIN = 0 %} 16 | {% set Z_MAX = 200 %} 17 | ; Movement buffers 18 | {% set X_BED_CLIP_BUFFER = 0 %} 19 | {% set Y_BED_CLIP_BUFFER = 25 %} 20 | {% set Z_BUFFER = 5 %} 21 | ; Macro Speed Settings - Theses are in mm/sec - NOT mm/min! 22 | {% set XY_SPEED = 50 %} 23 | {% set Z_SPEED = 20 %} 24 | {% set E_SPEED = 3 %} 25 | ; Dynamic Square Corner Velocity Settings 26 | {% set DSCV_ENABLED = 0 %} 27 | {% set DSCV_MIN = 0.5 %} 28 | {% set DSCV_MAX = 8 %} 29 | {% set DSCV_STEP = 0.8 %} 30 | ; Developer Options 31 | {% set DEBUG = 0 %} 32 | 33 | ; Save variables 34 | SET_VAR NAME=safe_x_min VALUE={X_MIN + X_BED_CLIP_BUFFER} 35 | SET_VAR NAME=safe_x_max VALUE={X_MAX - X_BED_CLIP_BUFFER} 36 | SET_VAR NAME=safe_y_min VALUE={Y_MIN + Y_BED_CLIP_BUFFER} 37 | SET_VAR NAME=safe_y_max VALUE={Y_MAX - Y_BED_CLIP_BUFFER} 38 | SET_VAR NAME=safe_z_min VALUE={Z_MIN} 39 | SET_VAR NAME=safe_z_max VALUE={Z_MAX} 40 | SET_VAR NAME=x_park VALUE={X_MIN} 41 | SET_VAR NAME=y_park VALUE={Y_MAX - Y_BED_CLIP_BUFFER} 42 | SET_VAR NAME=z_park VALUE={(Z_MAX - Z_MIN) / 2} 43 | SET_VAR NAME=z_buffer VALUE={Z_BUFFER} 44 | SET_VAR NAME=xy_speed VALUE={XY_SPEED} 45 | SET_VAR NAME=z_speed VALUE={Z_SPEED} 46 | SET_VAR NAME=e_speed VALUE={E_SPEED} 47 | SET_VAR NAME=xy_fspeed VALUE={XY_SPEED * 60} 48 | SET_VAR NAME=z_fspeed VALUE={Z_SPEED * 60} 49 | SET_VAR NAME=e_fspeed VALUE={E_SPEED * 60} 50 | SET_VAR NAME=dscv_enabled VALUE={DSCV_ENABLED} 51 | SET_VAR NAME=dscv_min VALUE={DSCV_MIN} 52 | SET_VAR NAME=dscv_max VALUE={DSCV_MAX} 53 | SET_VAR NAME=dscv_step VALUE={DSCV_STEP} 54 | SET_VAR NAME=debug VALUE={DEBUG} 55 | -------------------------------------------------------------------------------- /macro/M204.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro M204] 2 | rename_existing: M204.0 3 | description: 4 | Set the preferred starting acceleration (in units/s/s) for moves of different 5 | types. Klipper only supports global acceleration and global deceleration, so 6 | this will only choose the slowest acceleration and apply DECEL_FACTOR to get 7 | the deceleration. - See: https://marlinfw.org/docs/gcode/M204.html 8 | gcode: 9 | ; Start Macro (We are modifying the state) 10 | {% set SELF = 'M204' %} 11 | _MACRO_START LOG=0 SAVE=0 NAME="{SELF}" 12 | 13 | ; Params (marlin) 14 | {% set DECEL_FACTOR = params.F|default(0.5)|float %} 15 | {% set GLOBAL_ACCEL = params.S|default(0)|float %} 16 | {% set PRINT_ACCEL = params.P|default(0)|float %} 17 | {% set TRAVEL_ACCEL = params.T|default(0)|float %} 18 | {% set RETRACT_ACCEL = params.R|default(0)|float %} 19 | 20 | ; Params (custom) 21 | {% set DECEL_FACTOR = params.DECEL_FACTOR|default(DECEL_FACTOR)|float %} 22 | {% set GLOBAL_ACCEL = params.GLOBAL_ACCEL|default(GLOBAL_ACCEL)|float %} 23 | {% set PRINT_ACCEL = params.PRINT_ACCEL|default(PRINT_ACCEL)|float %} 24 | {% set TRAVEL_ACCEL = params.TRAVEL_ACCEL|default(TRAVEL_ACCEL)|float %} 25 | {% set RETRACT_ACCEL = params.RETRACT_ACCEL|default(RETRACT_ACCEL)|float %} 26 | 27 | ; Run macro 28 | {% if 0 < GLOBAL_ACCEL + PRINT_ACCEL + TRAVEL_ACCEL + RETRACT_ACCEL %} 29 | ; We can only set 1 acceleration speed, so just choose the slowest non-zero 30 | {% set ACCEL = [GLOBAL_ACCEL, PRINT_ACCEL, TRAVEL_ACCEL, RETRACT_ACCEL]|select('greaterthan', 0)|min %} 31 | {% set DECEL = ACCEL * DECEL_FACTOR %} 32 | 33 | {% if DECEL > 0 %} 34 | SET_VELOCITY_LIMIT ACCEL={ACCEL} ACCEL_TO_DECEL={DECEL} 35 | LOG TYPE=STATUS MSG="Set acceleration to {ACCEL} and deceleration to {DECEL}" 36 | {% else %} 37 | SET_VELOCITY_LIMIT ACCEL={ACCEL} 38 | LOG TYPE=STATUS MSG="Set acceleration to {ACCEL} and deceleration is unchanged" 39 | {% endif %} 40 | {% endif %} 41 | 42 | ; End Macro 43 | _MACRO_END LOG=0 LOAD=0 NAME="{SELF}" 44 | -------------------------------------------------------------------------------- /macro/PRESENT_PRINT.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro PRESENT_PRINT] 2 | description: 3 | Move the tool head to a corner so it is out of the way. (Back left) Works 4 | similar to G27, but instead only tries to raise Z by Z_BUFFER and will HOME 5 | if not already homed. 6 | gcode: 7 | ; Start Macro 8 | _MACRO_START NAME="PRESENT_PRINT" 9 | 10 | ; Config defaults 11 | {% set X_PARK = 20 %} 12 | {% set Y_PARK = printer.toolhead.axis_maximum.y - 20 %} 13 | {% set Z_BUFFER = 5 %} 14 | {% set XY_FSPEED = 2400 %} 15 | {% set Z_FSPEED = 600 %} 16 | {% set SAFE_Z_MAX = printer.toolhead.axis_maximum.z %} 17 | 18 | ; Import vars 19 | {% if 'save_variables' in printer %} 20 | {% set vars = printer.save_variables.variables %} 21 | {% if 'x_park' in vars %} 22 | {% set X_PARK = vars.x_park %} 23 | {% endif %} 24 | {% if 'y_park' in vars %} 25 | {% set Y_PARK = vars.y_park %} 26 | {% endif %} 27 | {% if 'z_buffer' in vars %} 28 | {% set Z_BUFFER = vars.z_buffer %} 29 | {% endif %} 30 | {% if 'xy_fspeed' in vars %} 31 | {% set XY_FSPEED = vars.xy_fspeed %} 32 | {% endif %} 33 | {% if 'z_fspeed' in vars %} 34 | {% set Z_FSPEED = vars.z_fspeed %} 35 | {% endif %} 36 | {% if 'safe_z_max' in vars %} 37 | {% set SAFE_Z_MAX = vars.safe_z_max %} 38 | {% endif %} 39 | {% endif %} 40 | 41 | ; Params 42 | {% set X_PARK = params.X_PARK|default(X_PARK)|float %} 43 | {% set Y_PARK = params.Y_PARK|default(Y_PARK)|float %} 44 | {% set Z_BUFFER = params.Z_BUFFER|default(Z_BUFFER)|float %} 45 | {% set XY_FSPEED = params.XY_FSPEED|default(XY_FSPEED)|int %} 46 | {% set Z_FSPEED = params.Z_FSPEED|default(Z_FSPEED)|int %} 47 | 48 | ; Run macro 49 | HOME 50 | 51 | {% if printer.toolhead.position.z + Z_BUFFER <= SAFE_Z_MAX %} 52 | ; We have room to raise by Z_BUFFER without going above SAFE_Z_MAX 53 | G91 ; Relative positioning 54 | G1 Z{Z_BUFFER} F{Z_FSPEED} 55 | G90 ; Absolute positioning 56 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 57 | {% else %} 58 | ; We are already at/near SAFE_Z_MAX, so just try to raise to SAFE_Z_MAX 59 | G90 ; Absolute positioning 60 | G1 Z{SAFE_Z_MAX} F{Z_FSPEED} 61 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 62 | {% endif %} 63 | 64 | ; End Macro 65 | _MACRO_END NAME="PRESENT_PRINT" 66 | -------------------------------------------------------------------------------- /webcam.txt: -------------------------------------------------------------------------------- 1 | ### Windows users: To edit this file use Notepad++, VSCode, Atom or SublimeText. 2 | ### Do not use Notepad or WordPad. 3 | 4 | ### MacOSX users: If you use Textedit to edit this file make sure to use 5 | ### "plain text format" and "disable smart quotes" in "Textedit > Preferences" 6 | 7 | ### Configure which camera to use 8 | # 9 | # Available options are: 10 | # - auto: tries first usb webcam, if that's not available tries raspi cam 11 | # - usb: only tries usb webcam 12 | # - raspi: only tries raspi cam 13 | # 14 | # Defaults to auto 15 | # 16 | camera="auto" 17 | 18 | ### Additional options to supply to MJPG Streamer for the USB camera 19 | # 20 | # See https://faq.octoprint.org/mjpg-streamer-config for available options 21 | # 22 | # Defaults to a resolution of 640x480 px and a framerate of 10 fps 23 | # 24 | camera_usb_options="-r 640x480 -f 5 -q 80" 25 | 26 | ### Additional webcam devices known to cause problems with -f 27 | # 28 | # Apparently there a some devices out there that with the current 29 | # mjpg_streamer release do not support the -f parameter (for specifying 30 | # the capturing framerate) and will just refuse to output an image if it 31 | # is supplied. 32 | # 33 | # The webcam daemon will detect those devices by their USB Vendor and Product 34 | # ID and remove the -f parameter from the options provided to mjpg_streamer. 35 | # 36 | # By default, this is done for the following devices: 37 | # Logitech C170 (046d:082b) 38 | # GEMBIRD (1908:2310) 39 | # Genius F100 (0458:708c) 40 | # Cubeternet GL-UPC822 UVC WebCam (1e4e:0102) 41 | # 42 | # Using the following option it is possible to add additional devices. If 43 | # your webcam happens to show above symptoms, try determining your cam's 44 | # vendor and product id via lsusb, activating the line below by removing # and 45 | # adding it, e.g. for two broken cameras "aabb:ccdd" and "aabb:eeff" 46 | # 47 | # additional_brokenfps_usb_devices=("aabb:ccdd" "aabb:eeff") 48 | # 49 | # 50 | #additional_brokenfps_usb_devices=() 51 | 52 | ### Additional options to supply to MJPG Streamer for the RasPi Cam 53 | # 54 | # See https://faq.octoprint.org/mjpg-streamer-config for available options 55 | # 56 | # Defaults to 10fps 57 | # 58 | #camera_raspi_options="-fps 10" 59 | 60 | ### Configuration of camera HTTP output 61 | # 62 | # Usually you should NOT need to change this at all! Only touch if you 63 | # know what you are doing and what the parameters mean. 64 | # 65 | # Below settings are used in the mjpg-streamer call like this: 66 | # 67 | # -o "output_http.so -w $camera_http_webroot $camera_http_options" 68 | # 69 | # Current working directory is the mjpg-streamer base directory. 70 | # 71 | #camera_http_webroot="./www-fluidd" 72 | #camera_http_options="-n" 73 | 74 | ### EXPERIMENTAL 75 | # Support for different streamer types. 76 | # 77 | # Available options: 78 | # mjpeg [default] - stable MJPG-streamer 79 | #camera_streamer=mjpeg 80 | -------------------------------------------------------------------------------- /macro/_BEFORE_PRINT.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro _BEFORE_PRINT] 2 | description: Prepare to print (Home, Preheat, Prime, Set Z-Offset, Show slicer config) 3 | gcode: 4 | _MACRO_START NAME="_BEFORE_PRINT" 5 | {% set PARALLEL_HEATING = params.PARALLEL_HEATING|default(1)|int %} 6 | {% set PRIMER_LINES = params.PRIMER_LINES|default(1)|int %} 7 | {% set Z_OFFSET = params.Z_OFFSET|default(0)|float %} 8 | {% set INITIAL_BED_TEMP = params.INITIAL_BED_TEMP|default(0)|float %} 9 | {% set BED_TEMP = params.BED_TEMP|default(0)|float %} 10 | {% set INITIAL_NOZZLE_TEMP = params.INITIAL_NOZZLE_TEMP|default(0)|float %} 11 | {% set PREHEAT_NOZZLE_TEMP = params.PREHEAT_NOZZLE_TEMP|default(100)|float %} 12 | {% set NOZZLE_TEMP = params.NOZZLE_TEMP|default(0)|float %} 13 | {% set LAYER_HEIGHT = params.LAYER_HEIGHT|default(0)|float %} 14 | {% set NOZZLE_DIAMETER = params.NOZZLE_DIAMETER|default(0)|float %} 15 | {% set INFILL_PERCENT = params.INFILL_PERCENT|default(-1) %} 16 | {% set INFILL_PATTERN = params.INFILL_PATTERN|default("unknown pattern")|string %} 17 | 18 | LOG MSG="=== SLICER CONFIG ===" 19 | {% if Z_OFFSET != 0 %} 20 | LOG MSG="Z-Offset: {Z_OFFSET}" 21 | {% endif %} 22 | {% if NOZZLE_DIAMETER > 0 %} 23 | LOG MSG="Nozzle Diameter: {NOZZLE_DIAMETER}" 24 | {% endif %} 25 | {% if BED_TEMP > 0 %} 26 | LOG MSG="Bed Temp: {BED_TEMP}C" 27 | {% endif %} 28 | {% if NOZZLE_TEMP > 0 %} 29 | LOG MSG="Nozzle Temp: {NOZZLE_TEMP}C" 30 | {% endif %} 31 | {% if LAYER_HEIGHT > 0 %} 32 | LOG MSG="Layer Height: {LAYER_HEIGHT}" 33 | {% endif %} 34 | {% if INFILL_PERCENT > -1 %} 35 | LOG MSG="Infill: {INFILL_PERCENT} ({INFILL_PATTERN})" 36 | {% endif %} 37 | 38 | CLEAR_PAUSE ; 39 | {% if INITIAL_BED_TEMP != 0 %} 40 | ; Bring bed up to initial temp 41 | SET_HEATER_TEMPERATURE HEATER=heater_bed TARGET={INITIAL_BED_TEMP} 42 | {% if PARALLEL_HEATING != 0 %} 43 | M190 S{INITIAL_BED_TEMP}; 44 | {% endif %} 45 | {% endif %} 46 | {% if PREHEAT_NOZZLE_TEMP != 0 %} 47 | ; Preheat nozzle so it doesn't take as long to reach initial temp, but not hot enough to melt filament 48 | SET_HEATER_TEMPERATURE HEATER=extruder TARGET={PREHEAT_NOZZLE_TEMP} 49 | {% endif %} 50 | G90 ; Absolute positioning 51 | G92 E0 ; Reset Extruder 52 | {% if INITIAL_BED_TEMP != 0 %} 53 | M190 S{INITIAL_BED_TEMP} ; Wait for bed to finish heating so we can probe accurately if using an ABL 54 | {% endif %} 55 | HOME FORCE=1; Home all axes, force because we may have changed the bed temperature 56 | G91 ; Relative positioning 57 | G1 Z5.0 F1200 ; Move nozzle up little to prevent scratching the bed 58 | PRESENT_PRINT ; Make it easy to clean bed while it is heating up 59 | {% if INITIAL_NOZZLE_TEMP != 0 %} 60 | SET_HEATER_TEMPERATURE HEATER=extruder TARGET={INITIAL_NOZZLE_TEMP} 61 | M109 S{INITIAL_NOZZLE_TEMP} ; Wait for nozzle to finish heating so we can print primer lines 62 | {% endif %} 63 | {% if PRIMER_LINES != 0 %} 64 | _PRINT_PRIMER_LINES 65 | {% endif %} 66 | {% if Z_OFFSET != 0 %} 67 | RESTORE_GCODE_STATE NAME="_BEFORE_PRINT_STATE" ; Manually load state so we can change it 68 | SET_Z_OFFSET VALUE={Z_OFFSET} 69 | _MACRO_END LOAD=0 NAME="_BEFORE_PRINT" 70 | {% else %} 71 | _MACRO_END NAME="_BEFORE_PRINT" 72 | {% endif %} 73 | -------------------------------------------------------------------------------- /crowsnest.conf: -------------------------------------------------------------------------------- 1 | #### crowsnest.conf 2 | #### This is a typical default config. 3 | #### Also used as default in mainsail / MainsailOS 4 | #### See: 5 | #### https://github.com/mainsail-crew/crowsnest/blob/master/README.md 6 | #### for details to configure to your needs. 7 | 8 | 9 | ##################################################################### 10 | #### ##### 11 | #### Information about ports and according URL's ##### 12 | #### ##### 13 | ##################################################################### 14 | #### ##### 15 | #### Port 8080 equals /webcam/?action=[stream/snapshot] ##### 16 | #### Port 8081 equals /webcam2/?action=[stream/snapshot] ##### 17 | #### Port 8082 equals /webcam3/?action=[stream/snapshot] ##### 18 | #### Port 8083 equals /webcam4/?action=[stream/snapshot] ##### 19 | #### ##### 20 | #### Note: These ports are default for most Mainsail ##### 21 | #### installations. To use any other port would involve ##### 22 | #### changing the proxy configuration or using directly ##### 23 | #### http://:/?action=[stream/snapshot] ##### 24 | #### ##### 25 | ##################################################################### 26 | #### RTSP Stream URL: ( if enabled and supported ) ##### 27 | #### rtsp://:/stream.h264 ##### 28 | ##################################################################### 29 | 30 | 31 | [crowsnest] 32 | log_path: /home/pi/printer_data/logs/crowsnest.log 33 | log_level: verbose # Valid Options are quiet/verbose/debug 34 | delete_log: false # Deletes log on every restart, if set to true 35 | no_proxy: false 36 | 37 | # [cam 1] 38 | # mode: ustreamer # ustreamer - Provides mjpg and snapshots. (All devices) 39 | # # camera-streamer - Provides webrtc, mjpg and snapshots. (rpi + Raspi OS based only) 40 | # enable_rtsp: true # If camera-streamer is used, this enables also usage of an rtsp server 41 | # rtsp_port: 8554 # Set different ports for each device! 42 | # port: 8080 43 | # source: rtsp://nsummers:LEjohn23@10.0.0.155:554/stream1 44 | # device: /dev/video0 45 | # resolution: 2560x1440 46 | # input_format: h264 47 | # codec: mjpeg 48 | # quality: 90 49 | # max_fps: 30 50 | 51 | 52 | 53 | # [cam 2] 54 | # mode: camera-streamer # ustreamer - Provides mjpg and snapshots. (All devices) 55 | # # camera-streamer - Provides webrtc, mjpg and snapshots. (rpi + Raspi OS based only) 56 | # enable_rtsp: true # If camera-streamer is used, this enables also usage of an rtsp server 57 | # rtsp_port: 8554 # Set different ports for each device! 58 | # port: 8081 # HTTP/MJPG Stream/Snapshot Port 59 | # device: /dev/video1 # See Log for available ... 60 | # resolution: 640x480 # widthxheight format 61 | # max_fps: 15 # If Hardware Supports this it will be forced, otherwise ignored/coerced. 62 | # #custom_flags: # You can run the Stream Services with custom flags. 63 | # #v4l2ctl: # Add v4l2-ctl parameters to setup your camera, see Log what your cam is capable of. 64 | -------------------------------------------------------------------------------- /macro/G27.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro G27] 2 | description: Move the tool head to a corner so it is out of the way. (Back left) 3 | gcode: 4 | ; Start Macro 5 | _MACRO_START LOG=0 NAME="G27" 6 | 7 | ; Config defaults 8 | {% set X_PARK = 20 %} 9 | {% set Y_PARK = printer.toolhead.axis_maximum.y - 20 %} 10 | {% set Z_PARK = printer.toolhead.axis_maximum.z / 2 %} 11 | {% set Z_BUFFER = 5 %} 12 | {% set XY_FSPEED = 2400 %} 13 | {% set Z_FSPEED = 600 %} 14 | {% set SAFE_Z_MAX = printer.toolhead.axis_maximum.z %} 15 | 16 | ; Import vars 17 | {% if 'save_variables' in printer %} 18 | {% set vars = printer.save_variables.variables %} 19 | {% if 'x_park' in vars %} 20 | {% set X_PARK = vars.x_park %} 21 | {% endif %} 22 | {% if 'y_park' in vars %} 23 | {% set Y_PARK = vars.y_park %} 24 | {% endif %} 25 | {% if 'z_park' in vars %} 26 | {% set Z_PARK = vars.z_park %} 27 | {% endif %} 28 | {% if 'z_buffer' in vars %} 29 | {% set Z_BUFFER = vars.z_buffer %} 30 | {% endif %} 31 | {% if 'xy_fspeed' in vars %} 32 | {% set XY_FSPEED = vars.xy_fspeed %} 33 | {% endif %} 34 | {% if 'z_fspeed' in vars %} 35 | {% set Z_FSPEED = vars.z_fspeed %} 36 | {% endif %} 37 | {% if 'safe_z_max' in vars %} 38 | {% set SAFE_Z_MAX = vars.safe_z_max %} 39 | {% endif %} 40 | {% endif %} 41 | 42 | ; Params (from Marlin docs) 43 | {% set P = params.P|default(0)|int %} 44 | 45 | ; Params (custom) 46 | {% set TYPE = params.TYPE|default(P)|int %} 47 | {% set X_PARK = params.X_PARK|default(X_PARK)|float %} 48 | {% set Y_PARK = params.Y_PARK|default(Y_PARK)|float %} 49 | {% set Z_PARK = params.Z_PARK|default(Z_PARK)|float %} 50 | {% set Z_BUFFER = params.Z_BUFFER|default(Z_BUFFER)|float %} 51 | {% set XY_FSPEED = params.XY_FSPEED|default(XY_FSPEED)|int %} 52 | {% set Z_FSPEED = params.Z_FSPEED|default(Z_FSPEED)|int %} 53 | 54 | ; Run macro 55 | HOME CHECK=true 56 | 57 | {% if TYPE == 1 %} 58 | ; Type/P=1 - No matter the current Z-pos, the nozzle will be raised/lowered to reach Z-park height 59 | {% if printer.toolhead.position.z < Z_PARK %} 60 | ; We are below Z park, so it is safe just to move Z first 61 | G90 ; Absolute positioning 62 | G1 Z{Z_PARK} F{Z_FSPEED} 63 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 64 | {% else %} 65 | ; We are above Z park, so it is NOT safe to move Z first, instead we move XY first. 66 | G90 ; Absolute positioning 67 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 68 | G1 Z{Z_PARK} F{Z_FSPEED} 69 | {% endif %} 70 | {% elif TYPE == 2 %} 71 | ; Type/P=2 - The nozzle height will be raised by Z-park amount but never going over SAFE_Z_MAX 72 | {% set Z_PARK = [printer.toolhead.position.z + Z_PARK, SAFE_Z_MAX]|min %} 73 | G90 ; Absolute positioning 74 | G1 Z{Z_PARK} F{Z_FSPEED} 75 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 76 | {% else %} 77 | ; Type/P=0 - If current Z-pos is lower than Z-park then the nozzle will be raised to reach Z-park height 78 | {% if printer.toolhead.position.z <= (Z_PARK - Z_BUFFER) %} 79 | ; Type/P=0 Acts relatively normally 80 | G90 ; Absolute positioning 81 | G1 Z{Z_PARK} F{Z_FSPEED} 82 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 83 | {% elif printer.toolhead.position.z + Z_BUFFER <= SAFE_Z_MAX %} 84 | ; Type/P=0 Would normally skip raising the Z, but we can still afford to raise it a little, so we do. 85 | G91 ; Relative positioning 86 | G1 Z{Z_BUFFER} F{Z_FSPEED} 87 | G90 ; Absolute positioning 88 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 89 | {% else %} 90 | ; Type/P=0 Acts relatively normally (but we are already at/near SAFE_Z_MAX) 91 | G90 ; Absolute positioning 92 | G1 Z{SAFE_Z_MAX} F{Z_FSPEED} 93 | G1 X{X_PARK} Y{Y_PARK} F{XY_FSPEED} 94 | {% endif %} 95 | {% endif %} 96 | 97 | ; End Macro 98 | _MACRO_END LOG=0 NAME="G27" 99 | -------------------------------------------------------------------------------- /config/machine.cfg: -------------------------------------------------------------------------------- 1 | # This file contains pin mappings for the stock 2020 Creality Ender 3 V2. To use 2 | # this config, during "make menuconfig" select the STM32F103 with a 3 | # "28KiB bootloader" and serial (on USART1 PA10/PA9) communication. See 4 | # docs/Config_Reference.md for a description of parameters. 5 | 6 | ### Ender-3 V2 Core Config ###################################################### 7 | [input_shaper] 8 | shaper_freq_x: 69.144 9 | shaper_freq_y: 67.797 10 | shaper_type: ei 11 | 12 | [safe_z_home] 13 | home_xy_position: 115,143 # Change coordinates to the center of your print bed (ADJUST FOR PROBE X & Y) 14 | z_hop: 30 # Move up 30mm 15 | z_hop_speed: 30 16 | 17 | [bed_mesh] 18 | speed: 150 19 | horizontal_move_z: 10 20 | mesh_min: 20,20 # Test the limits of where your ABL can reach to 21 | mesh_max: 220,209 # MAX - ABL_OFFSET for X & Y 22 | #probe_count: 13,21 23 | #probe_count: 41,81 24 | probe_count: 50,50 25 | algorithm: bicubic 26 | fade_start: 1 27 | fade_end: 4 28 | fade_target: 0 29 | 30 | [screws_tilt_adjust] 31 | screw1: 30.5,58 32 | screw1_name: ↙️ Front-Left Screw 33 | screw2: 199.5,58 34 | screw2_name: ↘️ Front-Right Screw 35 | screw3: 199.5,228 36 | screw3_name: ↗️ Back-Right Screw 37 | screw4: 30.5,228 38 | screw4_name: ↖️ Back-Left Screw 39 | horizontal_move_z: 10 40 | speed: 120 41 | screw_thread: CW-M4 42 | 43 | [stepper_x] 44 | step_pin: PC2 45 | dir_pin: PB9 46 | enable_pin: !PC3 47 | microsteps: 16 48 | rotation_distance: 40 49 | endstop_pin: ^PA5 50 | position_endstop: 0 51 | position_max: 292 52 | homing_speed: 50 53 | 54 | [stepper_y] 55 | step_pin: PB8 56 | dir_pin: PB7 57 | enable_pin: !PC3 58 | microsteps: 16 59 | rotation_distance: 40 60 | endstop_pin: ^PA6 61 | position_endstop: 0 62 | position_max: 236 63 | homing_speed: 50 64 | 65 | [stepper_z] 66 | step_pin: PB6 67 | dir_pin: !PB5 68 | enable_pin: !PC3 69 | microsteps: 16 70 | rotation_distance: 8 71 | endstop_pin: probe:z_virtual_endstop 72 | #position_endstop: 0.0 73 | position_max: 229 74 | position_min: -3 75 | 76 | [extruder] 77 | min_extrude_temp: 180 78 | pressure_advance: 0.3056 79 | max_extrude_only_distance: 300.0 80 | step_pin: PB4 81 | dir_pin: PB3 82 | enable_pin: !PC3 83 | microsteps: 16 84 | rotation_distance: 23.5 85 | nozzle_diameter: 0.600 86 | filament_diameter: 1.750 87 | heater_pin: PA1 88 | sensor_type: EPCOS 100K B57560G104F 89 | sensor_pin: PC5 90 | min_temp: 0 91 | max_temp: 300 92 | 93 | [heater_bed] 94 | heater_pin: PA2 95 | sensor_type: EPCOS 100K B57560G104F 96 | sensor_pin: PC4 97 | #control: pid 98 | # tuned for stock hardware with 50 degree Celsius target 99 | #pid_Kp: 54.027 100 | #pid_Ki: 0.770 101 | #pid_Kd: 948.182 102 | min_temp: 0 103 | max_temp: 130 104 | 105 | [fan] 106 | pin: PA0 107 | 108 | [printer] 109 | kinematics: cartesian 110 | max_velocity: 200 111 | max_accel: 6000 112 | # max_accel_to_decel: 650 # DEPRECATED 113 | max_z_velocity: 40 114 | max_z_accel: 2000 115 | square_corner_velocity: 5.0 116 | 117 | # shuts off the heaters after being idle 118 | [idle_timeout] 119 | timeout: 1800 120 | gcode: 121 | TURN_OFF_ALL 122 | 123 | ### Enable Hardware Addons ##################################################### 124 | [bltouch] 125 | sensor_pin: ^PB1 126 | control_pin: PB0 127 | x_offset: 0 128 | y_offset: -27 129 | #z_offset: 2.86 130 | 131 | # [output_pin BEEPER_Pin] 132 | # pin: PC6 133 | # pwm: True 134 | # value: 0 135 | # shutdown_value: 0 136 | # cycle_time: 0.001 137 | # scale: 1 138 | 139 | [filament_motion_sensor FILAMENT_SENSOR_01] 140 | detection_length: 10.00 # This can be adjusted to your desired level of sensitivity. 10 is a recommended value to prevent flow dropoff false triggers. 141 | extruder: extruder 142 | switch_pin: ^PG11 143 | pause_on_runout: False # This can be set to false to debug false positives putting the sensor in "monitor mode". The printer will not pause but it will run the runout_gcode below. 144 | event_delay: 3.0 145 | pause_delay: 0.5 146 | runout_gcode: 147 | LOG MSG="Filament Runout Detected!" 148 | 149 | # [delayed_gcode DISABLEFILAMENTSENSOR] # This will disable the SFS 1 second after klipper starts 150 | # initial_duration: 1 151 | # gcode: 152 | # SET_FILAMENT_SENSOR SENSOR=FILAMENT_SENSOR_01 ENABLE=0 153 | 154 | [gcode_macro SFS_ENABLE] # Add this to PRINT_START 155 | description: Enable smart filament sensor 156 | gcode: 157 | LOG MSG="Enabling the Smart Filament Sensor" 158 | G92 E0 159 | SET_FILAMENT_SENSOR SENSOR=FILAMENT_SENSOR_01 ENABLE=1 160 | 161 | [gcode_macro SFS_DISABLE] # Add this to PRINT_END and PRINT_CANCEL 162 | description: Disable smart filament sensor 163 | gcode: 164 | LOG MSG= "Disabling the Smart Filament Sensor" 165 | G92 E0 166 | SET_FILAMENT_SENSOR SENSOR=FILAMENT_SENSOR_01 ENABLE=0 167 | 168 | 169 | -------------------------------------------------------------------------------- /macro/MOVE.cfg: -------------------------------------------------------------------------------- 1 | [gcode_macro MOVE] 2 | description: 3 | A slightly safer version of the G1 command, that should help avoid scraping 4 | the bed and potentially avoid hitting any prints on the bed. No print 5 | detection, just more logical manual movement at the cost of a little more 6 | time. Extruding also works differently if not moving in either X or Y, instead 7 | opting for moving to Z then extruding at E_SPEED. 8 | gcode: 9 | ; Start Macro 10 | {% set SELF = 'MOVE' %} 11 | _MACRO_START LOG=0 NAME="{SELF}" 12 | 13 | ; Config defaults 14 | {% set X = false %} 15 | {% set Y = false %} 16 | {% set Z = false %} 17 | {% set E = false %} 18 | {% set Z_BUFFER = 5 %} 19 | {% set XY_SPEED = 50 %} 20 | {% set Z_SPEED = 20 %} 21 | {% set E_SPEED = 3 %} 22 | {% set SAFE_X_MIN = 0 %} 23 | {% set SAFE_X_MAX = printer.toolhead.axis_maximum.x %} 24 | {% set SAFE_Y_MIN = 0 %} 25 | {% set SAFE_Y_MAX = printer.toolhead.axis_maximum.y %} 26 | {% set SAFE_Z_MIN = 0 %} 27 | {% set SAFE_Z_MAX = printer.toolhead.axis_maximum.z %} 28 | 29 | ; Import vars 30 | {% if 'save_variables' in printer %} 31 | {% set vars = printer.save_variables.variables %} 32 | {% if 'z_buffer' in vars %} 33 | {% set Z_BUFFER = vars.z_buffer %} 34 | {% endif %} 35 | {% if 'xy_speed' in vars %} 36 | {% set XY_SPEED = vars.xy_speed %} 37 | {% endif %} 38 | {% if 'z_speed' in vars %} 39 | {% set Z_SPEED = vars.z_speed %} 40 | {% endif %} 41 | {% if 'e_speed' in vars %} 42 | {% set E_SPEED = vars.e_speed %} 43 | {% endif %} 44 | {% if 'safe_x_min' in vars %} 45 | {% set SAFE_X_MIN = vars.safe_x_min %} 46 | {% endif %} 47 | {% if 'safe_x_max' in vars %} 48 | {% set SAFE_X_MAX = vars.safe_x_max %} 49 | {% endif %} 50 | {% if 'safe_y_min' in vars %} 51 | {% set SAFE_Y_MIN = vars.safe_y_min %} 52 | {% endif %} 53 | {% if 'safe_y_max' in vars %} 54 | {% set SAFE_Y_MAX = vars.safe_y_max %} 55 | {% endif %} 56 | {% if 'safe_z_min' in vars %} 57 | {% set SAFE_Z_MIN = vars.safe_z_min %} 58 | {% endif %} 59 | 60 | {% endif %} 61 | 62 | ; Params 63 | {% set X = params.X|default(X) %} 64 | {% set Y = params.Y|default(Y) %} 65 | {% set Z = params.Z|default(Z) %} 66 | {% set E = params.E|default(E) %} 67 | {% set XY = params.XY|default(false) %} 68 | {% set XZ = params.XZ|default(false) %} 69 | {% set YZ = params.YZ|default(false) %} 70 | {% set XYZ = params.XYZ|default(false) %} 71 | {% set XY_SPEED = params.XY_SPEED|default(XY_SPEED)|int %} 72 | {% set Z_SPEED = params.Z_SPEED|default(Z_SPEED)|int %} 73 | {% set E_SPEED = params.E_SPEED|default(E_SPEED)|int %} 74 | {% set LOG = params.LOG|default(1)|int > 0 %} 75 | 76 | ; Run macro 77 | ; We need to non-fatal error so we don't accidentally cancel/pause the print 78 | _ASSERT_PRINTING INVERT=1 TYPE=ERROR 79 | _ASSERT_HOMED TYPE=ERROR 80 | 81 | ; Allow setting multiple axes to the same coordinates 82 | {% if X is false %} 83 | {% if XYZ is not false %} 84 | {% set X = XYZ %} 85 | {% elif XZ is not false %} 86 | {% set X = XZ %} 87 | {% elif XY is not false %} 88 | {% set X = XY %} 89 | {% endif %} 90 | {% endif %} 91 | {% if Y is false %} 92 | {% if XYZ is not false %} 93 | {% set Y = XYZ %} 94 | {% elif YZ is not false %} 95 | {% set Y = YZ %} 96 | {% elif XY is not false %} 97 | {% set Y = XY %} 98 | {% endif %} 99 | {% endif %} 100 | {% if Z is false %} 101 | {% if XYZ is not false %} 102 | {% set Z = XYZ %} 103 | {% elif YZ is not false %} 104 | {% set Z = YZ %} 105 | {% elif XZ is not false %} 106 | {% set Z = XZ %} 107 | {% endif %} 108 | {% endif %} 109 | 110 | {% set IS_COORDINATES_NOT_SET = (X is false and Y is false and Z is false and E is false) %} 111 | {% set IS_PRINTING = printer["gcode_macro _ASSERT_PRINTING"].is_printing %} 112 | {% set IS_HOMED = printer["gcode_macro _ASSERT_HOMED"].is_homed %} 113 | 114 | {% if IS_HOMED and not IS_PRINTING and not IS_COORDINATES_NOT_SET %} 115 | 116 | {% set XY_FSPEED = XY_SPEED * 60 %} 117 | {% set Z_FSPEED = Z_SPEED * 60 %} 118 | {% set E_FSPEED = E_SPEED * 60 %} 119 | ; Get current XYZ here in case homing moved it 120 | {% set CURRENT_X = printer.toolhead.position.x %} 121 | {% set CURRENT_Y = printer.toolhead.position.y %} 122 | {% set CURRENT_Z = printer.toolhead.position.z %} 123 | 124 | {% set X_UPDATED = true %} 125 | {% set Y_UPDATED = true %} 126 | {% set Z_UPDATED = true %} 127 | {% if X is false %} 128 | {% set X = CURRENT_X %} 129 | {% set X_UPDATED = false %} 130 | {% endif %} 131 | {% if Y is false %} 132 | {% set Y = CURRENT_Y %} 133 | {% set Y_UPDATED = false %} 134 | {% endif %} 135 | {% if Z is false %} 136 | {% set Z = CURRENT_Z %} 137 | {% set Z_UPDATED = false %} 138 | {% endif %} 139 | {% set XY_UPDATED = (X_UPDATED or Y_UPDATED) %} 140 | 141 | ; Sanitize 142 | {% set X = [[X|float, SAFE_X_MAX]|min, SAFE_X_MIN]|max %} 143 | {% set Y = [[Y|float, SAFE_Y_MAX]|min, SAFE_Y_MIN]|max %} 144 | {% set Z = [[Z|float, SAFE_Z_MAX]|min, SAFE_Z_MIN]|max %} 145 | {% set Z_HOP = [[CURRENT_Z + Z_BUFFER, SAFE_Z_MAX]|min, SAFE_Z_MIN]|max %} 146 | 147 | {% if LOG %} 148 | LOG TYPE=STATUS MSG="Moving to X{X} Y{Y} Z{Z} E{E|float}" 149 | {% endif %} 150 | 151 | G90 ; Absolute positioning 152 | 153 | {% if XY_UPDATED %} 154 | ; Z Hop as needed 155 | {% if Z <= CURRENT_Z %} 156 | G1 Z{Z_HOP} F{Z_FSPEED} 157 | {% else %} 158 | G1 Z{[Z, Z_HOP]|max} F{Z_FSPEED} 159 | {% endif %} 160 | 161 | ; Move in X, Y, & E 162 | {% if E is false %} 163 | G1 X{X} Y{Y} F{XY_FSPEED} 164 | {% else %} 165 | G1 X{X} Y{Y} E{E} F{XY_FSPEED} 166 | {% endif %} 167 | {% endif %} 168 | 169 | ; Move to final Z 170 | G1 Z{Z} F{Z_FSPEED} 171 | 172 | ; If not moving in X/Y then extrude after Z move, but not during 173 | {% if not XY_UPDATED and E is not false %} 174 | LOG MSG="Moving E at {E_FSPEED}" 175 | G1 E{E} F{E_FSPEED} 176 | {% endif %} 177 | 178 | {% elif IS_COORDINATES_NOT_SET %} 179 | LOG TYPE=ERROR MACRO="{SELF}" MSG="MOVE cannot be used without setting at least one of X, Y, Z, or E" 180 | {% endif %} 181 | 182 | ; End Macro 183 | _MACRO_END LOG=0 NAME="{SELF}" 184 | -------------------------------------------------------------------------------- /printer.cfg: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | # Summers Klipper Suite # 3 | ################################################################################ 4 | # This file normally contains the configuration for your klipper printer, but I 5 | # have repurposed it to instead just get more-sanely split configuration files 6 | # and contain the auto-generated SAVE_CONFIG output. 7 | 8 | ### Configure Server ############################################################ 9 | [include config/server.cfg] 10 | 11 | ### Configure Machine ########################################################### 12 | [include config/machine.cfg] 13 | 14 | ### Configure Features ########################################################## 15 | [include config/features.cfg] 16 | 17 | ### Initialize Vars ############################################################ 18 | [include config/init_vars.cfg] 19 | 20 | ### Get Macros ################################################################# 21 | [include macro/*.cfg] 22 | 23 | ################################################################################ 24 | # EVERYTHING BELOW THIS IS AUTO-GENERATED # 25 | # IT IS RECOMMENDED THAT YOU DO NOT EDIT IT DIRECTLY - USE THE UI # 26 | ################################################################################ 27 | 28 | #*# <---------------------- SAVE_CONFIG ----------------------> 29 | #*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated. 30 | #*# 31 | #*# [extruder] 32 | #*# control = pid 33 | #*# pid_kp = 24.411 34 | #*# pid_ki = 1.428 35 | #*# pid_kd = 104.357 36 | #*# 37 | #*# [heater_bed] 38 | #*# control = pid 39 | #*# pid_kp = 75.616 40 | #*# pid_ki = 1.703 41 | #*# pid_kd = 839.343 42 | #*# 43 | #*# [bltouch] 44 | #*# z_offset = 1.410 45 | #*# 46 | #*# [bed_mesh Glass Top @ 103c For PETG (2025-04-06)] 47 | #*# version = 1 48 | #*# points = 49 | #*# 0.040000, 0.035000, 0.042500, 0.052500, 0.005000, -0.002500, -0.007500, -0.015000, -0.022500, -0.035000, -0.027500, -0.030000, -0.030000, -0.032500, -0.032500, -0.030000, -0.027500, -0.017500, -0.017500, -0.007500, -0.002500, -0.027500, -0.027500, -0.030000, -0.042500, -0.047500, -0.060000, -0.047500, -0.052500, -0.055000, -0.057500, -0.057500, -0.060000, -0.045000, -0.037500, -0.037500, -0.017500, -0.002500, -0.020000, -0.025000, -0.022500, -0.015000, -0.017500, -0.012500, -0.005000, 0.002500, 0.010000, 0.020000, 0.022500, 0.022500 50 | #*# 0.050000, 0.045000, 0.045000, 0.055000, 0.010000, 0.005000, -0.012500, -0.017500, -0.027500, -0.040000, -0.037500, -0.040000, -0.040000, -0.035000, -0.035000, -0.040000, -0.037500, -0.027500, -0.020000, -0.012500, 0.000000, -0.027500, -0.030000, -0.042500, -0.052500, -0.050000, -0.055000, -0.050000, -0.050000, -0.047500, -0.050000, -0.047500, -0.052500, -0.040000, -0.035000, -0.035000, -0.017500, 0.005000, -0.020000, -0.020000, -0.022500, -0.022500, -0.017500, -0.017500, -0.007500, -0.005000, 0.002500, 0.017500, 0.020000, 0.027500 51 | #*# 0.047500, 0.047500, 0.045000, 0.057500, 0.007500, -0.002500, -0.010000, -0.017500, -0.017500, -0.030000, -0.027500, -0.032500, -0.037500, -0.032500, -0.032500, -0.037500, -0.027500, -0.017500, -0.015000, -0.007500, -0.005000, -0.025000, -0.032500, -0.042500, -0.047500, -0.050000, -0.057500, -0.047500, -0.047500, -0.055000, -0.052500, -0.050000, -0.050000, -0.047500, -0.037500, -0.032500, -0.015000, 0.000000, -0.017500, -0.020000, -0.017500, -0.015000, -0.015000, -0.012500, -0.005000, 0.002500, 0.010000, 0.027500, 0.030000, 0.032500 52 | #*# 0.040000, 0.027500, 0.037500, 0.050000, 0.000000, -0.010000, -0.017500, -0.025000, -0.035000, -0.047500, -0.042500, -0.042500, -0.047500, -0.042500, -0.040000, -0.047500, -0.042500, -0.027500, -0.025000, -0.015000, -0.005000, -0.030000, -0.032500, -0.042500, -0.050000, -0.055000, -0.060000, -0.047500, -0.045000, -0.055000, -0.050000, -0.050000, -0.057500, -0.042500, -0.040000, -0.030000, -0.020000, 0.005000, -0.015000, -0.020000, -0.015000, -0.020000, -0.012500, -0.010000, -0.005000, 0.000000, 0.012500, 0.025000, 0.030000, 0.047500 53 | #*# 0.050000, 0.042500, 0.047500, 0.057500, 0.002500, -0.002500, -0.007500, -0.015000, -0.022500, -0.035000, -0.030000, -0.032500, -0.032500, -0.027500, -0.030000, -0.032500, -0.027500, -0.017500, -0.020000, -0.010000, -0.002500, -0.027500, -0.027500, -0.040000, -0.045000, -0.050000, -0.060000, -0.047500, -0.047500, -0.055000, -0.045000, -0.047500, -0.052500, -0.035000, -0.032500, -0.022500, -0.010000, 0.010000, -0.012500, -0.012500, -0.012500, -0.007500, -0.007500, -0.007500, 0.005000, 0.012500, 0.022500, 0.032500, 0.042500, 0.042500 54 | #*# 0.050000, 0.045000, 0.050000, 0.057500, 0.010000, 0.000000, -0.012500, -0.017500, -0.027500, -0.040000, -0.032500, -0.037500, -0.037500, -0.037500, -0.032500, -0.042500, -0.032500, -0.025000, -0.017500, -0.012500, -0.002500, -0.027500, -0.030000, -0.037500, -0.047500, -0.050000, -0.057500, -0.045000, -0.050000, -0.055000, -0.047500, -0.047500, -0.055000, -0.047500, -0.030000, -0.030000, -0.017500, 0.002500, -0.017500, -0.017500, -0.020000, -0.020000, -0.012500, -0.015000, -0.007500, 0.000000, 0.007500, 0.022500, 0.025000, 0.032500 55 | #*# 0.055000, 0.050000, 0.052500, 0.062500, 0.010000, 0.000000, -0.002500, -0.015000, -0.020000, -0.032500, -0.032500, -0.032500, -0.032500, -0.027500, -0.032500, -0.037500, -0.030000, -0.017500, -0.020000, -0.007500, -0.002500, -0.035000, -0.037500, -0.037500, -0.050000, -0.057500, -0.062500, -0.045000, -0.045000, -0.050000, -0.052500, -0.050000, -0.052500, -0.040000, -0.032500, -0.027500, -0.010000, 0.005000, -0.022500, -0.017500, -0.017500, -0.015000, -0.012500, -0.010000, 0.002500, 0.007500, 0.012500, 0.030000, 0.035000, 0.035000 56 | #*# 0.027500, 0.027500, 0.030000, 0.045000, -0.005000, -0.010000, -0.025000, -0.032500, -0.037500, -0.050000, -0.050000, -0.050000, -0.047500, -0.047500, -0.045000, -0.057500, -0.042500, -0.035000, -0.030000, -0.017500, -0.010000, -0.040000, -0.037500, -0.047500, -0.050000, -0.050000, -0.060000, -0.047500, -0.045000, -0.052500, -0.045000, -0.045000, -0.042500, -0.037500, -0.030000, -0.027500, -0.007500, 0.012500, -0.007500, -0.010000, -0.010000, -0.010000, -0.005000, -0.005000, 0.002500, 0.015000, 0.025000, 0.037500, 0.042500, 0.055000 57 | #*# 0.032500, 0.030000, 0.035000, 0.042500, -0.005000, -0.015000, -0.022500, -0.030000, -0.032500, -0.045000, -0.040000, -0.047500, -0.042500, -0.040000, -0.042500, -0.050000, -0.035000, -0.027500, -0.025000, -0.015000, -0.007500, -0.042500, -0.040000, -0.050000, -0.055000, -0.057500, -0.067500, -0.050000, -0.047500, -0.055000, -0.050000, -0.052500, -0.055000, -0.037500, -0.032500, -0.027500, -0.012500, 0.007500, -0.015000, -0.017500, -0.012500, -0.010000, -0.010000, -0.005000, 0.007500, 0.015000, 0.025000, 0.035000, 0.042500, 0.045000 58 | #*# 0.035000, 0.025000, 0.035000, 0.045000, 0.000000, -0.007500, -0.022500, -0.030000, -0.035000, -0.047500, -0.045000, -0.052500, -0.052500, -0.045000, -0.045000, -0.052500, -0.047500, -0.032500, -0.032500, -0.017500, -0.012500, -0.037500, -0.037500, -0.045000, -0.057500, -0.055000, -0.060000, -0.042500, -0.052500, -0.052500, -0.045000, -0.047500, -0.050000, -0.040000, -0.035000, -0.027500, -0.010000, 0.005000, -0.015000, -0.007500, -0.015000, -0.012500, -0.010000, -0.010000, 0.000000, 0.005000, 0.015000, 0.027500, 0.035000, 0.045000 59 | #*# 0.037500, 0.037500, 0.045000, 0.055000, 0.005000, -0.005000, -0.010000, -0.022500, -0.027500, -0.040000, -0.035000, -0.035000, -0.035000, -0.030000, -0.035000, -0.040000, -0.035000, -0.022500, -0.022500, -0.012500, -0.002500, -0.030000, -0.032500, -0.042500, -0.047500, -0.050000, -0.055000, -0.040000, -0.045000, -0.040000, -0.045000, -0.042500, -0.040000, -0.032500, -0.022500, -0.022500, 0.000000, 0.015000, -0.005000, -0.002500, -0.005000, -0.002500, 0.005000, 0.002500, 0.020000, 0.020000, 0.030000, 0.047500, 0.047500, 0.047500 60 | #*# 0.035000, 0.035000, 0.037500, 0.052500, -0.002500, 0.000000, -0.015000, -0.022500, -0.032500, -0.045000, -0.037500, -0.047500, -0.040000, -0.042500, -0.042500, -0.050000, -0.040000, -0.025000, -0.025000, -0.017500, -0.010000, -0.032500, -0.027500, -0.037500, -0.045000, -0.052500, -0.052500, -0.045000, -0.047500, -0.042500, -0.040000, -0.040000, -0.040000, -0.035000, -0.025000, -0.022500, -0.002500, 0.012500, -0.010000, -0.002500, -0.005000, -0.002500, 0.000000, 0.002500, 0.002500, 0.012500, 0.020000, 0.037500, 0.045000, 0.050000 61 | #*# 0.055000, 0.050000, 0.057500, 0.065000, 0.015000, 0.005000, 0.000000, -0.010000, -0.012500, -0.027500, -0.025000, -0.027500, -0.027500, -0.025000, -0.025000, -0.035000, -0.027500, -0.012500, -0.017500, -0.007500, 0.005000, -0.022500, -0.027500, -0.032500, -0.042500, -0.045000, -0.052500, -0.045000, -0.040000, -0.047500, -0.042500, -0.042500, -0.042500, -0.032500, -0.027500, -0.020000, -0.005000, 0.015000, -0.010000, -0.005000, -0.010000, -0.007500, 0.000000, -0.005000, 0.065000, 0.012500, 0.020000, 0.035000, 0.045000, 0.040000 62 | #*# 0.057500, 0.045000, 0.055000, 0.065000, 0.017500, 0.010000, -0.005000, -0.015000, -0.017500, -0.030000, -0.030000, -0.032500, -0.032500, -0.030000, -0.032500, -0.037500, -0.030000, -0.020000, -0.020000, -0.007500, 0.000000, -0.025000, -0.027500, -0.035000, -0.040000, -0.042500, -0.050000, -0.042500, -0.050000, -0.045000, -0.045000, -0.045000, -0.042500, -0.030000, -0.027500, -0.022500, -0.005000, 0.010000, -0.015000, -0.005000, -0.012500, -0.015000, -0.005000, -0.007500, 0.002500, 0.015000, 0.015000, 0.025000, 0.032500, 0.045000 63 | #*# 0.062500, 0.057500, 0.065000, 0.070000, 0.025000, 0.015000, 0.005000, -0.002500, -0.010000, -0.020000, -0.015000, -0.022500, -0.020000, -0.017500, -0.020000, -0.022500, -0.022500, -0.010000, -0.010000, 0.000000, 0.012500, -0.020000, -0.020000, -0.032500, -0.040000, -0.040000, -0.045000, -0.032500, -0.030000, -0.037500, -0.035000, -0.032500, -0.032500, -0.022500, -0.017500, -0.012500, 0.005000, 0.022500, -0.002500, 0.002500, -0.005000, -0.005000, 0.000000, -0.002500, 0.012500, 0.020000, 0.030000, 0.040000, 0.042500, 0.045000 64 | #*# 0.062500, 0.062500, 0.067500, 0.080000, 0.030000, 0.020000, 0.010000, -0.007500, -0.007500, -0.022500, -0.022500, -0.025000, -0.020000, -0.022500, -0.022500, -0.035000, -0.022500, -0.010000, -0.005000, 0.005000, 0.015000, -0.015000, -0.015000, -0.022500, -0.032500, -0.037500, -0.037500, -0.027500, -0.032500, -0.027500, -0.030000, -0.027500, -0.030000, -0.022500, -0.012500, -0.015000, 0.005000, 0.027500, 0.002500, 0.000000, 0.000000, 0.000000, 0.002500, 0.000000, 0.010000, 0.012500, 0.022500, 0.042500, 0.045000, 0.050000 65 | #*# 0.070000, 0.067500, 0.075000, 0.082500, 0.035000, 0.025000, 0.017500, 0.005000, 0.002500, -0.012500, -0.010000, -0.012500, -0.010000, -0.010000, -0.012500, -0.012500, -0.010000, 0.000000, 0.005000, 0.015000, 0.025000, -0.010000, -0.010000, -0.022500, -0.030000, -0.030000, -0.027500, -0.027500, -0.027500, -0.030000, -0.022500, -0.030000, -0.027500, -0.020000, -0.012500, -0.007500, 0.015000, 0.025000, 0.002500, 0.007500, 0.000000, 0.000000, 0.010000, 0.002500, 0.017500, 0.022500, 0.035000, 0.045000, 0.047500, 0.050000 66 | #*# 0.065000, 0.062500, 0.065000, 0.077500, 0.030000, 0.020000, 0.007500, 0.000000, -0.007500, -0.015000, -0.020000, -0.020000, -0.017500, -0.017500, -0.020000, -0.022500, -0.017500, -0.005000, -0.005000, 0.005000, 0.017500, -0.015000, -0.017500, -0.022500, -0.030000, -0.032500, -0.035000, -0.030000, -0.030000, -0.030000, -0.027500, -0.022500, -0.020000, -0.015000, -0.010000, -0.002500, 0.007500, 0.027500, 0.002500, 0.012500, 0.000000, 0.002500, 0.005000, 0.002500, 0.012500, 0.022500, 0.030000, 0.047500, 0.052500, 0.060000 67 | #*# 0.070000, 0.067500, 0.072500, 0.082500, 0.035000, 0.025000, 0.015000, 0.005000, 0.005000, -0.005000, -0.007500, -0.007500, -0.007500, -0.005000, -0.007500, -0.007500, -0.002500, 0.007500, 0.007500, 0.020000, 0.027500, -0.007500, -0.007500, -0.015000, -0.025000, -0.027500, -0.030000, -0.017500, -0.022500, -0.025000, -0.022500, -0.022500, -0.020000, -0.017500, -0.005000, -0.007500, 0.020000, 0.035000, 0.007500, 0.012500, 0.010000, 0.010000, 0.010000, 0.015000, 0.030000, 0.032500, 0.042500, 0.052500, 0.057500, 0.055000 68 | #*# 0.065000, 0.055000, 0.065000, 0.075000, 0.032500, 0.022500, 0.007500, -0.002500, -0.002500, -0.015000, -0.017500, -0.022500, -0.020000, -0.015000, -0.017500, -0.030000, -0.015000, -0.007500, -0.002500, 0.007500, 0.020000, -0.012500, -0.015000, -0.022500, -0.027500, -0.027500, -0.032500, -0.022500, -0.027500, -0.025000, -0.022500, -0.022500, -0.022500, -0.015000, -0.010000, -0.007500, 0.012500, 0.035000, 0.002500, 0.007500, 0.005000, 0.002500, 0.007500, 0.007500, 0.020000, 0.022500, 0.032500, 0.047500, 0.060000, 0.065000 69 | #*# 0.062500, 0.060000, 0.067500, 0.075000, 0.030000, 0.025000, 0.007500, 0.000000, 0.000000, -0.010000, -0.002500, -0.007500, -0.007500, 0.000000, -0.005000, -0.015000, -0.007500, 0.002500, 0.007500, 0.017500, 0.027500, -0.010000, -0.010000, -0.020000, -0.020000, -0.025000, -0.027500, -0.020000, -0.022500, -0.025000, -0.020000, -0.022500, -0.027500, -0.012500, -0.005000, -0.002500, 0.022500, 0.032500, 0.015000, 0.017500, 0.012500, 0.015000, 0.015000, 0.015000, 0.030000, 0.032500, 0.047500, 0.052500, 0.060000, 0.057500 70 | #*# 0.062500, 0.060000, 0.070000, 0.075000, 0.035000, 0.027500, 0.010000, 0.005000, 0.000000, -0.012500, -0.010000, -0.012500, -0.010000, -0.005000, -0.005000, -0.022500, -0.010000, 0.005000, 0.007500, 0.022500, 0.037500, 0.002500, -0.002500, -0.005000, -0.010000, -0.012500, -0.017500, -0.007500, -0.007500, -0.025000, -0.015000, -0.017500, -0.020000, -0.007500, -0.002500, 0.000000, 0.022500, 0.040000, 0.012500, 0.017500, 0.010000, 0.017500, 0.017500, 0.015000, 0.027500, 0.040000, 0.045000, 0.060000, 0.072500, 0.072500 71 | #*# 0.067500, 0.067500, 0.077500, 0.085000, 0.045000, 0.030000, 0.022500, 0.010000, 0.012500, 0.002500, 0.007500, 0.000000, 0.005000, 0.010000, 0.007500, 0.000000, 0.015000, 0.022500, 0.020000, 0.042500, 0.045000, 0.010000, 0.007500, 0.005000, -0.010000, -0.007500, -0.010000, 0.000000, -0.005000, -0.002500, 0.000000, 0.000000, -0.005000, 0.005000, 0.017500, 0.022500, 0.045000, 0.055000, 0.032500, 0.030000, 0.035000, 0.037500, 0.035000, 0.042500, 0.052500, 0.052500, 0.067500, 0.075000, 0.082500, 0.082500 72 | #*# 0.065000, 0.067500, 0.072500, 0.085000, 0.037500, 0.030000, 0.010000, 0.010000, 0.007500, -0.010000, -0.010000, -0.010000, -0.010000, -0.007500, -0.007500, -0.017500, -0.005000, 0.007500, 0.010000, 0.025000, 0.035000, 0.007500, 0.005000, -0.002500, -0.010000, -0.010000, -0.017500, -0.007500, -0.002500, -0.010000, -0.005000, -0.007500, -0.007500, 0.000000, 0.007500, 0.015000, 0.030000, 0.052500, 0.027500, 0.025000, 0.027500, 0.027500, 0.037500, 0.030000, 0.040000, 0.045000, 0.052500, 0.070000, 0.070000, 0.080000 73 | #*# 0.070000, 0.070000, 0.077500, 0.080000, 0.037500, 0.027500, 0.020000, 0.012500, 0.010000, -0.005000, 0.005000, -0.002500, -0.002500, 0.007500, 0.002500, -0.002500, 0.007500, 0.017500, 0.017500, 0.037500, 0.047500, 0.007500, 0.007500, 0.002500, -0.007500, -0.007500, -0.015000, -0.005000, -0.007500, -0.007500, -0.007500, -0.005000, -0.005000, 0.005000, 0.015000, 0.017500, 0.042500, 0.050000, 0.030000, 0.027500, 0.030000, 0.027500, 0.032500, 0.035000, 0.042500, 0.047500, 0.057500, 0.065000, 0.070000, 0.077500 74 | #*# 0.047500, 0.045000, 0.055000, 0.067500, 0.022500, 0.012500, 0.000000, -0.005000, -0.010000, -0.025000, -0.020000, -0.017500, -0.020000, -0.015000, -0.017500, -0.022500, -0.012500, -0.002500, 0.007500, 0.027500, 0.032500, -0.002500, 0.002500, -0.005000, -0.010000, -0.007500, -0.015000, -0.010000, -0.007500, -0.012500, -0.010000, -0.002500, -0.002500, 0.000000, 0.015000, 0.020000, 0.042500, 0.057500, 0.032500, 0.037500, 0.032500, 0.040000, 0.037500, 0.037500, 0.040000, 0.055000, 0.060000, 0.077500, 0.082500, 0.090000 75 | #*# 0.052500, 0.055000, 0.067500, 0.070000, 0.027500, 0.015000, 0.012500, 0.002500, -0.002500, -0.012500, -0.010000, -0.005000, -0.010000, -0.005000, -0.010000, -0.010000, -0.002500, 0.010000, 0.015000, 0.035000, 0.040000, 0.000000, 0.000000, -0.010000, -0.017500, -0.017500, -0.020000, -0.010000, -0.012500, -0.012500, -0.007500, -0.012500, -0.012500, 0.000000, 0.007500, 0.012500, 0.037500, 0.052500, 0.025000, 0.027500, 0.027500, 0.022500, 0.027500, 0.032500, 0.042500, 0.047500, 0.055000, 0.067500, 0.075000, 0.072500 76 | #*# 0.055000, 0.055000, 0.067500, 0.077500, 0.030000, 0.025000, 0.005000, 0.000000, -0.005000, -0.020000, -0.012500, -0.015000, -0.010000, -0.012500, -0.012500, -0.015000, -0.012500, -0.002500, 0.007500, 0.020000, 0.030000, 0.002500, 0.000000, -0.007500, -0.017500, -0.020000, -0.022500, -0.015000, -0.017500, -0.015000, -0.012500, -0.015000, -0.012500, 0.000000, 0.002500, 0.012500, 0.030000, 0.047500, 0.025000, 0.027500, 0.017500, 0.022500, 0.025000, 0.020000, 0.035000, 0.040000, 0.052500, 0.062500, 0.070000, 0.080000 77 | #*# 0.062500, 0.062500, 0.070000, 0.082500, 0.040000, 0.025000, 0.012500, 0.005000, 0.002500, -0.005000, 0.000000, -0.005000, -0.005000, 0.000000, 0.000000, -0.002500, 0.000000, 0.015000, 0.025000, 0.035000, 0.040000, 0.007500, 0.012500, 0.000000, -0.007500, -0.007500, -0.015000, -0.002500, -0.007500, -0.005000, -0.002500, -0.005000, -0.005000, 0.000000, 0.015000, 0.017500, 0.040000, 0.052500, 0.032500, 0.030000, 0.027500, 0.027500, 0.030000, 0.035000, 0.040000, 0.050000, 0.055000, 0.067500, 0.072500, 0.072500 78 | #*# 0.060000, 0.057500, 0.067500, 0.077500, 0.030000, 0.025000, 0.012500, -0.002500, -0.002500, -0.015000, -0.012500, -0.015000, -0.010000, -0.005000, -0.012500, -0.017500, -0.007500, 0.000000, 0.007500, 0.022500, 0.032500, 0.005000, 0.002500, -0.007500, -0.015000, -0.015000, -0.022500, -0.012500, -0.012500, -0.015000, -0.010000, -0.010000, -0.010000, -0.005000, 0.002500, 0.007500, 0.035000, 0.042500, 0.020000, 0.027500, 0.025000, 0.025000, 0.027500, 0.025000, 0.032500, 0.042500, 0.047500, 0.062500, 0.065000, 0.075000 79 | #*# 0.067500, 0.072500, 0.080000, 0.087500, 0.042500, 0.032500, 0.020000, 0.012500, 0.010000, 0.000000, 0.002500, -0.002500, 0.000000, 0.002500, 0.002500, -0.002500, 0.005000, 0.012500, 0.022500, 0.035000, 0.045000, 0.002500, 0.010000, -0.002500, -0.010000, -0.005000, -0.012500, -0.005000, -0.007500, -0.010000, -0.010000, -0.010000, -0.010000, -0.002500, 0.007500, 0.007500, 0.035000, 0.045000, 0.020000, 0.025000, 0.017500, 0.017500, 0.027500, 0.025000, 0.032500, 0.035000, 0.047500, 0.062500, 0.062500, 0.062500 80 | #*# 0.075000, 0.070000, 0.080000, 0.087500, 0.047500, 0.037500, 0.022500, 0.015000, 0.007500, -0.005000, -0.002500, -0.007500, -0.005000, -0.002500, -0.002500, -0.017500, -0.002500, 0.007500, 0.015000, 0.027500, 0.042500, 0.010000, 0.002500, 0.000000, -0.007500, -0.010000, -0.017500, -0.007500, -0.012500, -0.010000, -0.012500, -0.012500, -0.012500, -0.005000, 0.000000, 0.007500, 0.030000, 0.042500, 0.020000, 0.022500, 0.012500, 0.020000, 0.017500, 0.017500, 0.020000, 0.030000, 0.042500, 0.055000, 0.057500, 0.062500 81 | #*# 0.080000, 0.080000, 0.092500, 0.095000, 0.052500, 0.040000, 0.027500, 0.017500, 0.020000, 0.007500, 0.005000, 0.000000, 0.002500, 0.007500, 0.010000, 0.002500, 0.010000, 0.017500, 0.022500, 0.042500, 0.050000, 0.010000, 0.012500, 0.002500, -0.002500, -0.005000, -0.005000, 0.005000, -0.002500, 0.002500, 0.000000, -0.005000, -0.010000, 0.002500, 0.017500, 0.012500, 0.035000, 0.050000, 0.025000, 0.020000, 0.020000, 0.020000, 0.022500, 0.022500, 0.030000, 0.040000, 0.052500, 0.060000, 0.060000, 0.062500 82 | #*# 0.077500, 0.072500, 0.082500, 0.095000, 0.050000, 0.042500, 0.030000, 0.017500, 0.010000, 0.002500, 0.000000, -0.002500, -0.002500, 0.005000, 0.002500, -0.005000, 0.002500, 0.017500, 0.022500, 0.037500, 0.045000, 0.012500, 0.010000, 0.000000, -0.007500, -0.010000, -0.012500, -0.010000, -0.012500, -0.015000, -0.015000, -0.012500, -0.012500, -0.007500, 0.002500, 0.005000, 0.025000, 0.042500, 0.015000, 0.015000, 0.015000, 0.017500, 0.015000, 0.015000, 0.020000, 0.025000, 0.037500, 0.052500, 0.055000, 0.062500 83 | #*# 0.080000, 0.082500, 0.090000, 0.095000, 0.055000, 0.040000, 0.032500, 0.020000, 0.015000, 0.000000, 0.007500, 0.000000, 0.000000, 0.007500, 0.002500, 0.000000, 0.010000, 0.017500, 0.022500, 0.040000, 0.045000, 0.010000, 0.010000, 0.005000, -0.007500, -0.010000, -0.012500, 0.000000, -0.005000, -0.007500, -0.007500, -0.010000, -0.012500, -0.005000, 0.005000, 0.007500, 0.030000, 0.045000, 0.015000, 0.010000, 0.010000, 0.012500, 0.015000, 0.015000, 0.027500, 0.027500, 0.040000, 0.050000, 0.055000, 0.055000 84 | #*# 0.075000, 0.072500, 0.080000, 0.090000, 0.047500, 0.040000, 0.025000, 0.017500, 0.010000, -0.005000, 0.002500, -0.007500, -0.005000, -0.002500, -0.005000, -0.015000, -0.005000, 0.012500, 0.012500, 0.030000, 0.040000, 0.007500, 0.000000, -0.007500, -0.012500, -0.012500, -0.022500, -0.010000, -0.015000, -0.015000, -0.015000, -0.015000, -0.017500, -0.010000, 0.002500, 0.005000, 0.022500, 0.042500, 0.015000, 0.010000, 0.007500, 0.010000, 0.010000, 0.007500, 0.015000, 0.020000, 0.035000, 0.047500, 0.050000, 0.062500 85 | #*# 0.075000, 0.075000, 0.087500, 0.087500, 0.045000, 0.030000, 0.022500, 0.010000, 0.005000, -0.007500, 0.002500, -0.010000, -0.007500, -0.002500, -0.002500, -0.007500, -0.002500, 0.010000, 0.015000, 0.030000, 0.042500, 0.000000, 0.002500, -0.002500, -0.007500, -0.010000, -0.017500, -0.005000, -0.012500, -0.010000, -0.010000, -0.012500, -0.015000, -0.002500, 0.007500, 0.012500, 0.030000, 0.050000, 0.012500, 0.010000, 0.017500, 0.015000, 0.020000, 0.012500, 0.030000, 0.035000, 0.040000, 0.057500, 0.055000, 0.062500 86 | #*# 0.062500, 0.065000, 0.075000, 0.082500, 0.040000, 0.030000, 0.012500, 0.005000, -0.002500, -0.015000, -0.012500, -0.012500, -0.012500, -0.007500, -0.007500, -0.012500, -0.007500, 0.005000, 0.017500, 0.025000, 0.035000, 0.000000, 0.000000, -0.007500, -0.012500, -0.010000, -0.020000, -0.012500, -0.015000, -0.020000, -0.012500, -0.017500, -0.017500, -0.015000, 0.000000, 0.005000, 0.030000, 0.040000, 0.017500, 0.020000, 0.012500, 0.017500, 0.020000, 0.015000, 0.022500, 0.030000, 0.040000, 0.055000, 0.057500, 0.065000 87 | #*# 0.065000, 0.067500, 0.077500, 0.082500, 0.037500, 0.025000, 0.017500, 0.005000, -0.002500, -0.012500, -0.007500, -0.012500, -0.015000, -0.010000, -0.012500, -0.012500, -0.005000, 0.007500, 0.012500, 0.025000, 0.035000, 0.000000, 0.000000, -0.007500, -0.010000, -0.015000, -0.015000, -0.005000, -0.012500, -0.015000, -0.007500, -0.012500, -0.010000, -0.007500, 0.002500, 0.007500, 0.030000, 0.045000, 0.015000, 0.012500, 0.017500, 0.015000, 0.017500, 0.017500, 0.032500, 0.035000, 0.045000, 0.057500, 0.062500, 0.060000 88 | #*# 0.055000, 0.055000, 0.065000, 0.075000, 0.030000, 0.025000, 0.007500, 0.002500, -0.002500, -0.020000, -0.017500, -0.017500, -0.012500, -0.010000, -0.017500, -0.025000, -0.010000, 0.000000, 0.007500, 0.020000, 0.035000, 0.000000, -0.002500, -0.010000, -0.017500, -0.015000, -0.020000, -0.015000, -0.017500, -0.017500, -0.015000, -0.015000, -0.017500, -0.010000, -0.002500, 0.005000, 0.032500, 0.045000, 0.012500, 0.020000, 0.015000, 0.012500, 0.017500, 0.012500, 0.022500, 0.027500, 0.037500, 0.057500, 0.060000, 0.067500 89 | #*# 0.060000, 0.062500, 0.075000, 0.077500, 0.035000, 0.025000, 0.010000, 0.005000, -0.002500, -0.017500, -0.010000, -0.010000, -0.015000, -0.010000, -0.012500, -0.012500, -0.005000, 0.002500, 0.015000, 0.022500, 0.042500, -0.002500, 0.000000, -0.007500, -0.012500, -0.010000, -0.017500, -0.005000, -0.007500, -0.010000, -0.007500, -0.007500, -0.007500, 0.000000, 0.012500, 0.015000, 0.040000, 0.052500, 0.022500, 0.027500, 0.022500, 0.020000, 0.025000, 0.030000, 0.035000, 0.040000, 0.052500, 0.062500, 0.062500, 0.067500 90 | #*# 0.057500, 0.057500, 0.065000, 0.072500, 0.035000, 0.022500, 0.007500, 0.000000, -0.005000, -0.020000, -0.015000, -0.020000, -0.020000, -0.015000, -0.017500, -0.022500, -0.015000, -0.002500, 0.002500, 0.022500, 0.030000, 0.002500, 0.000000, -0.005000, -0.017500, -0.017500, -0.022500, -0.015000, -0.020000, -0.020000, -0.017500, -0.015000, -0.020000, -0.012500, -0.002500, 0.002500, 0.022500, 0.037500, 0.015000, 0.017500, 0.010000, 0.012500, 0.017500, 0.015000, 0.017500, 0.027500, 0.035000, 0.055000, 0.057500, 0.062500 91 | #*# 0.060000, 0.062500, 0.072500, 0.080000, 0.035000, 0.020000, 0.012500, 0.007500, -0.002500, -0.017500, -0.015000, -0.022500, -0.020000, -0.010000, -0.017500, -0.022500, -0.012500, -0.002500, 0.002500, 0.020000, 0.032500, -0.005000, -0.005000, -0.010000, -0.020000, -0.017500, -0.022500, -0.007500, -0.012500, -0.017500, -0.010000, -0.017500, -0.015000, -0.007500, 0.007500, 0.005000, 0.027500, 0.045000, 0.020000, 0.020000, 0.017500, 0.015000, 0.017500, 0.017500, 0.027500, 0.032500, 0.045000, 0.060000, 0.060000, 0.057500 92 | #*# 0.050000, 0.055000, 0.060000, 0.072500, 0.025000, 0.017500, 0.007500, 0.000000, -0.010000, -0.020000, -0.015000, -0.022500, -0.025000, -0.020000, -0.022500, -0.025000, -0.017500, -0.002500, 0.005000, 0.025000, 0.032500, 0.005000, 0.002500, -0.005000, -0.007500, -0.007500, -0.010000, -0.007500, -0.012500, -0.012500, -0.010000, -0.010000, -0.010000, -0.002500, 0.005000, 0.010000, 0.035000, 0.055000, 0.027500, 0.025000, 0.025000, 0.025000, 0.032500, 0.025000, 0.037500, 0.035000, 0.047500, 0.060000, 0.067500, 0.072500 93 | #*# 0.060000, 0.060000, 0.075000, 0.082500, 0.035000, 0.020000, 0.012500, 0.002500, -0.002500, -0.015000, -0.010000, -0.020000, -0.017500, -0.012500, -0.012500, -0.017500, -0.010000, 0.000000, 0.010000, 0.030000, 0.035000, 0.000000, 0.000000, -0.002500, -0.010000, -0.010000, -0.010000, -0.005000, -0.007500, -0.015000, -0.007500, 0.000000, -0.010000, 0.002500, 0.012500, 0.015000, 0.047500, 0.055000, 0.025000, 0.022500, 0.030000, 0.025000, 0.030000, 0.032500, 0.042500, 0.042500, 0.055000, 0.065000, 0.067500, 0.070000 94 | #*# 0.067500, 0.067500, 0.072500, 0.087500, 0.042500, 0.030000, 0.012500, 0.010000, 0.005000, -0.012500, -0.012500, -0.015000, -0.017500, -0.005000, -0.007500, -0.015000, -0.007500, 0.005000, 0.015000, 0.030000, 0.045000, 0.007500, 0.010000, 0.005000, -0.005000, -0.007500, -0.007500, 0.000000, -0.005000, -0.010000, -0.007500, -0.005000, -0.007500, -0.005000, 0.010000, 0.012500, 0.030000, 0.050000, 0.025000, 0.022500, 0.020000, 0.020000, 0.027500, 0.020000, 0.030000, 0.030000, 0.045000, 0.057500, 0.060000, 0.067500 95 | #*# 0.077500, 0.075000, 0.090000, 0.095000, 0.045000, 0.040000, 0.030000, 0.017500, 0.010000, -0.005000, 0.000000, -0.005000, -0.007500, -0.005000, -0.007500, -0.005000, 0.007500, 0.015000, 0.020000, 0.035000, 0.045000, 0.007500, 0.010000, 0.002500, -0.007500, -0.002500, -0.012500, 0.000000, -0.005000, -0.012500, -0.005000, -0.007500, -0.007500, 0.000000, 0.015000, 0.017500, 0.035000, 0.055000, 0.025000, 0.022500, 0.027500, 0.022500, 0.025000, 0.022500, 0.032500, 0.035000, 0.050000, 0.062500, 0.060000, 0.060000 96 | #*# 0.077500, 0.085000, 0.087500, 0.095000, 0.055000, 0.040000, 0.025000, 0.017500, 0.012500, -0.002500, 0.000000, -0.007500, -0.007500, -0.005000, -0.002500, -0.010000, -0.005000, 0.012500, 0.020000, 0.032500, 0.047500, 0.010000, 0.007500, 0.000000, -0.002500, -0.010000, -0.012500, -0.007500, -0.012500, -0.015000, -0.015000, -0.017500, -0.017500, -0.017500, -0.007500, -0.282500, -0.322500, -0.360000, -0.495000, 0.017500, 0.015000, 0.017500, 0.017500, 0.012500, 0.017500, 0.022500, 0.032500, 0.047500, 0.052500, 0.057500 97 | #*# 0.082500, 0.082500, 0.095000, 0.100000, 0.052500, 0.042500, 0.027500, 0.017500, 0.010000, -0.005000, -0.002500, -0.010000, -0.007500, -0.005000, -0.007500, -0.007500, 0.005000, 0.010000, 0.017500, 0.032500, 0.040000, 0.005000, 0.002500, 0.002500, -0.002500, -0.007500, -0.017500, -0.005000, -0.005000, -0.012500, -0.012500, -0.012500, -0.017500, -0.012500, -0.002500, -0.230000, -0.182500, -0.192500, -0.192500, -0.145000, 0.002500, 0.005000, 0.002500, -0.002500, 0.012500, 0.010000, 0.027500, 0.035000, 0.042500, 0.042500 98 | #*# 0.075000, 0.082500, 0.082500, 0.095000, 0.050000, 0.037500, 0.022500, 0.015000, 0.005000, -0.007500, -0.010000, -0.010000, -0.010000, -0.007500, -0.007500, -0.010000, -0.005000, 0.007500, 0.015000, 0.032500, 0.042500, 0.012500, 0.010000, 0.002500, -0.005000, -0.012500, -0.015000, -0.010000, -0.010000, -0.017500, -0.017500, -0.015000, -0.017500, -0.020000, -0.010000, -0.247500, -0.235000, -0.207500, -0.220000, -0.242500, -0.002500, 0.002500, 0.002500, -0.002500, 0.007500, 0.010000, 0.025000, 0.035000, 0.042500, 0.047500 99 | #*# tension = 0.2 100 | #*# mesh_x_pps = 2 101 | #*# algo = bicubic 102 | #*# min_x = 20.0 103 | #*# min_y = 20.0 104 | #*# y_count = 50 105 | #*# mesh_y_pps = 2 106 | #*# x_count = 50 107 | #*# max_x = 219.92 108 | #*# max_y = 208.65 109 | --------------------------------------------------------------------------------