meerk40t 0.9.3001__py2.py3-none-any.whl → 0.9.7020__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- meerk40t/__init__.py +1 -1
- meerk40t/balormk/balor_params.py +167 -167
- meerk40t/balormk/clone_loader.py +457 -457
- meerk40t/balormk/controller.py +1566 -1512
- meerk40t/balormk/cylindermod.py +64 -0
- meerk40t/balormk/device.py +966 -1959
- meerk40t/balormk/driver.py +778 -591
- meerk40t/balormk/galvo_commands.py +1194 -0
- meerk40t/balormk/gui/balorconfig.py +237 -111
- meerk40t/balormk/gui/balorcontroller.py +191 -184
- meerk40t/balormk/gui/baloroperationproperties.py +116 -115
- meerk40t/balormk/gui/corscene.py +845 -0
- meerk40t/balormk/gui/gui.py +179 -147
- meerk40t/balormk/livelightjob.py +466 -382
- meerk40t/balormk/mock_connection.py +131 -109
- meerk40t/balormk/plugin.py +133 -135
- meerk40t/balormk/usb_connection.py +306 -301
- meerk40t/camera/__init__.py +1 -1
- meerk40t/camera/camera.py +514 -397
- meerk40t/camera/gui/camerapanel.py +1241 -1095
- meerk40t/camera/gui/gui.py +58 -58
- meerk40t/camera/plugin.py +441 -399
- meerk40t/ch341/__init__.py +27 -27
- meerk40t/ch341/ch341device.py +628 -628
- meerk40t/ch341/libusb.py +595 -589
- meerk40t/ch341/mock.py +171 -171
- meerk40t/ch341/windriver.py +157 -157
- meerk40t/constants.py +13 -0
- meerk40t/core/__init__.py +1 -1
- meerk40t/core/bindalias.py +550 -539
- meerk40t/core/core.py +47 -47
- meerk40t/core/cutcode/cubiccut.py +73 -73
- meerk40t/core/cutcode/cutcode.py +315 -312
- meerk40t/core/cutcode/cutgroup.py +141 -137
- meerk40t/core/cutcode/cutobject.py +192 -185
- meerk40t/core/cutcode/dwellcut.py +37 -37
- meerk40t/core/cutcode/gotocut.py +29 -29
- meerk40t/core/cutcode/homecut.py +29 -29
- meerk40t/core/cutcode/inputcut.py +34 -34
- meerk40t/core/cutcode/linecut.py +33 -33
- meerk40t/core/cutcode/outputcut.py +34 -34
- meerk40t/core/cutcode/plotcut.py +335 -335
- meerk40t/core/cutcode/quadcut.py +61 -61
- meerk40t/core/cutcode/rastercut.py +168 -148
- meerk40t/core/cutcode/waitcut.py +34 -34
- meerk40t/core/cutplan.py +1843 -1316
- meerk40t/core/drivers.py +330 -329
- meerk40t/core/elements/align.py +801 -669
- meerk40t/core/elements/branches.py +1858 -1507
- meerk40t/core/elements/clipboard.py +229 -219
- meerk40t/core/elements/element_treeops.py +4595 -2837
- meerk40t/core/elements/element_types.py +125 -105
- meerk40t/core/elements/elements.py +4315 -3617
- meerk40t/core/elements/files.py +117 -64
- meerk40t/core/elements/geometry.py +473 -224
- meerk40t/core/elements/grid.py +467 -316
- meerk40t/core/elements/materials.py +158 -94
- meerk40t/core/elements/notes.py +50 -38
- meerk40t/core/elements/offset_clpr.py +934 -912
- meerk40t/core/elements/offset_mk.py +963 -955
- meerk40t/core/elements/penbox.py +339 -267
- meerk40t/core/elements/placements.py +300 -83
- meerk40t/core/elements/render.py +785 -687
- meerk40t/core/elements/shapes.py +2618 -2092
- meerk40t/core/elements/testcases.py +105 -0
- meerk40t/core/elements/trace.py +651 -563
- meerk40t/core/elements/tree_commands.py +415 -409
- meerk40t/core/elements/undo_redo.py +116 -58
- meerk40t/core/elements/wordlist.py +319 -200
- meerk40t/core/exceptions.py +9 -9
- meerk40t/core/laserjob.py +220 -220
- meerk40t/core/logging.py +63 -63
- meerk40t/core/node/blobnode.py +83 -86
- meerk40t/core/node/bootstrap.py +105 -103
- meerk40t/core/node/branch_elems.py +40 -31
- meerk40t/core/node/branch_ops.py +45 -38
- meerk40t/core/node/branch_regmark.py +48 -41
- meerk40t/core/node/cutnode.py +29 -32
- meerk40t/core/node/effect_hatch.py +375 -257
- meerk40t/core/node/effect_warp.py +398 -0
- meerk40t/core/node/effect_wobble.py +441 -309
- meerk40t/core/node/elem_ellipse.py +404 -309
- meerk40t/core/node/elem_image.py +1082 -801
- meerk40t/core/node/elem_line.py +358 -292
- meerk40t/core/node/elem_path.py +259 -201
- meerk40t/core/node/elem_point.py +129 -102
- meerk40t/core/node/elem_polyline.py +310 -246
- meerk40t/core/node/elem_rect.py +376 -286
- meerk40t/core/node/elem_text.py +445 -418
- meerk40t/core/node/filenode.py +59 -40
- meerk40t/core/node/groupnode.py +138 -74
- meerk40t/core/node/image_processed.py +777 -766
- meerk40t/core/node/image_raster.py +156 -113
- meerk40t/core/node/layernode.py +31 -31
- meerk40t/core/node/mixins.py +135 -107
- meerk40t/core/node/node.py +1427 -1304
- meerk40t/core/node/nutils.py +117 -114
- meerk40t/core/node/op_cut.py +463 -335
- meerk40t/core/node/op_dots.py +296 -251
- meerk40t/core/node/op_engrave.py +414 -311
- meerk40t/core/node/op_image.py +755 -369
- meerk40t/core/node/op_raster.py +787 -522
- meerk40t/core/node/place_current.py +37 -40
- meerk40t/core/node/place_point.py +329 -126
- meerk40t/core/node/refnode.py +58 -47
- meerk40t/core/node/rootnode.py +225 -219
- meerk40t/core/node/util_console.py +48 -48
- meerk40t/core/node/util_goto.py +84 -65
- meerk40t/core/node/util_home.py +61 -61
- meerk40t/core/node/util_input.py +102 -102
- meerk40t/core/node/util_output.py +102 -102
- meerk40t/core/node/util_wait.py +65 -65
- meerk40t/core/parameters.py +709 -707
- meerk40t/core/planner.py +875 -785
- meerk40t/core/plotplanner.py +656 -652
- meerk40t/core/space.py +120 -113
- meerk40t/core/spoolers.py +706 -705
- meerk40t/core/svg_io.py +1836 -1549
- meerk40t/core/treeop.py +534 -445
- meerk40t/core/undos.py +278 -124
- meerk40t/core/units.py +784 -680
- meerk40t/core/view.py +393 -322
- meerk40t/core/webhelp.py +62 -62
- meerk40t/core/wordlist.py +513 -504
- meerk40t/cylinder/cylinder.py +247 -0
- meerk40t/cylinder/gui/cylindersettings.py +41 -0
- meerk40t/cylinder/gui/gui.py +24 -0
- meerk40t/device/__init__.py +1 -1
- meerk40t/device/basedevice.py +322 -123
- meerk40t/device/devicechoices.py +50 -0
- meerk40t/device/dummydevice.py +163 -128
- meerk40t/device/gui/defaultactions.py +618 -602
- meerk40t/device/gui/effectspanel.py +114 -0
- meerk40t/device/gui/formatterpanel.py +253 -290
- meerk40t/device/gui/warningpanel.py +337 -260
- meerk40t/device/mixins.py +13 -13
- meerk40t/dxf/__init__.py +1 -1
- meerk40t/dxf/dxf_io.py +766 -554
- meerk40t/dxf/plugin.py +47 -35
- meerk40t/external_plugins.py +79 -79
- meerk40t/external_plugins_build.py +28 -28
- meerk40t/extra/cag.py +112 -116
- meerk40t/extra/coolant.py +403 -0
- meerk40t/extra/encode_detect.py +204 -0
- meerk40t/extra/ezd.py +1165 -1165
- meerk40t/extra/hershey.py +834 -340
- meerk40t/extra/imageactions.py +322 -316
- meerk40t/extra/inkscape.py +628 -622
- meerk40t/extra/lbrn.py +424 -424
- meerk40t/extra/outerworld.py +283 -0
- meerk40t/extra/param_functions.py +1542 -1556
- meerk40t/extra/potrace.py +257 -253
- meerk40t/extra/serial_exchange.py +118 -0
- meerk40t/extra/updater.py +602 -453
- meerk40t/extra/vectrace.py +147 -146
- meerk40t/extra/winsleep.py +83 -83
- meerk40t/extra/xcs_reader.py +597 -0
- meerk40t/fill/fills.py +781 -335
- meerk40t/fill/patternfill.py +1061 -1061
- meerk40t/fill/patterns.py +614 -567
- meerk40t/grbl/control.py +87 -87
- meerk40t/grbl/controller.py +990 -903
- meerk40t/grbl/device.py +1084 -768
- meerk40t/grbl/driver.py +989 -771
- meerk40t/grbl/emulator.py +532 -497
- meerk40t/grbl/gcodejob.py +783 -767
- meerk40t/grbl/gui/grblconfiguration.py +373 -298
- meerk40t/grbl/gui/grblcontroller.py +485 -271
- meerk40t/grbl/gui/grblhardwareconfig.py +269 -153
- meerk40t/grbl/gui/grbloperationconfig.py +105 -0
- meerk40t/grbl/gui/gui.py +147 -116
- meerk40t/grbl/interpreter.py +44 -44
- meerk40t/grbl/loader.py +22 -22
- meerk40t/grbl/mock_connection.py +56 -56
- meerk40t/grbl/plugin.py +294 -264
- meerk40t/grbl/serial_connection.py +93 -88
- meerk40t/grbl/tcp_connection.py +81 -79
- meerk40t/grbl/ws_connection.py +112 -0
- meerk40t/gui/__init__.py +1 -1
- meerk40t/gui/about.py +2042 -296
- meerk40t/gui/alignment.py +1644 -1608
- meerk40t/gui/autoexec.py +199 -0
- meerk40t/gui/basicops.py +791 -670
- meerk40t/gui/bufferview.py +77 -71
- meerk40t/gui/busy.py +232 -133
- meerk40t/gui/choicepropertypanel.py +1662 -1469
- meerk40t/gui/consolepanel.py +706 -542
- meerk40t/gui/devicepanel.py +687 -581
- meerk40t/gui/dialogoptions.py +110 -107
- meerk40t/gui/executejob.py +316 -306
- meerk40t/gui/fonts.py +90 -90
- meerk40t/gui/functionwrapper.py +252 -0
- meerk40t/gui/gui_mixins.py +729 -0
- meerk40t/gui/guicolors.py +205 -182
- meerk40t/gui/help_assets/help_assets.py +218 -201
- meerk40t/gui/helper.py +154 -0
- meerk40t/gui/hersheymanager.py +1440 -846
- meerk40t/gui/icons.py +3422 -2747
- meerk40t/gui/imagesplitter.py +555 -508
- meerk40t/gui/keymap.py +354 -344
- meerk40t/gui/laserpanel.py +897 -806
- meerk40t/gui/laserrender.py +1470 -1232
- meerk40t/gui/lasertoolpanel.py +805 -793
- meerk40t/gui/magnetoptions.py +436 -0
- meerk40t/gui/materialmanager.py +2944 -0
- meerk40t/gui/materialtest.py +1722 -1694
- meerk40t/gui/mkdebug.py +646 -359
- meerk40t/gui/mwindow.py +163 -140
- meerk40t/gui/navigationpanels.py +2605 -2467
- meerk40t/gui/notes.py +143 -142
- meerk40t/gui/opassignment.py +414 -410
- meerk40t/gui/operation_info.py +310 -299
- meerk40t/gui/plugin.py +500 -328
- meerk40t/gui/position.py +714 -669
- meerk40t/gui/preferences.py +901 -650
- meerk40t/gui/propertypanels/attributes.py +1461 -1131
- meerk40t/gui/propertypanels/blobproperty.py +117 -114
- meerk40t/gui/propertypanels/consoleproperty.py +83 -80
- meerk40t/gui/propertypanels/gotoproperty.py +77 -0
- meerk40t/gui/propertypanels/groupproperties.py +223 -217
- meerk40t/gui/propertypanels/hatchproperty.py +489 -469
- meerk40t/gui/propertypanels/imageproperty.py +2244 -1384
- meerk40t/gui/propertypanels/inputproperty.py +59 -58
- meerk40t/gui/propertypanels/opbranchproperties.py +82 -80
- meerk40t/gui/propertypanels/operationpropertymain.py +1890 -1638
- meerk40t/gui/propertypanels/outputproperty.py +59 -58
- meerk40t/gui/propertypanels/pathproperty.py +389 -380
- meerk40t/gui/propertypanels/placementproperty.py +1214 -383
- meerk40t/gui/propertypanels/pointproperty.py +140 -136
- meerk40t/gui/propertypanels/propertywindow.py +313 -181
- meerk40t/gui/propertypanels/rasterwizardpanels.py +996 -912
- meerk40t/gui/propertypanels/regbranchproperties.py +76 -0
- meerk40t/gui/propertypanels/textproperty.py +770 -755
- meerk40t/gui/propertypanels/waitproperty.py +56 -55
- meerk40t/gui/propertypanels/warpproperty.py +121 -0
- meerk40t/gui/propertypanels/wobbleproperty.py +255 -204
- meerk40t/gui/ribbon.py +2471 -2210
- meerk40t/gui/scene/scene.py +1100 -1051
- meerk40t/gui/scene/sceneconst.py +22 -22
- meerk40t/gui/scene/scenepanel.py +439 -349
- meerk40t/gui/scene/scenespacewidget.py +365 -365
- meerk40t/gui/scene/widget.py +518 -505
- meerk40t/gui/scenewidgets/affinemover.py +215 -215
- meerk40t/gui/scenewidgets/attractionwidget.py +315 -309
- meerk40t/gui/scenewidgets/bedwidget.py +120 -97
- meerk40t/gui/scenewidgets/elementswidget.py +137 -107
- meerk40t/gui/scenewidgets/gridwidget.py +785 -745
- meerk40t/gui/scenewidgets/guidewidget.py +765 -765
- meerk40t/gui/scenewidgets/laserpathwidget.py +66 -66
- meerk40t/gui/scenewidgets/machineoriginwidget.py +86 -86
- meerk40t/gui/scenewidgets/nodeselector.py +28 -28
- meerk40t/gui/scenewidgets/rectselectwidget.py +592 -346
- meerk40t/gui/scenewidgets/relocatewidget.py +33 -33
- meerk40t/gui/scenewidgets/reticlewidget.py +83 -83
- meerk40t/gui/scenewidgets/selectionwidget.py +2958 -2756
- meerk40t/gui/simpleui.py +362 -333
- meerk40t/gui/simulation.py +2451 -2094
- meerk40t/gui/snapoptions.py +208 -203
- meerk40t/gui/spoolerpanel.py +1227 -1180
- meerk40t/gui/statusbarwidgets/defaultoperations.py +480 -353
- meerk40t/gui/statusbarwidgets/infowidget.py +520 -483
- meerk40t/gui/statusbarwidgets/opassignwidget.py +356 -355
- meerk40t/gui/statusbarwidgets/selectionwidget.py +172 -171
- meerk40t/gui/statusbarwidgets/shapepropwidget.py +754 -236
- meerk40t/gui/statusbarwidgets/statusbar.py +272 -260
- meerk40t/gui/statusbarwidgets/statusbarwidget.py +268 -270
- meerk40t/gui/statusbarwidgets/strokewidget.py +267 -251
- meerk40t/gui/themes.py +200 -78
- meerk40t/gui/tips.py +590 -0
- meerk40t/gui/toolwidgets/circlebrush.py +35 -35
- meerk40t/gui/toolwidgets/toolcircle.py +248 -242
- meerk40t/gui/toolwidgets/toolcontainer.py +82 -77
- meerk40t/gui/toolwidgets/tooldraw.py +97 -90
- meerk40t/gui/toolwidgets/toolellipse.py +219 -212
- meerk40t/gui/toolwidgets/toolimagecut.py +25 -132
- meerk40t/gui/toolwidgets/toolline.py +39 -144
- meerk40t/gui/toolwidgets/toollinetext.py +79 -236
- meerk40t/gui/toolwidgets/toollinetext_inline.py +296 -0
- meerk40t/gui/toolwidgets/toolmeasure.py +163 -216
- meerk40t/gui/toolwidgets/toolnodeedit.py +2088 -2074
- meerk40t/gui/toolwidgets/toolnodemove.py +92 -94
- meerk40t/gui/toolwidgets/toolparameter.py +754 -668
- meerk40t/gui/toolwidgets/toolplacement.py +108 -108
- meerk40t/gui/toolwidgets/toolpoint.py +68 -59
- meerk40t/gui/toolwidgets/toolpointlistbuilder.py +294 -0
- meerk40t/gui/toolwidgets/toolpointmove.py +183 -0
- meerk40t/gui/toolwidgets/toolpolygon.py +288 -403
- meerk40t/gui/toolwidgets/toolpolyline.py +38 -196
- meerk40t/gui/toolwidgets/toolrect.py +211 -207
- meerk40t/gui/toolwidgets/toolrelocate.py +72 -72
- meerk40t/gui/toolwidgets/toolribbon.py +598 -113
- meerk40t/gui/toolwidgets/tooltabedit.py +546 -0
- meerk40t/gui/toolwidgets/tooltext.py +98 -89
- meerk40t/gui/toolwidgets/toolvector.py +213 -204
- meerk40t/gui/toolwidgets/toolwidget.py +39 -39
- meerk40t/gui/usbconnect.py +98 -91
- meerk40t/gui/utilitywidgets/buttonwidget.py +18 -18
- meerk40t/gui/utilitywidgets/checkboxwidget.py +90 -90
- meerk40t/gui/utilitywidgets/controlwidget.py +14 -14
- meerk40t/gui/utilitywidgets/cyclocycloidwidget.py +343 -340
- meerk40t/gui/utilitywidgets/debugwidgets.py +148 -0
- meerk40t/gui/utilitywidgets/handlewidget.py +27 -27
- meerk40t/gui/utilitywidgets/harmonograph.py +450 -447
- meerk40t/gui/utilitywidgets/openclosewidget.py +40 -40
- meerk40t/gui/utilitywidgets/rotationwidget.py +54 -54
- meerk40t/gui/utilitywidgets/scalewidget.py +75 -75
- meerk40t/gui/utilitywidgets/seekbarwidget.py +183 -183
- meerk40t/gui/utilitywidgets/togglewidget.py +142 -142
- meerk40t/gui/utilitywidgets/toolbarwidget.py +8 -8
- meerk40t/gui/wordlisteditor.py +985 -931
- meerk40t/gui/wxmeerk40t.py +1447 -1169
- meerk40t/gui/wxmmain.py +5644 -4112
- meerk40t/gui/wxmribbon.py +1591 -1076
- meerk40t/gui/wxmscene.py +1631 -1453
- meerk40t/gui/wxmtree.py +2416 -2089
- meerk40t/gui/wxutils.py +1769 -1099
- meerk40t/gui/zmatrix.py +102 -102
- meerk40t/image/__init__.py +1 -1
- meerk40t/image/dither.py +429 -0
- meerk40t/image/imagetools.py +2793 -2269
- meerk40t/internal_plugins.py +150 -130
- meerk40t/kernel/__init__.py +63 -12
- meerk40t/kernel/channel.py +259 -212
- meerk40t/kernel/context.py +538 -538
- meerk40t/kernel/exceptions.py +41 -41
- meerk40t/kernel/functions.py +463 -414
- meerk40t/kernel/jobs.py +100 -100
- meerk40t/kernel/kernel.py +3828 -3571
- meerk40t/kernel/lifecycles.py +71 -71
- meerk40t/kernel/module.py +49 -49
- meerk40t/kernel/service.py +147 -147
- meerk40t/kernel/settings.py +383 -343
- meerk40t/lihuiyu/controller.py +883 -876
- meerk40t/lihuiyu/device.py +1181 -1069
- meerk40t/lihuiyu/driver.py +1466 -1372
- meerk40t/lihuiyu/gui/gui.py +127 -106
- meerk40t/lihuiyu/gui/lhyaccelgui.py +377 -363
- meerk40t/lihuiyu/gui/lhycontrollergui.py +741 -651
- meerk40t/lihuiyu/gui/lhydrivergui.py +470 -446
- meerk40t/lihuiyu/gui/lhyoperationproperties.py +238 -237
- meerk40t/lihuiyu/gui/tcpcontroller.py +226 -190
- meerk40t/lihuiyu/interpreter.py +53 -53
- meerk40t/lihuiyu/laserspeed.py +450 -450
- meerk40t/lihuiyu/loader.py +90 -90
- meerk40t/lihuiyu/parser.py +404 -404
- meerk40t/lihuiyu/plugin.py +101 -102
- meerk40t/lihuiyu/tcp_connection.py +111 -109
- meerk40t/main.py +231 -165
- meerk40t/moshi/builder.py +788 -781
- meerk40t/moshi/controller.py +505 -499
- meerk40t/moshi/device.py +495 -442
- meerk40t/moshi/driver.py +862 -696
- meerk40t/moshi/gui/gui.py +78 -76
- meerk40t/moshi/gui/moshicontrollergui.py +538 -522
- meerk40t/moshi/gui/moshidrivergui.py +87 -75
- meerk40t/moshi/plugin.py +43 -43
- meerk40t/network/console_server.py +140 -57
- meerk40t/network/kernelserver.py +10 -9
- meerk40t/network/tcp_server.py +142 -140
- meerk40t/network/udp_server.py +103 -77
- meerk40t/network/web_server.py +404 -0
- meerk40t/newly/controller.py +1158 -1144
- meerk40t/newly/device.py +874 -732
- meerk40t/newly/driver.py +540 -412
- meerk40t/newly/gui/gui.py +219 -188
- meerk40t/newly/gui/newlyconfig.py +116 -101
- meerk40t/newly/gui/newlycontroller.py +193 -186
- meerk40t/newly/gui/operationproperties.py +51 -51
- meerk40t/newly/mock_connection.py +82 -82
- meerk40t/newly/newly_params.py +56 -56
- meerk40t/newly/plugin.py +1214 -1246
- meerk40t/newly/usb_connection.py +322 -322
- meerk40t/rotary/gui/gui.py +52 -46
- meerk40t/rotary/gui/rotarysettings.py +240 -232
- meerk40t/rotary/rotary.py +202 -98
- meerk40t/ruida/control.py +291 -91
- meerk40t/ruida/controller.py +138 -1088
- meerk40t/ruida/device.py +676 -231
- meerk40t/ruida/driver.py +534 -472
- meerk40t/ruida/emulator.py +1494 -1491
- meerk40t/ruida/exceptions.py +4 -4
- meerk40t/ruida/gui/gui.py +71 -76
- meerk40t/ruida/gui/ruidaconfig.py +239 -72
- meerk40t/ruida/gui/ruidacontroller.py +187 -184
- meerk40t/ruida/gui/ruidaoperationproperties.py +48 -47
- meerk40t/ruida/loader.py +54 -52
- meerk40t/ruida/mock_connection.py +57 -109
- meerk40t/ruida/plugin.py +124 -87
- meerk40t/ruida/rdjob.py +2084 -945
- meerk40t/ruida/serial_connection.py +116 -0
- meerk40t/ruida/tcp_connection.py +146 -0
- meerk40t/ruida/udp_connection.py +73 -0
- meerk40t/svgelements.py +9671 -9669
- meerk40t/tools/driver_to_path.py +584 -579
- meerk40t/tools/geomstr.py +5583 -4680
- meerk40t/tools/jhfparser.py +357 -292
- meerk40t/tools/kerftest.py +904 -890
- meerk40t/tools/livinghinges.py +1168 -1033
- meerk40t/tools/pathtools.py +987 -949
- meerk40t/tools/pmatrix.py +234 -0
- meerk40t/tools/pointfinder.py +942 -942
- meerk40t/tools/polybool.py +941 -940
- meerk40t/tools/rasterplotter.py +1660 -547
- meerk40t/tools/shxparser.py +1047 -901
- meerk40t/tools/ttfparser.py +726 -446
- meerk40t/tools/zinglplotter.py +595 -593
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/LICENSE +21 -21
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/METADATA +150 -139
- meerk40t-0.9.7020.dist-info/RECORD +446 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/WHEEL +1 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/top_level.txt +0 -1
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/zip-safe +1 -1
- meerk40t/balormk/elementlightjob.py +0 -159
- meerk40t-0.9.3001.dist-info/RECORD +0 -437
- test/bootstrap.py +0 -63
- test/test_cli.py +0 -12
- test/test_core_cutcode.py +0 -418
- test/test_core_elements.py +0 -144
- test/test_core_plotplanner.py +0 -397
- test/test_core_viewports.py +0 -312
- test/test_drivers_grbl.py +0 -108
- test/test_drivers_lihuiyu.py +0 -443
- test/test_drivers_newly.py +0 -113
- test/test_element_degenerate_points.py +0 -43
- test/test_elements_classify.py +0 -97
- test/test_elements_penbox.py +0 -22
- test/test_file_svg.py +0 -176
- test/test_fill.py +0 -155
- test/test_geomstr.py +0 -1523
- test/test_geomstr_nodes.py +0 -18
- test/test_imagetools_actualize.py +0 -306
- test/test_imagetools_wizard.py +0 -258
- test/test_kernel.py +0 -200
- test/test_laser_speeds.py +0 -3303
- test/test_length.py +0 -57
- test/test_lifecycle.py +0 -66
- test/test_operations.py +0 -251
- test/test_operations_hatch.py +0 -57
- test/test_ruida.py +0 -19
- test/test_spooler.py +0 -22
- test/test_tools_rasterplotter.py +0 -29
- test/test_wobble.py +0 -133
- test/test_zingl.py +0 -124
- {test → meerk40t/cylinder}/__init__.py +0 -0
- /meerk40t/{core/element_commands.py → cylinder/gui/__init__.py} +0 -0
- {meerk40t-0.9.3001.dist-info → meerk40t-0.9.7020.dist-info}/entry_points.txt +0 -0
meerk40t/tools/jhfparser.py
CHANGED
@@ -1,292 +1,357 @@
|
|
1
|
-
import os
|
2
|
-
|
3
|
-
JHFPARSER_VERSION = "0.0.1"
|
4
|
-
|
5
|
-
"""
|
6
|
-
The Hershey fonts are a collection of vector fonts developed c. 1967 by Dr. Allen Vincent Hershey at the Naval Weapons Laboratory,
|
7
|
-
originally designed to be rendered using vectors on early cathode ray tube displays. Decomposing curves to connected straight lines
|
8
|
-
allowed Hershey to produce complex typographic designs. In their original form the font data consists simply of a series of coordinates,
|
9
|
-
meant to be connected by straight lines on the screen. The fonts are publicly available and have few usage restrictions.
|
10
|
-
Vector fonts are easily scaled and rotated in two or three dimensions; consequently the Hershey fonts have been widely
|
11
|
-
used in computer graphics, computer-aided design programs, and more recently also in computer-aided manufacturing
|
12
|
-
applications like laser engraving. (https://en.wikipedia.org/wiki/Hershey_fonts)
|
13
|
-
"""
|
14
|
-
|
15
|
-
|
16
|
-
class JhfPath:
|
17
|
-
"""
|
18
|
-
Example path code. Any class with these functions would work as well. When render is called on the JhfFont class
|
19
|
-
the path is given particular useful segments.
|
20
|
-
"""
|
21
|
-
|
22
|
-
def __init__(self):
|
23
|
-
self.path = list()
|
24
|
-
|
25
|
-
def new_path(self):
|
26
|
-
"""
|
27
|
-
Start of a new path.
|
28
|
-
"""
|
29
|
-
self.path.append(None)
|
30
|
-
|
31
|
-
def move(self, x, y):
|
32
|
-
"""
|
33
|
-
Move current point to the point specified.
|
34
|
-
"""
|
35
|
-
self.path.append((x, y))
|
36
|
-
|
37
|
-
def line(self, x0, y0, x1, y1):
|
38
|
-
"""
|
39
|
-
Draw a line from the current point to the specified point.
|
40
|
-
"""
|
41
|
-
self.path.append((x0, y0, x1, y1))
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
self.
|
58
|
-
self.
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
"
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
self.
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
The
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
1
|
+
import os
|
2
|
+
|
3
|
+
JHFPARSER_VERSION = "0.0.1"
|
4
|
+
|
5
|
+
"""
|
6
|
+
The Hershey fonts are a collection of vector fonts developed c. 1967 by Dr. Allen Vincent Hershey at the Naval Weapons Laboratory,
|
7
|
+
originally designed to be rendered using vectors on early cathode ray tube displays. Decomposing curves to connected straight lines
|
8
|
+
allowed Hershey to produce complex typographic designs. In their original form the font data consists simply of a series of coordinates,
|
9
|
+
meant to be connected by straight lines on the screen. The fonts are publicly available and have few usage restrictions.
|
10
|
+
Vector fonts are easily scaled and rotated in two or three dimensions; consequently the Hershey fonts have been widely
|
11
|
+
used in computer graphics, computer-aided design programs, and more recently also in computer-aided manufacturing
|
12
|
+
applications like laser engraving. (https://en.wikipedia.org/wiki/Hershey_fonts)
|
13
|
+
"""
|
14
|
+
|
15
|
+
|
16
|
+
class JhfPath:
|
17
|
+
"""
|
18
|
+
Example path code. Any class with these functions would work as well. When render is called on the JhfFont class
|
19
|
+
the path is given particular useful segments.
|
20
|
+
"""
|
21
|
+
|
22
|
+
def __init__(self):
|
23
|
+
self.path = list()
|
24
|
+
|
25
|
+
def new_path(self):
|
26
|
+
"""
|
27
|
+
Start of a new path.
|
28
|
+
"""
|
29
|
+
self.path.append(None)
|
30
|
+
|
31
|
+
def move(self, x, y):
|
32
|
+
"""
|
33
|
+
Move current point to the point specified.
|
34
|
+
"""
|
35
|
+
self.path.append((x, y))
|
36
|
+
|
37
|
+
def line(self, x0, y0, x1, y1):
|
38
|
+
"""
|
39
|
+
Draw a line from the current point to the specified point.
|
40
|
+
"""
|
41
|
+
self.path.append((x0, y0, x1, y1))
|
42
|
+
|
43
|
+
def character_end(self):
|
44
|
+
pass
|
45
|
+
|
46
|
+
|
47
|
+
class JhfFont:
|
48
|
+
"""
|
49
|
+
This class performs the parsing of the Hershey fonts in jhf (James Hull Format).
|
50
|
+
Composing them into specific glyphs which consist of commands in a vector-shape language.
|
51
|
+
When .render() is called on some text, vector actions are performed
|
52
|
+
on the font which create the vector path.
|
53
|
+
"""
|
54
|
+
|
55
|
+
def __init__(self, filename):
|
56
|
+
self.STROKE_BASED = True
|
57
|
+
self.type = "Hershey"
|
58
|
+
self.glyphs = dict() # Glyph dictionary
|
59
|
+
tempstr = os.path.basename(filename)
|
60
|
+
fname, fext = os.path.splitext(tempstr)
|
61
|
+
self.valid = False
|
62
|
+
self.active = True
|
63
|
+
self.font_name = fname
|
64
|
+
self._line_information = []
|
65
|
+
self._parse(filename)
|
66
|
+
|
67
|
+
def __str__(self):
|
68
|
+
return f'{self.type}("{self.font_name}", glyphs: {len(self.glyphs)})'
|
69
|
+
|
70
|
+
def line_information(self):
|
71
|
+
return self._line_information
|
72
|
+
|
73
|
+
@staticmethod
|
74
|
+
def hershey_val(character):
|
75
|
+
return ord(character) - ord("R")
|
76
|
+
|
77
|
+
def _read_hershey_glyph(self, f, glyphindex):
|
78
|
+
line = ""
|
79
|
+
while line == "":
|
80
|
+
line = f.readline()
|
81
|
+
if (not line) or line == "\x1a": # eof
|
82
|
+
return False
|
83
|
+
line = line.rstrip()
|
84
|
+
|
85
|
+
# read a Hershey format line
|
86
|
+
glyphnum = int(line[0:5]) # glyphnum (junk in some .jhf files)
|
87
|
+
nverts = int(line[5:8]) - 1
|
88
|
+
leftpos = self.hershey_val(line[8])
|
89
|
+
rightpos = self.hershey_val(line[9])
|
90
|
+
vertchars = line[10:]
|
91
|
+
nvertchars = len(vertchars)
|
92
|
+
|
93
|
+
# join split lines in the Hershey data
|
94
|
+
while nverts * 2 > nvertchars:
|
95
|
+
nextline = f.readline().rstrip()
|
96
|
+
line += nextline
|
97
|
+
vertchars += nextline
|
98
|
+
nvertchars = len(vertchars)
|
99
|
+
if nverts * 2 != nvertchars:
|
100
|
+
print(
|
101
|
+
f"Parse Hershey Glyph: format error (nvertchars={nvertchars} not {2*nverts})"
|
102
|
+
)
|
103
|
+
else:
|
104
|
+
# print(f"Glyph, idx={glyphindex}, glyphnum={glyphnum}, left={leftpos}, right={rightpos}, vertices={nverts}")
|
105
|
+
# Now we have one line with a full glyph definition
|
106
|
+
idx = 0
|
107
|
+
realleft = leftpos
|
108
|
+
realright = rightpos
|
109
|
+
realtop = 0
|
110
|
+
realbottom = 0
|
111
|
+
cidx = 0
|
112
|
+
while idx < nverts:
|
113
|
+
leftchar = vertchars[2 * idx]
|
114
|
+
rightchar = vertchars[2 * idx + 1]
|
115
|
+
if leftchar == " " and rightchar == "R":
|
116
|
+
# pen up
|
117
|
+
pass
|
118
|
+
else:
|
119
|
+
leftval = self.hershey_val(leftchar)
|
120
|
+
rightval = self.hershey_val(rightchar)
|
121
|
+
if cidx == 0:
|
122
|
+
realleft = leftval
|
123
|
+
realright = leftval
|
124
|
+
realtop = rightval
|
125
|
+
realbottom = rightval
|
126
|
+
else:
|
127
|
+
if leftval < realleft:
|
128
|
+
realleft = leftval
|
129
|
+
if leftval > realright:
|
130
|
+
realright = leftval
|
131
|
+
if rightval < realtop:
|
132
|
+
realtop = rightval
|
133
|
+
if rightval > realbottom:
|
134
|
+
realbottom = rightval
|
135
|
+
cidx += 1
|
136
|
+
idx += 1
|
137
|
+
|
138
|
+
glyphchar = chr(glyphindex)
|
139
|
+
struct = {
|
140
|
+
"index": glyphindex,
|
141
|
+
"num": glyphnum,
|
142
|
+
"left": leftpos, # what the glyph claims
|
143
|
+
"right": rightpos, # what the glyph claims
|
144
|
+
"top": realtop, # extension to the top
|
145
|
+
"bottom": realbottom, # extension to the bottom
|
146
|
+
"realleft": realleft, # the real extension
|
147
|
+
"realright": realright, # the real extension
|
148
|
+
"nverts": nverts,
|
149
|
+
"vertices": vertchars,
|
150
|
+
}
|
151
|
+
self.glyphs[glyphchar] = struct
|
152
|
+
# if realleft != leftpos or realright != rightpos:
|
153
|
+
# print (f"Glyph for '{glyphchar}' has different extensions: {leftpos} to {rightpos} vs. {realleft} to {realright}")
|
154
|
+
return True
|
155
|
+
|
156
|
+
def _parse(self, filename):
|
157
|
+
self.lines = []
|
158
|
+
self.top = 0
|
159
|
+
self.bottom = 0
|
160
|
+
try:
|
161
|
+
with open(filename) as f:
|
162
|
+
glyphindex = 32
|
163
|
+
while self._read_hershey_glyph(f, glyphindex):
|
164
|
+
glyphindex += 1
|
165
|
+
self.valid = True
|
166
|
+
except (OSError, RuntimeError, PermissionError, FileNotFoundError):
|
167
|
+
self.valid = False
|
168
|
+
# Establish font extension in X
|
169
|
+
cidx = 0
|
170
|
+
for g in self.glyphs:
|
171
|
+
struct = self.glyphs[g]
|
172
|
+
if cidx == 0:
|
173
|
+
self.top = struct["top"]
|
174
|
+
self.bottom = struct["bottom"]
|
175
|
+
else:
|
176
|
+
if self.top > struct["top"]:
|
177
|
+
self.top = struct["top"]
|
178
|
+
if self.bottom < struct["bottom"]:
|
179
|
+
self.bottom = struct["bottom"]
|
180
|
+
cidx += 1
|
181
|
+
|
182
|
+
def render(
|
183
|
+
self,
|
184
|
+
path,
|
185
|
+
vtext,
|
186
|
+
horizontal=True,
|
187
|
+
font_size=12.0,
|
188
|
+
h_spacing=1.0,
|
189
|
+
v_spacing=1.1,
|
190
|
+
align="start",
|
191
|
+
):
|
192
|
+
"""
|
193
|
+
From https://emergent.unpythonic.net/software/hershey
|
194
|
+
The structure is basically as follows: each character consists of a number 1->4000 (not all used) in column 0:4,
|
195
|
+
the number of vertices in columns 5:7, the left hand position in column 8, the right hand position in column 9,
|
196
|
+
and finally the vertices in single character pairs.
|
197
|
+
All coordinates are given relative to the ascii value of 'R'. If the coordinate value is " R" that indicates a pen up operation.
|
198
|
+
E.g. if the data byte is 'R', the data is 0
|
199
|
+
if the data byte is 'T', the data is +2
|
200
|
+
if the data byte is 'J', the data is -8
|
201
|
+
The coordinate system is x-y, with the origin (0,0) in the center of the
|
202
|
+
glyph. X increases to the right and y increases *down*.
|
203
|
+
|
204
|
+
As an example consider the 8th symbol
|
205
|
+
|
206
|
+
' 8 9MWOMOV RUMUV ROQUQ'
|
207
|
+
|
208
|
+
It has 9 coordinate pairs (this includes the left and right position).
|
209
|
+
The left position is 'M' - 'R' = -5
|
210
|
+
The right position is 'W' - 'R' = 5
|
211
|
+
The first coordinate is "OM" = (-3,-5)
|
212
|
+
The second coordinate is "OV" = (-3,4)
|
213
|
+
Raise the pen " R"
|
214
|
+
Move to "UM" = (3,-5)
|
215
|
+
Draw to "UV" = (3,4)
|
216
|
+
Raise the pen " R"
|
217
|
+
Move to "OQ" = (-3,-1)
|
218
|
+
Draw to "UQ" = (3,-1)
|
219
|
+
Drawing this out on a piece of paper will reveal it represents an 'H'.
|
220
|
+
|
221
|
+
Basic Glyph (symbol) data:
|
222
|
+
Mathematical (227-229,232,727-779,732,737-740,1227-1270,2227-2270,
|
223
|
+
1294-1412,2294-2295,2401-2412)
|
224
|
+
Daggers (for footnotes, etc.) (1276-1279, 2276-2279)
|
225
|
+
Astronomical (1281-1293,2281-2293)
|
226
|
+
Astrological (2301-2312)
|
227
|
+
Musical (2317-2382)
|
228
|
+
Typesetting (ffl,fl,fi sorts of things) (miscellaneous places)
|
229
|
+
Miscellaneous (mostly in 741-909, but also elsewhere):
|
230
|
+
- Playing card suits
|
231
|
+
- Meteorology
|
232
|
+
- Graphics (lines, curves)
|
233
|
+
- Electrical
|
234
|
+
- Geometric (shapes)
|
235
|
+
- Cartographic
|
236
|
+
- Naval
|
237
|
+
- Agricultural
|
238
|
+
- Highways
|
239
|
+
- Etc...
|
240
|
+
"""
|
241
|
+
|
242
|
+
def _do_render(to_render, offsets):
|
243
|
+
cidx = 0
|
244
|
+
scale = font_size / 21.0
|
245
|
+
replacer = []
|
246
|
+
for tchar in to_render:
|
247
|
+
to_replace = None
|
248
|
+
# Yes, I am German :-)
|
249
|
+
if tchar == "\n":
|
250
|
+
continue
|
251
|
+
if tchar not in self.glyphs:
|
252
|
+
if tchar == "ä":
|
253
|
+
to_replace = (tchar, "ae")
|
254
|
+
elif tchar == "ö":
|
255
|
+
to_replace = (tchar, "ue")
|
256
|
+
elif tchar == "ü":
|
257
|
+
to_replace = (tchar, "ue")
|
258
|
+
elif tchar == "Ä":
|
259
|
+
to_replace = (tchar, "Ae")
|
260
|
+
elif tchar == "Ö":
|
261
|
+
to_replace = (tchar, "Oe")
|
262
|
+
elif tchar == "Ü":
|
263
|
+
to_replace = (tchar, "Ue")
|
264
|
+
elif tchar == "ß":
|
265
|
+
to_replace = (tchar, "ss")
|
266
|
+
if to_replace is not None and to_replace not in replacer:
|
267
|
+
replacer.append(to_replace)
|
268
|
+
for to_replace in replacer:
|
269
|
+
# print (f"Replace all '{to_replace[0]}' with '{to_replace[1]}'")
|
270
|
+
to_render = to_render.replace(to_replace[0], to_replace[1])
|
271
|
+
# print (f"Top: {self.top}, bottom={self.bottom}")
|
272
|
+
lines = to_render.split("\n")
|
273
|
+
if offsets is None:
|
274
|
+
offsets = [0] * len(lines)
|
275
|
+
self._line_information.clear()
|
276
|
+
|
277
|
+
offsety = -1 * self.top # Negative !
|
278
|
+
for text, offs in zip(lines, offsets):
|
279
|
+
line_start_x = offs * scale
|
280
|
+
line_start_y = offsety * scale
|
281
|
+
offsetx = offs
|
282
|
+
for tchar in text:
|
283
|
+
if tchar in self.glyphs:
|
284
|
+
# print(f"Char '{tchar}' (ord={ord(tchar)}), offsetx={offsetx}")
|
285
|
+
# if cidx > 0:
|
286
|
+
# path.new_path()
|
287
|
+
struct = self.glyphs[tchar]
|
288
|
+
nverts = struct["nverts"]
|
289
|
+
vertices = struct["vertices"]
|
290
|
+
offsetx += abs(struct["left"]) * h_spacing
|
291
|
+
# offsetx += abs(struct["realleft"] - 1)
|
292
|
+
idx = 0
|
293
|
+
penup = True
|
294
|
+
lastx = 0
|
295
|
+
lasty = 0
|
296
|
+
while idx < nverts:
|
297
|
+
leftchar = vertices[2 * idx]
|
298
|
+
rightchar = vertices[2 * idx + 1]
|
299
|
+
if leftchar == " " and rightchar == "R":
|
300
|
+
# pen up
|
301
|
+
penup = True
|
302
|
+
else:
|
303
|
+
leftval = scale * (offsetx + self.hershey_val(leftchar))
|
304
|
+
rightval = scale * (
|
305
|
+
offsety - self.hershey_val(rightchar)
|
306
|
+
)
|
307
|
+
if penup:
|
308
|
+
if self.active:
|
309
|
+
path.move(leftval, rightval)
|
310
|
+
penup = False
|
311
|
+
else:
|
312
|
+
if self.active:
|
313
|
+
path.line(lastx, lasty, leftval, rightval)
|
314
|
+
lastx = leftval
|
315
|
+
lasty = rightval
|
316
|
+
idx += 1
|
317
|
+
cidx += 1
|
318
|
+
offsetx += struct["right"] * h_spacing
|
319
|
+
if self.active:
|
320
|
+
path.character_end()
|
321
|
+
# offsetx += struct["realright"] + 1
|
322
|
+
else:
|
323
|
+
# print(f"Char '{tchar}' (ord={ord(tchar)}) not in font...")
|
324
|
+
pass
|
325
|
+
# Store start point, nonscaled width plus scaled width and height of line
|
326
|
+
self._line_information.append(
|
327
|
+
(
|
328
|
+
line_start_x,
|
329
|
+
line_start_y - 0.5 * scale * (self.top - self.bottom),
|
330
|
+
offsetx,
|
331
|
+
scale * offsetx - line_start_x,
|
332
|
+
scale * (self.top - self.bottom),
|
333
|
+
)
|
334
|
+
)
|
335
|
+
offsety += v_spacing * (self.top - self.bottom)
|
336
|
+
line_lens = [e[2] for e in self._line_information]
|
337
|
+
return line_lens
|
338
|
+
|
339
|
+
if vtext is None or vtext == "":
|
340
|
+
return
|
341
|
+
self.active = False
|
342
|
+
line_lengths = _do_render(vtext, None)
|
343
|
+
max_len = max(line_lengths)
|
344
|
+
offsets = []
|
345
|
+
for ll in line_lengths:
|
346
|
+
# NB anchor not only defines the alignment of the individual
|
347
|
+
# lines to another but as well of the whole block relative
|
348
|
+
# to the origin
|
349
|
+
if align == "middle":
|
350
|
+
offs = -max_len / 2 + (max_len - ll) / 2
|
351
|
+
elif align == "end":
|
352
|
+
offs = -ll
|
353
|
+
else:
|
354
|
+
offs = 0
|
355
|
+
offsets.append(offs)
|
356
|
+
self.active = True
|
357
|
+
_do_render(vtext, offsets)
|